code: def atlas_make_zonefile_inventory( bit_offset, bit_length, con=None, path=None ):
      
      
      listing = atlasdb_zonefile_inv_list( bit_offset, bit_length, con=con, path=path )
  
      # serialize to inv
      bool_vec = [l['present'] for l in listing]
      if len(bool_vec) % 8 != 0: 
          # pad 
          bool_vec += [False] * (8 - (len(bool_vec) % 8))
  
      inv = ""
      for i in xrange(0, len(bool_vec), 8):
          bit_vec = map( lambda b: 1 if b else 0, bool_vec[i:i+8] )
          next_byte = (bit_vec[0] << 7) | \
                      (bit_vec[1] << 6) | \
                      (bit_vec[2] << 5) | \
                      (bit_vec[3] << 4) | \
                      (bit_vec[4] << 3) | \
                      (bit_vec[5] << 2) | \
                      (bit_vec[6] << 1) | \
                      (bit_vec[7])
          inv += chr(next_byte)
  
      return inv
docs: Get a summary description of the list of zonefiles we have
      for the given block range (a "zonefile inventory")
  
      Zonefile present/absent bits are ordered left-to-right,
      where the leftmost bit is the earliest zonefile in the blockchain.
  
      Offset and length are in bytes.
  
      This is slow.  Use the in-RAM zonefile inventory vector whenever possible
      (see atlas_get_zonefile_inventory).