§
    |Åd8Ë  ã                   ó(  — d Z ddlmZ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	Z	ddl
Z
ddlZddlZddlZddlZdZdZdZdZdZd	ZdZd
ZdZdZdZdadZdZdZet6          eeegZdZ dZ!dZ"da#e e!e"tF          gZ$ee$fZ%d„ Z&d„ Z'dZ(dZ)dZ*d„ Z+d„ Z,d„ Z-d„ Z.d„ Z/d „ Z0d!„ Z1d"„ Z2d#„ Z3d$„ Z4d%„ Z5d&„ Z6d'„ Z7d(„ Z8d)„ Z9d*„ Z:d+„ Z;d,„ Z<d-„ Z=d.„ Z>d/„ Z?d0„ Z@d1„ ZAdQd3„ZBdQd4„ZCd5„ ZDd6„ ZEd7„ ZF G d8„ d9¦  «        ZG eG¦   «         ZHejI        fd:„ZJ ejK        d;d<d=g¦  «        ZLeMeNu rddlOZOddlPZPddlQZQd>„ ZR G d?„ d@¦  «        ZSdRdB„ZT G dC„ dD¦  «        ZU G dE„ dF¦  «        ZV G dG„ dH¦  «        ZW G dI„ dJ¦  «        ZX	 ddKlmYZY n# eZ$ r  G dL„ dMe[¦  «        ZYY nw xY wdSdN„Z\dTdO„Z]dP„ Z^dS )UzCommon utility functionsé    )Úprint_functionÚdivisionNé€   é@   é    é   é   é   é   é   é   Únsu   ÂµsÚmsÚsÚksÚpptÚppbÚppmu   â€°c                  óP   — dt           j        j        k    rt          ¦   «          dS dS )NzUTF-8TF)ÚsysÚstdoutÚencodingÚdeunicode_units© ó    ú*/usr/lib/python3/dist-packages/ntp/util.pyÚcheck_unicoder   5   s(   € Ø•#”*Ô%Ò%Ð%ÝÑÔÐØˆtØˆ5r   c                  ó²   — d} d}| t           t                                t          ¦  «        <   |t          t                               t          ¦  «        <   | a|adS )z†Under certain conditions it is not possible to force unicode output,
    this overwrites units that contain unicode with safe versionsÚusÚppkN)Ú	UNITS_SECÚindexÚUNIT_USÚ	UNITS_PPXÚUNIT_PPK)Únew_usÚnew_ppks     r   r   r   <   sH   € ð €FØ€Gà*0…I�i�oŠo�gÑ&Ô&Ñ'Ø+2…I�i�oŠo�hÑ'Ô'Ñ(à€GØ€H€H€Hr   )ÚtaiÚpoll)Ú	rootdelayÚrootdispÚrootdistÚoffsetÚ
sys_jitterÚ
clk_jitterÚleapsmearoffsetÚ	authdelayÚkoffsetÚkmaxerrÚkesterrÚkprecisÚ
kppsjitterÚfuzzÚclk_wander_thresholdÚtickÚinÚoutÚbiasÚdelayÚjitterÚ
dispersionÚ
fudgetime1Ú
fudgetime2)Ú	frequencyÚ
clk_wanderc                 óÂ   — | €dS t          t          j        ¦   «         ¦  «        dz   |z   dz   }||k    r+|                      |¦  «         |                      ¦   «          dS dS )zQdebug is the current debug value
    threshold is the trigger for the current logNú ú
)Úrfc3339ÚtimeÚwriteÚflush)ÚlogfpÚtextÚdebugÚ	thresholds       r   ÚdologrO   V   sf   € ð €}ØˆÝ•4”9‘;”;ÑÔ #Ñ%¨Ñ,¨tÑ3€DØ�	ÒÐØ�Š�DÑÔÐØ�Š‰Œˆˆˆð Ðr   c                 óÜ   — 	  || ¦  «        }n^# t           $ rQ t          j                             || z  ¦  «         t          j                             |¦  «         t	          d¦  «        ‚w xY w|S )z˜Attempts to typecast an argument, prints and dies on failure.
    errtext must contain a %s for splicing in the argument, and be
    newline terminated.r   )Ú
ValueErrorr   ÚstderrrI   Ú
SystemExit)ÚargÚcastfuncÚerrtextÚusageÚcasteds        r   ÚsafeargcastrY   a   st   € ðØ�˜#‘”ˆˆøÝð ð ð ÝŒ
×Ò˜ 3™Ñ'Ô'Ð'ÝŒ
×Ò˜ÑÔÐÝ˜‰mŒmÐðøøøð €Ms
   ‚ ŽAA)c                  ó   — ddz  S )z6Returns the NTPsec version string in a standard formatz	ntpsec-%sz1.2.2r   r   r   r   Ú
stdversionr[   n   s   € à˜Ñ Ð r   c                 óò   — t          j        dt          j        | ¦  «        ¦  «        }t          | ¦  «        } d| v r7|                      dd¦  «        d         }t          |¦  «        dk    r|d|z   z  }|dz  }|S )z<RFC 3339 string from Unix time, including fractional second.z%Y-%m-%dT%H:%M:%Sú.r   r   ÚZ)rH   ÚstrftimeÚgmtimeÚstrÚsplitÚint)ÚtÚrepÚsubsecs      r   rG   rG   s   sq   € å
Œ-Ð+­T¬[¸©^¬^Ñ
<Ô
<€CÝˆA‰Œ€AØ
ˆa€x€xØ—’˜˜a‘” Ô#ˆÝˆv‰;Œ;˜Š?ˆ?Ø�3˜‘<ÑˆCØˆ3�J€CØ€Jr   c                 ó¨   — | dd …         } d                      |                      d¦  «        ¦  «        } t          j                             | ¦  «        }|S )Nr   Ú r]   )Újoinrb   ÚntpÚutilÚhexstr2octets)ÚtxtÚvalues     r   ÚdeformatNTPTimero      sD   € Ø
ˆaˆbˆbŒ'€CØ
�'Š'�#—)’)˜C‘.”.Ñ
!Ô
!€CÝŒH×"Ò" 3Ñ'Ô'€EØ€Lr   c                 ó(  — t          | ¦  «        dz  dk    r
| d d…         } g }t          dt          | ¦  «        d¦  «        D ]=}|                     t          t	          | ||dz   …         d¦  «        ¦  «        ¦  «         Œ>d                     |¦  «        S )Nr   r   éÿÿÿÿr   rh   )ÚlenÚrangeÚappendÚchrrc   ri   )ÚhexstrÚvaluesr"   s      r   rl   rl   †   sŽ   € ÝˆF‰Œ�a‰˜AÒÐØ˜˜˜”ˆØ€FÝ�q�#˜f™+œ+ qÑ)Ô)ð ;ð ;ˆØ�Š•c�#˜f U¨5°©7 ]Ô3°RÑ8Ô8Ñ9Ô9Ñ:Ô:Ð:Ð:Ø�7Š7�6‰?Œ?Ðr   c                 ó*   — | d|…         | |d…         fS )z4Breaks a sequence into two pieces at the slice pointNr   )ÚdataÚ
slicepoints     r   Ú	slicedatar{   �   s   € à���Ô˜d : ; ;Ô/Ð/Ð/r   c                 ó,  — d}|                       d¦  «        dk    r|                      d¦  «        \  } }d|z   }nXd| v rT|                      d¦  «        }d| |d …         v r3|                      d¦  «        }| |d …         }| d |…         } | dd…         } | |fS )Nrh   ú:r   ú]rq   )Úcountrb   Úrindex)ÚhostnameÚ
portsuffixÚrbrakÚportseps       r   Ú	portsplitr…   ”   s³   € Ø€JØ‡~‚~�cÑÔ˜aÒÐØ!)§¢°Ñ!4Ô!4Ñˆ�:Ø˜:Ñ%ˆ
ˆ
Ø	�ˆˆØ—’ Ñ$Ô$ˆØ�(˜5˜6˜6Ô"Ð"Ð"Ø—o’o cÑ*Ô*ˆGØ! ' ( (Ô+ˆJØ   Ô)ˆHØ  " ”~ˆHØ�jÐ!Ð!r   c                 óN  ‡‡‡‡‡	— dŠd}g Šg Š	g Šˆˆˆ	fd„Šˆˆˆˆ	fd„}d}t          | ¦  «        }||k     �rd‰r‚| |         |k    r ‰¦   «          d}dŠ�n:| |         dk    r>|dz  }| |         dv r.‰                     t          d	| |         z   d
z   ¦  «        ¦  «         nð‰                     | |         ¦  «         nÔ| |         dk    r/||k     r#| |         dk    r|dz  }||k     r| |         dk    °|dz  }n™| |         dv rdŠ| |         }‰r
 ‰¦   «          nx| |         dk    r|dz  }| |         dk    rt          ‚nS| |         dk    r |¦   «          n<| |         t          j        v r‰r
 ‰¦   «          n‰                     | |         ¦  «         |dz  }||k     �°d |¦   «          ‰S )NFrh   c                  óú   •— d                      ‰¦  «        } ‰sB	 t          | ¦  «        } n1# t          $ r$ 	 t          | ¦  «        } n# t          $ r Y nw xY wY nw xY w‰| f}‰                     |¦  «         g ‰d d …<   d S )Nrh   )ri   rc   rQ   Úfloatrt   )ÚtokenÚwrapperÚcurrentÚinQuoteÚtokenss     €€€r   Ú	pushTokenzparseConf.<locals>.pushTokenª   s¬   ø€ Ø—’˜Ñ Ô ˆØð 	ðÝ˜E™
œ
��øÝð ð ð ðÝ! %™LœL�E�EøÝ!ð ð ð Ø�Dðøøøøøðøøøð
 ˜EÐ"ˆØ�Š�gÑÔÐØˆ���‰
