
    Q?hV              	          S r SrSrSr/ SQr/ SQrSr\R                  5       R                  5       r	\R                  5       rSr
\
R                  5       R                  5       r\
R                  5       r
SS	KrSS	KrSS	KrS
SKJr  \" \S5      (       a  \\\R(                  4rO\\4r\R,                  " S\R.                  \R0                  -  5      r\R,                  " S5      rS rS rS rS rS r " S S\ 5      r! " S S5      r"S r#S r$S r%S r&S r'\#" 5       r(\"r)\)" S5      r*Sr+ " S S \"5      r,\-S!:X  Ga  \"" 5       r.\/" S"5        \/" S#\.< S$\.Ra                  5       < S%\.Rc                  5       < 35        \.S
-
  r2\/" S&\2Ra                  5       < S%\2Rc                  5       < 35        \.S
-   r3\/" S'\3Ra                  5       < S%\3Rc                  5       < 35        \/" S(\3\2-
  -  5        \/" \.Ri                  S)5      5        \/" \.Ri                  S*5      5        \/" \.Ri                  S+5      5        \/" \.Ri                  S,5      5        \/" \.Ri                  S-5      5        \/" \.Ri                  S.5      5        \/" \.Ri                  S/5      5        \/" \.Ri                  S05      5        \," S15      r5\/" S2\5S3\5Rm                  5       5        g	g	)4z3.3.18zXJeff Bauer's lightweight date class, extended by us.  Predates Python's datetime module.i|i$- )      r      r   r   r   r   r   r   r   r   )r      r   r   r   r   r   r   r   r   r   r   z8Monday Tuesday Wednesday Thursday Friday Saturday SundayzeJanuary February March April May June
                July August September October November December    N   )isStrstruct_timez\{(m{1,5}|yyyy|yy|d{1,4})\}z(\d\d\d\d|\d\d)-(\d\d)-(\d\d)c                      [         $ N)_monthNameLower     J/var/www/html/env/lib/python3.13/site-packages/reportlab/lib/normalDate.pygetStdMonthNamesr   '   s    r   c                  F    [        5        V s/ s H  o S S PM	     sn $ s  sn f N   )r   xs    r   getStdShortMonthNamesr   *   s#    +-.-abqE-...   c                      [         $ r   )_dayOfWeekNameLowerr   r   r   getStdDayNamesr   -   s    r   c                  F    [        5        V s/ s H  o S S PM	     sn $ s  sn f r   )r   r   s    r   getStdShortDayNamesr   0   s#    )+,+abqE+,,,r   c                 d    U S:  a  U S-  (       a  ggU S-  S:w  a  gU S-  S:w  a  gU S-  S:w  a  gg)z@determine if specified year is leap year, returns Python boolean@     r   r   d     r   years    r   
