+
     hr  c                   s   R t ^ RIt^ RIt^ RIHt ^ RIHt ^ RIHtH	t	 ^ RI
HtHtHtHtHtHtHtHtHtHtHtHt ^ RIHtHtHt ^ RIHt . RNR	NR
NRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNR NR!NR"NR#NR$NR%NR&NR'NR(NR)NR*NR+NR,NR-NR.NR/NR0NR1NR2NR3NR4NR5Nt]! 4       t ] ! R6R77       ]! ] R6R77      t!]#! ]R8R9 4      t$R: t%RuR; lt&R< t'RvR= lt(RvR> lt)RvR? lt*]+3R@ lt,RA t-]-t.RB t/RC t0RD t1RvRE lt2RF t3 ^ RGI
H4t5 RH t4]3P                   ]4n          ! RI RJ]74      t8RK t9RL t:RwRM lt;RN t<RO t=RP t>RvRQ lt?RvRR lt@RxRT ltARvRU ltBRyRV ltCRW^/RX ltDRvRY ltERZ tFR[ tGR\ tHR] tIR^ tJR_ tKR` tLRa tMRb tNRc tORd tPRe tQRzRf ltRRg tSRhRS/Ri ltT]Rj8  d   ^ RkI
HUtV RhRS/Rl ltUM]TtU]TP                   ]Un         Rm tWRn tXRo tYRp tZRq t[Rr t\Rs t]Rt t^R#   ]" d    ] t! EL!i ; i  ]6 d    ]3t4 Li ; i){a  Imported from the recipes section of the itertools documentation.

All functions taken from the recipes section of the itertools library docs
[1]_.
Some backward-compatible usability improvements have been made.

.. [1] http://docs.python.org/library/itertools.html#recipes

N)deque)Sized)partialreduce)chaincombinationscompresscountcyclegroupbyisliceproductrepeatstarmapteezip_longest)	randrangesamplechoice)
hexversion	all_equalbatchedbefore_and_afterconsumeconvolve
dotproduct
first_truefactorflattengrouperiter_except
iter_indexmatmulncyclesnthnth_combinationpadnonepad_nonepairwise	partitionpolynomial_evalpolynomial_from_rootspolynomial_derivativepowersetprependquantifyreshape#random_combination_with_replacementrandom_combinationrandom_permutationrandom_product
repeatfunc
roundrobinsievesliding_window	subslicessum_of_squarestabulatetailtaketotient	transpose
triplewiseuniqueunique_everseenunique_justseenTstrictZsumprodc                 s    \        W4      # N)r   )xZy   &&;/usr/lib/python3.14/site-packages/more_itertools/recipes.py<lambda>rH   _   s	    A1A    c                *    \        \        W4      4      # )zReturn first *n* items of the iterable as a list.

    >>> take(3, range(10))
    [0, 1, 2]

If there are fewer than *n* items in the iterable, all of them are
returned.

    >>> take(10, range(3))
    [0, 1, 2]

)listr
   niterablerF   rG   r;   r;   b   s     x#$$rI   c                s,    \        V \        V4      4      # )a  Return an iterator over the results of ``func(start)``,
``func(start + 1)``, ``func(start + 2)``...

*func* should be a function that accepts one integer argument.

If *start* is not specified it defaults to 0. It will be incremented each
time the iterator is advanced.

    >>> square = lambda x: x ** 2
    >>> iterator = tabulate(square, -3)
    >>> take(4, iterator)
    [9, 4, 1, 0]

)mapr   )ZfunctionstartrF   rG   r9   r9   r   s     xu&&rI   c           	   #  s   "   \        V\        4      '       d2   \        V\        ^ \	        V4      V ,
          4      R4       Rj  xL
  R# \        \        WR7      4       Rj  xL
  R#  L% L5i)zsReturn an iterator over the last *n* items of *iterable*.

>>> t = tail(3, 'ABCDEFG')
>>> list(t)
['E', 'F', 'G']

NZmaxlen)Z
isinstancer   r
   Zmaxleniterr    rL   rF   rG   r:   r:      sR      (E""(C3x=1+<$=tDDDh1222 	E2s$   AA-A)A-"A+#A-+A-c                sX    Vf   \        V ^ R7       R# \        \        WV4      R4       R# )a  Advance *iterable* by *n* steps. If *n* is ``None``, consume it
entirely.

Efficiently exhausts an iterator without returning values. Defaults to
consuming the whole iterator, but an optional second argument may be
provided to limit consumption.

    >>> i = (x for x in range(10))
    >>> next(i)
    0
    >>> consume(i, 3)
    >>> next(i)
    4
    >>> consume(i)
    >>> next(i)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration

If the iterator has fewer items remaining than the provided limit, the
whole iterator will be consumed.

    >>> i = (x for x in range(3))
    >>> consume(i, 5)
    >>> next(i)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration

NrQ   )r    nextr
   )iteratorrM   rF   rG   r   r      s'    @ 	yhq! 	VH#T*rI   c                s.    \        \        WR4      V4      # )zmReturns the nth item or a default value.

>>> l = range(10)
>>> nth(l, 3)
3
>>> nth(l, 20, "zebra")
'zebra'

N)rT   r
   )rN   rM   default   &&&rG   r"   r"      s     xD)733rI   c                sF    \        W4      pV F  pV F  p  R# 	   R# 	  R# )aw  
Returns ``True`` if all the elements are equal to each other.

    >>> all_equal('aaaa')
    True
    >>> all_equal('aaab')
    False

A function that accepts a single argument and returns a transformed version
of each input item can be specified with *key*:

    >>> all_equal('AaaA', key=str.casefold)
    True
    >>> all_equal([1, 2, 3], key=lambda x: x < 10)
    True

FT)r	   )rN   keyrU   firstZsecond   &&   rG   r   r      s-    $ x%HF   rI   c                rJ   )zWReturn the how many times the predicate is true.

>>> quantify([True, False, True])
2

)sumrO   )rN   predrF   rG   r-   r-      s     s4"##rI   c                s,    \        V \        R4      4      # )zReturns the sequence of elements and then returns ``None`` indefinitely.

    >>> take(5, pad_none(range(3)))
    [0, 1, 2, None, None]

Useful for emulating the behavior of the built-in :func:`map` function.

See also :func:`padded`.

N)r   r   rN      &rG   r%   r%      s     6$<((rI   c                sT    \         P                  ! \        \        V 4      V4      4      # )zjReturns the sequence elements *n* times

>>> list(ncycles(["a", "b"], 3))
['a', 'b', 'a', 'b', 'a', 'b']

)r   from_iterabler   tuplerN   rM   rF   rG   r!   r!      s      veHoq9::rI   c                sH    \        \        \        P                  W4      4      # )zWReturns the dot product of the two iterables.

>>> dotproduct([10, 10], [20, 20])
400

)r[   rO   operatormul)Zvec1Zvec2rF   rG   r   r   
  s     s8<<,--rI   c                s.    \         P                  ! V 4      # )zReturn an iterator flattening one level of nesting in a list of lists.

    >>> list(flatten([[0, 1], [2, 3]]))
    [0, 1, 2, 3]

See also :func:`collapse`, which can flatten multiple levels of nesting.

)r   r_   )ZlistOfListsr^   rG   r   r     s     {++rI   c                s^    Vf   \        V \        V4      4      # \        V \        W!4      4      # )a  Call *func* with *args* repeatedly, returning an iterable over the
results.

If *times* is specified, the iterable will terminate after that many
repetitions:

    >>> from operator import add
    >>> times = 4
    >>> args = 3, 5
    >>> list(repeatfunc(add, times, *args))
    [8, 8, 8, 8]

If *times* is ``None`` the iterable will not terminate:

    >>> from random import randrange
    >>> times = None
    >>> args = 1, 11
    >>> take(6, repeatfunc(randrange, times, *args))  # doctest:+SKIP
    [2, 4, 8, 1, 8, 4]

)r   r   )funcZtimesargss   &&*rG   r3   r3      s,    , }tVD\**4,--rI   c                sJ    \        V 4      w  r\        VR4       \        W4      # )zReturns an iterator of paired items, overlapping, from the original

>>> take(4, pairwise(count()))
[(0, 1), (1, 2), (2, 3), (3, 4)]

On Python 3.10 and above, this is an alias for :func:`itertools.pairwise`.

Nr   rT   zip)rN   ZaZb   &  rG   	_pairwiseri   ;  s"     x=DADMq9rI   )r&   c                 s    \        V 4      # rD   )itertools_pairwiser]   r^   rG   r&   r&   O  s    !(++rI   c                   s6   a a ] tR tRt oRV 3R lltRtVtV ;t# )UnequalIterablesErroriU  c                s`   < R pVe   VRP                   ! V!  ,          p\        SV `	  V4       R# )z Iterables have different lengthsNz/: index 0 has length {}; index {} has length {})ZformatZsuper__init__)ZselfdetailsZmsg	__class__s   && rG   rl   ZUnequalIterablesError.__init__V  s8    0EMM C 	rI    rD   )Z__name__Z
__module__Z__qualname__Z__firstlineno__rl   Z__static_attributes__Z__classdictcell__Z__classcell__)rn   Z__classdict__s   @@rG   rk   rk   U  s      rI   rk   c              #   s|   "   \        V R \        /  F$  pV F  pV\        J g   K  \        4       h	  Vx  K&  	  R# 5i)	fillvalueN)r   _markerrk   )	iterablesZcomboZvalrh   rG   _zip_equal_generatorrs   `  s:     i;7;Cg~+--  	 <s   <<c                  s     \        V ^ ,          4      p\        V R,          ^4       F$  w  r#\        V4      pWA8w  g   K  \        WV3R7      h	  \        V !  #   \         d    \        T 4      u # i ; i)    :   NN)rm   )rR   	enumeraterk   rg   	TypeErrorrs   )rr   Z
first_sizeiitZsizes   *    rG   
_zip_equalrz   h  ss    /1&
y}a0EAr7D!+ZD4IJJ 1
 I  /#I../s   8A A A10A1c                s    \        V 4      .V,          pVR8X  d   \        VRV/ # VR8X  d
   \        V!  # VR8X  d
   \        V!  # \	        R4      h)au  Group elements from *iterable* into fixed-length groups of length *n*.