ˆ
ˆ
s2   š* ª
AµAÁAÁ
AÁAÁAÁAÁAc                  óp   •— ‰ r
 ‰¦   «          ‰r&‰                      ‰d d …         ¦  «         g ‰d d …<   d S d S ©N)rt   )r‹   ÚlinesrŽ   r�   s   €€€€r   ÚpushLinezparseConf.<locals>.pushLine¸   sS   ø€ Øð 	ØˆI‰KŒKˆKØð 	Ø�LŠL˜   œÑ#Ô#Ð#ØˆF�1�1�1‰IˆIˆIð	ð 	r   r   ú\r   z'"n\z'\ú'ú#rF   z'"T)rr   rt   ÚevalÚSyntaxErrorÚstringÚ
whitespace)
rL   ÚquoteStarterr’   ÚiÚtlenr‹   rŒ   r‘   rŽ   r�   s
        @@@@@r   Ú	parseConfr�   £   sE  øøøøø€ Ø€GØ€LØ€EØ€FØ€Gðð ð ð ð ð ð ðð ð ð ð ð ð ð ð 	
€AÝˆt‰9Œ9€DØ
ˆdŠ(‰(Øð 	(Ø�AŒw˜,Ò&Ð&Ø�	‘”�Ø!�Ø�‘Ø�a”˜D’�Ø�Q‘�Ø˜”7˜hÐ&Ð&Ø—N’N¥4¨°°a´Ñ(8¸4Ñ(?Ñ#@Ô#@ÑAÔAÐAøà—’˜t AœwÑ'Ô'Ð'Ð'à�AŒw˜#Š~ˆ~Ø˜4’x�x d¨1¤g°¢o oØ˜‘F�Að ˜4’x�x d¨1¤g°¢o oà�Q‘��Ø�a”˜EÐ!Ð!Ø�Ø# Aœw�Øð  Ø�I‘K”K�KøØ�a”˜D’�Ø�Q‘�Ø˜”7˜d’?�?Ý%Ð%ð #à�a”˜D’�Ø�‘
”
�
�
Ø�a”�FÔ-Ð-Ð-Øð  Ø�I‘K”K�Køà—’˜t AœwÑ'Ô'Ð'Ø	ˆQ‰ˆðC ˆdŠ(‰(ðD €H�J„J€JØ€Lr   c                 ó°   — |                       ¦   «         }g }|D ]'}t          |d¦  «        }|                     |¦  «         Œ(d                     |¦  «        }|S )z.Pretty print string of space separated numbersé   rE   )rb   Ú
fitinfieldrt   ri   )ry   ÚpartsÚcookedÚpartÚfittedÚrendereds         r   Ú
stringfiltr¦   ç   s_   € à�JŠJ‰LŒL€Eà€FØð ð ˆõ ˜D !Ñ$Ô$ˆØ�Š�fÑÔÐÐØ�xŠx˜ÑÔ€HØ€Or   c                 óF  — |                       ¦   «         }i }d}|D ]O}t          |¦  «        \  }}t          |¦  «        }t          ||¦  «        }|                     |d¦  «        dz   ||<   ŒPd}d}	|                     ¦   «         D ]}
|
|k     rŒ	||
         }||	k    r|
}|}	Œg }|D ]7}t          ||¦  «        }t          |d¦  «        }|                     |¦  «         Œ8d 	                    |¦  «        dz   t          |t                               t          ¦  «        z            z   }|S )zECooks a filt* string of space separated numbers, expects millisecondsi`yþÿr   r   rŸ   rE   )rb   ÚscalestringÚmaxdownscaleÚmaxÚgetÚkeysÚrescalestringr    rt   ri   r!   r"   ÚUNIT_MS)ry   r¡   ÚoomcountÚminscaler£   rn   ÚoomÚdsÚ
mostcommonÚhighestcountÚkeyr   r¢   r¤   r¥   s                  r   Ústringfiltcookerr¶   ö   sF  € à�JŠJ‰LŒL€EØ€HØ€Hàð 1ð 1ˆå  Ñ&Ô&‰
ˆˆså˜$ÑÔˆÝ�r˜8Ñ$Ô$ˆØ Ÿš S¨!Ñ,Ô,¨qÑ0ˆ�‰ˆà€JØ€LØ�}Š}‰Œð !ð !ˆØ�Š>ˆ>ØØ˜”ˆØ�<ÒÐØˆJØ ˆLøà€FØð ð ˆÝ˜T :Ñ.Ô.ˆÝ˜D !Ñ$Ô$ˆØ�Š�fÑÔÐÐØ�xŠx˜ÑÔ #Ñ%­	°*Ý2;·/²/Å'Ñ2JÔ2Jñ3Kô )Lñ L€Hà€Or   c                 ó*   — t           D ]
}| |v r|c S ŒdS )z2Returns the unit group which contains a given unitN)Ú
unitgroups)ÚunitÚgroups     r   Úgetunitgroupr»     s2   € åð ð ˆØ�5ˆ=ˆ=ØˆLˆLˆLð ðð r   c                 óÞ   — t          | ¦  «        }|€|                     | ¦  «        dz  S ||v r?|                     | ¦  «        }|                     |¦  «        }t          ||z
  dz  ¦  «        S dS )z:Calculates how many orders of magnitude separate two unitsNr   )r»   r"   Úabs)ÚaÚbrº   ÚiaÚibs        r   ÚoomsbetweenunitsrÂ     si   € å˜‰OŒO€EØ€yØ�{Š{˜1‰~Œ~ Ñ!Ð!Ø	
ˆeˆˆØ�[Š[˜‰^Œ^ˆØ�[Š[˜‰^Œ^ˆÝ�B˜‘G˜q‘=Ñ!Ô!Ð!Øˆ4r   c                 ó„   — | d         dk    r| dd…         } d}nd}d| v r|                       d¦  «        \  }}n| }d}|||fS )	zEBreaks a number string into (aboveDecimal, belowDecimal, isNegative?)r   ú-r   NTFr]   rh   )rb   )rn   ÚnegativeÚaboveÚbelows       r   ÚbreaknumberstringrÈ   +  s_   € àˆQ„x�3‚€Ø�a�b�b”	ˆØˆˆàˆØ
ˆe€|€|Ø—{’{ 3Ñ'Ô'‰ˆˆuˆuàˆØˆØ�5˜(Ð#Ð#r   c                 ó\   — | dk    rd} |rd                      | |f¦  «        }n| }|rd|z   }|S )z'Glues together parts of a number stringrh   Ú0r]   rÄ   )ri   )rÆ   rÇ   Ú
isnegativeÚnewvalues       r   ÚgluenumberstringrÍ   :  sJ   € à�‚{€{ØˆØð Ø—8’8˜U E˜NÑ+Ô+ˆˆàˆØð "Ø˜‘>ˆØ€Or   c                 ój   — d| v r.t          |                      d¦  «        d         ¦  «        }|dz   S dS )z?Maximum units a value can be scaled down without inventing datar]   r   r   r   )rr   rb   )rn   Ú
digitcounts     r   r©   r©   G  s=   € à
ˆe€|€|Ý˜Ÿš SÑ)Ô)¨!Ô,Ñ-Ô-ˆ
à˜q‘Ð!Ð!ð ˆqr   c                 óÈ  — t          | ¦  «        \  }}}|dk    rt          |||¦  «        } | S t          |¦  «        }t          |¦  «        }t          |dz  ¦  «        }|dk    r4||k     r||z
  }d}	d|z  |z   |z   }
n@| }||d…         |z   }
|d|…         }	n%|dk     r||k     rdS ||d|…         z   }	||d…         }
|	                     d¦  «        }	t          |	|
|¦  «        }|S )z2Rescale a number string by a given number of unitsr   r   rh   rÊ   N)rÈ   rÍ   rr   r½   Úlstrip)rn   ÚunitsscaledÚwholeÚdecrÅ   ÚhilenÚlolenÚdigitsmovedÚpadcountÚnewwholeÚnewdecÚ	choppointrÌ   s                r   r­   r­   R  s%  € å,¨UÑ3Ô3Ñ€Eˆ3�Ø�aÒÐå  ¨¨XÑ6Ô6ˆØˆÝ�‰JŒJ€EÝ�‰HŒH€EÝ�k A‘oÑ&Ô&€KØ�Q‚€Ø�;ÒÐð # UÑ*ˆHØˆHØ˜H‘n¨Ñ-°Ñ3ˆFˆFà$˜ˆIØ˜9˜:˜:Ô&¨Ñ,ˆFØ˜Z˜i˜ZÔ(ˆHˆHØ	�qŠˆØ�;ÒÐð �4à˜s < K <Ô0Ñ0ˆHØ˜˜˜Ô&ˆFØ�Š˜sÑ#Ô#€HÝ ¨&°(Ñ;Ô;€HØ€Or   c                 ón   — t          | ¦  «        }t          | |¦  «                             d¦  «        }||fS )zDScale a zero value for the unit with the highest available precisionrÄ   )r©   r­   rÑ   )rn   ÚscalerÌ   s      r   Ú
formatzerorÞ   u  s7   € å˜ÑÔ€EÝ˜U EÑ*Ô*×1Ò1°#Ñ6Ô6€HØ�eÐÐr   c                 ó$  — t          | ¦  «        rt          | ¦  «        S t          | ¦  «        \  }}}t          |¦  «        }|dk    st          |¦  «        rwd}t          |¦  «        }||k     r||         dk    rn|dz  }||k     °|dz  dz   }|dz  }||k     r
|dz  }|dz  }|d|…                              d¦  «        }	||d…         }
| }n0|dz  }|dz  }|dk    r|dz  }d}|d|…         }	||d…         |z   }
|}t          |	|
|¦  «        }||fS )z4Scales a number string to fit in the range 1.0-999.9r   rÊ   r   r   N)ÚisstringzerorÞ   rÈ   rr   rÑ   rÍ   )rn   rÓ   rÔ   rÅ   rÕ   r›   rÖ   ÚlounitsÚ	movecharsrÙ   rÚ   Ú
unitsmovedÚhiunitsÚhidigitsrÌ   s                  r   r¨   r¨   |  sd  € å�EÑÔð !Ý˜%Ñ Ô Ð Ý,¨UÑ3Ô3Ñ€Eˆ3�Ý�‰JŒJ€EØ�Š
ˆ
•| EÑ*Ô*ˆ
ØˆÝ�C‘”ˆØ�%ŠiˆiØ�1Œv˜Š}ˆ}ØØ�‰FˆAð �%Šiˆið ˜‘6˜Q‘,ˆØ˜a‘Kˆ	Ø�9ÒÐð ˜A‘vˆGØ !™ˆIØ�z˜	�z”?×)Ò)¨#Ñ.Ô.ˆØ�Y�Z�Z”ˆØ�Xˆ
ˆ
à˜1‘*ˆØ˜1‘9ˆØ�qŠ=ˆ=Ø�q‰LˆGØˆHØ˜˜(˜Ô#ˆØ�x�y�yÔ! CÑ'ˆØˆ
Ý ¨&°(Ñ;Ô;€HØ�jÐ!Ð!r   c                 óì  — t          | ¦  «        }|€| }nß||k    r| }nÖ||k     rd||z
  z  }|| z   }nÂd| v r¼||z
  }t          |                      d¦  «        d         ¦  «        }t          ||¦  «        }||z
  }t          t	          t          | ¦  «        |¦  «        ¦  «        }|                     d¦  «        }	t          |	d         ¦  «        }|dk    r|	d         dz   }n||k    r||z
  }
|d|
z  z   }n| }|S )zFAttempt to fit value into a field, preserving as much data as possibleNrE   r]   r   r   rÊ   )rr   rb   Úminra   Úroundrˆ   )rn   Ú	fieldsizeÚvallenrÌ   ÚpadÚdiffÚdeclenÚcroplenÚroundlenÚsplittedrØ   s              r   r    r       s!  € å�‰ZŒZ€FØÐØˆˆØ	�9Ò	Ð	ØˆˆØ	�)Ò	Ð	Ø�Y Ñ'Ñ(ˆØ˜‘;ˆˆà�%ˆ<ˆ<Ø˜IÑ%ˆDÝ˜Ÿš SÑ)Ô)¨!Ô,Ñ-Ô-ˆFÝ˜& $Ñ'Ô'ˆGØ Ñ'ˆHÝ�5¥ u¡¤¨xÑ8Ô8Ñ9Ô9ˆHØ—~’~ cÑ*Ô*ˆHÝ˜ !œÑ%Ô%ˆFØ˜1Š}ˆ}à# Aœ;¨Ñ,��Ø˜FÒ"Ð"Ø# fÑ,�Ø# s¨X¡~Ñ6�øàˆHØ€Or   c                 óô   — d| vr| S |dk    r|                       d¦  «        d         S |                      d¦  «        dz   }t          | ¦  «        |z
  }t          ||¦  «        }||z
  }|dk    r| d| …         } | S )z(Crops digits below the maximum precisionr]   r   r   N)rb   Úfindrr   rç   )rn   ÚoomsÚdstartÚdsizeÚ	precisionÚ	cropcounts         r   Úcropprecisionrø   ¾  s�   € à
�%ÐÐØˆØˆq‚y€yØ�{Š{˜3ÑÔ Ô"Ð"Ø�ZŠZ˜‰_Œ_˜qÑ €FÝ�‰JŒJ˜Ñ€EÝ�D˜%Ñ Ô €IØ˜	Ñ!€IØ�1‚}€}Ø�k˜	�z�kÔ"ˆØ€Lr   c                 ó   — | D ]	}|dvr dS Œ
dS )z)Detects whether a string is equal to zero)rÄ   r]   rÊ   FTr   )rn   r›   s     r   rà   rà   Í  s-   € àð ð ˆØ�OÐ#Ð#Ø�5�5ð $àˆ4r   c                 óÂ   — t           D ]V}| |v rP|€
|d         c S |                     | ¦  «        }||z  }d|cxk    rt          |¦  «        k     rn n
||         c S  dS ŒWdS )z7Returns a unit at a different scale from the input unitNr   )r¸   r"   rr   )r¹   Úmoverº   r"   s       r   Úunitrelativetorü   Õ  s‘   € åð 
 ð 
 ˆØ�5ˆ=ˆ=Øˆ|Ø˜Q”x���àŸš DÑ)Ô)�Ø˜‘�Ø˜Ð*Ð*Ò*Ð*¥ E¡
¤
Ò*Ð*Ð*Ð*Ð*Ø  œ<Ð'Ð'Ð'à˜4˜4ð ð ˆ4r   Fc                 ó’   — |t           v rt          }n$|t          v rt          }n|t          v rt
          }n| S t          | ||||¦  «        S )z1Call unitify() with the correct units for varname)ÚS_VARSÚUNIT_SÚMS_VARSr®   ÚPPM_VARSÚUNIT_PPMÚunitify)rn   ÚvarnameÚbaseunitÚwidthÚ	unitSpaceÚstarts         r   Ú
unitifyvarr	  å  sS   € à•&ÐÐÝˆˆØ	•GÐ	Ð	ÝˆˆØ	•HÐ	Ð	ÝˆˆàˆÝ�5˜% ¨5°)Ñ<Ô<Ð<r   c                 ó´  — |€t          |¦  «        d         }t          ||¦  «        }t          | ¦  «        rt          | ¦  «        \  }}n"t	          | |¦  «        }t          |¦  «        \  }}t          ||¦  «        }|rd}	d}
nd}	d}
|�1|€d}n|t          |¦  «        |	z   z
  }t          ||¦  «        |
z   |z   }n| |
z   |z   }|€| 	                    ¦   «         }|S )zEFormats a numberstring with relevant units. Attempts to fit in width.Nr   r   rE   rh   )
r»   rÂ   rà   rÞ   rø   r¨   rü   rr   r    Ústrip)rn   Ústartingunitr  r  r  ró   rÌ   rã   ÚunitgetÚspaceWidthAdjustmentÚspacerÚ	realwidths               r   r  r  ò  s  € àÐÝ Ñ-Ô-¨aÔ0ˆÝ˜L¨(Ñ3Ô3€DÝ�EÑÔð 5Ý)¨%Ñ0Ô0Ñˆ�*�*å  ¨Ñ-Ô-ˆÝ*¨8Ñ4Ô4Ñˆ�*Ý˜\¨:Ñ6Ô6€GØð Ø ÐØˆˆà ÐØˆØÐØˆ=ØˆIˆIà¥ W¡¤Ð0DÑ!DÑEˆIÝ˜h¨	Ñ2Ô2°VÑ;¸gÑEˆˆà˜6‘> LÑ0ˆØ€}Ø—>’>Ñ#Ô#ˆØ€Or   c                 ó‚  — t          | t          ¦  «        rd| z  S t          | t          t          f¦  «        sdS t          t          | ¦  «        ¦  «                             ¦   «         dk    rdS d}| dk    r$| dk     rd}n>| d	k     rd
}n5| dk     rd}n,| dk     rd}n#| dk    rd}n| dk    rd
}n| dk    rd}n| dk    rd}|| z  S )ú7Scaled floating point formatting to fit in 8 charactersú%8sú       XÚnanú     nanú%8dr   g     @�@z%8.4fç     ˆÃ@ú%8.3fç     jø@ú%8.2fç    €„.Aú%8.1fg      YÀç     @�Àç     ˆÃÀç     jøÀ©Ú
isinstancera   rc   rˆ   Úlower©ÚfÚfmts     r   Úf8dot4r'    sû   € õ �!•SÑÔð à�q‰yÐÝ�a�#�u˜Ñ&Ô&ð àˆzÝ
�5�‰8Œ8�}„}×ÒÑÔ Ò%Ð%ð ˆzà
€CØˆA‚v€vØˆvŠ:ˆ:ØˆCˆCØ�Š[ˆ[ØˆCˆCØ�Š\ˆ\ØˆCˆCØ�Š]ˆ]ØˆCøð ˆvŠ:ˆ:ØˆCˆCØ�Š[ˆ[ØˆCˆCØ�Š\ˆ\ØˆCˆCØ�Š]ˆ]ØˆCà�‰7€Nr   c                 ó^  — t          | t          ¦  «        rd| z  S t          | t          t          f¦  «        sdS t          t          | ¦  «        ¦  «                             ¦   «         dk    rdS d}| dk    r| dk     rd}n,| d	k     rd
}n#| dk     rd}n| dk    rd}n| dk    rd
}n| dk    rd}|| z  S )r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r   r!  r$  s     r   Úf8dot3r)  6  sÙ   € å�!•SÑÔð à�q‰yÐÝ�a�#�u˜Ñ&Ô&ð àˆzÝ
�5�‰8Œ8�}„}×ÒÑÔ Ò%Ð%ð ˆzà
€CØˆA‚v€vØˆwŠ;ˆ;ØˆCˆCØ�Š\ˆ\ØˆCˆCØ�Š]ˆ]ØˆCøð ˆwŠ;ˆ;ØˆCˆCØ�Š\ˆ\ØˆCˆCØ�Š]ˆ]ØˆCà�‰7€Nr   c                  óp   — 	 t          j        ¦   «         S # t          $ r t          j         ¦   «         cY S w xY w)z>Try to get a monotonic clock value unaffected by NTP stepping.)rH   Ú	monotonicÚAttributeErrorr   r   r   Ú	monoclockr-  W  sB   € ðåŒ~ÑÔÐøÝð ð ð ÝŒy‰{Œ{ÐÐÐðøøøs   ‚ •5´5c                   ó(   — e Zd ZdZdd„Zd„ Zdd„ZdS )	ÚCachezSimple time-based cacheé,  c                 ó"   — || _         i | _        d S r�   )ÚdefaultTimeoutÚ_cache)Úselfr2  s     r   Ú__init__zCache.__init__c  s   € Ø,ˆÔØˆŒˆˆr   c                 ó|   — || j         v r2| j         |         \  }}}|t          ¦   «         |z
  k    r|S | j         |= d S d S r�   )r3  r-  )r4  rµ   rn   ÚsettimeÚttls        r   r«   z	Cache.getg  sO   € Ø�$”+ÐÐØ"&¤+¨cÔ"2ÑˆE�7˜CØ�)™+œ+¨Ñ+Ò+Ð+Ø�à”K Ð$Ø�tà�4r   Nc                 óN   — |�|n| j         }|t          ¦   «         |f| j        |<   d S r�   )r2  r-  r3  )r4  rµ   rn   Ú	customTTLr8  s        r   Úsetz	Cache.setr  s0   € Ø$Ð0ˆiˆi°dÔ6IˆØ!¥9¡;¤;°Ð4ˆŒ�CÑÐÐr   )r0  r�   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r5  r«   r;  r   r   r   r/  r/  `  sQ   € € € € € ØÐðð ð ð ð	ð 	ð 	ð5ð 5ð 5ð 5ð 5ð 5r   r/  c                 óN  — t                                | ¦  «        }|�|S t          j        d| ¦  «        }|st          ‚t          | ¦  «        \  }}	 t          j        |d|ddt          j        ¦  «        }n# t          j	        $ r d|z  cY S w xY w|d         \  }}}}	}
	 t          j
        |
