
    Ѯh                      N    d Z 	 ddlmZ  G d de      Zy# e$ r	 ddlmZ Y w xY w)zpasslib.utils.compat._ordered_dict -- backport of collections.OrderedDict for py26

taken from stdlib-suggested recipe at http://code.activestate.com/recipes/576693/

this should be imported from passlib.utils.compat.OrderedDict, not here.
    )	get_identc                       e Zd ZdZd Zej                  fdZej                  fdZd Zd Z	d Z
ddZd	 Zd
 Zd Zd Zd Zd Zd ZeZ e       ZefdZddZi fdZd Zd Zedd       Zd Zd Zy)OrderedDictz)Dictionary that remembers insertion orderc                     t        |      dkD  rt        dt        |      z        	 | j                    | j
                  |i | y# t        $ r g x| _        }||dg|dd i | _        Y 6w xY w)zInitialize an ordered dictionary.  Signature is the same as for
        regular dictionaries, but keyword arguments are not recommended
        because their insertion order is arbitrary.

           z$expected at most 1 arguments, got %dN)len	TypeError_OrderedDict__rootAttributeError_OrderedDict__map_OrderedDict__update)selfargskwdsroots       t/home/www/academy-backend.kofcorporation.com/venv/lib/python3.12/site-packages/passlib/utils/compat/_ordered_dict.py__init__zOrderedDict.__init__   sy     t9q=BSYNOO	KK
 	t$t$	  	!##DK$T4(DGDJ	s   A !A*)A*c                 z    || vr-| j                   }|d   }|||gx|d<   x|d<   | j                  |<    || ||       y)z!od.__setitem__(i, y) <==> od[i]=yr   r   N)r
   r   )r   keyvaluedict_setitemr   lasts         r   __setitem__zOrderedDict.__setitem__)   sO     d?;;D7D37s2CCDGCd1g

3T3&    c                 h     || |       | j                   j                  |      \  }}}||d<   ||d<   y)z od.__delitem__(y) <==> del od[y]r   r   N)r   pop)r   r   dict_delitem	link_prev	link_nexts        r   __delitem__zOrderedDict.__delitem__3   s9     	T3$(JJNN3$7!	9c 	! 	!r   c              #   Z   K   | j                   }|d   }||ur|d    |d   }||uryyw)zod.__iter__() <==> iter(od)r      Nr
   r   r   currs      r   __iter__zOrderedDict.__iter__<   <     {{Aw$q'M7D $   &++c              #   Z   K   | j                   }|d   }||ur|d    |d   }||uryyw)z#od.__reversed__() <==> reversed(od)r   r"   Nr#   r$   s      r   __reversed__zOrderedDict.__reversed__D   r'   r(   c                     	 | j                   j                         D ]  }|dd= 	 | j                  }||dg|dd | j                   j                          t
        j                  |        y# t        $ r Y !w xY w)z.od.clear() -> None.  Remove all items from od.N)r   
itervaluesr
   clearr   dict)r   noder   s      r   r-   zOrderedDict.clearL   su    	

--/ G;;DT4(DGJJ 	

4  		s   AA* *	A65A6c                     | st        d      | j                  }|r|d   }|d   }||d<   ||d<   n|d   }|d   }||d<   ||d<   |d   }| j                  |= t        j	                  | |      }||fS )zod.popitem() -> (k, v), return and remove a (key, value) pair.
        Pairs are returned in LIFO order if last is true or FIFO order if false.

        zdictionary is emptyr   r   r"   )KeyErrorr
   r   r.   r   )r   r   r   linkr   r   r   r   s           r   popitemzOrderedDict.popitemX   s    
 011{{7DQIIaLDG7DQIDGIaL1gJJsOs#Ezr   c                     t        |       S )zod.keys() -> list of keys in od)listr   s    r   keyszOrderedDict.keysq       Dzr   c                 2    | D cg c]  }| |   	 c}S c c}w )z#od.values() -> list of values in od r   r   s     r   valueszOrderedDict.valuesu   s    %)*cS	***s   c                 6    | D cg c]	  }|| |   f c}S c c}w )z.od.items() -> list of (key, value) pairs in odr:   r;   s     r   itemszOrderedDict.itemsy   s    ,01Sd3i 111s   c                     t        |       S )z0od.iterkeys() -> an iterator over the keys in od)iterr6   s    r   iterkeyszOrderedDict.iterkeys}   r8   r   c              #   (   K   | D ]	  }| |     yw)z2od.itervalues -> an iterator over the values in odNr:   r   ks     r   r,   zOrderedDict.itervalues   s      	Aq'M	s   c              #   ,   K   | D ]  }|| |   f  yw)z=od.iteritems -> an iterator over the (key, value) items in odNr:   rC   s     r   	iteritemszOrderedDict.iteritems   s#      	Ad1g,	s   c                     t        |       dkD  rt        dt        |       fz        | st        d      | d   }d}t        |       dk(  r| d   }t        |t              r|D ]
  }||   ||<    n9t	        |d      r|j                         D ]
  }||   ||<    n|D ]
  \  }}|||<    |j                         D ]
  \  }}|||<    y)	a  od.update(E, **F) -> None.  Update od from dict/iterable E and F.

        If E is a dict instance, does:           for k in E: od[k] = E[k]
        If E has a .keys() method, does:         for k in E.keys(): od[k] = E[k]
        Or if E is an iterable of items, does:   for k, v in E: od[k] = v
        In either case, this is followed by:     for k, v in F.items(): od[k] = v

        r"   z8update() takes at most 2 positional arguments (%d given)z,update() takes at least 1 argument (0 given)r   r:   r   r7   N)r   r	   