>>> list(grouper('ABCDEF', 3))
[('A', 'B', 'C'), ('D', 'E', 'F')]

The keyword arguments *incomplete* and *fillvalue* control what happens for
iterables whose length is not a multiple of *n*.

When *incomplete* is `'fill'`, the last group will contain instances of
*fillvalue*.

>>> list(grouper('ABCDEFG', 3, incomplete='fill', fillvalue='x'))
[('A', 'B', 'C'), ('D', 'E', 'F'), ('G', 'x', 'x')]

When *incomplete* is `'ignore'`, the last group will not be emitted.

>>> list(grouper('ABCDEFG', 3, incomplete='ignore', fillvalue='x'))
[('A', 'B', 'C'), ('D', 'E', 'F')]

When *incomplete* is `'strict'`, a subclass of `ValueError` will be raised.

>>> it = grouper('ABCDEFG', 3, incomplete='strict')
>>> list(it)  # doctest: +IGNORE_EXCEPTION_DETAIL
Traceback (most recent call last):
...
UnequalIterablesError

fillrp   rC   Zignorez Expected fill, strict, or ignore)rS   r   rz   rg   
ValueError)rN   rM   Z
incompleterp   re   s   &&&& rG   r   r   x  s^    : NaDVD6I66X4  XDz;<<rI   c               '  s   "   \        \        V 4      p\        \        V 4      ^ R4       F/  p\	        \        W4      4      p\        \        V4       Rj  xL
  K1  	  R#  L