t          j        ¦  «        }|d                              ¦   «         |z   }n0# t          j	        $ r |	p|}|                     ¦   «         |z   }Y nw xY wt                                | |¦  «         |S )z.Canonicalize a hostname or numeric IP address.Nz([:.[\]]|\w)*r   z
DNSFAIL:%s)Úcanonicalization_cacher«   ÚreÚmatchÚ	TypeErrorr…   ÚsocketÚgetaddrinfoÚAI_CANONNAMEÚgaierrorÚgetnameinfoÚNI_NAMEREQDr#  r;  )ÚinhostÚfamilyÚresnameÚmr�   r‚   ÚaiÚsocktypeÚprotoÚ	canonnameÚsockaddrÚnameÚresultÚcanonicalizeds                 r   Úcanonicalize_dnsrW  {  sM  € å$×(Ò(¨Ñ0Ô0€GØÐØˆå
Œ� &Ñ)Ô)€AØð ÝˆÝ& vÑ.Ô.Ñ€Xˆzð'ÝÔ ¨$°¸¸1Ý &Ô 3ñ5ô 5ˆˆøåŒ?ð 'ð 'ð 'Ø˜hÑ&Ð&Ð&Ð&ð'øøøà57¸´UÑ2€VˆX�u˜i¨ð4ÝÔ! (­FÔ,>Ñ?Ô?ˆØ�a”—’‘” :Ñ-ˆˆøÝŒ?ð 4ð 4ð 4ð "Ð- XˆØ×$Ò$Ñ&Ô&¨Ñ3ˆˆˆð	4øøøõ
 ×Ò˜v vÑ.Ô.Ð.Ø€Ms$   Á#A4 Á4BÂ