isLeapYearr$   3   sC    d{!8	Q	q	qr   c                       \ rS rSrSrSrg)NormalDateExceptionC   zException class for NormalDater   N)__name__
__module____qualname____firstlineno____doc____static_attributes__r   r   r   r&   r&   C   s    (r   r&   c                      \ rS rSrSrS?S jrS rS rS rS r	S	 r
S
 rS rS rS rS rS rS r\S 5       rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S  r"S! r#S" r$S# r%S$ r&S% r'S& r(S' r)S( r*S) r+S* r,S+ r-S, r.S- r/S. r0\S/ 5       r1S0 r2S1 r3S2 r4S3 r5S4 r6S5 r7S6 r8S7 r9S8 r:S9 r;\:r<S: r=S; r>S< r?S= r@S>rAg)@
NormalDateG   a  
NormalDate is a specialized class to handle dates without
all the excess baggage (time zones, daylight savings, leap
seconds, etc.) of other date structures.  The minimalist
strategy greatly simplifies its implementation and use.

Internally, NormalDate is stored as an integer with values
in a discontinuous range of -99990101 to 99991231.  The
integer value is used principally for storage and to simplify
the user interface.  Internal calculations are performed by
a scalar based on Jan 1, 1900.

Valid NormalDate ranges include (-9999,1,1) B.C.E. through
(9999,12,31) C.E./A.D.


1.0
    No changes, except the version number.  After 3 years of use by
    various parties I think we can consider it stable.

0.8
    Added Prof. Stephen Walton's suggestion for a range method
     - module author resisted the temptation to use lambda <0.5 wink>

0.7
    Added Dan Winkler's suggestions for __add__, __sub__ methods

0.6
    Modifications suggested by Kevin Digweed to fix:
     - dayOfWeek, dayOfWeekAbbrev, clone methods
     - Permit NormalDate to be a better behaved superclass

0.5
    Minor tweaking

0.4
     - Added methods __cmp__, __hash__
     - Added Epoch variable, scoped to the module
     - Added setDay, setMonth, setYear methods

0.3
    Minor touch-ups

0.2
     - Fixed bug for certain B.C.E leap years
     - Added Jim Fulton's suggestions for short alias class name =ND
       and __getstate__, __setstate__ methods

Special thanks:  Roedy Green
Nc                     Uc9  U R                  [        R                  " [        R                  " 5       5      5        gU R                  U5        g)aI  
Accept 1 of 4 values to initialize a NormalDate:
    1. None - creates a NormalDate for the current day
    2. integer in yyyymmdd format
    3. string in yyyymmdd format
    4. tuple in (yyyy, mm, dd) - localtime/gmtime can also be used
    5. string iso date format see _iso_re above
    6. datetime.datetime or datetime.date
N)setNormalDatetime	localtimeself
normalDates     r   __init__NormalDate.__init__z   s5     t~~diik:;z*r   c                     [        U[        5      (       d  [        S5      eU R                  U R	                  5       U-   5        g)3add days to date; use negative integers to subtractz)add method parameter must be integer typeN
isinstanceintr&   	normalizescalarr6   dayss     r   addNormalDate.add   s6    $s##%;= =t{{}t+,r   c                     [        U[        5      (       d  [        S5      eU R                  5       nUR	                  U5        U$ )z<add integer to normalDate and return a new, calculated valuez&__add__ parameter must be integer typer=   r>   r&   clonerC   r6   rB   cloneds      r   __add__NormalDate.__add__   s;    $s##%8: :

4r   c                 $    U R                  U5      $ )zfor completeness)rJ   rA   s     r   __radd__NormalDate.__radd__   s    ||D!!r   c                 8    U R                  U R                  5      $ )z+return a cloned instance of this normalDate)	__class__r7   r6   s    r   rG   NormalDate.clone   s    ~~doo..r   c                 X    [        US5      (       d  gU R                  UR                  :  $ Nr7   Fhasattrr7   r6   others     r   __lt__NormalDate.__lt__   s'    u\**!1!111r   c                 X    [        US5      (       d  gU R                  UR                  :*  $ rT   rU   rW   s     r   __le__NormalDate.__le__   '    u\**%"2"222r   c                 X    [        US5      (       d  gU R                  UR                  :H  $ rT   rU   rW   s     r   __eq__NormalDate.__eq__   r^   r   c                 X    [        US5      (       d  gU R                  UR                  :g  $ Nr7   TrU   rW   s     r   __ne__NormalDate.__ne__   '    u\**%"2"222r   c                 X    [        US5      (       d  gU R                  UR                  :  $ rc   rU   rW   s     r   __ge__NormalDate.__ge__   rf   r   c                 X    [        US5      (       d  gU R                  UR                  :  $ rc   rU   rW   s     r   __gt__NormalDate.__gt__   s'    u\**!1!111r   c                 D    [        [        U R                  5      SS 5      $ )zreturn the day as integer 1-31Nr>   reprr7   rQ   s    r   dayNormalDate.day   s    4(-..r   c                 .    [        U R                  5       6 $ );return integer representing day of week, Mon=0, Tue=1, etc.)	dayOfWeektoTuplerQ   s    r   ru   NormalDate.dayOfWeek   s    $,,.))r   c                 $    [        U S[        5      $ )N_dayOfWeekName)getattrry   rQ   s    r   __day_of_week_name__NormalDate.__day_of_week_name__   s    t,^<<r   c                 B    U R                   U R                  5          SS $ )z@return day of week abbreviation for current date: Mon, Tue, etc.Nr   r{   ru   rQ   s    r   dayOfWeekAbbrevNormalDate.dayOfWeekAbbrev   s!    (()9:2A>>r   c                 <    U R                   U R                  5          $ )z?return day of week name for current date: Monday, Tuesday, etc.r~   rQ   s    r   dayOfWeekNameNormalDate.dayOfWeekName   s    (()9::r   c                     U R                  5       (       a  [        nO[        nSn[        U R	                  5       S-
  5       H
  nX!U   -   nM     U R                  5       U-   $ )zday of yearr   r   )r$   _daysInMonthLeapYear_daysInMonthNormalrangemonthrq   )r6   daysByMonthpriorMonthDaysms       r   	dayOfYearNormalDate.dayOfYear   sU    ??.K,Ktzz|a'(A+!n<N )xxzN**r   c                     [        U[        5      (       a!  U R                  5       UR                  5       -
  $ U R                  5       [        U5      R                  5       -
  $ )zH
return value may be negative, since calculation is
self.scalar() - arg
)r=   r/   r@   r5   s     r   daysBetweenDatesNormalDate.daysBetweenDates   sJ    
 j,,;;=:#4#4#666;;=:j#9#@#@#BBBr   c                     [        U[        5      (       a*  Uc  U R                  S L $ U R                  UR                  :H  $ gNr   )r=   r/   r7   )r6   targets     r   equalsNormalDate.equals   s;    fZ((~$..&*;*;;;r   c                 z    U R                  U R                  5       SS [        U R                  5       5      -   5      $ )z"returns (cloned) last day of monthrn   )rP   __repr__strlastDayOfMonthrQ   s    r   
endOfMonthNormalDate.endOfMonth   s1    ~~dmmob4S9L9L9N5OOPPr   c                 L    U R                  U R                  5       SS S-   5      $ )z#returns (cloned) first day of monthr   rn   01)rP   r   rQ   s    r   firstDayOfMonthNormalDate.firstDayOfMonth   s#    ~~dmmob4T9::r   c                 N    U R                  5       nUSS < SUSS < SUSS < 3$ )z3return date as string in common US format: MM/DD/YYrn   /Nir   r6   ds     r   formatUSNormalDate.formatUS   ,    MMOr"XqvqBx88r   c                 N    U R                  5       nUSS < SUSS < SUSS < 3$ )z;return date as string in 4-digit year US format: MM/DD/YYYYr   rn   r   Nr   r   r   s     r   formatUSCenturyNormalDate.formatUSCentury   r   r   c                 4    [        U R                  5       5      $ r   )r   r   rQ   s    r   _fmtMNormalDate._fmtM  s    4::<  r   c                 (    SU R                  5       -  $ N%02d)r   rQ   s    r   _fmtMMNormalDate._fmtMM  s    

$$r   c                 "    U R                  5       $ r   )monthAbbrevrQ   s    r   _fmtMMMNormalDate._fmtMMM	  s    !!r   c                 "    U R                  5       $ r   	monthNamerQ   s    r   _fmtMMMMNormalDate._fmtMMMM  s    ~~r   c                 (    U R                  5       S   $ r   r   rQ   s    r   	_fmtMMMMMNormalDate._fmtMMMMM  s    ~~""r   c                 4    [        U R                  5       5      $ r   )r   rq   rQ   s    r   _fmtDNormalDate._fmtD  s    488:r   c                 (    SU R                  5       -  $ r   )rq   rQ   s    r   _fmtDDNormalDate._fmtDD  s    
""r   c                 "    U R                  5       $ r   )r   rQ   s    r   _fmtDDDNormalDate._fmtDDD  s    ##%%r   c                 "    U R                  5       $ r   )r   rQ   s    r   _fmtDDDDNormalDate._fmtDDDD  s    !!##r   c                 .    SU R                  5       S-  -  $ )Nr   r    r"   rQ   s    r   _fmtYYNormalDate._fmtYY  s    S))r   c                 4    [        U R                  5       5      $ r   )r   r#   rQ   s    r   _fmtYYYYNormalDate._fmtYYYY!  s    499;r   c                    USS nSn [         R                  X#5      nU(       aa  [        U SUR                  5       SS R	                  5       -   5      " 5       nUR                  5       u  pgUSU U-   X'S -   nU[        U5      -   nOU$ M  )aq  format like MS date using the notation
{YY}    --> 2 digit year
{YYYY}  --> 4 digit year
{M}     --> month as digit
{MM}    --> 2 digit month
{MMM}   --> abbreviated month name
{MMMM}  --> monthname
{MMMMM} --> first character of monthname
{D}     --> day of month as digit
{DD}    --> 2 digit day of month
{DDD}   --> abrreviated weekday name
{DDDD}  --> weekday name
Nr   r   _fmt)_fmtPatsearchrz   groupupperspanlen)r6   fmtrfr   yijs           r   formatMSNormalDate.formatMS$  s     Fq#AD1R)>)>)@!ABDvvxqVaZ1R5(AJ r   c                     U R                   $ )z(minimize persistent storage requirementsr7   rQ   s    r   __getstate__NormalDate.__getstate__>  s    r   c                 ,    [        U R                  5      $ r   )hashr7   rQ   s    r   __hash__NormalDate.__hash__B  s    DOO$$r   c                     U R                   $ r   r   rQ   s    r   __int__NormalDate.__int__E  s    r   c                 4    [        U R                  5       5      $ )zK
determine if specified year is leap year, returning true (1) or
false (0)
)r$   r#   rQ   s    r   r$   NormalDate.isLeapYearH  s    
 $))+&&r   c                    [        U[        5      (       d  g[        [        U5      5      S:  a  gUS:  a  SU-  nOSU-  n[        U5      S:  a  g[        U5      S:X  a  US   S:w  a
  US   S:w  a  g[        USS	 5      nUS
:  d  US:  d  US:X  a  g[        US	S 5      nUS:  d  US:  a  g[	        U5      (       a  [
        US-
     nO[        US-
     n[        USS 5      nUS:  d  Xe:  a  gUS:X  a  US:X  a  US:  a  US:  a  gg)z.checks for date validity in [-]yyyymmdd formatr   	   %09d%08d   -+Nr   '  rn   r      .  
   r      )r=   r>   r   rp   r$   r   r   )r6   r7   dateStrr#   r   maxDayrq   s          r   _isValidNormalDateNormalDate._isValidNormalDateO  s!   *S))tJ 1$>z)Gz)Gw<!\Q
c!gajC&773B< %<4$;$!)GBrN#19
d)%!)4F'	2F'"#,7cl4<ERKC!Gbr   c                     U R                  5       (       a  [        U R                  5       S-
     $ [        U R                  5       S-
     $ )z.returns last day of the month as integer 28-31r   )r$   r   r   r   rQ   s    r   r   NormalDate.lastDayOfMontho  s;    ??'

q(899%djjlQ&677r   c                 "    U R                  5       $ )z8override this method to use your preferred locale format)r   rQ   s    r   localeFormatNormalDate.localeFormatv  s    }}r   c                 D    [        [        U R                  5      SS 5      $ )zreturns month as integer 1-12r   rn   ro   rQ   s    r   r   NormalDate.monthz  s    4(B/00r   c                 $    [        U S[        5      $ )N
_monthName)rz   r
  rQ   s    r   __month_name__NormalDate.__month_name__~  s    tL44r   c                 H    U R                   U R                  5       S-
     SS $ )z@returns month as a 3-character abbreviation, i.e. Jan, Feb, etc.r   Nr   r  r   rQ   s    r   r   NormalDate.monthAbbrev  s%    ""4::<!#34Ra88r   c                 B    U R                   U R                  5       S-
     $ )z0returns month name, i.e. January, February, etc.r   r  rQ   s    r   r   NormalDate.monthName  s    ""4::<!#344r   c                 (   U[         :  a  S[         -  n[        U5      eU[        :  a  S[        -  n[        U5      eSSKJn  US:  a  S[        U" US-   S-  5      5      -   nO;US	:  a  S
[        U" US-   S-  5      5      -   nOS[        U" US-   S-  5      5      -   nU[        U5      -
  S-   nUS::  a  US-
  nU[        U5      -
  S-   nSn[        U5      (       a  US-   nXV:  a  US-   nU[        U5      -
  S-   nUS:  a  US::  a  US-   n[        U5      (       a  [        nO[        nSnSn	[        [        U5      5       H  n
XU
   -   nX:  d  M  U
S-   n	  O   Sn[        U	S-
  5       H
  n
XU
   -   nM     X[-
  nU R                  XIU45        g)zconvert scalar to normalDatez#normalize(%d): scalar below minimumz%normalize(%d): scalar exceeds maximumr   )flooril;r   i g{Gv@ijr   i
 r   i
 r   m  i;r   r   N)_bigBangScalarr&   _bigCrunchScalarmathr  r>   firstDayOfYearr$   r   r   r   r   r2   )r6   r@   msgr  r#   rB   
daysInYearr   dcr   r   r   rq   s                r   r?   NormalDate.normalize  s   N"7 !C%c**$$9"#C%c**W#eVf_$@ABBDws5&6/X!=>??DE6F?h">?@@Dt,,q019!8DN40014D
d#aJ!8DN40014Dg&G"3"9Dd.K,Ks;'(A!n$BzA	 ) uqy!A+!n<N "#D-.r   c                     [        U[        5      (       d  X-
  n/ n[        U5       H  nUR                  X-   5        M     U$ )zPReturn a range of normalDates as a list.  Parameter
may be an int or normalDate.)r=   r>   r   append)r6   rB   r   r   s       r   r   NormalDate.range  s>     $s##;DtAHHTX r   c                 ^    U R                   S:  a  SU R                   -  $ SU R                   -  $ )zprint format: [-]yyyymmddr   r   r   r   rQ   s    r   r   NormalDate.__repr__  s.    
 ??QDOO++DOO++r   c                 8   U R                  5       u  pn[        U5      U-   S-
  nU R                  5       (       a"  [        US-
  5       H  nU[        U   -   nM     O![        US-
  5       H  nU[
        U   -   nM     US:X  a  US:  d  US:X  a  US:  a  US-
  nU$ )z%days since baseline date: Jan 1, 1900r   r   r   r   )rv   r  r$   r   r   r   )r6   r#   r   rq   rB   r   s         r   r@   NormalDate.scalar  s    !\\^cd#c)A-??519%2155 & 519%033 &4<rzerkcAgbyr   c                     U R                  5       nUS:  d  X:  a  SU-  n[        U5      eU R                  5       u  pEnU R                  XEU45        g)zset the day of the monthr   zday is outside of range 1 to %dN)r   r&   rv   r2   )r6   rq   r   r  r   r   r   s          r   setDayNormalDate.setDay  sQ    $$&7cl3f<C%c**LLN	qA#;'r   c                 ~    US:  d  US:  a  [        S5      eU R                  5       u  p#nU R                  X!U45        g)zset the month [1-12]r   r   zmonth is outside range 1 to 12Nr&   rv   r2   )r6   r   r   r   r   s        r   setMonthNormalDate.setMonth  s<    19
%&FGGLLN	qAa=)r   c                 `   [        U[        5      (       a  Xl        O[        U5      (       a   [        U5      U l        O[        U[        5      (       a  [        SUSS -  5      U l        O[        U[        5      (       a  UR                  U l        Oh[        U[        R                  [        R                  45      (       a2  UR                  S-  UR                  -   S-  UR                   -   U l        OSU l        U R#                  U R                  5      (       d  [        S[        U5      -  5      eg!   [        R                  U5      nU(       aF  U R                  UR                  S5      UR                  S5      -   UR                  S5      -   5         N[        S[        U5      -  5      e= f)zR
accepts date as scalar string/integer (yyyymmdd) or tuple
(year, month, day, ...)r      r   zunable to setNormalDate(%s)z%04d%02d%02dNr    )r=   r>   r7   r   _iso_rematchr2   r   r&   rp   _DateSeqTypesr/   datetimedater#   r   rq   r   )r6   r7   r   s      r   r2   NormalDate.setNormalDate  sN    j%%(O:`"%j/ 
=11!.:bq>"ABDO
:..(33DO
H$5$5hmm#DEE)s2:3C3CCSHWDO"DO&&t77%&Cd:FV&VWW 8`MM*-&&qwwqz!''!*'<QWWQZ'GH-.KdS]N^.^__s   D2 2A"F-F-c                     US:X  a  [        S5      eUS:  a  [        S5      eUS:  a  [        S5      eU R                  5       u  p#nU R                  XU45        g )Nr   zcannot set year to zeror   zyear cannot be less than -9999r   z year cannot be greater than 9999r(  )r6   r#   r   r   r   s        r   setYearNormalDate.setYear  s\    19%&?@@E\%&FGGD[%&HIILLN	qDQ<(r   c                     [        U[        5      (       a  U R                  U* 5      $ U R                  5       UR                  5       -
  $ r   r=   r>   rJ   r@   r6   vs     r   __sub__NormalDate.__sub__  s7    a<<##{{}qxxz))r   c                     [        U[        5      (       a  [        U5      U -
  $ UR                  5       U R                  5       -
  $ r   )r=   r>   r/   r@   r8  s     r   __rsub__NormalDate.__rsub__  s5    aa=4''88:--r   c                 `    U R                  5       U R                  5       U R                  5       4$ )z'return date as (year, month, day) tuple)r#   r   rq   rQ   s    r   rv   NormalDate.toTuple  s!    		TZZ\488:66r   c                 D    [        [        U R                  5      SS 5      $ )z9return year in yyyy format, negative values indicate B.C.Nr   ro   rQ   s    r   r#   NormalDate.year!  s    4("-..r   r   r   )Br(   r)   r*   r+   r,   r8   rC   rJ   rM   rG   rY   r\   r`   rd   rh   rk   rq   ru   propertyr{   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?   r   r   r@   r%  r)  r2   r4  __setstate__r:  r=  rv   r#   r-   r   r   r   r/   r/   G   sT   1d+-"/2
3
3
3
3
2
/* = =?;	+CQ;9
9
!%" ##&$* 4%'@81 5 595-/^,(*X4) !L*
.7/r   r/   c                      [        S5      $ )z%return lower boundary as a NormalDate)r   r   r   r/   r   r   r   bigBangrG  '  s    m$$r   c                      [        S5      $ )z%return upper boundary as a NormalDate)r   r   r   rF  r   r   r   	bigCrunchrI  +  s    n%%r   c                     US:X  d  US:X  a
  US-   nU S-
  n USU-  -   SUS-   -  S-  -   U -   U S-  -   U S-  -
  U S-  -   S	-  $ )
rt   r   r,  r   r      r   r    r!      r   )r   r   r   s      r   ru   ru   /  se    AvaFE!Ga1gqj 1$q!t+af4q#v=BBr   c                 z   [        U [        5      (       d  S[        U 5      -  n[        U5      eU S:X  a  [        S5      eU S:  a  U S-  [        U S-
  S-  5      -   S-
  nU$ [        U S-   S-  5      nU S	:  a,  U[        U S
-   S	-
  S-  5      -
  [        U S-   S	-
  S-  5      -   nU S-  U-   S-
  nU S:  a  US-
  nU$ )z@number of days to the first of the year, relative to Jan 1, 1900z)firstDayOfYear() expected integer, got %sr   z$first day of year cannot be zero (0)r  r   r   i\
 r   r   c   r    i  r!   i˖
 r   r   )r=   r>   typer&   )r#   r  firstDay
leapAdjusts       r   r  r  6  s    d39DJF!#&&qy!"HII	3J#tax1n"55> O $(a(
$;#c4"9t+;s*B&CCdSj4/3678J#:
*V3$;"}HOr   c                 X    [        U [        5      =(       a    U =(       d    [        U 5      $ )zconvert to ND if required)r=   r/   ND)r   s    r   FNDrT  I  s    a
#)2RU2r   ih io;c                   N    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rSrg)BusinessDateiR  z
Specialised NormalDate
c                     [        U[        5      (       d  [        S5      eU R                  U R	                  5       U-   5        g)r;   z$add method parameter must be integerNr<   rA   s     r   rC   BusinessDate.addV  s2    $s##%&LMMt{{}t+,r   c                     [        U[        5      (       d  [        S5      eU R                  5       nUR	                  U5        U$ )z>add integer to BusinessDate and return a new, calculated valuez!__add__ parameter must be integerrF   rH   s      r   rJ   BusinessDate.__add__\  s7    $s##%&IJJ

4r   c                     [        U[        5      =(       a    U R                  U* 5      =(       d!    U R                  5       UR                  5       -
  $ r   r7  r8  s     r   r:  BusinessDate.__sub__d  s5    !C 5T\\1"%5S9SSr   c                 ,    [        U R                  5      $ r   )rS  r7   rQ   s    r   asNormalDateBusinessDate.asNormalDateg  s    $//""r   c                 8    U R                   R                  U5      $ r   )r^  r   r5   s     r   r   BusinessDate.daysBetweenDatesj  s      11*==r   c                 \    U R                  5       S:  a  [        SU R                  -  5      eg )Nr   z%r isn't a business day)ru   r&   r7   rQ   s    r   	_checkDOWBusinessDate._checkDOWm  s,    >>A%89RUYUdUd9d%eer   c                 j    [        U5      n[        R                  XS-  S-  US-  -   [        -   5        g NrK  rL  )r>   r/   r?   BDEpochScalar)r6   r   s     r   r?   BusinessDate.normalizep  s.    FTa4(1Q3,}"<=r   c                 P    U R                  5       nU[        -
  nSUS-  -  US-  -   $ rf  )r^  BDEpoch)r6   r   r   s      r   r@   BusinessDate.scalart  s/    K!Q$x!A#~r   c                 N    [         R                  X5        U R                  5         g r   )r/   r2   rc  r5   s     r   r2   BusinessDate.setNormalDatez  s      1r   r   N)r(   r)   r*   r+   r,   rC   rJ   r:  r^  r   rc  r?   r@   r2   r-   r   r   r   rV  rV  R  s6    -T#>f>r   rV  __main__zNormalDate test:z	  Today (z) is:  z  Yesterday was: z  Tomorrow will be: z)  Days between tomorrow and yesterday: %dz{d}/{m}/{yy}z{dd}/{m}/{yy}z{ddd} {d}/{m}/{yy}z{dddd} {d}/{m}/{yy}z{d}/{mm}/{yy}z{d}/{mmm}/{yy}z{d}/{mmmm}/{yy}z{d}/{m}/{yyyy}20010116zb=z
b.scalar())7__version__r,   r  r  r   r   ry   lowersplitr   r
  r   rer3   r0  utilsr   rV   listtupler	   r/  compile	MULTILINE
IGNORECASEr   r-  r   r   r   r   r$   	Exceptionr&   r/   rG  rI  ru   r  rT  EpochrS  rj  rg  rV  r(   todayprintr   r  	yesterdaytomorrowr   br@   r   r   r   <module>r     s   b : < O$**,224 %%'C
""$**,
   
4% 0 01M%LM
**4R\\"--5O
P
**5
6/- 	) 	\/ \/@%&C&3 i
8*: *X zLE	
	eU-B-B-DeFXFXFZ
[\	I	i&?&?&A9CYCYC[
\]qyH	)A)A)CXEZEZE\
]^	
5I9M
NO	%..
()	%..
)*	%..-
./	%...
/0	%..
)*	%..)
*+	%..*
+,	%..)
*+Z A	$qqxxz*% r   