5i)a2  Yields an item from each iterable, alternating between them.

    >>> list(roundrobin('ABC', 'D', 'EF'))
    ['A', 'D', 'E', 'B', 'F', 'C']

This function produces the same output as :func:`interleave_longest`, but
may perform better for some inputs (in particular when the number of
iterables is small).

N)rO   rS   rangerR   r   r
   rT   )rr   	iteratorsZ
num_actives   *  rG   r4   r4     sL      D)$IC	NAr2
&78	tY''' 3's   AA AA c                s    V f   \         p \        V^4      w  r#p\        \        W4      4      w  rV\        V\        \        P
                  V4      4      \        W64      3# )aw  
Returns a 2-tuple of iterables derived from the input iterable.
The first yields the items that have ``pred(item) == False``.
The second yields the items that have ``pred(item) == True``.

    >>> is_odd = lambda x: x % 2 != 0
    >>> iterable = range(10)
    >>> even_items, odd_items = partition(is_odd, iterable)
    >>> list(even_items), list(odd_items)
    ([0, 2, 4, 6, 8], [1, 3, 5, 7, 9])

If *pred* is None, :func:`bool` is used.

    >>> iterable = [0, 1, False, True, '', ' ']
    >>> false_items, true_items = partition(None, iterable)
    >>> list(false_items), list(true_items)
    ([0, False, ''], [1, True, ' '])

)boolr   rO   r   rb   Znot_)r\   rN   t1t2pZp1Zp2s   &&     rG   r'   r'     sP    ( |Ha IBATFBRX]]B/0(22BCCrI   c                s   a \        V 4      o\        P                  ! V3R l\        \	        S4      ^,           4       4       4      # )a  Yields all possible subsets of the iterable.

    >>> list(powerset([1, 2, 3]))
    [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]

:func:`powerset` will operate on iterables that aren't :class:`set`
instances, so repeated elements in the input will produce repeated elements
in the output.

    >>> seq = [1, 1, 0]
    >>> list(powerset(seq))
    [(), (1,), (1,), (0,), (1, 1), (1, 0), (1, 0), (1, 1, 0)]

For a variant that efficiently yields actual :class:`set` instances, see
:func:`powerset_of_sets`.
c              3   s<   <"   T F  p\        SV4      x  K  	  R # 5irD   )r   ).0rs   & rG   	<genexpr>Zpowerset.<locals>.<genexpr>  s     M;La|Aq11;Ls   )rK   r   r_   r~   rR   )rN   r   s   &@rG   r+   r+     s2    " 	XAM5Q!;LMMMrI   c              #  s  "   \        4       pVP                  p. pVP                  pVRJpV  F*  pV'       d	   V! V4      MTp W9  d   V! V4       Vx  K*  K,  	  R#   \         d    Y9  d   T! T4       Tx   KP   KS  i ; i5i)aJ  
Yield unique elements, preserving order.

    >>> list(unique_everseen('AAAABBBCCDAABBB'))
    ['A', 'B', 'C', 'D']
    >>> list(unique_everseen('ABBCcAD', str.lower))
    ['A', 'B', 'C', 'D']

Sequences with a mix of hashable and unhashable items can be used.
The function will be slower (i.e., `O(n^2)`) for unhashable items.

Remember that ``list`` objects are unhashable - you can use the *key*
parameter to transform the list to a tuple (which is hashable) to
avoid a slowdown.

    >>> iterable = ([1, 2], [2, 3], [1, 2])
    >>> list(unique_everseen(iterable))  # Slow
    [[1, 2], [2, 3]]
    >>> list(unique_everseen(iterable, key=tuple))  # Faster
    [[1, 2], [2, 3]]

Similarly, you may want to convert unhashable ``set`` objects with
``key=frozenset``. For ``dict`` objects,
``key=lambda x: frozenset(x.items())`` can be used.

N)setZaddappendrw   )	rN   rX   ZseensetZseenset_addZseenlistZseenlist_addZuse_keyelementks	   &&       rG   r@   r@     s     6 eG++KH??LoG#CL	A     	 Q !	s*   A BABB:B BBc           
     s    Vf*   \        \        P                  ! ^ 4      \        V 4      4      # \        \        \        \        P                  ! ^4      \        W4      4      4      # )zYields elements in order, ignoring serial duplicates

>>> list(unique_justseen('AAAABBBCCDAABBB'))
['A', 'B', 'C', 'D', 'A', 'B']
>>> list(unique_justseen('ABBCcAD', str.lower))
['A', 'B', 'C', 'A', 'D']

)rO   rb   Z
itemgetterr	   rT   )rN   rX   rF   rG   rA   rA     sJ     {8&&q)78+<==tS,,Q/1GHIIrI   Fc                s2    \        \        WVR7      VR7      # )a  Yields unique elements in sorted order.

>>> list(unique([[1, 2], [3, 4], [1, 2]]))
[[1, 2], [3, 4]]

*key* and *reverse* are passed to :func:`sorted`.

>>> list(unique('ABBcCAD', str.casefold))
['A', 'B', 'c', 'D']
>>> list(unique('ABBcCAD', str.casefold, reverse=True))
['D', 'c', 'B', 'A']

The elements in *iterable* need not be hashable, but they must be
comparable for sorting to work.
)rX   reverse)rX   )rA   sorted)rN   rX   r   rW   rG   r?   r?     s      6(WE3OOrI   c              #  sZ   "    Ve
   V! 4       x   V ! 4       x  K    T d     R# i ; i5i)a  Yields results from a function repeatedly until an exception is raised.

Converts a call-until-exception interface to an iterator interface.
Like ``iter(func, sentinel)``, but uses an exception instead of a sentinel
to end the loop.

    >>> l = [0, 1, 2]
    >>> list(iter_except(l.pop, IndexError))
    [2, 1, 0]

Multiple exceptions can be specified as a stopping condition:

    >>> l = [1, 2, 3, '...', 4, 5, 6]
    >>> list(iter_except(lambda: 1 + l.pop(), (IndexError, TypeError)))
    [7, 6, 5]
    >>> list(iter_except(lambda: 1 + l.pop(), (IndexError, TypeError)))
    [4, 3, 2]
    >>> list(iter_except(lambda: 1 + l.pop(), (IndexError, TypeError)))
    []

Nro   )rd   Z	exceptionrY   rW   rG   r   r   2  s2     ,'M&L s   + (+(+c                s,    \        \        W 4      V4      # )ad  
Returns the first true value in the iterable.

If no true value is found, returns *default*

If *pred* is not None, returns the first item for which
``pred(item) == True`` .

    >>> first_true(range(10))
    1
    >>> first_true(range(10), pred=lambda x: x > 5)
    6
    >>> first_true(range(10), default='missing', pred=lambda x: x > 9)
    'missing'

)rT   Zfilter)rN   rV   r\   rW   rG   r   r   Q  s    " t&00rI   r   c                s    V Uu. uF  p\        V4      NK  	  upV ,          p\         ;QJ d    . R V 4       F  NK  	  5# ! R V 4       4      # u upi )a  Draw an item at random from each of the input iterables.

    >>> random_product('abc', range(4), 'XYZ')  # doctest:+SKIP
    ('c', 3, 'Z')

If *repeat* is provided as a keyword argument, that many items will be
drawn from each iterable.

    >>> random_product('abcd', range(4), repeat=2)  # doctest:+SKIP
    ('a', 2, 'd', 3)

This equivalent to taking a random selection from
``itertools.product(*args, **kwarg)``.

c              3   s8   "   T F  p\        V4      x  K  	  R # 5irD   )r   )r   pool   & rG   r   Z!random_product.<locals>.<genexpr>v  s     0%$%s   )r`   )r   re   r   Zpoolss   $*  rG   r2   r2   e  sH      &**TTU4[T*V3E50%05050%000 +s   Ac                sb    \        V 4      pVf   \        V4      MTp\        \        W!4      4      # )aF  Return a random *r* length permutation of the elements in *iterable*.

If *r* is not specified or is ``None``, then *r* defaults to the length of
*iterable*.

    >>> random_permutation(range(5))  # doctest:+SKIP
    (3, 4, 0, 1, 2)

This equivalent to taking a random selection from
``itertools.permutations(iterable, r)``.

)r`   rR   r   )rN   r   r      && rG   r1   r1   y  s+     ?DYD	AA!!rI   c                s   a \        V 4      o\        S4      p\        \        \	        V4      V4      4      p\         ;QJ d    . V3R lV 4       F  NK  	  5# ! V3R lV 4       4      # )zReturn a random *r* length subsequence of the elements in *iterable*.

    >>> random_combination(range(5), 3)  # doctest:+SKIP
    (2, 3, 4)

This equivalent to taking a random selection from
``itertools.combinations(iterable, r)``.

c              3   6   <"   T F  pSV,          x  K  	  R # 5irD   ro   r   rx   r   r   rG   r   Z%random_combination.<locals>.<genexpr>       *'Qa'   )r`   rR   r   r   r~   )rN   r   rM   indicesr   s   &&  @rG   r0   r0     sN     ?DD	AVE!Ha()G5*'*5*5*'***rI   c                s   aa \        V 4      o\        S4      o\        V3R l\        V4       4       4      p\         ;QJ d    . V3R lV 4       F  NK  	  5# ! V3R lV 4       4      # )a;  Return a random *r* length subsequence of elements in *iterable*,
allowing individual elements to be repeated.

    >>> random_combination_with_replacement(range(3), 5) # doctest:+SKIP
    (0, 0, 1, 2, 2)

This equivalent to taking a random selection from
``itertools.combinations_with_replacement(iterable, r)``.

c              3   s:   <"   T F  p\        S4      x  K  	  R # 5irD   )r   )r   rx   rM   r   rG   r   6random_combination_with_replacement.<locals>.<genexpr>  s     48aYq\\8s   c              3   r   rD   ro   r   r   rG   r   r     r   r   )r`   rR   r   r~   )rN   r   r   rM   r   s   && @@rG   r/   r/     sM     ?DD	A45844G5*'*5*5*'***rI   c                s6   \        V 4      p\        V4      pV^ 8  g   W8  d   \        h^p\        WV,
          4      p\	        ^V^,           4       F   pWTV,
          V,           ,          V,          pK"  	  V^ 8  d	   W%,          pV^ 8  g   W%8  d   \
        h. pV'       dp   WQ,          V,          V^,
          V^,
          rpW%8  d)   W%,          pWTV,
          ,          V,          V^,
          rEK.  VP                  VRV,
          ,          4       Kw  \        V4      # )a  Equivalent to ``list(combinations(iterable, r))[index]``.

The subsequences of *iterable* that are of length *r* can be ordered
lexicographically. :func:`nth_combination` computes the subsequence at
sort position *index* directly, without computing the previous
subsequences.

    >>> nth_combination(range(5), 3, 5)
    (0, 3, 4)

``ValueError`` will be raised If *r* is negative or greater than the length
of *iterable*.
``IndexError`` will be raised if the given *index* is invalid.
r}   )r`   rR   r|   Zminr~   Z
IndexErrorr   )	rN   r   indexr   rM   Zcr   rx   Zresults	   &&&      rG   r#   r#     s     ?DD	A	A15	AA1uA1a!e_QOq   qy
	uzF
%1*a!eQUajJEA;!#QUqd26l#=rI   c                s    \        V .V4      # )a  Yield *value*, followed by the elements in *iterator*.

    >>> value = '0'
    >>> iterator = ['1', '2', '3']
    >>> list(prepend(value, iterator))
    ['0', '1', '2', '3']

To prepend multiple values, see :func:`itertools.chain`
or :func:`value_chain`.

)r   )valuerU   rF   rG   r,   r,     s     %(##rI   c              #  s   "   \        V4      RRR1,          p\        V4      p\        ^ .VR7      V,          p\        V \	        ^ V^,
          4      4       F!  pVP                  V4       \        W4      x  K#  	  R# 5i)a&  Convolve the iterable *signal* with the iterable *kernel*.

    >>> signal = (1, 2, 3, 4, 5)
    >>> kernel = [3, 2, 1]
    >>> list(convolve(signal, kernel))
    [3, 8, 14, 20, 26, 14, 5]

Note: the input arguments are not interchangeable, as the *kernel*
is immediately consumed and stored.

NrQ   r}   )r`   rR   r    r   r   r   _sumprod)ZsignalZkernelrM   windowrE   rZ   rG   r   r     sh      6]4R4 FFAA3q!A%F66!QU+,av&& -s   A:A<c                s\   a aa \        S4      o. oVV V3R lp\        SS4      pV! 4       V3# )a  A variant of :func:`takewhile` that allows complete access to the
remainder of the iterator.

     >>> it = iter('ABCdEfGhI')
     >>> all_upper, remainder = before_and_after(str.isupper, it)
     >>> ''.join(all_upper)
     'ABC'
     >>> ''.join(remainder) # takewhile() would lose the 'd'
     'dEfGhI'

Note that the first iterator must be fully consumed before the second
iterator can generate valid results.
c               3   sn   <"   S F)  p S! V 4      '       d   V x  K  SP                  V 4        R # 	  R # 5irD   )r   )Zelemry   	predicate
transitions    rG   true_iteratorZ'before_and_after.<locals>.true_iterator  s/     D
!!$' s   25)rS   r   )r   ry   r   Zremainder_iteratorr   s   ff  @rG   r   r     s5     
bBJ z2.?...rI   c                s    \        V ^4      w  rp\        VR4       \        VR4       \        VR4       \        WV4      # )zReturn overlapping triplets from *iterable*.

>>> list(triplewise('ABCDE'))
[('A', 'B', 'C'), ('B', 'C', 'D'), ('C', 'D', 'E')]

Nrf   )rN   r   r   Zt3s   &   rG   r>   r>     s;     Xq!JBBTNTNTNrr?rI   c                 s~    \        W4      p\        V4       F  w  r4\        \        WCV4      R 4       K  	  \	        V!  # rD   )r   rv   rT   r
   rg   )rN   rM   r   rx   rU   rZ   rG   _sliding_window_islicer   ,  s8    H I +VH#T* ,	?rI   c              #   s   "   \        V 4      p\        \        W!^,
          4      VR7      pV F!  pVP                  V4       \	        V4      x  K#  	  R# 5i)ru   rQ   N)rS   r    r
   r   r`   )rN   rM   ry   r   rE   rZ   rG   _sliding_window_dequer   4  sC     	hB6"!e$Q/FaFm s   AAc                s    V^8  d   \        W4      # V^8  d   \        W4      # V^8X  d   \        V 4      # V^8X  d   \        V 4      # \	        RV 24      h)a=  Return a sliding window of width *n* over *iterable*.

    >>> list(sliding_window(range(6), 4))
    [(0, 1, 2, 3), (1, 2, 3, 4), (2, 3, 4, 5)]

If *iterable* has fewer than *n* items, then nothing is yielded:

    >>> list(sliding_window(range(3), 4))
    []

For a variant with more features, see :func:`windowed`.
zn should be at least one, not )r   r   r&   rg   r|   ra   rF   rG   r6   r6   =  s^     	2v$X11	
Q%h22	
a!!	
a8}9!=>>rI   c           
     s    \        V 4      p\        \        \        \	        \        V4      ^,           4      ^4      4      p\        \        P                  \        V4      V4      # )zReturn all contiguous non-empty subslices of *iterable*.

    >>> list(subslices('ABC'))
    [['A'], ['A', 'B'], ['A', 'B', 'C'], ['B'], ['B', 'C'], ['C']]

This is similar to :func:`substrings`, but emits items in a different
order.
)
rK   r   Zslicer   r~   rR   rO   rb   Zgetitemr   )rN   ZseqZslicesrh   rG   r7   r7   V  sF     x.CULs3x!|)<a@AFxf55rI   c                s    \        \        ^4      \        \        P                  V 4      4      p\        \        \        V^.4      4      # )zCompute a polynomial's coefficients from its roots.

>>> roots = [5, -4, 3]  # (x - 5) * (x + 4) * (x - 3)
>>> polynomial_from_roots(roots)  # x^3 - 4 * x^2 - 17 * x + 60
[1, -4, -17, 60]
)rg   r   rO   rb   ZnegrK   r   r   )ZrootsZfactorsr   rG   r)   r)   d  s5     &)Su56Gx1#.//rI   c              #  s  "   \        V RR4      pVf4   \        WV4      p\        WR4       F  w  rgWqJ g	   Wq8X  g   K  Vx  K  	  R# Vf   \        V 4      MTpV^,
          p  V! W^,           V4      ;px  K    \         d     R# i ; i5i)a  Yield the index of each place in *iterable* that *value* occurs,
beginning with index *start* and ending before index *stop*.


>>> list(iter_index('AABCADEAF', 'A'))
[0, 1, 4, 7]
>>> list(iter_index('AABCADEAF', 'A', 1))  # start index is inclusive
[1, 4, 7]
>>> list(iter_index('AABCADEAF', 'A', 1, 7))  # stop index is not inclusive
[1, 4]

The behavior for non-scalar *values* matches the built-in Python types.

>>> list(iter_index('ABCDABCD', 'AB'))
[0, 4]
>>> list(iter_index([0, 1, 2, 3, 0, 1, 2, 3], [0, 1]))
[]
>>> list(iter_index([[0, 1], [2, 3], [0, 1], [2, 3]], [0, 1]))
[0, 2]

See :func:`locate` for a more general means of finding the indexes
associated with particular values.

r   N)getattrr
   rv   rR   r|   )rN   r   rP   ZstopZ	seq_indexry   rx   r   s   &&&&    rG   r   r   o  s     2 '40IHT*#B.JA7#3 /
 !%s8}$AI	%eUD99q: 		s(   6B$B"A9 9BBBBc              #  s  "   V ^8  d   ^x  ^p\        R4      V ^,          ,          p\        P                  ! V 4      ^,           p\        V^W4       Fd  p\        V^WV,          4       Rj  xL
  \	        \        \        WD,          WV,           4      4      4      W$V,          WV,           1&   WD,          pKf  	  \        V^V4       Rj  xL
  R#  Ld L5i)zXYield the primes less than n.

>>> list(sieve(30))
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
N)rt   ru   )Z	bytearraymathisqrtr   ZbytesrR   r~   )rM   rP   ZdataZlimitr   s   &    rG   r5   r5     s      	1uEVQ'DJJqMAEa.dAu!e444"'E!%E,B(C"DUQQ / $5))) 	5 *s%   A+C-C.ACCCCrC   c             #  s   "   V^8  d   \        R4      h\        V 4      p\        \        W14      4      ;p'       d*   V'       d   \	        V4      V8w  d   \        R4      hVx  KE  R# 5i)ar  Batch data into tuples of length *n*. If the number of items in
*iterable* is not divisible by *n*:
* The last batch will be shorter if *strict* is ``False``.
* :exc:`ValueError` will be raised if *strict* is ``True``.

>>> list(batched('ABCDEFG', 3))
[('A', 'B', 'C'), ('D', 'E', 'F'), ('G',)]

On Python 3.13 and above, this is an alias for :func:`itertools.batched`.
zn must be at least onezbatched(): incomplete batchN)r|   rS   r`   r
   rR   )rN   rM   rC   ry   Zbatchs   &&$  rG   _batchedr     sZ      	1u122	hB'
'%
'c%jAo:;; (s   AA'#A'i )r   c                s    \        WVR 7      # )rB   )itertools_batched)rN   rM   rC   s   &&$rG   r   r     s     V<<rI   c                s    \        V !  # )zSwap the rows and columns of the input matrix.

>>> list(transpose([(1, 2, 3), (11, 22, 33)]))
[(1, 11), (2, 22), (3, 33)]

The caller should ensure that the dimensions of the input are compatible.
If the input is empty, no output will be produced.
)_zip_strictry   r^   rG   r=   r=     s     rI   c                sB    \        \        P                  ! V 4      V4      # )zReshape the 2-D input *matrix* to have a column count given by *cols*.

>>> matrix = [(0, 1), (2, 3), (4, 5)]
>>> cols = 3
>>> list(reshape(matrix, cols))
[(0, 1, 2), (3, 4, 5)]
)r   r   r_   )ZmatrixZcolsrF   rG   r.   r.     s     5&&v.55rI   c                s    \        V^ ,          4      p\        \        \        \	        V \        V4      4      4      V4      # )zMultiply two matrices.

>>> list(matmul([(7, 5), (3, 5)], [(2, 5), (7, 9)]))
[(49, 80), (41, 60)]

The caller should ensure that the dimensions of the input matrices are
compatible with each other.
)rR   r   r   r   r   r=   )Zm1Zm2rM   r   rG   r    r      s0     	BqE
A78WR2%?@!DDrI   c              #  s   "   \        \        P                  ! V 4      ^,           4       F)  pW,          '       d   K  Vx  W,          p V ^8X  g   K%   R# 	  V ^8  d   V x  R# R# 5i)zHYield the prime factors of n.

>>> list(factor(360))
[2, 2, 2, 3, 3, 5]
N)r5   r   r   rM   Zprimer   rG   r   r     sS      tzz!}q()))KKAAv * 	1u s   5A%A%A%c           	     s    \        V 4      pV^ 8X  d
   V^ ,          # \        \        \        V4      \	        \        V4      4      4      p\        W4      # )zEvaluate a polynomial at a specific value.

Example: evaluating x^3 - 4 * x^2 - 17 * x + 60 at x = 2.5:

>>> coefficients = [1, -4, -17, 60]
>>> x = 2.5
>>> polynomial_eval(coefficients, x)
8.125
)rR   rO   Zpowr   reversedr~   r   )coefficientsrE   rM   powerss   &&  rG   r(   r(      sD     	LAAv1ufQi%(!34FL))rI   c                s&    \        \        V 4      !  # )zZReturn the sum of the squares of the input values.

>>> sum_of_squares([10, 20, 30])
1400
)r   r   r   r^   rG   r8   r8     s     SWrI   c                s    \        V 4      p\        \        ^V4      4      p\        \	        \
        P                  W4      4      # )a  Compute the first derivative of a polynomial.

Example: evaluating the derivative of x^3 - 4 * x^2 - 17 * x + 60

>>> coefficients = [1, -4, -17, 60]
>>> derivative_coefficients = polynomial_derivative(coefficients)
>>> derivative_coefficients
[3, -8, -17]
)rR   r   r~   rK   rO   rb   rc   )r   rM   r   rh   rG   r*   r*     s4     	LAeAqk"FHLL,788rI   c                sZ    \        \        V 4      4       F  pW V,          ,          p K  	  V # )zmReturn the count of natural numbers up to *n* that are coprime with *n*.

>>> totient(9)
6
>>> totient(12)
4
)r   r   r   r   rG   r<   r<   )  s&     VAY	%Z  HrI   )rt   rD   )r{   N)NF)NN)rt   N)_Z__doc__r   rb   Zcollectionsr    Zcollections.abcr   Z	functoolsr   r   Z	itertoolsr   r   r   r   r   r	   r
   r   r   r   r   r   Zrandomr   r   r   Zsysr   Z__all__Zobjectrq   rg   r   rw   r   r   r;   r9   r:   r   r"   r   r   r-   r%   r$   r!   r   r   r3   ri   r&   rj   ZImportErrorr|   rk   rs   rz   r   r4   r'   r+   r@   rA   r?   r   r   r2   r1   r0   r/   r#   r,   r   r   r>   r   r   r6   r7   r)   r   r5   r   r   r   r=   r.   r    r   r(   r8   r*   r<   ro   rI   rG   <module>r      s      ! %    - , /// / 	/
 / / / / / / / / / / 
/  !/" #/$ %/& '/( )/* +/, -/. //0 1/2 3/4 5/6 7/8 *9/: ;/< =/> ?/@ A/B C/D E/F G/H I/J K/L M/N O/P Q/R S/T U/V W/X Y/Z [/\ ]/b (,t #d+K 4$AB% '$3$%+P
44 ! $) ;.	,.6	)8
, !((HJ / %=P($D8N**ZJP&>1(1 1("$+ +"'T$',/B ?260(V*$E ( 6=u = G&&GO	6
E *"9
a  Kd  Hs$   1	G G) 	G&%G&)	G54G5