BÂ<C Ã*DÄDÚTermSizer  Úheightc                  ó\  — d} t          j        d¦  «        rŽt          t          urt	          j        d¦  «        \  }}||f} nd	 t          j        dt          j	        dt          j        t          j        ddddd¦  «        ¦  «        ¦  «        \  }}}}||f} n# t          $ r Y nw xY wt          | Ž S )z!Return the current terminal size.)éP   é   r   ÚHHHHr   r   )ÚosÚisattyra   ÚbytesÚshutilÚget_terminal_sizeÚstructÚunpackÚfcntlÚioctlÚtermiosÚ
TIOCGWINSZÚpackÚIOErrorrX  )ÚsizeÚwÚhÚhpÚwps        r   Útermsizerp  ¤  sÌ   € ð €DÝ	„y��|„|ð Ý•eÐÐõ Ô-¨hÑ7Ô7‰FˆQ�Ø�q�6ˆDˆDðå%œ}ØÝ”K ¥7Ô#5Ý &¤¨F°A°q¸!¸QÑ ?Ô ?ñAô Añ Bô  B‘��1�b˜"ð ˜1�v��øÝð ð ð Ø�ðøøøå�Tˆ?Ðs   ÁAB Â
B"Â!B"c                   ó6   — e Zd ZdZej        j        fd„Zd„ ZdS )ÚPeerStatusWordz:A peer status word from readstats(), dissected for displayc                 ób  — t           j                             |¦  «        | _        t           j                             |¦  «        | _        t           j                             |¦  «        }|t           j        j        z  rd| _        nd| _        |t           j        j	        z  rd| _
        n#|t           j        j        z  rd| _
        nd| _
        |t           j        j        z  dk    rd| _        n#|t           j        j        z  rd| _        nd| _        |t           j        j        k    r›t           j        j        dt           j        j        dt           j        j        d	t           j        j        d
t           j        j        dt           j        j        dt           j        j        dt           j        j        di}||dz           | _        nƒ|dz  t4          k    r4|t6          z  dk    rd| _        n_|t8          z  dk    rd| _        nId| _        nA|dz  t:          k    rd| _        n+|dz  t<          k    rd| _        n|dz  t>          k    rd| _        t           j        j         dt           j        j!        dt           j        j"        dt           j        j#        dt           j        j$        dt           j        j%        dt           j        j&        dt           j        j'        dt           j        j(        dt           j        j)        dt           j        j*        d i}| +                    t           j        j,        | j        z  d¦  «        | _-        d S )!NÚyesÚnoÚnoner   úok ÚbadÚrejectÚ	falsetickÚexcessÚoutlierÚ	candidateÚbackupzsys.peerzpps.peerrŸ   r   ÚinsaneÚhi_disprh   Úsel_candÚ	sync_candÚsys_peerÚmobilizeÚ
demobilizeÚunreachableÚ	reachableÚrestartÚno_replyÚrate_exceededÚaccess_deniedÚ
leap_armedÚclock_alarm).rj   ÚcontrolÚCTL_PEER_EVENTÚeventÚCTL_PEER_NEVNTÚevent_countÚCTL_PEER_STATVALÚCTL_PST_CONFIGÚconfÚCTL_PST_BCASTÚreachÚCTL_PST_REACHÚCTL_PST_AUTHENABLEÚauthÚCTL_PST_AUTHENTICÚmagicÚNTP_OLDVERSIONÚCTL_PST_SEL_REJECTÚCTL_PST_SEL_SANEÚCTL_PST_SEL_CORRECTÚCTL_PST_SEL_SELCANDÚCTL_PST_SEL_SYNCCANDÚCTL_PST_SEL_EXCESSÚCTL_PST_SEL_SYSPEERÚCTL_PST_SEL_PPSÚ	conditionÚOLD_CTL_PST_SEL_REJECTÚOLD_CTL_PST_SANEÚOLD_CTL_PST_DISPÚOLD_CTL_PST_SEL_SELCANDÚOLD_CTL_PST_SEL_SYNCCANDÚOLD_CTL_PST_SEL_SYSPEERÚPEVNT_MOBILÚPEVNT_DEMOBILÚPEVNT_UNREACHÚPEVNT_REACHÚPEVNT_RESTARTÚPEVNT_REPLYÚ
PEVNT_RATEÚ
PEVNT_DENYÚPEVNT_ARMEDÚPEVNT_NEWPEERÚPEVNT_CLOCKr«   Ú
PEER_EVENTÚ
last_event)r4  ÚstatusÚ
pktversionÚstatvalÚseldictÚ
event_dicts         r   r5  zPeerStatusWord.__init__¿  s”  € å”[×/Ò/°Ñ7Ô7ˆŒ
åœ;×5Ò5°fÑ=Ô=ˆÔÝ”+×.Ò.¨vÑ6Ô6ˆà•S”[Ô/Ñ/ð 	ØˆDŒIˆIàˆDŒIà•S”[Ô.Ñ.ð 	ØˆDŒJˆJØ•s”{Ô0Ñ0ð 	ØˆDŒJˆJàˆDŒJà•c”kÔ4Ñ4¸Ò:Ð:ØˆDŒIˆIØ•s”{Ô4Ñ4ð 	ØˆDŒIˆIàˆDŒIà�œ	Ô0Ò0Ð0å”Ô.°Ý”Ô,¨kÝ”Ô/°Ý”Ô/°Ý”Ô0°+Ý”Ô.°Ý”Ô/°Ý”Ô+¨Zð	ˆGð % W¨s¡]Ô3ˆDŒNˆNà˜#‘Õ"8Ò8Ð8ØÕ.Ñ.°1Ò4Ð4Ø%-�D”N�NØÕ 0Ñ0°QÒ6Ð6Ø%.�D”N�Nà%'�D”N�NØ˜C‘-Õ$;Ò;Ð;Ø!+�”�Ø˜C‘-Õ$<Ò<Ð<Ø!,�”�Ø˜C‘-Õ$;Ò;Ð;Ø!+�”õ ŒIÔ! :ÝŒIÔ# \ÝŒIÔ# ]ÝŒIÔ! ;ÝŒIÔ# YÝŒIÔ! :ÝŒIÔ  /ÝŒIÔ  /ÝŒIÔ! <ÝŒIÔ# ZÝŒIÔ! =ðˆ
ð %Ÿ.š.­¬Ô)=ÀÄ
Ñ)JÈBÑOÔOˆŒˆˆr   c                 ó   — d| j         z  S )Nzjconf=%(conf)s, reach=%(reach)s, auth=%(auth)s, cond=%(condition)s, event=%(last_event)s ec=%(event_count)s)Ú__dict__©r4  s    r   Ú__str__zPeerStatusWord.__str__  s   € ðNà”-ñ ð 	!r   N)	r<  r=  r>  r?  rj   rœ  ÚNTP_VERSIONr5  rÂ  r   r   r   rr  rr  ¼  sN   € € € € € Ø@Ð@à*-¬)Ô*?ð BPð BPð BPð BPðH!ð !ð !ð !ð !r   rr  ú, c                 ó2  — t           j                             ¦   «         j        dz
  }d}d}t	          t          |t          ¬¦  «        ¦  «        }|                      ¦   «         D �]&\  }\  }}	||v rdt          |¦  «        z   dz   }
