code: def grouper(iterable, n, incomplete="fill", fillvalue=None):
      """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
  
      """
      args = [iter(iterable)] * n
      if incomplete == "fill":
          return zip_longest(*args, fillvalue=fillvalue)
      if incomplete == "strict":
          return _zip_equal(*args)
      if incomplete == "ignore":
          return zip(*args)
      else:
          raise ValueError("Expected fill, strict, or ignore")
  
imports: import math
  import operator
  from collections import deque
  from collections.abc import Sized
  from functools import partial, reduce
  from itertools import chain, combinations, compress, count, cycle, groupby, islice, product, repeat, starmap, tee, zip_longest
  from random import randrange, sample, choice
label_desc: Use image node_id 16 for calling a global function with example usage: grouper(iterable, n, incomplete, fillvalue) and returns: zip_longest, _zip_equal, zip