onednn-src 0.1.13

Source of oneAPI Deep Neural Network Library (oneDNN)
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
/*******************************************************************************
* Copyright 2016 Intel Corporation
* Copyright 2024-2025 FUJITSU LIMITED
* Copyright 2025-2026 Arm Ltd. and affiliates
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/

#include <assert.h>

#include <initializer_list>

#include "c_types_map.hpp"
#include "memory_desc_wrapper.hpp"
#include "type_helpers.hpp"
#include "utils.hpp"

namespace dnnl {
namespace impl {

status_t fill_blocked(memory_desc_t &md, std::initializer_list<int> perm,
        std::initializer_list<int> inner_blks,
        std::initializer_list<int> inner_idxs) {
    const bool ok = true && perm.size() == (size_t)md.ndims
            && inner_blks.size() == inner_idxs.size();
    if (!ok) return status::invalid_arguments;

    md.offset0 = 0;

    blocking_desc_t &blk = md.format_desc.blocking;

    dim_t block_size = 1;
    dims_t blocks = {0};
    utils::array_set(blocks, 1, md.ndims);

    blk.inner_nblks = (int)inner_blks.size();

    int iblk = 0;
    for (const auto &b : inner_idxs)
        blk.inner_idxs[iblk++] = b;

    iblk = 0;
    for (const auto &b : inner_blks) {
        dim_t dim = blk.inner_idxs[iblk];
        block_size *= b;
        blocks[dim] *= b;
        blk.inner_blks[iblk++] = b;
    }

    utils::array_set(md.padded_offsets, 0, md.ndims);
    for (int d = 0; d < md.ndims; ++d)
        md.padded_dims[d] = is_runtime_value(md.dims[d])
                ? runtime_value_for(md.padded_dims[d])
                : utils::rnd_up(md.dims[d], blocks[d]);

    // tracks max stride for integral overflow checks
    dim_t max_stride = 1;
    int max_stride_d = 0;

    // setting the strides
    {
        dim_t stride = block_size;
        auto iter_d = perm.end(); // reverse iterator over perm
        do {
            const int d = *(--iter_d);
            blk.strides[d] = stride;

            const dim_t pdim = md.padded_dims[d];
            if (any_runtime_value(stride, pdim))
                stride = runtime_value_for(stride);
            else if (pdim != 0)
                stride *= pdim / blocks[d];

            if (max_stride <= stride) {
                max_stride = stride;
                max_stride_d = d;
            }

        } while (iter_d != perm.begin());
    }

    const size_t dt_size = types::data_type_size(md.data_type);

    // guard against integral overflow due to strides exceeding numeric limits
    if (!is_runtime_value(md.padded_dims[max_stride_d])) {
        size_t dim_val = static_cast<size_t>(
                md.padded_dims[max_stride_d] / blocks[max_stride_d]);
        dim_val = dim_val == (size_t)max_stride ? 1 : dim_val;
        if (dim_val > SIZE_MAX / max_stride) return status::invalid_arguments;
        if (dt_size && ((dim_val * max_stride) > SIZE_MAX / dt_size))
            return status::invalid_arguments;
    }

    return status::success;
}

void memory_desc_wrapper::compute_strides_compat(dims_t *strides_compat) const {

    if (ndims() == 0) return;

    const blocking_desc_t &blk = md_->format_desc.blocking;

    dims_t blocks;
    compute_blocks(blocks);

    int perm_idx = 0;
    dims_t inner_perm {};
    bool seen[DNNL_MAX_NDIMS] = {};

    for (int i = 0; i < blk.inner_nblks; i++) {
        dim_t blk_idx = blk.inner_idxs[i];
        if (seen[blk_idx]) continue;

        seen[blk_idx] = true;
        inner_perm[perm_idx] = blk_idx;
        perm_idx++;
    }

    for (int i = 0; i < ndims(); i++)
        if (!seen[i]) {
            inner_perm[perm_idx] = i;
            perm_idx++;
        }

    dims_t inner_strides;
    inner_strides[inner_perm[ndims() - 1]] = 1;
    for (int d = 1; d < ndims(); ++d) {
        const dim_t prev_idx = inner_perm[ndims() - d];
        const dim_t curr_idx = inner_perm[ndims() - 1 - d];

        inner_strides[curr_idx] = blocks[curr_idx] == 0
                ? 1
                : inner_strides[prev_idx]
                        * nstl::max((dim_t)1, blocks[prev_idx]);
    }

    utils::array_copy(strides_compat[0], blk.strides, ndims());
    utils::array_copy(strides_compat[1], inner_strides, ndims());
}

status_t memory_desc_wrapper::compute_blocking(
        memory_desc_t &memory_desc, format_tag_t tag) {
    using namespace format_tag;

    VCHECK_MEMORY((memory_desc.ndims != 0), status::invalid_arguments,
            VERBOSE_BAD_NDIMS, "", 0);

#define C(tag, ... /* perm, inner_blks, inner_idxs */) \
    case tag: return fill_blocked(memory_desc, __VA_ARGS__)

    switch (tag) {
        C(a, {0}, {}, {});
        C(ab, {0, 1}, {}, {});
        C(abc, {0, 1, 2}, {}, {});
        C(abcd, {0, 1, 2, 3}, {}, {});
        C(acbd, {0, 2, 1, 3}, {}, {});
        C(abcde, {0, 1, 2, 3, 4}, {}, {});
        C(abcdef, {0, 1, 2, 3, 4, 5}, {}, {});
        C(abcdefg, {0, 1, 2, 3, 4, 5, 6}, {}, {});
        C(abcdefgh, {0, 1, 2, 3, 4, 5, 6, 7}, {}, {});
        C(abcdefghi, {0, 1, 2, 3, 4, 5, 6, 7, 8}, {}, {});
        C(abcdefghij, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {}, {});
        C(abcdefghijk, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {}, {});
        C(abcdefghijkl, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, {}, {});
        C(abcdefghijlk, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 10}, {}, {});
        C(abcdefghikj, {0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 9}, {}, {});
        C(abcdefghji, {0, 1, 2, 3, 4, 5, 6, 7, 9, 8}, {}, {});
        C(abcdefgih, {0, 1, 2, 3, 4, 5, 6, 8, 7}, {}, {});
        C(abcdefhg, {0, 1, 2, 3, 4, 5, 7, 6}, {}, {});
        C(abcdegf, {0, 1, 2, 3, 4, 6, 5}, {}, {});
        C(abcdfe, {0, 1, 2, 3, 5, 4}, {}, {});
        C(abced, {0, 1, 2, 4, 3}, {}, {});
        C(abdc, {0, 1, 3, 2}, {}, {});
        C(abdec, {0, 1, 3, 4, 2}, {}, {});
        C(abdfce, {0, 1, 3, 5, 2, 4}, {}, {});
        C(acb, {0, 2, 1}, {}, {});
        C(acbde, {0, 2, 1, 3, 4}, {}, {});
        C(acbdef, {0, 2, 1, 3, 4, 5}, {}, {});
        C(abdefc, {0, 1, 3, 4, 5, 2}, {}, {});
        C(acdb, {0, 2, 3, 1}, {}, {});
        C(acdeb, {0, 2, 3, 4, 1}, {}, {});
        C(adbc, {0, 3, 1, 2}, {}, {});
        C(ba, {1, 0}, {}, {});
        C(bac, {1, 0, 2}, {}, {});
        C(bacd, {1, 0, 2, 3}, {}, {});
        C(bacde, {1, 0, 2, 3, 4}, {}, {});
        C(bca, {1, 2, 0}, {}, {});
        C(bcad, {1, 2, 0, 3}, {}, {});
        C(bcda, {1, 2, 3, 0}, {}, {});
        C(bcdea, {1, 2, 3, 4, 0}, {}, {});
        C(cab, {2, 0, 1}, {}, {});
        C(cba, {2, 1, 0}, {}, {});
        C(cabd, {2, 0, 1, 3}, {}, {});
        C(cdab, {2, 3, 0, 1}, {}, {});
        C(cdba, {2, 3, 1, 0}, {}, {});
        C(dabc, {3, 0, 1, 2}, {}, {});
        C(dcab, {3, 2, 0, 1}, {}, {});
        C(cdeab, {2, 3, 4, 0, 1}, {}, {});
        C(cdeba, {2, 3, 4, 1, 0}, {}, {});
        C(decab, {3, 4, 2, 0, 1}, {}, {});
        C(defcab, {3, 4, 5, 2, 0, 1}, {}, {});

        C(Abc4a, {0, 1, 2}, {4}, {0});
        C(aBc4b, {0, 1, 2}, {4}, {1});

        C(Ab4a, {0, 1}, {4}, {0});
        C(Ab8a, {0, 1}, {8}, {0});
        C(Ab32a, {0, 1}, {32}, {0});

        C(BA4b4a, {1, 0}, {4, 4}, {1, 0});
        C(BA8b4a, {1, 0}, {8, 4}, {1, 0});

        C(BA16a16b, {1, 0}, {16, 16}, {0, 1});
        C(BA16a32b, {1, 0}, {16, 32}, {0, 1});
        C(BA16a48b, {1, 0}, {16, 48}, {0, 1});
        C(BA16a64b, {1, 0}, {16, 64}, {0, 1});
        C(BA24b8a, {1, 0}, {24, 8}, {1, 0});
        C(aCB24c8b, {0, 2, 1}, {24, 8}, {2, 1});
        C(abDC24d8c, {0, 1, 3, 2}, {24, 8}, {3, 2});
        C(BA12b8a, {1, 0}, {12, 8}, {1, 0});
        C(aCB12c8b, {0, 2, 1}, {12, 8}, {2, 1});
        C(abDC12d8c, {0, 1, 3, 2}, {12, 8}, {3, 2});
        C(BA16a16b2a, {1, 0}, {16, 16, 2}, {0, 1, 0});
        C(BA16a32b2a, {1, 0}, {16, 32, 2}, {0, 1, 0});
        C(BA16a48b2a, {1, 0}, {16, 48, 2}, {0, 1, 0});
        C(BA16a64b2a, {1, 0}, {16, 64, 2}, {0, 1, 0});
        C(BA16a16b4a, {1, 0}, {16, 16, 4}, {0, 1, 0});
        C(BA16a32b4a, {1, 0}, {16, 32, 4}, {0, 1, 0});
        C(BA16a48b4a, {1, 0}, {16, 48, 4}, {0, 1, 0});
        C(BA16a64b4a, {1, 0}, {16, 64, 4}, {0, 1, 0});
        C(aCB16b16c, {0, 2, 1}, {16, 16}, {1, 2});
        C(aCB16b32c, {0, 2, 1}, {16, 32}, {1, 2});
        C(aCB16b48c, {0, 2, 1}, {16, 48}, {1, 2});
        C(aCB16b64c, {0, 2, 1}, {16, 64}, {1, 2});
        C(aCB16b16c2b, {0, 2, 1}, {16, 16, 2}, {1, 2, 1});
        C(aCB16b32c2b, {0, 2, 1}, {16, 32, 2}, {1, 2, 1});
        C(aCB16b48c2b, {0, 2, 1}, {16, 48, 2}, {1, 2, 1});
        C(aCB16b64c2b, {0, 2, 1}, {16, 64, 2}, {1, 2, 1});
        C(aCB16b16c4b, {0, 2, 1}, {16, 16, 4}, {1, 2, 1});
        C(aCB16b32c4b, {0, 2, 1}, {16, 32, 4}, {1, 2, 1});
        C(aCB16b48c4b, {0, 2, 1}, {16, 48, 4}, {1, 2, 1});
        C(aCB16b64c4b, {0, 2, 1}, {16, 64, 4}, {1, 2, 1});

        C(ABc4b8a4b, {0, 1, 2}, {4, 8, 4}, {1, 0, 1});
        C(AcB4b8a4b, {0, 2, 1}, {4, 8, 4}, {1, 0, 1});
        C(ABc4b16a4b, {0, 1, 2}, {4, 16, 4}, {1, 0, 1});
        C(AcB4b16a4b, {0, 2, 1}, {4, 16, 4}, {1, 0, 1});
        C(ABc4b24a4b, {0, 1, 2}, {4, 24, 4}, {1, 0, 1});
        C(AcB4b24a4b, {0, 2, 1}, {4, 24, 4}, {1, 0, 1});
        C(ABc4b32a4b, {0, 1, 2}, {4, 32, 4}, {1, 0, 1});
        C(AcB4b32a4b, {0, 2, 1}, {4, 32, 4}, {1, 0, 1});
        C(ABc4b64a4b, {0, 1, 2}, {4, 64, 4}, {1, 0, 1});
        C(AcB4b64a4b, {0, 2, 1}, {4, 64, 4}, {1, 0, 1});
        C(ABc2b8a4b, {0, 1, 2}, {2, 8, 4}, {1, 0, 1});
        C(ABc16b16a4b, {0, 1, 2}, {16, 16, 4}, {1, 0, 1});
        C(ABc16b32a4b, {0, 1, 2}, {16, 32, 4}, {1, 0, 1});
        C(ABc16b48a4b, {0, 1, 2}, {16, 48, 4}, {1, 0, 1});
        C(ABc16b64a4b, {0, 1, 2}, {16, 64, 4}, {1, 0, 1});
        C(ABc16b16a2b, {0, 1, 2}, {16, 16, 2}, {1, 0, 1});
        C(ABc16b32a2b, {0, 1, 2}, {16, 32, 2}, {1, 0, 1});
        C(ABc16b48a2b, {0, 1, 2}, {16, 48, 2}, {1, 0, 1});
        C(ABc16b64a2b, {0, 1, 2}, {16, 64, 2}, {1, 0, 1});
        C(ABc16a16b2a, {0, 1, 2}, {16, 16, 2}, {0, 1, 0});
        C(ABc2b8a16b4a, {0, 1, 2}, {2, 8, 16, 4}, {1, 0, 1, 0});
        C(ABcd2b8a16b4a, {0, 1, 2, 3}, {2, 8, 16, 4}, {1, 0, 1, 0});
        C(ABcde2b8a16b4a, {0, 1, 2, 3, 4}, {2, 8, 16, 4}, {1, 0, 1, 0});
        C(ABc2a8b16a4b, {0, 1, 2}, {2, 8, 16, 4}, {0, 1, 0, 1});
        C(ABcd2a8b16a4b, {0, 1, 2, 3}, {2, 8, 16, 4}, {0, 1, 0, 1});
        C(ABcde2a8b16a4b, {0, 1, 2, 3, 4}, {2, 8, 16, 4}, {0, 1, 0, 1});
        C(ABc2a8b16a2b, {0, 1, 2}, {2, 8, 16, 2}, {0, 1, 0, 1});
        C(ABcd2a8b16a2b, {0, 1, 2, 3}, {2, 8, 16, 2}, {0, 1, 0, 1});
        C(ABcde2a8b16a2b, {0, 1, 2, 3, 4}, {2, 8, 16, 2}, {0, 1, 0, 1});
        C(aCBd2c8b16c2b, {0, 2, 1, 3}, {2, 8, 16, 2}, {2, 1, 2, 1});
        C(aCBde2c8b16c2b, {0, 2, 1, 3, 4}, {2, 8, 16, 2}, {2, 1, 2, 1});
        C(aCBdef2c8b16c2b, {0, 2, 1, 3, 4, 5}, {2, 8, 16, 2}, {2, 1, 2, 1});
        C(aBCd2b8c16b2c, {0, 1, 2, 3}, {2, 8, 16, 2}, {1, 2, 1, 2});
        C(aBCde2b8c16b2c, {0, 1, 2, 3, 4}, {2, 8, 16, 2}, {1, 2, 1, 2});
        C(aBCdef2b8c16b2c, {0, 1, 2, 3, 4, 5}, {2, 8, 16, 2}, {1, 2, 1, 2});
        C(aBCd2b8c16b4c, {0, 1, 2, 3}, {2, 8, 16, 4}, {1, 2, 1, 2});
        C(aBCd2c8b16c2b, {0, 1, 2, 3}, {2, 8, 16, 2}, {2, 1, 2, 1});
        C(aBCde2b8c16b4c, {0, 1, 2, 3, 4}, {2, 8, 16, 4}, {1, 2, 1, 2});
        C(ABc4b4a, {0, 1, 2}, {4, 4}, {1, 0});
        C(Abcd4a, {0, 1, 2, 3}, {4}, {0});
        C(aBcd4b, {0, 1, 2, 3}, {4}, {1});
        C(ABcd4b4a, {0, 1, 2, 3}, {4, 4}, {1, 0});
        C(ABcd4a2b, {0, 1, 2, 3}, {4, 2}, {0, 1});
        C(ABcd4a4b, {0, 1, 2, 3}, {4, 4}, {0, 1});
        C(aBCd4c16b4c, {0, 1, 2, 3}, {4, 16, 4}, {2, 1, 2});
        C(aBCd2c8b4c, {0, 1, 2, 3}, {2, 8, 4}, {2, 1, 2});
        C(aBCd16c16b4c, {0, 1, 2, 3}, {16, 16, 4}, {2, 1, 2});
        C(aBCd16c16b2c, {0, 1, 2, 3}, {16, 16, 2}, {2, 1, 2});
        C(aBCd16b16c2b, {0, 1, 2, 3}, {16, 16, 2}, {1, 2, 1});
        C(aBCdef16c16b4c, {0, 1, 2, 3, 4, 5}, {16, 16, 4}, {2, 1, 2});
        C(aBCd4c4b, {0, 1, 2, 3}, {4, 4}, {2, 1});
        C(aBCd4b4c, {0, 1, 2, 3}, {4, 4}, {1, 2});
        C(Abcde4a, {0, 1, 2, 3, 4}, {4}, {0});
        C(aBcde4b, {0, 1, 2, 3, 4}, {4}, {1});
        C(ABcde4b4a, {0, 1, 2, 3, 4}, {4, 4}, {1, 0});
        C(ABcde4a2b, {0, 1, 2, 3, 4}, {4, 2}, {0, 1});
        C(ABcde4a4b, {0, 1, 2, 3, 4}, {4, 4}, {0, 1});
        C(aBCde4c4b, {0, 1, 2, 3, 4}, {4, 4}, {2, 1});
        C(aBcdef4b, {0, 1, 2, 3, 4, 5}, {4}, {1});
        C(aBCdef4c4b, {0, 1, 2, 3, 4, 5}, {4, 4}, {2, 1});
        C(aBCdef4b4c, {0, 1, 2, 3, 4, 5}, {4, 4}, {1, 2});
        C(aBdc4b, {0, 1, 3, 2}, {4}, {1});
        C(aBdec4b, {0, 1, 3, 4, 2}, {4}, {1});
        C(aBdefc4b, {0, 1, 3, 4, 5, 2}, {4}, {1});
        C(Acb4a, {0, 2, 1}, {4}, {0});
        C(Acdb4a, {0, 2, 3, 1}, {4}, {0});
        C(Acdeb4a, {0, 2, 3, 4, 1}, {4}, {0});

        C(AB16b16a, {0, 1}, {16, 16}, {1, 0});
        C(AB16b32a, {0, 1}, {16, 32}, {1, 0});
        C(AB16b48a, {0, 1}, {16, 48}, {1, 0});
        C(AB16b64a, {0, 1}, {16, 64}, {1, 0});
        C(AB8b16a2b, {0, 1}, {8, 16, 2}, {1, 0, 1});
        C(AB8b32a2b, {0, 1}, {8, 32, 2}, {1, 0, 1});
        C(AB8b64a2b, {0, 1}, {8, 64, 2}, {1, 0, 1});
        C(AB4b8a4b, {0, 1}, {4, 8, 4}, {1, 0, 1});
        C(AB4b16a4b, {0, 1}, {4, 16, 4}, {1, 0, 1});
        C(AB4b24a4b, {0, 1}, {4, 24, 4}, {1, 0, 1});
        C(AB16b16a4b, {0, 1}, {16, 16, 4}, {1, 0, 1});
        C(AB16b32a4b, {0, 1}, {16, 32, 4}, {1, 0, 1});
        C(AB16b48a4b, {0, 1}, {16, 48, 4}, {1, 0, 1});
        C(AB16b64a4b, {0, 1}, {16, 64, 4}, {1, 0, 1});
        C(AB16b16a2b, {0, 1}, {16, 16, 2}, {1, 0, 1});
        C(AB16b32a2b, {0, 1}, {16, 32, 2}, {1, 0, 1});
        C(AB16b48a2b, {0, 1}, {16, 48, 2}, {1, 0, 1});
        C(AB16b64a2b, {0, 1}, {16, 64, 2}, {1, 0, 1});
        C(AB4b32a4b, {0, 1}, {4, 32, 4}, {1, 0, 1});
        C(AB4b64a4b, {0, 1}, {4, 64, 4}, {1, 0, 1});
        C(AB32a16b, {0, 1}, {32, 16}, {0, 1});
        C(AB32a32b, {0, 1}, {32, 32}, {0, 1});
        C(AB48a16b, {0, 1}, {48, 16}, {0, 1});
        C(AB48a32b, {0, 1}, {48, 32}, {0, 1});
        C(BA4b8a8b2a, {1, 0}, {4, 8, 8, 2}, {1, 0, 1, 0});
        C(BA4b8a8b4a, {1, 0}, {4, 8, 8, 4}, {1, 0, 1, 0});
        C(BA4b8a16b2a, {1, 0}, {4, 8, 16, 2}, {1, 0, 1, 0});
        C(BA4b8a16b4a, {1, 0}, {4, 8, 16, 4}, {1, 0, 1, 0});
        C(aBC32b16c, {0, 1, 2}, {32, 16}, {1, 2});
        C(aBC32b32c, {0, 1, 2}, {32, 32}, {1, 2});
        C(aBC48b16c, {0, 1, 2}, {48, 16}, {1, 2});
        C(aBC48b32c, {0, 1, 2}, {48, 32}, {1, 2});
        C(aCB4c8b8c2b, {0, 2, 1}, {4, 8, 8, 2}, {2, 1, 2, 1});
        C(aCB4c8b8c4b, {0, 2, 1}, {4, 8, 8, 4}, {2, 1, 2, 1});
        C(aCB4c8b16c2b, {0, 2, 1}, {4, 8, 16, 2}, {2, 1, 2, 1});
        C(aCB4c8b16c4b, {0, 2, 1}, {4, 8, 16, 4}, {2, 1, 2, 1});
        C(Abc16a, {0, 1, 2}, {16}, {0});
        C(ABc16a16b, {0, 1, 2}, {16, 16}, {0, 1});
        C(ABc4a2b, {0, 1, 2}, {4, 2}, {0, 1});
        C(ABc4a4b, {0, 1, 2}, {4, 4}, {0, 1});
        C(aBc16b, {0, 1, 2}, {16}, {1});
        C(aBc32b, {0, 1, 2}, {32}, {1});
        C(ABc16b16a, {0, 1, 2}, {16, 16}, {1, 0});
        C(AcB16b16a, {0, 2, 1}, {16, 16}, {1, 0});
        C(ABc16b32a, {0, 1, 2}, {16, 32}, {1, 0});
        C(AcB16b32a, {0, 2, 1}, {16, 32}, {1, 0});
        C(ABc16b48a, {0, 1, 2}, {16, 48}, {1, 0});
        C(AcB16b48a, {0, 2, 1}, {16, 48}, {1, 0});
        C(ABc16b64a, {0, 1, 2}, {16, 64}, {1, 0});
        C(AcB16b64a, {0, 2, 1}, {16, 64}, {1, 0});
        C(ABc8a16b2a, {0, 1, 2}, {8, 16, 2}, {0, 1, 0});
        C(BAc8a16b2a, {1, 0, 2}, {8, 16, 2}, {0, 1, 0});
        C(ABc8a8b, {0, 1, 2}, {8, 8}, {0, 1});
        C(ABc8a2b, {0, 1, 2}, {8, 2}, {0, 1});
        C(ABc8a4b, {0, 1, 2}, {8, 4}, {0, 1});
        C(aBc8b, {0, 1, 2}, {8}, {1});
        C(ABc8b16a2b, {0, 1, 2}, {8, 16, 2}, {1, 0, 1});
        C(AcB8b16a2b, {0, 2, 1}, {8, 16, 2}, {1, 0, 1});
        C(ABc8b32a2b, {0, 1, 2}, {8, 32, 2}, {1, 0, 1});
        C(AcB8b32a2b, {0, 2, 1}, {8, 32, 2}, {1, 0, 1});
        C(ABc8b64a2b, {0, 1, 2}, {8, 64, 2}, {1, 0, 1});
        C(AcB8b64a2b, {0, 2, 1}, {8, 64, 2}, {1, 0, 1});
        C(ABc8b8a, {0, 1, 2}, {8, 8}, {1, 0});
        C(AcB8b8a, {0, 2, 1}, {8, 8}, {1, 0});
        C(Abcd16a, {0, 1, 2, 3}, {16}, {0});
        C(Abcd8a, {0, 1, 2, 3}, {8}, {0});
        C(Abcd32a, {0, 1, 2, 3}, {32}, {0});
        C(ABcd16a16b, {0, 1, 2, 3}, {16, 16}, {0, 1});
        C(aBcd16b, {0, 1, 2, 3}, {16}, {1});
        C(aBcd32b, {0, 1, 2, 3}, {32}, {1});
        C(ABcd16b16a, {0, 1, 2, 3}, {16, 16}, {1, 0});
        C(AcdB16b16a, {0, 2, 3, 1}, {16, 16}, {1, 0});
        C(ABcd16b32a, {0, 1, 2, 3}, {16, 32}, {1, 0});
        C(AcdB16b32a, {0, 2, 3, 1}, {16, 32}, {1, 0});
        C(ABcd16b48a, {0, 1, 2, 3}, {16, 48}, {1, 0});
        C(AcdB16b48a, {0, 2, 3, 1}, {16, 48}, {1, 0});
        C(ABcd16b64a, {0, 1, 2, 3}, {16, 64}, {1, 0});
        C(AcdB16b64a, {0, 2, 3, 1}, {16, 64}, {1, 0});
        C(aBCd16b16c, {0, 1, 2, 3}, {16, 16}, {1, 2});
        C(aBCd16c16b, {0, 1, 2, 3}, {16, 16}, {2, 1});
        C(ABcd4b8a4b, {0, 1, 2, 3}, {4, 8, 4}, {1, 0, 1});
        C(AcdB4b8a4b, {0, 2, 3, 1}, {4, 8, 4}, {1, 0, 1});
        C(ABcd4b16a4b, {0, 1, 2, 3}, {4, 16, 4}, {1, 0, 1});
        C(AcdB4b16a4b, {0, 2, 3, 1}, {4, 16, 4}, {1, 0, 1});
        C(ABcd4b24a4b, {0, 1, 2, 3}, {4, 24, 4}, {1, 0, 1});
        C(AcdB4b24a4b, {0, 2, 3, 1}, {4, 24, 4}, {1, 0, 1});
        C(ABcd4b32a4b, {0, 1, 2, 3}, {4, 32, 4}, {1, 0, 1});
        C(AcdB4b32a4b, {0, 2, 3, 1}, {4, 32, 4}, {1, 0, 1});
        C(ABcd4b64a4b, {0, 1, 2, 3}, {4, 64, 4}, {1, 0, 1});
        C(AcdB4b64a4b, {0, 2, 3, 1}, {4, 64, 4}, {1, 0, 1});
        C(ABcd2b8a4b, {0, 1, 2, 3}, {2, 8, 4}, {1, 0, 1});
        C(ABcd16b16a4b, {0, 1, 2, 3}, {16, 16, 4}, {1, 0, 1});
        C(ABcd16b32a4b, {0, 1, 2, 3}, {16, 32, 4}, {1, 0, 1});
        C(ABcd16b48a4b, {0, 1, 2, 3}, {16, 48, 4}, {1, 0, 1});
        C(ABcd16b64a4b, {0, 1, 2, 3}, {16, 64, 4}, {1, 0, 1});
        C(ABcd16b16a2b, {0, 1, 2, 3}, {16, 16, 2}, {1, 0, 1});
        C(ABcd16b32a2b, {0, 1, 2, 3}, {16, 32, 2}, {1, 0, 1});
        C(ABcd16b48a2b, {0, 1, 2, 3}, {16, 48, 2}, {1, 0, 1});
        C(ABcd16b64a2b, {0, 1, 2, 3}, {16, 64, 2}, {1, 0, 1});
        C(ABcd16a16b2a, {0, 1, 2, 3}, {16, 16, 2}, {0, 1, 0});
        C(ABcde16b16a2b, {0, 1, 2, 3, 4}, {16, 16, 2}, {1, 0, 1});
        C(ABcde16b32a2b, {0, 1, 2, 3, 4}, {16, 32, 2}, {1, 0, 1});
        C(ABcde16b48a2b, {0, 1, 2, 3, 4}, {16, 48, 2}, {1, 0, 1});
        C(ABcde16b64a2b, {0, 1, 2, 3, 4}, {16, 64, 2}, {1, 0, 1});
        C(ABcd8a16b2a, {0, 1, 2, 3}, {8, 16, 2}, {0, 1, 0});
        C(BAcd8a16b2a, {1, 0, 2, 3}, {8, 16, 2}, {0, 1, 0});
        C(ABcd8a8b, {0, 1, 2, 3}, {8, 8}, {0, 1});
        C(ABcd8a4b, {0, 1, 2, 3}, {8, 4}, {0, 1});
        C(ABcd8a2b, {0, 1, 2, 3}, {8, 2}, {0, 1});
        C(aBcd8b, {0, 1, 2, 3}, {8}, {1});
        C(ABcd8b16a2b, {0, 1, 2, 3}, {8, 16, 2}, {1, 0, 1});
        C(AcdB8b16a2b, {0, 2, 3, 1}, {8, 16, 2}, {1, 0, 1});
        C(ABcd8b32a2b, {0, 1, 2, 3}, {8, 32, 2}, {1, 0, 1});
        C(AcdB8b32a2b, {0, 2, 3, 1}, {8, 32, 2}, {1, 0, 1});
        C(ABcd8b64a2b, {0, 1, 2, 3}, {8, 64, 2}, {1, 0, 1});
        C(AcdB8b64a2b, {0, 2, 3, 1}, {8, 64, 2}, {1, 0, 1});
        C(aBCd8b16c2b, {0, 1, 2, 3}, {8, 16, 2}, {1, 2, 1});
        C(aCBd8b16c2b, {0, 2, 1, 3}, {8, 16, 2}, {1, 2, 1});
        C(ABcd8b8a, {0, 1, 2, 3}, {8, 8}, {1, 0});
        C(AcdB8b8a, {0, 2, 3, 1}, {8, 8}, {1, 0});
        C(aBCd8b8c, {0, 1, 2, 3}, {8, 8}, {1, 2});
        C(aBCd8b2c, {0, 1, 2, 3}, {8, 2}, {1, 2});
        C(aBCd8b4c, {0, 1, 2, 3}, {8, 4}, {1, 2});
        C(aBCd8c16b2c, {0, 1, 2, 3}, {8, 16, 2}, {2, 1, 2});
        C(aBCd8c8b, {0, 1, 2, 3}, {8, 8}, {2, 1});
        C(Abcde16a, {0, 1, 2, 3, 4}, {16}, {0});
        C(Abcde32a, {0, 1, 2, 3, 4}, {32}, {0});
        C(ABcde16a16b, {0, 1, 2, 3, 4}, {16, 16}, {0, 1});
        C(ABcde16a16b2a, {0, 1, 2, 3, 4}, {16, 16, 2}, {0, 1, 0});
        C(aBcde16b, {0, 1, 2, 3, 4}, {16}, {1});
        C(aBcde32b, {0, 1, 2, 3, 4}, {32}, {1});
        C(ABcde16b16a, {0, 1, 2, 3, 4}, {16, 16}, {1, 0});
        C(AcdeB16b16a, {0, 2, 3, 4, 1}, {16, 16}, {1, 0});
        C(ABcde16b32a, {0, 1, 2, 3, 4}, {16, 32}, {1, 0});
        C(AcdeB16b32a, {0, 2, 3, 4, 1}, {16, 32}, {1, 0});
        C(ABcde16b48a, {0, 1, 2, 3, 4}, {16, 48}, {1, 0});
        C(AcdeB16b48a, {0, 2, 3, 4, 1}, {16, 48}, {1, 0});
        C(ABcde16b64a, {0, 1, 2, 3, 4}, {16, 64}, {1, 0});
        C(AcdeB16b64a, {0, 2, 3, 4, 1}, {16, 64}, {1, 0});
        C(aBCde16b16c, {0, 1, 2, 3, 4}, {16, 16}, {1, 2});
        C(aBCde16c16b, {0, 1, 2, 3, 4}, {16, 16}, {2, 1});
        C(aBCde2c8b4c, {0, 1, 2, 3, 4}, {2, 8, 4}, {2, 1, 2});
        C(aBCde4b4c, {0, 1, 2, 3, 4}, {4, 4}, {1, 2});
        C(aBCde4c16b4c, {0, 1, 2, 3, 4}, {4, 16, 4}, {2, 1, 2});
        C(aBCde16c16b4c, {0, 1, 2, 3, 4}, {16, 16, 4}, {2, 1, 2});
        C(aBCde16c16b2c, {0, 1, 2, 3, 4}, {16, 16, 2}, {2, 1, 2});
        C(aBCde16b16c2b, {0, 1, 2, 3, 4}, {16, 16, 2}, {1, 2, 1});
        C(aBCdef16c16b2c, {0, 1, 2, 3, 4, 5}, {16, 16, 2}, {2, 1, 2});
        C(Abcde8a, {0, 1, 2, 3, 4}, {8}, {0});
        C(ABcde8a8b, {0, 1, 2, 3, 4}, {8, 8}, {0, 1});
        C(ABcde8a2b, {0, 1, 2, 3, 4}, {8, 2}, {0, 1});
        C(ABcde8a4b, {0, 1, 2, 3, 4}, {8, 4}, {0, 1});
        C(ABcde32a32b, {0, 1, 2, 3, 4}, {32, 32}, {0, 1});
        C(ABcde40a32b, {0, 1, 2, 3, 4}, {40, 32}, {0, 1});
        C(aBcde8b, {0, 1, 2, 3, 4}, {8}, {1});
        C(ABcde8a16b2a, {0, 1, 2, 3, 4}, {8, 16, 2}, {0, 1, 0});
        C(ABcde8b16a2b, {0, 1, 2, 3, 4}, {8, 16, 2}, {1, 0, 1});
        C(AcdeB8b16a2b, {0, 2, 3, 4, 1}, {8, 16, 2}, {1, 0, 1});
        C(ABcde8b32a2b, {0, 1, 2, 3, 4}, {8, 32, 2}, {1, 0, 1});
        C(AcdeB8b32a2b, {0, 2, 3, 4, 1}, {8, 32, 2}, {1, 0, 1});
        C(ABcde8b64a2b, {0, 1, 2, 3, 4}, {8, 64, 2}, {1, 0, 1});
        C(AcdeB8b64a2b, {0, 2, 3, 4, 1}, {8, 64, 2}, {1, 0, 1});
        C(BAcde8a16b2a, {1, 0, 2, 3, 4}, {8, 16, 2}, {0, 1, 0});
        C(ABcde4b8a4b, {0, 1, 2, 3, 4}, {4, 8, 4}, {1, 0, 1});
        C(AcdeB4b8a4b, {0, 2, 3, 4, 1}, {4, 8, 4}, {1, 0, 1});
        C(ABcde4b16a4b, {0, 1, 2, 3, 4}, {4, 16, 4}, {1, 0, 1});
        C(AcdeB4b16a4b, {0, 2, 3, 4, 1}, {4, 16, 4}, {1, 0, 1});
        C(ABcde4b24a4b, {0, 1, 2, 3, 4}, {4, 24, 4}, {1, 0, 1});
        C(AcdeB4b24a4b, {0, 2, 3, 4, 1}, {4, 24, 4}, {1, 0, 1});
        C(ABcde4b32a4b, {0, 1, 2, 3, 4}, {4, 32, 4}, {1, 0, 1});
        C(AcdeB4b32a4b, {0, 2, 3, 4, 1}, {4, 32, 4}, {1, 0, 1});
        C(ABcde4b64a4b, {0, 1, 2, 3, 4}, {4, 64, 4}, {1, 0, 1});
        C(AcdeB4b64a4b, {0, 2, 3, 4, 1}, {4, 64, 4}, {1, 0, 1});
        C(ABcde16b16a4b, {0, 1, 2, 3, 4}, {16, 16, 4}, {1, 0, 1});
        C(ABcde16b32a4b, {0, 1, 2, 3, 4}, {16, 32, 4}, {1, 0, 1});
        C(ABcde16b48a4b, {0, 1, 2, 3, 4}, {16, 48, 4}, {1, 0, 1});
        C(ABcde16b64a4b, {0, 1, 2, 3, 4}, {16, 64, 4}, {1, 0, 1});
        C(ABcde2b8a4b, {0, 1, 2, 3, 4}, {2, 8, 4}, {1, 0, 1});
        C(aBCde8b16c2b, {0, 1, 2, 3, 4}, {8, 16, 2}, {1, 2, 1});
        C(aCBde8b16c2b, {0, 2, 1, 3, 4}, {8, 16, 2}, {1, 2, 1});
        C(ABcde8b8a, {0, 1, 2, 3, 4}, {8, 8}, {1, 0});
        C(AcdeB8b8a, {0, 2, 3, 4, 1}, {8, 8}, {1, 0});
        C(aBCde8b8c, {0, 1, 2, 3, 4}, {8, 8}, {1, 2});
        C(aBCde8b2c, {0, 1, 2, 3, 4}, {8, 2}, {1, 2});
        C(aBCde8b4c, {0, 1, 2, 3, 4}, {8, 4}, {1, 2});
        C(aBCde8c16b2c, {0, 1, 2, 3, 4}, {8, 16, 2}, {2, 1, 2});
        C(aBCde8c8b, {0, 1, 2, 3, 4}, {8, 8}, {2, 1});
        C(aBcdef16b, {0, 1, 2, 3, 4, 5}, {16}, {1});
        C(aBCdef16b16c, {0, 1, 2, 3, 4, 5}, {16, 16}, {1, 2});
        C(aBCdef16b16c2b, {0, 1, 2, 3, 4, 5}, {16, 16, 2}, {1, 2, 1});
        C(aBCdef16c16b, {0, 1, 2, 3, 4, 5}, {16, 16}, {2, 1});
        C(aBCdef4c16b4c, {0, 1, 2, 3, 4, 5}, {4, 16, 4}, {2, 1, 2});
        C(aBCdef2c8b4c, {0, 1, 2, 3, 4, 5}, {2, 8, 4}, {2, 1, 2});
        C(aBCdef8b8c, {0, 1, 2, 3, 4, 5}, {8, 8}, {1, 2});
        C(aBCdef8b2c, {0, 1, 2, 3, 4, 5}, {8, 2}, {1, 2});
        C(aBCdef8b4c, {0, 1, 2, 3, 4, 5}, {8, 4}, {1, 2});
        C(aBCdef8b16c2b, {0, 1, 2, 3, 4, 5}, {8, 16, 2}, {1, 2, 1});
        C(aBCdef8c16b2c, {0, 1, 2, 3, 4, 5}, {8, 16, 2}, {2, 1, 2});
        C(aCBdef8b16c2b, {0, 2, 1, 3, 4, 5}, {8, 16, 2}, {1, 2, 1});
        C(aBCdef8c8b, {0, 1, 2, 3, 4, 5}, {8, 8}, {2, 1});
        C(aBdc16b, {0, 1, 3, 2}, {16}, {1});
        C(aBdC16b2c, {0, 1, 3, 2}, {16, 2}, {1, 2});
        C(aBdC16b4c, {0, 1, 3, 2}, {16, 4}, {1, 2});
        C(aBdc8b, {0, 1, 3, 2}, {8}, {1});
        C(aBdC8b2c, {0, 1, 3, 2}, {8, 2}, {1, 2});
        C(aBdC8b4c, {0, 1, 3, 2}, {8, 4}, {1, 2});
        C(aBdec16b, {0, 1, 3, 4, 2}, {16}, {1});
        C(aBdeC16b2c, {0, 1, 3, 4, 2}, {16, 2}, {1, 2});
        C(aBdeC16b4c, {0, 1, 3, 4, 2}, {16, 4}, {1, 2});
        C(aBdec8b, {0, 1, 3, 4, 2}, {8}, {1});
        C(aBdeC8b2c, {0, 1, 3, 4, 2}, {8, 2}, {1, 2});
        C(aBdeC8b4c, {0, 1, 3, 4, 2}, {8, 4}, {1, 2});
        C(aBdefc16b, {0, 1, 3, 4, 5, 2}, {16}, {1});
        C(aBdefC16b2c, {0, 1, 3, 4, 5, 2}, {16, 2}, {1, 2});
        C(aBdefC16b4c, {0, 1, 3, 4, 5, 2}, {16, 4}, {1, 2});
        C(aBdefc8b, {0, 1, 3, 4, 5, 2}, {8}, {1});
        C(aBdefC8b2c, {0, 1, 3, 4, 5, 2}, {8, 2}, {1, 2});
        C(aBdefC8b4c, {0, 1, 3, 4, 5, 2}, {8, 4}, {1, 2});
        C(aBdfec16b, {0, 1, 3, 5, 4, 2}, {16}, {1});
        C(aBedc16b, {0, 1, 4, 3, 2}, {16}, {1});
        C(Acb16a, {0, 2, 1}, {16}, {0});
        C(AcB16a2b, {0, 2, 1}, {16, 2}, {0, 1});
        C(AcB16a4b, {0, 2, 1}, {16, 4}, {0, 1});
        C(Acb8a, {0, 2, 1}, {8}, {0});
        C(AcB8a2b, {0, 2, 1}, {8, 2}, {0, 1});
        C(AcB8a4b, {0, 2, 1}, {8, 4}, {0, 1});
        C(aCBd4b4c, {0, 2, 1, 3}, {4, 4}, {1, 2});
        C(aCBd8b8c, {0, 2, 1, 3}, {8, 8}, {1, 2});
        C(aCBd16b16c, {0, 2, 1, 3}, {16, 16}, {1, 2});
        C(aCBde4b4c, {0, 2, 1, 3, 4}, {4, 4}, {1, 2});
        C(aCBde8b8c, {0, 2, 1, 3, 4}, {8, 8}, {1, 2});
        C(aCBde16b16c, {0, 2, 1, 3, 4}, {16, 16}, {1, 2});
        C(Acdb16a, {0, 2, 3, 1}, {16}, {0});
        C(AcdB16a2b, {0, 2, 3, 1}, {16, 2}, {0, 1});
        C(AcdB16a4b, {0, 2, 3, 1}, {16, 4}, {0, 1});
        C(Acdb8a, {0, 2, 3, 1}, {8}, {0});
        C(AcdB8a2b, {0, 2, 3, 1}, {8, 2}, {0, 1});
        C(AcdB8a4b, {0, 2, 3, 1}, {8, 4}, {0, 1});
        C(Acdeb16a, {0, 2, 3, 4, 1}, {16}, {0});
        C(AcdeB16a2b, {0, 2, 3, 4, 1}, {16, 2}, {0, 1});
        C(AcdeB16a4b, {0, 2, 3, 4, 1}, {16, 4}, {0, 1});
        C(Acdeb8a, {0, 2, 3, 4, 1}, {8}, {0});
        C(AcdeB8a2b, {0, 2, 3, 4, 1}, {8, 2}, {0, 1});
        C(AcdeB8a4b, {0, 2, 3, 4, 1}, {8, 4}, {0, 1});
        C(Acedb16a, {0, 2, 4, 3, 1}, {16}, {0});
        C(Adcb16a, {0, 3, 2, 1}, {16}, {0});
        C(BAc4a4b, {1, 0, 2}, {4, 4}, {0, 1});
        C(BAc8a8b, {1, 0, 2}, {8, 8}, {0, 1});
        C(BAc16a16b, {1, 0, 2}, {16, 16}, {0, 1});
        C(BAcd4a4b, {1, 0, 2, 3}, {4, 4}, {0, 1});
        C(BAcd8a8b, {1, 0, 2, 3}, {8, 8}, {0, 1});
        C(BAcd16a16b, {1, 0, 2, 3}, {16, 16}, {0, 1});
        C(ABc32a16b, {0, 1, 2}, {32, 16}, {0, 1});
        C(ABcd32a16b, {0, 1, 2, 3}, {32, 16}, {0, 1});
        C(ABcde32a16b, {0, 1, 2, 3, 4}, {32, 16}, {0, 1});
        C(ABc40a16b, {0, 1, 2}, {40, 16}, {0, 1});
        C(ABcd40a16b, {0, 1, 2, 3}, {40, 16}, {0, 1});
        C(ABcde40a16b, {0, 1, 2, 3, 4}, {40, 16}, {0, 1});
        C(ABc2b32a8b, {0, 1, 2}, {2, 32, 8}, {1, 0, 1});
        C(ABcd2b32a8b, {0, 1, 2, 3}, {2, 32, 8}, {1, 0, 1});
        C(ABcde2b32a8b, {0, 1, 2, 3, 4}, {2, 32, 8}, {1, 0, 1});
        C(aBC2b8c16b2c, {0, 1, 2}, {2, 8, 16, 2}, {1, 2, 1, 2});
        C(ABc40a32b, {0, 1, 2}, {40, 32}, {0, 1});
        C(ABcd40a32b, {0, 1, 2, 3}, {40, 32}, {0, 1});
        C(ABc32a32b, {0, 1, 2}, {32, 32}, {0, 1});
        C(ABcd32a32b, {0, 1, 2, 3}, {32, 32}, {0, 1});
        C(BAcde16b16a, {1, 0, 2, 3, 4}, {16, 16}, {1, 0});
        C(ABc4a8b8a4b, {0, 1, 2}, {4, 8, 8, 4}, {0, 1, 0, 1});
        C(ABcd4a8b8a4b, {0, 1, 2, 3}, {4, 8, 8, 4}, {0, 1, 0, 1});
        C(ABcde4a8b8a4b, {0, 1, 2, 3, 4}, {4, 8, 8, 4}, {0, 1, 0, 1});
        C(BAc4b8a8b4a, {1, 0, 2}, {4, 8, 8, 4}, {1, 0, 1, 0});
        C(BAcd4b8a8b4a, {1, 0, 2, 3}, {4, 8, 8, 4}, {1, 0, 1, 0});
        C(BAcde4b8a8b4a, {1, 0, 2, 3, 4}, {4, 8, 8, 4}, {1, 0, 1, 0});
        C(BAc2b8a16b4a, {1, 0, 2}, {2, 8, 16, 4}, {1, 0, 1, 0});
        C(BAcd2b8a16b4a, {1, 0, 2, 3}, {2, 8, 16, 4}, {1, 0, 1, 0});
        C(BAcde2b8a16b4a, {1, 0, 2, 3, 4}, {2, 8, 16, 4}, {1, 0, 1, 0});
        C(BAc2b8a16b2a, {1, 0, 2}, {2, 8, 16, 2}, {1, 0, 1, 0});
        C(aBCde2c8b16c2b, {0, 1, 2, 3, 4}, {2, 8, 16, 2}, {2, 1, 2, 1});
        C(aBCdef2c8b16c2b, {0, 1, 2, 3, 4, 5}, {2, 8, 16, 2}, {2, 1, 2, 1});
        C(BAcd2b8a16b2a, {1, 0, 2, 3}, {2, 8, 16, 2}, {1, 0, 1, 0});
        C(BAcde2b8a16b2a, {1, 0, 2, 3, 4}, {2, 8, 16, 2}, {1, 0, 1, 0});
        C(aCBd4c8b8c4b, {0, 2, 1, 3}, {4, 8, 8, 4}, {2, 1, 2, 1});
        C(aCBde4c8b8c4b, {0, 2, 1, 3, 4}, {4, 8, 8, 4}, {2, 1, 2, 1});
        C(aCBdef4c8b8c4b, {0, 2, 1, 3, 4, 5}, {4, 8, 8, 4}, {2, 1, 2, 1});
        C(aBCdef4b8c8b4c, {0, 1, 2, 3, 4, 5}, {4, 8, 8, 4}, {1, 2, 1, 2});
        C(ABcd2a8b8a2b, {0, 1, 2, 3}, {2, 8, 8, 2}, {0, 1, 0, 1});
        C(ABcde4a8b8a2b, {0, 1, 2, 3, 4}, {4, 8, 8, 2}, {0, 1, 0, 1});
        C(ABcd4a8b8a2b, {0, 1, 2, 3}, {4, 8, 8, 2}, {0, 1, 0, 1});
        C(ABc4a8b8a2b, {0, 1, 2}, {4, 8, 8, 2}, {0, 1, 0, 1});
        C(aBCdef4b8c8b2c, {0, 1, 2, 3, 4, 5}, {4, 8, 8, 2}, {1, 2, 1, 2});
        C(aBCde4b8c8b2c, {0, 1, 2, 3, 4}, {4, 8, 8, 2}, {1, 2, 1, 2});
        C(aBCd4b8c8b2c, {0, 1, 2, 3}, {4, 8, 8, 2}, {1, 2, 1, 2});
        C(BAcde4b8a8b2a, {1, 0, 2, 3, 4}, {4, 8, 8, 2}, {1, 0, 1, 0});
        C(BAcd4b8a8b2a, {1, 0, 2, 3}, {4, 8, 8, 2}, {1, 0, 1, 0});
        C(BAc4b8a8b2a, {1, 0, 2}, {4, 8, 8, 2}, {1, 0, 1, 0});
        C(aCBdef4c8b8c2b, {0, 2, 1, 3, 4, 5}, {4, 8, 8, 2}, {2, 1, 2, 1});
        C(aCBde4c8b8c2b, {0, 2, 1, 3, 4}, {4, 8, 8, 2}, {2, 1, 2, 1});
        C(aCBd4c8b8c2b, {0, 2, 1, 3}, {4, 8, 8, 2}, {2, 1, 2, 1});
        C(aBCd4b8c8b4c, {0, 1, 2, 3}, {4, 8, 8, 4}, {1, 2, 1, 2});
        C(aBCde4b8c8b4c, {0, 1, 2, 3, 4}, {4, 8, 8, 4}, {1, 2, 1, 2});
        C(aBCde2b8c8b2c, {0, 1, 2, 3, 4}, {2, 8, 8, 2}, {1, 2, 1, 2});
        C(aBdec32b, {0, 1, 3, 4, 2}, {32}, {1});
        C(aCBdef16c16b, {0, 2, 1, 3, 4, 5}, {16, 16}, {2, 1});
        C(aCBdef4b4c, {0, 2, 1, 3, 4, 5}, {4, 4}, {1, 2});
        C(aCBdef8b8c, {0, 2, 1, 3, 4, 5}, {8, 8}, {1, 2});
        C(aCBdef16b16c, {0, 2, 1, 3, 4, 5}, {16, 16}, {1, 2});
        C(Abcdef16a, {0, 1, 2, 3, 4, 5}, {16}, {0});
        C(Abcdef32a, {0, 1, 2, 3, 4, 5}, {32}, {0});
        C(aCBd16c16b, {0, 2, 1, 3}, {16, 16}, {2, 1});
        C(aCBde16c16b, {0, 2, 1, 3, 4}, {16, 16}, {2, 1});
        C(Acdb32a, {0, 2, 3, 1}, {32}, {0});
        C(BAcd16b16a, {1, 0, 2, 3}, {16, 16}, {1, 0});
        C(BAcde4a4b, {1, 0, 2, 3, 4}, {4, 4}, {0, 1});
        C(BAcde8a8b, {1, 0, 2, 3, 4}, {8, 8}, {0, 1});
        C(BAcde16a16b, {1, 0, 2, 3, 4}, {16, 16}, {0, 1});
        C(BAc16b16a, {1, 0, 2}, {16, 16}, {1, 0});
        C(aBCd2b4c2b, {0, 1, 2, 3}, {2, 4, 2}, {1, 2, 1});
        C(aBCde2b4c2b, {0, 1, 2, 3, 4}, {2, 4, 2}, {1, 2, 1});
        C(aBCdef2b4c2b, {0, 1, 2, 3, 4, 5}, {2, 4, 2}, {1, 2, 1});
        C(aBCd2c4b2c, {0, 1, 2, 3}, {2, 4, 2}, {2, 1, 2});
        C(aBCde2c4b2c, {0, 1, 2, 3, 4}, {2, 4, 2}, {2, 1, 2});
        C(aBCdef2c4b2c, {0, 1, 2, 3, 4, 5}, {2, 4, 2}, {2, 1, 2});
        C(aBCd4b8c2b, {0, 1, 2, 3}, {4, 8, 2}, {1, 2, 1});
        C(aBCde4b8c2b, {0, 1, 2, 3, 4}, {4, 8, 2}, {1, 2, 1});
        C(aBCdef4b8c2b, {0, 1, 2, 3, 4, 5}, {4, 8, 2}, {1, 2, 1});
        C(aBCd4c8b2c, {0, 1, 2, 3}, {4, 8, 2}, {2, 1, 2});
        C(aBCde4c8b2c, {0, 1, 2, 3, 4}, {4, 8, 2}, {2, 1, 2});
        C(aBCdef4c8b2c, {0, 1, 2, 3, 4, 5}, {4, 8, 2}, {2, 1, 2});
        C(AB32a32b8a4b, {0, 1}, {32, 32, 8, 4}, {0, 1, 0, 1});
        C(AB8a4b, {0, 1}, {8, 4}, {0, 1});
        C(AB32a32b8a2b, {0, 1}, {32, 32, 8, 2}, {0, 1, 0, 1});
        C(AB8a2b, {0, 1}, {8, 2}, {0, 1});
        C(abDc16d, {0, 1, 3, 2}, {16}, {3});
        C(abDc32d, {0, 1, 3, 2}, {32}, {3});
        C(abDC16d4c, {0, 1, 3, 2}, {16, 4}, {3, 2});
        C(abDC32d4c, {0, 1, 3, 2}, {32, 4}, {3, 2});
        C(abCd4c, {0, 1, 2, 3}, {4}, {2});
        C(abCde4c, {0, 1, 2, 3, 4}, {4}, {2});
        C(abCdef4c, {0, 1, 2, 3, 4, 5}, {4}, {2});
        C(abCd32c, {0, 1, 2, 3}, {32}, {2});
        C(abCde32c, {0, 1, 2, 3, 4}, {32}, {2});
        C(abCdef32c, {0, 1, 2, 3, 4, 5}, {32}, {2});
        C(abdEc16e, {0, 1, 3, 4, 2}, {16}, {4});
        C(abdEc32e, {0, 1, 3, 4, 2}, {32}, {4});
        C(abdEC16e4c, {0, 1, 3, 4, 2}, {16, 4}, {4, 2});
        C(abdEC32e2c, {0, 1, 3, 4, 2}, {32, 2}, {4, 2});
        C(abdEC32e4c, {0, 1, 3, 4, 2}, {32, 4}, {4, 2});
        C(abdEC64e2c, {0, 1, 3, 4, 2}, {64, 2}, {4, 2});
        C(abdEC64e4c, {0, 1, 3, 4, 2}, {64, 4}, {4, 2});
        C(abdCe16c, {0, 1, 3, 2, 4}, {16}, {2});
        C(abdCe32c, {0, 1, 3, 2, 4}, {32}, {2});
        C(abdCE32c2e, {0, 1, 3, 2, 4}, {32, 2}, {2, 4});
        C(ABc16a4b, {0, 1, 2}, {16, 4}, {0, 1});
        C(ABcd16a4b, {0, 1, 2, 3}, {16, 4}, {0, 1});
        C(ABcde16a4b, {0, 1, 2, 3, 4}, {16, 4}, {0, 1});

        C(cBa2b, {2, 1, 0}, {2}, {1});
        C(cBa4b, {2, 1, 0}, {4}, {1});
        C(adcb, {0, 3, 2, 1}, {}, {});
        C(adCb2c, {0, 3, 2, 1}, {2}, {2});
        C(adCb4c, {0, 3, 2, 1}, {4}, {2});
        C(cdBa2b, {2, 3, 1, 0}, {2}, {1});
        C(cdBa4b, {2, 3, 1, 0}, {4}, {1});
        C(adecb, {0, 3, 4, 2, 1}, {}, {});
        C(adeCb2c, {0, 3, 4, 2, 1}, {2}, {2});
        C(adeCb4c, {0, 3, 4, 2, 1}, {4}, {2});
        C(cdeBa2b, {2, 3, 4, 1, 0}, {2}, {1});
        C(cdeBa4b, {2, 3, 4, 1, 0}, {4}, {1});
        C(adefcb, {0, 3, 4, 5, 2, 1}, {}, {});
        C(adefCb2c, {0, 3, 4, 5, 2, 1}, {2}, {2});
        C(adefCb4c, {0, 3, 4, 5, 2, 1}, {4}, {2});
        C(aBdc32b, {0, 1, 3, 2}, {32}, {1});
        C(aBdC32b2c, {0, 1, 3, 2}, {32, 2}, {1, 2});
        C(aBdC32b4c, {0, 1, 3, 2}, {32, 4}, {1, 2});
        C(aBdc48b, {0, 1, 3, 2}, {48}, {1});
        C(aBdC48b2c, {0, 1, 3, 2}, {48, 2}, {1, 2});
        C(aBdC48b4c, {0, 1, 3, 2}, {48, 4}, {1, 2});
        C(aBdc64b, {0, 1, 3, 2}, {64}, {1});
        C(aBdC64b2c, {0, 1, 3, 2}, {64, 2}, {1, 2});
        C(aBdC64b4c, {0, 1, 3, 2}, {64, 4}, {1, 2});
        C(aBdeC32b2c, {0, 1, 3, 4, 2}, {32, 2}, {1, 2});
        C(aBdeC32b4c, {0, 1, 3, 4, 2}, {32, 4}, {1, 2});
        C(aBdec48b, {0, 1, 3, 4, 2}, {48}, {1});
        C(aBdeC48b2c, {0, 1, 3, 4, 2}, {48, 2}, {1, 2});
        C(aBdeC48b4c, {0, 1, 3, 4, 2}, {48, 4}, {1, 2});
        C(aBdec64b, {0, 1, 3, 4, 2}, {64}, {1});
        C(aBdeC64b2c, {0, 1, 3, 4, 2}, {64, 2}, {1, 2});
        C(aBdeC64b4c, {0, 1, 3, 4, 2}, {64, 4}, {1, 2});
        C(aBdefc32b, {0, 1, 3, 4, 5, 2}, {32}, {1});
        C(aBdefC32b2c, {0, 1, 3, 4, 5, 2}, {32, 2}, {1, 2});
        C(aBdefC32b4c, {0, 1, 3, 4, 5, 2}, {32, 4}, {1, 2});
        C(aBdefc48b, {0, 1, 3, 4, 5, 2}, {48}, {1});
        C(aBdefC48b2c, {0, 1, 3, 4, 5, 2}, {48, 2}, {1, 2});
        C(aBdefC48b4c, {0, 1, 3, 4, 5, 2}, {48, 4}, {1, 2});
        C(aBdefc64b, {0, 1, 3, 4, 5, 2}, {64}, {1});
        C(aBdefC64b2c, {0, 1, 3, 4, 5, 2}, {64, 2}, {1, 2});
        C(aBdefC64b4c, {0, 1, 3, 4, 5, 2}, {64, 4}, {1, 2});
        C(Acb32a, {0, 2, 1}, {32}, {0});
        C(AcB32a2b, {0, 2, 1}, {32, 2}, {0, 1});
        C(AcB32a4b, {0, 2, 1}, {32, 4}, {0, 1});
        C(Acb48a, {0, 2, 1}, {48}, {0});
        C(AcB48a2b, {0, 2, 1}, {48, 2}, {0, 1});
        C(AcB48a4b, {0, 2, 1}, {48, 4}, {0, 1});
        C(Acb64a, {0, 2, 1}, {64}, {0});
        C(AcB64a2b, {0, 2, 1}, {64, 2}, {0, 1});
        C(AcB64a4b, {0, 2, 1}, {64, 4}, {0, 1});
        C(AcdB32a2b, {0, 2, 3, 1}, {32, 2}, {0, 1});
        C(AcdB32a4b, {0, 2, 3, 1}, {32, 4}, {0, 1});
        C(Acdb48a, {0, 2, 3, 1}, {48}, {0});
        C(AcdB48a2b, {0, 2, 3, 1}, {48, 2}, {0, 1});
        C(AcdB48a4b, {0, 2, 3, 1}, {48, 4}, {0, 1});
        C(Acdb64a, {0, 2, 3, 1}, {64}, {0});
        C(AcdB64a2b, {0, 2, 3, 1}, {64, 2}, {0, 1});
        C(AcdB64a4b, {0, 2, 3, 1}, {64, 4}, {0, 1});
        C(Acdeb32a, {0, 2, 3, 4, 1}, {32}, {0});
        C(AcdeB32a2b, {0, 2, 3, 4, 1}, {32, 2}, {0, 1});
        C(AcdeB32a4b, {0, 2, 3, 4, 1}, {32, 4}, {0, 1});
        C(Acdeb48a, {0, 2, 3, 4, 1}, {48}, {0});
        C(AcdeB48a2b, {0, 2, 3, 4, 1}, {48, 2}, {0, 1});
        C(AcdeB48a4b, {0, 2, 3, 4, 1}, {48, 4}, {0, 1});
        C(Acdeb64a, {0, 2, 3, 4, 1}, {64}, {0});
        C(AcdeB64a2b, {0, 2, 3, 4, 1}, {64, 2}, {0, 1});
        C(AcdeB64a4b, {0, 2, 3, 4, 1}, {64, 4}, {0, 1});
        C(aBdeC16c16b2c, {0, 1, 3, 4, 2}, {16, 16, 2}, {2, 1, 2});
        C(aBdeC16c16b4c, {0, 1, 3, 4, 2}, {16, 16, 4}, {2, 1, 2});
        C(aBdefC16c16b2c, {0, 1, 3, 4, 5, 2}, {16, 16, 2}, {2, 1, 2});
        C(aBdefC16c16b4c, {0, 1, 3, 4, 5, 2}, {16, 16, 4}, {2, 1, 2});
        C(AcB16b16a2b, {0, 2, 1}, {16, 16, 2}, {1, 0, 1});
        C(AcB16b16a4b, {0, 2, 1}, {16, 16, 4}, {1, 0, 1});
        C(AcdB16b16a2b, {0, 2, 3, 1}, {16, 16, 2}, {1, 0, 1});
        C(AcdB16b16a4b, {0, 2, 3, 1}, {16, 16, 4}, {1, 0, 1});
        C(AcdeB16b16a2b, {0, 2, 3, 4, 1}, {16, 16, 2}, {1, 0, 1});
        C(AcdeB16b16a4b, {0, 2, 3, 4, 1}, {16, 16, 4}, {1, 0, 1});
        C(aBdC16c16b2c, {0, 1, 3, 2}, {16, 16, 2}, {2, 1, 2});
        C(aBdC16c16b4c, {0, 1, 3, 2}, {16, 16, 4}, {2, 1, 2});
        C(aBdC16c32b2c, {0, 1, 3, 2}, {16, 32, 2}, {2, 1, 2});
        C(aBdC16c32b4c, {0, 1, 3, 2}, {16, 32, 4}, {2, 1, 2});
        C(aBdC16c48b2c, {0, 1, 3, 2}, {16, 48, 2}, {2, 1, 2});
        C(aBdC16c48b4c, {0, 1, 3, 2}, {16, 48, 4}, {2, 1, 2});
        C(aBdC16c64b2c, {0, 1, 3, 2}, {16, 64, 2}, {2, 1, 2});
        C(aBdC16c64b4c, {0, 1, 3, 2}, {16, 64, 4}, {2, 1, 2});
        C(aBdeC16c32b2c, {0, 1, 3, 4, 2}, {16, 32, 2}, {2, 1, 2});
        C(aBdeC16c32b4c, {0, 1, 3, 4, 2}, {16, 32, 4}, {2, 1, 2});
        C(aBdeC16c48b2c, {0, 1, 3, 4, 2}, {16, 48, 2}, {2, 1, 2});
        C(aBdeC16c48b4c, {0, 1, 3, 4, 2}, {16, 48, 4}, {2, 1, 2});
        C(aBdeC16c64b2c, {0, 1, 3, 4, 2}, {16, 64, 2}, {2, 1, 2});
        C(aBdeC16c64b4c, {0, 1, 3, 4, 2}, {16, 64, 4}, {2, 1, 2});
        C(aBdefC16c32b2c, {0, 1, 3, 4, 5, 2}, {16, 32, 2}, {2, 1, 2});
        C(aBdefC16c32b4c, {0, 1, 3, 4, 5, 2}, {16, 32, 4}, {2, 1, 2});
        C(aBdefC16c48b2c, {0, 1, 3, 4, 5, 2}, {16, 48, 2}, {2, 1, 2});
        C(aBdefC16c48b4c, {0, 1, 3, 4, 5, 2}, {16, 48, 4}, {2, 1, 2});
        C(aBdefC16c64b2c, {0, 1, 3, 4, 5, 2}, {16, 64, 2}, {2, 1, 2});
        C(aBdefC16c64b4c, {0, 1, 3, 4, 5, 2}, {16, 64, 4}, {2, 1, 2});
        C(AcB16b32a2b, {0, 2, 1}, {16, 32, 2}, {1, 0, 1});
        C(AcB16b32a4b, {0, 2, 1}, {16, 32, 4}, {1, 0, 1});
        C(AcB16b48a2b, {0, 2, 1}, {16, 48, 2}, {1, 0, 1});
        C(AcB16b48a4b, {0, 2, 1}, {16, 48, 4}, {1, 0, 1});
        C(AcB16b64a2b, {0, 2, 1}, {16, 64, 2}, {1, 0, 1});
        C(AcB16b64a4b, {0, 2, 1}, {16, 64, 4}, {1, 0, 1});
        C(AcdB16b32a2b, {0, 2, 3, 1}, {16, 32, 2}, {1, 0, 1});
        C(AcdB16b32a4b, {0, 2, 3, 1}, {16, 32, 4}, {1, 0, 1});
        C(AcdB16b48a2b, {0, 2, 3, 1}, {16, 48, 2}, {1, 0, 1});
        C(AcdB16b48a4b, {0, 2, 3, 1}, {16, 48, 4}, {1, 0, 1});
        C(AcdB16b64a2b, {0, 2, 3, 1}, {16, 64, 2}, {1, 0, 1});
        C(AcdB16b64a4b, {0, 2, 3, 1}, {16, 64, 4}, {1, 0, 1});
        C(AcdeB16b32a2b, {0, 2, 3, 4, 1}, {16, 32, 2}, {1, 0, 1});
        C(AcdeB16b32a4b, {0, 2, 3, 4, 1}, {16, 32, 4}, {1, 0, 1});
        C(AcdeB16b48a2b, {0, 2, 3, 4, 1}, {16, 48, 2}, {1, 0, 1});
        C(AcdeB16b48a4b, {0, 2, 3, 4, 1}, {16, 48, 4}, {1, 0, 1});
        C(AcdeB16b64a2b, {0, 2, 3, 4, 1}, {16, 64, 2}, {1, 0, 1});
        C(AcdeB16b64a4b, {0, 2, 3, 4, 1}, {16, 64, 4}, {1, 0, 1});
        C(decbA16a, {3, 4, 2, 1, 0}, {16}, {0});
        C(decbA8a, {3, 4, 2, 1, 0}, {8}, {0});
        C(decbA4a, {3, 4, 2, 1, 0}, {4}, {0});
        C(defcbA16a, {3, 4, 5, 2, 1, 0}, {16}, {0});
        C(defcbA8a, {3, 4, 5, 2, 1, 0}, {8}, {0});
        C(defcbA4a, {3, 4, 5, 2, 1, 0}, {4}, {0});
        C(aCB16c2b, {0, 2, 1}, {16, 2}, {2, 1});
        C(aCB16c4b, {0, 2, 1}, {16, 4}, {2, 1});
        C(BA16b2a, {1, 0}, {16, 2}, {1, 0});
        C(BA16b4a, {1, 0}, {16, 4}, {1, 0});
        C(aBC16b16c, {0, 1, 2}, {16, 16}, {1, 2});
        C(aBC16b32c, {0, 1, 2}, {16, 32}, {1, 2});
        C(AB16a16b, {0, 1}, {16, 16}, {0, 1});
        C(AB16a32b, {0, 1}, {16, 32}, {0, 1});
        C(ABcd16a32b, {0, 1, 2, 3}, {16, 32}, {0, 1});

        C(aCdefB16b32c2b, {0, 2, 3, 4, 5, 1}, {16, 32, 2}, {1, 2, 1});
        C(aCdefB16b32c4b, {0, 2, 3, 4, 5, 1}, {16, 32, 4}, {1, 2, 1});
        C(aCdefB16b48c2b, {0, 2, 3, 4, 5, 1}, {16, 48, 2}, {1, 2, 1});
        C(aCdefB16b48c4b, {0, 2, 3, 4, 5, 1}, {16, 48, 4}, {1, 2, 1});
        C(aCdefB16b64c2b, {0, 2, 3, 4, 5, 1}, {16, 64, 2}, {1, 2, 1});
        C(aCdefB16b64c4b, {0, 2, 3, 4, 5, 1}, {16, 64, 4}, {1, 2, 1});
        C(BcdeA16a32b2a, {1, 2, 3, 4, 0}, {16, 32, 2}, {0, 1, 0});
        C(BcdeA16a32b4a, {1, 2, 3, 4, 0}, {16, 32, 4}, {0, 1, 0});
        C(BcdeA16a48b2a, {1, 2, 3, 4, 0}, {16, 48, 2}, {0, 1, 0});
        C(BcdeA16a48b4a, {1, 2, 3, 4, 0}, {16, 48, 4}, {0, 1, 0});
        C(BcdeA16a64b2a, {1, 2, 3, 4, 0}, {16, 64, 2}, {0, 1, 0});
        C(BcdeA16a64b4a, {1, 2, 3, 4, 0}, {16, 64, 4}, {0, 1, 0});
        C(aCdefb32c, {0, 2, 3, 4, 5, 1}, {32}, {2});
        C(aCdefB32c2b, {0, 2, 3, 4, 5, 1}, {32, 2}, {2, 1});
        C(aCdefB32c4b, {0, 2, 3, 4, 5, 1}, {32, 4}, {2, 1});
        C(aCdefb48c, {0, 2, 3, 4, 5, 1}, {48}, {2});
        C(aCdefB48c2b, {0, 2, 3, 4, 5, 1}, {48, 2}, {2, 1});
        C(aCdefB48c4b, {0, 2, 3, 4, 5, 1}, {48, 4}, {2, 1});
        C(aCdefb64c, {0, 2, 3, 4, 5, 1}, {64}, {2});
        C(aCdefB64c2b, {0, 2, 3, 4, 5, 1}, {64, 2}, {2, 1});
        C(aCdefB64c4b, {0, 2, 3, 4, 5, 1}, {64, 4}, {2, 1});
        C(Bcdea32b, {1, 2, 3, 4, 0}, {32}, {1});
        C(BcdeA32b2a, {1, 2, 3, 4, 0}, {32, 2}, {1, 0});
        C(BcdeA32b4a, {1, 2, 3, 4, 0}, {32, 4}, {1, 0});
        C(Bcdea48b, {1, 2, 3, 4, 0}, {48}, {1});
        C(BcdeA48b2a, {1, 2, 3, 4, 0}, {48, 2}, {1, 0});
        C(BcdeA48b4a, {1, 2, 3, 4, 0}, {48, 4}, {1, 0});
        C(Bcdea64b, {1, 2, 3, 4, 0}, {64}, {1});
        C(BcdeA64b2a, {1, 2, 3, 4, 0}, {64, 2}, {1, 0});
        C(BcdeA64b4a, {1, 2, 3, 4, 0}, {64, 4}, {1, 0});
        C(Bca32b, {1, 2, 0}, {32}, {1});
        C(BcA32b2a, {1, 2, 0}, {32, 2}, {1, 0});
        C(BcA32b4a, {1, 2, 0}, {32, 4}, {1, 0});
        C(Bca48b, {1, 2, 0}, {48}, {1});
        C(BcA48b2a, {1, 2, 0}, {48, 2}, {1, 0});
        C(BcA48b4a, {1, 2, 0}, {48, 4}, {1, 0});
        C(Bca64b, {1, 2, 0}, {64}, {1});
        C(BcA64b2a, {1, 2, 0}, {64, 2}, {1, 0});
        C(BcA64b4a, {1, 2, 0}, {64, 4}, {1, 0});
        C(aCdb32c, {0, 2, 3, 1}, {32}, {2});
        C(aCdB32c2b, {0, 2, 3, 1}, {32, 2}, {2, 1});
        C(aCdB32c4b, {0, 2, 3, 1}, {32, 4}, {2, 1});
        C(aCdb48c, {0, 2, 3, 1}, {48}, {2});
        C(aCdB48c2b, {0, 2, 3, 1}, {48, 2}, {2, 1});
        C(aCdB48c4b, {0, 2, 3, 1}, {48, 4}, {2, 1});
        C(aCdb64c, {0, 2, 3, 1}, {64}, {2});
        C(aCdB64c2b, {0, 2, 3, 1}, {64, 2}, {2, 1});
        C(aCdB64c4b, {0, 2, 3, 1}, {64, 4}, {2, 1});
        C(BcA16a16b2a, {1, 2, 0}, {16, 16, 2}, {0, 1, 0});
        C(BcA16a16b4a, {1, 2, 0}, {16, 16, 4}, {0, 1, 0});
        C(BcdA16a16b2a, {1, 2, 3, 0}, {16, 16, 2}, {0, 1, 0});
        C(BcdA16a16b4a, {1, 2, 3, 0}, {16, 16, 4}, {0, 1, 0});
        C(BcdeA16a16b2a, {1, 2, 3, 4, 0}, {16, 16, 2}, {0, 1, 0});
        C(BcdeA16a16b4a, {1, 2, 3, 4, 0}, {16, 16, 4}, {0, 1, 0});
        C(aCdB16b16c2b, {0, 2, 3, 1}, {16, 16, 2}, {1, 2, 1});
        C(aCdB16b16c4b, {0, 2, 3, 1}, {16, 16, 4}, {1, 2, 1});
        C(aCdeB16b16c2b, {0, 2, 3, 4, 1}, {16, 16, 2}, {1, 2, 1});
        C(aCdeB16b16c4b, {0, 2, 3, 4, 1}, {16, 16, 4}, {1, 2, 1});
        C(aCdefB16b16c2b, {0, 2, 3, 4, 5, 1}, {16, 16, 2}, {1, 2, 1});
        C(aCdefB16b16c4b, {0, 2, 3, 4, 5, 1}, {16, 16, 4}, {1, 2, 1});
        C(BcA16a32b2a, {1, 2, 0}, {16, 32, 2}, {0, 1, 0});
        C(BcA16a32b4a, {1, 2, 0}, {16, 32, 4}, {0, 1, 0});
        C(BcA16a48b2a, {1, 2, 0}, {16, 48, 2}, {0, 1, 0});
        C(BcA16a48b4a, {1, 2, 0}, {16, 48, 4}, {0, 1, 0});
        C(BcA16a64b2a, {1, 2, 0}, {16, 64, 2}, {0, 1, 0});
        C(BcA16a64b4a, {1, 2, 0}, {16, 64, 4}, {0, 1, 0});
        C(aCdB16b32c2b, {0, 2, 3, 1}, {16, 32, 2}, {1, 2, 1});
        C(aCdB16b32c4b, {0, 2, 3, 1}, {16, 32, 4}, {1, 2, 1});
        C(aCdB16b48c2b, {0, 2, 3, 1}, {16, 48, 2}, {1, 2, 1});
        C(aCdB16b48c4b, {0, 2, 3, 1}, {16, 48, 4}, {1, 2, 1});
        C(aCdB16b64c2b, {0, 2, 3, 1}, {16, 64, 2}, {1, 2, 1});
        C(aCdB16b64c4b, {0, 2, 3, 1}, {16, 64, 4}, {1, 2, 1});
        C(BcdA16a32b2a, {1, 2, 3, 0}, {16, 32, 2}, {0, 1, 0});
        C(BcdA16a32b4a, {1, 2, 3, 0}, {16, 32, 4}, {0, 1, 0});
        C(BcdA16a48b2a, {1, 2, 3, 0}, {16, 48, 2}, {0, 1, 0});
        C(BcdA16a48b4a, {1, 2, 3, 0}, {16, 48, 4}, {0, 1, 0});
        C(BcdA16a64b2a, {1, 2, 3, 0}, {16, 64, 2}, {0, 1, 0});
        C(BcdA16a64b4a, {1, 2, 3, 0}, {16, 64, 4}, {0, 1, 0});
        C(aCdeB16b32c2b, {0, 2, 3, 4, 1}, {16, 32, 2}, {1, 2, 1});
        C(aCdeB16b32c4b, {0, 2, 3, 4, 1}, {16, 32, 4}, {1, 2, 1});
        C(aCdeB16b48c2b, {0, 2, 3, 4, 1}, {16, 48, 2}, {1, 2, 1});
        C(aCdeB16b48c4b, {0, 2, 3, 4, 1}, {16, 48, 4}, {1, 2, 1});
        C(aCdeB16b64c2b, {0, 2, 3, 4, 1}, {16, 64, 2}, {1, 2, 1});
        C(aCdeB16b64c4b, {0, 2, 3, 4, 1}, {16, 64, 4}, {1, 2, 1});
        C(Bca8b, {1, 2, 0}, {8}, {1});
        C(BcA8b2a, {1, 2, 0}, {8, 2}, {1, 0});
        C(BcA8b4a, {1, 2, 0}, {8, 4}, {1, 0});
        C(Bcda8b, {1, 2, 3, 0}, {8}, {1});
        C(BcdA8b2a, {1, 2, 3, 0}, {8, 2}, {1, 0});
        C(BcdA8b4a, {1, 2, 3, 0}, {8, 4}, {1, 0});
        C(Bcdea8b, {1, 2, 3, 4, 0}, {8}, {1});
        C(BcdeA8b2a, {1, 2, 3, 4, 0}, {8, 2}, {1, 0});
        C(BcdeA8b4a, {1, 2, 3, 4, 0}, {8, 4}, {1, 0});
        C(aCdb8c, {0, 2, 3, 1}, {8}, {2});
        C(aCdB8c2b, {0, 2, 3, 1}, {8, 2}, {2, 1});
        C(aCdB8c4b, {0, 2, 3, 1}, {8, 4}, {2, 1});
        C(aCdeb8c, {0, 2, 3, 4, 1}, {8}, {2});
        C(aCdeB8c2b, {0, 2, 3, 4, 1}, {8, 2}, {2, 1});
        C(aCdeB8c4b, {0, 2, 3, 4, 1}, {8, 4}, {2, 1});
        C(aCdefb8c, {0, 2, 3, 4, 5, 1}, {8}, {2});
        C(aCdefB8c2b, {0, 2, 3, 4, 5, 1}, {8, 2}, {2, 1});
        C(aCdefB8c4b, {0, 2, 3, 4, 5, 1}, {8, 4}, {2, 1});
        C(Bca16b, {1, 2, 0}, {16}, {1});
        C(BcA16b2a, {1, 2, 0}, {16, 2}, {1, 0});
        C(BcA16b4a, {1, 2, 0}, {16, 4}, {1, 0});
        C(Bcda16b, {1, 2, 3, 0}, {16}, {1});
        C(BcdA16b2a, {1, 2, 3, 0}, {16, 2}, {1, 0});
        C(BcdA16b4a, {1, 2, 3, 0}, {16, 4}, {1, 0});
        C(Bcdea16b, {1, 2, 3, 4, 0}, {16}, {1});
        C(BcdeA16b2a, {1, 2, 3, 4, 0}, {16, 2}, {1, 0});
        C(BcdeA16b4a, {1, 2, 3, 4, 0}, {16, 4}, {1, 0});
        C(aCdb16c, {0, 2, 3, 1}, {16}, {2});
        C(aCdB16c2b, {0, 2, 3, 1}, {16, 2}, {2, 1});
        C(aCdB16c4b, {0, 2, 3, 1}, {16, 4}, {2, 1});
        C(aCdeb16c, {0, 2, 3, 4, 1}, {16}, {2});
        C(aCdeB16c2b, {0, 2, 3, 4, 1}, {16, 2}, {2, 1});
        C(aCdeB16c4b, {0, 2, 3, 4, 1}, {16, 4}, {2, 1});
        C(aCdefb16c, {0, 2, 3, 4, 5, 1}, {16}, {2});
        C(aCdefB16c2b, {0, 2, 3, 4, 5, 1}, {16, 2}, {2, 1});
        C(aCdefB16c4b, {0, 2, 3, 4, 5, 1}, {16, 4}, {2, 1});
        C(Bca24b, {1, 2, 0}, {24}, {1});
        C(BcA24b2a, {1, 2, 0}, {24, 2}, {1, 0});
        C(BcA24b4a, {1, 2, 0}, {24, 4}, {1, 0});
        C(Bcda24b, {1, 2, 3, 0}, {24}, {1});
        C(BcdA24b2a, {1, 2, 3, 0}, {24, 2}, {1, 0});
        C(BcdA24b4a, {1, 2, 3, 0}, {24, 4}, {1, 0});
        C(Bcdea24b, {1, 2, 3, 4, 0}, {24}, {1});
        C(BcdeA24b2a, {1, 2, 3, 4, 0}, {24, 2}, {1, 0});
        C(BcdeA24b4a, {1, 2, 3, 4, 0}, {24, 4}, {1, 0});
        C(aCdb24c, {0, 2, 3, 1}, {24}, {2});
        C(aCdB24c2b, {0, 2, 3, 1}, {24, 2}, {2, 1});
        C(aCdB24c4b, {0, 2, 3, 1}, {24, 4}, {2, 1});
        C(aCdeb24c, {0, 2, 3, 4, 1}, {24}, {2});
        C(aCdeB24c2b, {0, 2, 3, 4, 1}, {24, 2}, {2, 1});
        C(aCdeB24c4b, {0, 2, 3, 4, 1}, {24, 4}, {2, 1});
        C(aCdefb24c, {0, 2, 3, 4, 5, 1}, {24}, {2});
        C(aCdefB24c2b, {0, 2, 3, 4, 5, 1}, {24, 2}, {2, 1});
        C(aCdefB24c4b, {0, 2, 3, 4, 5, 1}, {24, 4}, {2, 1});
        C(Bcda32b, {1, 2, 3, 0}, {32}, {1});
        C(BcdA32b2a, {1, 2, 3, 0}, {32, 2}, {1, 0});
        C(BcdA32b4a, {1, 2, 3, 0}, {32, 4}, {1, 0});
        C(Bcda48b, {1, 2, 3, 0}, {48}, {1});
        C(BcdA48b2a, {1, 2, 3, 0}, {48, 2}, {1, 0});
        C(BcdA48b4a, {1, 2, 3, 0}, {48, 4}, {1, 0});
        C(Bcda64b, {1, 2, 3, 0}, {64}, {1});
        C(BcdA64b2a, {1, 2, 3, 0}, {64, 2}, {1, 0});
        C(BcdA64b4a, {1, 2, 3, 0}, {64, 4}, {1, 0});
        C(aCdeb32c, {0, 2, 3, 4, 1}, {32}, {2});
        C(aCdeB32c2b, {0, 2, 3, 4, 1}, {32, 2}, {2, 1});
        C(aCdeB32c4b, {0, 2, 3, 4, 1}, {32, 4}, {2, 1});
        C(aCdeb48c, {0, 2, 3, 4, 1}, {48}, {2});
        C(aCdeB48c2b, {0, 2, 3, 4, 1}, {48, 2}, {2, 1});
        C(aCdeB48c4b, {0, 2, 3, 4, 1}, {48, 4}, {2, 1});
        C(aCdeb64c, {0, 2, 3, 4, 1}, {64}, {2});
        C(aCdeB64c2b, {0, 2, 3, 4, 1}, {64, 2}, {2, 1});
        C(aCdeB64c4b, {0, 2, 3, 4, 1}, {64, 4}, {2, 1});

        C(Acb24a, {0, 2, 1}, {24}, {0});
        C(Acdb24a, {0, 2, 3, 1}, {24}, {0});
        C(Acdeb24a, {0, 2, 3, 4, 1}, {24}, {0});
        C(aBdc24b, {0, 1, 3, 2}, {24}, {1});
        C(aBdec24b, {0, 1, 3, 4, 2}, {24}, {1});
        C(aBdefc24b, {0, 1, 3, 4, 5, 2}, {24}, {1});
        C(AcB24a2b, {0, 2, 1}, {24, 2}, {0, 1});
        C(AcdB24a2b, {0, 2, 3, 1}, {24, 2}, {0, 1});
        C(AcdeB24a2b, {0, 2, 3, 4, 1}, {24, 2}, {0, 1});
        C(aBdC24b2c, {0, 1, 3, 2}, {24, 2}, {1, 2});
        C(aBdeC24b2c, {0, 1, 3, 4, 2}, {24, 2}, {1, 2});
        C(aBdefC24b2c, {0, 1, 3, 4, 5, 2}, {24, 2}, {1, 2});
        C(AcB24a4b, {0, 2, 1}, {24, 4}, {0, 1});
        C(AcdB24a4b, {0, 2, 3, 1}, {24, 4}, {0, 1});
        C(AcdeB24a4b, {0, 2, 3, 4, 1}, {24, 4}, {0, 1});
        C(aBdC24b4c, {0, 1, 3, 2}, {24, 4}, {1, 2});
        C(aBdeC24b4c, {0, 1, 3, 4, 2}, {24, 4}, {1, 2});
        C(aBdefC24b4c, {0, 1, 3, 4, 5, 2}, {24, 4}, {1, 2});

        C(AB8b32a, {0, 1}, {8, 32}, {1, 0});
        C(ABc8b32a, {0, 1, 2}, {8, 32}, {1, 0});
        C(AcB8b32a, {0, 2, 1}, {8, 32}, {1, 0});
        C(ABcd8b32a, {0, 1, 2, 3}, {8, 32}, {1, 0});
        C(AcdB8b32a, {0, 2, 3, 1}, {8, 32}, {1, 0});
        C(ABcde8b32a, {0, 1, 2, 3, 4}, {8, 32}, {1, 0});
        C(AcdeB8b32a, {0, 2, 3, 4, 1}, {8, 32}, {1, 0});
        C(AB8b24a, {0, 1}, {8, 24}, {1, 0});
        C(ABc8b24a, {0, 1, 2}, {8, 24}, {1, 0});
        C(AcB8b24a, {0, 2, 1}, {8, 24}, {1, 0});
        C(ABcd8b24a, {0, 1, 2, 3}, {8, 24}, {1, 0});
        C(AcdB8b24a, {0, 2, 3, 1}, {8, 24}, {1, 0});
        C(ABcde8b24a, {0, 1, 2, 3, 4}, {8, 24}, {1, 0});
        C(AcdeB8b24a, {0, 2, 3, 4, 1}, {8, 24}, {1, 0});
        C(AB8b16a, {0, 1}, {8, 16}, {1, 0});
        C(ABc8b16a, {0, 1, 2}, {8, 16}, {1, 0});
        C(AcB8b16a, {0, 2, 1}, {8, 16}, {1, 0});
        C(ABcd8b16a, {0, 1, 2, 3}, {8, 16}, {1, 0});
        C(AcdB8b16a, {0, 2, 3, 1}, {8, 16}, {1, 0});
        C(ABcde8b16a, {0, 1, 2, 3, 4}, {8, 16}, {1, 0});
        C(AcdeB8b16a, {0, 2, 3, 4, 1}, {8, 16}, {1, 0});
        C(AB8b8a, {0, 1}, {8, 8}, {1, 0});

        C(AB8b24a2b, {0, 1}, {8, 24, 2}, {1, 0, 1});
        C(ABc8b24a2b, {0, 1, 2}, {8, 24, 2}, {1, 0, 1});
        C(AcB8b24a2b, {0, 2, 1}, {8, 24, 2}, {1, 0, 1});
        C(ABcd8b24a2b, {0, 1, 2, 3}, {8, 24, 2}, {1, 0, 1});
        C(AcdB8b24a2b, {0, 2, 3, 1}, {8, 24, 2}, {1, 0, 1});
        C(ABcde8b24a2b, {0, 1, 2, 3, 4}, {8, 24, 2}, {1, 0, 1});
        C(AcdeB8b24a2b, {0, 2, 3, 4, 1}, {8, 24, 2}, {1, 0, 1});
        C(AB8b8a2b, {0, 1}, {8, 8, 2}, {1, 0, 1});
        C(ABc8b8a2b, {0, 1, 2}, {8, 8, 2}, {1, 0, 1});
        C(AcB8b8a2b, {0, 2, 1}, {8, 8, 2}, {1, 0, 1});
        C(ABcd8b8a2b, {0, 1, 2, 3}, {8, 8, 2}, {1, 0, 1});
        C(AcdB8b8a2b, {0, 2, 3, 1}, {8, 8, 2}, {1, 0, 1});
        C(ABcde8b8a2b, {0, 1, 2, 3, 4}, {8, 8, 2}, {1, 0, 1});
        C(AcdeB8b8a2b, {0, 2, 3, 4, 1}, {8, 8, 2}, {1, 0, 1});
        C(BA2a24b, {1, 0}, {2, 24}, {0, 1});
        C(BA2a8b, {1, 0}, {2, 8}, {0, 1});
        C(aCB2b24c, {0, 2, 1}, {2, 24}, {1, 2});
        C(aCB2b8c, {0, 2, 1}, {2, 8}, {1, 2});
        C(BA8a24b, {1, 0}, {8, 24}, {0, 1});
        C(BA8a16b, {1, 0}, {8, 16}, {0, 1});
        C(BA8a8b, {1, 0}, {8, 8}, {0, 1});
        C(aCB8b24c, {0, 2, 1}, {8, 24}, {1, 2});
        C(aCB8b16c, {0, 2, 1}, {8, 16}, {1, 2});
        C(aCB8b8c, {0, 2, 1}, {8, 8}, {1, 2});
        C(BA16b8a, {1, 0}, {16, 8}, {1, 0});
        C(BA8b8a, {1, 0}, {8, 8}, {1, 0});
        C(BA4b8a, {1, 0}, {4, 8}, {1, 0});
        C(aCB16c8b, {0, 2, 1}, {16, 8}, {2, 1});
        C(aCB8c8b, {0, 2, 1}, {8, 8}, {2, 1});
        C(aCB4c8b, {0, 2, 1}, {4, 8}, {2, 1});
        C(abDC16d8c, {0, 1, 3, 2}, {16, 8}, {3, 2});
        C(abDC8d8c, {0, 1, 3, 2}, {8, 8}, {3, 2});
        C(abDC4d8c, {0, 1, 3, 2}, {4, 8}, {3, 2});
        C(AB2a4b, {0, 1}, {2, 4}, {0, 1});
        default: break;
    }

#undef C

    return status::invalid_arguments;
}

} // namespace impl
} // namespace dnnl

// vim: et ts=4 sw=4 cindent cino+=l0,\:4,N-s