|
|z  }nd|z  }|dv r$|t           j         	                    |¦  «        z  }�n�|d	v r||z  }�n„|d
k    r|d|         z  }�nq|dk    r
|d|z  z  }�na||v rB|r|t          |¦  «        z  }�nG|d                     |                     ¦   «         ¦  «        z  }�n|dk    rL|d|z  z  }|dk    r|dz  }n-d}t          |¦  «        D ]\  }}d|z  |z  r|||         dz   z  }Œ|dd…         }nÉ|t          v r6|r!|t          |	t           t"          d¬¦  «        z  }n�|t%          |¦  «        z  }nŠ|t&          v r6|r!|t          |	t(          t"          d¬¦  «        z  }n^|t%          |¦  «        z  }nK|t*          v r0|r|t          |	t,          d¬¦  «        z  }n%|t%          |¦  «        z  }n|t%          |¦  «        z  }||z  }d}|D ]}|dk    rd}Œ|dz  }Œ|t	          |¦  «        z   |k    r|dd…         dz   }||z  }�Œ(|dd…         dz   }|S )zCooked-mode variable display.r   rh   )Ú	filtdelayÚ
filtoffsetÚfiltdispÚ	filterror)rµ   ú%zs =z%s=)ÚreftimeÚclockÚorgÚrecÚxmt)ÚsrcadrÚpeeradrÚdstadrÚrefidÚleap)Ú00Ú01Ú10Ú11r—  z%03loú	Úflashz%02x r   rw  )Úpkt_dupÚ	pkt_bogusÚ
pkt_unsyncÚ
pkt_deniedÚpkt_authÚpkt_stratumÚ
pkt_headerÚpkt_autokeyÚ
pkt_cryptoÚpeer_stratumÚ	peer_distÚ	peer_loopÚpeer_unreachr   rE   Nrq   )r  rF   éþÿÿÿ)rj   rk   rp  r  rr   rª   Úitemsra   ÚntpcÚ
prettydater¶   ri   rb   Ú	enumerater   r  r®   ÚUNIT_NSÚreprrþ   rÿ   r  r  )Ú	variablesÚ	showunitsÚsepr  rL   ÚspecialsÚlongestspecialrT  rn   ÚrawvalueÚ	formatterÚitemÚtstflagnamesr›   ÚnÚ	lastcountÚcs                    r   Úcookrû  	  s1  € åŒH×ÒÑÔÔ%¨Ñ)€EØ€DØC€HÝ�˜X­3Ð/Ñ/Ô/Ñ0Ô0€NØ%.§_¢_Ñ%6Ô%6ð Pñ PÑ!ˆÑ ��xØ�8ÐÐØ�c .Ñ1Ô1Ñ1°EÑ9ˆIØ˜tÑ#ˆDˆDà˜4‘<ˆDØÐ<Ð<Ð<Ø•C”H×'Ò'¨Ñ.Ô.Ñ.ˆD‰DØÐ=Ð=Ð=ð �E‰MˆD‰DØ�VŠ^ˆ^ØÐ,¨UÔ3Ñ3ˆD‰DØ�WŠ_ˆ_Ø�G˜e‘OÑ#ˆD‰DØ�XÐÐØð 1ØÕ(¨Ñ/Ô/Ñ/�‘à˜Ÿ	š	 %§+¢+¡-¤-Ñ0Ô0Ñ0�‘Ø�WŠ_ˆ_Ø�G˜e‘OÑ#ˆDØ˜ŠzˆzØ˜‘��ð �õ (¨Ñ5Ô5ð 6ð 6‘F�Q˜Ø˜Q™ %Ñ'ð 6Ø ¨Q¤°#Ñ 5Ñ5˜øØ˜˜˜”9ˆDˆDØ•Wˆ_ˆ_ð ð $Ø� ­'µ7À$ÐGÑGÔGÑG��à�˜U™œÑ#��Ø•Vˆ^ˆ^Øð $Ø� ­&µ'ÀÐFÑFÔFÑF��à�˜U™œÑ#��Ø•XÐÐØð $Ø� ­(¸$Ð?Ñ?Ô?Ñ?��à�˜U™œÑ#��à•D˜‘K”KÑˆDà�‰ˆàˆ	Øð 	ð 	ˆAØ�DŠyˆyØ�	�	à˜Q‘�	�	Ø•s˜4‘y”yÑ  5Ò(Ð(Ø˜˜˜”9˜tÑ#ˆDØ�‰ˆ‰Ø���Œ9�tÑ€DØ€Kr   c                   ó†   — e Zd ZdZdddej        fd„Zed„ ¦   «         Zed„ ¦   «         Z	ed„ ¦   «         Z
d	„ Zd
„ Zd„ Zd„ ZdS )ÚPeerSummaryz-Reusable report generator for peer statisticsFNr   c	                 ó>  — || _         || _        || _        || _        || _        || _        || _        || _        t          |pddz
  d¦  «        | _	        d| j	        z   | _
        d| _        d                     | j
        ¦  «        | _        d| _        d | _        g | _        d S )Nr[  r\  é   z     remote    z(st t when poll reach   delay   offset   )Údisplaymoder»  Úshowhostnamesrð  Ú
wideremoterM   rK   Ú	termwidthrç   Úhorizontal_slackÚ	namewidthÚ
refidwidthÚljustÚ_PeerSummary__remoteÚ_PeerSummary__commonÚ_PeerSummary__headerÚpolls)	r4  r   r»  r  r  rð  r  rM   rK   s	            r   r5  zPeerSummary.__init__g  s£   € ð 'ˆÔØ$ˆŒØ*ˆÔØ"ˆŒØ$ˆŒØˆŒ
ØˆŒ
Ø"ˆŒõ !$ Y _°"¸Ñ$:¸BÑ ?Ô ?ˆÔð ˜dÔ3Ñ3ˆŒØˆŒà)×/Ò/°´Ñ?Ô?ˆŒØBˆŒØˆŒØˆŒ
ˆ
ˆ
r   c                 óÌ   — t          | t          ¦  «        r| dk    rdS | dk    rt          | ¦  «        S | dz   dz  } | dk    rd| z  S | dz   dz  } | dk    rd	| z  S | d
z   dz  } d| z  S )z(Print an interval in natural time units.r   rÄ   i   é   é<   r0  z%dmé`   z%dhé   r\  z%dd)r"  rc   ra   )rì   s    r   ÚprettyintervalzPeerSummary.prettyinterval„  s’   € õ ˜$¥Ñ$Ô$ð 	¨°ª	¨	Ø�3Ø�4Š<ˆ<Ý�t‘9”9ÐØ�r‘	˜RÑˆØ�3Š;ˆ;Ø˜4‘<ÐØ�r‘	˜RÑˆØ�2Š:ˆ:Ø˜4‘<ÐØ�r‘	˜RÑˆØ�t‰|Ðr   c                 óN   — t          | ¦  «        |k    r| S d| | dz   d…         z   S )z8Truncate on the left using leading _ to indicate 'more'.rÄ   r   N)rr   )r�   Úmaxlens     r   Úhigh_truncatezPeerSummary.high_truncate”  s4   € õ ˆx‰=Œ=˜FÒ"Ð"ØˆOà˜ 6 '¨!¡) * *Ô-Ñ-Ð-r   c                 ó*   — d| v od| d         d         v S )z;Does a set of variables look like it returned from a clock?Úsrchostú(r   r   )rï  s    r   Úis_clockzPeerSummary.is_clock�  s#   € ð ˜IÐ%ÐH¨#°¸9Ô1EÀaÔ1HÐ*HÐHr   c                 ó’  — | j         dk    r3| j        d                     | j        ¦  «        z   | j        z   dz   | _        nƒ| j         dk    r3| j        d                     | j        ¦  «        z   | j        z   dz   | _        nE| j         dk    rd| _        n2| j        d	                     | j        ¦  «        z   | j        z   dz   | _        | j        S )
zColumn headers for peer displayÚapeersz   refid   assid  r>   Úopeersz       local      z  dispÚrpeerszH st t when poll reach   delay   offset   jitter refid           T remotez       refid      )r   r  r  r  r	  r
  rÁ  s    r   ÚheaderzPeerSummary.header¢  så   € àÔ˜xÒ'Ð'Ø œMØ$×*Ò*¨4¬?Ñ;Ô;ñ<à”ñà (ñ)ˆDŒMˆMð Ô Ò)Ð)Ø œMØ$×*Ò*¨4¬?Ñ;Ô;ñ<à”ñà (ñ)ˆDŒMˆMð Ô Ò)Ð)ðGˆDŒMˆMð !œMØ$×*Ò*¨4¬?Ñ;Ô;ñ<à”ñà (ñ)ˆDŒMð Œ}Ðr   c                 ó   — d| j         z   S )zWidth of displayéO   )r  rÁ  s    r   r  zPeerSummary.widthµ  s   € à�DÔ)Ñ)Ð)r   c                 óx  — d}d}d}d}d}d}	d}
d}d}d}d}d}d}d}d}d}d}d}d}d}d}d}d}d}d}d}d}d}d} d}!d}"d}#d}$d}%d	}&t          j         ¦   «         }'|                     ¦   «         D �][}(d
t          |(¦  «        k    sd
t          |(d         ¦  «        k    rŒ0|(\  })\  }*}+|)dk    r-| j        r|+n|*}t          |+¦  «        dk    r|+d         dk    rd}Œk|)dk    rd| j        v r|+}Œ}|)dk    r|*}Œ†|)dk    r|*}Œ�|)dk    r|*}Œ˜|)dk    r|*}Œ¡|)dk    r|*}Œª|)dk    r|*}Œ³|)dk    r|*}Œ¼|)dk    r|*}|dk     rt
          j        j        }ŒÜ|)dk    rd| j        v r| j        r|+n|*}	d}Œù|)dk    r|*}�Œ|)dk    r|*}�Œ|)dk    r| j        r|+n|*}
�Œ |)dk    r|*}�Œ*|)dk    r|*}|dk     rt
          j        j        }�ŒK|)d k    r|*}�ŒU|)d!k    r|*}�Œ_|)d"k    rd"| j        v r|+}�Œr|)d#k    r3|*}t          |'t
          j	         
                    |¦  «        z
  ¦  «        }�Œ«|)d$k    r3|*}t          |'t
          j	         
                    |¦  «        z
  ¦  «        }�Œä|)d%k    r|*}�Œî|)d&k    s|)d'k    r| j        r|+n|*}�Œ|)d(v r|*}�Œ|)d)k    r|*} �Œ|)d*k    s|)d+k    r|*}!�Œ)|)d,k    r|*}"�Œ3|)d-k    r|*}#�Œ=|)d.k    r|*}$�ŒG|)d/k    r|*}%�ŒQ|)d0k    r|*}&�Œ[�Œ]|t
          j        j        k    rd1}nÛ|t
          j        j        k    r|                     d2¦  «        rd3}n®d4}n«|t
          j        j        k    rgt                               |¦  «        rd5}ny|d6k    rd7}np|                     d2¦  «        rd8}nX|&d	k    r t#          |&t%          d9¦  «        z   ¦  «        }n2d:}n/|t
          j        j        k    rd;}n|t
          j        j        k    rd<}d},dt+          ||¦  «        z  }-| j                             |-¦  «         | j        t
          j        j        k    r)d=t
          j                             |¦  «        d>z           }.n(d?t
          j                             |¦  «        d@z           }.|�±|dAk    r«|                     dB¦  «        s–|dCk    r�| j        d
z  rd)t;          ¦   «         v r| r| }ns| j        dz  rd	 | j        r| j                              dD¦  «         tC          |¦  «        }| j        r| j                              dE¦  «         n# tD          $ r Y dS w xY w|}n| }|€|r|}nd}| j#        dFk    r]| j$        r3t          |¦  «        | j%        k    r|,dG|.|fz  z  },|,dH| j%        d
z   z  z  },n#|,dI|.| j%        | j%        |d| j%        …         fz  z  },| j#        dJk    rd>nd}/d|vrdK|vrd|z   dz   }|/rt          |¦  «        | j&        |/z
  k    rdL}0n|}0| j#        dFk    rr|,|  '                    |0| j&        ¦  «        z  },| j#        dJk    r,|,dH| j&        t          |0¦  «        z
  |/z
  dz   z  z  },|,dM|z  z  },n|,dH| j&        t          |0¦  «        z
  z  z  },|€|'}|r|	n|}1| j        rdN„ }2n	|rdO„ }2ndP„ }2|,dQ|"|t           (                    |¦  «        t           (                    |-¦  «        | |2|¦  «         |2|
¦  «         |2|1¦  «        fz  z  },|,dRz  },|,S )SzPeer status summary line.rh   r   r]   g        FNú?é   rq   r   r   r=   é   iùÿÿÿTrÒ  ÚlocalÚdstportrÆ  rÈ  rÇ  rÚ  ÚheadwayÚhmodeÚhpollr>   ÚkeyidrÔ  r-   ÚpmodeÚppollrö   r—  rÓ  rÎ  rË  r*   r+   r?   )rÐ  rÑ  r  ÚsrcportÚpeerportÚstratumÚmodeÚunreachrÏ  Ú
ntscookiesr¿   z224.ÚMÚBÚlÚPOOLÚpr¾   rÊ   Úur   ÚSz x.-+#*orŸ   z .+*r   z0.0.0.0z127.127z::zDNS lookup begins...
zDNS lookup ends.
r  z%c%s
rE   z	%c%-*.*s r  r}   z...z%-6dc                 ó,   — t          | t          ¦  «        S r�   )r  r®   ©Úxs    r   ú<lambda>z%PeerSummary.summary.<locals>.<lambda>¨  s   € �g a­Ñ1Ô1€ r   c                 ó    — t          | ¦  «        S r�   )r'  r:  s    r   r<  z%PeerSummary.summary.<locals>.<lambda>ª  ó   € �f Q™iœi€ r   c                 ó    — t          | ¦  «        S r�   )r)  r:  s    r   r<  z%PeerSummary.summary.<locals>.<lambda>¬  r>  r   z# %2ld %c %4.4s %4.4s  %3lo %s %s %srF   ))rH   ré  rr   rð  r
  rj   rœ  ÚNTP_MINPOLLrc   rê  Ú
lfptofloatÚMODE_BCLIENTXÚMODE_BROADCASTxÚ
startswithÚMODE_CLIENTrý  r  ru   ÚordÚMODE_ACTIVExÚMODE_PASSIVExrç   r  rt   r»  r�  rŽ  r“  r  ÚlocalsrM   rK   rI   rW  rD  r   r  r  r  r  r  )3r4  Úrstatusrï  ÚassocidÚ
clock_nameÚdstadr_refidr%  ÚestdelayÚestdispÚ	estjitterÚ	estoffsetrÆ  rÈ  rÇ  rÚ  Úhave_jitterr&  r'  r(  r)  Ú	last_syncrÔ  r*  r+  rö   Úptyper—  rÎ  rË  r*   Úsaw6rÐ  r  r,  r.  r/  r0  rÏ  r1  Únowrö  rT  rn   rô  ÚlineÚpoll_secrú  Ú
assocwidthÚvisibleÚjdÚfinis3                                                      r   ÚsummaryzPeerSummary.summary¹  sÝ  € àˆ
ØˆØˆØˆØˆØˆ	Øˆ	Øˆ	ØˆØˆ
ØˆØˆØˆØˆØˆØˆØˆ	ØˆØˆØˆØˆ	ØˆØˆØˆØˆØˆ	ØˆØˆØˆØˆØˆØˆØˆØˆØˆ
åŒi‰kŒkˆà—O’OÑ%Ô%ð h	ñ h	ˆDØ•C˜‘I”IŠ~ˆ~ ¥c¨$¨q¬'¡l¤lÒ!2Ð!2àØ(,Ñ%ˆTÑ$�E˜8Ø�wŠˆØ'+¤~Ð@˜8˜8¸5�Ý�x‘=”= 1Ò$Ð$¨°"¬¸Ò)<Ð)<Ø�DøØ˜Ò!Ð!ð ˜dœmÐ+Ð+Ø#+�LøØ˜Ò"Ð"à��Ø˜Ò$Ð$à!�	�	Ø˜Ò#Ð#à ��Ø˜Ò%Ð%à"�
�
Ø˜’�à��Ø˜Ò"Ð"à��Ø˜’�Ø��Ø˜’�Ø�Ø˜1’9�9ÝœIÔ1�EøØ˜Ò!Ð!Ø˜tœ}Ð,Ð,Ø,0¬NÐ E  À�IØ"&�KøØ˜’�à�‘Ø˜’�à�‘Ø˜Ò!Ð!Ø(,¬ÐA˜H˜H¸E�	‘	Ø˜’�à�‘Ø˜’�Ø�Ø˜1’9�9ÝœIÔ1�EùØ˜Ò$Ð$à!�	‘	Ø˜’�à�‘Ø˜’�ð ˜dœmÐ+Ð+Ø#+�LùØ˜’�Ø�Ý ¥c¤h×&9Ò&9¸#Ñ&>Ô&>Ñ >Ñ?Ô?�	‘	Ø˜Ò"Ð"Ø�Ý ¥c¤h×&9Ò&9¸'Ñ&BÔ&BÑ BÑCÔC�	‘	Ø˜Ò$Ð$à!�	‘	Ø˜Ò#Ð# t¨|Ò';Ð';Ø&*¤nÐ?˜(˜(¸%�‘ØÐ.Ð.Ð.Ø�‘Ø˜Ò"Ð"Ø�‘Ø˜Ò"Ð" d¨jÒ&8Ð&8à�‘Ø˜Ò"Ð"Ø�‘Ø˜’�à�‘Ø˜Ò"Ð"à�‘Ø˜’�à�‘Ø˜Ò%Ð%Ø"�
‘
ñ
 Ø•C”IÔ+Ò+Ð+àˆEˆEØ•c”iÔ/Ò/Ð/à× Ò  Ñ(Ô(ð Ø��à��Ø•c”iÔ+Ò+Ð+Ý×#Ò# IÑ.Ô.ð 
Ø��Ø Ò'Ð'Ø��Ø×"Ò" 6Ñ*Ô*ð Ø��Ø˜b’�å˜J­¨S©¬Ñ1Ñ2Ô2��à��Ø•c”iÔ,Ò,Ð,ØˆEˆEØ•c”iÔ-Ò-Ð-ØˆEð
 ˆØ�˜E 5Ñ)Ô)Ñ)ˆØŒ
×Ò˜(Ñ#Ô#Ð#ØŒ?�SœYÔ5Ò5Ð5Ø�3œ;×7Ò7¸Ñ@Ô@À3ÑFÔGˆAˆAà•s”{×3Ò3°GÑ<Ô<¸sÑBÔCˆAð ÐØ˜iÒ'Ð'Ø×)Ò)¨)Ñ4Ô4ð (à˜d’N�NØÔ! AÑ%ð $¨)µv±x´xÐ*?Ð*?ÀGÐ*?Ø$�
�
ØÔ# aÑ'ð 
$ðØ”zð CØœ
×(Ò(Ð)AÑBÔBÐBÝ!1°&Ñ!9Ô!9�JØ”zð ?Øœ
×(Ò(Ð)=Ñ>Ô>Ð>øøÝ ð ð ð Ø˜2˜2ðøøøð $�
�
à ˆJØÐØð  Ø#�
�
à�
ØÔ˜xÒ'Ð'ØŒð F¥3 z¡?¤?°T´^Ò#CÐ#CØ˜ Q¨
 OÑ3Ñ4�Ø˜ ¤°Ñ 2Ñ3Ñ4��à˜¨¨4¬>¸4¼>Ø(2°?°D´N°?Ô(Cð(Eñ Eñ F�ð Ô*¨hÒ6Ð6�Q�Q¸Aˆ
Ø�lÐ"Ð" s°,Ð'>Ð'>Ø Ñ-°Ñ3ˆLØð 	#�#˜lÑ+Ô+¨t¬ÀÑ/KÒKÐKØˆGˆGà"ˆGØÔ˜xÒ'Ð'Ø�D×&Ò& w°´Ñ@Ô@Ñ@ˆDØÔ 8Ò+Ð+Ø˜ ¤µ#°g±,´,Ñ >ÀÑ KÈaÑ OÑPÑQ�Ø˜ 7Ñ+Ñ,��à˜ ¤µ#°g±,´,Ñ >Ñ?Ñ@�àÐØˆIØ%Ð2ˆYˆY¨7ˆØŒ>ð 	(Ø1Ð1ˆDˆDØð 	(Ø'Ð'ˆDˆDà'Ð'ˆDØØ1Ø˜Ý×)Ò)¨)Ñ4Ô4Ý×)Ò)¨(Ñ3Ô3°UØˆt�H‰~Œ~˜t˜t I™œ°°°R±´ð:ñ:ñ	;ˆð 	�‰ˆð ˆs   Ò%AS7 Ó7
TÔTc                 ó2   — | j         dd…         }g | _         |S )z3Return and flush the list of actual poll intervals.N)r  )r4  Úress     r   Ú	intervalszPeerSummary.intervals¹  s   € àŒj˜˜˜ŒmˆØˆŒ
Øˆ
r   )r<  r=  r>  r?  r   rR   r5  Ústaticmethodr  r  r  r  r  r]  r`  r   r   r   rý  rý  d  sÐ   € € € € € Ø3Ð3ð (-¸Ø ¤
ðð ð ð ð: ðð ñ „\ðð ð.ð .ñ „\ð.ð ðIð Iñ „\ðIðð ð ð&*ð *ð *ð~ð ~ð ~ð@ð ð ð ð r   rý  c                   ó4   — e Zd ZdZddej        fd„ZdZd„ ZdS )Ú
MRUSummaryz0Reusable class for MRU entry summary generation.Fr   c                 óL   — || _         || _        d | _        || _        || _        d S r�   )rM   rK   rV  r  r  )r4  r  r  rM   rK   s        r   r5  zMRUSummary.__init__Ã  s*   € àˆŒ
ØˆŒ
ØˆŒØ*ˆÔØ$ˆŒˆˆr   zE lstint avgint rstr r m v  count    score   drop rport remote addressc                 óÔ  — t           j                             |j        ¦  «        }t           j                             |j        ¦  «        }t          ||z
  ¦  «        }t          |j        ¦  «        }| j        rot          | j        |z
  dz   ¦  «        }d|z  }|dk    rd}n||dz
  z  }t          |dz   ¦  «        }	d|k     sd|k    r	|d|	z  z  }nEd|k    r	|d|z  z  }n6|d	|z  z  }n-d
}
t          t          |¦  «        d¦  «        \  }}d||
z   ||fz  }|j
        t           j        j        z  rd}n|j
        t           j        j        z  rd}nd}t          |j        ¦  «        \  }}	 | j        dz  s|}n›t#          |¦  «        }t$                               |¦  «        }|€fd}	 t)          j        |d ¦  «        }|D ]\  }}}}}|r|d         |k    rd} nŒn# t(          j        $ r Y nw xY wt$                               ||¦  «         |s|›d|›d�}| j        s
