Changeset 5873


Ignore:
Timestamp:
Feb 17, 2018, 12:50:34 PM (14 months ago)
Author:
xwa163
Message:
  1. Implement LZ4MultiplePdepKernel, which can do PDEP for more than one input streamset
  2. Add attributed Swizzled in StreamSet?, copy at least one whole block when doing temporary buffer copy for Swizzled InputStreamSet?
  3. Bug fixing for character_deposit pipeline
  4. Add more test files for character_deposit pipeline
Location:
icGREP/icgrep-devel
Files:
7 added
7 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/QA/character_deposit/character_deposit_test.py

    r5858 r5873  
    2323        python_output_file_full_path = os.path.join(python_output_dir, output_file)
    2424
    25         character_deposit_cmd = "%s b %s %s" % (lz4d_program_under_test, test_file_full_path, output_file_full_path)
     25        character_deposit_cmd = "%s b -buffer-segments=2 %s %s" % (lz4d_program_under_test, test_file_full_path, output_file_full_path)
    2626
    2727        if options.verbose:
  • icGREP/icgrep-devel/QA/character_deposit/testfiles/42k.txt

    r5858 r5873  
    1 zzzbbbqbqbqbaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababpppbbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababiopbbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababwewbbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbxbababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaxxbbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababcccbbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababdddbbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababeeebbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababfffbbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababatabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababarabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababawabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababawwbbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaebbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaeebbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababeeebbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaffbbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabfbabaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababfffbbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbababab
     1zzzbbbqbqbqbaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababpppbbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababiopbbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababwewbbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbxbpbabaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaxxbbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababcccbbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababdddbbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababeeebbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababfffbbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababatabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababarabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababawabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababawwbbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaebbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaeebbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababeeebbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaffbbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabfbabaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababfffbbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbabababaaabbbababab
  • icGREP/icgrep-devel/icgrep/CMakeLists.txt

    r5864 r5873  
    120120add_executable(core combine/core.cpp combine/regexGen.cpp combine/stringGen.cpp combine/propGen.cpp combine/icgrep-test/icgrep-test.cpp grep_interface.cpp grep_engine.cpp kernels/scanmatchgen.cpp kernels/u8u32_kernel.cpp kernels/delmask_kernel.cpp kernels/cc_kernel.cpp kernels/cc_scan_kernel.cpp kernels/charclasses.cpp kernels/linebreak_kernel.cpp kernels/streams_merge.cpp kernels/grep_kernel.cpp kernels/until_n.cpp)
    121121add_executable(character_deletion character_deletion.cpp kernels/cc_kernel.cpp)
    122 add_executable(character_deposit character_deposit.cpp kernels/cc_kernel.cpp kernels/pdep_kernel.cpp)
    123 add_executable(lz4d_ext_dep lz4d_ext_dep.cpp lz4FrameDecoder.cpp kernels/cc_kernel.cpp kernels/lz4/lz4_block_decoder.cpp kernels/sequential_kernel.cpp kernels/lz4/lz4_extract_e_m0.cpp kernels/lz4/lz4_deposit_uncompressed.cpp kernels/lz4/lz4_generate_deposit_stream.cpp kernels/lz4/lz4_numbers_to_bitstream_kernel.cpp kernels/lz4/LZ4MarkerToMaskKernel.cpp kernels/lz4/lz4_bitstream_not_kernel.cpp kernels/pdep_kernel.cpp kernels/lz4/lz4_match_copy_kernel.cpp lz4/LZ4Generator.cpp)
     122add_executable(character_deposit character_deposit.cpp kernels/cc_kernel.cpp kernels/pdep_kernel.cpp kernels/lz4/lz4_multiple_pdep_kernel.cpp)
     123add_executable(lz4d_ext_dep lz4d_ext_dep.cpp lz4FrameDecoder.cpp kernels/cc_kernel.cpp kernels/lz4/lz4_block_decoder.cpp kernels/sequential_kernel.cpp kernels/lz4/lz4_extract_e_m0.cpp kernels/lz4/lz4_deposit_uncompressed.cpp kernels/lz4/lz4_generate_deposit_stream.cpp kernels/lz4/lz4_numbers_to_bitstream_kernel.cpp kernels/lz4/LZ4MarkerToMaskKernel.cpp kernels/lz4/lz4_bitstream_not_kernel.cpp kernels/pdep_kernel.cpp kernels/lz4/lz4_match_copy_kernel.cpp lz4/LZ4Generator.cpp kernels/lz4/lz4_multiple_pdep_kernel.cpp)
    124124
    125125#Exclude CoRE from default build.
  • icGREP/icgrep-devel/icgrep/character_deposit.cpp

    r5865 r5873  
    3434#include <kernels/deletion.h>
    3535#include <kernels/pdep_kernel.h>
     36#include <kernels/lz4/lz4_multiple_pdep_kernel.h>
    3637
    3738namespace re { class CC; }
     
    131132
    132133    StreamSetBuffer * depositedSwizzle0 = pxDriver.addBuffer<SwizzledCopybackBuffer>(iBuilder, iBuilder->getStreamSetTy(4), outputBufferBlocks, 1);
     134    StreamSetBuffer * depositedSwizzle1 = pxDriver.addBuffer<SwizzledCopybackBuffer>(iBuilder, iBuilder->getStreamSetTy(4), outputBufferBlocks, 1);
     135
     136    /*
    133137    Kernel * pdep0K = pxDriver.addKernelInstance<PDEPkernel>(iBuilder, 4, 4, 64, "pdep0");
    134138    pxDriver.makeKernelCall(pdep0K, {CharacterMarkerBuffer, u16Swizzle0}, {depositedSwizzle0});
    135139
     140    Kernel * pdep1K = pxDriver.addKernelInstance<PDEPkernel>(iBuilder, 4, 4, 64, "pdep1");
     141    pxDriver.makeKernelCall(pdep1K, {CharacterMarkerBuffer, u16Swizzle1}, {u16Swizzle1});
     142    */
    136143
    137     StreamSetBuffer * depositedSwizzle1 = pxDriver.addBuffer<SwizzledCopybackBuffer>(iBuilder, iBuilder->getStreamSetTy(4), outputBufferBlocks, 1);
    138     Kernel * pdep1K = pxDriver.addKernelInstance<PDEPkernel>(iBuilder, 4, 4, 64, "pdep1");
    139     pxDriver.makeKernelCall(pdep1K, {CharacterMarkerBuffer, u16Swizzle1}, {depositedSwizzle1});
     144    Kernel * multiplePdepK = pxDriver.addKernelInstance<LZ4MultiplePDEPkernel>(iBuilder, 4, 2, 4);
     145    pxDriver.makeKernelCall(multiplePdepK, {CharacterMarkerBuffer, u16Swizzle0, u16Swizzle1}, {depositedSwizzle0, depositedSwizzle1});
     146
     147    /*
     148    Kernel * multiplePdepK1 = pxDriver.addKernelInstance<LZ4MultiplePDEPkernel>(iBuilder, 4, 1, 4);
     149    pxDriver.makeKernelCall(multiplePdepK1, {CharacterMarkerBuffer, u16Swizzle0}, {depositedSwizzle0});
     150    Kernel * multiplePdepK2 = pxDriver.addKernelInstance<LZ4MultiplePDEPkernel>(iBuilder, 4, 1, 4);
     151    pxDriver.makeKernelCall(multiplePdepK2, {CharacterMarkerBuffer, u16Swizzle1}, {depositedSwizzle1});
     152    */
    140153
    141154    // Produce unswizzled bit streams
  • icGREP/icgrep-devel/icgrep/kernels/attributes.h

    r5856 r5873  
    132132
    133133
    134 
     134        Swizzled,
     135
     136        // Whether the input streamset is in swizzled form
    135137
    136138
     
    260262    friend Attribute ConditionalRegionBegin();
    261263    friend Attribute ConditionalRegionEnd();
     264    friend Attribute Swizzled();
    262265    friend Attribute CanTerminateEarly();
    263266
     
    353356}
    354357
    355 }
    356 
     358inline Attribute Swizzled() {
     359    return Attribute(Attribute::KindId::Swizzled, 0);
     360}
     361
     362}
    357363
    358364#endif // ATTRIBUTES_H
  • icGREP/icgrep-devel/icgrep/kernels/interface.h

    r5836 r5873  
    6868    bool isMisaligned() const {
    6969        return hasAttribute(AttributeId::Misaligned);
     70    }
     71
     72    bool isSwizzled() const {
     73        return hasAttribute(AttributeId::Swizzled);
    7074    }
    7175
  • icGREP/icgrep-devel/icgrep/kernels/kernel.cpp

    r5865 r5873  
    707707                ub += RateValue(input.getLookahead(), mStride);
    708708            }
    709             Constant * const arraySize = b->getInt64(ceiling(ub));
     709            Value * arraySize = b->getInt64(ceiling(ub));
     710
     711            auto name = input.getName();
     712            if (input.isSwizzled()) {
     713                // TODO workaround to use larger temporary buffer size for swizzled buffer
     714                arraySize = b->CreateMul(arraySize, b->getSize(codegen::BufferSegments * codegen::ThreadNum * codegen::SegmentSize));
     715            }
     716
    710717            AllocaInst * const ptr = b->CreateAlignedAlloca(ty, blockAlignment, arraySize);
    711718            assert (ptr->isStaticAlloca());
     
    834841
    835842            BasicBlock * const entry = b->GetInsertBlock();
    836             BasicBlock * const copyFromBack = b->CreateBasicBlock(name + "CopyFromBack");
    837             BasicBlock * const copyFromFront = b->CreateBasicBlock(name + "CopyFromFront");
    838             BasicBlock * const resume = b->CreateBasicBlock(name + "Resume");
    839843
    840844            Value * strideSize = inputStrideSize[i];
     
    843847                strideSize = b->CreateAdd(strideSize, lookahead);
    844848            }
     849
    845850            Value * const requiresCopy = b->CreateICmpULT(accessible, strideSize);
    846             b->CreateUnlikelyCondBr(requiresCopy, copyFromBack, resume);
    847 
    848             b->SetInsertPoint(copyFromBack);
    849             Value * const arraySize = b->CreateZExt(tempBuffer->getArraySize(), b->getInt64Ty());
    850             Value * const temporarySize = b->CreateTrunc(b->CreateMul(arraySize, b->getInt64(mStride)), accessible->getType());
    851             Value * const copyable = b->CreateUMin(unprocessed, temporarySize); // <- we only really need strideSize items
    852             Value * const offset = b->CreateAnd(processed, BLOCK_WIDTH_MASK);
    853             Value * const bufferSize = b->CreateMul(ConstantExpr::getSizeOf(tempBuffer->getAllocatedType()), arraySize);
    854             b->CreateMemZero(tempBuffer, bufferSize, blockAlignment);
    855             b->CreateStreamCpy(name, tempBuffer, ZERO, mStreamSetInputBaseAddress[i], offset, accessible, getItemAlignment(input));
    856             BasicBlock * const copyToBackEnd = b->GetInsertBlock();
    857             b->CreateCondBr(b->CreateICmpNE(copyable, accessible), copyFromFront, resume);
    858 
    859             b->SetInsertPoint(copyFromFront);
    860             Value * const remaining = b->CreateSub(copyable, accessible);
    861             Value * const baseAddress = b->getBaseAddress(name);
    862             b->CreateStreamCpy(name, tempBuffer, accessible, baseAddress, ZERO, remaining, getItemAlignment(input));
    863             Value * const isPartialStride = b->CreateICmpUGE(copyable, strideSize);
    864             BasicBlock * const copyToFrontEnd = b->GetInsertBlock();
    865             b->CreateBr(resume);
     851
     852            BasicBlock * const resume = b->CreateBasicBlock(name + "Resume");
     853
     854            BasicBlock * copyToBackEnd = NULL;
     855            BasicBlock * copyToFrontEnd = NULL;
     856            Value * isPartialStride = NULL;
     857            Value * newAvailable = NULL;
     858
     859            if (input.isSwizzled()) {
     860                // Copy at least one whole block for Swizzled input stream
     861                BasicBlock * const copyFromBack = b->CreateBasicBlock(name + "CopyFromBack");
     862                BasicBlock * const copyFromFront = b->CreateBasicBlock(name + "CopyFromFront");
     863
     864                b->CreateUnlikelyCondBr(requiresCopy, copyFromBack, resume);
     865
     866                b->SetInsertPoint(copyFromBack);
     867
     868
     869                Value * const arraySize = b->CreateZExt(tempBuffer->getArraySize(), b->getInt64Ty());
     870                Value * const temporarySize = b->CreateTrunc(b->CreateMul(arraySize, b->getInt64(mStride)), accessible->getType());
     871
     872                Value * const processedOffset = b->CreateAnd(processed, BLOCK_WIDTH_MASK);
     873                Value * const copyable = b->CreateUMin(b->CreateAdd(unprocessed, processedOffset), temporarySize); // <- we only really need strideSize items
     874                newAvailable = b->CreateSub(copyable, processedOffset);
     875//                b->CallPrintInt("newAvailable", newAvailable);
     876
     877                Value * const bufferSize = b->CreateMul(ConstantExpr::getSizeOf(tempBuffer->getAllocatedType()), arraySize);
     878                b->CreateMemZero(tempBuffer, bufferSize, blockAlignment);
     879
     880//                b->CallPrintInt("temporarySize", temporarySize);
     881//                b->CallPrintInt("processed", processed);
     882//                b->CallPrintInt("unprocessed", unprocessed);
     883//                b->CallPrintInt("processedOffset", processedOffset);
     884//                b->CallPrintInt("copyable", copyable);
     885
     886//                b->CallPrintInt("streamCpy1", b->getSize(0));
     887                Value* BIT_BLOCK_WIDTH = b->getSize(b->getBitBlockWidth());
     888
     889                Value* copyAmount1 = b->CreateAdd(accessible, processedOffset);
     890                Value* roundCopyAmount = b->CreateMul(b->CreateUDivCeil(copyAmount1, BIT_BLOCK_WIDTH), BIT_BLOCK_WIDTH);
     891                b->CreateStreamCpy(name, tempBuffer, ZERO, mStreamSetInputBaseAddress[i], ZERO, roundCopyAmount, getItemAlignment(input));
     892
     893                copyToBackEnd = b->GetInsertBlock();
     894
     895                b->CreateCondBr(b->CreateICmpNE(copyable, b->CreateAdd(accessible, processedOffset)), copyFromFront, resume);
     896
     897                b->SetInsertPoint(copyFromFront);
     898                Value * const remaining = b->CreateSub(copyable, b->CreateAdd(accessible, processedOffset));
     899                Value * const baseAddress = b->getBaseAddress(name);
     900//                b->CallPrintInt("streamCpy2", b->getSize(0));
     901
     902                auto castedTempBuffer = b->CreatePointerCast(tempBuffer, b->getBitBlockType()->getPointerTo());
     903
     904                auto p = b->CreateGEP(
     905                        castedTempBuffer,
     906                        b->CreateMul(
     907                                b->CreateUDiv(b->CreateAdd(accessible, processedOffset), BIT_BLOCK_WIDTH),
     908                                b->getSize(this->getAnyStreamSetBuffer(name)->getNumOfStreams())
     909                        )
     910                );
     911//                b->CreateStreamCpy(name, tempBuffer, b->CreateAdd(accessible, processedOffset), baseAddress, ZERO, remaining, getItemAlignment(input));
     912
     913
     914                b->CreateStreamCpy(name, p, ZERO, baseAddress, ZERO, b->CreateMul(b->CreateUDivCeil(remaining, BIT_BLOCK_WIDTH), BIT_BLOCK_WIDTH), getItemAlignment(input));
     915                isPartialStride = b->CreateICmpUGE(copyable, strideSize);
     916                copyToFrontEnd = b->GetInsertBlock();
     917
     918
     919
     920                b->CreateBr(resume);
     921            } else {
     922                BasicBlock * const copyFromBack = b->CreateBasicBlock(name + "CopyFromBack");
     923                BasicBlock * const copyFromFront = b->CreateBasicBlock(name + "CopyFromFront");
     924
     925                b->CreateUnlikelyCondBr(requiresCopy, copyFromBack, resume);
     926
     927                b->SetInsertPoint(copyFromBack);
     928                Value * const arraySize = b->CreateZExt(tempBuffer->getArraySize(), b->getInt64Ty());
     929                Value * const temporarySize = b->CreateTrunc(b->CreateMul(arraySize, b->getInt64(mStride)), accessible->getType());
     930                Value * const copyable = b->CreateUMin(unprocessed, temporarySize); // <- we only really need strideSize items
     931                newAvailable = copyable;
     932                Value * const offset = b->CreateAnd(processed, BLOCK_WIDTH_MASK);
     933
     934                Value * const bufferSize = b->CreateMul(ConstantExpr::getSizeOf(tempBuffer->getAllocatedType()), arraySize);
     935                b->CreateMemZero(tempBuffer, bufferSize, blockAlignment);
     936
     937                b->CreateStreamCpy(name, tempBuffer, ZERO, mStreamSetInputBaseAddress[i], offset, accessible, getItemAlignment(input));
     938//            b->CallPrintInt("gep", b->CreateGEP(mStreamSetInputBaseAddress[i], b->CreateUDiv(offset, b->getSize(this->getAnyStreamSetBuffer(name)->getNumOfStreams()))));
     939//            b->CallPrintRegister(name + "_tempBuffer", b->CreateLoad(tempBuffer));
     940                copyToBackEnd = b->GetInsertBlock();
     941                b->CreateCondBr(b->CreateICmpNE(copyable, accessible), copyFromFront, resume);
     942
     943                b->SetInsertPoint(copyFromFront);
     944                Value * const remaining = b->CreateSub(copyable, accessible);
     945                Value * const baseAddress = b->getBaseAddress(name);
     946                b->CreateStreamCpy(name, tempBuffer, accessible, baseAddress, ZERO, remaining, getItemAlignment(input));
     947                isPartialStride = b->CreateICmpUGE(copyable, strideSize);
     948                copyToFrontEnd = b->GetInsertBlock();
     949                b->CreateBr(resume);
     950            }
    866951
    867952            b->SetInsertPoint(resume);
     
    873958            PHINode * const available = b->CreatePHI(accessible->getType(), 3);
    874959            available->addIncoming(accessible, entry);
    875             available->addIncoming(copyable, copyToBackEnd);
    876             available->addIncoming(copyable, copyToFrontEnd);
     960            available->addIncoming(newAvailable, copyToBackEnd);
     961            available->addIncoming(newAvailable, copyToFrontEnd);
    877962            linearlyCopyable[i] = available;
    878963            PHINode * const finalStride = b->CreatePHI(b->getInt1Ty(), 3);
Note: See TracChangeset for help on using the changeset viewer.