isinstancer.   hasattrr7   r>   )r   r   r   otherr   r   s         r   updatezOrderedDict.update   s     t9q= 369$i\B C CJKKAwt9>GEeT" '!#JS	'UF#zz| '!#JS	' $ "
U!S	"**, 	JCDI	r   c                 T    || v r
| |   }| |= |S || j                   u rt        |      |S )zod.pop(k[,d]) -> v, remove specified key and return the corresponding value.
        If key is not found, d is returned if given, otherwise KeyError is raised.

        )_OrderedDict__markerr1   )r   r   defaultresults       r   r   zOrderedDict.pop   s;    
 $;#YFS	Mdmm#3-r   Nc                 "    || v r| |   S || |<   |S )zDod.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in odr:   )r   r   rN   s      r   
setdefaultzOrderedDict.setdefault   s!    $;9S	r   c                     t        |       t               f}||v ryd||<   	 | s| j                  j                  d||= S | j                  j                  d| j	                         d||= S # ||= w xY w)zod.__repr__() <==> repr(od)z...r   z()())id
_get_ident	__class____name__r>   )r   _repr_runningcall_keys      r   __repr__zOrderedDict.__repr__   st    d8Z\)}$"#h	(!%!8!8: h'  $~~66

Eh'h's   A, )A, ,A1c                     | D cg c]	  }|| |   g }}t        |       j                         }t        t                     D ]  }|j                  |d        |r| j                  |f|fS | j                  |ffS c c}w )z%Return state information for picklingN)varscopyr   r   rW   )r   rD   r>   	inst_dicts       r   
__reduce__zOrderedDict.__reduce__   s}    '+,!!T!W,,JOO%	km$ 	#AMM!T"	#NNUHi88~~x'' -s   A9c                 $    | j                  |       S )z!od.copy() -> a shallow copy of od)rW   r6   s    r   r^   zOrderedDict.copy   s    ~~d##r   c                 ,     |        }|D ]  }|||<   	 |S )zOD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
        and values equal to v (which defaults to None).

        r:   )clsiterabler   dr   s        r   fromkeyszOrderedDict.fromkeys   s(     E 	CAcF	r   c                     t        |t              r:t        |       t        |      k(  xr! | j                         |j                         k(  S t        j                  | |      S )zod.__eq__(y) <==> od==y.  Comparison to another OD is order-sensitive
        while comparison to a regular mapping is order-insensitive.

        )rH   r   r   r>   r.   __eq__r   rJ   s     r   rh   zOrderedDict.__eq__   sH    
 e[)t9c%j(JTZZ\U[[]-JJ{{4''r   c                     | |k(   S Nr:   ri   s     r   __ne__zOrderedDict.__ne__   s    5=  r   )Trk   )rX   
__module____qualname____doc__r   r.   r   r    r&   r*   r-   r3   r7   r<   r>   rA   r,   rF   rK   r   objectrM   r   rQ   r[   r`   r^   classmethodrf   rh   rl   r:   r   r   r   r      s    3%  483C3C ' -1,<,< !
2+2

> HxH'  &( (($  (!r   r   N)ro   threadr   rV   ImportErrordummy_threadr.   r   r:   r   r   <module>ru      s4   5.e!$ e!  545s    $$