|d d…         }|j        r2t          |j        ¦  «        }|dk    rd|z  }n|dk    rd|z  }nd|z  }nd}|j        d k    rd|j        z  }nd}|d|j
        |t           j                             |j        ¦  «        t           j                             |j        ¦  «        |j        |||dd …         |f	z  z  }|S # t<          $ r Y dS w xY w)Ng      à?z%7dr   r   g      @z %6dg      ð?z %6.2fz %6.3fi‹ž  é€Q z%5d %5d %6dÚKÚLr]   FTz (ú)é(   r  r  r  r  r  rÄ   z%4dz! %4hx %c %d %d %6d %8s %6s %5s %srh   )rj   rê  rA  ÚfirstÚlastrˆ   rc   ÚctrV  ÚdivmodÚrsrœ  ÚRES_KODÚRES_LIMITEDr…   Úaddrr  rW  rA  r«   rE  rF  rH  r;  r  ÚscÚdrÚPKT_MODEÚmvÚPKT_VERSIONrQ   )r4  Úentryrk  rl  Úactiver   ÚlstintÚstatsÚfavgintÚavgintÚMJD_1970ÚdaysÚrscodeÚipÚportÚdnsÚ	confirmedrO  Ú_rS  ÚscoreÚdrops                         r   r]  zMRUSummary.summaryÍ  sn  € Ý”×#Ò# E¤KÑ0Ô0ˆÝŒx×"Ò" 5¤:Ñ.Ô.ˆÝ�t˜e‘|Ñ$Ô$ˆÝ�E”H‘”ˆØŒ8ð 	FÝ˜œ D™¨3Ñ.Ñ/Ô/ˆFØ˜F‘NˆEØ˜ŠzˆzØ��à  E¨!¡GÑ,�Ý˜ 3™Ñ'Ô'ˆFØ�WŠ}ˆ}  U¢
 
Ø˜ &™Ñ(��Ø˜’�Ø˜ GÑ+Ñ+��à˜ GÑ+Ñ+��àˆHÝ!¥# d¡)¤)¨UÑ3Ô3‰LˆD�&Ø! T¨H¡_°f¸fÐ$EÑEˆEØŒ8•c”iÔ'Ñ'ð 	ØˆFˆFØŒX�œ	Ô-Ñ-ð 	ØˆFˆFàˆFÝ˜uœzÑ*Ô*‰
ˆˆTð-	ØÔ%¨Ñ)ð 0Ø��å& rÑ*Ô*�å2×6Ò6°sÑ;Ô;�	ØÐ$Ø %�IðÝ#Ô/°°TÑ:Ô:˜Ø68ð &ð &Ñ2˜Q  1 a¨Ø'ð &¨H°Q¬K¸2Ò,=Ð,=Ø,0 	Ø % øøøÝ!œ?ð ð ð Ø˜ðøøøå*×.Ò.¨s°IÑ>Ô>Ð>Ø ð 0Ø') r r¨3¨3¨3Ð/�CØ”?ð à˜#˜2˜#”h�ØŒxð 	Ý˜eœh™œ�Ø˜8Ò#Ð#Ø! E™/�%�%Ø˜W’_�_Ø! E™/�%�%à! E™/�%�%à�ØŒx˜$ŠˆØ˜uœxÑ'��à�ØÐ8Ø”h Ý”i×(Ò(¨¬Ñ2Ô2Ý”i×+Ò+¨E¬HÑ5Ô5Ø”h  t¨T°!°"°"¬X°sð<ñ<ñ <ˆEð
 ˆLøÝð 	ð 	ð 	à�2�2ð	øøøs7   Å$:K Æ2G ÇK ÇG$Ç!K Ç#G$Ç$C4K Ë
K'Ë&K'N)	r<  r=  r>  r?  r   rR   r5  r  r]  r   r   r   rc  rc  À  sT   € € € € € Ø6Ð6à16Ø ¤
ð%ð %ð %ð %ð U€FðKð Kð Kð Kð Kr   rc  c                   ó6   — e Zd ZdZdZdZed„ ¦   «         Zd„ ZdS )ÚReslistSummaryz4Reusable class for reslist entry summary generation.z<   hits    addr/prefix or addr mask
           restrictions
éH   c                 ó¦   ‡— | sd}d| v rd}dŠnd}dŠt          ˆfd„|                      |¦  «        D ¦   «         ¦  «        }dt          |¦  «        z   S )Nrh   r}   r   r]   é
   c                 ót   •— g | ]4}|¯t          t          |‰¦  «        ¦  «                             d ¦  «        ‘Œ5S )Ú1)Úbinrc   r   )Ú.0r;  Úbases     €r   ú
<listcomp>z.ReslistSummary.__getPrefix.<locals>.<listcomp>-  sK   ø€ ð 5ð 5ð 5Ø°!ð5•c�#˜a ™,œ,Ñ'Ô'×-Ò-¨cÑ2Ô2ð 5ð 5ð 5r   ú/)Úsumrb   ra   )ÚmaskÚprefixrñ  r‘  s      @r   Ú__getPrefixzReslistSummary.__getPrefix#  s   ø€ àð 	ØˆFØ�$ˆ;ˆ;ØˆCØˆDˆDàˆCØˆDÝð 5ð 5ð 5ð 5Ø#Ÿzšz¨#™œð5ñ 5ô 5ñ 6ô 6ˆà•S˜‘[”[Ñ Ð r   c                 ód  — |                      dd¦  «        }|                      dd¦  «        }|                      dd¦  «        }|dk    s|dk    rdS |t                               |¦  «        z  }|                      dd¦  «        }|d›d|›d	|›d
�}|D ]}|                     ¦   «         s|dvr dS Œ|S )NÚhitsr!  rr  r•  rh   Úflagsz>10rE   z
           rF   z/.: 
)r«   r‰  Ú_ReslistSummary__getPrefixÚisalnum)r4  rï  r™  Úaddressr•  rš  r   rú  s           r   r]  zReslistSummary.summary1  sÎ   € Ø�}Š}˜V SÑ)Ô)ˆØ—-’- ¨Ñ,Ô,ˆØ�}Š}˜V SÑ)Ô)ˆØ�cŠ>ˆ>˜T Sš[˜[Ø�2Ø•>×-Ò-¨dÑ3Ô3Ñ3ˆØ—’˜g sÑ+Ô+ˆà*.¨$¨$¨$°°°¸¸¸Ð?ˆð ð 	ð 	ˆAØ—9’9‘;”;ð  1¨HÐ#4Ð#4Ø�r�røØˆr   N)	r<  r=  r>  r?  r  r  ra  r›  r]  r   r   r   r‰  r‰    sP   € € € € € Ø:Ð:ð€Fð €Eàð!ð !ñ „\ð!ðð ð ð ð r   r‰  c                   ó4   — e Zd ZdZdZdZdddddddd	œZd
„ ZdS )ÚIfstatsSummaryz4Reusable class for ifstats entry summary generation.z‚    interface name                                  send
 #  address/broadcast     drop flag received sent failed peers   uptime
 éJ   z%-24.24sz%4xz%6dz%5dr  )rT  rš  ÚrxÚtxÚtxerrÚpcÚupc                 ó   — i }	 | j                              ¦   «         D ]6}|                     |d¦  «        }|dk    r|}n| j         |         |z  }|||<   Œ7|                     dd¦  «        rdnd}|                     dd¦  «        }|                     d¦  «        }	d||d	         ||d
         |d         |d         |d         |d         |d         |f
z  }
|	r|
d|	z  z  }
n# t          $ r Y dS w xY w|
D ]}|                     ¦   «         s|dvr dS Œ|
S )Nr!  ÚenFr]   ÚDrr  Úbcastz#%3u %s %s %s %s %s %s %s %s
    %s
rT  rš  r¡  r¢  r£  r¤  r¥  z    %s
rh   z	/.:[] \%
)Úfieldsr¬   r«   rD  rœ  )r4  r›   rï  Ú	formattedrT  rn   r&  ÚenFlagr�  r©  r   rú  s               r   r]  zIfstatsSummary.summaryS  sh  € Øˆ	ð	àœ×(Ò(Ñ*Ô*ð &ð &�Ø!Ÿš d¨CÑ0Ô0�Ø˜C’<�<Ø�C�Càœ+ dÔ+¨eÑ3�CØ"%�	˜$‘�Ø%ŸMšM¨$°Ñ6Ô6Ð?�S�S¸CˆFØ—m’m F¨CÑ0Ô0ˆGØ—M’M 'Ñ*Ô*ˆEà8ØØ˜fÔ%ØØ˜gÔ&Ø˜d”OØ˜d”OØ˜gÔ&Ø˜d”OØ˜d”OØð	ñ
ˆAð ð (Ø�Z %Ñ'Ñ'�øøÝð 	ð 	ð 	à�2�2ð	øøøð ð 	ð 	ˆAØ—9’9‘;”;ð  1¨LÐ#8Ð#8Ø�r�røØˆs   „CC Ã
C+Ã*C+N)r<  r=  r>  r?  r  r  rª  r]  r   r   r   rŸ  rŸ  C  sX   € € € € € Ø:Ð:ð€Fð €Eà!ØØØØØØðð €Fð%ð %ð %ð %ð %r   rŸ  )ÚOrderedDictc                   ó8   — e Zd ZdZd	d„Zd„ Zd„ Zd„ Zd„ Zd„ Z	dS )
r­  zBA stupid simple implementation in order to be back-portable to 2.6Nc                 ój   — t                                | ¦  «         g | _        |r|D ]\  }}|| |<   Œd S d S r�   )Údictr5  Ú_OrderedDict__keys)r4  ré  ÚkÚvs       r   r5  zOrderedDict.__init__„  sU   € Ý�MŠM˜$ÑÔÐØˆDŒKØð  Ø#ð  ð  ‘F�Q˜Ø�D˜‘G�Gð ð  ð ð  r   c                 ór   — t                                | ||¦  «         | j                             |¦  «         d S r�   )r°  Ú__setitem__r±  rt   )r4  rµ   Úvals      r   rµ  zOrderedDict.__setitem__‹  s6   € Ý×Ò˜T 3¨Ñ,Ô,Ð,ØŒK×Ò˜sÑ#Ô#Ð#Ð#Ð#r   c                 óp   — t                                | |¦  «         | j                             |¦  «         d S r�   )r°  Ú__delitem__r±  Úremove©r4  rµ   s     r   r¸  zOrderedDict.__delitem__�  s4   € Ý×Ò˜T 3Ñ'Ô'Ð'ØŒK×Ò˜sÑ#Ô#Ð#Ð#Ð#r   c                 ó   — | j         S r�   ©r±  rÁ  s    r   r¬   zOrderedDict.keys“  s
   € Ø”;Ðr   c                 óD   ‡ — t          ˆ fd„‰ j        D ¦   «         ¦  «        S )Nc                 ó$   •— g | ]}|‰|         f‘ŒS r   r   )r�  r²  r4  s     €r   r’  z%OrderedDict.items.<locals>.<listcomp>—  s!   ø€ Ð<Ð<Ð<¨1˜1˜d 1œg˜,Ð<Ð<Ð<r   )Útupler±  rÁ  s   `r   ré  zOrderedDict.items–  s(   ø€ ÝÐ<Ð<Ð<Ð<°´Ð<Ñ<Ô<Ñ=Ô=Ð=r   c              #   ó&   K  — | j         D ]}|V — Œd S r�   r¼  rº  s     r   Ú__iter__zOrderedDict.__iter__™  s,   è è € Ø”{ð ð �Ø�	�	�	�	ðð r   r�   )
r<  r=  r>  r?  r5  rµ  r¸  r¬   ré  rÁ  r   r   r   r­  r­  ~  sy   € € € € € ØLÐLð
	 ð 	 ð 	 ð 	 ð	$ð 	$ð 	$ð	$ð 	$ð 	$ð	ð 	ð 	ð	>ð 	>ð 	>ð	ð 	ð 	ð 	ð 	r   r­  c                 ó  — t          | t          ¦  «        sdS | dk    st          |t          t          f¦  «        s| ddfS | |k    r| t          | |z  |¦  «        dfS |r| t	          || z  |¦  «        d         dfS | t          || z  |¦  «        dfS )a  Given a number of packets and a duration (s) return a tuple.

    return the packet quantity, and a two part rate in packets/seconds
    or seconds/packet. On error the latter fields should be blank, the
    first the number of packets if zero otherwise unhelpful text.)ú???rh   rh   r   rh   zp/sr   z/pzs/p)r"  rc   rˆ   rè   Ú	periodize)ÚpacketsÚperiodÚ
clipdigitsÚ
periodizeds       r   Ú	packetizerÉ  ž  s°   € õ �g�sÑ#Ô#ð ØˆØ�!‚|€|�: f­sµE¨lÑ;Ô;€|Ø˜˜RÐ Ð Ø�ÒÐØ�˜w¨Ñ/°Ñ<Ô<¸eÐDÐDØð KØ� 6¨GÑ#3°ZÑ@Ô@ÀÔCÀTÐJÐJØ•U˜6 GÑ+¨ZÑ8Ô8¸%Ð@Ð@r   c                 ó.  — t          |t          t          f¦  «        r|nd}t          | t          t          f¦  «        sdS d}t          | |¦  «        }|dk     rt          |¦  «        n|}|dk    r|d|dz  z  z  }|d|dz  dz  |dz  d	z  |d	z  fz  z  }||fS )
z}Given a number of seconds, return number and pretty string.

    On error return None for the number and an unhelpful string.r   )NrÃ  rh   r   rf  z%dD z%02d:%02d:%02di  r  )r"  rc   rˆ   rè   )rÆ  rÇ  ÚcliprU  r…  Únperiods         r   rÄ  rÄ  ¯  sÈ   € õ $ Jµµe°Ñ=Ô=ÐDˆ:ˆ:À1€DÝ�f�s¥E˜lÑ+Ô+ð Øˆ}Ø€FÝˆf�dÑÔ€AØ˜qš˜�c�!‰fŒfˆf a€GØ�%ÒÐØ�&˜G uÑ,Ñ-Ñ-ˆØ
ÐØ	�5‰˜TÑ!Ø	�4‰˜BÑØ�"‰ð"ñ ñ €Fð
 �VÐÐr   c                 ó,   — t          | ¦  «        d         S )Nr   )rÄ  )r6  s    r   r<  r<  Ã  s   € •9˜Q‘<”< ”?€ r   )Nr	   F)FrÄ  )r   F)r   )_r?  Ú
__future__r   r   Úcollectionsr^  rB  ra  rE  r˜   r   rH   Úntp.ntpcrj   Ú	ntp.magicÚntp.controlÚOLD_CTL_PST_CONFIGÚOLD_CTL_PST_AUTHENABLEÚOLD_CTL_PST_AUTHENTICÚOLD_CTL_PST_REACHr¨  r©  r§  rª  r«  r¬  rí  r#   r®   rÿ   ÚUNIT_KSr!   ÚUNIT_PPTÚUNIT_PPBr  r%   r$   r¸   r   r   rþ   r   r  rO   rY   r[   rG   ro   rl   r{   r…   r�   r¦   r¶   r»   rÂ   rÈ   rÍ   r©   r­   rÞ   r¨   r    rø   rà   rü   r	  r  r'  r)  r-  r/  rA  Ú	AF_UNSPECrW  Ú
namedtuplerX  ra   r`  re  rg  rc  rp  rr  rû  rý  rc  r‰  rŸ  r­  ÚImportErrorr°  rÉ  rÄ  Úuptimer   r   r   ú<module>rÞ     sV  ðà Ð ð 0Ð /Ð /Ð /Ð /Ð /Ð /Ð /ð Ð Ð Ð Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø €€€Ø €€€Ø 
€
€
€
Ø €€€Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð ð Ð ØÐ ØÐ ØÐ ØÐ ØÐ àÐ ØÐ ØÐ ØÐ ð €Ø
€Ø
€Ø	€Ø
€Ø•g˜w¨°Ð8€	Ø€Ø€Ø€Ø€Ø�x ­8Ð4€	Ø˜Ð#€
ðð ð ðð ð ð" 
€ð'€ð
 '€ðð ð ð
ð 
ð 
ð!ð !ð !ð
	ð 	ð 	ðð ð ðð ð ð0ð 0ð 0ð
"ð "ð "ðAð Að AðHð ð ðð ð ðDð ð ð	ð 	ð 	ð$ð $ð $ð
ð 
ð 
ðð ð ð ð  ð  ðFð ð ð!"ð !"ð !"ðHð ð ð<ð ð ðð ð ðð ð ð 
=ð 
=ð 
=ð 
=ðð ð ð ð<#ð #ð #ðLð ð ðBð ð ð5ð 5ð 5ð 5ð 5ñ 5ô 5ð 5ð0 ˜™œÐ ð %+Ô$4ð ð ð ð ð8 "ˆ;Ô! *¨w¸Ð.AÑBÔB€ð ˆ%€<€<Ø€L€L€LØ€N€N€NØ€M€M€Mðð ð ð0J!ð J!ð J!ð J!ð J!ñ J!ô J!ð J!ðZXð Xð Xð XðvYð Yð Yð Yð Yñ Yô Yð Yðx
Xð Xð Xð Xð Xñ Xô Xð Xðv%ð %ð %ð %ð %ñ %ô %ð %ðP5ð 5ð 5ð 5ð 5ñ 5ô 5ð 5ðp Ø'Ð'Ð'Ð'Ð'Ð'Ð'øØð ð ð ðð ð ð ð �dñ ô ð ð ð ðøøøðBAð Að Að Að"ð ð ð ð( 
#Ð	"€€€s   Å'E. Å.FÆF