diff -Nru ceph-0.67.4/ceph.spec ceph-0.67.7/ceph.spec --- ceph-0.67.4/ceph.spec 2013-10-03 23:26:10.000000000 +0000 +++ ceph-0.67.7/ceph.spec 2014-02-19 20:14:08.000000000 +0000 @@ -9,7 +9,7 @@ # common ################################################################################# Name: ceph -Version: 0.67.4 +Version: 0.67.7 Release: 0%{?dist} Summary: User space components of the Ceph file system License: GPL-2.0 @@ -125,7 +125,6 @@ %else BuildRequires: expat-devel BuildRequires: fcgi-devel -Requires: mod_fcgid %endif %description radosgw radosgw is an S3 HTTP REST gateway for the RADOS object store. It is @@ -319,7 +318,7 @@ install -m 0644 -D udev/50-rbd.rules $RPM_BUILD_ROOT/lib/udev/rules.d/50-rbd.rules install -m 0644 -D udev/60-ceph-partuuid-workaround.rules $RPM_BUILD_ROOT/lib/udev/rules.d/60-ceph-partuuid-workaround.rules -%if 0%{?centos} +%if (0%{?rhel} || 0%{?rhel} < 7) install -m 0644 -D udev/95-ceph-osd-alt.rules $RPM_BUILD_ROOT/lib/udev/rules.d/95-ceph-osd.rules %else install -m 0644 -D udev/95-ceph-osd.rules $RPM_BUILD_ROOT/lib/udev/rules.d/95-ceph-osd.rules diff -Nru ceph-0.67.4/ceph.spec.in ceph-0.67.7/ceph.spec.in --- ceph-0.67.4/ceph.spec.in 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/ceph.spec.in 2014-02-19 20:12:47.000000000 +0000 @@ -125,7 +125,6 @@ %else BuildRequires: expat-devel BuildRequires: fcgi-devel -Requires: mod_fcgid %endif %description radosgw radosgw is an S3 HTTP REST gateway for the RADOS object store. It is @@ -319,7 +318,7 @@ install -m 0644 -D udev/50-rbd.rules $RPM_BUILD_ROOT/lib/udev/rules.d/50-rbd.rules install -m 0644 -D udev/60-ceph-partuuid-workaround.rules $RPM_BUILD_ROOT/lib/udev/rules.d/60-ceph-partuuid-workaround.rules -%if 0%{?centos} +%if (0%{?rhel} || 0%{?rhel} < 7) install -m 0644 -D udev/95-ceph-osd-alt.rules $RPM_BUILD_ROOT/lib/udev/rules.d/95-ceph-osd.rules %else install -m 0644 -D udev/95-ceph-osd.rules $RPM_BUILD_ROOT/lib/udev/rules.d/95-ceph-osd.rules diff -Nru ceph-0.67.4/configure ceph-0.67.7/configure --- ceph-0.67.4/configure 2013-10-03 23:25:57.000000000 +0000 +++ ceph-0.67.7/configure 2014-02-19 20:13:56.000000000 +0000 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.68 for ceph 0.67.4. +# Generated by GNU Autoconf 2.68 for ceph 0.67.7. # # Report bugs to . # @@ -570,8 +570,8 @@ # Identity of this package. PACKAGE_NAME='ceph' PACKAGE_TARNAME='ceph' -PACKAGE_VERSION='0.67.4' -PACKAGE_STRING='ceph 0.67.4' +PACKAGE_VERSION='0.67.7' +PACKAGE_STRING='ceph 0.67.7' PACKAGE_BUGREPORT='ceph-devel@vger.kernel.org' PACKAGE_URL='' @@ -1410,7 +1410,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures ceph 0.67.4 to adapt to many kinds of systems. +\`configure' configures ceph 0.67.7 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1481,7 +1481,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of ceph 0.67.4:";; + short | recursive ) echo "Configuration of ceph 0.67.7:";; esac cat <<\_ACEOF @@ -1620,7 +1620,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -ceph configure 0.67.4 +ceph configure 0.67.7 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. @@ -2258,7 +2258,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by ceph $as_me 0.67.4, which was +It was created by ceph $as_me 0.67.7, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ @@ -3242,7 +3242,7 @@ # Define the identity of the package. PACKAGE='ceph' - VERSION='0.67.4' + VERSION='0.67.7' cat >>confdefs.h <<_ACEOF @@ -11940,7 +11940,7 @@ # Define the identity of the package. PACKAGE='ceph' - VERSION='0.67.4' + VERSION='0.67.7' cat >>confdefs.h <<_ACEOF @@ -20738,7 +20738,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by ceph $as_me 0.67.4, which was +This file was extended by ceph $as_me 0.67.7, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -20804,7 +20804,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -ceph config.status 0.67.4 +ceph config.status 0.67.7 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" diff -Nru ceph-0.67.4/configure.ac ceph-0.67.7/configure.ac --- ceph-0.67.4/configure.ac 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/configure.ac 2014-02-19 20:12:47.000000000 +0000 @@ -8,7 +8,7 @@ # VERSION define is not used by the code. It gets a version string # from 'git describe'; see src/ceph_ver.[ch] -AC_INIT([ceph], [0.67.4], [ceph-devel@vger.kernel.org]) +AC_INIT([ceph], [0.67.7], [ceph-devel@vger.kernel.org]) # Create release string. Used with VERSION for RPMs. RPM_RELEASE=0 diff -Nru ceph-0.67.4/debian/changelog ceph-0.67.7/debian/changelog --- ceph-0.67.4/debian/changelog 2014-01-29 09:22:30.000000000 +0000 +++ ceph-0.67.7/debian/changelog 2014-04-09 16:03:08.000000000 +0000 @@ -1,8 +1,15 @@ -ceph (0.67.4-0ubuntu2.2~cloud0) precise-havana; urgency=low +ceph (0.67.7-0ubuntu1~cloud0) precise-havana; urgency=medium * New update for the Ubuntu Cloud Archive. - -- Openstack Ubuntu Testing Bot Wed, 29 Jan 2014 04:22:30 -0500 + -- Openstack Ubuntu Testing Bot Wed, 09 Apr 2014 12:03:08 -0400 + +ceph (0.67.7-0ubuntu1) saucy; urgency=medium + + * New upstream point release (LP: #1298290): + - d/p/*: Dropped, no longer required. + + -- James Page Thu, 27 Mar 2014 11:48:10 +0000 ceph (0.67.4-0ubuntu2.2) saucy-proposed; urgency=medium diff -Nru ceph-0.67.4/debian/patches/aarch64.diff ceph-0.67.7/debian/patches/aarch64.diff --- ceph-0.67.4/debian/patches/aarch64.diff 2013-11-27 19:55:52.000000000 +0000 +++ ceph-0.67.7/debian/patches/aarch64.diff 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -Index: ceph-0.67.4/src/common/crc32c-intel.c -=================================================================== ---- ceph-0.67.4.orig/src/common/crc32c-intel.c 2013-10-03 23:00:26.000000000 +0000 -+++ ceph-0.67.4/src/common/crc32c-intel.c 2013-10-13 01:39:00.637076169 +0000 -@@ -8,7 +8,7 @@ - - - /* this probably isn't specific enough for x86_64? fix me someday */ --#ifdef __LP64__ -+#ifdef __x86_64__ - - /* - * * Based on a posting to lkml by Austin Zhang diff -Nru ceph-0.67.4/debian/patches/series ceph-0.67.7/debian/patches/series --- ceph-0.67.4/debian/patches/series 2013-11-27 19:55:52.000000000 +0000 +++ ceph-0.67.7/debian/patches/series 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -aarch64.diff diff -Nru ceph-0.67.4/src/ceph_common.sh ceph-0.67.7/src/ceph_common.sh --- ceph-0.67.4/src/ceph_common.sh 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/ceph_common.sh 2014-02-19 20:12:46.000000000 +0000 @@ -50,6 +50,10 @@ #echo host for $name is $host, i am $hostname + if [ -e "/var/lib/ceph/$type/ceph-$id/upstart" ]; then + return 1 + fi + # sysvinit managed instance in standard location? if [ -e "/var/lib/ceph/$type/ceph-$id/sysvinit" ]; then host="$hostname" diff -Nru ceph-0.67.4/src/ceph-disk ceph-0.67.7/src/ceph-disk --- ceph-0.67.4/src/ceph-disk 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/ceph-disk 2014-02-19 20:12:46.000000000 +0000 @@ -1,4 +1,20 @@ #!/usr/bin/env python +# +# Copyright (C) 2014 Inktank +# Copyright (C) 2014 Cloudwatt +# +# Author: Loic Dachary +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Library Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Library Public License for more details. +# import argparse import errno @@ -55,7 +71,6 @@ """ - CEPH_OSD_ONDISK_MAGIC = 'ceph osd volume v026' JOURNAL_UUID = '45b0969e-9b03-4f30-b4c6-b4b80ceff106' @@ -97,8 +112,13 @@ 'sysvinit', 'systemd', 'auto', + 'none', ] +STATEDIR = '/var/lib/ceph' + +SYSCONFDIR = '/etc/ceph' + # Nuke the TERM variable to avoid confusing any subprocesses we call. # For example, libreadline will print weird control sequences for some # TERM values. @@ -130,11 +150,6 @@ fcntl.lockf(self.fd, fcntl.LOCK_UN) self.fd = None - -prepare_lock = filelock('/var/lib/ceph/tmp/ceph-disk.prepare.lock') -activate_lock = filelock('/var/lib/ceph/tmp/ceph-disk.activate.lock') - - ###### exceptions ######## class Error(Exception): @@ -174,8 +189,20 @@ class FilesystemTypeError(Error): """ Cannot discover filesystem type + """ + +class CephDiskException(Exception): + """ + A base exception for ceph-disk to provide custom (ad-hoc) messages that + will be caught and dealt with when main() is executed """ + pass +class ExecutableNotFound(CephDiskException): + """ + Exception to report on executables not available in PATH + """ + pass ####### utils @@ -198,6 +225,120 @@ raise +def which(executable): + """find the location of an executable""" + if 'PATH' in os.environ: + envpath = os.environ['PATH'] + else: + envpath = os.defpath + PATH = envpath.split(os.pathsep) + + locations = PATH + [ + '/usr/local/bin', + '/bin', + '/usr/bin', + '/usr/local/sbin', + '/usr/sbin', + '/sbin', + ] + + for location in locations: + executable_path = os.path.join(location, executable) + if os.path.exists(executable_path): + return executable_path + + +def _get_command_executable(arguments): + """ + Return the full path for an executable, raise if the executable is not + found. If the executable has already a full path do not perform any checks. + """ + if arguments[0].startswith('/'): # an absolute path + return arguments + executable = which(arguments[0]) + if not executable: + command_msg = 'Could not run command: %s' % ' '.join(arguments) + executable_msg = '%s not in path.' % arguments[0] + raise ExecutableNotFound('%s %s' % (executable_msg, command_msg)) + + # swap the old executable for the new one + arguments[0] = executable + return arguments + + +def command(arguments, **kwargs): + """ + Safely execute a ``subprocess.Popen`` call making sure that the + executable exists and raising a helpful error message + if it does not. + + .. note:: This should be the prefered way of calling ``subprocess.Popen`` + since it provides the caller with the safety net of making sure that + executables *will* be found and will error nicely otherwise. + + This returns the output of the command and the return code of the + process in a tuple: (output, returncode). + """ + arguments = _get_command_executable(arguments) + + process = subprocess.Popen( + arguments, + stdout=subprocess.PIPE, + **kwargs) + out, _ = process.communicate() + return out, process.returncode + + +def command_check_call(arguments): + """ + Safely execute a ``subprocess.check_call`` call making sure that the + executable exists and raising a helpful error message if it does not. + + .. note:: This should be the prefered way of calling + ``subprocess.check_call`` since it provides the caller with the safety net + of making sure that executables *will* be found and will error nicely + otherwise. + """ + arguments = _get_command_executable(arguments) + return subprocess.check_call(arguments) + + +def platform_distro(): + """ + Returns a normalized, lower case string without any leading nor trailing + whitespace that represents the distribution name of the current machine. + """ + distro = platform_information()[0] or '' + return distro.strip().lower() + + +def platform_information(): + distro, release, codename = platform.linux_distribution() + if not codename and 'debian' in distro.lower(): # this could be an empty string in Debian + debian_codenames = { + '8': 'jessie', + '7': 'wheezy', + '6': 'squeeze', + } + major_version = release.split('.')[0] + codename = debian_codenames.get(major_version, '') + + # In order to support newer jessie/sid or wheezy/sid strings we test this + # if sid is buried in the minor, we should use sid anyway. + if not codename and '/' in release: + major, minor = release.split('/') + if minor == 'sid': + codename = minor + else: + codename = major + + return ( + str(distro).strip(), + str(release).strip(), + str(codename).strip() + ) + + # a device "name" is something like # sdb # cciss!c0d1 @@ -253,6 +394,9 @@ """ dev_part_list = {} for name in os.listdir('/sys/block'): + # /dev/fd0 may hang http://tracker.ceph.com/issues/6827 + if re.match(r'^fd\d$', name): + continue if not os.path.exists(os.path.join('/sys/block', name, 'device')): continue dev_part_list[name] = list_partitions(name) @@ -432,7 +576,7 @@ Ensures osd id is numeric. """ if not re.match(r'^[0-9]+$', osd_id): - raise Error('osd id is not numeric') + raise Error('osd id is not numeric', osd_id) def allocate_osd_id( @@ -451,7 +595,7 @@ try: osd_id = _check_output( args=[ - '/usr/bin/ceph', + 'ceph', '--cluster', cluster, '--name', 'client.bootstrap-osd', '--keyring', keyring, @@ -460,7 +604,7 @@ ], ) except subprocess.CalledProcessError as e: - raise Error('ceph osd create failed', e) + raise Error('ceph osd create failed', e, e.output) osd_id = must_be_one_line(osd_id) check_osd_id(osd_id) return osd_id @@ -476,17 +620,10 @@ return osd_id -def _check_output(*args, **kwargs): - process = subprocess.Popen( - stdout=subprocess.PIPE, - *args, **kwargs) - out, _ = process.communicate() - ret = process.wait() +def _check_output(args=None, **kwargs): + out, ret = command(args, **kwargs) if ret: - cmd = kwargs.get("args") - if cmd is None: - cmd = args[0] - #raise subprocess.CalledProcessError(ret, cmd, output=out) + cmd = args[0] error = subprocess.CalledProcessError(ret, cmd) error.output = out raise error @@ -502,9 +639,9 @@ :return: The variable value or None. """ try: - process = subprocess.Popen( - args=[ - '/usr/bin/ceph-conf', + out, ret = command( + [ + 'ceph-conf', '--cluster={cluster}'.format( cluster=cluster, ), @@ -512,19 +649,16 @@ '--lookup', variable, ], - stdout=subprocess.PIPE, close_fds=True, ) except OSError as e: raise Error('error executing ceph-conf', e) - (out, _err) = process.communicate() - ret = process.wait() if ret == 1: # config entry not found return None elif ret != 0: raise Error('getting variable from configuration failed') - value = str(out).split('\n', 1)[0] + value = out.split('\n', 1)[0] # don't differentiate between "var=" and no var set if not value: return None @@ -567,10 +701,10 @@ :return: The fsid or raises Error. """ - fsid = get_conf(cluster=cluster, variable='fsid') + fsid = get_conf_with_default(cluster=cluster, variable='fsid') if fsid is None: raise Error('getting cluster uuid from configuration failed') - return fsid + return fsid.lower() def get_or_create_dmcrypt_key( @@ -622,7 +756,7 @@ rawdev, ] try: - subprocess.check_call(args) + command_check_call(args) return dev except subprocess.CalledProcessError as e: @@ -642,7 +776,7 @@ ] try: - subprocess.check_call(args) + command_check_call(args) except subprocess.CalledProcessError as e: raise Error('unable to unmap device', _uuid, e) @@ -664,12 +798,12 @@ # mount path = tempfile.mkdtemp( prefix='mnt.', - dir='/var/lib/ceph/tmp', + dir=STATEDIR + '/tmp', ) try: LOG.debug('Mounting %s on %s with options %s', dev, path, options) - subprocess.check_call( - args=[ + command_check_call( + [ 'mount', '-t', fstype, '-o', options, @@ -696,8 +830,8 @@ """ try: LOG.debug('Unmounting %s', path) - subprocess.check_call( - args=[ + command_check_call( + [ '/bin/umount', '--', path, @@ -738,7 +872,7 @@ lines = str(lines).splitlines(True) # work around buggy libreadline(?) library in rhel/centos. - idiot_prefix = '\x1b\x5b\x3f\x31\x30\x33\x34\x68'; + idiot_prefix = '\x1b\x5b\x3f\x31\x30\x33\x34\x68' if lines[0].startswith(idiot_prefix): lines[0] = lines[0][8:] @@ -777,16 +911,16 @@ dev_file.seek(-size, os.SEEK_END) dev_file.write(size*'\0') - subprocess.check_call( - args=[ + command_check_call( + [ 'sgdisk', '--zap-all', '--clear', '--mbrtogpt', '--', dev, - ], - ) + ], + ) except subprocess.CalledProcessError as e: raise Error(e) @@ -834,8 +968,8 @@ try: LOG.debug('Creating journal partition num %d size %d on %s', num, journal_size, journal) - subprocess.check_call( - args=[ + command_check_call( + [ 'sgdisk', '--new={part}'.format(part=journal_part), '--change-name={num}:ceph journal'.format(num=num), @@ -847,25 +981,42 @@ num=num, uuid=ptype, ), + '--mbrtogpt', '--', journal, - ], - ) + ], + ) # try to make sure the kernel refreshes the table. note # that if this gets ebusy, we are probably racing with # udev because it already updated it.. ignore failure here. - LOG.debug('Calling partprobe on prepared device %s', journal) - subprocess.call( - args=[ - 'partprobe', - journal, - ], - ) + + # On RHEL and CentOS distros, calling partprobe forces a reboot of the + # server. Since we are not resizing partitons so we rely on calling + # partx + if platform_distro().startswith(('centos', 'red')): + LOG.info('calling partx on prepared device %s', journal) + LOG.info('re-reading known partitions will display errors') + command( + [ + 'partx', + '-a', + journal, + ], + ) + + else: + LOG.debug('Calling partprobe on prepared device %s', journal) + command( + [ + 'partprobe', + journal, + ], + ) # wait for udev event queue to clear - subprocess.call( - args=[ + command( + [ 'udevadm', 'settle', ], @@ -888,15 +1039,12 @@ def prepare_journal_file( - journal, - journal_size): + journal): if not os.path.exists(journal): - LOG.debug('Creating journal file %s with size %dM', journal, journal_size) + LOG.debug('Creating journal file %s with size 0 (ceph-osd will resize and allocate)', journal) with file(journal, 'wb') as journal_file: - journal_file.truncate(journal_size * 1048576) - - # FIXME: should we resize an existing journal file? + pass LOG.debug('Journal is file %s', journal) LOG.warning('OSD will not be hot-swappable if journal is not the same device as the osd data') @@ -921,20 +1069,20 @@ if not os.path.exists(journal): if force_dev: raise Error('Journal does not exist; not a block device', journal) - return prepare_journal_file(journal, journal_size) + return prepare_journal_file(journal) jmode = os.stat(journal).st_mode if stat.S_ISREG(jmode): if force_dev: raise Error('Journal is not a block device', journal) - return prepare_journal_file(journal, journal_size) + return prepare_journal_file(journal) if stat.S_ISBLK(jmode): if force_file: raise Error('Journal is not a regular file', journal) return prepare_journal_dev(data, journal, journal_size, journal_uuid, journal_dm_keypath) - raise Error('Journal %s is neither a block device nor regular file', journal) + raise Error('Journal %s is neither a block device nor regular file' % journal) def adjust_symlink(target, path): @@ -969,7 +1117,12 @@ journal_uuid, journal_dmcrypt = None, ): - LOG.debug('Preparing osd data dir %s', path) + + if os.path.exists(os.path.join(path, 'magic')): + LOG.debug('Data dir %s already exists', path) + return + else: + LOG.debug('Preparing osd data dir %s', path) if osd_uuid is None: osd_uuid = str(uuid.uuid4()) @@ -988,12 +1141,14 @@ write_one_line(path, 'ceph_fsid', cluster_uuid) write_one_line(path, 'fsid', osd_uuid) - write_one_line(path, 'magic', CEPH_OSD_ONDISK_MAGIC) if journal_uuid is not None: # i.e., journal is a tagged partition write_one_line(path, 'journal_uuid', journal_uuid) + write_one_line(path, 'magic', CEPH_OSD_ONDISK_MAGIC) + + def prepare_dev( data, journal, @@ -1029,8 +1184,8 @@ else: LOG.debug('Creating osd partition on %s', data) try: - subprocess.check_call( - args=[ + command_check_call( + [ 'sgdisk', '--largest-new=1', '--change-name=1:ceph data', @@ -1040,10 +1195,10 @@ '--typecode=1:%s' % ptype_tobe, '--', data, - ], - ) - subprocess.call( - args=[ + ], + ) + command( + [ # wait for udev event queue to clear 'udevadm', 'settle', @@ -1078,7 +1233,7 @@ ]) try: LOG.debug('Creating %s fs on %s', fstype, dev) - subprocess.check_call(args=args) + command_check_call(args) except subprocess.CalledProcessError as e: raise Error(e) @@ -1105,14 +1260,14 @@ if not is_partition(data): try: - subprocess.check_call( - args=[ + command_check_call( + [ 'sgdisk', '--typecode=1:%s' % ptype_osd, '--', data, - ], - ) + ], + ) except subprocess.CalledProcessError as e: raise Error(e) @@ -1124,7 +1279,10 @@ try: prepare_lock.acquire() if not os.path.exists(args.data): - raise Error('data path does not exist', args.data) + if args.data_dev: + raise Error('data path does not exist', args.data) + else: + os.mkdir(args.data) # in use? dmode = os.stat(args.data).st_mode @@ -1257,14 +1415,30 @@ # try to make sure the kernel refreshes the table. note # that if this gets ebusy, we are probably racing with # udev because it already updated it.. ignore failure here. - LOG.debug('Calling partprobe on prepared device %s', args.data) - subprocess.call( - args=[ - 'partprobe', - args.data, - ], - ) + # On RHEL and CentOS distros, calling partprobe forces a reboot of + # the server. Since we are not resizing partitons so we rely on + # calling partx + if platform_distro().startswith(('centos', 'red')): + LOG.info('calling partx on prepared device %s', args.data) + LOG.info('re-reading known partitions will display errors') + + command( + [ + 'partx', + '-a', + args.data, + ], + ) + + else: + LOG.debug('Calling partprobe on prepared device %s', args.data) + command( + [ + 'partprobe', + args.data, + ], + ) except Error as e: if journal_dm_keypath: @@ -1286,9 +1460,9 @@ keyring, ): monmap = os.path.join(path, 'activate.monmap') - subprocess.check_call( - args=[ - '/usr/bin/ceph', + command_check_call( + [ + 'ceph', '--cluster', cluster, '--name', 'client.bootstrap-osd', '--keyring', keyring, @@ -1296,9 +1470,9 @@ ], ) - subprocess.check_call( - args=[ - '/usr/bin/ceph-osd', + command_check_call( + [ + 'ceph-osd', '--cluster', cluster, '--mkfs', '--mkkey', @@ -1322,9 +1496,9 @@ ): try: # try dumpling+ cap scheme - subprocess.check_call( - args=[ - '/usr/bin/ceph', + command_check_call( + [ + 'ceph', '--cluster', cluster, '--name', 'client.bootstrap-osd', '--keyring', keyring, @@ -1335,11 +1509,11 @@ ], ) except subprocess.CalledProcessError as err: - if err.errno == errno.EACCES: + if err.returncode == errno.EACCES: # try old cap scheme - subprocess.check_call( - args=[ - '/usr/bin/ceph', + command_check_call( + [ + 'ceph', '--cluster', cluster, '--name', 'client.bootstrap-osd', '--keyring', keyring, @@ -1362,7 +1536,7 @@ mount_options, ): LOG.debug('Moving mount to final location...') - parent = '/var/lib/ceph/osd' + parent = STATEDIR + '/osd' osd_data = os.path.join( parent, '{cluster}-{osd_id}'.format(cluster=cluster, osd_id=osd_id), @@ -1379,8 +1553,8 @@ # /etc/mtab, which *still* isn't a symlink to /proc/mounts despite # this being 2013. Instead, mount the original device at the final # location. - subprocess.check_call( - args=[ + command_check_call( + [ '/bin/mount', '-o', mount_options, @@ -1389,8 +1563,8 @@ osd_data, ], ) - subprocess.check_call( - args=[ + command_check_call( + [ '/bin/umount', '-l', # lazy, in case someone else is peeking at the # wrong moment @@ -1406,14 +1580,14 @@ ): LOG.debug('Starting %s osd.%s...', cluster, osd_id) - path = '/var/lib/ceph/osd/{cluster}-{osd_id}'.format( + path = (STATEDIR + '/osd/{cluster}-{osd_id}').format( cluster=cluster, osd_id=osd_id) # upstart? try: if os.path.exists(os.path.join(path,'upstart')): - subprocess.check_call( - args=[ + command_check_call( + [ '/sbin/initctl', # use emit, not start, because start would fail if the # instance was already running @@ -1433,8 +1607,8 @@ svc = '/usr/sbin/service' else: svc = '/sbin/service' - subprocess.check_call( - args=[ + command_check_call( + [ svc, 'ceph', 'start', @@ -1517,16 +1691,16 @@ other = False src_dev = os.stat(path).st_dev try: - dst_dev = os.stat('/var/lib/ceph/osd/{cluster}-{osd_id}'.format( + dst_dev = os.stat((STATEDIR + '/osd/{cluster}-{osd_id}').format( cluster=cluster, osd_id=osd_id)).st_dev if src_dev == dst_dev: active = True else: - parent_dev = os.stat('/var/lib/ceph/osd').st_dev + parent_dev = os.stat(STATEDIR + '/osd').st_dev if dst_dev != parent_dev: other = True - elif os.listdir('/var/lib/ceph/osd/{cluster}-{osd_id}'.format( + elif os.listdir((STATEDIR + '/osd/{cluster}-{osd_id}').format( cluster=cluster, osd_id=osd_id, )): @@ -1573,28 +1747,30 @@ ) (osd_id, cluster) = activate(path, activate_key_template, init) - canonical = '/var/lib/ceph/osd/{cluster}-{osd_id}'.format( - cluster=cluster, - osd_id=osd_id) - if path != canonical: - # symlink it from the proper location - create = True - if os.path.lexists(canonical): - old = os.readlink(canonical) - if old != path: - LOG.debug('Removing old symlink %s -> %s', canonical, old) + + if init not in ( None, 'none' ): + canonical = (STATEDIR + '/osd/{cluster}-{osd_id}').format( + cluster=cluster, + osd_id=osd_id) + if path != canonical: + # symlink it from the proper location + create = True + if os.path.lexists(canonical): + old = os.readlink(canonical) + if old != path: + LOG.debug('Removing old symlink %s -> %s', canonical, old) + try: + os.unlink(canonical) + except: + raise Error('unable to remove old symlink', canonical) + else: + create = False + if create: + LOG.debug('Creating symlink %s -> %s', canonical, path) try: - os.unlink(canonical) + os.symlink(path, canonical) except: - raise Error('unable to remove old symlink %s', canonical) - else: - create = False - if create: - LOG.debug('Creating symlink %s -> %s', canonical, path) - try: - os.symlink(path, canonical) - except: - raise Error('unable to create symlink %s -> %s', canonical, path) + raise Error('unable to create symlink %s -> %s' % (canonical, path)) return (cluster, osd_id) @@ -1604,21 +1780,26 @@ Find a cluster name by searching /etc/ceph/*.conf for a conf file with the right uuid. """ + _uuid = _uuid.lower() no_fsid = [] - if not os.path.exists('/etc/ceph'): + if not os.path.exists(SYSCONFDIR): return None - for conf_file in os.listdir('/etc/ceph'): + for conf_file in os.listdir(SYSCONFDIR): if not conf_file.endswith('.conf'): continue cluster = conf_file[:-5] - fsid = get_conf(cluster, 'fsid') - if fsid is None: + try: + fsid = get_fsid(cluster) + except Error as e: + if e.message != 'getting cluster uuid from configuration failed': + raise e no_fsid.append(cluster) - elif fsid == _uuid: - return cluster + else: + if fsid == _uuid: + return cluster # be tolerant of /etc/ceph/ceph.conf without an fsid defined. if len(no_fsid) == 1 and no_fsid[0] == 'ceph': - LOG.warning('No fsid defined in /etc/ceph/ceph.conf; using anyway') + LOG.warning('No fsid defined in ' + SYSCONFDIR + '/ceph.conf; using anyway') return 'ceph' return None @@ -1628,88 +1809,84 @@ init, ): - try: - check_osd_magic(path) + check_osd_magic(path) - ceph_fsid = read_one_line(path, 'ceph_fsid') - if ceph_fsid is None: - raise Error('No cluster uuid assigned.') - LOG.debug('Cluster uuid is %s', ceph_fsid) + ceph_fsid = read_one_line(path, 'ceph_fsid') + if ceph_fsid is None: + raise Error('No cluster uuid assigned.') + LOG.debug('Cluster uuid is %s', ceph_fsid) + + cluster = find_cluster_by_uuid(ceph_fsid) + if cluster is None: + raise Error('No cluster conf found in ' + SYSCONFDIR + ' with fsid %s' % ceph_fsid) + LOG.debug('Cluster name is %s', cluster) - cluster = find_cluster_by_uuid(ceph_fsid) - if cluster is None: - raise Error('No cluster conf found in /etc/ceph with fsid %s' % ceph_fsid) - LOG.debug('Cluster name is %s', cluster) - - fsid = read_one_line(path, 'fsid') - if fsid is None: - raise Error('No OSD uuid assigned.') - LOG.debug('OSD uuid is %s', fsid) - - keyring = activate_key_template.format(cluster=cluster) - - osd_id = get_osd_id(path) - if osd_id is None: - osd_id = allocate_osd_id( - cluster=cluster, - fsid=fsid, - keyring=keyring, - ) - write_one_line(path, 'whoami', osd_id) - LOG.debug('OSD id is %s', osd_id) + fsid = read_one_line(path, 'fsid') + if fsid is None: + raise Error('No OSD uuid assigned.') + LOG.debug('OSD uuid is %s', fsid) - if not os.path.exists(os.path.join(path, 'ready')): - LOG.debug('Initializing OSD...') - # re-running mkfs is safe, so just run until it completes - mkfs( - path=path, - cluster=cluster, - osd_id=osd_id, - fsid=fsid, - keyring=keyring, - ) + keyring = activate_key_template.format(cluster=cluster) - if init is not None: - if init == 'auto': - conf_val = get_conf( - cluster=cluster, - variable='init' - ) - if conf_val is not None: - init = conf_val - else: - (distro, release, codename) = platform.dist() - if distro == 'Ubuntu': - init = 'upstart' - else: - init = 'sysvinit' + osd_id = get_osd_id(path) + if osd_id is None: + osd_id = allocate_osd_id( + cluster=cluster, + fsid=fsid, + keyring=keyring, + ) + write_one_line(path, 'whoami', osd_id) + LOG.debug('OSD id is %s', osd_id) - LOG.debug('Marking with init system %s', init) - with file(os.path.join(path, init), 'w'): - pass + if not os.path.exists(os.path.join(path, 'ready')): + LOG.debug('Initializing OSD...') + # re-running mkfs is safe, so just run until it completes + mkfs( + path=path, + cluster=cluster, + osd_id=osd_id, + fsid=fsid, + keyring=keyring, + ) - # remove markers for others, just in case. - for other in INIT_SYSTEMS: - if other != init: - try: - os.unlink(os.path.join(path, other)) - except OSError: - pass - - if not os.path.exists(os.path.join(path, 'active')): - LOG.debug('Authorizing OSD key...') - auth_key( - path=path, + if init not in ( None, 'none' ): + if init == 'auto': + conf_val = get_conf( cluster=cluster, - osd_id=osd_id, - keyring=keyring, + variable='init' ) - write_one_line(path, 'active', 'ok') - LOG.debug('%s osd.%s data dir is ready at %s', cluster, osd_id, path) - return (osd_id, cluster) - except: - raise + if conf_val is not None: + init = conf_val + else: + (distro, release, codename) = platform.dist() + if distro == 'Ubuntu': + init = 'upstart' + else: + init = 'sysvinit' + LOG.debug('Marking with init system %s', init) + with file(os.path.join(path, init), 'w'): + pass + + # remove markers for others, just in case. + for other in INIT_SYSTEMS: + if other != init: + try: + os.unlink(os.path.join(path, other)) + except OSError: + pass + + if not os.path.exists(os.path.join(path, 'active')): + LOG.debug('Authorizing OSD key...') + auth_key( + path=path, + cluster=cluster, + osd_id=osd_id, + keyring=keyring, + ) + write_one_line(path, 'active', 'ok') + LOG.debug('%s osd.%s data dir is ready at %s', cluster, osd_id, path) + return (osd_id, cluster) def main_activate(args): @@ -1717,7 +1894,7 @@ osd_id = None if not os.path.exists(args.path): - raise Error('%s does not exist', args.path) + raise Error('%s does not exist' % args.path) if is_suppressed(args.path): LOG.info('suppressed activate request on %s', args.path) @@ -1732,22 +1909,36 @@ activate_key_template=args.activate_key_template, init=args.mark_init, ) + elif stat.S_ISDIR(mode): (cluster, osd_id) = activate_dir( path=args.path, activate_key_template=args.activate_key_template, init=args.mark_init, ) + + if args.mark_init == 'none': + command_check_call( + [ + 'ceph-osd', + '--cluster={cluster}'.format(cluster=cluster), + '--id={osd_id}'.format(osd_id=osd_id), + '--osd-data={path}'.format(path=args.path), + '--osd-journal={path}/journal'.format(path=args.path), + ], + ) + else: - raise Error('%s is not a directory or block device', args.path) + raise Error('%s is not a directory or block device' % args.path) - start_daemon( - cluster=cluster, - osd_id=osd_id, + if args.mark_init not in ( None, 'none' ): + + start_daemon( + cluster=cluster, + osd_id=osd_id, ) - activate_lock.release() - except: + finally: activate_lock.release() @@ -1755,11 +1946,11 @@ def get_journal_osd_uuid(path): if not os.path.exists(path): - raise Error('%s does not exist', path) + raise Error('%s does not exist' % path) mode = os.stat(path).st_mode if not stat.S_ISBLK(mode): - raise Error('%s is not a block device', path) + raise Error('%s is not a block device' % path) try: out = _check_output( @@ -1783,7 +1974,7 @@ def main_activate_journal(args): if not os.path.exists(args.dev): - raise Error('%s does not exist', args.dev) + raise Error('%s does not exist' % args.dev) cluster = None osd_id = None @@ -1804,12 +1995,9 @@ osd_id=osd_id, ) + finally: activate_lock.release() - except: - activate_lock.release() - raise - ########################### def main_activate_all(args): @@ -1874,15 +2062,14 @@ return None def get_dev_fs(dev): - fscheck = subprocess.Popen( + fscheck, _ = command( [ 'blkid', '-s', 'TYPE', - dev - ], - stdout = subprocess.PIPE, - stderr=subprocess.PIPE).stdout.read() + dev, + ], + ) if 'TYPE' in fscheck: fstype = fscheck.split()[1].split('"')[1] return fstype @@ -1891,14 +2078,14 @@ def get_partition_type(part): (base, partnum) = re.match('(\D+)(\d+)', part).group(1, 2) - sgdisk = subprocess.Popen( + sgdisk, _ = command( [ 'sgdisk', '-p', base, - ], - stdout = subprocess.PIPE, - stderr = subprocess.PIPE).stdout.read() + ] + ) + for line in sgdisk.splitlines(): m = re.search('\s+(\d+)\s+\d+\s+\d+\s+\S+ \S+B\s+\S+\s+(.*)', line) if m is not None: @@ -1910,10 +2097,7 @@ def get_partition_uuid(dev): (base, partnum) = re.match('(\D+)(\d+)', dev).group(1, 2) - out = subprocess.Popen( - [ 'sgdisk', '-i', partnum, base ], - stdout = subprocess.PIPE, - stderr = subprocess.PIPE).stdout.read() + out, _ = command(['sgdisk', '-i', partnum, base]) for line in out.splitlines(): m = re.match('Partition unique GUID: (\S+)', line) if m: @@ -2041,8 +2225,6 @@ # means suppressing sdb will stop activate on sdb1, sdb2, etc. # -SUPPRESS_PREFIX = '/var/lib/ceph/tmp/suppress-activate.' - def is_suppressed(path): disk = os.path.realpath(path) try: @@ -2100,6 +2282,27 @@ ########################### +def setup_statedir(dir): + global STATEDIR + STATEDIR = dir + + if not os.path.exists(STATEDIR): + os.mkdir(STATEDIR) + if not os.path.exists(STATEDIR + "/tmp"): + os.mkdir(STATEDIR + "/tmp") + + global prepare_lock + prepare_lock = filelock(STATEDIR + '/tmp/ceph-disk.prepare.lock') + + global activate_lock + activate_lock = filelock(STATEDIR + '/tmp/ceph-disk.activate.lock') + + global SUPPRESS_PREFIX + SUPPRESS_PREFIX = STATEDIR + '/tmp/suppress-activate.' + +def setup_sysconfdir(dir): + global SYSCONFDIR + SYSCONFDIR = dir def parse_args(): parser = argparse.ArgumentParser( @@ -2110,6 +2313,24 @@ action='store_true', default=None, help='be more verbose', ) + parser.add_argument( + '--prepend-to-path', + metavar='PATH', + default='/usr/bin', + help='prepend PATH to $PATH for backward compatibility (default /usr/bin)', + ) + parser.add_argument( + '--statedir', + metavar='PATH', + default='/var/lib/ceph', + help='directory in which ceph state is preserved (default /var/lib/ceph)', + ) + parser.add_argument( + '--sysconfdir', + metavar='PATH', + default='/etc/ceph', + help='directory in which ceph configuration files are found (default /etc/ceph)', + ) parser.set_defaults( # we want to hold on to this, for later prog=parser.prog, @@ -2225,7 +2446,7 @@ help='path to block device or directory', ) activate_parser.set_defaults( - activate_key_template='/var/lib/ceph/bootstrap-osd/{cluster}.keyring', + activate_key_template=STATEDIR + '/bootstrap-osd/{cluster}.keyring', func=main_activate, ) @@ -2249,7 +2470,7 @@ choices=INIT_SYSTEMS, ) activate_journal_parser.set_defaults( - activate_key_template='/var/lib/ceph/bootstrap-osd/{cluster}.keyring', + activate_key_template=STATEDIR + '/bootstrap-osd/{cluster}.keyring', func=main_activate_journal, ) @@ -2268,7 +2489,7 @@ choices=INIT_SYSTEMS, ) activate_all_parser.set_defaults( - activate_key_template='/var/lib/ceph/bootstrap-osd/{cluster}.keyring', + activate_key_template=STATEDIR + '/bootstrap-osd/{cluster}.keyring', func=main_activate_all, ) @@ -2303,7 +2524,7 @@ zap_parser.add_argument( 'dev', metavar='DEV', - nargs='*', + nargs='+', help='path to block device', ) zap_parser.set_defaults( @@ -2325,15 +2546,33 @@ level=loglevel, ) + if args.prepend_to_path != '': + path = os.environ.get('PATH', os.defpath) + os.environ['PATH'] = args.prepend_to_path + ":" + path + + setup_statedir(args.statedir) + setup_sysconfdir(args.sysconfdir) + try: args.func(args) except Error as e: - print >> sys.stderr, '{prog}: {msg}'.format( - prog=args.prog, - msg=e, + raise SystemExit( + '{prog}: {msg}'.format( + prog=args.prog, + msg=e, + ) + ) + + except CephDiskException as error: + exc_name = error.__class__.__name__ + raise SystemExit( + '{prog} {exc_name}: {msg}'.format( + prog=args.prog, + exc_name=exc_name, + msg=error, ) - sys.exit(1) + ) if __name__ == '__main__': diff -Nru ceph-0.67.4/src/ceph.in ceph-0.67.7/src/ceph.in --- ceph-0.67.4/src/ceph.in 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/ceph.in 2014-02-19 20:12:47.000000000 +0000 @@ -35,7 +35,8 @@ if 'LD_LIBRARY_PATH' in os.environ: if MYLIBPATH not in os.environ['LD_LIBRARY_PATH']: os.environ['LD_LIBRARY_PATH'] += ':' + MYLIBPATH - os.environ['PATH'] += ':' + MYDIR + if os.environ.has_key('PATH'): + os.environ['PATH'] += ':' + MYDIR print >> sys.stderr, DEVMODEMSG os.execvp('python', ['python'] + sys.argv) else: diff -Nru ceph-0.67.4/src/client/Client.cc ceph-0.67.7/src/client/Client.cc --- ceph-0.67.4/src/client/Client.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/client/Client.cc 2014-02-19 20:12:47.000000000 +0000 @@ -107,6 +107,8 @@ { stringstream ss; Formatter *f = new_formatter(format); + if (!f) + f = new_formatter("json-pretty"); m_client->client_lock.Lock(); if (command == "mds_requests") m_client->dump_mds_requests(f); @@ -176,7 +178,8 @@ // osd interfaces osdmap = new OSDMap; // initially blank.. see mount() mdsmap = new MDSMap; - objecter = new Objecter(cct, messenger, monclient, osdmap, client_lock, timer); + objecter = new Objecter(cct, messenger, monclient, osdmap, client_lock, timer, + 0, 0); objecter->set_client_incarnation(0); // client always 0, for now. writeback_handler = new ObjecterWriteback(objecter); objectcacher = new ObjectCacher(cct, "libcephfs", *writeback_handler, client_lock, @@ -5859,7 +5862,7 @@ if (r >= 0 && r < wanted) { if (pos < in->size) { // zero up to known EOF - int some = in->size - pos; + int64_t some = in->size - pos; if (some > left) some = left; bufferptr z(some); diff -Nru ceph-0.67.4/src/cls/log/cls_log.cc ceph-0.67.7/src/cls/log/cls_log.cc --- ceph-0.67.4/src/cls/log/cls_log.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/cls/log/cls_log.cc 2014-02-19 20:12:46.000000000 +0000 @@ -211,9 +211,8 @@ if (iter == keys.end()) done = true; - else - ret.marker = marker; + ret.marker = marker; ret.truncated = !done; ::encode(ret, *out); diff -Nru ceph-0.67.4/src/cls/log/cls_log_client.cc ceph-0.67.7/src/cls/log/cls_log_client.cc --- ceph-0.67.4/src/cls/log/cls_log_client.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/cls/log/cls_log_client.cc 2014-02-19 20:12:46.000000000 +0000 @@ -107,7 +107,8 @@ }; void cls_log_list(librados::ObjectReadOperation& op, utime_t& from, utime_t& to, - string& in_marker, int max_entries, list& entries, + const string& in_marker, int max_entries, + list& entries, string *out_marker, bool *truncated) { bufferlist inbl; diff -Nru ceph-0.67.4/src/cls/log/cls_log_client.h ceph-0.67.7/src/cls/log/cls_log_client.h --- ceph-0.67.4/src/cls/log/cls_log_client.h 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/cls/log/cls_log_client.h 2014-02-19 20:12:46.000000000 +0000 @@ -18,7 +18,8 @@ const string& section, const string& name, bufferlist& bl); void cls_log_list(librados::ObjectReadOperation& op, utime_t& from, utime_t& to, - string& in_marker, int max_entries, list& entries, + const string& in_marker, int max_entries, + list& entries, string *out_marker, bool *truncated); void cls_log_trim(librados::ObjectWriteOperation& op, const utime_t& from_time, const utime_t& to_time, diff -Nru ceph-0.67.4/src/common/admin_socket.cc ceph-0.67.7/src/common/admin_socket.cc --- ceph-0.67.4/src/common/admin_socket.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/common/admin_socket.cc 2014-02-19 20:12:47.000000000 +0000 @@ -320,6 +320,9 @@ return false; } cmd_getval(m_cct, cmdmap, "format", format); + if (format != "json" && format != "json-pretty" && + format != "xml" && format != "xml-pretty") + format = "json-pretty"; cmd_getval(m_cct, cmdmap, "prefix", c); string firstword; @@ -443,6 +446,8 @@ HelpHook(AdminSocket *as) : m_as(as) {} bool call(string command, cmdmap_t &cmdmap, string format, bufferlist& out) { Formatter *f = new_formatter(format); + if (!f) + f = new_formatter("json-pretty"); f->open_object_section("help"); for (map::iterator p = m_as->m_help.begin(); p != m_as->m_help.end(); diff -Nru ceph-0.67.4/src/common/buffer.cc ceph-0.67.7/src/common/buffer.cc --- ceph-0.67.4/src/common/buffer.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/common/buffer.cc 2014-02-19 20:12:47.000000000 +0000 @@ -1039,6 +1039,9 @@ // funky modifer void buffer::list::splice(unsigned off, unsigned len, list *claim_by /*, bufferlist& replace_with */) { // fixme? + if (len == 0) + return; + if (off >= length()) throw end_of_buffer(); diff -Nru ceph-0.67.4/src/common/ceph_argparse.cc ceph-0.67.7/src/common/ceph_argparse.cc --- ceph-0.67.4/src/common/ceph_argparse.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/common/ceph_argparse.cc 2014-02-19 20:12:47.000000000 +0000 @@ -464,18 +464,19 @@ static void generic_usage(bool is_server) { cout << "\ - --conf/-c Read configuration from the given configuration file\n\ - --id/-i set ID portion of my name\n\ - --name/-n set name (TYPE.ID)\n\ - --version show version and quit\n\ + --conf/-c FILE read configuration from the given configuration file\n\ + --id/-i ID set ID portion of my name\n\ + --name/-n TYPE.ID set name\n\ + --cluster NAME set cluster name (default: ceph)\n\ + --version show version and quit\n\ " << std::endl; if (is_server) { cout << "\ - -d Run in foreground, log to stderr.\n\ - -f Run in foreground, log to usual location.\n"; - cout << " --debug_ms N\n"; - cout << " set message debug level (e.g. 1)\n"; + -d run in foreground, log to stderr.\n\ + -f run in foreground, log to usual location.\n"; + cout << "\ + --debug_ms N set message debug level (e.g. 1)\n"; } } diff -Nru ceph-0.67.4/src/common/ceph_context.cc ceph-0.67.7/src/common/ceph_context.cc --- ceph-0.67.4/src/common/ceph_context.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/common/ceph_context.cc 2014-02-19 20:12:47.000000000 +0000 @@ -168,6 +168,8 @@ std::string format, bufferlist *out) { Formatter *f = new_formatter(format); + if (!f) + f = new_formatter("json-pretty"); stringstream ss; for (cmdmap_t::iterator it = cmdmap.begin(); it != cmdmap.end(); ++it) { if (it->first != "prefix") { diff -Nru ceph-0.67.4/src/common/config_opts.h ceph-0.67.7/src/common/config_opts.h --- ceph-0.67.4/src/common/config_opts.h 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/common/config_opts.h 2014-02-19 20:12:47.000000000 +0000 @@ -119,6 +119,7 @@ OPTION(ms_pq_min_cost, OPT_U64, 65536) OPTION(ms_inject_socket_failures, OPT_U64, 0) OPTION(ms_inject_delay_type, OPT_STR, "") // "osd mds mon client" allowed +OPTION(ms_inject_delay_msg_type, OPT_STR, "") // the type of message to delay, as returned by Message::get_type_name(). This is an additional restriction on the general type filter ms_inject_delay_type. OPTION(ms_inject_delay_max, OPT_DOUBLE, 1) // seconds OPTION(ms_inject_delay_probability, OPT_DOUBLE, 0) // range [0, 1] OPTION(ms_inject_internal_delays, OPT_DOUBLE, 0) // seconds @@ -534,7 +535,6 @@ OPTION(filestore_debug_omap_check, OPT_BOOL, 0) // Expensive debugging check on sync // Use omap for xattrs for attrs over -OPTION(filestore_xattr_use_omap, OPT_BOOL, false) // filestore_max_inline_xattr_size or OPTION(filestore_max_inline_xattr_size, OPT_U32, 512) // for more than filestore_max_inline_xattrs attrs @@ -586,6 +586,9 @@ OPTION(journal_zero_on_create, OPT_BOOL, false) OPTION(journal_ignore_corruption, OPT_BOOL, false) // assume journal is not corrupt +OPTION(rados_mon_op_timeout, OPT_DOUBLE, 0) // how many seconds to wait for a response from the monitor before returning an error from a rados operation. 0 means on limit. +OPTION(rados_osd_op_timeout, OPT_DOUBLE, 0) // how many seconds to wait for a response from osds before returning an error from a rados operation. 0 means no limit. + OPTION(rbd_cache, OPT_BOOL, false) // whether to enable caching (writeback unless rbd_cache_max_dirty is 0) OPTION(rbd_cache_writethrough_until_flush, OPT_BOOL, false) // whether to make writeback caching writethrough until flush is called, to be sure the user of librbd will send flushs so that writeback is safe OPTION(rbd_cache_size, OPT_LONGLONG, 32<<20) // cache size in bytes @@ -640,6 +643,8 @@ OPTION(rgw_keystone_accepted_roles, OPT_STR, "Member, admin") // roles required to serve requests OPTION(rgw_keystone_token_cache_size, OPT_INT, 10000) // max number of entries in keystone token cache OPTION(rgw_keystone_revocation_interval, OPT_INT, 15 * 60) // seconds between tokens revocation check +OPTION(rgw_s3_auth_use_rados, OPT_BOOL, true) // should we try to use the internal credentials for s3? +OPTION(rgw_s3_auth_use_keystone, OPT_BOOL, false) // should we try to use keystone for s3? OPTION(rgw_admin_entry, OPT_STR, "admin") // entry point for which a url is considered an admin request OPTION(rgw_enforce_swift_acls, OPT_BOOL, true) OPTION(rgw_swift_token_expiration, OPT_INT, 24 * 3600) // time in seconds for swift token expiration diff -Nru ceph-0.67.4/src/common/crc32c-intel.c ceph-0.67.7/src/common/crc32c-intel.c --- ceph-0.67.4/src/common/crc32c-intel.c 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/common/crc32c-intel.c 2014-02-19 20:12:47.000000000 +0000 @@ -7,8 +7,7 @@ #include -/* this probably isn't specific enough for x86_64? fix me someday */ -#ifdef __LP64__ +#ifdef __x86_64__ /* * * Based on a posting to lkml by Austin Zhang diff -Nru ceph-0.67.4/src/common/Formatter.h ceph-0.67.7/src/common/Formatter.h --- ceph-0.67.4/src/common/Formatter.h 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/common/Formatter.h 2014-02-19 20:12:47.000000000 +0000 @@ -43,6 +43,9 @@ virtual void dump_int(const char *name, int64_t s) = 0; virtual void dump_float(const char *name, double d) = 0; virtual void dump_string(const char *name, std::string s) = 0; + virtual void dump_bool(const char *name, bool b) { + dump_format_unquoted(name, "%s", (b ? "true" : "false")); + } virtual std::ostream& dump_stream(const char *name) = 0; virtual void dump_format(const char *name, const char *fmt, ...) = 0; virtual void dump_format_unquoted(const char *name, const char *fmt, ...) = 0; diff -Nru ceph-0.67.4/src/common/perf_counters.cc ceph-0.67.7/src/common/perf_counters.cc --- ceph-0.67.4/src/common/perf_counters.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/common/perf_counters.cc 2014-02-19 20:12:47.000000000 +0000 @@ -203,6 +203,22 @@ return utime_t(data.u64 / 1000000000ull, data.u64 % 1000000000ull); } +pair PerfCounters::get_tavg_ms(int idx) const +{ + if (!m_cct->_conf->perf) + return make_pair(0, 0); + + Mutex::Locker lck(m_lock); + assert(idx > m_lower_bound); + assert(idx < m_upper_bound); + const perf_counter_data_any_d& data(m_data[idx - m_lower_bound - 1]); + if (!(data.type & PERFCOUNTER_TIME)) + return make_pair(0, 0); + if (!(data.type & PERFCOUNTER_LONGRUNAVG)) + return make_pair(0, 0); + return make_pair(data.avgcount, data.u64/1000000); +} + void PerfCounters::dump_formatted(Formatter *f, bool schema) { Mutex::Locker lck(m_lock); diff -Nru ceph-0.67.4/src/common/perf_counters.h ceph-0.67.7/src/common/perf_counters.h --- ceph-0.67.4/src/common/perf_counters.h 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/common/perf_counters.h 2014-02-19 20:12:46.000000000 +0000 @@ -65,6 +65,24 @@ class PerfCounters { public: + template + struct avg_tracker { + pair last; + pair cur; + avg_tracker() : last(0, 0), cur(0, 0) {} + T avg() const { + if (cur.first == last.first) + return cur.first ? + cur.second / cur.first : + 0; // no change, report avg over all time + return (cur.second - last.second) / (cur.first - last.first); + } + void consume_next(const pair &next) { + last = cur; + cur = next; + } + }; + ~PerfCounters(); void inc(int idx, uint64_t v = 1); @@ -78,6 +96,8 @@ void dump_formatted(ceph::Formatter *f, bool schema); + pair get_tavg_ms(int idx) const; + const std::string& get_name() const; void set_name(std::string s) { m_name = s; diff -Nru ceph-0.67.4/src/.git_version ceph-0.67.7/src/.git_version --- ceph-0.67.4/src/.git_version 2013-10-03 23:01:37.000000000 +0000 +++ ceph-0.67.7/src/.git_version 2014-02-19 20:14:09.000000000 +0000 @@ -1,2 +1,2 @@ -ad85b8bfafea6232d64cb7ba76a8b6e8252fa0c7 -v0.67.4 +d7ab4244396b57aac8b7e80812115bbd079e6b73 +v0.67.7 diff -Nru ceph-0.67.4/src/librados/librados.cc ceph-0.67.7/src/librados/librados.cc --- ceph-0.67.4/src/librados/librados.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/librados/librados.cc 2014-02-19 20:12:47.000000000 +0000 @@ -1484,6 +1484,8 @@ { map rawresult; int r = client->get_pool_stats(v, rawresult); + if (r < 0) + return r; for (map::iterator p = rawresult.begin(); p != rawresult.end(); ++p) { @@ -1793,7 +1795,9 @@ { librados::RadosClient *radosp = (librados::RadosClient *)cluster; std::string name; - radosp->pool_get_name(id, &name); + int r = radosp->pool_get_name(id, &name); + if (r < 0) + return r; if (name.length() >= maxlen) return -ERANGE; strcpy(buf, name.c_str()); @@ -1816,7 +1820,9 @@ { librados::RadosClient *client = (librados::RadosClient *)cluster; std::list pools; - client->pool_list(pools); + int r = client->pool_list(pools); + if (r < 0) + return r; if (!buf) return -EINVAL; diff -Nru ceph-0.67.4/src/librados/RadosClient.cc ceph-0.67.7/src/librados/RadosClient.cc --- ceph-0.67.4/src/librados/RadosClient.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/librados/RadosClient.cc 2014-02-19 20:12:47.000000000 +0000 @@ -101,7 +101,9 @@ int librados::RadosClient::pool_get_auid(uint64_t pool_id, unsigned long long *auid) { Mutex::Locker l(lock); - wait_for_osdmap(); + int r = wait_for_osdmap(); + if (r < 0) + return r; const pg_pool_t *pg = osdmap.get_pg_pool(pool_id); if (!pg) return -ENOENT; @@ -112,7 +114,9 @@ int librados::RadosClient::pool_get_name(uint64_t pool_id, std::string *s) { Mutex::Locker l(lock); - wait_for_osdmap(); + int r = wait_for_osdmap(); + if (r < 0) + return r; const char *str = osdmap.get_pool_name(pool_id); if (!str) return -ENOENT; @@ -166,7 +170,9 @@ ldout(cct, 1) << "starting objecter" << dendl; err = -ENOMEM; - objecter = new Objecter(cct, messenger, &monclient, &osdmap, lock, timer); + objecter = new Objecter(cct, messenger, &monclient, &osdmap, lock, timer, + cct->_conf->rados_mon_op_timeout, + cct->_conf->rados_osd_op_timeout); if (!objecter) goto out; objecter->set_balanced_budget(); @@ -357,21 +363,42 @@ return true; } -void librados::RadosClient::wait_for_osdmap() +int librados::RadosClient::wait_for_osdmap() { assert(lock.is_locked()); + + utime_t timeout; + if (cct->_conf->rados_mon_op_timeout > 0) + timeout.set_from_double(cct->_conf->rados_mon_op_timeout); + if (osdmap.get_epoch() == 0) { ldout(cct, 10) << __func__ << " waiting" << dendl; - while (osdmap.get_epoch() == 0) - cond.Wait(lock); + utime_t start = ceph_clock_now(cct); + + while (osdmap.get_epoch() == 0) { + cond.WaitInterval(cct, lock, timeout); + + utime_t elapsed = ceph_clock_now(cct) - start; + if (!timeout.is_zero() && elapsed > timeout) + break; + } + ldout(cct, 10) << __func__ << " done waiting" << dendl; + + if (osdmap.get_epoch() == 0) { + lderr(cct) << "timed out waiting for first osdmap from monitors" << dendl; + return -ETIMEDOUT; + } } + return 0; } int librados::RadosClient::pool_list(std::list& v) { Mutex::Locker l(lock); - wait_for_osdmap(); + int r = wait_for_osdmap(); + if (r < 0) + return r; for (map::const_iterator p = osdmap.get_pools().begin(); p != osdmap.get_pools().end(); ++p) @@ -385,9 +412,11 @@ Mutex mylock("RadosClient::get_pool_stats::mylock"); Cond cond; bool done; + int ret = 0; lock.Lock(); - objecter->get_pool_stats(pools, &result, new C_SafeCond(&mylock, &cond, &done)); + objecter->get_pool_stats(pools, &result, new C_SafeCond(&mylock, &cond, &done, + &ret)); lock.Unlock(); mylock.Lock(); @@ -395,7 +424,7 @@ cond.Wait(mylock); mylock.Unlock(); - return 0; + return ret; } int librados::RadosClient::get_fs_stats(ceph_statfs& stats) @@ -403,15 +432,17 @@ Mutex mylock ("RadosClient::get_fs_stats::mylock"); Cond cond; bool done; + int ret = 0; + lock.Lock(); - objecter->get_fs_stats(stats, new C_SafeCond(&mylock, &cond, &done)); + objecter->get_fs_stats(stats, new C_SafeCond(&mylock, &cond, &done, &ret)); lock.Unlock(); mylock.Lock(); while (!done) cond.Wait(mylock); mylock.Unlock(); - return 0; + return ret; } void librados::RadosClient::get() { @@ -468,7 +499,9 @@ int librados::RadosClient::pool_delete(const char *name) { lock.Lock(); - wait_for_osdmap(); + int r = wait_for_osdmap(); + if (r < 0) + return r; int tmp_pool_id = osdmap.lookup_pg_pool_name(name); if (tmp_pool_id < 0) { lock.Unlock(); @@ -497,13 +530,15 @@ int librados::RadosClient::pool_delete_async(const char *name, PoolAsyncCompletionImpl *c) { Mutex::Locker l(lock); - wait_for_osdmap(); + int r = wait_for_osdmap(); + if (r < 0) + return r; int tmp_pool_id = osdmap.lookup_pg_pool_name(name); if (tmp_pool_id < 0) return -ENOENT; Context *onfinish = new C_PoolAsync_Safe(c); - int r = objecter->delete_pool(tmp_pool_id, onfinish); + r = objecter->delete_pool(tmp_pool_id, onfinish); if (r < 0) { delete c; delete onfinish; diff -Nru ceph-0.67.4/src/librados/RadosClient.h ceph-0.67.7/src/librados/RadosClient.h --- ceph-0.67.4/src/librados/RadosClient.h 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/librados/RadosClient.h 2014-02-19 20:12:47.000000000 +0000 @@ -70,7 +70,7 @@ void *log_cb_arg; string log_watch; - void wait_for_osdmap(); + int wait_for_osdmap(); public: Finisher finisher; diff -Nru ceph-0.67.4/src/librbd/AioCompletion.h ceph-0.67.7/src/librbd/AioCompletion.h --- ceph-0.67.4/src/librbd/AioCompletion.h 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/librbd/AioCompletion.h 2014-02-19 20:12:47.000000000 +0000 @@ -101,9 +101,6 @@ utime_t elapsed; assert(lock.is_locked()); elapsed = ceph_clock_now(ictx->cct) - start_time; - if (complete_cb) { - complete_cb(rbd_comp, complete_arg); - } switch (aio_type) { case AIO_TYPE_READ: ictx->perfcounter->tinc(l_librbd_aio_rd_latency, elapsed); break; @@ -117,6 +114,9 @@ lderr(ictx->cct) << "completed invalid aio_type: " << aio_type << dendl; break; } + if (complete_cb) { + complete_cb(rbd_comp, complete_arg); + } done = true; cond.Signal(); } diff -Nru ceph-0.67.4/src/Makefile.am ceph-0.67.7/src/Makefile.am --- ceph-0.67.4/src/Makefile.am 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/Makefile.am 2014-02-19 20:12:47.000000000 +0000 @@ -50,6 +50,7 @@ check-local: $(srcdir)/test/encoding/check-generated.sh + $(srcdir)/test/ceph-disk.sh $(srcdir)/test/encoding/readable.sh ../ceph-object-corpus EXTRALIBS = -luuid @@ -401,7 +402,8 @@ rgw/rgw_cors_s3.cc \ rgw/rgw_auth_s3.cc \ rgw/rgw_metadata.cc \ - rgw/rgw_replica_log.cc + rgw/rgw_replica_log.cc \ + rgw/rgw_keystone.cc librgw_a_CFLAGS = ${CRYPTO_CFLAGS} ${AM_CFLAGS} librgw_a_CXXFLAGS = -Woverloaded-virtual ${AM_CXXFLAGS} noinst_LIBRARIES += librgw.a @@ -799,6 +801,12 @@ unittest_throttle_CXXFLAGS = ${AM_CXXFLAGS} ${UNITTEST_CXXFLAGS} -O2 check_PROGRAMS += unittest_throttle +unittest_context_SOURCES = test/common/test_context.cc +unittest_context_LDFLAGS = $(PTHREAD_CFLAGS) ${AM_LDFLAGS} +unittest_context_LDADD = libcommon.la ${LIBGLOBAL_LDA} ${UNITTEST_LDADD} +unittest_context_CXXFLAGS = ${AM_CXXFLAGS} ${UNITTEST_CXXFLAGS} -O2 +check_PROGRAMS += unittest_context + unittest_base64_SOURCES = test/base64.cc unittest_base64_LDFLAGS = $(PTHREAD_CFLAGS) ${AM_LDFLAGS} unittest_base64_LDADD = libcephfs.la -lm ${UNITTEST_LDADD} @@ -1355,6 +1363,7 @@ $(ceph_tool_gui_DATA) \ $(srcdir)/test/encoding/readable.sh \ $(srcdir)/test/encoding/check-generated.sh \ + $(srcdir)/test/ceph-disk.sh \ $(srcdir)/upstart/ceph-all.conf \ $(srcdir)/upstart/ceph-mon.conf \ $(srcdir)/upstart/ceph-mon-all.conf \ @@ -1615,7 +1624,8 @@ mon/HealthMonitor.cc \ mon/DataHealthService.cc \ mon/ConfigKeyService.cc \ - common/util.cc + common/util.cc \ + common/TextTable.cc libmon_a_CXXFLAGS= ${AM_CXXFLAGS} noinst_LIBRARIES += libmon.a @@ -2246,6 +2256,7 @@ rgw/rgw_usage.h\ rgw/rgw_user.h\ rgw/rgw_bucket.h\ + rgw/rgw_keystone.h\ sample.ceph.conf\ tools/common.h\ test/osd/RadosModel.h\ diff -Nru ceph-0.67.4/src/Makefile.in ceph-0.67.7/src/Makefile.in --- ceph-0.67.4/src/Makefile.in 2013-10-03 23:25:56.000000000 +0000 +++ ceph-0.67.7/src/Makefile.in 2014-02-19 20:13:55.000000000 +0000 @@ -54,20 +54,20 @@ unittest_striper$(EXEEXT) \ unittest_prebufferedstreambuf$(EXEEXT) \ unittest_str_list$(EXEEXT) unittest_log$(EXEEXT) \ - unittest_throttle$(EXEEXT) unittest_base64$(EXEEXT) \ - unittest_ceph_argparse$(EXEEXT) unittest_osd_types$(EXEEXT) \ - unittest_pglog$(EXEEXT) unittest_gather$(EXEEXT) \ - unittest_run_cmd$(EXEEXT) unittest_signals$(EXEEXT) \ - unittest_simple_spin$(EXEEXT) unittest_librados$(EXEEXT) \ - unittest_bufferlist$(EXEEXT) unittest_crypto$(EXEEXT) \ - unittest_perf_counters$(EXEEXT) unittest_admin_socket$(EXEEXT) \ - unittest_ceph_crypto$(EXEEXT) unittest_utf8$(EXEEXT) \ - unittest_mime$(EXEEXT) unittest_escape$(EXEEXT) \ - unittest_chain_xattr$(EXEEXT) unittest_flatindex$(EXEEXT) \ - unittest_strtol$(EXEEXT) unittest_confutils$(EXEEXT) \ - unittest_heartbeatmap$(EXEEXT) unittest_formatter$(EXEEXT) \ - unittest_libcephfs_config$(EXEEXT) unittest_lfnindex$(EXEEXT) \ - unittest_librados_config$(EXEEXT) \ + unittest_throttle$(EXEEXT) unittest_context$(EXEEXT) \ + unittest_base64$(EXEEXT) unittest_ceph_argparse$(EXEEXT) \ + unittest_osd_types$(EXEEXT) unittest_pglog$(EXEEXT) \ + unittest_gather$(EXEEXT) unittest_run_cmd$(EXEEXT) \ + unittest_signals$(EXEEXT) unittest_simple_spin$(EXEEXT) \ + unittest_librados$(EXEEXT) unittest_bufferlist$(EXEEXT) \ + unittest_crypto$(EXEEXT) unittest_perf_counters$(EXEEXT) \ + unittest_admin_socket$(EXEEXT) unittest_ceph_crypto$(EXEEXT) \ + unittest_utf8$(EXEEXT) unittest_mime$(EXEEXT) \ + unittest_escape$(EXEEXT) unittest_chain_xattr$(EXEEXT) \ + unittest_flatindex$(EXEEXT) unittest_strtol$(EXEEXT) \ + unittest_confutils$(EXEEXT) unittest_heartbeatmap$(EXEEXT) \ + unittest_formatter$(EXEEXT) unittest_libcephfs_config$(EXEEXT) \ + unittest_lfnindex$(EXEEXT) unittest_librados_config$(EXEEXT) \ unittest_daemon_config$(EXEEXT) unittest_osd_osdcap$(EXEEXT) \ unittest_mon_moncap$(EXEEXT) unittest_ipaddr$(EXEEXT) \ unittest_texttable$(EXEEXT) @@ -230,7 +230,8 @@ libmon_a-LevelDBStore.$(OBJEXT) \ libmon_a-HealthMonitor.$(OBJEXT) \ libmon_a-DataHealthService.$(OBJEXT) \ - libmon_a-ConfigKeyService.$(OBJEXT) libmon_a-util.$(OBJEXT) + libmon_a-ConfigKeyService.$(OBJEXT) libmon_a-util.$(OBJEXT) \ + libmon_a-TextTable.$(OBJEXT) libmon_a_OBJECTS = $(am_libmon_a_OBJECTS) libos_a_AR = $(AR) $(ARFLAGS) libos_a_LIBADD = @@ -263,7 +264,7 @@ rgw/rgw_log.cc rgw/rgw_multi.cc rgw/rgw_policy_s3.cc \ rgw/rgw_gc.cc rgw/rgw_multi_del.cc rgw/rgw_env.cc \ rgw/rgw_cors.cc rgw/rgw_cors_s3.cc rgw/rgw_auth_s3.cc \ - rgw/rgw_metadata.cc rgw/rgw_replica_log.cc + rgw/rgw_metadata.cc rgw/rgw_replica_log.cc rgw/rgw_keystone.cc @WITH_RADOSGW_TRUE@am_librgw_a_OBJECTS = librgw_a-librgw.$(OBJEXT) \ @WITH_RADOSGW_TRUE@ librgw_a-rgw_acl.$(OBJEXT) \ @WITH_RADOSGW_TRUE@ librgw_a-rgw_acl_s3.$(OBJEXT) \ @@ -294,7 +295,8 @@ @WITH_RADOSGW_TRUE@ librgw_a-rgw_cors_s3.$(OBJEXT) \ @WITH_RADOSGW_TRUE@ librgw_a-rgw_auth_s3.$(OBJEXT) \ @WITH_RADOSGW_TRUE@ librgw_a-rgw_metadata.$(OBJEXT) \ -@WITH_RADOSGW_TRUE@ librgw_a-rgw_replica_log.$(OBJEXT) +@WITH_RADOSGW_TRUE@ librgw_a-rgw_replica_log.$(OBJEXT) \ +@WITH_RADOSGW_TRUE@ librgw_a-rgw_keystone.$(OBJEXT) librgw_a_OBJECTS = $(am_librgw_a_OBJECTS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ @@ -2376,6 +2378,14 @@ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(unittest_confutils_CXXFLAGS) $(CXXFLAGS) \ $(unittest_confutils_LDFLAGS) $(LDFLAGS) -o $@ +am_unittest_context_OBJECTS = unittest_context-test_context.$(OBJEXT) +unittest_context_OBJECTS = $(am_unittest_context_OBJECTS) +unittest_context_DEPENDENCIES = libcommon.la $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_7) +unittest_context_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ + $(unittest_context_CXXFLAGS) $(CXXFLAGS) \ + $(unittest_context_LDFLAGS) $(LDFLAGS) -o $@ am_unittest_crypto_OBJECTS = unittest_crypto-crypto.$(OBJEXT) unittest_crypto_OBJECTS = $(am_unittest_crypto_OBJECTS) unittest_crypto_DEPENDENCIES = $(am__DEPENDENCIES_3) \ @@ -2787,11 +2797,12 @@ $(unittest_ceph_argparse_SOURCES) \ $(unittest_ceph_crypto_SOURCES) \ $(unittest_chain_xattr_SOURCES) $(unittest_confutils_SOURCES) \ - $(unittest_crypto_SOURCES) $(unittest_daemon_config_SOURCES) \ - $(unittest_encoding_SOURCES) $(unittest_escape_SOURCES) \ - $(unittest_flatindex_SOURCES) $(unittest_formatter_SOURCES) \ - $(unittest_gather_SOURCES) $(unittest_heartbeatmap_SOURCES) \ - $(unittest_ipaddr_SOURCES) $(unittest_lfnindex_SOURCES) \ + $(unittest_context_SOURCES) $(unittest_crypto_SOURCES) \ + $(unittest_daemon_config_SOURCES) $(unittest_encoding_SOURCES) \ + $(unittest_escape_SOURCES) $(unittest_flatindex_SOURCES) \ + $(unittest_formatter_SOURCES) $(unittest_gather_SOURCES) \ + $(unittest_heartbeatmap_SOURCES) $(unittest_ipaddr_SOURCES) \ + $(unittest_lfnindex_SOURCES) \ $(unittest_libcephfs_config_SOURCES) \ $(unittest_librados_SOURCES) \ $(unittest_librados_config_SOURCES) $(unittest_log_SOURCES) \ @@ -2901,11 +2912,12 @@ $(unittest_ceph_argparse_SOURCES) \ $(unittest_ceph_crypto_SOURCES) \ $(unittest_chain_xattr_SOURCES) $(unittest_confutils_SOURCES) \ - $(unittest_crypto_SOURCES) $(unittest_daemon_config_SOURCES) \ - $(unittest_encoding_SOURCES) $(unittest_escape_SOURCES) \ - $(unittest_flatindex_SOURCES) $(unittest_formatter_SOURCES) \ - $(unittest_gather_SOURCES) $(unittest_heartbeatmap_SOURCES) \ - $(unittest_ipaddr_SOURCES) $(unittest_lfnindex_SOURCES) \ + $(unittest_context_SOURCES) $(unittest_crypto_SOURCES) \ + $(unittest_daemon_config_SOURCES) $(unittest_encoding_SOURCES) \ + $(unittest_escape_SOURCES) $(unittest_flatindex_SOURCES) \ + $(unittest_formatter_SOURCES) $(unittest_gather_SOURCES) \ + $(unittest_heartbeatmap_SOURCES) $(unittest_ipaddr_SOURCES) \ + $(unittest_lfnindex_SOURCES) \ $(unittest_libcephfs_config_SOURCES) \ $(unittest_librados_SOURCES) \ $(unittest_librados_config_SOURCES) $(unittest_log_SOURCES) \ @@ -3150,7 +3162,7 @@ $(srcdir)/.git_version $(srcdir)/ceph-rbdnamer \ $(ceph_tool_gui_DATA) $(srcdir)/test/encoding/readable.sh \ $(srcdir)/test/encoding/check-generated.sh \ - $(srcdir)/upstart/ceph-all.conf \ + $(srcdir)/test/ceph-disk.sh $(srcdir)/upstart/ceph-all.conf \ $(srcdir)/upstart/ceph-mon.conf \ $(srcdir)/upstart/ceph-mon-all.conf \ $(srcdir)/upstart/ceph-mon-all-starter.conf \ @@ -3455,7 +3467,8 @@ @WITH_RADOSGW_TRUE@ rgw/rgw_cors_s3.cc \ @WITH_RADOSGW_TRUE@ rgw/rgw_auth_s3.cc \ @WITH_RADOSGW_TRUE@ rgw/rgw_metadata.cc \ -@WITH_RADOSGW_TRUE@ rgw/rgw_replica_log.cc +@WITH_RADOSGW_TRUE@ rgw/rgw_replica_log.cc \ +@WITH_RADOSGW_TRUE@ rgw/rgw_keystone.cc @WITH_RADOSGW_TRUE@librgw_a_CFLAGS = ${CRYPTO_CFLAGS} ${AM_CFLAGS} @WITH_RADOSGW_TRUE@librgw_a_CXXFLAGS = -Woverloaded-virtual ${AM_CXXFLAGS} @@ -3747,6 +3760,10 @@ unittest_throttle_LDFLAGS = $(PTHREAD_CFLAGS) ${AM_LDFLAGS} unittest_throttle_LDADD = libcommon.la ${LIBGLOBAL_LDA} ${UNITTEST_LDADD} unittest_throttle_CXXFLAGS = ${AM_CXXFLAGS} ${UNITTEST_CXXFLAGS} -O2 +unittest_context_SOURCES = test/common/test_context.cc +unittest_context_LDFLAGS = $(PTHREAD_CFLAGS) ${AM_LDFLAGS} +unittest_context_LDADD = libcommon.la ${LIBGLOBAL_LDA} ${UNITTEST_LDADD} +unittest_context_CXXFLAGS = ${AM_CXXFLAGS} ${UNITTEST_CXXFLAGS} -O2 unittest_base64_SOURCES = test/base64.cc unittest_base64_LDFLAGS = $(PTHREAD_CFLAGS) ${AM_LDFLAGS} unittest_base64_LDADD = libcephfs.la -lm ${UNITTEST_LDADD} @@ -4228,7 +4245,8 @@ mon/HealthMonitor.cc \ mon/DataHealthService.cc \ mon/ConfigKeyService.cc \ - common/util.cc + common/util.cc \ + common/TextTable.cc libmon_a_CXXFLAGS = ${AM_CXXFLAGS} libmds_a_SOURCES = \ @@ -4851,6 +4869,7 @@ rgw/rgw_usage.h\ rgw/rgw_user.h\ rgw/rgw_bucket.h\ + rgw/rgw_keystone.h\ sample.ceph.conf\ tools/common.h\ test/osd/RadosModel.h\ @@ -5533,6 +5552,9 @@ unittest_confutils$(EXEEXT): $(unittest_confutils_OBJECTS) $(unittest_confutils_DEPENDENCIES) $(EXTRA_unittest_confutils_DEPENDENCIES) @rm -f unittest_confutils$(EXEEXT) $(AM_V_CXXLD)$(unittest_confutils_LINK) $(unittest_confutils_OBJECTS) $(unittest_confutils_LDADD) $(LIBS) +unittest_context$(EXEEXT): $(unittest_context_OBJECTS) $(unittest_context_DEPENDENCIES) $(EXTRA_unittest_context_DEPENDENCIES) + @rm -f unittest_context$(EXEEXT) + $(AM_V_CXXLD)$(unittest_context_LINK) $(unittest_context_OBJECTS) $(unittest_context_LDADD) $(LIBS) unittest_crypto$(EXEEXT): $(unittest_crypto_OBJECTS) $(unittest_crypto_DEPENDENCIES) $(EXTRA_unittest_crypto_DEPENDENCIES) @rm -f unittest_crypto$(EXEEXT) $(AM_V_CXXLD)$(unittest_crypto_LINK) $(unittest_crypto_OBJECTS) $(unittest_crypto_LDADD) $(LIBS) @@ -6646,6 +6668,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmon_a-PGMonitor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmon_a-Paxos.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmon_a-PaxosService.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmon_a-TextTable.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmon_a-util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libos_a-DBObjectMap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libos_a-FileJournal.Po@am__quote@ @@ -6714,6 +6737,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librgw_a-rgw_gc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librgw_a-rgw_http_client.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librgw_a-rgw_json_enc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librgw_a-rgw_keystone.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librgw_a-rgw_log.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librgw_a-rgw_metadata.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librgw_a-rgw_multi.Po@am__quote@ @@ -6818,6 +6842,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unittest_ceph_crypto-ceph_crypto.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unittest_chain_xattr-chain_xattr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unittest_confutils-confutils.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unittest_context-test_context.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unittest_crypto-crypto.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unittest_daemon_config-daemon_config.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unittest_encoding-encoding.Po@am__quote@ @@ -8229,6 +8254,20 @@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmon_a-util.obj `if test -f 'common/util.cc'; then $(CYGPATH_W) 'common/util.cc'; else $(CYGPATH_W) '$(srcdir)/common/util.cc'; fi` +libmon_a-TextTable.o: common/TextTable.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmon_a_CXXFLAGS) $(CXXFLAGS) -MT libmon_a-TextTable.o -MD -MP -MF $(DEPDIR)/libmon_a-TextTable.Tpo -c -o libmon_a-TextTable.o `test -f 'common/TextTable.cc' || echo '$(srcdir)/'`common/TextTable.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmon_a-TextTable.Tpo $(DEPDIR)/libmon_a-TextTable.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/TextTable.cc' object='libmon_a-TextTable.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmon_a-TextTable.o `test -f 'common/TextTable.cc' || echo '$(srcdir)/'`common/TextTable.cc + +libmon_a-TextTable.obj: common/TextTable.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmon_a_CXXFLAGS) $(CXXFLAGS) -MT libmon_a-TextTable.obj -MD -MP -MF $(DEPDIR)/libmon_a-TextTable.Tpo -c -o libmon_a-TextTable.obj `if test -f 'common/TextTable.cc'; then $(CYGPATH_W) 'common/TextTable.cc'; else $(CYGPATH_W) '$(srcdir)/common/TextTable.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmon_a-TextTable.Tpo $(DEPDIR)/libmon_a-TextTable.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/TextTable.cc' object='libmon_a-TextTable.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmon_a-TextTable.obj `if test -f 'common/TextTable.cc'; then $(CYGPATH_W) 'common/TextTable.cc'; else $(CYGPATH_W) '$(srcdir)/common/TextTable.cc'; fi` + libos_a-FileJournal.o: os/FileJournal.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libos_a_CXXFLAGS) $(CXXFLAGS) -MT libos_a-FileJournal.o -MD -MP -MF $(DEPDIR)/libos_a-FileJournal.Tpo -c -o libos_a-FileJournal.o `test -f 'os/FileJournal.cc' || echo '$(srcdir)/'`os/FileJournal.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libos_a-FileJournal.Tpo $(DEPDIR)/libos_a-FileJournal.Po @@ -8971,6 +9010,20 @@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(librgw_a_CXXFLAGS) $(CXXFLAGS) -c -o librgw_a-rgw_replica_log.obj `if test -f 'rgw/rgw_replica_log.cc'; then $(CYGPATH_W) 'rgw/rgw_replica_log.cc'; else $(CYGPATH_W) '$(srcdir)/rgw/rgw_replica_log.cc'; fi` +librgw_a-rgw_keystone.o: rgw/rgw_keystone.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(librgw_a_CXXFLAGS) $(CXXFLAGS) -MT librgw_a-rgw_keystone.o -MD -MP -MF $(DEPDIR)/librgw_a-rgw_keystone.Tpo -c -o librgw_a-rgw_keystone.o `test -f 'rgw/rgw_keystone.cc' || echo '$(srcdir)/'`rgw/rgw_keystone.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librgw_a-rgw_keystone.Tpo $(DEPDIR)/librgw_a-rgw_keystone.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rgw/rgw_keystone.cc' object='librgw_a-rgw_keystone.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(librgw_a_CXXFLAGS) $(CXXFLAGS) -c -o librgw_a-rgw_keystone.o `test -f 'rgw/rgw_keystone.cc' || echo '$(srcdir)/'`rgw/rgw_keystone.cc + +librgw_a-rgw_keystone.obj: rgw/rgw_keystone.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(librgw_a_CXXFLAGS) $(CXXFLAGS) -MT librgw_a-rgw_keystone.obj -MD -MP -MF $(DEPDIR)/librgw_a-rgw_keystone.Tpo -c -o librgw_a-rgw_keystone.obj `if test -f 'rgw/rgw_keystone.cc'; then $(CYGPATH_W) 'rgw/rgw_keystone.cc'; else $(CYGPATH_W) '$(srcdir)/rgw/rgw_keystone.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librgw_a-rgw_keystone.Tpo $(DEPDIR)/librgw_a-rgw_keystone.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rgw/rgw_keystone.cc' object='librgw_a-rgw_keystone.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(librgw_a_CXXFLAGS) $(CXXFLAGS) -c -o librgw_a-rgw_keystone.obj `if test -f 'rgw/rgw_keystone.cc'; then $(CYGPATH_W) 'rgw/rgw_keystone.cc'; else $(CYGPATH_W) '$(srcdir)/rgw/rgw_keystone.cc'; fi` + libcephfs_la-libcephfs.lo: libcephfs.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcephfs_la_CXXFLAGS) $(CXXFLAGS) -MT libcephfs_la-libcephfs.lo -MD -MP -MF $(DEPDIR)/libcephfs_la-libcephfs.Tpo -c -o libcephfs_la-libcephfs.lo `test -f 'libcephfs.cc' || echo '$(srcdir)/'`libcephfs.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcephfs_la-libcephfs.Tpo $(DEPDIR)/libcephfs_la-libcephfs.Plo @@ -19821,6 +19874,20 @@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(unittest_confutils_CXXFLAGS) $(CXXFLAGS) -c -o unittest_confutils-confutils.obj `if test -f 'test/confutils.cc'; then $(CYGPATH_W) 'test/confutils.cc'; else $(CYGPATH_W) '$(srcdir)/test/confutils.cc'; fi` +unittest_context-test_context.o: test/common/test_context.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(unittest_context_CXXFLAGS) $(CXXFLAGS) -MT unittest_context-test_context.o -MD -MP -MF $(DEPDIR)/unittest_context-test_context.Tpo -c -o unittest_context-test_context.o `test -f 'test/common/test_context.cc' || echo '$(srcdir)/'`test/common/test_context.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unittest_context-test_context.Tpo $(DEPDIR)/unittest_context-test_context.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='test/common/test_context.cc' object='unittest_context-test_context.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(unittest_context_CXXFLAGS) $(CXXFLAGS) -c -o unittest_context-test_context.o `test -f 'test/common/test_context.cc' || echo '$(srcdir)/'`test/common/test_context.cc + +unittest_context-test_context.obj: test/common/test_context.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(unittest_context_CXXFLAGS) $(CXXFLAGS) -MT unittest_context-test_context.obj -MD -MP -MF $(DEPDIR)/unittest_context-test_context.Tpo -c -o unittest_context-test_context.obj `if test -f 'test/common/test_context.cc'; then $(CYGPATH_W) 'test/common/test_context.cc'; else $(CYGPATH_W) '$(srcdir)/test/common/test_context.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unittest_context-test_context.Tpo $(DEPDIR)/unittest_context-test_context.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='test/common/test_context.cc' object='unittest_context-test_context.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(unittest_context_CXXFLAGS) $(CXXFLAGS) -c -o unittest_context-test_context.obj `if test -f 'test/common/test_context.cc'; then $(CYGPATH_W) 'test/common/test_context.cc'; else $(CYGPATH_W) '$(srcdir)/test/common/test_context.cc'; fi` + unittest_crypto-crypto.o: test/crypto.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(unittest_crypto_CXXFLAGS) $(CXXFLAGS) -MT unittest_crypto-crypto.o -MD -MP -MF $(DEPDIR)/unittest_crypto-crypto.Tpo -c -o unittest_crypto-crypto.o `test -f 'test/crypto.cc' || echo '$(srcdir)/'`test/crypto.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unittest_crypto-crypto.Tpo $(DEPDIR)/unittest_crypto-crypto.Po @@ -21024,6 +21091,7 @@ check-local: $(srcdir)/test/encoding/check-generated.sh + $(srcdir)/test/ceph-disk.sh $(srcdir)/test/encoding/readable.sh ../ceph-object-corpus base: ceph-mon ceph-osd ceph-mds \ diff -Nru ceph-0.67.4/src/mds/Dumper.cc ceph-0.67.7/src/mds/Dumper.cc --- ceph-0.67.4/src/mds/Dumper.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/mds/Dumper.cc 2014-02-19 20:12:47.000000000 +0000 @@ -51,7 +51,8 @@ inodeno_t ino = MDS_INO_LOG_OFFSET + rank; unsigned pg_pool = CEPH_METADATA_RULE; osdmap = new OSDMap(); - objecter = new Objecter(g_ceph_context, messenger, monc, osdmap, lock, timer); + objecter = new Objecter(g_ceph_context, messenger, monc, osdmap, lock, timer, + 0, 0); journaler = new Journaler(ino, pg_pool, CEPH_FS_ONDISK_MAGIC, objecter, 0, 0, &timer); diff -Nru ceph-0.67.4/src/mds/MDCache.cc ceph-0.67.7/src/mds/MDCache.cc --- ceph-0.67.4/src/mds/MDCache.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/mds/MDCache.cc 2014-02-19 20:12:47.000000000 +0000 @@ -632,7 +632,7 @@ CDir *dir = strays[i]->get_dirfrag(fg); if (!dir) dir = strays[i]->get_or_open_dirfrag(this, fg); - if (!dir->is_complete()) { + if (dir->get_version() == 0) { dir->fetch(new C_MDS_RetryOpenRoot(this)); return; } @@ -653,6 +653,8 @@ assert(!open); open = true; mds->queue_waiters(waiting_for_open); + + scan_stray_dir(); } void MDCache::open_foreign_mdsdir(inodeno_t ino, Context *fin) @@ -9125,19 +9127,34 @@ // ------------------------------------------------------------------------------- // STRAYS -void MDCache::scan_stray_dir() +struct C_MDC_RetryScanStray : public Context { + MDCache *cache; + dirfrag_t next; + C_MDC_RetryScanStray(MDCache *c, dirfrag_t n) : cache(c), next(n) { } + void finish(int r) { + cache->scan_stray_dir(next); + } +}; + +void MDCache::scan_stray_dir(dirfrag_t next) { - dout(10) << "scan_stray_dir" << dendl; - + dout(10) << "scan_stray_dir " << next << dendl; + list ls; for (int i = 0; i < NUM_STRAY; ++i) { - if (strays[i]) { - strays[i]->get_dirfrags(ls); - } + if (strays[i]->ino() < next.ino) + continue; + strays[i]->get_dirfrags(ls); } for (list::iterator p = ls.begin(); p != ls.end(); ++p) { CDir *dir = *p; + if (dir->dirfrag() < next) + continue; + if (!dir->is_complete()) { + dir->fetch(new C_MDC_RetryScanStray(this, dir->dirfrag())); + return; + } for (CDir::map_t::iterator q = dir->items.begin(); q != dir->items.end(); ++q) { CDentry *dn = q->second; CDentry::linkage_t *dnl = dn->get_projected_linkage(); diff -Nru ceph-0.67.4/src/mds/MDCache.h ceph-0.67.7/src/mds/MDCache.h --- ceph-0.67.4/src/mds/MDCache.h 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/mds/MDCache.h 2014-02-19 20:12:47.000000000 +0000 @@ -858,7 +858,6 @@ // -- stray -- public: - void scan_stray_dir(); void eval_stray(CDentry *dn); void eval_remote(CDentry *dn); @@ -872,6 +871,7 @@ eval_stray(dn); } protected: + void scan_stray_dir(dirfrag_t next=dirfrag_t()); void fetch_backtrace(inodeno_t ino, int64_t pool, bufferlist& bl, Context *fin); void remove_backtrace(inodeno_t ino, int64_t pool, Context *fin); void _purge_forwarding_pointers(bufferlist& bl, CDentry *dn, int r); @@ -880,6 +880,7 @@ void _purge_stray_purged(CDentry *dn, int r=0); void _purge_stray_logged(CDentry *dn, version_t pdv, LogSegment *ls); void _purge_stray_logged_truncate(CDentry *dn, LogSegment *ls); + friend class C_MDC_RetryScanStray; friend class C_MDC_FetchedBacktrace; friend class C_MDC_PurgeForwardingPointers; friend class C_MDC_PurgeStray; diff -Nru ceph-0.67.4/src/mds/MDLog.cc ceph-0.67.7/src/mds/MDLog.cc --- ceph-0.67.4/src/mds/MDLog.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/mds/MDLog.cc 2014-02-19 20:12:47.000000000 +0000 @@ -493,7 +493,11 @@ if (journaler->get_error()) { r = journaler->get_error(); dout(0) << "_replay journaler got error " << r << ", aborting" << dendl; - if (r == -EINVAL) { + if (r == -ENOENT) { + // journal has been trimmed by somebody else? + assert(journaler->is_readonly()); + r = -EAGAIN; + } else if (r == -EINVAL) { if (journaler->get_read_pos() < journaler->get_expire_pos()) { // this should only happen if you're following somebody else assert(journaler->is_readonly()); diff -Nru ceph-0.67.4/src/mds/MDS.cc ceph-0.67.7/src/mds/MDS.cc --- ceph-0.67.4/src/mds/MDS.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/mds/MDS.cc 2014-02-19 20:12:47.000000000 +0000 @@ -117,7 +117,8 @@ mdsmap = new MDSMap; osdmap = new OSDMap; - objecter = new Objecter(m->cct, messenger, monc, osdmap, mds_lock, timer); + objecter = new Objecter(m->cct, messenger, monc, osdmap, mds_lock, timer, + 0, 0); objecter->unset_honor_osdmap_full(); filer = new Filer(objecter); @@ -1520,7 +1521,6 @@ mdcache->open_root(); mdcache->clean_open_file_lists(); - mdcache->scan_stray_dir(); mdcache->export_remaining_imported_caps(); finish_contexts(g_ceph_context, waiting_for_replay); // kick waiters finish_contexts(g_ceph_context, waiting_for_active); // kick waiters diff -Nru ceph-0.67.4/src/mds/MDSMap.cc ceph-0.67.7/src/mds/MDSMap.cc --- ceph-0.67.4/src/mds/MDSMap.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/mds/MDSMap.cc 2014-02-19 20:12:47.000000000 +0000 @@ -114,7 +114,7 @@ f->close_section(); f->open_object_section("info"); for (map::const_iterator p = mds_info.begin(); p != mds_info.end(); ++p) { - char s[10]; + char s[25]; // 'gid_' + len(str(ULLONG_MAX)) + '\0' sprintf(s, "gid_%llu", (long long unsigned)p->first); f->open_object_section(s); p->second.dump(f); diff -Nru ceph-0.67.4/src/mds/Resetter.cc ceph-0.67.7/src/mds/Resetter.cc --- ceph-0.67.4/src/mds/Resetter.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/mds/Resetter.cc 2014-02-19 20:12:47.000000000 +0000 @@ -59,7 +59,8 @@ inodeno_t ino = MDS_INO_LOG_OFFSET + rank; unsigned pg_pool = CEPH_METADATA_RULE; osdmap = new OSDMap(); - objecter = new Objecter(g_ceph_context, messenger, monc, osdmap, lock, timer); + objecter = new Objecter(g_ceph_context, messenger, monc, osdmap, lock, timer, + 0, 0); journaler = new Journaler(ino, pg_pool, CEPH_FS_ONDISK_MAGIC, objecter, 0, 0, &timer); diff -Nru ceph-0.67.4/src/mon/MDSMonitor.cc ceph-0.67.7/src/mon/MDSMonitor.cc --- ceph-0.67.4/src/mon/MDSMonitor.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/mon/MDSMonitor.cc 2014-02-19 20:12:47.000000000 +0000 @@ -951,6 +951,7 @@ ss << "this is DANGEROUS and will wipe out the mdsmap's fs, and may clobber data in the new pools you specify. add --yes-i-really-mean-it if you do."; r = -EPERM; } else { + newmap.inc = pending_mdsmap.inc; pending_mdsmap = newmap; pending_mdsmap.epoch = mdsmap.epoch + 1; create_new_fs(pending_mdsmap, metadata, data); @@ -1149,14 +1150,15 @@ << " " << ceph_mds_state_name(info.state) << " (laggy)" << dendl; pending_mdsmap.mds_info.erase(gid); + do_propose = true; } else if (!info.laggy()) { dout(10) << " marking " << gid << " " << info.addr << " mds." << info.rank << "." << info.inc << " " << ceph_mds_state_name(info.state) << " laggy" << dendl; info.laggy_since = now; + do_propose = true; } last_beacon.erase(gid); - do_propose = true; } } diff -Nru ceph-0.67.4/src/mon/MonClient.cc ceph-0.67.7/src/mon/MonClient.cc --- ceph-0.67.4/src/mon/MonClient.cc 2013-09-18 01:43:50.000000000 +0000 +++ ceph-0.67.7/src/mon/MonClient.cc 2014-02-19 20:12:47.000000000 +0000 @@ -810,6 +810,23 @@ ack->put(); } +int MonClient::_cancel_mon_command(uint64_t tid, int r) +{ + assert(monc_lock.is_locked()); + + map::iterator it = mon_commands.find(tid); + if (it == mon_commands.end()) { + ldout(cct, 10) << __func__ << " tid " << tid << " dne" << dendl; + return -ENOENT; + } + + ldout(cct, 10) << __func__ << " tid " << tid << dendl; + + MonCommand *cmd = it->second; + _finish_command(cmd, -ETIMEDOUT, ""); + return 0; +} + void MonClient::_finish_command(MonCommand *r, int ret, string rs) { ldout(cct, 10) << "_finish_command " << r->tid << " = " << ret << " " << rs << dendl; @@ -834,6 +851,10 @@ r->poutbl = outbl; r->prs = outs; r->onfinish = onfinish; + if (cct->_conf->rados_mon_op_timeout > 0) { + r->ontimeout = new C_CancelMonCommand(r->tid, this); + timer.add_event_after(cct->_conf->rados_mon_op_timeout, r->ontimeout); + } mon_commands[r->tid] = r; _send_command(r); // can't fail diff -Nru ceph-0.67.4/src/mon/MonClient.h ceph-0.67.7/src/mon/MonClient.h --- ceph-0.67.4/src/mon/MonClient.h 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/mon/MonClient.h 2014-02-19 20:12:47.000000000 +0000 @@ -280,18 +280,30 @@ bufferlist *poutbl; string *prs; int *prval; - Context *onfinish; + Context *onfinish, *ontimeout; MonCommand(uint64_t t) : target_rank(-1), tid(t), - poutbl(NULL), prs(NULL), prval(NULL), onfinish(NULL) + poutbl(NULL), prs(NULL), prval(NULL), onfinish(NULL), ontimeout(NULL) {} }; map mon_commands; + class C_CancelMonCommand : public Context + { + uint64_t tid; + MonClient *monc; + public: + C_CancelMonCommand(uint64_t tid, MonClient *monc) : tid(tid), monc(monc) {} + void finish(int r) { + monc->_cancel_mon_command(tid, -ETIMEDOUT); + } + }; + void _send_command(MonCommand *r); void _resend_mon_commands(); + int _cancel_mon_command(uint64_t tid, int r); void _finish_command(MonCommand *r, int ret, string rs); void handle_mon_command_ack(MMonCommandAck *ack); diff -Nru ceph-0.67.4/src/mon/MonCommands.h ceph-0.67.7/src/mon/MonCommands.h --- ceph-0.67.4/src/mon/MonCommands.h 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/mon/MonCommands.h 2014-02-19 20:12:47.000000000 +0000 @@ -325,6 +325,11 @@ COMMAND("osd getcrushmap " \ "name=epoch,type=CephInt,range=0,req=false", \ "get CRUSH map", "osd", "r", "cli,rest") +COMMAND("osd perf", \ + "print dump of OSD perf summary stats", \ + "osd", \ + "r", \ + "cli,rest") COMMAND("osd getmaxosd", "show largest OSD id", "osd", "r", "cli,rest") COMMAND("osd find " \ "name=id,type=CephInt,range=0", \ diff -Nru ceph-0.67.4/src/mon/Monitor.cc ceph-0.67.7/src/mon/Monitor.cc --- ceph-0.67.4/src/mon/Monitor.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/mon/Monitor.cc 2014-02-19 20:12:47.000000000 +0000 @@ -1739,17 +1739,17 @@ stringstream ss; health_status_t overall = HEALTH_OK; if (!summary.empty()) { - if (f) { - f->open_object_section("item"); - f->dump_stream("severity") << summary.front().first; - f->dump_string("summary", summary.front().second); - f->close_section(); - } ss << ' '; while (!summary.empty()) { if (overall > summary.front().first) overall = summary.front().first; ss << summary.front().second; + if (f) { + f->open_object_section("item"); + f->dump_stream("severity") << summary.front().first; + f->dump_string("summary", summary.front().second); + f->close_section(); + } summary.pop_front(); if (!summary.empty()) ss << "; "; diff -Nru ceph-0.67.4/src/mon/OSDMonitor.cc ceph-0.67.7/src/mon/OSDMonitor.cc --- ceph-0.67.4/src/mon/OSDMonitor.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/mon/OSDMonitor.cc 2014-02-19 20:12:47.000000000 +0000 @@ -430,7 +430,8 @@ void OSDMonitor::remove_down_pg_temp() { dout(10) << "remove_down_pg_temp" << dendl; - OSDMap tmpmap(osdmap); + OSDMap tmpmap; + tmpmap.deepish_copy_from(osdmap); tmpmap.apply_incremental(pending_inc); for (map >::iterator p = tmpmap.pg_temp->begin(); @@ -1375,6 +1376,7 @@ dout(10) << "preprocess_pgtemp " << *m << dendl; vector empty; int from = m->get_orig_source().num(); + size_t ignore_cnt = 0; // check caps MonSession *session = m->get_session(); @@ -1395,7 +1397,25 @@ for (map >::iterator p = m->pg_temp.begin(); p != m->pg_temp.end(); ++p) { dout(20) << " " << p->first << (osdmap.pg_temp->count(p->first) ? (*osdmap.pg_temp)[p->first] : empty) - << " -> " << p->second << dendl; + << " -> " << p->second << dendl; + + // does the pool exist? + if (!osdmap.have_pg_pool(p->first.pool())) { + /* + * 1. If the osdmap does not have the pool, it means the pool has been + * removed in-between the osd sending this message and us handling it. + * 2. If osdmap doesn't have the pool, it is safe to assume the pool does + * not exist in the pending either, as the osds would not send a + * message about a pool they know nothing about (yet). + * 3. However, if the pool does exist in the pending, then it must be a + * new pool, and not relevant to this message (see 1). + */ + dout(10) << __func__ << " ignore " << p->first << " -> " << p->second + << ": pool has been removed" << dendl; + ignore_cnt++; + continue; + } + // removal? if (p->second.empty() && osdmap.pg_temp->count(p->first)) return false; @@ -1405,6 +1425,10 @@ return false; } + // should we ignore all the pgs? + if (ignore_cnt == m->pg_temp.size()) + goto ignore; + dout(7) << "preprocess_pgtemp e" << m->map_epoch << " no changes from " << m->get_orig_source_inst() << dendl; _reply_map(m, m->map_epoch); return true; @@ -1418,8 +1442,20 @@ { int from = m->get_orig_source().num(); dout(7) << "prepare_pgtemp e" << m->map_epoch << " from " << m->get_orig_source_inst() << dendl; - for (map >::iterator p = m->pg_temp.begin(); p != m->pg_temp.end(); ++p) + for (map >::iterator p = m->pg_temp.begin(); p != m->pg_temp.end(); ++p) { + uint64_t pool = p->first.pool(); + if (pending_inc.old_pools.count(pool)) { + dout(10) << __func__ << " ignore " << p->first << " -> " << p->second + << ": pool pending removal" << dendl; + continue; + } + if (!osdmap.have_pg_pool(pool)) { + dout(10) << __func__ << " ignore " << p->first << " -> " << p->second + << ": pool has been removed" << dendl; + continue; + } pending_inc.new_pg_temp[p->first] = p->second; + } pending_inc.new_up_thru[from] = m->map_epoch; // set up_thru too, so the osd doesn't have to ask again wait_for_finished_proposal(new C_ReplyMap(this, m, m->map_epoch)); return true; @@ -1995,7 +2031,8 @@ prefix == "osd tree" || prefix == "osd ls" || prefix == "osd getmap" || - prefix == "osd getcrushmap") { + prefix == "osd getcrushmap" || + prefix == "osd perf") { string val; epoch_t epoch = 0; @@ -2067,6 +2104,17 @@ } else if (prefix == "osd getcrushmap") { p->crush->encode(rdata); ss << "got crush map from osdmap epoch " << p->get_epoch(); + } else if (prefix == "osd perf") { + const PGMap &pgm = mon->pgmon()->pg_map; + if (f) { + f->open_object_section("osdstats"); + pgm.dump_osd_perf_stats(f.get()); + f->close_section(); + f->flush(ds); + } else { + pgm.print_osd_perf_stats(&ds); + } + rdata.append(ds); } if (p != &osdmap) delete p; @@ -3144,17 +3192,15 @@ long osd = parse_osd_id(idvec[j].c_str(), &ss); if (osd < 0) { ss << "invalid osd id" << osd; - // XXX -EINVAL here? + err = -EINVAL; continue; } else if (!osdmap.exists(osd)) { ss << "osd." << osd << " does not exist. "; - err = 0; continue; } if (prefix == "osd down") { if (osdmap.is_down(osd)) { ss << "osd." << osd << " is already down. "; - err = 0; } else { pending_inc.new_state[osd] = CEPH_OSD_UP; ss << "marked down osd." << osd << ". "; @@ -3163,7 +3209,6 @@ } else if (prefix == "osd out") { if (osdmap.is_out(osd)) { ss << "osd." << osd << " is already out. "; - err = 0; } else { pending_inc.new_weight[osd] = CEPH_OSD_OUT; ss << "marked out osd." << osd << ". "; @@ -3172,7 +3217,6 @@ } else if (prefix == "osd in") { if (osdmap.is_in(osd)) { ss << "osd." << osd << " is already in. "; - err = 0; } else { pending_inc.new_weight[osd] = CEPH_OSD_IN; ss << "marked in osd." << osd << ". "; @@ -3180,20 +3224,25 @@ } } else if (prefix == "osd rm") { if (osdmap.is_up(osd)) { - ss << "osd." << osd << " is still up; must be down before removal. "; + if (any) + ss << ", "; + ss << "osd." << osd << " is still up; must be down before removal. "; + err = -EBUSY; } else { pending_inc.new_state[osd] = osdmap.get_state(osd); - if (any) + pending_inc.new_uuid[osd] = uuid_d(); + if (any) { ss << ", osd." << osd; - else + } else { ss << "removed osd." << osd; + } any = true; } } } if (any) { getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, err, rs, get_last_committed())); return true; } } else if (prefix == "osd reweight") { @@ -3521,7 +3570,23 @@ } else { const pg_pool_t *p = osdmap.get_pg_pool(pool); int64_t n; - cmd_getval(g_ceph_context, cmdmap, "val", n); + if (!cmd_getval(g_ceph_context, cmdmap, "val", n)) { + // try to get it as a string. this is a kludge for forward + // compatibility for future json schemas that pass 'val' as a + // string. + string val; + if (!cmd_getval(g_ceph_context, cmdmap, "val", val)) { + err = -EINVAL; + goto reply; + } + string interr; + n = strict_strtoll(val.c_str(), 10, &interr); + if (interr.length()) { + ss << interr; + err = -EINVAL; + goto reply; + } + } string var; cmd_getval(g_ceph_context, cmdmap, "var", var); if (pending_inc.new_pools.count(pool) == 0) diff -Nru ceph-0.67.4/src/mon/PGMap.cc ceph-0.67.7/src/mon/PGMap.cc --- ceph-0.67.4/src/mon/PGMap.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/mon/PGMap.cc 2014-02-19 20:12:47.000000000 +0000 @@ -5,6 +5,7 @@ #define dout_subsys ceph_subsys_mon #include "common/debug.h" +#include "common/TextTable.h" #include "include/stringify.h" #include "common/Formatter.h" #include "include/ceph_features.h" @@ -698,6 +699,40 @@ dump_pg_stats_plain(ss, stuck_pg_stats); } +void PGMap::dump_osd_perf_stats(Formatter *f) const +{ + f->open_array_section("osd_perf_infos"); + for (hash_map::const_iterator i = osd_stat.begin(); + i != osd_stat.end(); + ++i) { + f->open_object_section("osd"); + f->dump_int("id", i->first); + { + f->open_object_section("perf_stats"); + i->second.fs_perf_stat.dump(f); + f->close_section(); + } + f->close_section(); + } + f->close_section(); +} +void PGMap::print_osd_perf_stats(std::ostream *ss) const +{ + TextTable tab; + tab.define_column("osdid", TextTable::LEFT, TextTable::RIGHT); + tab.define_column("fs_commit_latency(ms)", TextTable::LEFT, TextTable::RIGHT); + tab.define_column("fs_apply_latency(ms)", TextTable::LEFT, TextTable::RIGHT); + for (hash_map::const_iterator i = osd_stat.begin(); + i != osd_stat.end(); + ++i) { + tab << i->first; + tab << i->second.fs_perf_stat.filestore_commit_latency; + tab << i->second.fs_perf_stat.filestore_apply_latency; + tab << TextTable::endrow; + } + (*ss) << tab; +} + void PGMap::recovery_summary(Formatter *f, ostream *out) const { bool first = true; diff -Nru ceph-0.67.4/src/mon/PGMap.h ceph-0.67.7/src/mon/PGMap.h --- ceph-0.67.4/src/mon/PGMap.h 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/mon/PGMap.h 2014-02-19 20:12:47.000000000 +0000 @@ -168,6 +168,9 @@ void dump(ostream& ss) const; + void dump_osd_perf_stats(Formatter *f) const; + void print_osd_perf_stats(std::ostream *ss) const; + void recovery_summary(Formatter *f, ostream *out) const; void print_summary(Formatter *f, ostream *out) const; diff -Nru ceph-0.67.4/src/mon/Session.h ceph-0.67.7/src/mon/Session.h --- ceph-0.67.4/src/mon/Session.h 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/mon/Session.h 2014-02-19 20:12:47.000000000 +0000 @@ -147,7 +147,8 @@ bool backward = true, forward = true; while (backward || forward) { if (backward) { - if (osdmap->is_up(b->first)) { + if (osdmap->is_up(b->first) && + osdmap->get_addr(b->first) == b->second->con->get_peer_addr()) { s = b->second; break; } diff -Nru ceph-0.67.4/src/msg/Pipe.cc ceph-0.67.7/src/msg/Pipe.cc --- ceph-0.67.4/src/msg/Pipe.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/msg/Pipe.cc 2014-02-19 20:12:48.000000000 +0000 @@ -193,12 +193,14 @@ continue; } utime_t release = delay_queue.front().first; - if (release > ceph_clock_now(pipe->msgr->cct)) { + Message *m = delay_queue.front().second; + string delay_msg_type = pipe->msgr->cct->_conf->ms_inject_delay_msg_type; + if (release > ceph_clock_now(pipe->msgr->cct) && + (delay_msg_type.empty() || m->get_type_name() == delay_msg_type)) { lgeneric_subdout(pipe->msgr->cct, ms, 10) << pipe->_pipe_prefix(_dout) << "DelayedDelivery::entry sleeping on delay_cond until " << release << dendl; delay_cond.WaitUntil(delay_lock, release); continue; } - Message *m = delay_queue.front().second; lgeneric_subdout(pipe->msgr->cct, ms, 10) << pipe->_pipe_prefix(_dout) << "DelayedDelivery::entry dequeuing message " << m << " for delivery, past " << release << dendl; delay_queue.pop_front(); pipe->in_q->enqueue(m, m->get_priority(), pipe->conn_id); diff -Nru ceph-0.67.4/src/os/FileStore.cc ceph-0.67.7/src/os/FileStore.cc --- ceph-0.67.4/src/os/FileStore.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/os/FileStore.cc 2014-02-19 20:12:48.000000000 +0000 @@ -101,6 +101,22 @@ #define REPLAY_GUARD_XATTR "user.cephos.seq" #define GLOBAL_REPLAY_GUARD_XATTR "user.cephos.gseq" +//Initial features in new superblock. +static CompatSet get_fs_initial_compat_set() { + CompatSet::FeatureSet ceph_osd_feature_compat; + CompatSet::FeatureSet ceph_osd_feature_ro_compat; + CompatSet::FeatureSet ceph_osd_feature_incompat; + return CompatSet(ceph_osd_feature_compat, ceph_osd_feature_ro_compat, + ceph_osd_feature_incompat); +} + +//Features are added here that this FileStore supports. +static CompatSet get_fs_supported_compat_set() { + CompatSet compat = get_fs_initial_compat_set(); + //Any features here can be set in code, but not in initial superblock + return compat; +} + /* * long file names will have the following format: * @@ -126,6 +142,17 @@ #define ALIGNED(x, by) (!((x) % (by))) #define ALIGN_UP(x, by) (ALIGNED((x), (by)) ? (x) : (ALIGN_DOWN((x), (by)) + (by))) +void FileStore::FSPerfTracker::update_from_perfcounters( + PerfCounters &logger) +{ + os_commit_latency.consume_next( + logger.get_tavg_ms( + l_os_commit_lat)); + os_apply_latency.consume_next( + logger.get_tavg_ms( + l_os_apply_lat)); +} + ostream& operator<<(ostream& out, const FileStore::OpSequencer& s) { @@ -478,6 +505,8 @@ g_ceph_context->get_perfcounters_collection()->add(logger); g_ceph_context->_conf->add_observer(this); + + superblock.compat_features = get_fs_initial_compat_set(); } FileStore::~FileStore() @@ -679,6 +708,13 @@ goto close_fsid_fd; } + ret = write_superblock(); + if (ret < 0) { + derr << "mkfs: write_superblock() failed: " + << cpp_strerror(ret) << dendl; + goto close_fsid_fd; + } + struct statfs basefs; ret = ::fstatfs(basedir_fd, &basefs); if (ret < 0) { @@ -1065,14 +1101,7 @@ chain_fsetxattr(tmpfd, "user.test4", &buf, sizeof(buf)); ret = chain_fsetxattr(tmpfd, "user.test5", &buf, sizeof(buf)); if (ret == -ENOSPC) { - if (!g_conf->filestore_xattr_use_omap) { - dout(0) << "limited size xattrs -- automatically enabling filestore_xattr_use_omap" << dendl; - g_conf->set_val("filestore_xattr_use_omap", "true"); - g_conf->apply_changes(NULL); - assert(g_conf->filestore_xattr_use_omap == true); - } else { - dout(0) << "limited size xattrs -- filestore_xattr_use_omap already enabled" << dendl; - } + dout(0) << "limited size xattrs" << dendl; } chain_fremovexattr(tmpfd, "user.test"); chain_fremovexattr(tmpfd, "user.test2"); @@ -1339,6 +1368,52 @@ return 0; } +int FileStore::write_superblock() +{ + char fn[PATH_MAX]; + snprintf(fn, sizeof(fn), "%s/superblock", basedir.c_str()); + int fd = ::open(fn, O_WRONLY|O_CREAT|O_TRUNC, 0644); + if (fd < 0) + return -errno; + bufferlist bl; + ::encode(superblock, bl); + + int ret = safe_write(fd, bl.c_str(), bl.length()); + if (ret < 0) + goto out; + ret = ::fsync(fd); + if (ret < 0) + ret = -errno; + // XXX: fsync() man page says I need to sync containing directory +out: + TEMP_FAILURE_RETRY(::close(fd)); + return ret; +} + +int FileStore::read_superblock() +{ + char fn[PATH_MAX]; + snprintf(fn, sizeof(fn), "%s/superblock", basedir.c_str()); + int fd = ::open(fn, O_RDONLY, 0644); + if (fd < 0) { + if (errno == ENOENT) { + // If the file doesn't exist write initial CompatSet + return write_superblock(); + } else + return -errno; + } + bufferptr bp(PATH_MAX); + int ret = safe_read(fd, bp.c_str(), bp.length()); + TEMP_FAILURE_RETRY(::close(fd)); + if (ret < 0) + return ret; + bufferlist bl; + bl.push_back(bp); + bufferlist::iterator i = bl.begin(); + ::decode(superblock, i); + return 0; +} + int FileStore::update_version_stamp() { return write_version_stamp(); @@ -1426,6 +1501,7 @@ char buf[PATH_MAX]; uint64_t initial_op_seq; set cluster_snaps; + CompatSet supported_compat_set = get_fs_supported_compat_set(); dout(5) << "basedir " << basedir << " journal " << journalpath << dendl; @@ -1490,6 +1566,20 @@ } } + ret = read_superblock(); + if (ret < 0) { + ret = -EINVAL; + goto close_fsid_fd; + } + + // Check if this FileStore supports all the necessary features to mount + if (supported_compat_set.compare(superblock.compat_features) == -1) { + derr << "FileStore::mount : Incompatible features set " + << superblock.compat_features << dendl; + ret = -EINVAL; + goto close_fsid_fd; + } + // open some dir handles basedir_fd = ::open(basedir.c_str(), O_RDONLY); if (basedir_fd < 0) { @@ -3872,7 +3962,7 @@ get_attrname(name, n, CHAIN_XATTR_MAX_NAME_LEN); r = _fgetattr(**fd, n, bp); lfn_close(fd); - if (r == -ENODATA && g_conf->filestore_xattr_use_omap) { + if (r == -ENODATA) { map got; set to_get; to_get.insert(string(name)); @@ -3908,6 +3998,9 @@ int FileStore::getattrs(coll_t cid, const hobject_t& oid, map& aset, bool user_only) { + set omap_attrs; + map omap_aset; + Index index; dout(15) << "getattrs " << cid << "/" << oid << dendl; FDRef fd; int r = lfn_open(cid, oid, false, &fd); @@ -3915,43 +4008,43 @@ goto out; } r = _fgetattrs(**fd, aset, user_only); + if (r < 0) { + goto out; + } lfn_close(fd); - if (g_conf->filestore_xattr_use_omap) { - set omap_attrs; - map omap_aset; - Index index; - int r = get_index(cid, &index); - if (r < 0) { - dout(10) << __func__ << " could not get index r = " << r << dendl; - goto out; - } - r = object_map->get_all_xattrs(oid, &omap_attrs); - if (r < 0 && r != -ENOENT) { - dout(10) << __func__ << " could not get omap_attrs r = " << r << dendl; - goto out; - } - r = object_map->get_xattrs(oid, omap_attrs, &omap_aset); - if (r < 0 && r != -ENOENT) { - dout(10) << __func__ << " could not get omap_attrs r = " << r << dendl; - goto out; - } - assert(omap_attrs.size() == omap_aset.size()); - for (map::iterator i = omap_aset.begin(); + r = get_index(cid, &index); + if (r < 0) { + dout(10) << __func__ << " could not get index r = " << r << dendl; + goto out; + } + r = object_map->get_all_xattrs(oid, &omap_attrs); + if (r < 0 && r != -ENOENT) { + dout(10) << __func__ << " could not get omap_attrs r = " << r << dendl; + goto out; + } + r = object_map->get_xattrs(oid, omap_attrs, &omap_aset); + if (r < 0 && r != -ENOENT) { + dout(10) << __func__ << " could not get omap_attrs r = " << r << dendl; + goto out; + } + if (r == -ENOENT) + r = 0; + assert(omap_attrs.size() == omap_aset.size()); + for (map::iterator i = omap_aset.begin(); i != omap_aset.end(); ++i) { - string key; - if (user_only) { + string key; + if (user_only) { if (i->first[0] != '_') continue; if (i->first == "_") continue; key = i->first.substr(1, i->first.size()); - } else { + } else { key = i->first; - } - aset.insert(make_pair(key, - bufferptr(i->second.c_str(), i->second.length()))); } + aset.insert(make_pair(key, + bufferptr(i->second.c_str(), i->second.length()))); } out: dout(10) << "getattrs " << cid << "/" << oid << " = " << r << dendl; @@ -3977,10 +4070,8 @@ if (r < 0) { goto out; } - if (g_conf->filestore_xattr_use_omap) { - r = _fgetattrs(**fd, inline_set, false); - assert(!m_filestore_fail_eio || r != -EIO); - } + r = _fgetattrs(**fd, inline_set, false); + assert(!m_filestore_fail_eio || r != -EIO); dout(15) << "setattrs " << cid << "/" << oid << dendl; r = 0; for (map::iterator p = aset.begin(); @@ -3988,8 +4079,8 @@ ++p) { char n[CHAIN_XATTR_MAX_NAME_LEN]; get_attrname(p->first.c_str(), n, CHAIN_XATTR_MAX_NAME_LEN); - if (g_conf->filestore_xattr_use_omap) { - if (p->second.length() > g_conf->filestore_max_inline_xattr_size) { + + if (p->second.length() > g_conf->filestore_max_inline_xattr_size) { if (inline_set.count(p->first)) { inline_set.erase(p->first); r = chain_fremovexattr(**fd, n); @@ -3998,9 +4089,9 @@ } omap_set[p->first].push_back(p->second); continue; - } + } - if (!inline_set.count(p->first) && + if (!inline_set.count(p->first) && inline_set.size() >= g_conf->filestore_max_inline_xattrs) { if (inline_set.count(p->first)) { inline_set.erase(p->first); @@ -4010,10 +4101,9 @@ } omap_set[p->first].push_back(p->second); continue; - } - omap_remove.insert(p->first); - inline_set.insert(*p); } + omap_remove.insert(p->first); + inline_set.insert(*p); inline_to_set.insert(*p); @@ -4024,7 +4114,6 @@ goto out_close; if (!omap_remove.empty()) { - assert(g_conf->filestore_xattr_use_omap); r = object_map->remove_xattrs(oid, omap_remove, &spos); if (r < 0 && r != -ENOENT) { dout(10) << __func__ << " could not remove_xattrs r = " << r << dendl; @@ -4034,7 +4123,6 @@ } if (!omap_set.empty()) { - assert(g_conf->filestore_xattr_use_omap); r = object_map->set_xattrs(oid, omap_set, &spos); if (r < 0) { dout(10) << __func__ << " could not set_xattrs r = " << r << dendl; @@ -4062,7 +4150,7 @@ char n[CHAIN_XATTR_MAX_NAME_LEN]; get_attrname(name, n, CHAIN_XATTR_MAX_NAME_LEN); r = chain_fremovexattr(**fd, n); - if (r == -ENODATA && g_conf->filestore_xattr_use_omap) { + if (r == -ENODATA) { Index index; r = get_index(cid, &index); if (r < 0) { @@ -4092,6 +4180,8 @@ map aset; FDRef fd; + set omap_attrs; + Index index; int r = lfn_open(cid, oid, false, &fd); if (r < 0) { goto out; @@ -4108,26 +4198,24 @@ } lfn_close(fd); - if (g_conf->filestore_xattr_use_omap) { - set omap_attrs; - Index index; - r = get_index(cid, &index); - if (r < 0) { - dout(10) << __func__ << " could not get index r = " << r << dendl; - return r; - } - r = object_map->get_all_xattrs(oid, &omap_attrs); - if (r < 0 && r != -ENOENT) { - dout(10) << __func__ << " could not get omap_attrs r = " << r << dendl; - assert(!m_filestore_fail_eio || r != -EIO); - return r; - } - r = object_map->remove_xattrs(oid, omap_attrs, &spos); - if (r < 0 && r != -ENOENT) { - dout(10) << __func__ << " could not remove omap_attrs r = " << r << dendl; - return r; - } + r = get_index(cid, &index); + if (r < 0) { + dout(10) << __func__ << " could not get index r = " << r << dendl; + return r; + } + r = object_map->get_all_xattrs(oid, &omap_attrs); + if (r < 0 && r != -ENOENT) { + dout(10) << __func__ << " could not get omap_attrs r = " << r << dendl; + assert(!m_filestore_fail_eio || r != -EIO); + return r; } + r = object_map->remove_xattrs(oid, omap_attrs, &spos); + if (r < 0 && r != -ENOENT) { + dout(10) << __func__ << " could not remove omap_attrs r = " << r << dendl; + return r; + } + if (r == -ENOENT) + r = 0; out: dout(10) << "rmattrs " << cid << "/" << oid << " = " << r << dendl; return r; @@ -5037,3 +5125,39 @@ m_filestore_dump_fmt.flush(m_filestore_dump); m_filestore_dump.flush(); } + +// -- FSSuperblock -- + +void FSSuperblock::encode(bufferlist &bl) const +{ + ENCODE_START(1, 1, bl); + compat_features.encode(bl); + ENCODE_FINISH(bl); +} + +void FSSuperblock::decode(bufferlist::iterator &bl) +{ + DECODE_START(1, bl); + compat_features.decode(bl); + DECODE_FINISH(bl); +} + +void FSSuperblock::dump(Formatter *f) const +{ + f->open_object_section("compat"); + compat_features.dump(f); + f->close_section(); +} + +void FSSuperblock::generate_test_instances(list& o) +{ + FSSuperblock z; + o.push_back(new FSSuperblock(z)); + CompatSet::FeatureSet feature_compat; + CompatSet::FeatureSet feature_ro_compat; + CompatSet::FeatureSet feature_incompat; + feature_incompat.insert(CEPH_FS_FEATURE_INCOMPAT_SHARDS); + z.compat_features = CompatSet(feature_compat, feature_ro_compat, + feature_incompat); + o.push_back(new FSSuperblock(z)); +} diff -Nru ceph-0.67.4/src/os/FileStore.h ceph-0.67.7/src/os/FileStore.h --- ceph-0.67.4/src/os/FileStore.h 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/os/FileStore.h 2014-02-19 20:12:48.000000000 +0000 @@ -51,10 +51,49 @@ # define FALLOC_FL_PUNCH_HOLE 0x2 #endif +#define CEPH_FS_FEATURE_INCOMPAT_SHARDS CompatSet::Feature(1, "sharded objects") + +class FSSuperblock { +public: + CompatSet compat_features; + + FSSuperblock() { } + + void encode(bufferlist &bl) const; + void decode(bufferlist::iterator &bl); + void dump(Formatter *f) const; + static void generate_test_instances(list& o); +}; +WRITE_CLASS_ENCODER(FSSuperblock) + +inline ostream& operator<<(ostream& out, const FSSuperblock& sb) +{ + return out << "sb(" << sb.compat_features << ")"; +} + class FileStore : public JournalingObjectStore, public md_config_obs_t { public: + + struct FSPerfTracker { + PerfCounters::avg_tracker os_commit_latency; + PerfCounters::avg_tracker os_apply_latency; + + filestore_perf_stat_t get_cur_stats() const { + filestore_perf_stat_t ret; + ret.filestore_commit_latency = os_commit_latency.avg(); + ret.filestore_apply_latency = os_apply_latency.avg(); + return ret; + } + + void update_from_perfcounters(PerfCounters &logger); + } perf_tracker; + filestore_perf_stat_t get_cur_stats() { + perf_tracker.update_from_perfcounters(*logger); + return perf_tracker.get_cur_stats(); + } + static const uint32_t on_disk_version = 3; private: string internal_name; ///< internal name, used to name the perfcounter instance @@ -528,6 +567,25 @@ std::ofstream m_filestore_dump; JSONFormatter m_filestore_dump_fmt; atomic_t m_filestore_kill_at; + FSSuperblock superblock; + + /** + * write_superblock() + * + * Write superblock to persisent storage + * + * return value: 0 on success, otherwise negative errno + */ + int write_superblock(); + + /** + * read_superblock() + * + * Fill in FileStore::superblock by reading persistent storage + * + * return value: 0 on success, otherwise negative errno + */ + int read_superblock(); }; ostream& operator<<(ostream& out, const FileStore::OpSequencer& s); diff -Nru ceph-0.67.4/src/os/ObjectStore.h ceph-0.67.7/src/os/ObjectStore.h --- ceph-0.67.4/src/os/ObjectStore.h 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/os/ObjectStore.h 2014-02-19 20:12:48.000000000 +0000 @@ -81,6 +81,8 @@ Logger *logger; + virtual filestore_perf_stat_t get_cur_stats() = 0; + /** * a sequencer orders transactions * diff -Nru ceph-0.67.4/src/osd/OSD.cc ceph-0.67.7/src/osd/OSD.cc --- ceph-0.67.4/src/osd/OSD.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/osd/OSD.cc 2014-02-19 20:12:48.000000000 +0000 @@ -135,7 +135,9 @@ const coll_t coll_t::META_COLL("meta"); -static CompatSet get_osd_compat_set() { +//Initial features in new superblock. +//Features here are also automatically upgraded +CompatSet OSD::get_osd_initial_compat_set() { CompatSet::FeatureSet ceph_osd_feature_compat; CompatSet::FeatureSet ceph_osd_feature_ro_compat; CompatSet::FeatureSet ceph_osd_feature_incompat; @@ -153,6 +155,13 @@ ceph_osd_feature_incompat); } +//Features are added here that this OSD supports. +CompatSet OSD::get_osd_compat_set() { + CompatSet compat = get_osd_initial_compat_set(); + //Any features here can be set in code, but not in initial superblock + return compat; +} + OSDService::OSDService(OSD *osd) : osd(osd), whoami(osd->whoami), store(osd->store), clog(osd->clog), @@ -617,7 +626,7 @@ sb.cluster_fsid = fsid; sb.osd_fsid = store->get_fsid(); sb.whoami = whoami; - sb.compat_features = get_osd_compat_set(); + sb.compat_features = get_osd_initial_compat_set(); // benchmark? if (g_conf->osd_auto_weight) { @@ -1009,9 +1018,9 @@ bool OSD::asok_command(string command, cmdmap_t& cmdmap, string format, ostream& ss) { - if (format == "") - format = "json-pretty"; Formatter *f = new_formatter(format); + if (!f) + f = new_formatter("json-pretty"); if (command == "dump_ops_in_flight") { op_tracker.dump_ops_in_flight(f); } else if (command == "dump_historic_ops") { @@ -1153,11 +1162,12 @@ return r; } - if (osd_compat.compare(superblock.compat_features) != 0) { + CompatSet initial = get_osd_initial_compat_set(); + if (initial.compare(superblock.compat_features) != 0) { // We need to persist the new compat_set before we // do anything else dout(5) << "Upgrading superblock compat_set" << dendl; - superblock.compat_features = osd_compat; + superblock.compat_features = initial; ObjectStore::Transaction t; write_superblock(t); r = store->apply_transaction(t); @@ -2181,9 +2191,10 @@ int role = osdmap->calc_pg_role(whoami, acting, acting.size()); pg_history_t history = info.history; - project_pg_history(info.pgid, history, epoch, up, acting); + bool valid_history = project_pg_history( + info.pgid, history, epoch, up, acting); - if (epoch < history.same_interval_since) { + if (!valid_history || epoch < history.same_interval_since) { dout(10) << "get_or_create_pg " << info.pgid << " acting changed in " << history.same_interval_since << " (msg from " << epoch << ")" << dendl; return; @@ -2368,7 +2379,7 @@ * Fill in the passed history so you know same_interval_since, same_up_since, * and same_primary_since. */ -void OSD::project_pg_history(pg_t pgid, pg_history_t& h, epoch_t from, +bool OSD::project_pg_history(pg_t pgid, pg_history_t& h, epoch_t from, const vector& currentup, const vector& currentacting) { @@ -2382,7 +2393,11 @@ e > from; e--) { // verify during intermediate epoch (e-1) - OSDMapRef oldmap = get_map(e-1); + OSDMapRef oldmap = service.try_get_map(e-1); + if (!oldmap) { + dout(15) << __func__ << ": found map gap, returning false" << dendl; + return false; + } assert(oldmap->have_pg_pool(pgid.pool())); vector up, acting; @@ -2432,6 +2447,7 @@ } dout(15) << "project_pg_history end " << h << dendl; + return true; } // ------------------------------------- @@ -3652,6 +3668,8 @@ stat_lock.Lock(); osd_stat_t cur_stat = osd_stat; stat_lock.Unlock(); + + osd_stat.fs_perf_stat = store->get_cur_stats(); pg_stat_queue_lock.Lock(); @@ -4015,7 +4033,7 @@ int64_t bsize; // default count 1G, size 4MB cmd_getval(g_ceph_context, cmdmap, "count", count, (int64_t)1 << 30); - cmd_getval(g_ceph_context, cmdmap, "bsize", bsize, (int64_t)4 << 20); + cmd_getval(g_ceph_context, cmdmap, "size", bsize, (int64_t)4 << 20); bufferlist bl; bufferptr bp(bsize); @@ -4261,7 +4279,7 @@ } // does peer have old map? - if (name.is_osd() && + if (con->get_messenger() == cluster_messenger && osdmap->is_up(name.num()) && (osdmap->get_cluster_addr(name.num()) == con->get_peer_addr() || osdmap->get_hb_back_addr(name.num()) == con->get_peer_addr())) { @@ -4916,6 +4934,11 @@ m->put(); return; } + if (is_initializing()) { + dout(0) << "ignoring osdmap until we have initialized" << dendl; + m->put(); + return; + } Session *session = static_cast(m->get_connection()->get_priv()); if (session && !(session->entity_name.is_mon() || session->entity_name.is_osd())) { @@ -4974,6 +4997,7 @@ ObjectStore::Transaction &t = *_t; // store new maps: queue for disk and put in the osdmap cache + epoch_t last_marked_full = 0; epoch_t start = MAX(osdmap->get_epoch() + 1, first); for (epoch_t e = start; e <= last; e++) { map::iterator p; @@ -4984,6 +5008,8 @@ bufferlist& bl = p->second; o->decode(bl); + if (o->test_flag(CEPH_OSDMAP_FULL)) + last_marked_full = e; pinned_maps.push_back(add_map(o)); hobject_t fulloid = get_osdmap_pobject_name(e); @@ -5016,6 +5042,8 @@ assert(0 == "bad fsid"); } + if (o->test_flag(CEPH_OSDMAP_FULL)) + last_marked_full = e; pinned_maps.push_back(add_map(o)); bufferlist fbl; @@ -5051,6 +5079,8 @@ superblock.oldest_map = first; superblock.newest_map = last; + if (last_marked_full > superblock.last_map_marked_full) + superblock.last_map_marked_full = last_marked_full; map_lock.get_write(); @@ -5670,7 +5700,7 @@ } // ok, our map is same or newer.. do they still exist? - if (m->get_source().is_osd()) { + if (m->get_connection()->get_messenger() == cluster_messenger) { int from = m->get_source().num(); if (!osdmap->have_inst(from) || osdmap->get_cluster_addr(from) != m->get_source_inst().addr) { @@ -5855,7 +5885,12 @@ utime_t now = ceph_clock_now(NULL); history.last_scrub_stamp = now; history.last_deep_scrub_stamp = now; - project_pg_history(pgid, history, created, up, acting); + bool valid_history = + project_pg_history(pgid, history, created, up, acting); + /* the pg creation message must have come from a mon and therefore + * cannot be on the other side of a map gap + */ + assert(valid_history); // register. creating_pgs[pgid].history = history; @@ -5952,7 +5987,8 @@ void OSD::dispatch_context(PG::RecoveryCtx &ctx, PG *pg, OSDMapRef curmap) { - if (service.get_osdmap()->is_up(whoami)) { + if (service.get_osdmap()->is_up(whoami) && + is_active()) { do_notifies(*ctx.notify_list, curmap); do_queries(*ctx.query_map, curmap); do_infos(*ctx.info_map, curmap); @@ -6458,9 +6494,11 @@ // same primary? pg_history_t history = it->second.history; - project_pg_history(pgid, history, it->second.epoch_sent, up, acting); + bool valid_history = + project_pg_history(pgid, history, it->second.epoch_sent, up, acting); - if (it->second.epoch_sent < history.same_interval_since) { + if (!valid_history || + it->second.epoch_sent < history.same_interval_since) { dout(10) << " pg " << pgid << " dne, and pg has changed in " << history.same_interval_since << " (msg from " << it->second.epoch_sent << ")" << dendl; @@ -6524,9 +6562,11 @@ pg_history_t history = pg->info.history; vector up, acting; osdmap->pg_to_up_acting_osds(pgid, up, acting); - project_pg_history(pg->info.pgid, history, pg->get_osdmap()->get_epoch(), - up, acting); - if (history.same_interval_since <= m->get_epoch()) { + bool valid_history = + project_pg_history(pg->info.pgid, history, pg->get_osdmap()->get_epoch(), + up, acting); + if (valid_history && + history.same_interval_since <= m->get_epoch()) { assert(pg->get_primary() == m->get_source().num()); PGRef _pg(pg); _remove_pg(pg); @@ -6770,11 +6810,8 @@ flags = m->get_flags() & (CEPH_OSD_FLAG_ACK|CEPH_OSD_FLAG_ONDISK); MOSDOpReply *reply = new MOSDOpReply(m, err, osdmap->get_epoch(), flags); - Messenger *msgr = client_messenger; reply->set_version(v); - if (m->get_source().is_osd()) - msgr = cluster_messenger; - msgr->send_message(reply, m->get_connection()); + m->get_connection()->get_messenger()->send_message(reply, m->get_connection()); } void OSDService::handle_misdirected_op(PG *pg, OpRequestRef op) @@ -6849,9 +6886,11 @@ if (op->may_write()) { // full? if ((service.check_failsafe_full() || - osdmap->test_flag(CEPH_OSDMAP_FULL)) && + osdmap->test_flag(CEPH_OSDMAP_FULL) || + m->get_map_epoch() < superblock.last_map_marked_full) && !m->get_source().is_mds()) { // FIXME: we'll exclude mds writes for now. - service.reply_op_error(op, -ENOSPC); + // Drop the request, since the client will retry when the full + // flag is unset. return; } diff -Nru ceph-0.67.4/src/osd/OSD.h ceph-0.67.7/src/osd/OSD.h --- ceph-0.67.4/src/osd/OSD.h 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/osd/OSD.h 2014-02-19 20:12:48.000000000 +0000 @@ -666,6 +666,25 @@ return oid; } static void recursive_remove_collection(ObjectStore *store, coll_t tmp); + + /** + * get_osd_initial_compat_set() + * + * Get the initial feature set for this OSD. Features + * here are automatically upgraded. + * + * Return value: Initial osd CompatSet + */ + static CompatSet get_osd_initial_compat_set(); + + /** + * get_osd_compat_set() + * + * Get all features supported by this OSD + * + * Return value: CompatSet of all supported features + */ + static CompatSet get_osd_compat_set(); private: @@ -1113,8 +1132,12 @@ void build_past_intervals_parallel(); void calc_priors_during(pg_t pgid, epoch_t start, epoch_t end, set& pset); - void project_pg_history(pg_t pgid, pg_history_t& h, epoch_t from, - const vector& lastup, const vector& lastacting); + + /// project pg history from from to now + bool project_pg_history( + pg_t pgid, pg_history_t& h, epoch_t from, + const vector& lastup, const vector& lastacting + ); ///< @return false if there was a map gap between from and now void wake_pg_waiters(pg_t pgid) { if (waiting_for_pg.count(pgid)) { diff -Nru ceph-0.67.4/src/osd/OSDMap.h ceph-0.67.7/src/osd/OSDMap.h --- ceph-0.67.4/src/osd/OSDMap.h 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/osd/OSDMap.h 2014-02-19 20:12:48.000000000 +0000 @@ -226,6 +226,26 @@ memset(&fsid, 0, sizeof(fsid)); } + // no copying + /* oh, how i long for c++11... +private: + OSDMap(const OSDMap& other) = default; + const OSDMap& operator=(const OSDMap& other) = default; +public: + */ + + void deepish_copy_from(const OSDMap& o) { + *this = o; + pg_temp.reset(new map >(*o.pg_temp)); + osd_uuid.reset(new vector(*o.osd_uuid)); + + // NOTE: this still references shared entity_addr_t's. + osd_addrs.reset(new addrs_s(*o.osd_addrs)); + + // NOTE: we do not copy crush. note that apply_incremental will + // allocate a new CrushWrapper, though. + } + // map info const uuid_d& get_fsid() const { return fsid; } void set_fsid(uuid_d& f) { fsid = f; } diff -Nru ceph-0.67.4/src/osd/osd_types.cc ceph-0.67.7/src/osd/osd_types.cc --- ceph-0.67.4/src/osd/osd_types.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/osd/osd_types.cc 2014-02-19 20:12:48.000000000 +0000 @@ -136,6 +136,36 @@ ls.back()->h.push_back(2); } +void filestore_perf_stat_t::dump(Formatter *f) const +{ + f->dump_unsigned("commit_latency_ms", filestore_commit_latency); + f->dump_unsigned("apply_latency_ms", filestore_apply_latency); +} + +void filestore_perf_stat_t::encode(bufferlist &bl) const +{ + ENCODE_START(1, 1, bl); + ::encode(filestore_commit_latency, bl); + ::encode(filestore_apply_latency, bl); + ENCODE_FINISH(bl); +} + +void filestore_perf_stat_t::decode(bufferlist::iterator &bl) +{ + DECODE_START(1, bl); + ::decode(filestore_commit_latency, bl); + ::decode(filestore_apply_latency, bl); + DECODE_FINISH(bl); +} + +void filestore_perf_stat_t::generate_test_instances(std::list& o) +{ + o.push_back(new filestore_perf_stat_t()); + o.push_back(new filestore_perf_stat_t()); + o.back()->filestore_commit_latency = 20; + o.back()->filestore_apply_latency = 30; +} + // -- osd_stat_t -- void osd_stat_t::dump(Formatter *f) const { @@ -155,11 +185,14 @@ f->open_object_section("op_queue_age_hist"); op_queue_age_hist.dump(f); f->close_section(); + f->open_object_section("fs_perf_stat"); + fs_perf_stat.dump(f); + f->close_section(); } void osd_stat_t::encode(bufferlist &bl) const { - ENCODE_START(3, 2, bl); + ENCODE_START(4, 2, bl); ::encode(kb, bl); ::encode(kb_used, bl); ::encode(kb_avail, bl); @@ -168,12 +201,13 @@ ::encode(hb_in, bl); ::encode(hb_out, bl); ::encode(op_queue_age_hist, bl); + ::encode(fs_perf_stat, bl); ENCODE_FINISH(bl); } void osd_stat_t::decode(bufferlist::iterator &bl) { - DECODE_START_LEGACY_COMPAT_LEN(3, 2, 2, bl); + DECODE_START_LEGACY_COMPAT_LEN(4, 2, 2, bl); ::decode(kb, bl); ::decode(kb_used, bl); ::decode(kb_avail, bl); @@ -183,6 +217,8 @@ ::decode(hb_out, bl); if (struct_v >= 3) ::decode(op_queue_age_hist, bl); + if (struct_v >= 4) + ::decode(fs_perf_stat, bl); DECODE_FINISH(bl); } @@ -2405,7 +2441,7 @@ void OSDSuperblock::encode(bufferlist &bl) const { - ENCODE_START(5, 5, bl); + ENCODE_START(6, 5, bl); ::encode(cluster_fsid, bl); ::encode(whoami, bl); ::encode(current_epoch, bl); @@ -2416,12 +2452,13 @@ ::encode(clean_thru, bl); ::encode(mounted, bl); ::encode(osd_fsid, bl); + ::encode(last_map_marked_full, bl); ENCODE_FINISH(bl); } void OSDSuperblock::decode(bufferlist::iterator &bl) { - DECODE_START_LEGACY_COMPAT_LEN(5, 5, 5, bl); + DECODE_START_LEGACY_COMPAT_LEN(6, 5, 5, bl); if (struct_v < 3) { string magic; ::decode(magic, bl); @@ -2441,6 +2478,8 @@ ::decode(mounted, bl); if (struct_v >= 4) ::decode(osd_fsid, bl); + if (struct_v >= 6) + ::decode(last_map_marked_full, bl); DECODE_FINISH(bl); } @@ -2458,6 +2497,7 @@ f->close_section(); f->dump_int("clean_thru", clean_thru); f->dump_int("last_epoch_mounted", mounted); + f->dump_int("last_map_marked_full", last_map_marked_full); } void OSDSuperblock::generate_test_instances(list& o) @@ -2473,6 +2513,8 @@ z.mounted = 8; z.clean_thru = 7; o.push_back(new OSDSuperblock(z)); + z.last_map_marked_full = 7; + o.push_back(new OSDSuperblock(z)); } // -- SnapSet -- diff -Nru ceph-0.67.4/src/osd/osd_types.h ceph-0.67.7/src/osd/osd_types.h --- ceph-0.67.4/src/osd/osd_types.h 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/osd/osd_types.h 2014-02-19 20:12:48.000000000 +0000 @@ -41,6 +41,7 @@ #define CEPH_OSD_FEATURE_INCOMPAT_LEVELDBINFO CompatSet::Feature(8, "leveldbinfo") #define CEPH_OSD_FEATURE_INCOMPAT_LEVELDBLOG CompatSet::Feature(9, "leveldblog") #define CEPH_OSD_FEATURE_INCOMPAT_SNAPMAPPER CompatSet::Feature(10, "snapmapper") +#define CEPH_OSD_FEATURE_INCOMPAT_SHARDS CompatSet::Feature(11, "sharded objects") typedef hobject_t collection_list_handle_t; @@ -569,6 +570,34 @@ }; WRITE_CLASS_ENCODER(pow2_hist_t) +/** + * filestore_perf_stat_t + * + * current perf information about the osd + */ +struct filestore_perf_stat_t { + // cur_op_latency is in ms since double add/sub are not associative + uint32_t filestore_commit_latency; + uint32_t filestore_apply_latency; + + filestore_perf_stat_t() : + filestore_commit_latency(0), filestore_apply_latency(0) {} + + void add(const filestore_perf_stat_t &o) { + filestore_commit_latency += o.filestore_commit_latency; + filestore_apply_latency += o.filestore_apply_latency; + } + void sub(const filestore_perf_stat_t &o) { + filestore_commit_latency -= o.filestore_commit_latency; + filestore_apply_latency -= o.filestore_apply_latency; + } + void dump(Formatter *f) const; + void encode(bufferlist &bl) const; + void decode(bufferlist::iterator &bl); + static void generate_test_instances(std::list& o); +}; +WRITE_CLASS_ENCODER(filestore_perf_stat_t) + /** osd_stat * aggregate stats for an osd */ @@ -579,6 +608,8 @@ pow2_hist_t op_queue_age_hist; + filestore_perf_stat_t fs_perf_stat; + osd_stat_t() : kb(0), kb_used(0), kb_avail(0), snap_trim_queue_len(0), num_snap_trimming(0) {} @@ -589,6 +620,7 @@ snap_trim_queue_len += o.snap_trim_queue_len; num_snap_trimming += o.num_snap_trimming; op_queue_age_hist.add(o.op_queue_age_hist); + fs_perf_stat.add(o.fs_perf_stat); } void sub(const osd_stat_t& o) { kb -= o.kb; @@ -597,6 +629,7 @@ snap_trim_queue_len -= o.snap_trim_queue_len; num_snap_trimming -= o.num_snap_trimming; op_queue_age_hist.sub(o.op_queue_age_hist); + fs_perf_stat.sub(o.fs_perf_stat); } void dump(Formatter *f) const; @@ -1813,11 +1846,12 @@ // last interval over which i mounted and was then active epoch_t mounted; // last epoch i mounted epoch_t clean_thru; // epoch i was active and clean thru + epoch_t last_map_marked_full; // last epoch osdmap was marked full OSDSuperblock() : whoami(-1), current_epoch(0), oldest_map(0), newest_map(0), weight(0), - mounted(0), clean_thru(0) { + mounted(0), clean_thru(0), last_map_marked_full(0) { } void encode(bufferlist &bl) const; diff -Nru ceph-0.67.4/src/osd/ReplicatedPG.cc ceph-0.67.7/src/osd/ReplicatedPG.cc --- ceph-0.67.4/src/osd/ReplicatedPG.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/osd/ReplicatedPG.cc 2014-02-19 20:12:48.000000000 +0000 @@ -3896,6 +3896,7 @@ }; class C_OSD_OpCommit : public Context { + public: ReplicatedPGRef pg; ReplicatedPG::RepGather *repop; diff -Nru ceph-0.67.4/src/osdc/ObjectCacher.cc ceph-0.67.7/src/osdc/ObjectCacher.cc --- ceph-0.67.4/src/osdc/ObjectCacher.cc 2013-09-18 01:43:50.000000000 +0000 +++ ceph-0.67.7/src/osdc/ObjectCacher.cc 2014-02-19 20:12:48.000000000 +0000 @@ -899,11 +899,10 @@ ob->last_commit_tid = tid; // waiters? + list ls; if (ob->waitfor_commit.count(tid)) { - list ls; ls.splice(ls.begin(), ob->waitfor_commit[tid]); ob->waitfor_commit.erase(tid); - finish_contexts(cct, ls, r); } // is the entire object set now clean and fully committed? @@ -915,6 +914,9 @@ oset->dirty_or_tx == 0) { // nothing dirty/tx flush_set_callback(flush_set_callback_arg, oset); } + + if (!ls.empty()) + finish_contexts(cct, ls, r); } } @@ -942,19 +944,14 @@ } -void ObjectCacher::trim(loff_t max_bytes, loff_t max_ob) +void ObjectCacher::trim() { assert(lock.is_locked()); - if (max_bytes < 0) - max_bytes = max_size; - if (max_ob < 0) - max_ob = max_objects; - - ldout(cct, 10) << "trim start: bytes: max " << max_bytes << " clean " << get_stat_clean() - << ", objects: max " << max_ob << " current " << ob_lru.lru_get_size() + ldout(cct, 10) << "trim start: bytes: max " << max_size << " clean " << get_stat_clean() + << ", objects: max " << max_objects << " current " << ob_lru.lru_get_size() << dendl; - while (get_stat_clean() > max_bytes) { + while (get_stat_clean() > 0 && (uint64_t) get_stat_clean() > max_size) { BufferHead *bh = static_cast(bh_lru_rest.lru_expire()); if (!bh) break; @@ -972,7 +969,7 @@ } } - while (ob_lru.lru_get_size() > max_ob) { + while (ob_lru.lru_get_size() > max_objects) { Object *ob = static_cast(ob_lru.lru_expire()); if (!ob) break; @@ -981,8 +978,8 @@ close_object(ob); } - ldout(cct, 10) << "trim finish: max " << max_bytes << " clean " << get_stat_clean() - << ", objects: max " << max_ob << " current " << ob_lru.lru_get_size() + ldout(cct, 10) << "trim finish: max " << max_size << " clean " << get_stat_clean() + << ", objects: max " << max_objects << " current " << ob_lru.lru_get_size() << dendl; } @@ -1354,7 +1351,9 @@ // - do not wait for bytes other waiters are waiting on. this means that // threads do not wait for each other. this effectively allows the cache // size to balloon proportional to the data that is in flight. - while (get_stat_dirty() + get_stat_tx() >= max_dirty + get_stat_dirty_waiting()) { + while (get_stat_dirty() + get_stat_tx() > 0 && + (uint64_t) (get_stat_dirty() + get_stat_tx()) >= + max_dirty + get_stat_dirty_waiting()) { ldout(cct, 10) << __func__ << " waiting for dirty|tx " << (get_stat_dirty() + get_stat_tx()) << " >= max " << max_dirty << " + dirty_waiting " @@ -1409,7 +1408,7 @@ } // start writeback anyway? - if (get_stat_dirty() > target_dirty) { + if (get_stat_dirty() > 0 && (uint64_t) get_stat_dirty() > target_dirty) { ldout(cct, 10) << "wait_for_write " << get_stat_dirty() << " > target " << target_dirty << ", nudging flusher" << dendl; flusher_cond.Signal(); @@ -1433,7 +1432,7 @@ << max_dirty << " max)" << dendl; loff_t actual = get_stat_dirty() + get_stat_dirty_waiting(); - if (actual > target_dirty) { + if (actual > 0 && (uint64_t) actual > target_dirty) { // flush some dirty pages ldout(cct, 10) << "flusher " << get_stat_dirty() << " dirty + " << get_stat_dirty_waiting() diff -Nru ceph-0.67.4/src/osdc/ObjectCacher.h ceph-0.67.7/src/osdc/ObjectCacher.h --- ceph-0.67.4/src/osdc/ObjectCacher.h 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/osdc/ObjectCacher.h 2014-02-19 20:12:48.000000000 +0000 @@ -332,7 +332,7 @@ string name; Mutex& lock; - int64_t max_dirty, target_dirty, max_size, max_objects; + uint64_t max_dirty, target_dirty, max_size, max_objects; utime_t max_dirty_age; bool block_writes_upfront; @@ -434,7 +434,7 @@ void bh_read(BufferHead *bh); void bh_write(BufferHead *bh); - void trim(loff_t max_bytes=-1, loff_t max_objects=-1); + void trim(); void flush(loff_t amount=0); /** @@ -615,7 +615,7 @@ // cache sizes - void set_max_dirty(int64_t v) { + void set_max_dirty(uint64_t v) { max_dirty = v; } void set_target_dirty(int64_t v) { diff -Nru ceph-0.67.4/src/osdc/Objecter.cc ceph-0.67.7/src/osdc/Objecter.cc --- ceph-0.67.4/src/osdc/Objecter.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/osdc/Objecter.cc 2014-02-19 20:12:48.000000000 +0000 @@ -448,7 +448,8 @@ } } -void Objecter::scan_requests(bool skipped_map, +void Objecter::scan_requests(bool force_resend, + bool force_resend_writes, map& need_resend, list& need_resend_linger, map& need_resend_command) @@ -462,8 +463,7 @@ int r = recalc_linger_op_target(op); switch (r) { case RECALC_OP_TARGET_NO_ACTION: - // resend if skipped map; otherwise do nothing. - if (!skipped_map) + if (!force_resend && !force_resend_writes) break; // -- fall-thru -- case RECALC_OP_TARGET_NEED_RESEND: @@ -485,8 +485,8 @@ int r = recalc_op_target(op); switch (r) { case RECALC_OP_TARGET_NO_ACTION: - // resend if skipped map; otherwise do nothing. - if (!skipped_map) + if (!force_resend && + (!force_resend_writes || !(op->flags & CEPH_OSD_FLAG_WRITE))) break; // -- fall-thru -- case RECALC_OP_TARGET_NEED_RESEND: @@ -509,7 +509,7 @@ switch (r) { case RECALC_OP_TARGET_NO_ACTION: // resend if skipped map; otherwise do nothing. - if (!skipped_map) + if (!force_resend && !force_resend_writes) break; // -- fall-thru -- case RECALC_OP_TARGET_NEED_RESEND: @@ -538,8 +538,9 @@ } bool was_pauserd = osdmap->test_flag(CEPH_OSDMAP_PAUSERD); - bool was_pausewr = osdmap->test_flag(CEPH_OSDMAP_PAUSEWR) || osdmap->test_flag(CEPH_OSDMAP_FULL); - + bool was_full = osdmap->test_flag(CEPH_OSDMAP_FULL); + bool was_pausewr = osdmap->test_flag(CEPH_OSDMAP_PAUSEWR) || was_full; + list need_resend_linger; map need_resend; map need_resend_command; @@ -587,8 +588,10 @@ continue; } logger->set(l_osdc_map_epoch, osdmap->get_epoch()); - - scan_requests(skipped_map, need_resend, need_resend_linger, need_resend_command); + + was_full = was_full || osdmap->test_flag(CEPH_OSDMAP_FULL); + scan_requests(skipped_map, was_full, need_resend, need_resend_linger, + need_resend_command); // osd addr changes? for (map::iterator p = osd_sessions.begin(); @@ -612,7 +615,8 @@ ldout(cct, 3) << "handle_osd_map decoding full epoch " << m->get_last() << dendl; osdmap->decode(m->maps[m->get_last()]); - scan_requests(false, need_resend, need_resend_linger, need_resend_command); + scan_requests(false, false, need_resend, need_resend_linger, + need_resend_command); } else { ldout(cct, 3) << "handle_osd_map hmm, i want a full map, requesting" << dendl; monc->sub_want("osdmap", 0, CEPH_SUBSCRIBE_ONETIME); @@ -628,34 +632,11 @@ if (was_pauserd || was_pausewr || pauserd || pausewr) maybe_request_map(); - // unpause requests? - if ((was_pauserd && !pauserd) || - (was_pausewr && !pausewr)) { - for (map::iterator p = ops.begin(); - p != ops.end(); - ++p) { - Op *op = p->second; - if (op->paused && - !((op->flags & CEPH_OSD_FLAG_READ) && pauserd) && // not still paused as a read - !((op->flags & CEPH_OSD_FLAG_WRITE) && pausewr)) // not still paused as a write - need_resend[op->tid] = op; - } - for (map::iterator lp = linger_ops.begin(); - lp != linger_ops.end(); - ++lp) { - LingerOp *op = lp->second; - if (!op->registered && - !pauserd && // not still paused as a read - !((op->flags & CEPH_OSD_FLAG_WRITE) && pausewr)) // not still paused as a write - need_resend_linger.push_back(op); - } - } - // resend requests for (map::iterator p = need_resend.begin(); p != need_resend.end(); ++p) { Op *op = p->second; if (op->should_resend) { - if (op->session) { + if (op->session && !op->paused) { logger->inc(l_osdc_op_resend); send_op(op); } @@ -1003,7 +984,8 @@ ++p; logger->inc(l_osdc_op_resend); if (op->should_resend) { - resend[op->tid] = op; + if (!op->paused) + resend[op->tid] = op; } else { cancel_op(op); } @@ -1128,7 +1110,7 @@ } for (map::iterator p = pool_ops.begin(); p!=pool_ops.end(); ++p) { - pool_op_submit(p->second); + _pool_op_submit(p->second); logger->inc(l_osdc_poolop_resend); } @@ -1158,6 +1140,19 @@ // read | write --------------------------- +class C_CancelOp : public Context +{ + Objecter::Op *op; + Objecter *objecter; +public: + C_CancelOp(Objecter::Op *op, Objecter *objecter) : op(op), + objecter(objecter) {} + void finish(int r) { + // note that objecter lock == timer lock, and is already held + objecter->op_cancel(op->tid, -ETIMEDOUT); + } +}; + tid_t Objecter::op_submit(Op *op) { assert(client_lock.is_locked()); @@ -1167,6 +1162,11 @@ assert(op->ops.size() == op->out_rval.size()); assert(op->ops.size() == op->out_handler.size()); + if (osd_timeout > 0) { + op->ontimeout = new C_CancelOp(op, this); + timer.add_event_after(osd_timeout, op->ontimeout); + } + // throttle. before we look at any state, because // take_op_budget() may drop our lock while it blocks. take_op_budget(op); @@ -1283,6 +1283,32 @@ return op->tid; } +int Objecter::op_cancel(tid_t tid, int r) +{ + assert(client_lock.is_locked()); + assert(initialized); + + map::iterator p = ops.find(tid); + if (p == ops.end()) { + ldout(cct, 10) << __func__ << " tid " << tid << " dne" << dendl; + return -ENOENT; + } + + ldout(cct, 10) << __func__ << " tid " << tid << dendl; + Op *op = p->second; + if (op->onack) { + op->onack->complete(r); + op->onack = NULL; + } + if (op->oncommit) { + op->oncommit->complete(r); + op->oncommit = NULL; + } + op_cancel_map_check(op); + finish_op(op); + return 0; +} + bool Objecter::is_pg_changed(vector& o, vector& n, bool any_change) { if (o.empty() && n.empty()) @@ -1296,6 +1322,15 @@ return false; // same primary (tho replicas may have changed) } +bool Objecter::op_should_be_paused(Op *op) +{ + bool pauserd = osdmap->test_flag(CEPH_OSDMAP_PAUSERD); + bool pausewr = osdmap->test_flag(CEPH_OSDMAP_PAUSEWR) || osdmap->test_flag(CEPH_OSDMAP_FULL); + + return (op->flags & CEPH_OSD_FLAG_READ && pauserd) || + (op->flags & CEPH_OSD_FLAG_WRITE && pausewr); +} + int Objecter::recalc_op_target(Op *op) { vector acting; @@ -1311,6 +1346,14 @@ } osdmap->pg_to_acting_osds(pgid, acting); + bool need_resend = false; + + bool paused = op_should_be_paused(op); + if (!paused && paused != op->paused) { + op->paused = false; + need_resend = true; + } + if (op->pgid != pgid || is_pg_changed(op->acting, acting, op->used_replica)) { op->pgid = pgid; op->acting = acting; @@ -1358,6 +1401,9 @@ else num_homeless_ops++; } + need_resend = true; + } + if (need_resend) { return RECALC_OP_TARGET_NEED_RESEND; } return RECALC_OP_TARGET_NO_ACTION; @@ -1416,6 +1462,9 @@ logger->set(l_osdc_op_active, ops.size()); assert(check_latest_map_ops.find(op->tid) == check_latest_map_ops.end()); + if (op->ontimeout) + timer.cancel_event(op->ontimeout); + delete op; } @@ -1559,7 +1608,7 @@ num_unacked--; if (op->oncommit) num_uncommitted--; - op_submit(op); + _op_submit(op); m->put(); return; } @@ -1951,8 +2000,30 @@ return 0; } +class C_CancelPoolOp : public Context +{ + tid_t tid; + Objecter *objecter; +public: + C_CancelPoolOp(tid_t tid, Objecter *objecter) : tid(tid), + objecter(objecter) {} + void finish(int r) { + // note that objecter lock == timer lock, and is already held + objecter->pool_op_cancel(tid, -ETIMEDOUT); + } +}; + void Objecter::pool_op_submit(PoolOp *op) { + if (mon_timeout > 0) { + op->ontimeout = new C_CancelPoolOp(op->tid, this); + timer.add_event_after(mon_timeout, op->ontimeout); + } + _pool_op_submit(op); +} + +void Objecter::_pool_op_submit(PoolOp *op) +{ ldout(cct, 10) << "pool_op_submit " << op->tid << dendl; MPoolOp *m = new MPoolOp(monc->get_fsid(), op->tid, op->pool, op->name, op->pool_op, @@ -1988,17 +2059,11 @@ if (osdmap->get_epoch() < m->epoch) { ldout(cct, 20) << "waiting for client to reach epoch " << m->epoch << " before calling back" << dendl; wait_for_new_map(op->onfinish, m->epoch, m->replyCode); - } - else { - op->onfinish->finish(m->replyCode); - delete op->onfinish; + } else { + op->onfinish->complete(m->replyCode); } op->onfinish = NULL; - delete op; - pool_ops.erase(tid); - - logger->set(l_osdc_poolop_active, pool_ops.size()); - + finish_pool_op(op); } else { ldout(cct, 10) << "unknown request " << tid << dendl; } @@ -2006,9 +2071,52 @@ m->put(); } +int Objecter::pool_op_cancel(tid_t tid, int r) +{ + assert(client_lock.is_locked()); + assert(initialized); + + map::iterator it = pool_ops.find(tid); + if (it == pool_ops.end()) { + ldout(cct, 10) << __func__ << " tid " << tid << " dne" << dendl; + return -ENOENT; + } + + ldout(cct, 10) << __func__ << " tid " << tid << dendl; + + PoolOp *op = it->second; + if (op->onfinish) + op->onfinish->complete(r); + finish_pool_op(op); + return 0; +} + +void Objecter::finish_pool_op(PoolOp *op) +{ + pool_ops.erase(op->tid); + logger->set(l_osdc_poolop_active, pool_ops.size()); + + if (op->ontimeout) + timer.cancel_event(op->ontimeout); + + delete op; +} // pool stats +class C_CancelPoolStatOp : public Context +{ + tid_t tid; + Objecter *objecter; +public: + C_CancelPoolStatOp(tid_t tid, Objecter *objecter) : tid(tid), + objecter(objecter) {} + void finish(int r) { + // note that objecter lock == timer lock, and is already held + objecter->pool_stat_op_cancel(tid, -ETIMEDOUT); + } +}; + void Objecter::get_pool_stats(list& pools, map *result, Context *onfinish) { @@ -2019,6 +2127,11 @@ op->pools = pools; op->pool_stats = result; op->onfinish = onfinish; + op->ontimeout = NULL; + if (mon_timeout > 0) { + op->ontimeout = new C_CancelPoolStatOp(op->tid, this); + timer.add_event_after(mon_timeout, op->ontimeout); + } poolstat_ops[op->tid] = op; logger->set(l_osdc_poolstat_active, poolstat_ops.size()); @@ -2048,13 +2161,8 @@ *op->pool_stats = m->pool_stats; if (m->version > last_seen_pgmap_version) last_seen_pgmap_version = m->version; - op->onfinish->finish(0); - delete op->onfinish; - poolstat_ops.erase(tid); - delete op; - - logger->set(l_osdc_poolstat_active, poolstat_ops.size()); - + op->onfinish->complete(0); + finish_pool_stat_op(op); } else { ldout(cct, 10) << "unknown request " << tid << dendl; } @@ -2062,6 +2170,49 @@ m->put(); } +int Objecter::pool_stat_op_cancel(tid_t tid, int r) +{ + assert(client_lock.is_locked()); + assert(initialized); + + map::iterator it = poolstat_ops.find(tid); + if (it == poolstat_ops.end()) { + ldout(cct, 10) << __func__ << " tid " << tid << " dne" << dendl; + return -ENOENT; + } + + ldout(cct, 10) << __func__ << " tid " << tid << dendl; + + PoolStatOp *op = it->second; + if (op->onfinish) + op->onfinish->complete(r); + finish_pool_stat_op(op); + return 0; +} + +void Objecter::finish_pool_stat_op(PoolStatOp *op) +{ + poolstat_ops.erase(op->tid); + logger->set(l_osdc_poolstat_active, poolstat_ops.size()); + + if (op->ontimeout) + timer.cancel_event(op->ontimeout); + + delete op; +} + +class C_CancelStatfsOp : public Context +{ + tid_t tid; + Objecter *objecter; +public: + C_CancelStatfsOp(tid_t tid, Objecter *objecter) : tid(tid), + objecter(objecter) {} + void finish(int r) { + // note that objecter lock == timer lock, and is already held + objecter->statfs_op_cancel(tid, -ETIMEDOUT); + } +}; void Objecter::get_fs_stats(ceph_statfs& result, Context *onfinish) { @@ -2071,6 +2222,11 @@ op->tid = ++last_tid; op->stats = &result; op->onfinish = onfinish; + op->ontimeout = NULL; + if (mon_timeout > 0) { + op->ontimeout = new C_CancelStatfsOp(op->tid, this); + timer.add_event_after(mon_timeout, op->ontimeout); + } statfs_ops[op->tid] = op; logger->set(l_osdc_statfs_active, statfs_ops.size()); @@ -2100,13 +2256,8 @@ *(op->stats) = m->h.st; if (m->h.version > last_seen_pgmap_version) last_seen_pgmap_version = m->h.version; - op->onfinish->finish(0); - delete op->onfinish; - statfs_ops.erase(tid); - delete op; - - logger->set(l_osdc_statfs_active, statfs_ops.size()); - + op->onfinish->complete(0); + finish_statfs_op(op); } else { ldout(cct, 10) << "unknown request " << tid << dendl; } @@ -2114,6 +2265,36 @@ m->put(); } +int Objecter::statfs_op_cancel(tid_t tid, int r) +{ + assert(client_lock.is_locked()); + assert(initialized); + + map::iterator it = statfs_ops.find(tid); + if (it == statfs_ops.end()) { + ldout(cct, 10) << __func__ << " tid " << tid << " dne" << dendl; + return -ENOENT; + } + + ldout(cct, 10) << __func__ << " tid " << tid << dendl; + + StatfsOp *op = it->second; + if (op->onfinish) + op->onfinish->complete(r); + finish_statfs_op(op); + return 0; +} + +void Objecter::finish_statfs_op(StatfsOp *op) +{ + statfs_ops.erase(op->tid); + logger->set(l_osdc_statfs_active, statfs_ops.size()); + + if (op->ontimeout) + timer.cancel_event(op->ontimeout); + + delete op; +} // scatter/gather @@ -2355,6 +2536,8 @@ { stringstream ss; Formatter *f = new_formatter(format); + if (!f) + f = new_formatter("json-pretty"); m_objecter->client_lock.Lock(); m_objecter->dump_requests(f); m_objecter->client_lock.Unlock(); @@ -2408,11 +2591,28 @@ m->put(); } +class C_CancelCommandOp : public Context +{ + tid_t tid; + Objecter *objecter; +public: + C_CancelCommandOp(tid_t tid, Objecter *objecter) : tid(tid), + objecter(objecter) {} + void finish(int r) { + // note that objecter lock == timer lock, and is already held + objecter->command_op_cancel(tid, -ETIMEDOUT); + } +}; + int Objecter::_submit_command(CommandOp *c, tid_t *ptid) { tid_t tid = ++last_tid; ldout(cct, 10) << "_submit_command " << tid << " " << c->cmd << dendl; c->tid = tid; + if (osd_timeout > 0) { + c->ontimeout = new C_CancelCommandOp(tid, this); + timer.add_event_after(osd_timeout, c->ontimeout); + } command_ops[tid] = c; num_homeless_ops++; (void)recalc_command_target(c); @@ -2486,6 +2686,25 @@ logger->inc(l_osdc_command_send); } +int Objecter::command_op_cancel(tid_t tid, int r) +{ + assert(client_lock.is_locked()); + assert(initialized); + + map::iterator it = command_ops.find(tid); + if (it == command_ops.end()) { + ldout(cct, 10) << __func__ << " tid " << tid << " dne" << dendl; + return -ENOENT; + } + + ldout(cct, 10) << __func__ << " tid " << tid << dendl; + + CommandOp *op = it->second; + command_cancel_map_check(op); + _finish_command(op, -ETIMEDOUT, ""); + return 0; +} + void Objecter::_finish_command(CommandOp *c, int r, string rs) { ldout(cct, 10) << "_finish_command " << c->tid << " = " << r << " " << rs << dendl; @@ -2495,6 +2714,8 @@ if (c->onfinish) c->onfinish->complete(r); command_ops.erase(c->tid); + if (c->ontimeout) + timer.cancel_event(c->ontimeout); c->put(); logger->set(l_osdc_command_active, command_ops.size()); diff -Nru ceph-0.67.4/src/osdc/Objecter.h ceph-0.67.7/src/osdc/Objecter.h --- ceph-0.67.4/src/osdc/Objecter.h 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/osdc/Objecter.h 2014-02-19 20:12:48.000000000 +0000 @@ -765,7 +765,7 @@ vector out_rval; int flags, priority; - Context *onack, *oncommit; + Context *onack, *oncommit, *ontimeout; tid_t tid; eversion_t version; // for op replay @@ -794,6 +794,7 @@ snapid(CEPH_NOSNAP), outbl(NULL), flags(f), priority(0), onack(ac), oncommit(co), + ontimeout(NULL), tid(0), attempts(0), paused(false), objver(ov), reply_epoch(NULL), precalc_pgid(false), map_dne_bound(0), @@ -928,7 +929,7 @@ list pools; map *pool_stats; - Context *onfinish; + Context *onfinish, *ontimeout; utime_t last_submit; }; @@ -936,7 +937,7 @@ struct StatfsOp { tid_t tid; struct ceph_statfs *stats; - Context *onfinish; + Context *onfinish, *ontimeout; utime_t last_submit; }; @@ -945,7 +946,7 @@ tid_t tid; int64_t pool; string name; - Context *onfinish; + Context *onfinish, *ontimeout; int pool_op; uint64_t auid; __u8 crush_rule; @@ -953,7 +954,7 @@ bufferlist *blp; utime_t last_submit; - PoolOp() : tid(0), pool(0), onfinish(0), pool_op(0), + PoolOp() : tid(0), pool(0), onfinish(NULL), ontimeout(NULL), pool_op(0), auid(0), crush_rule(0), snapid(0), blp(NULL) {} }; @@ -971,7 +972,7 @@ epoch_t map_dne_bound; int map_check_error; // error to return if map check fails const char *map_check_error_str; - Context *onfinish; + Context *onfinish, *ontimeout; utime_t last_submit; CommandOp() @@ -980,12 +981,13 @@ map_dne_bound(0), map_check_error(0), map_check_error_str(NULL), - onfinish(NULL) {} + onfinish(NULL), ontimeout(NULL) {} }; int _submit_command(CommandOp *c, tid_t *ptid); int recalc_command_target(CommandOp *c); void _send_command(CommandOp *c); + int command_op_cancel(tid_t tid, int r); void _finish_command(CommandOp *c, int r, string rs); void handle_command_reply(MCommandReply *m); @@ -1103,6 +1105,8 @@ map > > waiting_for_map; + double mon_timeout, osd_timeout; + void send_op(Op *op); void cancel_op(Op *op); void finish_op(Op *op); @@ -1114,6 +1118,7 @@ RECALC_OP_TARGET_OSD_DNE, RECALC_OP_TARGET_OSD_DOWN, }; + bool op_should_be_paused(Op *op); int recalc_op_target(Op *op); bool recalc_linger_op_target(LingerOp *op); @@ -1170,7 +1175,8 @@ public: Objecter(CephContext *cct_, Messenger *m, MonClient *mc, - OSDMap *om, Mutex& l, SafeTimer& t) : + OSDMap *om, Mutex& l, SafeTimer& t, double mon_timeout, + double osd_timeout) : messenger(m), monc(mc), osdmap(om), cct(cct_), initialized(false), last_tid(0), client_inc(-1), max_linger_id(0), @@ -1183,6 +1189,8 @@ logger(NULL), tick_event(NULL), m_request_state_hook(NULL), num_homeless_ops(0), + mon_timeout(mon_timeout), + osd_timeout(osd_timeout), op_throttle_bytes(cct, "objecter_bytes", cct->_conf->objecter_inflight_op_bytes), op_throttle_ops(cct, "objecter_ops", cct->_conf->objecter_inflight_ops) { } @@ -1210,7 +1218,8 @@ void set_honor_osdmap_full() { honor_osdmap_full = true; } void unset_honor_osdmap_full() { honor_osdmap_full = false; } - void scan_requests(bool skipped_map, + void scan_requests(bool force_resend, + bool force_resend_writes, map& need_resend, list& need_resend_linger, map& need_resend_command); @@ -1257,6 +1266,9 @@ /** Clear the passed flags from the global op flag set */ void clear_global_op_flag(int flags) { global_op_flags &= ~flags; } + /// cancel an in-progress request with the given return code + int op_cancel(tid_t tid, int r); + // commands int osd_command(int osd, vector& cmd, bufferlist& inbl, tid_t *ptid, bufferlist *poutbl, string *prs, Context *onfinish) { @@ -1653,6 +1665,7 @@ // pool ops private: void pool_op_submit(PoolOp *op); + void _pool_op_submit(PoolOp *op); public: int create_pool_snap(int64_t pool, string& snapName, Context *onfinish); int allocate_selfmanaged_snap(int64_t pool, snapid_t *psnapid, Context *onfinish); @@ -1665,6 +1678,8 @@ int change_pool_auid(int64_t pool, Context *onfinish, uint64_t auid); void handle_pool_op_reply(MPoolOpReply *m); + int pool_op_cancel(tid_t tid, int r); + void finish_pool_op(PoolOp *op); // -------------------------- // pool stats @@ -1674,6 +1689,8 @@ void handle_get_pool_stats_reply(MGetPoolStatsReply *m); void get_pool_stats(list& pools, map *result, Context *onfinish); + int pool_stat_op_cancel(tid_t tid, int r); + void finish_pool_stat_op(PoolStatOp *op); // --------------------------- // df stats @@ -1682,6 +1699,8 @@ public: void handle_fs_stats_reply(MStatfsReply *m); void get_fs_stats(struct ceph_statfs& result, Context *onfinish); + int statfs_op_cancel(tid_t tid, int r); + void finish_statfs_op(StatfsOp *op); // --------------------------- // some scatter/gather hackery diff -Nru ceph-0.67.4/src/pybind/rbd.py ceph-0.67.7/src/pybind/rbd.py --- ceph-0.67.4/src/pybind/rbd.py 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/pybind/rbd.py 2014-02-19 20:12:48.000000000 +0000 @@ -432,7 +432,7 @@ def parent_info(self): ret = -errno.ERANGE size = 8 - while ret == -errno.ERANGE and size < 128: + while ret == -errno.ERANGE and size <= 4096: pool = create_string_buffer(size) name = create_string_buffer(size) snapname = create_string_buffer(size) diff -Nru ceph-0.67.4/src/rados.cc ceph-0.67.7/src/rados.cc --- ceph-0.67.4/src/rados.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/rados.cc 2014-02-19 20:12:48.000000000 +0000 @@ -1258,7 +1258,11 @@ // list pools? if (strcmp(nargs[0], "lspools") == 0) { list vec; - rados.pool_list(vec); + ret = rados.pool_list(vec); + if (ret < 0) { + cerr << "error listing pools: " << cpp_strerror(ret) << std::endl; + goto out; + } for (list::iterator i = vec.begin(); i != vec.end(); ++i) cout << *i << std::endl; } @@ -1266,13 +1270,22 @@ // pools list vec; - if (!pool_name) - rados.pool_list(vec); - else + if (!pool_name) { + ret = rados.pool_list(vec); + if (ret < 0) { + cerr << "error listing pools: " << cpp_strerror(ret) << std::endl; + goto out; + } + } else { vec.push_back(pool_name); + } map > stats; - rados.get_pool_stats(vec, category, stats); + ret = rados.get_pool_stats(vec, category, stats); + if (ret < 0) { + cerr << "error fetching pool stats: " << cpp_strerror(ret) << std::endl; + goto out; + } if (!formatter) { printf("%-15s %-15s" @@ -1349,7 +1362,11 @@ // total cluster_stat_t tstats; - rados.cluster_stat(tstats); + ret = rados.cluster_stat(tstats); + if (ret < 0) { + cerr << "error getting total cluster usage: " << cpp_strerror(ret) << std::endl; + goto out; + } if (!formatter) { printf(" total used %12lld %12lld\n", (long long unsigned)tstats.kb_used, (long long unsigned)tstats.num_objects); diff -Nru ceph-0.67.4/src/rbd.cc ceph-0.67.7/src/rbd.cc --- ceph-0.67.4/src/rbd.cc 2013-09-18 01:43:50.000000000 +0000 +++ ceph-0.67.7/src/rbd.cc 2014-02-19 20:12:48.000000000 +0000 @@ -865,6 +865,11 @@ librbd::RBD::AioCompletion *c = (librbd::RBD::AioCompletion *)vc; rbd_bencher *b = static_cast(pc); //cout << "complete " << c << std::endl; + int ret = c->get_return_value(); + if (ret != 0) { + cout << "write error: " << cpp_strerror(ret) << std::endl; + assert(0 == ret); + } b->lock.Lock(); b->in_flight--; b->cond.Signal(); diff -Nru ceph-0.67.4/src/rgw/rgw_acl.cc ceph-0.67.7/src/rgw/rgw_acl.cc --- ceph-0.67.4/src/rgw/rgw_acl.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_acl.cc 2014-02-19 20:12:47.000000000 +0000 @@ -79,7 +79,7 @@ if ((perm & perm_mask) != perm_mask) { perm |= acl.get_group_perm(ACL_GROUP_ALL_USERS, perm_mask); - if (compare_group_name(id, ACL_GROUP_ALL_USERS) != 0) { + if (!compare_group_name(id, ACL_GROUP_ALL_USERS)) { /* this is not the anonymous user */ perm |= acl.get_group_perm(ACL_GROUP_AUTHENTICATED_USERS, perm_mask); } diff -Nru ceph-0.67.4/src/rgw/rgw_admin.cc ceph-0.67.7/src/rgw/rgw_admin.cc --- ceph-0.67.4/src/rgw/rgw_admin.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_admin.cc 2014-02-19 20:12:48.000000000 +0000 @@ -1888,7 +1888,7 @@ bool truncated; do { - int ret = meta_log->list_entries(handle, 1000, entries, &truncated); + int ret = meta_log->list_entries(handle, 1000, entries, NULL, &truncated); if (ret < 0) { cerr << "ERROR: meta_log->list_entries(): " << cpp_strerror(-ret) << std::endl; return -ret; diff -Nru ceph-0.67.4/src/rgw/rgw_auth_s3.cc ceph-0.67.7/src/rgw/rgw_auth_s3.cc --- ceph-0.67.4/src/rgw/rgw_auth_s3.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_auth_s3.cc 2014-02-19 20:12:47.000000000 +0000 @@ -15,6 +15,12 @@ "partNumber", "policy", "requestPayment", + "response-cache-control", + "response-content-disposition", + "response-content-encoding", + "response-content-language", + "response-content-type", + "response-expires", "torrent", "uploadId", "uploads", @@ -73,9 +79,9 @@ if (!append_str.empty()) { s.append(append_str); } - dout(10) << "get_canon_resource(): dest=" << dest << dendl; - dest = s; + + dout(10) << "get_canon_resource(): dest=" << dest << dendl; } /* diff -Nru ceph-0.67.4/src/rgw/rgw_bucket.cc ceph-0.67.7/src/rgw/rgw_bucket.cc --- ceph-0.67.4/src/rgw/rgw_bucket.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_bucket.cc 2014-02-19 20:12:48.000000000 +0000 @@ -194,11 +194,21 @@ return store->meta_mgr->remove_entry(bucket_instance_meta_handler, entry, objv_tracker); } -int rgw_bucket_set_attrs(RGWRados *store, rgw_bucket& bucket, +int rgw_bucket_set_attrs(RGWRados *store, RGWBucketInfo& bucket_info, map& attrs, map* rmattrs, RGWObjVersionTracker *objv_tracker) { + rgw_bucket& bucket = bucket_info.bucket; + + if (!bucket_info.has_instance_obj) { + /* an old bucket object, need to convert it */ + int ret = store->convert_old_bucket_info(NULL, bucket.name); + if (ret < 0) { + ldout(store->ctx(), 0) << "ERROR: failed converting old bucket info: " << ret << dendl; + return ret; + } + } string oid; store->get_bucket_meta_oid(bucket, oid); rgw_obj obj(store->zone.domain_root, oid); @@ -717,17 +727,9 @@ return 0; } -int RGWBucket::get_policy(RGWBucketAdminOpState& op_state, ostream& o) -{ - std::string object_name = op_state.get_object_name(); - rgw_bucket bucket = op_state.get_bucket(); - - bufferlist bl; - rgw_obj obj(bucket, object_name); - int ret = store->get_attr(NULL, obj, RGW_ATTR_ACL, bl); - if (ret < 0) - return ret; +int RGWBucket::policy_bl_to_stream(bufferlist& bl, ostream& o) +{ RGWAccessControlPolicy_S3 policy(g_ceph_context); bufferlist::iterator iter = bl.begin(); try { @@ -737,10 +739,40 @@ return -EIO; } policy.to_xml(o); - return 0; } +int RGWBucket::get_policy(RGWBucketAdminOpState& op_state, ostream& o) +{ + std::string object_name = op_state.get_object_name(); + rgw_bucket bucket = op_state.get_bucket(); + + if (!object_name.empty()) { + bufferlist bl; + rgw_obj obj(bucket, object_name); + int ret = store->get_attr(NULL, obj, RGW_ATTR_ACL, bl); + if (ret < 0) + return ret; + + return policy_bl_to_stream(bl, o); + } + + + RGWBucketInfo bucket_info; + map attrs; + int ret = store->get_bucket_info(NULL, bucket.name, bucket_info, NULL, &attrs); + if (ret < 0) { + return ret; + } + + map::iterator aiter = attrs.find(RGW_ATTR_ACL); + if (aiter == attrs.end()) { + return -ENOENT; + } + + return policy_bl_to_stream(aiter->second, o); +} + int RGWBucketAdminOp::get_policy(RGWRados *store, RGWBucketAdminOpState& op_state, ostream& os) @@ -1186,12 +1218,16 @@ } int RGWDataChangesLog::list_entries(int shard, utime_t& start_time, utime_t& end_time, int max_entries, - list& entries, string& marker, bool *truncated) { + list& entries, + const string& marker, + string *out_marker, + bool *truncated) { list log_entries; int ret = store->time_log_list(oids[shard], start_time, end_time, - max_entries, log_entries, marker, truncated); + max_entries, log_entries, marker, + out_marker, truncated); if (ret < 0) return ret; @@ -1219,7 +1255,7 @@ for (; marker.shard < num_shards && (int)entries.size() < max_entries; marker.shard++, marker.marker.clear()) { int ret = list_entries(marker.shard, start_time, end_time, max_entries - entries.size(), entries, - marker.marker, &truncated); + marker.marker, NULL, &truncated); if (ret == -ENOENT) { continue; } @@ -1451,7 +1487,12 @@ if (ret < 0) return ret; - ret = rgw_unlink_bucket(store, be.owner, entry); + /* + * We're unlinking the bucket but we don't want to update the entrypoint here — we're removing + * it immediately and don't want to invalidate our cached objv_version or the bucket obj removal + * will incorrectly fail. + */ + ret = rgw_unlink_bucket(store, be.owner, entry, false); if (ret < 0) { lderr(store->ctx()) << "could not unlink bucket=" << entry << " owner=" << be.owner << dendl; } diff -Nru ceph-0.67.4/src/rgw/rgw_bucket.h ceph-0.67.7/src/rgw/rgw_bucket.h --- ceph-0.67.4/src/rgw/rgw_bucket.h 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_bucket.h 2014-02-19 20:12:48.000000000 +0000 @@ -105,7 +105,7 @@ extern int rgw_remove_object(RGWRados *store, rgw_bucket& bucket, std::string& object); extern int rgw_remove_bucket(RGWRados *store, rgw_bucket& bucket, bool delete_children); -extern int rgw_bucket_set_attrs(RGWRados *store, rgw_bucket& obj, +extern int rgw_bucket_set_attrs(RGWRados *store, RGWBucketInfo& bucket_info, map& attrs, map* rmattrs, RGWObjVersionTracker *objv_tracker); @@ -205,6 +205,7 @@ int unlink(RGWBucketAdminOpState& op_state, std::string *err_msg = NULL); int remove_object(RGWBucketAdminOpState& op_state, std::string *err_msg = NULL); + int policy_bl_to_stream(bufferlist& bl, ostream& o); int get_policy(RGWBucketAdminOpState& op_state, ostream& o); void clear_failure() { failure = false; }; @@ -352,7 +353,10 @@ int add_entry(rgw_bucket& bucket); int renew_entries(); int list_entries(int shard, utime_t& start_time, utime_t& end_time, int max_entries, - list& entries, string& marker, bool *truncated); + list& entries, + const string& marker, + string *out_marker, + bool *truncated); int trim_entries(int shard_id, const utime_t& start_time, const utime_t& end_time, const string& start_marker, const string& end_marker); int trim_entries(const utime_t& start_time, const utime_t& end_time, diff -Nru ceph-0.67.4/src/rgw/rgw_common.cc ceph-0.67.7/src/rgw/rgw_common.cc --- ceph-0.67.4/src/rgw/rgw_common.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_common.cc 2014-02-19 20:12:48.000000000 +0000 @@ -135,7 +135,6 @@ object_acl = NULL; expect_cont = false; - bucket_name = NULL; object = NULL; header_ended = false; @@ -149,7 +148,6 @@ perm_mask = 0; content_length = 0; object = NULL; - bucket_name = NULL; has_bad_meta = false; length = NULL; copy_source = NULL; @@ -164,7 +162,6 @@ delete bucket_acl; delete object_acl; free((void *)object); - free((void *)bucket_name); } struct str_len { @@ -651,13 +648,12 @@ return verify_object_permission(s, s->bucket_acl, s->object_acl, perm); } -static char hex_to_num(char c) +class HexTable { - static char table[256]; - static bool initialized = false; - + char table[256]; - if (!initialized) { +public: + HexTable() { memset(table, -1, sizeof(table)); int i; for (i = '0'; i<='9'; i++) @@ -667,7 +663,16 @@ for (i = 'a'; i<='f'; i++) table[i] = i - 'a' + 0xa; } - return table[(int)c]; + + char to_num(char c) { + return table[(int)c]; + } +}; + +static char hex_to_num(char c) +{ + static HexTable hex_table; + return hex_table.to_num(c); } bool url_decode(string& src_str, string& dest_str) @@ -708,6 +713,59 @@ return true; } +static void escape_char(char c, string& dst) +{ + char buf[16]; + snprintf(buf, sizeof(buf), "%%%.2X", (unsigned int)c); + dst.append(buf); +} + +static bool char_needs_url_encoding(char c) +{ + if (c < 0x20 || c >= 0x7f) + return true; + + switch (c) { + case 0x20: + case 0x22: + case 0x23: + case 0x25: + case 0x26: + case 0x2B: + case 0x2C: + case 0x2F: + case 0x3A: + case 0x3B: + case 0x3C: + case 0x3E: + case 0x3D: + case 0x3F: + case 0x40: + case 0x5B: + case 0x5D: + case 0x5C: + case 0x5E: + case 0x60: + case 0x7B: + case 0x7D: + return true; + } + return false; +} + +void url_encode(const string& src, string& dst) +{ + const char *p = src.c_str(); + for (unsigned i = 0; i < src.size(); i++, p++) { + if (char_needs_url_encoding(*p)) { + escape_char(*p, dst); + continue; + } + + dst.append(p, 1); + } +} + string rgw_trim_whitespace(const string& src) { if (src.empty()) { diff -Nru ceph-0.67.4/src/rgw/rgw_common.h ceph-0.67.7/src/rgw/rgw_common.h --- ceph-0.67.4/src/rgw/rgw_common.h 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_common.h 2014-02-19 20:12:48.000000000 +0000 @@ -801,12 +801,13 @@ uint32_t perm_mask; utime_t header_time; - const char *bucket_name; const char *object; rgw_bucket bucket; string bucket_name_str; string object_str; + string src_bucket_name; + string src_object; ACLOwner bucket_owner; ACLOwner owner; @@ -1233,6 +1234,7 @@ /** Convert an input URL into a sane object name * by converting %-escaped strings into characters, etc*/ extern bool url_decode(string& src_str, string& dest_str); +extern void url_encode(const string& src, string& dst); extern void calc_hmac_sha1(const char *key, int key_len, const char *msg, int msg_len, char *dest); diff -Nru ceph-0.67.4/src/rgw/rgw_cors.cc ceph-0.67.7/src/rgw/rgw_cors.cc --- ceph-0.67.4/src/rgw/rgw_cors.cc 2013-09-18 01:43:50.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_cors.cc 2014-02-19 20:12:47.000000000 +0000 @@ -51,6 +51,33 @@ } } +/* + * make attrs look-like-this + * does not convert underscores or dashes + * + * Per CORS specification, section 3: + * === + * "Converting a string to ASCII lowercase" means replacing all characters in the + * range U+0041 LATIN CAPITAL LETTER A to U+005A LATIN CAPITAL LETTER Z with + * the corresponding characters in the range U+0061 LATIN SMALL LETTER A to + * U+007A LATIN SMALL LETTER Z). + * === + * + * @todo When UTF-8 is allowed in HTTP headers, this function will need to change + */ +string lowercase_http_attr(const string& orig) +{ + const char *s = orig.c_str(); + char buf[orig.size() + 1]; + buf[orig.size()] = '\0'; + + for (size_t i = 0; i < orig.size(); ++i, ++s) { + buf[i] = tolower(*s); + } + return string(buf); +} + + static bool is_string_in_set(set& s, string h) { if ((s.find("*") != s.end()) || (s.find(h) != s.end())) { @@ -96,7 +123,13 @@ bool RGWCORSRule::is_header_allowed(const char *h, size_t len) { string hdr(h, len); - return is_string_in_set(allowed_hdrs, hdr); + if(lowercase_allowed_hdrs.empty()) { + set::iterator iter; + for (iter = allowed_hdrs.begin(); iter != allowed_hdrs.end(); ++iter) { + lowercase_allowed_hdrs.insert(lowercase_http_attr(*iter)); + } + } + return is_string_in_set(lowercase_allowed_hdrs, lowercase_http_attr(hdr)); } void RGWCORSRule::format_exp_headers(string& s) { diff -Nru ceph-0.67.4/src/rgw/rgw_cors.h ceph-0.67.7/src/rgw/rgw_cors.h --- ceph-0.67.4/src/rgw/rgw_cors.h 2013-09-18 01:43:50.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_cors.h 2014-02-19 20:12:47.000000000 +0000 @@ -41,7 +41,8 @@ uint32_t max_age; uint8_t allowed_methods; std::string id; - std::set allowed_hdrs; + std::set allowed_hdrs; /* If you change this, you need to discard lowercase_allowed_hdrs */ + std::set lowercase_allowed_hdrs; /* Not built until needed in RGWCORSRule::is_header_allowed */ std::set allowed_origins; std::list exposable_hdrs; diff -Nru ceph-0.67.4/src/rgw/rgw_json_enc.cc ceph-0.67.7/src/rgw/rgw_json_enc.cc --- ceph-0.67.4/src/rgw/rgw_json_enc.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_json_enc.cc 2014-02-19 20:12:48.000000000 +0000 @@ -6,6 +6,7 @@ #include "rgw_acl_s3.h" #include "rgw_cache.h" #include "rgw_bucket.h" +#include "rgw_keystone.h" #include "common/ceph_json.h" #include "common/Formatter.h" @@ -704,3 +705,70 @@ JSONDecoder::decode_json("last_update", last_update, obj); } +void KeystoneToken::Metadata::decode_json(JSONObj *obj) +{ + JSONDecoder::decode_json("is_admin", is_admin, obj); +} + +void KeystoneToken::Service::Endpoint::decode_json(JSONObj *obj) +{ + JSONDecoder::decode_json("id", id, obj); + JSONDecoder::decode_json("adminURL", admin_url, obj); + JSONDecoder::decode_json("publicURL", public_url, obj); + JSONDecoder::decode_json("internalURL", internal_url, obj); + JSONDecoder::decode_json("region", region, obj); +} + +void KeystoneToken::Service::decode_json(JSONObj *obj) +{ + JSONDecoder::decode_json("type", type, obj, true); + JSONDecoder::decode_json("name", name, obj, true); + JSONDecoder::decode_json("endpoints", endpoints, obj); +} + +void KeystoneToken::Token::Tenant::decode_json(JSONObj *obj) +{ + JSONDecoder::decode_json("id", id, obj, true); + JSONDecoder::decode_json("name", name, obj, true); + JSONDecoder::decode_json("description", description, obj); + JSONDecoder::decode_json("enabled", enabled, obj); +} + +void KeystoneToken::Token::decode_json(JSONObj *obj) +{ + string expires_iso8601; + struct tm t; + + JSONDecoder::decode_json("id", id, obj, true); + JSONDecoder::decode_json("tenant", tenant, obj, true); + JSONDecoder::decode_json("expires", expires_iso8601, obj, true); + + if (parse_iso8601(expires_iso8601.c_str(), &t)) { + expires = timegm(&t); + } else { + expires = 0; + throw JSONDecoder::err("Failed to parse ISO8601 expiration date from Keystone response."); + } +} + +void KeystoneToken::User::Role::decode_json(JSONObj *obj) +{ + JSONDecoder::decode_json("id", id, obj); + JSONDecoder::decode_json("name", name, obj); +} + +void KeystoneToken::User::decode_json(JSONObj *obj) +{ + JSONDecoder::decode_json("id", id, obj, true); + JSONDecoder::decode_json("name", name, obj); + JSONDecoder::decode_json("username", user_name, obj, true); + JSONDecoder::decode_json("roles", roles, obj); +} + +void KeystoneToken::decode_json(JSONObj *access_obj) +{ + JSONDecoder::decode_json("metadata", metadata, access_obj); + JSONDecoder::decode_json("token", token, access_obj, true); + JSONDecoder::decode_json("user", user, access_obj, true); + JSONDecoder::decode_json("serviceCatalog", service_catalog, access_obj); +} diff -Nru ceph-0.67.4/src/rgw/rgw_keystone.cc ceph-0.67.7/src/rgw/rgw_keystone.cc --- ceph-0.67.4/src/rgw/rgw_keystone.cc 1970-01-01 00:00:00.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_keystone.cc 2014-02-19 20:12:47.000000000 +0000 @@ -0,0 +1,108 @@ +#include +#include + +#include "common/errno.h" +#include "common/ceph_json.h" +#include "include/types.h" +#include "include/str_list.h" + +#include "rgw_common.h" +#include "rgw_keystone.h" + +#define dout_subsys ceph_subsys_rgw + +bool KeystoneToken::User::has_role(const string& r) { + list::iterator iter; + for (iter = roles.begin(); iter != roles.end(); ++iter) { + if (fnmatch(r.c_str(), ((*iter).name.c_str()), 0) == 0) { + return true; + } + } + return false; +} + +int KeystoneToken::parse(CephContext *cct, bufferlist& bl) +{ + JSONParser parser; + if (!parser.parse(bl.c_str(), bl.length())) { + ldout(cct, 0) << "Keystone token parse error: malformed json" << dendl; + return -EINVAL; + } + + try { + JSONDecoder::decode_json("access", *this, &parser); + } catch (JSONDecoder::err& err) { + ldout(cct, 0) << "Keystone token parse error: " << err.message << dendl; + return -EINVAL; + } + + return 0; +} + +bool RGWKeystoneTokenCache::find(const string& token_id, KeystoneToken& token) +{ + lock.Lock(); + map::iterator iter = tokens.find(token_id); + if (iter == tokens.end()) { + lock.Unlock(); + if (perfcounter) perfcounter->inc(l_rgw_keystone_token_cache_miss); + return false; + } + + token_entry& entry = iter->second; + tokens_lru.erase(entry.lru_iter); + + if (entry.token.expired()) { + tokens.erase(iter); + lock.Unlock(); + if (perfcounter) perfcounter->inc(l_rgw_keystone_token_cache_hit); + return false; + } + token = entry.token; + + tokens_lru.push_front(token_id); + entry.lru_iter = tokens_lru.begin(); + + lock.Unlock(); + if (perfcounter) perfcounter->inc(l_rgw_keystone_token_cache_hit); + + return true; +} + +void RGWKeystoneTokenCache::add(const string& token_id, KeystoneToken& token) +{ + lock.Lock(); + map::iterator iter = tokens.find(token_id); + if (iter != tokens.end()) { + token_entry& e = iter->second; + tokens_lru.erase(e.lru_iter); + } + + tokens_lru.push_front(token_id); + token_entry& entry = tokens[token_id]; + entry.token = token; + entry.lru_iter = tokens_lru.begin(); + + while (tokens_lru.size() > max) { + list::reverse_iterator riter = tokens_lru.rbegin(); + iter = tokens.find(*riter); + assert(iter != tokens.end()); + tokens.erase(iter); + tokens_lru.pop_back(); + } + + lock.Unlock(); +} + +void RGWKeystoneTokenCache::invalidate(const string& token_id) +{ + Mutex::Locker l(lock); + map::iterator iter = tokens.find(token_id); + if (iter == tokens.end()) + return; + + ldout(cct, 20) << "invalidating revoked token id=" << token_id << dendl; + token_entry& e = iter->second; + tokens_lru.erase(e.lru_iter); + tokens.erase(iter); +} diff -Nru ceph-0.67.4/src/rgw/rgw_keystone.h ceph-0.67.7/src/rgw/rgw_keystone.h --- ceph-0.67.4/src/rgw/rgw_keystone.h 1970-01-01 00:00:00.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_keystone.h 2014-02-19 20:12:47.000000000 +0000 @@ -0,0 +1,106 @@ +#ifndef CEPH_RGW_KEYSTONE_H +#define CEPH_RGW_KEYSTONE_H + +#include "rgw_common.h" + +class KeystoneToken { +public: + class Metadata { + public: + Metadata() : is_admin(false) { }; + bool is_admin; + void decode_json(JSONObj *obj); + }; + + class Service { + public: + class Endpoint { + public: + string id; + string admin_url; + string public_url; + string internal_url; + string region; + void decode_json(JSONObj *obj); + }; + string type; + string name; + list endpoints; + void decode_json(JSONObj *obj); + }; + + class Token { + public: + Token() : expires(0) { }; + class Tenant { + public: + Tenant() : enabled(false) { }; + string id; + string name; + string description; + bool enabled; + void decode_json(JSONObj *obj); + }; + string id; + time_t expires; + Tenant tenant; + void decode_json(JSONObj *obj); + }; + + class User { + public: + class Role { + public: + string id; + string name; + void decode_json(JSONObj *obj); + }; + string id; + string name; + string user_name; + list roles; + void decode_json(JSONObj *obj); + bool has_role(const string& r); + }; + + Metadata metadata; + list service_catalog; + Token token; + User user; + +public: + int parse(CephContext *cct, bufferlist& bl); + + bool expired() { + uint64_t now = ceph_clock_now(NULL).sec(); + return (now >= (uint64_t)token.expires); + } + + void decode_json(JSONObj *access_obj); +}; + +struct token_entry { + KeystoneToken token; + list::iterator lru_iter; +}; + +class RGWKeystoneTokenCache { + CephContext *cct; + + map tokens; + list tokens_lru; + + Mutex lock; + + size_t max; + +public: + RGWKeystoneTokenCache(CephContext *_cct, int _max) : cct(_cct), lock("RGWKeystoneTokenCache"), max(_max) {} + + bool find(const string& token_id, KeystoneToken& token); + void add(const string& token_id, KeystoneToken& token); + void invalidate(const string& token_id); +}; + + +#endif diff -Nru ceph-0.67.4/src/rgw/rgw_log.cc ceph-0.67.7/src/rgw/rgw_log.cc --- ceph-0.67.4/src/rgw/rgw_log.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_log.cc 2014-02-19 20:12:47.000000000 +0000 @@ -171,7 +171,7 @@ string user; - if (s->bucket_name) + if (!s->bucket_name_str.empty()) user = s->bucket_owner.get_id(); else user = s->user.user_id; @@ -267,7 +267,7 @@ if (!s->enable_ops_log) return 0; - if (!s->bucket_name) { + if (s->bucket_name_str.empty()) { ldout(s->cct, 5) << "nothing to log for operation" << dendl; return -EINVAL; } @@ -280,9 +280,9 @@ } else { bucket_id = s->bucket.bucket_id; } - entry.bucket = s->bucket_name; + entry.bucket = s->bucket_name_str; - if (check_utf8(s->bucket_name, entry.bucket.size()) != 0) { + if (check_utf8(s->bucket_name_str.c_str(), entry.bucket.size()) != 0) { ldout(s->cct, 5) << "not logging op on bucket with non-utf8 name" << dendl; return 0; } diff -Nru ceph-0.67.4/src/rgw/rgw_main.cc ceph-0.67.7/src/rgw/rgw_main.cc --- ceph-0.67.4/src/rgw/rgw_main.cc 2013-09-18 01:43:50.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_main.cc 2014-02-19 20:12:48.000000000 +0000 @@ -461,7 +461,7 @@ /* alternative default for module */ vector def_args; - def_args.push_back("--debug-rgw=20"); + def_args.push_back("--debug-rgw=1/5"); def_args.push_back("--keyring=$rgw_data/keyring"); def_args.push_back("--log-file=/var/log/radosgw/$cluster-$name"); @@ -469,7 +469,7 @@ argv_to_vec(argc, argv, args); env_to_vec(args); global_init(&def_args, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_DAEMON, - CINIT_FLAG_UNPRIVILEGED_DAEMON_DEFAULTS); + 0); for (std::vector::iterator i = args.begin(); i != args.end(); ++i) { if (ceph_argparse_flag(args, i, "-h", "--help", (char*)NULL)) { diff -Nru ceph-0.67.4/src/rgw/rgw_metadata.cc ceph-0.67.7/src/rgw/rgw_metadata.cc --- ceph-0.67.4/src/rgw/rgw_metadata.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_metadata.cc 2014-02-19 20:12:48.000000000 +0000 @@ -109,9 +109,10 @@ } int RGWMetadataLog::list_entries(void *handle, - int max_entries, - list& entries, - bool *truncated) { + int max_entries, + list& entries, + string *last_marker, + bool *truncated) { LogListCtx *ctx = static_cast(handle); if (!max_entries) { @@ -120,7 +121,8 @@ } int ret = store->time_log_list(ctx->cur_oid, ctx->from_time, ctx->end_time, - max_entries, entries, ctx->marker, truncated); + max_entries, entries, ctx->marker, + last_marker, truncated); if ((ret < 0) && (ret != -ENOENT)) return ret; @@ -388,6 +390,8 @@ objv_tracker.read_version = obj->get_version(); + delete obj; + return handler->remove(store, entry, objv_tracker); } diff -Nru ceph-0.67.4/src/rgw/rgw_metadata.h ceph-0.67.7/src/rgw/rgw_metadata.h --- ceph-0.67.4/src/rgw/rgw_metadata.h 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_metadata.h 2014-02-19 20:12:48.000000000 +0000 @@ -150,7 +150,9 @@ void complete_list_entries(void *handle); int list_entries(void *handle, int max_entries, - list& entries, bool *truncated); + list& entries, + string *out_marker, + bool *truncated); int trim(int shard_id, const utime_t& from_time, const utime_t& end_time, const string& start_marker, const string& end_marker); int get_info(int shard_id, RGWMetadataLogInfo *info); diff -Nru ceph-0.67.4/src/rgw/rgw_op.cc ceph-0.67.7/src/rgw/rgw_op.cc --- ceph-0.67.4/src/rgw/rgw_op.cc 2013-09-18 01:43:50.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_op.cc 2014-02-19 20:12:48.000000000 +0000 @@ -269,7 +269,7 @@ string oid = object; rgw_obj obj; - if (bucket_info.flags & BUCKET_SUSPENDED) { + if (!s->system_request && bucket_info.flags & BUCKET_SUSPENDED) { ldout(s->cct, 0) << "NOTICE: bucket " << bucket_info.bucket.name << " is suspended" << dendl; return -ERR_USER_SUSPENDED; } @@ -292,7 +292,7 @@ if (ret < 0) return ret; string& owner = bucket_policy.get_owner().get_id(); - if (owner.compare(s->user.user_id) != 0 && + if (!s->system_request && owner.compare(s->user.user_id) != 0 && !bucket_policy.verify_permission(s->user.user_id, s->perm_mask, RGW_PERM_READ)) ret = -EACCES; else @@ -339,7 +339,7 @@ s->local_source = store->region.equals(region); } } - + if (s->bucket_name_str.size()) { s->bucket_exists = true; if (s->bucket_instance_id.empty()) { @@ -470,6 +470,11 @@ return 0; } +/** CORS 6.2.6. + * If any of the header field-names is not a ASCII case-insensitive match for + * any of the values in list of headers do not set any additional headers and + * terminate this set of steps. + * */ static void get_cors_response_headers(RGWCORSRule *rule, const char *req_hdrs, string& hdrs, string& exp_hdrs, unsigned *max_age) { if (req_hdrs) { list hl; @@ -487,12 +492,20 @@ *max_age = rule->get_max_age(); } +/** + * Generate the CORS header response + * + * This is described in the CORS standard, section 6.2. + */ bool RGWOp::generate_cors_headers(string& origin, string& method, string& headers, string& exp_headers, unsigned *max_age) { + /* CORS 6.2.1. */ const char *orig = s->info.env->get("HTTP_ORIGIN"); if (!orig) { return false; } + + /* Custom: */ origin = orig; int ret = read_bucket_cors(); if (ret < 0) { @@ -504,10 +517,12 @@ return false; } + /* CORS 6.2.2. */ RGWCORSRule *rule = bucket_cors.host_name_rule(orig); if (!rule) return false; + /* CORS 6.2.3. */ const char *req_meth = s->info.env->get("HTTP_ACCESS_CONTROL_REQUEST_METHOD"); if (!req_meth) { req_meth = s->info.method; @@ -515,13 +530,15 @@ if (req_meth) method = req_meth; - + /* CORS 6.2.5. */ if (!validate_cors_rule_method(rule, req_meth)) { return false; } - const char *req_hdrs = s->info.env->get("HTTP_ACCESS_CONTROL_ALLOW_HEADERS"); + /* CORS 6.2.4. */ + const char *req_hdrs = s->info.env->get("HTTP_ACCESS_CONTROL_REQUEST_HEADERS"); + /* CORS 6.2.6. */ get_cors_response_headers(rule, req_hdrs, headers, exp_headers, max_age); return true; @@ -1171,7 +1188,7 @@ { ret = -EINVAL; - if (!s->bucket_name) + if (s->bucket_name_str.empty()) return; RGWObjVersionTracker ot; @@ -1604,6 +1621,13 @@ } } + map::iterator giter; + for (giter = s->generic_attrs.begin(); giter != s->generic_attrs.end(); ++giter) { + bufferlist& attrbl = attrs[giter->first]; + const string& val = giter->second; + attrbl.append(val.c_str(), val.size() + 1); + } + if (has_policy) { policy.encode(bl); attrs[RGW_ATTR_ACL] = bl; @@ -1615,7 +1639,7 @@ if (s->object) { ret = store->set_attrs(s->obj_ctx, obj, attrs, &rmattrs, ptracker); } else { - ret = rgw_bucket_set_attrs(store, obj.bucket, attrs, &rmattrs, ptracker); + ret = rgw_bucket_set_attrs(store, s->bucket_info, attrs, &rmattrs, ptracker); } } @@ -1645,8 +1669,6 @@ url_decode(url_src, dec_src); src = dec_src.c_str(); - ldout(s->cct, 15) << "decoded obj=" << src << dendl; - if (*src == '/') ++src; string str(src); @@ -1936,7 +1958,7 @@ if (s->object) { ret = store->set_attrs(s->obj_ctx, obj, attrs, NULL, ptracker); } else { - ret = rgw_bucket_set_attrs(store, obj.bucket, attrs, NULL, ptracker); + ret = rgw_bucket_set_attrs(store, s->bucket_info, attrs, NULL, ptracker); } } @@ -2074,7 +2096,7 @@ ret = -ENOENT; return; } - req_hdrs = s->info.env->get("HTTP_ACCESS_CONTROL_ALLOW_HEADERS"); + req_hdrs = s->info.env->get("HTTP_ACCESS_CONTROL_REQUEST_HEADERS"); ret = validate_cors_request(&bucket_cors); if (!rule) { origin = req_meth = NULL; diff -Nru ceph-0.67.4/src/rgw/rgw_op.h ceph-0.67.7/src/rgw/rgw_op.h --- ceph-0.67.4/src/rgw/rgw_op.h 2013-09-18 01:43:50.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_op.h 2014-02-19 20:12:48.000000000 +0000 @@ -448,9 +448,6 @@ int init_common(); -protected: - bool parse_copy_location(const char *src, string& bucket_name, string& object); - public: RGWCopyObj() { if_mod = NULL; @@ -470,6 +467,8 @@ last_ofs = 0; } + static bool parse_copy_location(const char *src, string& bucket_name, string& object); + virtual void init(RGWRados *store, struct req_state *s, RGWHandler *h) { RGWOp::init(store, s, h); dest_policy.set_ctx(s->cct); diff -Nru ceph-0.67.4/src/rgw/rgw_rados.cc ceph-0.67.7/src/rgw/rgw_rados.cc --- ceph-0.67.4/src/rgw/rgw_rados.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_rados.cc 2014-02-19 20:12:48.000000000 +0000 @@ -897,7 +897,9 @@ ret = region_map.read(cct, this); if (ret < 0) { - ldout(cct, 0) << "WARNING: cannot read region map" << dendl; + if (ret != -ENOENT) { + ldout(cct, 0) << "WARNING: cannot read region map" << dendl; + } ret = region_map.update(region); if (ret < 0) { ldout(cct, 0) << "ERROR: failed to update regionmap with local region info" << dendl; @@ -1543,7 +1545,10 @@ } int RGWRados::time_log_list(const string& oid, utime_t& start_time, utime_t& end_time, - int max_entries, list& entries, string& marker, bool *truncated) + int max_entries, list& entries, + const string& marker, + string *out_marker, + bool *truncated) { librados::IoCtx io_ctx; @@ -1553,7 +1558,8 @@ return r; librados::ObjectReadOperation op; - cls_log_list(op, start_time, end_time, marker, max_entries, entries, &marker, truncated); + cls_log_list(op, start_time, end_time, marker, max_entries, entries, + out_marker, truncated); bufferlist obl; @@ -2316,7 +2322,9 @@ return r; r = io_ctx.operate(oid, &op); - if (r < 0) + if (r < 0) /* we can expect to get -ECANCELED if object was replaced under, + or -ENOENT if was removed, or -EEXIST if it did not exist + before and now it does */ goto done_cancel; if (objv_tracker) { @@ -2347,11 +2355,17 @@ if (ret < 0) { ldout(cct, 0) << "ERROR: complete_update_index_cancel() returned ret=" << ret << dendl; } - /* we lost in a race, object was already overwritten, we + /* we lost in a race. There are a few options: + * - existing object was rewritten (ECANCELED) + * - non existing object was created (EEXIST) + * - object was removed (ENOENT) * should treat it as a success */ - if (r == -ECANCELED) + if ((r == -ECANCELED || r == -ENOENT) || + (!(flags & PUT_OBJ_EXCL) && r == -EEXIST)) { r = 0; + } + return r; } @@ -3437,8 +3451,12 @@ } if (reset_obj) { - op.create(false); - op.remove(); + if (state->exists) { + op.create(false); + op.remove(); + } else { + op.create(true); + } } if (ptag) { @@ -3449,7 +3467,7 @@ bufferlist bl; bl.append(state->write_tag.c_str(), state->write_tag.size() + 1); - ldout(cct, 0) << "setting object write_tag=" << state->write_tag << dendl; + ldout(cct, 10) << "setting object write_tag=" << state->write_tag << dendl; op.setxattr(RGW_ATTR_ID_TAG, bl); @@ -4091,6 +4109,7 @@ atomic_t cancelled; atomic_t err_code; Throttle throttle; + list read_list; get_obj_data(CephContext *_cct) : cct(_cct), @@ -4126,7 +4145,6 @@ c->wait_for_complete_and_cb(); int r = c->get_return_value(); - c->release(); lock.Lock(); completion_map.erase(cur_ofs); @@ -4135,6 +4153,8 @@ *done = true; } lock.Unlock(); + + c->release(); return r; } @@ -4278,20 +4298,44 @@ goto done_unlock; } - for (iter = bl_list.begin(); iter != bl_list.end(); ++iter) { + d->read_list.splice(d->read_list.end(), bl_list); + +done_unlock: + d->data_lock.Unlock(); +done: + d->put(); + return; +} + +int RGWRados::flush_read_list(struct get_obj_data *d) +{ + d->data_lock.Lock(); + list l; + l.swap(d->read_list); + d->get(); + d->read_list.clear(); + + d->data_lock.Unlock(); + + int r = 0; + + list::iterator iter; + for (iter = l.begin(); iter != l.end(); ++iter) { bufferlist& bl = *iter; - int r = d->client_cb->handle_data(bl, 0, bl.length()); + r = d->client_cb->handle_data(bl, 0, bl.length()); if (r < 0) { - d->set_cancelled(r); + dout(0) << "ERROR: flush_read_list(): d->client_c->handle_data() returned " << r << dendl; break; } } -done_unlock: - d->data_lock.Unlock(); -done: + d->data_lock.Lock(); d->put(); - return; + if (r < 0) { + d->set_cancelled(r); + } + d->data_lock.Unlock(); + return r; } int RGWRados::get_obj_iterate_cb(void *ctx, RGWObjState *astate, @@ -4338,6 +4382,10 @@ } } + r = flush_read_list(d); + if (r < 0) + return r; + get_obj_bucket_and_oid_key(obj, bucket, oid, key); d->throttle.get(len); @@ -4398,6 +4446,12 @@ data->cancel_all_io(); break; } + r = flush_read_list(data); + if (r < 0) { + dout(10) << "get_obj_iterate() r=" << r << ", canceling all io" << dendl; + data->cancel_all_io(); + break; + } } done: @@ -4691,6 +4745,41 @@ return 0; } +int RGWRados::convert_old_bucket_info(void *ctx, string& bucket_name) +{ + RGWBucketEntryPoint entry_point; + time_t ep_mtime; + RGWObjVersionTracker ot; + map attrs; + RGWBucketInfo info; + + ldout(cct, 10) << "RGWRados::convert_old_bucket_info(): bucket=" << bucket_name << dendl; + + int ret = get_bucket_entrypoint_info(ctx, bucket_name, entry_point, &ot, &ep_mtime, &attrs); + if (ret < 0) { + ldout(cct, 0) << "ERROR: get_bucket_entrypont_info() returned " << ret << " bucket=" << bucket_name << dendl; + return ret; + } + + if (!entry_point.has_bucket_info) { + /* already converted! */ + return 0; + } + + info = entry_point.old_bucket_info; + info.bucket.oid = bucket_name; + info.ep_objv = ot.read_version; + + ot.generate_new_write_ver(cct); + + ret = put_linked_bucket_info(info, false, ep_mtime, &ot.write_version, &attrs, true); + if (ret < 0) { + ldout(cct, 0) << "ERROR: failed to put_linked_bucket_info(): " << ret << dendl; + } + + return 0; +} + int RGWRados::get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& info, time_t *pmtime, map *pattrs) { diff -Nru ceph-0.67.4/src/rgw/rgw_rados.h ceph-0.67.7/src/rgw/rgw_rados.h --- ceph-0.67.4/src/rgw/rgw_rados.h 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_rados.h 2014-02-19 20:12:48.000000000 +0000 @@ -1232,6 +1232,8 @@ off_t ofs, off_t end, RGWGetDataCB *cb); + int flush_read_list(struct get_obj_data *d); + int get_obj_iterate_cb(void *ctx, RGWObjState *astate, rgw_obj& obj, off_t obj_ofs, off_t read_ofs, off_t len, @@ -1303,6 +1305,7 @@ int get_bucket_instance_info(void *ctx, rgw_bucket& bucket, RGWBucketInfo& info, time_t *pmtime, map *pattrs); int get_bucket_instance_from_oid(void *ctx, string& oid, RGWBucketInfo& info, time_t *pmtime, map *pattrs); + int convert_old_bucket_info(void *ctx, string& bucket_name); virtual int get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& info, time_t *pmtime, map *pattrs = NULL); virtual int put_linked_bucket_info(RGWBucketInfo& info, bool exclusive, time_t mtime, obj_version *pep_objv, @@ -1352,7 +1355,8 @@ int time_log_add(const string& oid, list& entries); int time_log_add(const string& oid, const utime_t& ut, const string& section, const string& key, bufferlist& bl); int time_log_list(const string& oid, utime_t& start_time, utime_t& end_time, - int max_entries, list& entries, string& marker, bool *truncated); + int max_entries, list& entries, + const string& marker, string *out_marker, bool *truncated); int time_log_info(const string& oid, cls_log_header *header); int time_log_trim(const string& oid, const utime_t& start_time, const utime_t& end_time, const string& from_marker, const string& to_marker); diff -Nru ceph-0.67.4/src/rgw/rgw_replica_log.cc ceph-0.67.7/src/rgw/rgw_replica_log.cc --- ceph-0.67.4/src/rgw/rgw_replica_log.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_replica_log.cc 2014-02-19 20:12:47.000000000 +0000 @@ -34,6 +34,15 @@ int RGWReplicaLogger::open_ioctx(librados::IoCtx& ctx, const string& pool) { int r = store->rados->ioctx_create(pool.c_str(), ctx); + if (r == -ENOENT) { + rgw_bucket p(pool.c_str()); + r = store->create_pool(p); + if (r < 0) + return r; + + // retry + r = store->rados->ioctx_create(pool.c_str(), ctx); + } if (r < 0) { lderr(cct) << "ERROR: could not open rados pool " << pool << dendl; } diff -Nru ceph-0.67.4/src/rgw/rgw_rest.cc ceph-0.67.7/src/rgw/rgw_rest.cc --- ceph-0.67.4/src/rgw/rgw_rest.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_rest.cc 2014-02-19 20:12:48.000000000 +0000 @@ -62,8 +62,9 @@ /* * make attrs look_like_this + * converts dashes to underscores */ -string lowercase_http_attr(const string& orig) +string lowercase_underscore_http_attr(const string& orig) { const char *s = orig.c_str(); char buf[orig.size() + 1]; @@ -83,8 +84,9 @@ /* * make attrs LOOK_LIKE_THIS + * converts dashes to underscores */ -string uppercase_http_attr(const string& orig) +string uppercase_underscore_http_attr(const string& orig) { const char *s = orig.c_str(); char buf[orig.size() + 1]; @@ -104,6 +106,7 @@ /* * make attrs Look-Like-This + * converts underscores to dashes */ string camelcase_dash_http_attr(const string& orig) { @@ -146,12 +149,12 @@ list::iterator iter; for (iter = extended_http_attrs.begin(); iter != extended_http_attrs.end(); ++iter) { string rgw_attr = RGW_ATTR_PREFIX; - rgw_attr.append(lowercase_http_attr(*iter)); + rgw_attr.append(lowercase_underscore_http_attr(*iter)); rgw_to_http_attrs[rgw_attr] = camelcase_dash_http_attr(*iter); string http_header = "HTTP_"; - http_header.append(uppercase_http_attr(*iter)); + http_header.append(uppercase_underscore_http_attr(*iter)); generic_attrs_map[http_header] = rgw_attr; } @@ -709,7 +712,7 @@ int r = s->cio->read(bp.c_str(), cl, &read_len); len = read_len; if (r < 0) - return ret; + return r; bl.append(bp, 0, len); } @@ -906,7 +909,7 @@ int RGWDeleteMultiObj_ObjStore::get_params() { - bucket_name = s->bucket_name; + bucket_name = s->bucket_name_str; if (bucket_name.empty()) { ret = -EINVAL; @@ -1060,6 +1063,7 @@ break; case OP_PUT: case OP_POST: + case OP_COPY: /* is it a 'multi-object delete' request? */ if (s->info.request_params == "delete") { only_bucket = true; @@ -1077,8 +1081,6 @@ case OP_DELETE: only_bucket = true; break; - case OP_COPY: // op itself will read and verify the permissions - return 0; case OP_OPTIONS: only_bucket = true; break; diff -Nru ceph-0.67.4/src/rgw/rgw_rest_client.cc ceph-0.67.7/src/rgw/rgw_rest_client.cc --- ceph-0.67.4/src/rgw/rgw_rest_client.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_rest_client.cc 2014-02-19 20:12:48.000000000 +0000 @@ -540,7 +540,10 @@ int RGWRESTStreamReadRequest::get_obj(RGWAccessKey& key, map& extra_headers, rgw_obj& obj) { - string resource = obj.bucket.name + "/" + obj.object; + string urlsafe_bucket, urlsafe_object; + url_encode(obj.bucket.name, urlsafe_bucket); + url_encode(obj.object, urlsafe_object); + string resource = urlsafe_bucket + "/" + urlsafe_object; string new_url = url; if (new_url[new_url.size() - 1] != '/') new_url.append("/"); diff -Nru ceph-0.67.4/src/rgw/rgw_rest_log.cc ceph-0.67.7/src/rgw/rgw_rest_log.cc --- ceph-0.67.4/src/rgw/rgw_rest_log.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_rest_log.cc 2014-02-19 20:12:48.000000000 +0000 @@ -79,9 +79,9 @@ meta_log->init_list_entries(shard_id, ut_st, ut_et, marker, &handle); - bool truncated; do { - http_ret = meta_log->list_entries(handle, max_entries, entries, &truncated); + http_ret = meta_log->list_entries(handle, max_entries, entries, + &last_marker, &truncated); if (http_ret < 0) break; @@ -100,12 +100,18 @@ if (http_ret < 0) return; - s->formatter->open_array_section("entries"); - for (list::iterator iter = entries.begin(); - iter != entries.end(); ++iter) { - cls_log_entry& entry = *iter; - store->meta_mgr->dump_log_entry(entry, s->formatter); - flusher.flush(); + s->formatter->open_object_section("log_entries"); + s->formatter->dump_string("marker", last_marker); + s->formatter->dump_bool("truncated", truncated); + { + s->formatter->open_array_section("entries"); + for (list::iterator iter = entries.begin(); + iter != entries.end(); ++iter) { + cls_log_entry& entry = *iter; + store->meta_mgr->dump_log_entry(entry, s->formatter); + flusher.flush(); + } + s->formatter->close_section(); } s->formatter->close_section(); flusher.flush(); @@ -471,10 +477,12 @@ } } - bool truncated; do { + // Note that last_marker is updated to be the marker of the last + // entry listed http_ret = store->data_log->list_entries(shard_id, ut_st, ut_et, - max_entries, entries, marker, &truncated); + max_entries, entries, marker, + &last_marker, &truncated); if (http_ret < 0) break; @@ -491,12 +499,18 @@ if (http_ret < 0) return; - s->formatter->open_array_section("entries"); - for (list::iterator iter = entries.begin(); - iter != entries.end(); ++iter) { - rgw_data_change& entry = *iter; - encode_json("entry", entry, s->formatter); - flusher.flush(); + s->formatter->open_object_section("log_entries"); + s->formatter->dump_string("marker", last_marker); + s->formatter->dump_bool("truncated", truncated); + { + s->formatter->open_array_section("entries"); + for (list::iterator iter = entries.begin(); + iter != entries.end(); ++iter) { + rgw_data_change& entry = *iter; + encode_json("entry", entry, s->formatter); + flusher.flush(); + } + s->formatter->close_section(); } s->formatter->close_section(); flusher.flush(); diff -Nru ceph-0.67.4/src/rgw/rgw_rest_log.h ceph-0.67.7/src/rgw/rgw_rest_log.h --- ceph-0.67.4/src/rgw/rgw_rest_log.h 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_rest_log.h 2014-02-19 20:12:47.000000000 +0000 @@ -74,9 +74,11 @@ class RGWOp_MDLog_List : public RGWRESTOp { list entries; + string last_marker; + bool truncated; int http_ret; public: - RGWOp_MDLog_List() : http_ret(0) {} + RGWOp_MDLog_List() : truncated(false), http_ret(0) {} ~RGWOp_MDLog_List() {} int check_caps(RGWUserCaps& caps) { @@ -175,9 +177,11 @@ class RGWOp_DATALog_List : public RGWRESTOp { list entries; + string last_marker; + bool truncated; int http_ret; public: - RGWOp_DATALog_List() : http_ret(0) {} + RGWOp_DATALog_List() : truncated(false), http_ret(0) {} ~RGWOp_DATALog_List() {} int check_caps(RGWUserCaps& caps) { diff -Nru ceph-0.67.4/src/rgw/rgw_rest_metadata.cc ceph-0.67.7/src/rgw/rgw_rest_metadata.cc --- ceph-0.67.4/src/rgw/rgw_rest_metadata.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_rest_metadata.cc 2014-02-19 20:12:48.000000000 +0000 @@ -33,8 +33,8 @@ string metadata_key; string section; - if (s->bucket_name) { - section = s->bucket_name; + if (!s->bucket_name_str.empty()) { + section = s->bucket_name_str; } else { section = key; key.clear(); diff -Nru ceph-0.67.4/src/rgw/rgw_rest_replica_log.cc ceph-0.67.7/src/rgw/rgw_rest_replica_log.cc --- ceph-0.67.4/src/rgw/rgw_rest_replica_log.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_rest_replica_log.cc 2014-02-19 20:12:48.000000000 +0000 @@ -171,7 +171,9 @@ int r = store->get_bucket_instance_info(NULL, bucket_instance, bucket_info, &mtime, NULL); if (r < 0) { - dout(5) << "could not get bucket instance info for bucket=" << bucket_instance << dendl; + dout(5) << "could not get bucket instance info for bucket=" << bucket_instance << ": " << cpp_strerror(r) << dendl; + if (r == -ENOENT) + return r; return -EINVAL; } diff -Nru ceph-0.67.4/src/rgw/rgw_rest_s3.cc ceph-0.67.7/src/rgw/rgw_rest_s3.cc --- ceph-0.67.4/src/rgw/rgw_rest_s3.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_rest_s3.cc 2014-02-19 20:12:48.000000000 +0000 @@ -250,7 +250,7 @@ s->formatter->open_object_section_in_ns("ListBucketResult", "http://s3.amazonaws.com/doc/2006-03-01/"); - s->formatter->dump_string("Name", s->bucket_name); + s->formatter->dump_string("Name", s->bucket_name_str.c_str()); if (!prefix.empty()) s->formatter->dump_string("Prefix", prefix); s->formatter->dump_string("Marker", marker); @@ -964,7 +964,14 @@ map access_keys = user_info.access_keys; - map::const_iterator iter = access_keys.begin(); + map::const_iterator iter = access_keys.find(s3_access_key); + // We know the key must exist, since the user was returned by + // rgw_get_user_info_by_access_key, but it doesn't hurt to check! + if (iter == access_keys.end()) { + ldout(s->cct, 0) << "Secret key lookup failed!" << dendl; + err_msg = "No secret key for matching access key"; + return -EACCES; + } string s3_secret_key = (iter->second).key; char calc_signature[CEPH_CRYPTO_HMACSHA1_DIGESTSIZE]; @@ -1085,59 +1092,6 @@ return bl.length(); } -static void escape_char(char c, string& dst) -{ - char buf[16]; - snprintf(buf, sizeof(buf), "%%%.2X", (unsigned int)c); - dst.append(buf); -} - -static bool char_needs_url_encoding(char c) -{ - if (c < 0x20 || c >= 0x7f) - return true; - - switch (c) { - case 0x20: - case 0x22: - case 0x23: - case 0x25: - case 0x26: - case 0x2B: - case 0x2C: - case 0x2F: - case 0x3A: - case 0x3B: - case 0x3C: - case 0x3E: - case 0x3D: - case 0x3F: - case 0x40: - case 0x5B: - case 0x5D: - case 0x5C: - case 0x5E: - case 0x60: - case 0x7B: - case 0x7D: - return true; - } - return false; -} - -static void url_escape(const string& src, string& dst) -{ - const char *p = src.c_str(); - for (unsigned i = 0; i < src.size(); i++, p++) { - if (char_needs_url_encoding(*p)) { - escape_char(*p, dst); - continue; - } - - dst.append(p, 1); - } -} - void RGWPostObj_ObjStore_S3::send_response() { if (ret == 0 && parts.count("success_action_redirect")) { @@ -1154,11 +1108,10 @@ string etag_url; - url_escape(s->bucket_name, bucket); - url_escape(s->object_str, key); - url_escape(etag_str, etag_url); + url_encode(s->bucket_name_str, bucket); + url_encode(s->object_str, key); + url_encode(etag_str, etag_url); - redirect.append("?bucket="); redirect.append(bucket); redirect.append("&key="); @@ -1204,7 +1157,7 @@ s->formatter->open_object_section("PostResponse"); if (g_conf->rgw_dns_name.length()) s->formatter->dump_format("Location", "%s/%s", s->info.script_uri.c_str(), s->object_str.c_str()); - s->formatter->dump_string("Bucket", s->bucket_name); + s->formatter->dump_string("Bucket", s->bucket_name_str.c_str()); s->formatter->dump_string("Key", s->object_str.c_str()); s->formatter->close_section(); } @@ -1254,18 +1207,8 @@ if_match = s->info.env->get("HTTP_X_AMZ_COPY_IF_MATCH"); if_nomatch = s->info.env->get("HTTP_X_AMZ_COPY_IF_NONE_MATCH"); - const char *req_src = s->copy_source; - if (!req_src) { - ldout(s->cct, 0) << "copy source is NULL" << dendl; - return -EINVAL; - } - - ret = parse_copy_location(req_src, src_bucket_name, src_object); - if (!ret) { - ldout(s->cct, 0) << "failed to parse copy location" << dendl; - return -EINVAL; - } - + src_bucket_name = s->src_bucket_name; + src_object = s->src_object; dest_bucket_name = s->bucket.name; dest_object = s->object_str; @@ -1529,7 +1472,7 @@ dump_start(s); s->formatter->open_object_section_in_ns("InitiateMultipartUploadResult", "http://s3.amazonaws.com/doc/2006-03-01/"); - s->formatter->dump_string("Bucket", s->bucket_name); + s->formatter->dump_string("Bucket", s->bucket_name_str.c_str()); s->formatter->dump_string("Key", s->object); s->formatter->dump_string("UploadId", upload_id); s->formatter->close_section(); @@ -1548,8 +1491,8 @@ s->formatter->open_object_section_in_ns("CompleteMultipartUploadResult", "http://s3.amazonaws.com/doc/2006-03-01/"); if (g_conf->rgw_dns_name.length()) - s->formatter->dump_format("Location", "%s.%s", s->bucket_name, g_conf->rgw_dns_name.c_str()); - s->formatter->dump_string("Bucket", s->bucket_name); + s->formatter->dump_format("Location", "%s.%s", s->bucket_name_str.c_str(), g_conf->rgw_dns_name.c_str()); + s->formatter->dump_string("Bucket", s->bucket_name_str.c_str()); s->formatter->dump_string("Key", s->object); s->formatter->dump_string("ETag", etag); s->formatter->close_section(); @@ -1586,19 +1529,19 @@ for (i = 0, test_iter = iter; test_iter != parts.end() && i < max_parts; ++test_iter, ++i) { cur_max = test_iter->first; } - s->formatter->dump_string("Bucket", s->bucket_name); + s->formatter->dump_string("Bucket", s->bucket_name_str.c_str()); s->formatter->dump_string("Key", s->object); s->formatter->dump_string("UploadId", upload_id); s->formatter->dump_string("StorageClass", "STANDARD"); s->formatter->dump_int("PartNumberMarker", marker); - s->formatter->dump_int("NextPartNumberMarker", cur_max + 1); + s->formatter->dump_int("NextPartNumberMarker", cur_max); s->formatter->dump_int("MaxParts", max_parts); s->formatter->dump_string("IsTruncated", (test_iter == parts.end() ? "false" : "true")); ACLOwner& owner = policy.get_owner(); dump_owner(s, owner.get_id(), owner.get_display_name()); - for (; iter != parts.end(); ++iter) { + for (i = 0; iter != parts.end() && i < max_parts; ++iter, ++i) { RGWUploadPartInfo& info = iter->second; time_t sec = info.modified.sec(); @@ -1634,7 +1577,7 @@ return; s->formatter->open_object_section("ListMultipartUploadsResult"); - s->formatter->dump_string("Bucket", s->bucket_name); + s->formatter->dump_string("Bucket", s->bucket_name_str.c_str()); if (!prefix.empty()) s->formatter->dump_string("ListMultipartUploadsResult.Prefix", prefix); string& key_marker = marker.get_key(); @@ -1920,9 +1863,8 @@ first = req; } - if (!s->bucket_name) { + if (s->bucket_name_str.empty()) { s->bucket_name_str = first; - s->bucket_name = strdup(s->bucket_name_str.c_str()); if (pos >= 0) { string encoded_obj_str = req.substr(pos+1); @@ -1999,7 +1941,7 @@ int RGWHandler_ObjStore_S3::init(RGWRados *store, struct req_state *s, RGWClientIO *cio) { - dout(10) << "s->object=" << (s->object ? s->object : "") << " s->bucket=" << (s->bucket_name ? s->bucket_name : "") << dendl; + dout(10) << "s->object=" << (s->object ? s->object : "") << " s->bucket=" << (!s->bucket_name_str.empty() ? s->bucket_name_str : "") << dendl; bool relaxed_names = s->cct->_conf->rgw_relaxed_s3_bucket_names; int ret = validate_bucket_name(s->bucket_name_str, relaxed_names); @@ -2016,6 +1958,13 @@ s->has_acl_header = s->info.env->exists_prefix("HTTP_X_AMZ_GRANT"); s->copy_source = s->info.env->get("HTTP_X_AMZ_COPY_SOURCE"); + if (s->copy_source) { + ret = RGWCopyObj::parse_copy_location(s->copy_source, s->src_bucket_name, s->src_object); + if (!ret) { + ldout(s->cct, 0) << "failed to parse copy location" << dendl; + return -EINVAL; + } + } s->dialect = "s3"; @@ -2024,6 +1973,72 @@ /* + * Try to validate S3 auth against keystone s3token interface + */ +int RGW_Auth_S3_Keystone_ValidateToken::validate_s3token(const string& auth_id, const string& auth_token, const string& auth_sign) { + /* prepare keystone url */ + string keystone_url = cct->_conf->rgw_keystone_url; + if (keystone_url[keystone_url.size() - 1] != '/') + keystone_url.append("/"); + keystone_url.append("v2.0/s3tokens"); + + /* set required headers for keystone request */ + append_header("X-Auth-Token", cct->_conf->rgw_keystone_admin_token); + append_header("Content-Type", "application/json"); + + /* encode token */ + bufferlist token_buff; + bufferlist token_encoded; + token_buff.append(auth_token); + token_buff.encode_base64(token_encoded); + token_encoded.append((char)0); + + /* create json credentials request body */ + JSONFormatter credentials(false); + credentials.open_object_section(""); + credentials.open_object_section("credentials"); + credentials.dump_string("access", auth_id); + credentials.dump_string("token", token_encoded.c_str()); + credentials.dump_string("signature", auth_sign); + credentials.close_section(); + credentials.close_section(); + + std::stringstream os; + credentials.flush(os); + set_tx_buffer(os.str()); + + /* send request */ + int ret = process("POST", keystone_url.c_str()); + if (ret < 0) { + dout(2) << "s3 keystone: token validation ERROR: " << rx_buffer.c_str() << dendl; + return -EPERM; + } + + /* now parse response */ + if (response.parse(cct, rx_buffer) < 0) { + dout(2) << "s3 keystone: token parsing failed" << dendl; + return -EPERM; + } + + /* check if we have a valid role */ + bool found = false; + list::iterator iter; + for (iter = roles_list.begin(); iter != roles_list.end(); ++iter) { + if ((found=response.user.has_role(*iter))==true) + break; + } + + if (!found) { + ldout(cct, 5) << "s3 keystone: user does not hold a matching role; required roles: " << cct->_conf->rgw_keystone_accepted_roles << dendl; + return -EPERM; + } + + /* everything seems fine, continue with this user */ + ldout(cct, 5) << "s3 keystone: validated token: " << response.token.tenant.name << ":" << response.user.name << " expires: " << response.token.expires << dendl; + return 0; +} + +/* * verify that a signed request comes from the keyholder * by checking the signature against our locally-computed version */ @@ -2036,6 +2051,13 @@ time_t now; time(&now); + /* neither keystone and rados enabled; warn and exit! */ + if (!store->ctx()->_conf->rgw_s3_auth_use_rados + && !store->ctx()->_conf->rgw_s3_auth_use_keystone) { + dout(0) << "WARNING: no authorization backend enabled! Users will never authenticate." << dendl; + return -EPERM; + } + if (!s->http_auth || !(*s->http_auth)) { auth_id = s->info.args.get("AWSAccessKeyId"); if (auth_id.size()) { @@ -2065,75 +2087,113 @@ auth_sign = auth_str.substr(pos + 1); } - /* first get the user info */ - if (rgw_get_user_info_by_access_key(store, auth_id, s->user) < 0) { - dout(5) << "error reading user info, uid=" << auth_id << " can't authenticate" << dendl; - return -EPERM; - } + /* try keystone auth first */ + int keystone_result = -EINVAL; + if (store->ctx()->_conf->rgw_s3_auth_use_keystone + && !store->ctx()->_conf->rgw_keystone_url.empty()) { + dout(20) << "s3 keystone: trying keystone auth" << dendl; - /* now verify signature */ - - string auth_hdr; - if (!rgw_create_s3_canonical_header(s->info, &s->header_time, auth_hdr, qsr)) { - dout(10) << "failed to create auth header\n" << auth_hdr << dendl; - return -EPERM; - } - dout(10) << "auth_hdr:\n" << auth_hdr << dendl; + RGW_Auth_S3_Keystone_ValidateToken keystone_validator(store->ctx()); + string token; - time_t req_sec = s->header_time.sec(); - if ((req_sec < now - RGW_AUTH_GRACE_MINS * 60 || - req_sec > now + RGW_AUTH_GRACE_MINS * 60) && !qsr) { - dout(10) << "req_sec=" << req_sec << " now=" << now << "; now - RGW_AUTH_GRACE_MINS=" << now - RGW_AUTH_GRACE_MINS * 60 << "; now + RGW_AUTH_GRACE_MINS=" << now + RGW_AUTH_GRACE_MINS * 60 << dendl; - dout(0) << "NOTICE: request time skew too big now=" << utime_t(now, 0) << " req_time=" << s->header_time << dendl; - return -ERR_REQUEST_TIME_SKEWED; - } + if (!rgw_create_s3_canonical_header(s->info, &s->header_time, token, qsr)) { + dout(10) << "failed to create auth header\n" << token << dendl; + } else { + keystone_result = keystone_validator.validate_s3token(auth_id, token, auth_sign); + if (keystone_result == 0) { + s->user.user_id = keystone_validator.response.token.tenant.id; + s->user.display_name = keystone_validator.response.token.tenant.name; // wow. + + /* try to store user if it not already exists */ + if (rgw_get_user_info_by_uid(store, keystone_validator.response.token.tenant.id, s->user) < 0) { + int ret = rgw_store_user_info(store, s->user, NULL, NULL, 0, true); + if (ret < 0) + dout(10) << "NOTICE: failed to store new user's info: ret=" << ret << dendl; + } - map::iterator iter = s->user.access_keys.find(auth_id); - if (iter == s->user.access_keys.end()) { - dout(0) << "ERROR: access key not encoded in user info" << dendl; - return -EPERM; + s->perm_mask = RGW_PERM_FULL_CONTROL; + } + } } - RGWAccessKey& k = iter->second; - if (!k.subuser.empty()) { - map::iterator uiter = s->user.subusers.find(k.subuser); - if (uiter == s->user.subusers.end()) { - dout(0) << "NOTICE: could not find subuser: " << k.subuser << dendl; + /* keystone failed (or not enabled); check if we want to use rados backend */ + if (!store->ctx()->_conf->rgw_s3_auth_use_rados + && keystone_result < 0) + return keystone_result; + + /* now try rados backend, but only if keystone did not succeed */ + if (keystone_result < 0) { + /* get the user info */ + if (rgw_get_user_info_by_access_key(store, auth_id, s->user) < 0) { + dout(5) << "error reading user info, uid=" << auth_id << " can't authenticate" << dendl; return -EPERM; } - RGWSubUser& subuser = uiter->second; - s->perm_mask = subuser.perm_mask; - } else - s->perm_mask = RGW_PERM_FULL_CONTROL; - string digest; - int ret = rgw_get_s3_header_digest(auth_hdr, k.key, digest); - if (ret < 0) { - return -EPERM; - } + /* now verify signature */ + + string auth_hdr; + if (!rgw_create_s3_canonical_header(s->info, &s->header_time, auth_hdr, qsr)) { + dout(10) << "failed to create auth header\n" << auth_hdr << dendl; + return -EPERM; + } + dout(10) << "auth_hdr:\n" << auth_hdr << dendl; - dout(15) << "calculated digest=" << digest << dendl; - dout(15) << "auth_sign=" << auth_sign << dendl; - dout(15) << "compare=" << auth_sign.compare(digest) << dendl; + time_t req_sec = s->header_time.sec(); + if ((req_sec < now - RGW_AUTH_GRACE_MINS * 60 || + req_sec > now + RGW_AUTH_GRACE_MINS * 60) && !qsr) { + dout(10) << "req_sec=" << req_sec << " now=" << now << "; now - RGW_AUTH_GRACE_MINS=" << now - RGW_AUTH_GRACE_MINS * 60 << "; now + RGW_AUTH_GRACE_MINS=" << now + RGW_AUTH_GRACE_MINS * 60 << dendl; + dout(0) << "NOTICE: request time skew too big now=" << utime_t(now, 0) << " req_time=" << s->header_time << dendl; + return -ERR_REQUEST_TIME_SKEWED; + } - if (auth_sign != digest) - return -EPERM; + map::iterator iter = s->user.access_keys.find(auth_id); + if (iter == s->user.access_keys.end()) { + dout(0) << "ERROR: access key not encoded in user info" << dendl; + return -EPERM; + } + RGWAccessKey& k = iter->second; + + if (!k.subuser.empty()) { + map::iterator uiter = s->user.subusers.find(k.subuser); + if (uiter == s->user.subusers.end()) { + dout(0) << "NOTICE: could not find subuser: " << k.subuser << dendl; + return -EPERM; + } + RGWSubUser& subuser = uiter->second; + s->perm_mask = subuser.perm_mask; + } else + s->perm_mask = RGW_PERM_FULL_CONTROL; - if (s->user.system) { - s->system_request = true; - dout(20) << "system request" << dendl; - s->info.args.set_system(); - string effective_uid = s->info.args.get(RGW_SYS_PARAM_PREFIX "uid"); - RGWUserInfo effective_user; - if (!effective_uid.empty()) { - ret = rgw_get_user_info_by_uid(store, effective_uid, effective_user); - if (ret < 0) { - ldout(s->cct, 0) << "User lookup failed!" << dendl; - return -ENOENT; + string digest; + int ret = rgw_get_s3_header_digest(auth_hdr, k.key, digest); + if (ret < 0) { + return -EPERM; + } + + dout(15) << "calculated digest=" << digest << dendl; + dout(15) << "auth_sign=" << auth_sign << dendl; + dout(15) << "compare=" << auth_sign.compare(digest) << dendl; + + if (auth_sign != digest) + return -EPERM; + + if (s->user.system) { + s->system_request = true; + dout(20) << "system request" << dendl; + s->info.args.set_system(); + string effective_uid = s->info.args.get(RGW_SYS_PARAM_PREFIX "uid"); + RGWUserInfo effective_user; + if (!effective_uid.empty()) { + ret = rgw_get_user_info_by_uid(store, effective_uid, effective_user); + if (ret < 0) { + ldout(s->cct, 0) << "User lookup failed!" << dendl; + return -ENOENT; + } + s->user = effective_user; } - s->user = effective_user; } - } + + } /* if keystone_result < 0 */ // populate the owner info s->owner.set_id(s->user.user_id); @@ -2158,7 +2218,7 @@ if (ret < 0) return NULL; - if (!s->bucket_name) + if (s->bucket_name_str.empty()) return new RGWHandler_ObjStore_Service_S3; if (!s->object) diff -Nru ceph-0.67.4/src/rgw/rgw_rest_s3.h ceph-0.67.7/src/rgw/rgw_rest_s3.h --- ceph-0.67.4/src/rgw/rgw_rest_s3.h 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_rest_s3.h 2014-02-19 20:12:47.000000000 +0000 @@ -6,6 +6,7 @@ #include "rgw_http_errors.h" #include "rgw_acl_s3.h" #include "rgw_policy_s3.h" +#include "rgw_keystone.h" #define RGW_AUTH_GRACE_MINS 15 @@ -258,6 +259,57 @@ void end_response(); }; +class RGW_Auth_S3_Keystone_ValidateToken : public RGWHTTPClient { +private: + bufferlist rx_buffer; + bufferlist tx_buffer; + bufferlist::iterator tx_buffer_it; + list roles_list; + +public: + KeystoneToken response; + +private: + void set_tx_buffer(const string& d) { + tx_buffer.clear(); + tx_buffer.append(d); + tx_buffer_it = tx_buffer.begin(); + set_send_length(tx_buffer.length()); + } + +public: + RGW_Auth_S3_Keystone_ValidateToken(CephContext *_cct) + : RGWHTTPClient(_cct) { + get_str_list(cct->_conf->rgw_keystone_accepted_roles, roles_list); + } + + int receive_header(void *ptr, size_t len) { + return 0; + } + int receive_data(void *ptr, size_t len) { + rx_buffer.append((char *)ptr, len); + return 0; + } + + int send_data(void *ptr, size_t len) { + if (!tx_buffer_it.get_remaining()) + return 0; // nothing left to send + + int l = MIN(tx_buffer_it.get_remaining(), len); + memcpy(ptr, tx_buffer_it.get_current_ptr().c_str(), l); + try { + tx_buffer_it.advance(l); + } catch (buffer::end_of_buffer &e) { + assert(0); + } + + return l; + } + + int validate_s3token(const string& auth_id, const string& auth_token, const string& auth_sign); + +}; + class RGW_Auth_S3 { public: static int authorize(RGWRados *store, struct req_state *s); diff -Nru ceph-0.67.4/src/rgw/rgw_rest_swift.cc ceph-0.67.7/src/rgw/rgw_rest_swift.cc --- ceph-0.67.4/src/rgw/rgw_rest_swift.cc 2013-09-18 01:43:50.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_rest_swift.cc 2014-02-19 20:12:48.000000000 +0000 @@ -451,28 +451,10 @@ if_match = s->info.env->get("HTTP_COPY_IF_MATCH"); if_nomatch = s->info.env->get("HTTP_COPY_IF_NONE_MATCH"); - if (s->op == OP_COPY) { - const char *req_dest = s->info.env->get("HTTP_DESTINATION"); - if (!req_dest) - return -ERR_BAD_URL; - - ret = parse_copy_location(req_dest, dest_bucket_name, dest_object); - if (!ret) - return -ERR_BAD_URL; - src_bucket_name = s->bucket_name; - src_object = s->object_str; - } else { - const char *req_src = s->copy_source; - if (!req_src) - return -ERR_BAD_URL; - - ret = parse_copy_location(req_src, src_bucket_name, src_object); - if (!ret) - return -ERR_BAD_URL; - - dest_bucket_name = s->bucket_name; - dest_object = s->object_str; - } + src_bucket_name = s->src_bucket_name; + src_object = s->src_object; + dest_bucket_name = s->bucket_name_str; + dest_object = s->object_str; return 0; } @@ -701,7 +683,7 @@ if (is_acl_op()) { return new RGWPutACLs_ObjStore_SWIFT; } - if (!s->copy_source) + if (s->src_bucket_name.empty()) return new RGWPutObj_ObjStore_SWIFT; else return new RGWCopyObj_ObjStore_SWIFT; @@ -857,8 +839,6 @@ return 0; s->bucket_name_str = first; - s->bucket_name = strdup(s->bucket_name_str.c_str()); - s->info.effective_uri = "/" + s->bucket_name_str; @@ -873,7 +853,7 @@ int RGWHandler_ObjStore_SWIFT::init(RGWRados *store, struct req_state *s, RGWClientIO *cio) { - dout(10) << "s->object=" << (s->object ? s->object : "") << " s->bucket=" << (s->bucket_name ? s->bucket_name : "") << dendl; + dout(10) << "s->object=" << (s->object ? s->object : "") << " s->bucket=" << (!s->bucket_name_str.empty() ? s->bucket_name_str : "") << dendl; int ret = validate_bucket_name(s->bucket_name_str.c_str()); if (ret) @@ -883,9 +863,39 @@ return ret; s->copy_source = s->info.env->get("HTTP_X_COPY_FROM"); + if (s->copy_source) { + bool result = RGWCopyObj::parse_copy_location(s->copy_source, s->src_bucket_name, s->src_object); + if (!result) + return -ERR_BAD_URL; + } s->dialect = "swift"; + if (s->op == OP_COPY) { + const char *req_dest = s->info.env->get("HTTP_DESTINATION"); + if (!req_dest) + return -ERR_BAD_URL; + + string dest_bucket_name; + string dest_object; + bool result = RGWCopyObj::parse_copy_location(req_dest, dest_bucket_name, dest_object); + if (!result) + return -ERR_BAD_URL; + + if (dest_bucket_name != s->bucket_name_str) { + ret = validate_bucket_name(dest_bucket_name.c_str()); + if (ret < 0) + return ret; + } + + /* convert COPY operation into PUT */ + s->src_bucket_name = s->bucket_name_str; + s->src_object = s->object_str; + s->bucket_name_str = dest_bucket_name; + s->object_str = dest_object; + s->op = OP_PUT; + } + return RGWHandler_ObjStore::init(store, s, cio); } @@ -896,7 +906,7 @@ if (ret < 0) return NULL; - if (!s->bucket_name) + if (s->bucket_name_str.empty()) return new RGWHandler_ObjStore_Service_SWIFT; if (!s->object) return new RGWHandler_ObjStore_Bucket_SWIFT; diff -Nru ceph-0.67.4/src/rgw/rgw_swift.cc ceph-0.67.7/src/rgw/rgw_swift.cc --- ceph-0.67.4/src/rgw/rgw_swift.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_swift.cc 2014-02-19 20:12:48.000000000 +0000 @@ -8,6 +8,7 @@ #include "rgw_swift_auth.h" #include "rgw_user.h" #include "rgw_http_client.h" +#include "rgw_keystone.h" #include "include/str_list.h" @@ -18,8 +19,6 @@ static list roles_list; -class RGWKeystoneTokenCache; - class RGWValidateSwiftToken : public RGWHTTPClient { struct rgw_swift_auth_info *info; @@ -105,192 +104,7 @@ return 0; } -int KeystoneToken::parse(CephContext *cct, bufferlist& bl) -{ - JSONParser parser; - - if (!parser.parse(bl.c_str(), bl.length())) { - ldout(cct, 0) << "malformed json" << dendl; - return -EINVAL; - } - - JSONObjIter iter = parser.find_first("access"); - if (iter.end()) { - ldout(cct, 0) << "token response is missing access section" << dendl; - return -EINVAL; - } - - JSONObj *access_obj = *iter; - JSONObj *user = access_obj->find_obj("user"); - if (!user) { - ldout(cct, 0) << "token response is missing user section" << dendl; - return -EINVAL; - } - - if (!user->get_data("username", &user_name)) { - ldout(cct, 0) << "token response is missing user username field" << dendl; - return -EINVAL; - } - - JSONObj *roles_obj = user->find_obj("roles"); - if (!roles_obj) { - ldout(cct, 0) << "token response is missing roles section, or section empty" << dendl; - return -EINVAL; - } - - JSONObjIter riter = roles_obj->find_first(); - if (riter.end()) { - ldout(cct, 0) << "token response has an empty roles list" << dendl; - return -EINVAL; - } - - for (; !riter.end(); ++riter) { - JSONObj *role_obj = *riter; - if (!role_obj) { - ldout(cct, 0) << "ERROR: role object is NULL" << dendl; - return -EINVAL; - } - - JSONObj *role_name = role_obj->find_obj("name"); - if (!role_name) { - ldout(cct, 0) << "token response is missing role name section" << dendl; - return -EINVAL; - } - string role = role_name->get_data(); - roles[role] = true; - } - - JSONObj *token = access_obj->find_obj("token"); - if (!token) { - ldout(cct, 0) << "missing token section in response" << dendl; - return -EINVAL; - } - - string expires; - - if (!token->get_data("expires", &expires)) { - ldout(cct, 0) << "token response is missing expiration field" << dendl; - return -EINVAL; - } - - struct tm t; - if (!parse_iso8601(expires.c_str(), &t)) { - ldout(cct, 0) << "failed to parse token expiration (" << expires << ")" << dendl; - return -EINVAL; - } - - expiration = timegm(&t); - - JSONObj *tenant = token->find_obj("tenant"); - if (!tenant) { - ldout(cct, 0) << "token response is missing tenant section" << dendl; - return -EINVAL; - } - - if (!tenant->get_data("id", &tenant_id)) { - ldout(cct, 0) << "tenant is missing id field" << dendl; - return -EINVAL; - } - - - if (!tenant->get_data("name", &tenant_name)) { - ldout(cct, 0) << "tenant is missing name field" << dendl; - return -EINVAL; - } - - return 0; -} - -struct token_entry { - KeystoneToken token; - list::iterator lru_iter; -}; - -class RGWKeystoneTokenCache { - CephContext *cct; - - map tokens; - list tokens_lru; - Mutex lock; - - size_t max; - -public: - RGWKeystoneTokenCache(CephContext *_cct, int _max) : cct(_cct), lock("RGWKeystoneTokenCache"), max(_max) {} - - bool find(const string& token_id, KeystoneToken& token); - void add(const string& token_id, KeystoneToken& token); - void invalidate(const string& token_id); -}; - -bool RGWKeystoneTokenCache::find(const string& token_id, KeystoneToken& token) -{ - lock.Lock(); - map::iterator iter = tokens.find(token_id); - if (iter == tokens.end()) { - lock.Unlock(); - if (perfcounter) perfcounter->inc(l_rgw_keystone_token_cache_miss); - return false; - } - - token_entry& entry = iter->second; - tokens_lru.erase(entry.lru_iter); - - if (entry.token.expired()) { - tokens.erase(iter); - lock.Unlock(); - if (perfcounter) perfcounter->inc(l_rgw_keystone_token_cache_hit); - return false; - } - token = entry.token; - - tokens_lru.push_front(token_id); - entry.lru_iter = tokens_lru.begin(); - - lock.Unlock(); - if (perfcounter) perfcounter->inc(l_rgw_keystone_token_cache_hit); - - return true; -} - -void RGWKeystoneTokenCache::add(const string& token_id, KeystoneToken& token) -{ - lock.Lock(); - map::iterator iter = tokens.find(token_id); - if (iter != tokens.end()) { - token_entry& e = iter->second; - tokens_lru.erase(e.lru_iter); - } - - tokens_lru.push_front(token_id); - token_entry& entry = tokens[token_id]; - entry.token = token; - entry.lru_iter = tokens_lru.begin(); - - while (tokens_lru.size() > max) { - list::reverse_iterator riter = tokens_lru.rbegin(); - iter = tokens.find(*riter); - assert(iter != tokens.end()); - tokens.erase(iter); - tokens_lru.pop_back(); - } - - lock.Unlock(); -} - -void RGWKeystoneTokenCache::invalidate(const string& token_id) -{ - Mutex::Locker l(lock); - map::iterator iter = tokens.find(token_id); - if (iter == tokens.end()) - return; - - ldout(cct, 20) << "invalidating revoked token id=" << token_id << dendl; - token_entry& e = iter->second; - tokens_lru.erase(e.lru_iter); - tokens.erase(iter); -} class RGWValidateKeystoneToken : public RGWHTTPClient { bufferlist *bl; @@ -489,8 +303,8 @@ static void rgw_set_keystone_token_auth_info(KeystoneToken& token, struct rgw_swift_auth_info *info) { - info->user = token.tenant_id; - info->display_name = token.tenant_name; + info->user = token.token.tenant.id; + info->display_name = token.token.tenant.name; info->status = 200; } @@ -504,10 +318,8 @@ list::iterator iter; for (iter = roles_list.begin(); iter != roles_list.end(); ++iter) { const string& role = *iter; - if (t.roles.find(role) != t.roles.end()) { - found = true; + if ((found=t.user.has_role(role))==true) break; - } } if (!found) { @@ -515,7 +327,7 @@ return -EPERM; } - ldout(cct, 0) << "validated token: " << t.tenant_name << ":" << t.user_name << " expires: " << t.expiration << dendl; + ldout(cct, 0) << "validated token: " << t.token.tenant.name << ":" << t.user.name << " expires: " << t.token.expires << dendl; rgw_set_keystone_token_auth_info(t, info); @@ -592,7 +404,7 @@ if (keystone_token_cache->find(token_id, t)) { rgw_set_keystone_token_auth_info(t, info); - ldout(cct, 20) << "cached token.tenant_id=" << t.tenant_id << dendl; + ldout(cct, 20) << "cached token.tenant.id=" << t.token.tenant.id << dendl; int ret = update_user_info(store, info, rgw_user); if (ret < 0) diff -Nru ceph-0.67.4/src/rgw/rgw_swift.h ceph-0.67.7/src/rgw/rgw_swift.h --- ceph-0.67.4/src/rgw/rgw_swift.h 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_swift.h 2014-02-19 20:12:48.000000000 +0000 @@ -6,6 +6,7 @@ #include "common/Cond.h" class RGWRados; +class KeystoneToken; struct rgw_swift_auth_info { int status; @@ -17,25 +18,6 @@ rgw_swift_auth_info() : status(0), ttl(0) {} }; -class KeystoneToken { -public: - string tenant_name; - string tenant_id; - string user_name; - time_t expiration; - - map roles; - - KeystoneToken() : expiration(0) {} - - int parse(CephContext *cct, bufferlist& bl); - - bool expired() { - uint64_t now = ceph_clock_now(NULL).sec(); - return (now >= (uint64_t)expiration); - } -}; - class RGWSwift { CephContext *cct; atomic_t down_flag; diff -Nru ceph-0.67.4/src/rgw/rgw_user.h ceph-0.67.7/src/rgw/rgw_user.h --- ceph-0.67.4/src/rgw/rgw_user.h 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/rgw/rgw_user.h 2014-02-19 20:12:48.000000000 +0000 @@ -397,6 +397,7 @@ perm_specified = false; op_mask_specified = false; suspension_op = false; + system_specified = false; key_op = false; populated = false; initialized = false; diff -Nru ceph-0.67.4/src/test/admin_socket.cc ceph-0.67.7/src/test/admin_socket.cc --- ceph-0.67.4/src/test/admin_socket.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/test/admin_socket.cc 2014-02-19 20:12:47.000000000 +0000 @@ -56,6 +56,38 @@ ASSERT_EQ(true, asoct.shutdown()); } +TEST(AdminSocket, SendHelp) { + std::auto_ptr + asokc(new AdminSocket(g_ceph_context)); + AdminSocketTest asoct(asokc.get()); + ASSERT_EQ(true, asoct.shutdown()); + ASSERT_EQ(true, asoct.init(get_rand_socket_path())); + AdminSocketClient client(get_rand_socket_path()); + + { + string help; + ASSERT_EQ("", client.do_request("{\"prefix\":\"help\"}", &help)); + ASSERT_NE(string::npos, help.find("\"list available commands\"")); + } + { + string help; + ASSERT_EQ("", client.do_request("{" + " \"prefix\":\"help\"," + " \"format\":\"xml\"," + "}", &help)); + ASSERT_NE(string::npos, help.find(">list available commands<")); + } + { + string help; + ASSERT_EQ("", client.do_request("{" + " \"prefix\":\"help\"," + " \"format\":\"UNSUPPORTED\"," + "}", &help)); + ASSERT_NE(string::npos, help.find("\"list available commands\"")); + } + ASSERT_EQ(true, asoct.shutdown()); +} + TEST(AdminSocket, SendNoOp) { std::auto_ptr asokc(new AdminSocket(g_ceph_context)); @@ -146,3 +178,14 @@ ASSERT_EQ("test| this thing", result); ASSERT_EQ(true, asoct.shutdown()); } + +/* + * Local Variables: + * compile-command: "cd .. ; + * make unittest_admin_socket && + * valgrind \ + * --max-stackframe=20000000 --tool=memcheck \ + * ./unittest_admin_socket # --gtest_filter=AdminSocket.* + * " + * End: + */ diff -Nru ceph-0.67.4/src/test/bufferlist.cc ceph-0.67.7/src/test/bufferlist.cc --- ceph-0.67.4/src/test/bufferlist.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/test/bufferlist.cc 2014-02-19 20:12:48.000000000 +0000 @@ -1520,7 +1520,7 @@ bl.push_back(ptr); } EXPECT_EQ((unsigned)4, bl.buffers().size()); - EXPECT_THROW(bl.splice(0, 0), FailedAssertion); + bl.splice(0, 0); bufferlist other; other.append('X'); diff -Nru ceph-0.67.4/src/test/ceph-disk.sh ceph-0.67.7/src/test/ceph-disk.sh --- ceph-0.67.4/src/test/ceph-disk.sh 1970-01-01 00:00:00.000000000 +0000 +++ ceph-0.67.7/src/test/ceph-disk.sh 2014-02-19 20:12:48.000000000 +0000 @@ -0,0 +1,241 @@ +#!/bin/bash +# +# Copyright (C) 2014 Cloudwatt +# +# Author: Loic Dachary +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Library Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Library Public License for more details. +# +set -xe +PS4='${FUNCNAME[0]}: $LINENO: ' + +export PATH=:$PATH # make sure program from sources are prefered +DIR=test-ceph-disk +MON_ID=a +MONA=127.0.0.1:7451 +FSID=$(uuidgen) +export CEPH_CONF=/dev/null +export CEPH_ARGS="--fsid $FSID" +CEPH_ARGS+=" --chdir=" +CEPH_ARGS+=" --run-dir=$DIR" +CEPH_ARGS+=" --mon-host=$MONA" +CEPH_ARGS+=" --log-file=$DIR/\$name.log" +CEPH_ARGS+=" --pid-file=$DIR/\$name.pidfile" +CEPH_ARGS+=" --auth-supported=none" +CEPH_DISK_ARGS= +CEPH_DISK_ARGS+=" --statedir=$DIR" +CEPH_DISK_ARGS+=" --sysconfdir=$DIR" +CEPH_DISK_ARGS+=" --prepend-to-path=" +CEPH_DISK_ARGS+=" --verbose" +TIMEOUT=3600 + +mkdir=$(which mkdir) +touch=$(which touch) +cat=$(which cat) +timeout=$(which timeout) +diff=$(which diff) + +function setup() { + teardown + mkdir $DIR + touch $DIR/ceph.conf +} + +function teardown() { + kill_daemons + rm -fr $DIR +} + +function run_mon() { + local mon_dir=$DIR/$MON_ID + $mkdir -p $mon_dir + ./ceph-mon \ + --id $MON_ID \ + --mkfs \ + --mon-data=$mon_dir \ + --keyring=/dev/null \ + --mon-initial-members=$MON_ID \ + "$@" + $touch $mon_dir/keyring + ./ceph-mon \ + --id $MON_ID \ + --mon-data=$mon_dir \ + --mon-cluster-log-file=$mon_dir/log \ + --public-addr $MONA \ + "$@" +} + +function kill_daemons() { + for pidfile in $(find $DIR | grep pidfile) ; do + for try in 0 1 1 1 2 3 ; do + kill $(cat $pidfile) || break + sleep $try + done + done +} + +function command_fixture() { + local command=$1 + + [ $(which $command) = ./$command ] || return 1 + + cat > $DIR/$command < $DIR/out 2>&1 + grep --quiet 'Is a directory' $DIR/out || return 1 + ! [ -f $osd_data/magic ] || return 1 + rmdir $osd_data/fsid + + echo successfully prepare the OSD + + CEPH_ARGS="--fsid $uuid" \ + ./ceph-disk $CEPH_DISK_ARGS prepare $osd_data 2>&1 | tee $DIR/out + grep --quiet 'Preparing osd data dir' $DIR/out || return 1 +# does not work because of CEPH_ARGS parsing precendence that was fixed post emperor +# grep --quiet $uuid $osd_data/ceph_fsid || return 1 + [ -f $osd_data/magic ] || return 1 + + echo will not override an existing OSD + + CEPH_ARGS="--fsid $(uuidgen)" \ + ./ceph-disk $CEPH_DISK_ARGS prepare $osd_data 2>&1 | tee $DIR/out + grep --quiet 'ceph-disk:Data dir .* already exists' $DIR/out || return 1 +# grep --quiet $uuid $osd_data/ceph_fsid || return 1 +} + +function test_activate_dir() { + run_mon + + local osd_data=$DIR/osd + + ./ceph-disk $CEPH_DISK_ARGS \ + prepare $osd_data || return 1 + + CEPH_ARGS="$CEPH_ARGS --osd-journal-size=100 --osd-data=$osd_data" \ + $timeout $TIMEOUT ./ceph-disk $CEPH_DISK_ARGS \ + activate \ + --mark-init=none \ + $osd_data || return 1 + $timeout $TIMEOUT ./ceph osd pool set data size 1 || return 1 + local id=$($cat $osd_data/whoami) + local weight=1 + ./ceph osd crush add osd.$id $weight root=default host=localhost || return 1 + echo FOO > $DIR/BAR + $timeout $TIMEOUT ./rados --pool data put BAR $DIR/BAR || return 1 + $timeout $TIMEOUT ./rados --pool data get BAR $DIR/BAR.copy || return 1 + $diff $DIR/BAR $DIR/BAR.copy || return 1 +} + +function test_find_cluster_by_uuid() { + setup + test_activate_dir 2>&1 | tee $DIR/test_find + ! grep "No cluster conf found in $DIR" $DIR/test_find || return 1 + teardown + + setup + rm $DIR/ceph.conf + test_activate_dir > $DIR/test_find 2>&1 + grep --quiet "No cluster conf found in $DIR" $DIR/test_find || return 1 + teardown +} + +function run() { + local default_actions + default_actions+="test_path " + default_actions+="test_no_path " + default_actions+="test_find_cluster_by_uuid " + default_actions+="test_prepend_to_path " + default_actions+="test_activate_dir_magic " + default_actions+="test_activate_dir " + local actions=${@:-$default_actions} + for action in $actions ; do + setup + $action || return 1 + teardown + done +} + +run $@ + +# Local Variables: +# compile-command: "cd .. ; test/ceph-disk.sh # test_activate_dir" +# End: Binary files /tmp/nFh2g5L_2F/ceph-0.67.4/src/test/cli/crushtool/test-map-tries-vs-retries.crushmap and /tmp/XOsfpvmOtY/ceph-0.67.7/src/test/cli/crushtool/test-map-tries-vs-retries.crushmap differ diff -Nru ceph-0.67.4/src/test/cli/crushtool/test-map-tries-vs-retries.t ceph-0.67.7/src/test/cli/crushtool/test-map-tries-vs-retries.t --- ceph-0.67.4/src/test/cli/crushtool/test-map-tries-vs-retries.t 1970-01-01 00:00:00.000000000 +0000 +++ ceph-0.67.7/src/test/cli/crushtool/test-map-tries-vs-retries.t 2014-02-19 20:12:47.000000000 +0000 @@ -0,0 +1,10259 @@ + $ crushtool -i "$TESTDIR/test-map-tries-vs-retries.crushmap" --test --show-statistics --weight 0 0 --weight 8 0 + rule 0 (replicated_ruleset), x = 0..1023, numrep = 1..10 + CRUSH rule 0 x 0 [7] + CRUSH rule 0 x 1 [10] + CRUSH rule 0 x 2 [1] + CRUSH rule 0 x 3 [15] + CRUSH rule 0 x 4 [14] + CRUSH rule 0 x 5 [7] + CRUSH rule 0 x 6 [12] + CRUSH rule 0 x 7 [9] + CRUSH rule 0 x 8 [10] + CRUSH rule 0 x 9 [7] + CRUSH rule 0 x 10 [10] + CRUSH rule 0 x 11 [13] + CRUSH rule 0 x 12 [7] + CRUSH rule 0 x 13 [3] + CRUSH rule 0 x 14 [13] + CRUSH rule 0 x 15 [15] + CRUSH rule 0 x 16 [7] + CRUSH rule 0 x 17 [10] + CRUSH rule 0 x 18 [1] + CRUSH rule 0 x 19 [7] + CRUSH rule 0 x 20 [14] + CRUSH rule 0 x 21 [3] + CRUSH rule 0 x 22 [6] + CRUSH rule 0 x 23 [10] + CRUSH rule 0 x 24 [12] + CRUSH rule 0 x 25 [7] + CRUSH rule 0 x 26 [1] + CRUSH rule 0 x 27 [3] + CRUSH rule 0 x 28 [14] + CRUSH rule 0 x 29 [5] + CRUSH rule 0 x 30 [2] + CRUSH rule 0 x 31 [5] + CRUSH rule 0 x 32 [9] + CRUSH rule 0 x 33 [13] + CRUSH rule 0 x 34 [13] + CRUSH rule 0 x 35 [4] + CRUSH rule 0 x 36 [3] + CRUSH rule 0 x 37 [9] + CRUSH rule 0 x 38 [3] + CRUSH rule 0 x 39 [12] + CRUSH rule 0 x 40 [10] + CRUSH rule 0 x 41 [4] + CRUSH rule 0 x 42 [3] + CRUSH rule 0 x 43 [10] + CRUSH rule 0 x 44 [11] + CRUSH rule 0 x 45 [11] + CRUSH rule 0 x 46 [6] + CRUSH rule 0 x 47 [3] + CRUSH rule 0 x 48 [4] + CRUSH rule 0 x 49 [9] + CRUSH rule 0 x 50 [14] + CRUSH rule 0 x 51 [10] + CRUSH rule 0 x 52 [12] + CRUSH rule 0 x 53 [3] + CRUSH rule 0 x 54 [4] + CRUSH rule 0 x 55 [4] + CRUSH rule 0 x 56 [5] + CRUSH rule 0 x 57 [6] + CRUSH rule 0 x 58 [7] + CRUSH rule 0 x 59 [2] + CRUSH rule 0 x 60 [3] + CRUSH rule 0 x 61 [3] + CRUSH rule 0 x 62 [15] + CRUSH rule 0 x 63 [10] + CRUSH rule 0 x 64 [3] + CRUSH rule 0 x 65 [4] + CRUSH rule 0 x 66 [15] + CRUSH rule 0 x 67 [2] + CRUSH rule 0 x 68 [15] + CRUSH rule 0 x 69 [2] + CRUSH rule 0 x 70 [9] + CRUSH rule 0 x 71 [15] + CRUSH rule 0 x 72 [9] + CRUSH rule 0 x 73 [5] + CRUSH rule 0 x 74 [11] + CRUSH rule 0 x 75 [9] + CRUSH rule 0 x 76 [6] + CRUSH rule 0 x 77 [7] + CRUSH rule 0 x 78 [9] + CRUSH rule 0 x 79 [13] + CRUSH rule 0 x 80 [15] + CRUSH rule 0 x 81 [15] + CRUSH rule 0 x 82 [14] + CRUSH rule 0 x 83 [4] + CRUSH rule 0 x 84 [10] + CRUSH rule 0 x 85 [3] + CRUSH rule 0 x 86 [10] + CRUSH rule 0 x 87 [15] + CRUSH rule 0 x 88 [4] + CRUSH rule 0 x 89 [3] + CRUSH rule 0 x 90 [4] + CRUSH rule 0 x 91 [6] + CRUSH rule 0 x 92 [1] + CRUSH rule 0 x 93 [9] + CRUSH rule 0 x 94 [9] + CRUSH rule 0 x 95 [7] + CRUSH rule 0 x 96 [2] + CRUSH rule 0 x 97 [4] + CRUSH rule 0 x 98 [11] + CRUSH rule 0 x 99 [12] + CRUSH rule 0 x 100 [9] + CRUSH rule 0 x 101 [15] + CRUSH rule 0 x 102 [3] + CRUSH rule 0 x 103 [13] + CRUSH rule 0 x 104 [14] + CRUSH rule 0 x 105 [14] + CRUSH rule 0 x 106 [6] + CRUSH rule 0 x 107 [3] + CRUSH rule 0 x 108 [5] + CRUSH rule 0 x 109 [9] + CRUSH rule 0 x 110 [5] + CRUSH rule 0 x 111 [10] + CRUSH rule 0 x 112 [1] + CRUSH rule 0 x 113 [6] + CRUSH rule 0 x 114 [5] + CRUSH rule 0 x 115 [10] + CRUSH rule 0 x 116 [1] + CRUSH rule 0 x 117 [5] + CRUSH rule 0 x 118 [10] + CRUSH rule 0 x 119 [14] + CRUSH rule 0 x 120 [11] + CRUSH rule 0 x 121 [9] + CRUSH rule 0 x 122 [4] + CRUSH rule 0 x 123 [3] + CRUSH rule 0 x 124 [12] + CRUSH rule 0 x 125 [9] + CRUSH rule 0 x 126 [7] + CRUSH rule 0 x 127 [4] + CRUSH rule 0 x 128 [3] + CRUSH rule 0 x 129 [11] + CRUSH rule 0 x 130 [3] + CRUSH rule 0 x 131 [12] + CRUSH rule 0 x 132 [11] + CRUSH rule 0 x 133 [3] + CRUSH rule 0 x 134 [12] + CRUSH rule 0 x 135 [3] + CRUSH rule 0 x 136 [15] + CRUSH rule 0 x 137 [14] + CRUSH rule 0 x 138 [13] + CRUSH rule 0 x 139 [11] + CRUSH rule 0 x 140 [11] + CRUSH rule 0 x 141 [6] + CRUSH rule 0 x 142 [3] + CRUSH rule 0 x 143 [9] + CRUSH rule 0 x 144 [13] + CRUSH rule 0 x 145 [12] + CRUSH rule 0 x 146 [1] + CRUSH rule 0 x 147 [1] + CRUSH rule 0 x 148 [12] + CRUSH rule 0 x 149 [2] + CRUSH rule 0 x 150 [1] + CRUSH rule 0 x 151 [2] + CRUSH rule 0 x 152 [5] + CRUSH rule 0 x 153 [6] + CRUSH rule 0 x 154 [3] + CRUSH rule 0 x 155 [14] + CRUSH rule 0 x 156 [7] + CRUSH rule 0 x 157 [15] + CRUSH rule 0 x 158 [15] + CRUSH rule 0 x 159 [4] + CRUSH rule 0 x 160 [5] + CRUSH rule 0 x 161 [1] + CRUSH rule 0 x 162 [10] + CRUSH rule 0 x 163 [15] + CRUSH rule 0 x 164 [9] + CRUSH rule 0 x 165 [11] + CRUSH rule 0 x 166 [1] + CRUSH rule 0 x 167 [9] + CRUSH rule 0 x 168 [13] + CRUSH rule 0 x 169 [1] + CRUSH rule 0 x 170 [1] + CRUSH rule 0 x 171 [9] + CRUSH rule 0 x 172 [14] + CRUSH rule 0 x 173 [5] + CRUSH rule 0 x 174 [15] + CRUSH rule 0 x 175 [5] + CRUSH rule 0 x 176 [9] + CRUSH rule 0 x 177 [2] + CRUSH rule 0 x 178 [12] + CRUSH rule 0 x 179 [2] + CRUSH rule 0 x 180 [3] + CRUSH rule 0 x 181 [9] + CRUSH rule 0 x 182 [5] + CRUSH rule 0 x 183 [5] + CRUSH rule 0 x 184 [2] + CRUSH rule 0 x 185 [13] + CRUSH rule 0 x 186 [6] + CRUSH rule 0 x 187 [1] + CRUSH rule 0 x 188 [9] + CRUSH rule 0 x 189 [6] + CRUSH rule 0 x 190 [9] + CRUSH rule 0 x 191 [7] + CRUSH rule 0 x 192 [2] + CRUSH rule 0 x 193 [3] + CRUSH rule 0 x 194 [3] + CRUSH rule 0 x 195 [5] + CRUSH rule 0 x 196 [4] + CRUSH rule 0 x 197 [14] + CRUSH rule 0 x 198 [2] + CRUSH rule 0 x 199 [2] + CRUSH rule 0 x 200 [7] + CRUSH rule 0 x 201 [9] + CRUSH rule 0 x 202 [14] + CRUSH rule 0 x 203 [12] + CRUSH rule 0 x 204 [6] + CRUSH rule 0 x 205 [15] + CRUSH rule 0 x 206 [13] + CRUSH rule 0 x 207 [2] + CRUSH rule 0 x 208 [13] + CRUSH rule 0 x 209 [6] + CRUSH rule 0 x 210 [13] + CRUSH rule 0 x 211 [2] + CRUSH rule 0 x 212 [10] + CRUSH rule 0 x 213 [3] + CRUSH rule 0 x 214 [7] + CRUSH rule 0 x 215 [6] + CRUSH rule 0 x 216 [12] + CRUSH rule 0 x 217 [12] + CRUSH rule 0 x 218 [12] + CRUSH rule 0 x 219 [3] + CRUSH rule 0 x 220 [14] + CRUSH rule 0 x 221 [15] + CRUSH rule 0 x 222 [10] + CRUSH rule 0 x 223 [9] + CRUSH rule 0 x 224 [1] + CRUSH rule 0 x 225 [10] + CRUSH rule 0 x 226 [4] + CRUSH rule 0 x 227 [7] + CRUSH rule 0 x 228 [2] + CRUSH rule 0 x 229 [9] + CRUSH rule 0 x 230 [10] + CRUSH rule 0 x 231 [2] + CRUSH rule 0 x 232 [10] + CRUSH rule 0 x 233 [6] + CRUSH rule 0 x 234 [10] + CRUSH rule 0 x 235 [13] + CRUSH rule 0 x 236 [2] + CRUSH rule 0 x 237 [3] + CRUSH rule 0 x 238 [2] + CRUSH rule 0 x 239 [4] + CRUSH rule 0 x 240 [15] + CRUSH rule 0 x 241 [7] + CRUSH rule 0 x 242 [14] + CRUSH rule 0 x 243 [2] + CRUSH rule 0 x 244 [13] + CRUSH rule 0 x 245 [12] + CRUSH rule 0 x 246 [15] + CRUSH rule 0 x 247 [6] + CRUSH rule 0 x 248 [5] + CRUSH rule 0 x 249 [10] + CRUSH rule 0 x 250 [12] + CRUSH rule 0 x 251 [13] + CRUSH rule 0 x 252 [7] + CRUSH rule 0 x 253 [3] + CRUSH rule 0 x 254 [2] + CRUSH rule 0 x 255 [1] + CRUSH rule 0 x 256 [6] + CRUSH rule 0 x 257 [15] + CRUSH rule 0 x 258 [12] + CRUSH rule 0 x 259 [9] + CRUSH rule 0 x 260 [10] + CRUSH rule 0 x 261 [13] + CRUSH rule 0 x 262 [15] + CRUSH rule 0 x 263 [12] + CRUSH rule 0 x 264 [13] + CRUSH rule 0 x 265 [12] + CRUSH rule 0 x 266 [14] + CRUSH rule 0 x 267 [12] + CRUSH rule 0 x 268 [4] + CRUSH rule 0 x 269 [11] + CRUSH rule 0 x 270 [7] + CRUSH rule 0 x 271 [4] + CRUSH rule 0 x 272 [15] + CRUSH rule 0 x 273 [2] + CRUSH rule 0 x 274 [10] + CRUSH rule 0 x 275 [10] + CRUSH rule 0 x 276 [5] + CRUSH rule 0 x 277 [14] + CRUSH rule 0 x 278 [5] + CRUSH rule 0 x 279 [6] + CRUSH rule 0 x 280 [7] + CRUSH rule 0 x 281 [5] + CRUSH rule 0 x 282 [2] + CRUSH rule 0 x 283 [4] + CRUSH rule 0 x 284 [5] + CRUSH rule 0 x 285 [15] + CRUSH rule 0 x 286 [10] + CRUSH rule 0 x 287 [12] + CRUSH rule 0 x 288 [4] + CRUSH rule 0 x 289 [2] + CRUSH rule 0 x 290 [12] + CRUSH rule 0 x 291 [7] + CRUSH rule 0 x 292 [4] + CRUSH rule 0 x 293 [6] + CRUSH rule 0 x 294 [9] + CRUSH rule 0 x 295 [6] + CRUSH rule 0 x 296 [3] + CRUSH rule 0 x 297 [6] + CRUSH rule 0 x 298 [14] + CRUSH rule 0 x 299 [14] + CRUSH rule 0 x 300 [15] + CRUSH rule 0 x 301 [9] + CRUSH rule 0 x 302 [9] + CRUSH rule 0 x 303 [4] + CRUSH rule 0 x 304 [6] + CRUSH rule 0 x 305 [13] + CRUSH rule 0 x 306 [10] + CRUSH rule 0 x 307 [11] + CRUSH rule 0 x 308 [12] + CRUSH rule 0 x 309 [9] + CRUSH rule 0 x 310 [3] + CRUSH rule 0 x 311 [3] + CRUSH rule 0 x 312 [15] + CRUSH rule 0 x 313 [9] + CRUSH rule 0 x 314 [2] + CRUSH rule 0 x 315 [15] + CRUSH rule 0 x 316 [4] + CRUSH rule 0 x 317 [1] + CRUSH rule 0 x 318 [4] + CRUSH rule 0 x 319 [2] + CRUSH rule 0 x 320 [5] + CRUSH rule 0 x 321 [1] + CRUSH rule 0 x 322 [13] + CRUSH rule 0 x 323 [7] + CRUSH rule 0 x 324 [5] + CRUSH rule 0 x 325 [9] + CRUSH rule 0 x 326 [11] + CRUSH rule 0 x 327 [12] + CRUSH rule 0 x 328 [5] + CRUSH rule 0 x 329 [2] + CRUSH rule 0 x 330 [3] + CRUSH rule 0 x 331 [12] + CRUSH rule 0 x 332 [10] + CRUSH rule 0 x 333 [6] + CRUSH rule 0 x 334 [4] + CRUSH rule 0 x 335 [11] + CRUSH rule 0 x 336 [6] + CRUSH rule 0 x 337 [15] + CRUSH rule 0 x 338 [10] + CRUSH rule 0 x 339 [11] + CRUSH rule 0 x 340 [11] + CRUSH rule 0 x 341 [7] + CRUSH rule 0 x 342 [12] + CRUSH rule 0 x 343 [12] + CRUSH rule 0 x 344 [9] + CRUSH rule 0 x 345 [14] + CRUSH rule 0 x 346 [5] + CRUSH rule 0 x 347 [10] + CRUSH rule 0 x 348 [7] + CRUSH rule 0 x 349 [9] + CRUSH rule 0 x 350 [13] + CRUSH rule 0 x 351 [13] + CRUSH rule 0 x 352 [1] + CRUSH rule 0 x 353 [10] + CRUSH rule 0 x 354 [6] + CRUSH rule 0 x 355 [13] + CRUSH rule 0 x 356 [15] + CRUSH rule 0 x 357 [4] + CRUSH rule 0 x 358 [12] + CRUSH rule 0 x 359 [5] + CRUSH rule 0 x 360 [13] + CRUSH rule 0 x 361 [5] + CRUSH rule 0 x 362 [2] + CRUSH rule 0 x 363 [7] + CRUSH rule 0 x 364 [2] + CRUSH rule 0 x 365 [13] + CRUSH rule 0 x 366 [12] + CRUSH rule 0 x 367 [7] + CRUSH rule 0 x 368 [7] + CRUSH rule 0 x 369 [7] + CRUSH rule 0 x 370 [4] + CRUSH rule 0 x 371 [1] + CRUSH rule 0 x 372 [10] + CRUSH rule 0 x 373 [15] + CRUSH rule 0 x 374 [3] + CRUSH rule 0 x 375 [5] + CRUSH rule 0 x 376 [5] + CRUSH rule 0 x 377 [1] + CRUSH rule 0 x 378 [9] + CRUSH rule 0 x 379 [11] + CRUSH rule 0 x 380 [6] + CRUSH rule 0 x 381 [15] + CRUSH rule 0 x 382 [14] + CRUSH rule 0 x 383 [3] + CRUSH rule 0 x 384 [4] + CRUSH rule 0 x 385 [4] + CRUSH rule 0 x 386 [14] + CRUSH rule 0 x 387 [1] + CRUSH rule 0 x 388 [2] + CRUSH rule 0 x 389 [12] + CRUSH rule 0 x 390 [2] + CRUSH rule 0 x 391 [3] + CRUSH rule 0 x 392 [11] + CRUSH rule 0 x 393 [2] + CRUSH rule 0 x 394 [4] + CRUSH rule 0 x 395 [10] + CRUSH rule 0 x 396 [2] + CRUSH rule 0 x 397 [1] + CRUSH rule 0 x 398 [9] + CRUSH rule 0 x 399 [5] + CRUSH rule 0 x 400 [10] + CRUSH rule 0 x 401 [6] + CRUSH rule 0 x 402 [4] + CRUSH rule 0 x 403 [7] + CRUSH rule 0 x 404 [14] + CRUSH rule 0 x 405 [9] + CRUSH rule 0 x 406 [12] + CRUSH rule 0 x 407 [9] + CRUSH rule 0 x 408 [7] + CRUSH rule 0 x 409 [11] + CRUSH rule 0 x 410 [6] + CRUSH rule 0 x 411 [13] + CRUSH rule 0 x 412 [5] + CRUSH rule 0 x 413 [13] + CRUSH rule 0 x 414 [3] + CRUSH rule 0 x 415 [6] + CRUSH rule 0 x 416 [13] + CRUSH rule 0 x 417 [4] + CRUSH rule 0 x 418 [14] + CRUSH rule 0 x 419 [5] + CRUSH rule 0 x 420 [2] + CRUSH rule 0 x 421 [15] + CRUSH rule 0 x 422 [4] + CRUSH rule 0 x 423 [3] + CRUSH rule 0 x 424 [6] + CRUSH rule 0 x 425 [11] + CRUSH rule 0 x 426 [12] + CRUSH rule 0 x 427 [14] + CRUSH rule 0 x 428 [12] + CRUSH rule 0 x 429 [3] + CRUSH rule 0 x 430 [3] + CRUSH rule 0 x 431 [9] + CRUSH rule 0 x 432 [4] + CRUSH rule 0 x 433 [4] + CRUSH rule 0 x 434 [2] + CRUSH rule 0 x 435 [13] + CRUSH rule 0 x 436 [9] + CRUSH rule 0 x 437 [9] + CRUSH rule 0 x 438 [7] + CRUSH rule 0 x 439 [7] + CRUSH rule 0 x 440 [14] + CRUSH rule 0 x 441 [2] + CRUSH rule 0 x 442 [10] + CRUSH rule 0 x 443 [12] + CRUSH rule 0 x 444 [4] + CRUSH rule 0 x 445 [4] + CRUSH rule 0 x 446 [12] + CRUSH rule 0 x 447 [15] + CRUSH rule 0 x 448 [5] + CRUSH rule 0 x 449 [14] + CRUSH rule 0 x 450 [2] + CRUSH rule 0 x 451 [6] + CRUSH rule 0 x 452 [14] + CRUSH rule 0 x 453 [5] + CRUSH rule 0 x 454 [10] + CRUSH rule 0 x 455 [6] + CRUSH rule 0 x 456 [5] + CRUSH rule 0 x 457 [9] + CRUSH rule 0 x 458 [9] + CRUSH rule 0 x 459 [13] + CRUSH rule 0 x 460 [5] + CRUSH rule 0 x 461 [4] + CRUSH rule 0 x 462 [4] + CRUSH rule 0 x 463 [4] + CRUSH rule 0 x 464 [4] + CRUSH rule 0 x 465 [5] + CRUSH rule 0 x 466 [13] + CRUSH rule 0 x 467 [13] + CRUSH rule 0 x 468 [10] + CRUSH rule 0 x 469 [4] + CRUSH rule 0 x 470 [3] + CRUSH rule 0 x 471 [6] + CRUSH rule 0 x 472 [2] + CRUSH rule 0 x 473 [15] + CRUSH rule 0 x 474 [15] + CRUSH rule 0 x 475 [10] + CRUSH rule 0 x 476 [3] + CRUSH rule 0 x 477 [6] + CRUSH rule 0 x 478 [4] + CRUSH rule 0 x 479 [13] + CRUSH rule 0 x 480 [1] + CRUSH rule 0 x 481 [15] + CRUSH rule 0 x 482 [2] + CRUSH rule 0 x 483 [10] + CRUSH rule 0 x 484 [1] + CRUSH rule 0 x 485 [9] + CRUSH rule 0 x 486 [3] + CRUSH rule 0 x 487 [12] + CRUSH rule 0 x 488 [14] + CRUSH rule 0 x 489 [11] + CRUSH rule 0 x 490 [4] + CRUSH rule 0 x 491 [1] + CRUSH rule 0 x 492 [5] + CRUSH rule 0 x 493 [12] + CRUSH rule 0 x 494 [1] + CRUSH rule 0 x 495 [3] + CRUSH rule 0 x 496 [5] + CRUSH rule 0 x 497 [13] + CRUSH rule 0 x 498 [10] + CRUSH rule 0 x 499 [14] + CRUSH rule 0 x 500 [15] + CRUSH rule 0 x 501 [10] + CRUSH rule 0 x 502 [5] + CRUSH rule 0 x 503 [15] + CRUSH rule 0 x 504 [13] + CRUSH rule 0 x 505 [12] + CRUSH rule 0 x 506 [11] + CRUSH rule 0 x 507 [4] + CRUSH rule 0 x 508 [12] + CRUSH rule 0 x 509 [4] + CRUSH rule 0 x 510 [5] + CRUSH rule 0 x 511 [2] + CRUSH rule 0 x 512 [15] + CRUSH rule 0 x 513 [4] + CRUSH rule 0 x 514 [11] + CRUSH rule 0 x 515 [12] + CRUSH rule 0 x 516 [14] + CRUSH rule 0 x 517 [11] + CRUSH rule 0 x 518 [3] + CRUSH rule 0 x 519 [12] + CRUSH rule 0 x 520 [12] + CRUSH rule 0 x 521 [11] + CRUSH rule 0 x 522 [4] + CRUSH rule 0 x 523 [3] + CRUSH rule 0 x 524 [15] + CRUSH rule 0 x 525 [3] + CRUSH rule 0 x 526 [10] + CRUSH rule 0 x 527 [3] + CRUSH rule 0 x 528 [12] + CRUSH rule 0 x 529 [6] + CRUSH rule 0 x 530 [11] + CRUSH rule 0 x 531 [9] + CRUSH rule 0 x 532 [5] + CRUSH rule 0 x 533 [12] + CRUSH rule 0 x 534 [11] + CRUSH rule 0 x 535 [11] + CRUSH rule 0 x 536 [9] + CRUSH rule 0 x 537 [15] + CRUSH rule 0 x 538 [13] + CRUSH rule 0 x 539 [10] + CRUSH rule 0 x 540 [12] + CRUSH rule 0 x 541 [2] + CRUSH rule 0 x 542 [3] + CRUSH rule 0 x 543 [4] + CRUSH rule 0 x 544 [3] + CRUSH rule 0 x 545 [14] + CRUSH rule 0 x 546 [5] + CRUSH rule 0 x 547 [5] + CRUSH rule 0 x 548 [11] + CRUSH rule 0 x 549 [14] + CRUSH rule 0 x 550 [9] + CRUSH rule 0 x 551 [11] + CRUSH rule 0 x 552 [2] + CRUSH rule 0 x 553 [11] + CRUSH rule 0 x 554 [11] + CRUSH rule 0 x 555 [6] + CRUSH rule 0 x 556 [15] + CRUSH rule 0 x 557 [12] + CRUSH rule 0 x 558 [12] + CRUSH rule 0 x 559 [2] + CRUSH rule 0 x 560 [4] + CRUSH rule 0 x 561 [12] + CRUSH rule 0 x 562 [7] + CRUSH rule 0 x 563 [15] + CRUSH rule 0 x 564 [2] + CRUSH rule 0 x 565 [3] + CRUSH rule 0 x 566 [6] + CRUSH rule 0 x 567 [15] + CRUSH rule 0 x 568 [4] + CRUSH rule 0 x 569 [11] + CRUSH rule 0 x 570 [1] + CRUSH rule 0 x 571 [10] + CRUSH rule 0 x 572 [12] + CRUSH rule 0 x 573 [7] + CRUSH rule 0 x 574 [11] + CRUSH rule 0 x 575 [5] + CRUSH rule 0 x 576 [3] + CRUSH rule 0 x 577 [13] + CRUSH rule 0 x 578 [4] + CRUSH rule 0 x 579 [13] + CRUSH rule 0 x 580 [3] + CRUSH rule 0 x 581 [7] + CRUSH rule 0 x 582 [10] + CRUSH rule 0 x 583 [4] + CRUSH rule 0 x 584 [10] + CRUSH rule 0 x 585 [5] + CRUSH rule 0 x 586 [7] + CRUSH rule 0 x 587 [11] + CRUSH rule 0 x 588 [3] + CRUSH rule 0 x 589 [9] + CRUSH rule 0 x 590 [12] + CRUSH rule 0 x 591 [2] + CRUSH rule 0 x 592 [15] + CRUSH rule 0 x 593 [13] + CRUSH rule 0 x 594 [12] + CRUSH rule 0 x 595 [12] + CRUSH rule 0 x 596 [2] + CRUSH rule 0 x 597 [15] + CRUSH rule 0 x 598 [11] + CRUSH rule 0 x 599 [13] + CRUSH rule 0 x 600 [4] + CRUSH rule 0 x 601 [13] + CRUSH rule 0 x 602 [3] + CRUSH rule 0 x 603 [3] + CRUSH rule 0 x 604 [14] + CRUSH rule 0 x 605 [2] + CRUSH rule 0 x 606 [12] + CRUSH rule 0 x 607 [3] + CRUSH rule 0 x 608 [13] + CRUSH rule 0 x 609 [14] + CRUSH rule 0 x 610 [7] + CRUSH rule 0 x 611 [13] + CRUSH rule 0 x 612 [7] + CRUSH rule 0 x 613 [10] + CRUSH rule 0 x 614 [9] + CRUSH rule 0 x 615 [9] + CRUSH rule 0 x 616 [10] + CRUSH rule 0 x 617 [15] + CRUSH rule 0 x 618 [4] + CRUSH rule 0 x 619 [15] + CRUSH rule 0 x 620 [3] + CRUSH rule 0 x 621 [3] + CRUSH rule 0 x 622 [10] + CRUSH rule 0 x 623 [4] + CRUSH rule 0 x 624 [3] + CRUSH rule 0 x 625 [11] + CRUSH rule 0 x 626 [10] + CRUSH rule 0 x 627 [1] + CRUSH rule 0 x 628 [15] + CRUSH rule 0 x 629 [5] + CRUSH rule 0 x 630 [1] + CRUSH rule 0 x 631 [5] + CRUSH rule 0 x 632 [12] + CRUSH rule 0 x 633 [14] + CRUSH rule 0 x 634 [6] + CRUSH rule 0 x 635 [6] + CRUSH rule 0 x 636 [13] + CRUSH rule 0 x 637 [3] + CRUSH rule 0 x 638 [10] + CRUSH rule 0 x 639 [6] + CRUSH rule 0 x 640 [9] + CRUSH rule 0 x 641 [10] + CRUSH rule 0 x 642 [1] + CRUSH rule 0 x 643 [3] + CRUSH rule 0 x 644 [15] + CRUSH rule 0 x 645 [14] + CRUSH rule 0 x 646 [5] + CRUSH rule 0 x 647 [10] + CRUSH rule 0 x 648 [6] + CRUSH rule 0 x 649 [3] + CRUSH rule 0 x 650 [10] + CRUSH rule 0 x 651 [3] + CRUSH rule 0 x 652 [15] + CRUSH rule 0 x 653 [11] + CRUSH rule 0 x 654 [13] + CRUSH rule 0 x 655 [6] + CRUSH rule 0 x 656 [3] + CRUSH rule 0 x 657 [11] + CRUSH rule 0 x 658 [7] + CRUSH rule 0 x 659 [2] + CRUSH rule 0 x 660 [13] + CRUSH rule 0 x 661 [7] + CRUSH rule 0 x 662 [15] + CRUSH rule 0 x 663 [14] + CRUSH rule 0 x 664 [6] + CRUSH rule 0 x 665 [2] + CRUSH rule 0 x 666 [12] + CRUSH rule 0 x 667 [1] + CRUSH rule 0 x 668 [9] + CRUSH rule 0 x 669 [9] + CRUSH rule 0 x 670 [6] + CRUSH rule 0 x 671 [6] + CRUSH rule 0 x 672 [2] + CRUSH rule 0 x 673 [7] + CRUSH rule 0 x 674 [7] + CRUSH rule 0 x 675 [9] + CRUSH rule 0 x 676 [10] + CRUSH rule 0 x 677 [2] + CRUSH rule 0 x 678 [1] + CRUSH rule 0 x 679 [5] + CRUSH rule 0 x 680 [7] + CRUSH rule 0 x 681 [6] + CRUSH rule 0 x 682 [6] + CRUSH rule 0 x 683 [6] + CRUSH rule 0 x 684 [9] + CRUSH rule 0 x 685 [5] + CRUSH rule 0 x 686 [1] + CRUSH rule 0 x 687 [7] + CRUSH rule 0 x 688 [11] + CRUSH rule 0 x 689 [5] + CRUSH rule 0 x 690 [9] + CRUSH rule 0 x 691 [11] + CRUSH rule 0 x 692 [15] + CRUSH rule 0 x 693 [5] + CRUSH rule 0 x 694 [4] + CRUSH rule 0 x 695 [6] + CRUSH rule 0 x 696 [1] + CRUSH rule 0 x 697 [13] + CRUSH rule 0 x 698 [11] + CRUSH rule 0 x 699 [7] + CRUSH rule 0 x 700 [12] + CRUSH rule 0 x 701 [3] + CRUSH rule 0 x 702 [3] + CRUSH rule 0 x 703 [15] + CRUSH rule 0 x 704 [6] + CRUSH rule 0 x 705 [14] + CRUSH rule 0 x 706 [1] + CRUSH rule 0 x 707 [4] + CRUSH rule 0 x 708 [3] + CRUSH rule 0 x 709 [11] + CRUSH rule 0 x 710 [14] + CRUSH rule 0 x 711 [14] + CRUSH rule 0 x 712 [12] + CRUSH rule 0 x 713 [11] + CRUSH rule 0 x 714 [12] + CRUSH rule 0 x 715 [6] + CRUSH rule 0 x 716 [11] + CRUSH rule 0 x 717 [12] + CRUSH rule 0 x 718 [7] + CRUSH rule 0 x 719 [5] + CRUSH rule 0 x 720 [4] + CRUSH rule 0 x 721 [11] + CRUSH rule 0 x 722 [2] + CRUSH rule 0 x 723 [2] + CRUSH rule 0 x 724 [7] + CRUSH rule 0 x 725 [11] + CRUSH rule 0 x 726 [7] + CRUSH rule 0 x 727 [2] + CRUSH rule 0 x 728 [13] + CRUSH rule 0 x 729 [15] + CRUSH rule 0 x 730 [3] + CRUSH rule 0 x 731 [9] + CRUSH rule 0 x 732 [1] + CRUSH rule 0 x 733 [11] + CRUSH rule 0 x 734 [14] + CRUSH rule 0 x 735 [6] + CRUSH rule 0 x 736 [3] + CRUSH rule 0 x 737 [1] + CRUSH rule 0 x 738 [11] + CRUSH rule 0 x 739 [11] + CRUSH rule 0 x 740 [7] + CRUSH rule 0 x 741 [12] + CRUSH rule 0 x 742 [9] + CRUSH rule 0 x 743 [5] + CRUSH rule 0 x 744 [6] + CRUSH rule 0 x 745 [3] + CRUSH rule 0 x 746 [3] + CRUSH rule 0 x 747 [15] + CRUSH rule 0 x 748 [6] + CRUSH rule 0 x 749 [14] + CRUSH rule 0 x 750 [1] + CRUSH rule 0 x 751 [15] + CRUSH rule 0 x 752 [13] + CRUSH rule 0 x 753 [4] + CRUSH rule 0 x 754 [14] + CRUSH rule 0 x 755 [13] + CRUSH rule 0 x 756 [3] + CRUSH rule 0 x 757 [10] + CRUSH rule 0 x 758 [6] + CRUSH rule 0 x 759 [5] + CRUSH rule 0 x 760 [1] + CRUSH rule 0 x 761 [2] + CRUSH rule 0 x 762 [1] + CRUSH rule 0 x 763 [4] + CRUSH rule 0 x 764 [1] + CRUSH rule 0 x 765 [9] + CRUSH rule 0 x 766 [11] + CRUSH rule 0 x 767 [6] + CRUSH rule 0 x 768 [2] + CRUSH rule 0 x 769 [15] + CRUSH rule 0 x 770 [15] + CRUSH rule 0 x 771 [9] + CRUSH rule 0 x 772 [4] + CRUSH rule 0 x 773 [3] + CRUSH rule 0 x 774 [12] + CRUSH rule 0 x 775 [5] + CRUSH rule 0 x 776 [10] + CRUSH rule 0 x 777 [11] + CRUSH rule 0 x 778 [13] + CRUSH rule 0 x 779 [5] + CRUSH rule 0 x 780 [13] + CRUSH rule 0 x 781 [5] + CRUSH rule 0 x 782 [2] + CRUSH rule 0 x 783 [12] + CRUSH rule 0 x 784 [14] + CRUSH rule 0 x 785 [6] + CRUSH rule 0 x 786 [10] + CRUSH rule 0 x 787 [1] + CRUSH rule 0 x 788 [4] + CRUSH rule 0 x 789 [9] + CRUSH rule 0 x 790 [15] + CRUSH rule 0 x 791 [9] + CRUSH rule 0 x 792 [6] + CRUSH rule 0 x 793 [15] + CRUSH rule 0 x 794 [5] + CRUSH rule 0 x 795 [6] + CRUSH rule 0 x 796 [11] + CRUSH rule 0 x 797 [14] + CRUSH rule 0 x 798 [5] + CRUSH rule 0 x 799 [2] + CRUSH rule 0 x 800 [6] + CRUSH rule 0 x 801 [2] + CRUSH rule 0 x 802 [1] + CRUSH rule 0 x 803 [7] + CRUSH rule 0 x 804 [5] + CRUSH rule 0 x 805 [13] + CRUSH rule 0 x 806 [6] + CRUSH rule 0 x 807 [14] + CRUSH rule 0 x 808 [2] + CRUSH rule 0 x 809 [1] + CRUSH rule 0 x 810 [2] + CRUSH rule 0 x 811 [15] + CRUSH rule 0 x 812 [7] + CRUSH rule 0 x 813 [4] + CRUSH rule 0 x 814 [13] + CRUSH rule 0 x 815 [15] + CRUSH rule 0 x 816 [14] + CRUSH rule 0 x 817 [10] + CRUSH rule 0 x 818 [15] + CRUSH rule 0 x 819 [5] + CRUSH rule 0 x 820 [3] + CRUSH rule 0 x 821 [15] + CRUSH rule 0 x 822 [10] + CRUSH rule 0 x 823 [2] + CRUSH rule 0 x 824 [3] + CRUSH rule 0 x 825 [10] + CRUSH rule 0 x 826 [5] + CRUSH rule 0 x 827 [13] + CRUSH rule 0 x 828 [12] + CRUSH rule 0 x 829 [13] + CRUSH rule 0 x 830 [15] + CRUSH rule 0 x 831 [1] + CRUSH rule 0 x 832 [14] + CRUSH rule 0 x 833 [9] + CRUSH rule 0 x 834 [9] + CRUSH rule 0 x 835 [14] + CRUSH rule 0 x 836 [3] + CRUSH rule 0 x 837 [15] + CRUSH rule 0 x 838 [12] + CRUSH rule 0 x 839 [3] + CRUSH rule 0 x 840 [10] + CRUSH rule 0 x 841 [3] + CRUSH rule 0 x 842 [9] + CRUSH rule 0 x 843 [14] + CRUSH rule 0 x 844 [7] + CRUSH rule 0 x 845 [13] + CRUSH rule 0 x 846 [3] + CRUSH rule 0 x 847 [12] + CRUSH rule 0 x 848 [11] + CRUSH rule 0 x 849 [3] + CRUSH rule 0 x 850 [1] + CRUSH rule 0 x 851 [14] + CRUSH rule 0 x 852 [9] + CRUSH rule 0 x 853 [13] + CRUSH rule 0 x 854 [7] + CRUSH rule 0 x 855 [14] + CRUSH rule 0 x 856 [5] + CRUSH rule 0 x 857 [4] + CRUSH rule 0 x 858 [5] + CRUSH rule 0 x 859 [5] + CRUSH rule 0 x 860 [11] + CRUSH rule 0 x 861 [13] + CRUSH rule 0 x 862 [5] + CRUSH rule 0 x 863 [11] + CRUSH rule 0 x 864 [6] + CRUSH rule 0 x 865 [4] + CRUSH rule 0 x 866 [2] + CRUSH rule 0 x 867 [12] + CRUSH rule 0 x 868 [14] + CRUSH rule 0 x 869 [10] + CRUSH rule 0 x 870 [14] + CRUSH rule 0 x 871 [6] + CRUSH rule 0 x 872 [6] + CRUSH rule 0 x 873 [2] + CRUSH rule 0 x 874 [12] + CRUSH rule 0 x 875 [10] + CRUSH rule 0 x 876 [14] + CRUSH rule 0 x 877 [15] + CRUSH rule 0 x 878 [7] + CRUSH rule 0 x 879 [12] + CRUSH rule 0 x 880 [2] + CRUSH rule 0 x 881 [6] + CRUSH rule 0 x 882 [11] + CRUSH rule 0 x 883 [13] + CRUSH rule 0 x 884 [6] + CRUSH rule 0 x 885 [14] + CRUSH rule 0 x 886 [13] + CRUSH rule 0 x 887 [14] + CRUSH rule 0 x 888 [10] + CRUSH rule 0 x 889 [15] + CRUSH rule 0 x 890 [10] + CRUSH rule 0 x 891 [9] + CRUSH rule 0 x 892 [12] + CRUSH rule 0 x 893 [1] + CRUSH rule 0 x 894 [7] + CRUSH rule 0 x 895 [2] + CRUSH rule 0 x 896 [9] + CRUSH rule 0 x 897 [7] + CRUSH rule 0 x 898 [10] + CRUSH rule 0 x 899 [1] + CRUSH rule 0 x 900 [2] + CRUSH rule 0 x 901 [9] + CRUSH rule 0 x 902 [4] + CRUSH rule 0 x 903 [14] + CRUSH rule 0 x 904 [15] + CRUSH rule 0 x 905 [12] + CRUSH rule 0 x 906 [14] + CRUSH rule 0 x 907 [7] + CRUSH rule 0 x 908 [2] + CRUSH rule 0 x 909 [10] + CRUSH rule 0 x 910 [12] + CRUSH rule 0 x 911 [11] + CRUSH rule 0 x 912 [6] + CRUSH rule 0 x 913 [4] + CRUSH rule 0 x 914 [4] + CRUSH rule 0 x 915 [12] + CRUSH rule 0 x 916 [3] + CRUSH rule 0 x 917 [1] + CRUSH rule 0 x 918 [7] + CRUSH rule 0 x 919 [10] + CRUSH rule 0 x 920 [4] + CRUSH rule 0 x 921 [1] + CRUSH rule 0 x 922 [6] + CRUSH rule 0 x 923 [12] + CRUSH rule 0 x 924 [6] + CRUSH rule 0 x 925 [12] + CRUSH rule 0 x 926 [3] + CRUSH rule 0 x 927 [6] + CRUSH rule 0 x 928 [13] + CRUSH rule 0 x 929 [10] + CRUSH rule 0 x 930 [7] + CRUSH rule 0 x 931 [6] + CRUSH rule 0 x 932 [13] + CRUSH rule 0 x 933 [12] + CRUSH rule 0 x 934 [12] + CRUSH rule 0 x 935 [6] + CRUSH rule 0 x 936 [9] + CRUSH rule 0 x 937 [14] + CRUSH rule 0 x 938 [14] + CRUSH rule 0 x 939 [6] + CRUSH rule 0 x 940 [13] + CRUSH rule 0 x 941 [3] + CRUSH rule 0 x 942 [15] + CRUSH rule 0 x 943 [10] + CRUSH rule 0 x 944 [2] + CRUSH rule 0 x 945 [10] + CRUSH rule 0 x 946 [11] + CRUSH rule 0 x 947 [11] + CRUSH rule 0 x 948 [7] + CRUSH rule 0 x 949 [9] + CRUSH rule 0 x 950 [9] + CRUSH rule 0 x 951 [2] + CRUSH rule 0 x 952 [9] + CRUSH rule 0 x 953 [1] + CRUSH rule 0 x 954 [10] + CRUSH rule 0 x 955 [7] + CRUSH rule 0 x 956 [1] + CRUSH rule 0 x 957 [14] + CRUSH rule 0 x 958 [15] + CRUSH rule 0 x 959 [2] + CRUSH rule 0 x 960 [2] + CRUSH rule 0 x 961 [3] + CRUSH rule 0 x 962 [5] + CRUSH rule 0 x 963 [13] + CRUSH rule 0 x 964 [7] + CRUSH rule 0 x 965 [12] + CRUSH rule 0 x 966 [12] + CRUSH rule 0 x 967 [7] + CRUSH rule 0 x 968 [12] + CRUSH rule 0 x 969 [11] + CRUSH rule 0 x 970 [5] + CRUSH rule 0 x 971 [1] + CRUSH rule 0 x 972 [12] + CRUSH rule 0 x 973 [1] + CRUSH rule 0 x 974 [7] + CRUSH rule 0 x 975 [7] + CRUSH rule 0 x 976 [7] + CRUSH rule 0 x 977 [14] + CRUSH rule 0 x 978 [12] + CRUSH rule 0 x 979 [5] + CRUSH rule 0 x 980 [15] + CRUSH rule 0 x 981 [5] + CRUSH rule 0 x 982 [2] + CRUSH rule 0 x 983 [3] + CRUSH rule 0 x 984 [15] + CRUSH rule 0 x 985 [11] + CRUSH rule 0 x 986 [6] + CRUSH rule 0 x 987 [13] + CRUSH rule 0 x 988 [12] + CRUSH rule 0 x 989 [7] + CRUSH rule 0 x 990 [1] + CRUSH rule 0 x 991 [7] + CRUSH rule 0 x 992 [9] + CRUSH rule 0 x 993 [6] + CRUSH rule 0 x 994 [3] + CRUSH rule 0 x 995 [15] + CRUSH rule 0 x 996 [15] + CRUSH rule 0 x 997 [15] + CRUSH rule 0 x 998 [6] + CRUSH rule 0 x 999 [9] + CRUSH rule 0 x 1000 [14] + CRUSH rule 0 x 1001 [11] + CRUSH rule 0 x 1002 [1] + CRUSH rule 0 x 1003 [10] + CRUSH rule 0 x 1004 [15] + CRUSH rule 0 x 1005 [6] + CRUSH rule 0 x 1006 [10] + CRUSH rule 0 x 1007 [1] + CRUSH rule 0 x 1008 [7] + CRUSH rule 0 x 1009 [5] + CRUSH rule 0 x 1010 [10] + CRUSH rule 0 x 1011 [6] + CRUSH rule 0 x 1012 [12] + CRUSH rule 0 x 1013 [2] + CRUSH rule 0 x 1014 [1] + CRUSH rule 0 x 1015 [12] + CRUSH rule 0 x 1016 [10] + CRUSH rule 0 x 1017 [5] + CRUSH rule 0 x 1018 [13] + CRUSH rule 0 x 1019 [10] + CRUSH rule 0 x 1020 [3] + CRUSH rule 0 x 1021 [2] + CRUSH rule 0 x 1022 [15] + CRUSH rule 0 x 1023 [15] + rule 0 (replicated_ruleset) num_rep 1 result size == 1:\t1024/1024 (esc) + CRUSH rule 0 x 0 [7,10] + CRUSH rule 0 x 1 [10,15] + CRUSH rule 0 x 2 [1,12] + CRUSH rule 0 x 3 [15,4] + CRUSH rule 0 x 4 [14,2] + CRUSH rule 0 x 5 [7,4] + CRUSH rule 0 x 6 [12,6] + CRUSH rule 0 x 7 [9,2] + CRUSH rule 0 x 8 [10,2] + CRUSH rule 0 x 9 [7,1] + CRUSH rule 0 x 10 [10,14] + CRUSH rule 0 x 11 [13,9] + CRUSH rule 0 x 12 [7,1] + CRUSH rule 0 x 13 [3,5] + CRUSH rule 0 x 14 [13,5] + CRUSH rule 0 x 15 [15,1] + CRUSH rule 0 x 16 [7,11] + CRUSH rule 0 x 17 [10,1] + CRUSH rule 0 x 18 [1,7] + CRUSH rule 0 x 19 [7,12] + CRUSH rule 0 x 20 [14,12] + CRUSH rule 0 x 21 [3,12] + CRUSH rule 0 x 22 [6,3] + CRUSH rule 0 x 23 [10,5] + CRUSH rule 0 x 24 [12,11] + CRUSH rule 0 x 25 [7,12] + CRUSH rule 0 x 26 [1,7] + CRUSH rule 0 x 27 [3,6] + CRUSH rule 0 x 28 [14,4] + CRUSH rule 0 x 29 [5,14] + CRUSH rule 0 x 30 [2,5] + CRUSH rule 0 x 31 [5,15] + CRUSH rule 0 x 32 [9,10] + CRUSH rule 0 x 33 [13,4] + CRUSH rule 0 x 34 [13,15] + CRUSH rule 0 x 35 [4,14] + CRUSH rule 0 x 36 [3,12] + CRUSH rule 0 x 37 [9,2] + CRUSH rule 0 x 38 [3,4] + CRUSH rule 0 x 39 [12,7] + CRUSH rule 0 x 40 [10,1] + CRUSH rule 0 x 41 [4,9] + CRUSH rule 0 x 42 [3,6] + CRUSH rule 0 x 43 [10,5] + CRUSH rule 0 x 44 [11,4] + CRUSH rule 0 x 45 [11,12] + CRUSH rule 0 x 46 [6,9] + CRUSH rule 0 x 47 [3,9] + CRUSH rule 0 x 48 [4,6] + CRUSH rule 0 x 49 [9,15] + CRUSH rule 0 x 50 [14,12] + CRUSH rule 0 x 51 [10,6] + CRUSH rule 0 x 52 [12,1] + CRUSH rule 0 x 53 [3,6] + CRUSH rule 0 x 54 [4,13] + CRUSH rule 0 x 55 [4,11] + CRUSH rule 0 x 56 [5,9] + CRUSH rule 0 x 57 [6,2] + CRUSH rule 0 x 58 [7,1] + CRUSH rule 0 x 59 [2,13] + CRUSH rule 0 x 60 [3,6] + CRUSH rule 0 x 61 [3,15] + CRUSH rule 0 x 62 [15,11] + CRUSH rule 0 x 63 [10,14] + CRUSH rule 0 x 64 [3,9] + CRUSH rule 0 x 65 [4,12] + CRUSH rule 0 x 66 [15,11] + CRUSH rule 0 x 67 [2,6] + CRUSH rule 0 x 68 [15,7] + CRUSH rule 0 x 69 [2,1] + CRUSH rule 0 x 70 [9,6] + CRUSH rule 0 x 71 [15,5] + CRUSH rule 0 x 72 [9,10] + CRUSH rule 0 x 73 [5,3] + CRUSH rule 0 x 74 [11,7] + CRUSH rule 0 x 75 [9,7] + CRUSH rule 0 x 76 [6,1] + CRUSH rule 0 x 77 [7,4] + CRUSH rule 0 x 78 [9,3] + CRUSH rule 0 x 79 [13,2] + CRUSH rule 0 x 80 [15,2] + CRUSH rule 0 x 81 [15,2] + CRUSH rule 0 x 82 [14,13] + CRUSH rule 0 x 83 [4,15] + CRUSH rule 0 x 84 [10,7] + CRUSH rule 0 x 85 [3,15] + CRUSH rule 0 x 86 [10,9] + CRUSH rule 0 x 87 [15,10] + CRUSH rule 0 x 88 [4,13] + CRUSH rule 0 x 89 [3,9] + CRUSH rule 0 x 90 [4,9] + CRUSH rule 0 x 91 [6,11] + CRUSH rule 0 x 92 [1,5] + CRUSH rule 0 x 93 [9,3] + CRUSH rule 0 x 94 [9,2] + CRUSH rule 0 x 95 [7,15] + CRUSH rule 0 x 96 [2,15] + CRUSH rule 0 x 97 [4,11] + CRUSH rule 0 x 98 [11,13] + CRUSH rule 0 x 99 [12,4] + CRUSH rule 0 x 100 [9,4] + CRUSH rule 0 x 101 [15,7] + CRUSH rule 0 x 102 [3,11] + CRUSH rule 0 x 103 [13,11] + CRUSH rule 0 x 104 [14,6] + CRUSH rule 0 x 105 [14,10] + CRUSH rule 0 x 106 [6,5] + CRUSH rule 0 x 107 [3,1] + CRUSH rule 0 x 108 [5,10] + CRUSH rule 0 x 109 [9,1] + CRUSH rule 0 x 110 [5,1] + CRUSH rule 0 x 111 [10,1] + CRUSH rule 0 x 112 [1,10] + CRUSH rule 0 x 113 [6,10] + CRUSH rule 0 x 114 [5,13] + CRUSH rule 0 x 115 [10,13] + CRUSH rule 0 x 116 [1,14] + CRUSH rule 0 x 117 [5,6] + CRUSH rule 0 x 118 [10,4] + CRUSH rule 0 x 119 [14,12] + CRUSH rule 0 x 120 [11,3] + CRUSH rule 0 x 121 [9,5] + CRUSH rule 0 x 122 [4,3] + CRUSH rule 0 x 123 [3,10] + CRUSH rule 0 x 124 [12,2] + CRUSH rule 0 x 125 [9,12] + CRUSH rule 0 x 126 [7,15] + CRUSH rule 0 x 127 [4,14] + CRUSH rule 0 x 128 [3,12] + CRUSH rule 0 x 129 [11,13] + CRUSH rule 0 x 130 [3,13] + CRUSH rule 0 x 131 [12,1] + CRUSH rule 0 x 132 [11,15] + CRUSH rule 0 x 133 [3,6] + CRUSH rule 0 x 134 [12,5] + CRUSH rule 0 x 135 [3,14] + CRUSH rule 0 x 136 [15,6] + CRUSH rule 0 x 137 [14,3] + CRUSH rule 0 x 138 [13,15] + CRUSH rule 0 x 139 [11,2] + CRUSH rule 0 x 140 [11,4] + CRUSH rule 0 x 141 [6,12] + CRUSH rule 0 x 142 [3,14] + CRUSH rule 0 x 143 [9,6] + CRUSH rule 0 x 144 [13,7] + CRUSH rule 0 x 145 [12,2] + CRUSH rule 0 x 146 [1,5] + CRUSH rule 0 x 147 [1,4] + CRUSH rule 0 x 148 [12,7] + CRUSH rule 0 x 149 [2,5] + CRUSH rule 0 x 150 [1,15] + CRUSH rule 0 x 151 [2,9] + CRUSH rule 0 x 152 [5,9] + CRUSH rule 0 x 153 [6,9] + CRUSH rule 0 x 154 [3,11] + CRUSH rule 0 x 155 [14,12] + CRUSH rule 0 x 156 [7,13] + CRUSH rule 0 x 157 [15,1] + CRUSH rule 0 x 158 [15,1] + CRUSH rule 0 x 159 [4,14] + CRUSH rule 0 x 160 [5,7] + CRUSH rule 0 x 161 [1,2] + CRUSH rule 0 x 162 [10,6] + CRUSH rule 0 x 163 [15,1] + CRUSH rule 0 x 164 [9,14] + CRUSH rule 0 x 165 [11,7] + CRUSH rule 0 x 166 [1,2] + CRUSH rule 0 x 167 [9,7] + CRUSH rule 0 x 168 [13,2] + CRUSH rule 0 x 169 [1,4] + CRUSH rule 0 x 170 [1,15] + CRUSH rule 0 x 171 [9,2] + CRUSH rule 0 x 172 [14,4] + CRUSH rule 0 x 173 [5,10] + CRUSH rule 0 x 174 [15,6] + CRUSH rule 0 x 175 [5,7] + CRUSH rule 0 x 176 [9,6] + CRUSH rule 0 x 177 [2,9] + CRUSH rule 0 x 178 [12,11] + CRUSH rule 0 x 179 [2,10] + CRUSH rule 0 x 180 [3,11] + CRUSH rule 0 x 181 [9,12] + CRUSH rule 0 x 182 [5,13] + CRUSH rule 0 x 183 [5,7] + CRUSH rule 0 x 184 [2,5] + CRUSH rule 0 x 185 [13,5] + CRUSH rule 0 x 186 [6,14] + CRUSH rule 0 x 187 [1,4] + CRUSH rule 0 x 188 [9,13] + CRUSH rule 0 x 189 [6,12] + CRUSH rule 0 x 190 [9,13] + CRUSH rule 0 x 191 [7,11] + CRUSH rule 0 x 192 [2,11] + CRUSH rule 0 x 193 [3,13] + CRUSH rule 0 x 194 [3,13] + CRUSH rule 0 x 195 [5,7] + CRUSH rule 0 x 196 [4,15] + CRUSH rule 0 x 197 [14,10] + CRUSH rule 0 x 198 [2,5] + CRUSH rule 0 x 199 [2,10] + CRUSH rule 0 x 200 [7,14] + CRUSH rule 0 x 201 [9,14] + CRUSH rule 0 x 202 [14,11] + CRUSH rule 0 x 203 [12,5] + CRUSH rule 0 x 204 [6,11] + CRUSH rule 0 x 205 [15,4] + CRUSH rule 0 x 206 [13,11] + CRUSH rule 0 x 207 [2,11] + CRUSH rule 0 x 208 [13,1] + CRUSH rule 0 x 209 [6,15] + CRUSH rule 0 x 210 [13,11] + CRUSH rule 0 x 211 [2,14] + CRUSH rule 0 x 212 [10,1] + CRUSH rule 0 x 213 [3,9] + CRUSH rule 0 x 214 [7,15] + CRUSH rule 0 x 215 [6,1] + CRUSH rule 0 x 216 [12,9] + CRUSH rule 0 x 217 [12,11] + CRUSH rule 0 x 218 [12,10] + CRUSH rule 0 x 219 [3,11] + CRUSH rule 0 x 220 [14,4] + CRUSH rule 0 x 221 [15,5] + CRUSH rule 0 x 222 [10,4] + CRUSH rule 0 x 223 [9,7] + CRUSH rule 0 x 224 [1,7] + CRUSH rule 0 x 225 [10,5] + CRUSH rule 0 x 226 [4,1] + CRUSH rule 0 x 227 [7,2] + CRUSH rule 0 x 228 [2,15] + CRUSH rule 0 x 229 [9,3] + CRUSH rule 0 x 230 [10,5] + CRUSH rule 0 x 231 [2,7] + CRUSH rule 0 x 232 [10,5] + CRUSH rule 0 x 233 [6,12] + CRUSH rule 0 x 234 [10,1] + CRUSH rule 0 x 235 [13,14] + CRUSH rule 0 x 236 [2,15] + CRUSH rule 0 x 237 [3,12] + CRUSH rule 0 x 238 [2,10] + CRUSH rule 0 x 239 [4,15] + CRUSH rule 0 x 240 [15,5] + CRUSH rule 0 x 241 [7,9] + CRUSH rule 0 x 242 [14,2] + CRUSH rule 0 x 243 [2,11] + CRUSH rule 0 x 244 [13,9] + CRUSH rule 0 x 245 [12,9] + CRUSH rule 0 x 246 [15,3] + CRUSH rule 0 x 247 [6,4] + CRUSH rule 0 x 248 [5,13] + CRUSH rule 0 x 249 [10,14] + CRUSH rule 0 x 250 [12,15] + CRUSH rule 0 x 251 [13,2] + CRUSH rule 0 x 252 [7,5] + CRUSH rule 0 x 253 [3,13] + CRUSH rule 0 x 254 [2,9] + CRUSH rule 0 x 255 [1,9] + CRUSH rule 0 x 256 [6,9] + CRUSH rule 0 x 257 [15,12] + CRUSH rule 0 x 258 [12,5] + CRUSH rule 0 x 259 [9,10] + CRUSH rule 0 x 260 [10,12] + CRUSH rule 0 x 261 [13,7] + CRUSH rule 0 x 262 [15,3] + CRUSH rule 0 x 263 [12,6] + CRUSH rule 0 x 264 [13,14] + CRUSH rule 0 x 265 [12,10] + CRUSH rule 0 x 266 [14,7] + CRUSH rule 0 x 267 [12,11] + CRUSH rule 0 x 268 [4,1] + CRUSH rule 0 x 269 [11,1] + CRUSH rule 0 x 270 [7,11] + CRUSH rule 0 x 271 [4,7] + CRUSH rule 0 x 272 [15,5] + CRUSH rule 0 x 273 [2,10] + CRUSH rule 0 x 274 [10,2] + CRUSH rule 0 x 275 [10,3] + CRUSH rule 0 x 276 [5,12] + CRUSH rule 0 x 277 [14,3] + CRUSH rule 0 x 278 [5,6] + CRUSH rule 0 x 279 [6,10] + CRUSH rule 0 x 280 [7,3] + CRUSH rule 0 x 281 [5,11] + CRUSH rule 0 x 282 [2,1] + CRUSH rule 0 x 283 [4,1] + CRUSH rule 0 x 284 [5,11] + CRUSH rule 0 x 285 [15,5] + CRUSH rule 0 x 286 [10,4] + CRUSH rule 0 x 287 [12,4] + CRUSH rule 0 x 288 [4,12] + CRUSH rule 0 x 289 [2,5] + CRUSH rule 0 x 290 [12,2] + CRUSH rule 0 x 291 [7,11] + CRUSH rule 0 x 292 [4,10] + CRUSH rule 0 x 293 [6,5] + CRUSH rule 0 x 294 [9,12] + CRUSH rule 0 x 295 [6,10] + CRUSH rule 0 x 296 [3,1] + CRUSH rule 0 x 297 [6,13] + CRUSH rule 0 x 298 [14,9] + CRUSH rule 0 x 299 [14,12] + CRUSH rule 0 x 300 [15,7] + CRUSH rule 0 x 301 [9,11] + CRUSH rule 0 x 302 [9,7] + CRUSH rule 0 x 303 [4,13] + CRUSH rule 0 x 304 [6,9] + CRUSH rule 0 x 305 [13,7] + CRUSH rule 0 x 306 [10,12] + CRUSH rule 0 x 307 [11,12] + CRUSH rule 0 x 308 [12,14] + CRUSH rule 0 x 309 [9,3] + CRUSH rule 0 x 310 [3,1] + CRUSH rule 0 x 311 [3,9] + CRUSH rule 0 x 312 [15,13] + CRUSH rule 0 x 313 [9,15] + CRUSH rule 0 x 314 [2,15] + CRUSH rule 0 x 315 [15,2] + CRUSH rule 0 x 316 [4,9] + CRUSH rule 0 x 317 [1,5] + CRUSH rule 0 x 318 [4,1] + CRUSH rule 0 x 319 [2,15] + CRUSH rule 0 x 320 [5,7] + CRUSH rule 0 x 321 [1,6] + CRUSH rule 0 x 322 [13,7] + CRUSH rule 0 x 323 [7,4] + CRUSH rule 0 x 324 [5,6] + CRUSH rule 0 x 325 [9,10] + CRUSH rule 0 x 326 [11,7] + CRUSH rule 0 x 327 [12,5] + CRUSH rule 0 x 328 [5,2] + CRUSH rule 0 x 329 [2,6] + CRUSH rule 0 x 330 [3,9] + CRUSH rule 0 x 331 [12,14] + CRUSH rule 0 x 332 [10,12] + CRUSH rule 0 x 333 [6,5] + CRUSH rule 0 x 334 [4,9] + CRUSH rule 0 x 335 [11,7] + CRUSH rule 0 x 336 [6,14] + CRUSH rule 0 x 337 [15,11] + CRUSH rule 0 x 338 [10,5] + CRUSH rule 0 x 339 [11,14] + CRUSH rule 0 x 340 [11,6] + CRUSH rule 0 x 341 [7,5] + CRUSH rule 0 x 342 [12,14] + CRUSH rule 0 x 343 [12,14] + CRUSH rule 0 x 344 [9,11] + CRUSH rule 0 x 345 [14,2] + CRUSH rule 0 x 346 [5,3] + CRUSH rule 0 x 347 [10,2] + CRUSH rule 0 x 348 [7,9] + CRUSH rule 0 x 349 [9,6] + CRUSH rule 0 x 350 [13,9] + CRUSH rule 0 x 351 [13,5] + CRUSH rule 0 x 352 [1,12] + CRUSH rule 0 x 353 [10,14] + CRUSH rule 0 x 354 [6,3] + CRUSH rule 0 x 355 [13,14] + CRUSH rule 0 x 356 [15,13] + CRUSH rule 0 x 357 [4,11] + CRUSH rule 0 x 358 [12,7] + CRUSH rule 0 x 359 [5,15] + CRUSH rule 0 x 360 [13,10] + CRUSH rule 0 x 361 [5,3] + CRUSH rule 0 x 362 [2,9] + CRUSH rule 0 x 363 [7,12] + CRUSH rule 0 x 364 [2,12] + CRUSH rule 0 x 365 [13,5] + CRUSH rule 0 x 366 [12,7] + CRUSH rule 0 x 367 [7,13] + CRUSH rule 0 x 368 [7,9] + CRUSH rule 0 x 369 [7,5] + CRUSH rule 0 x 370 [4,7] + CRUSH rule 0 x 371 [1,7] + CRUSH rule 0 x 372 [10,4] + CRUSH rule 0 x 373 [15,5] + CRUSH rule 0 x 374 [3,15] + CRUSH rule 0 x 375 [5,2] + CRUSH rule 0 x 376 [5,14] + CRUSH rule 0 x 377 [1,15] + CRUSH rule 0 x 378 [9,12] + CRUSH rule 0 x 379 [11,2] + CRUSH rule 0 x 380 [6,1] + CRUSH rule 0 x 381 [15,13] + CRUSH rule 0 x 382 [14,3] + CRUSH rule 0 x 383 [3,6] + CRUSH rule 0 x 384 [4,13] + CRUSH rule 0 x 385 [4,6] + CRUSH rule 0 x 386 [14,3] + CRUSH rule 0 x 387 [1,11] + CRUSH rule 0 x 388 [2,6] + CRUSH rule 0 x 389 [12,7] + CRUSH rule 0 x 390 [2,11] + CRUSH rule 0 x 391 [3,4] + CRUSH rule 0 x 392 [11,5] + CRUSH rule 0 x 393 [2,14] + CRUSH rule 0 x 394 [4,9] + CRUSH rule 0 x 395 [10,13] + CRUSH rule 0 x 396 [2,12] + CRUSH rule 0 x 397 [1,14] + CRUSH rule 0 x 398 [9,2] + CRUSH rule 0 x 399 [5,9] + CRUSH rule 0 x 400 [10,6] + CRUSH rule 0 x 401 [6,9] + CRUSH rule 0 x 402 [4,7] + CRUSH rule 0 x 403 [7,15] + CRUSH rule 0 x 404 [14,12] + CRUSH rule 0 x 405 [9,15] + CRUSH rule 0 x 406 [12,14] + CRUSH rule 0 x 407 [9,5] + CRUSH rule 0 x 408 [7,1] + CRUSH rule 0 x 409 [11,2] + CRUSH rule 0 x 410 [6,4] + CRUSH rule 0 x 411 [13,11] + CRUSH rule 0 x 412 [5,9] + CRUSH rule 0 x 413 [13,5] + CRUSH rule 0 x 414 [3,11] + CRUSH rule 0 x 415 [6,10] + CRUSH rule 0 x 416 [13,1] + CRUSH rule 0 x 417 [4,12] + CRUSH rule 0 x 418 [14,5] + CRUSH rule 0 x 419 [5,14] + CRUSH rule 0 x 420 [2,4] + CRUSH rule 0 x 421 [15,4] + CRUSH rule 0 x 422 [4,11] + CRUSH rule 0 x 423 [3,15] + CRUSH rule 0 x 424 [6,10] + CRUSH rule 0 x 425 [11,15] + CRUSH rule 0 x 426 [12,4] + CRUSH rule 0 x 427 [14,10] + CRUSH rule 0 x 428 [12,7] + CRUSH rule 0 x 429 [3,4] + CRUSH rule 0 x 430 [3,5] + CRUSH rule 0 x 431 [9,3] + CRUSH rule 0 x 432 [4,1] + CRUSH rule 0 x 433 [4,11] + CRUSH rule 0 x 434 [2,14] + CRUSH rule 0 x 435 [13,11] + CRUSH rule 0 x 436 [9,15] + CRUSH rule 0 x 437 [9,6] + CRUSH rule 0 x 438 [7,2] + CRUSH rule 0 x 439 [7,14] + CRUSH rule 0 x 440 [14,11] + CRUSH rule 0 x 441 [2,4] + CRUSH rule 0 x 442 [10,13] + CRUSH rule 0 x 443 [12,15] + CRUSH rule 0 x 444 [4,13] + CRUSH rule 0 x 445 [4,2] + CRUSH rule 0 x 446 [12,10] + CRUSH rule 0 x 447 [15,7] + CRUSH rule 0 x 448 [5,2] + CRUSH rule 0 x 449 [14,5] + CRUSH rule 0 x 450 [2,4] + CRUSH rule 0 x 451 [6,14] + CRUSH rule 0 x 452 [14,9] + CRUSH rule 0 x 453 [5,15] + CRUSH rule 0 x 454 [10,4] + CRUSH rule 0 x 455 [6,13] + CRUSH rule 0 x 456 [5,7] + CRUSH rule 0 x 457 [9,1] + CRUSH rule 0 x 458 [9,11] + CRUSH rule 0 x 459 [13,15] + CRUSH rule 0 x 460 [5,12] + CRUSH rule 0 x 461 [4,3] + CRUSH rule 0 x 462 [4,7] + CRUSH rule 0 x 463 [4,12] + CRUSH rule 0 x 464 [4,2] + CRUSH rule 0 x 465 [5,10] + CRUSH rule 0 x 466 [13,5] + CRUSH rule 0 x 467 [13,6] + CRUSH rule 0 x 468 [10,7] + CRUSH rule 0 x 469 [4,9] + CRUSH rule 0 x 470 [3,9] + CRUSH rule 0 x 471 [6,1] + CRUSH rule 0 x 472 [2,14] + CRUSH rule 0 x 473 [15,10] + CRUSH rule 0 x 474 [15,10] + CRUSH rule 0 x 475 [10,5] + CRUSH rule 0 x 476 [3,6] + CRUSH rule 0 x 477 [6,13] + CRUSH rule 0 x 478 [4,15] + CRUSH rule 0 x 479 [13,11] + CRUSH rule 0 x 480 [1,13] + CRUSH rule 0 x 481 [15,12] + CRUSH rule 0 x 482 [2,12] + CRUSH rule 0 x 483 [10,1] + CRUSH rule 0 x 484 [1,4] + CRUSH rule 0 x 485 [9,4] + CRUSH rule 0 x 486 [3,10] + CRUSH rule 0 x 487 [12,11] + CRUSH rule 0 x 488 [14,4] + CRUSH rule 0 x 489 [11,4] + CRUSH rule 0 x 490 [4,9] + CRUSH rule 0 x 491 [1,12] + CRUSH rule 0 x 492 [5,7] + CRUSH rule 0 x 493 [12,1] + CRUSH rule 0 x 494 [1,7] + CRUSH rule 0 x 495 [3,15] + CRUSH rule 0 x 496 [5,3] + CRUSH rule 0 x 497 [13,10] + CRUSH rule 0 x 498 [10,6] + CRUSH rule 0 x 499 [14,3] + CRUSH rule 0 x 500 [15,9] + CRUSH rule 0 x 501 [10,13] + CRUSH rule 0 x 502 [5,1] + CRUSH rule 0 x 503 [15,10] + CRUSH rule 0 x 504 [13,2] + CRUSH rule 0 x 505 [12,7] + CRUSH rule 0 x 506 [11,7] + CRUSH rule 0 x 507 [4,14] + CRUSH rule 0 x 508 [12,1] + CRUSH rule 0 x 509 [4,2] + CRUSH rule 0 x 510 [5,3] + CRUSH rule 0 x 511 [2,12] + CRUSH rule 0 x 512 [15,11] + CRUSH rule 0 x 513 [4,9] + CRUSH rule 0 x 514 [11,9] + CRUSH rule 0 x 515 [12,14] + CRUSH rule 0 x 516 [14,11] + CRUSH rule 0 x 517 [11,5] + CRUSH rule 0 x 518 [3,5] + CRUSH rule 0 x 519 [12,14] + CRUSH rule 0 x 520 [12,4] + CRUSH rule 0 x 521 [11,5] + CRUSH rule 0 x 522 [4,12] + CRUSH rule 0 x 523 [3,1] + CRUSH rule 0 x 524 [15,9] + CRUSH rule 0 x 525 [3,15] + CRUSH rule 0 x 526 [10,2] + CRUSH rule 0 x 527 [3,13] + CRUSH rule 0 x 528 [12,7] + CRUSH rule 0 x 529 [6,4] + CRUSH rule 0 x 530 [11,9] + CRUSH rule 0 x 531 [9,15] + CRUSH rule 0 x 532 [5,3] + CRUSH rule 0 x 533 [12,15] + CRUSH rule 0 x 534 [11,9] + CRUSH rule 0 x 535 [11,1] + CRUSH rule 0 x 536 [9,1] + CRUSH rule 0 x 537 [15,5] + CRUSH rule 0 x 538 [13,5] + CRUSH rule 0 x 539 [10,12] + CRUSH rule 0 x 540 [12,15] + CRUSH rule 0 x 541 [2,1] + CRUSH rule 0 x 542 [3,9] + CRUSH rule 0 x 543 [4,10] + CRUSH rule 0 x 544 [3,15] + CRUSH rule 0 x 545 [14,10] + CRUSH rule 0 x 546 [5,15] + CRUSH rule 0 x 547 [5,13] + CRUSH rule 0 x 548 [11,7] + CRUSH rule 0 x 549 [14,1] + CRUSH rule 0 x 550 [9,15] + CRUSH rule 0 x 551 [11,2] + CRUSH rule 0 x 552 [2,11] + CRUSH rule 0 x 553 [11,9] + CRUSH rule 0 x 554 [11,14] + CRUSH rule 0 x 555 [6,5] + CRUSH rule 0 x 556 [15,6] + CRUSH rule 0 x 557 [12,2] + CRUSH rule 0 x 558 [12,1] + CRUSH rule 0 x 559 [2,13] + CRUSH rule 0 x 560 [4,9] + CRUSH rule 0 x 561 [12,7] + CRUSH rule 0 x 562 [7,13] + CRUSH rule 0 x 563 [15,4] + CRUSH rule 0 x 564 [2,13] + CRUSH rule 0 x 565 [3,12] + CRUSH rule 0 x 566 [6,14] + CRUSH rule 0 x 567 [15,4] + CRUSH rule 0 x 568 [4,14] + CRUSH rule 0 x 569 [11,3] + CRUSH rule 0 x 570 [1,10] + CRUSH rule 0 x 571 [10,12] + CRUSH rule 0 x 572 [12,14] + CRUSH rule 0 x 573 [7,15] + CRUSH rule 0 x 574 [11,14] + CRUSH rule 0 x 575 [5,13] + CRUSH rule 0 x 576 [3,15] + CRUSH rule 0 x 577 [13,9] + CRUSH rule 0 x 578 [4,10] + CRUSH rule 0 x 579 [13,1] + CRUSH rule 0 x 580 [3,12] + CRUSH rule 0 x 581 [7,14] + CRUSH rule 0 x 582 [10,5] + CRUSH rule 0 x 583 [4,15] + CRUSH rule 0 x 584 [10,1] + CRUSH rule 0 x 585 [5,3] + CRUSH rule 0 x 586 [7,10] + CRUSH rule 0 x 587 [11,6] + CRUSH rule 0 x 588 [3,12] + CRUSH rule 0 x 589 [9,7] + CRUSH rule 0 x 590 [12,1] + CRUSH rule 0 x 591 [2,6] + CRUSH rule 0 x 592 [15,12] + CRUSH rule 0 x 593 [13,14] + CRUSH rule 0 x 594 [12,14] + CRUSH rule 0 x 595 [12,7] + CRUSH rule 0 x 596 [2,7] + CRUSH rule 0 x 597 [15,1] + CRUSH rule 0 x 598 [11,5] + CRUSH rule 0 x 599 [13,11] + CRUSH rule 0 x 600 [4,12] + CRUSH rule 0 x 601 [13,5] + CRUSH rule 0 x 602 [3,11] + CRUSH rule 0 x 603 [3,1] + CRUSH rule 0 x 604 [14,2] + CRUSH rule 0 x 605 [2,7] + CRUSH rule 0 x 606 [12,15] + CRUSH rule 0 x 607 [3,9] + CRUSH rule 0 x 608 [13,10] + CRUSH rule 0 x 609 [14,3] + CRUSH rule 0 x 610 [7,10] + CRUSH rule 0 x 611 [13,1] + CRUSH rule 0 x 612 [7,1] + CRUSH rule 0 x 613 [10,7] + CRUSH rule 0 x 614 [9,4] + CRUSH rule 0 x 615 [9,4] + CRUSH rule 0 x 616 [10,14] + CRUSH rule 0 x 617 [15,7] + CRUSH rule 0 x 618 [4,2] + CRUSH rule 0 x 619 [15,4] + CRUSH rule 0 x 620 [3,7] + CRUSH rule 0 x 621 [3,6] + CRUSH rule 0 x 622 [10,2] + CRUSH rule 0 x 623 [4,9] + CRUSH rule 0 x 624 [3,9] + CRUSH rule 0 x 625 [11,7] + CRUSH rule 0 x 626 [10,12] + CRUSH rule 0 x 627 [1,12] + CRUSH rule 0 x 628 [15,13] + CRUSH rule 0 x 629 [5,6] + CRUSH rule 0 x 630 [1,4] + CRUSH rule 0 x 631 [5,7] + CRUSH rule 0 x 632 [12,3] + CRUSH rule 0 x 633 [14,4] + CRUSH rule 0 x 634 [6,9] + CRUSH rule 0 x 635 [6,5] + CRUSH rule 0 x 636 [13,6] + CRUSH rule 0 x 637 [3,1] + CRUSH rule 0 x 638 [10,15] + CRUSH rule 0 x 639 [6,9] + CRUSH rule 0 x 640 [9,6] + CRUSH rule 0 x 641 [10,6] + CRUSH rule 0 x 642 [1,15] + CRUSH rule 0 x 643 [3,7] + CRUSH rule 0 x 644 [15,13] + CRUSH rule 0 x 645 [14,2] + CRUSH rule 0 x 646 [5,13] + CRUSH rule 0 x 647 [10,1] + CRUSH rule 0 x 648 [6,5] + CRUSH rule 0 x 649 [3,9] + CRUSH rule 0 x 650 [10,9] + CRUSH rule 0 x 651 [3,9] + CRUSH rule 0 x 652 [15,9] + CRUSH rule 0 x 653 [11,14] + CRUSH rule 0 x 654 [13,6] + CRUSH rule 0 x 655 [6,3] + CRUSH rule 0 x 656 [3,15] + CRUSH rule 0 x 657 [11,15] + CRUSH rule 0 x 658 [7,2] + CRUSH rule 0 x 659 [2,5] + CRUSH rule 0 x 660 [13,14] + CRUSH rule 0 x 661 [7,15] + CRUSH rule 0 x 662 [15,2] + CRUSH rule 0 x 663 [14,9] + CRUSH rule 0 x 664 [6,10] + CRUSH rule 0 x 665 [2,9] + CRUSH rule 0 x 666 [12,3] + CRUSH rule 0 x 667 [1,9] + CRUSH rule 0 x 668 [9,5] + CRUSH rule 0 x 669 [9,7] + CRUSH rule 0 x 670 [6,10] + CRUSH rule 0 x 671 [6,15] + CRUSH rule 0 x 672 [2,9] + CRUSH rule 0 x 673 [7,10] + CRUSH rule 0 x 674 [7,12] + CRUSH rule 0 x 675 [9,5] + CRUSH rule 0 x 676 [10,12] + CRUSH rule 0 x 677 [2,12] + CRUSH rule 0 x 678 [1,2] + CRUSH rule 0 x 679 [5,6] + CRUSH rule 0 x 680 [7,11] + CRUSH rule 0 x 681 [6,4] + CRUSH rule 0 x 682 [6,1] + CRUSH rule 0 x 683 [6,13] + CRUSH rule 0 x 684 [9,11] + CRUSH rule 0 x 685 [5,1] + CRUSH rule 0 x 686 [1,9] + CRUSH rule 0 x 687 [7,13] + CRUSH rule 0 x 688 [11,9] + CRUSH rule 0 x 689 [5,2] + CRUSH rule 0 x 690 [9,7] + CRUSH rule 0 x 691 [11,15] + CRUSH rule 0 x 692 [15,5] + CRUSH rule 0 x 693 [5,6] + CRUSH rule 0 x 694 [4,7] + CRUSH rule 0 x 695 [6,13] + CRUSH rule 0 x 696 [1,2] + CRUSH rule 0 x 697 [13,11] + CRUSH rule 0 x 698 [11,13] + CRUSH rule 0 x 699 [7,14] + CRUSH rule 0 x 700 [12,14] + CRUSH rule 0 x 701 [3,13] + CRUSH rule 0 x 702 [3,12] + CRUSH rule 0 x 703 [15,11] + CRUSH rule 0 x 704 [6,4] + CRUSH rule 0 x 705 [14,6] + CRUSH rule 0 x 706 [1,12] + CRUSH rule 0 x 707 [4,7] + CRUSH rule 0 x 708 [3,10] + CRUSH rule 0 x 709 [11,12] + CRUSH rule 0 x 710 [14,2] + CRUSH rule 0 x 711 [14,3] + CRUSH rule 0 x 712 [12,3] + CRUSH rule 0 x 713 [11,9] + CRUSH rule 0 x 714 [12,1] + CRUSH rule 0 x 715 [6,1] + CRUSH rule 0 x 716 [11,13] + CRUSH rule 0 x 717 [12,4] + CRUSH rule 0 x 718 [7,15] + CRUSH rule 0 x 719 [5,15] + CRUSH rule 0 x 720 [4,13] + CRUSH rule 0 x 721 [11,3] + CRUSH rule 0 x 722 [2,4] + CRUSH rule 0 x 723 [2,1] + CRUSH rule 0 x 724 [7,1] + CRUSH rule 0 x 725 [11,12] + CRUSH rule 0 x 726 [7,14] + CRUSH rule 0 x 727 [2,5] + CRUSH rule 0 x 728 [13,11] + CRUSH rule 0 x 729 [15,11] + CRUSH rule 0 x 730 [3,7] + CRUSH rule 0 x 731 [9,1] + CRUSH rule 0 x 732 [1,2] + CRUSH rule 0 x 733 [11,3] + CRUSH rule 0 x 734 [14,3] + CRUSH rule 0 x 735 [6,9] + CRUSH rule 0 x 736 [3,9] + CRUSH rule 0 x 737 [1,4] + CRUSH rule 0 x 738 [11,15] + CRUSH rule 0 x 739 [11,12] + CRUSH rule 0 x 740 [7,9] + CRUSH rule 0 x 741 [12,11] + CRUSH rule 0 x 742 [9,7] + CRUSH rule 0 x 743 [5,13] + CRUSH rule 0 x 744 [6,2] + CRUSH rule 0 x 745 [3,6] + CRUSH rule 0 x 746 [3,7] + CRUSH rule 0 x 747 [15,11] + CRUSH rule 0 x 748 [6,10] + CRUSH rule 0 x 749 [14,9] + CRUSH rule 0 x 750 [1,14] + CRUSH rule 0 x 751 [15,1] + CRUSH rule 0 x 752 [13,1] + CRUSH rule 0 x 753 [4,11] + CRUSH rule 0 x 754 [14,12] + CRUSH rule 0 x 755 [13,6] + CRUSH rule 0 x 756 [3,4] + CRUSH rule 0 x 757 [10,6] + CRUSH rule 0 x 758 [6,3] + CRUSH rule 0 x 759 [5,7] + CRUSH rule 0 x 760 [1,15] + CRUSH rule 0 x 761 [2,12] + CRUSH rule 0 x 762 [1,4] + CRUSH rule 0 x 763 [4,13] + CRUSH rule 0 x 764 [1,14] + CRUSH rule 0 x 765 [9,15] + CRUSH rule 0 x 766 [11,2] + CRUSH rule 0 x 767 [6,11] + CRUSH rule 0 x 768 [2,12] + CRUSH rule 0 x 769 [15,1] + CRUSH rule 0 x 770 [15,13] + CRUSH rule 0 x 771 [9,2] + CRUSH rule 0 x 772 [4,3] + CRUSH rule 0 x 773 [3,7] + CRUSH rule 0 x 774 [12,6] + CRUSH rule 0 x 775 [5,10] + CRUSH rule 0 x 776 [10,15] + CRUSH rule 0 x 777 [11,13] + CRUSH rule 0 x 778 [13,1] + CRUSH rule 0 x 779 [5,11] + CRUSH rule 0 x 780 [13,9] + CRUSH rule 0 x 781 [5,7] + CRUSH rule 0 x 782 [2,15] + CRUSH rule 0 x 783 [12,7] + CRUSH rule 0 x 784 [14,1] + CRUSH rule 0 x 785 [6,12] + CRUSH rule 0 x 786 [10,5] + CRUSH rule 0 x 787 [1,12] + CRUSH rule 0 x 788 [4,2] + CRUSH rule 0 x 789 [9,2] + CRUSH rule 0 x 790 [15,2] + CRUSH rule 0 x 791 [9,4] + CRUSH rule 0 x 792 [6,4] + CRUSH rule 0 x 793 [15,9] + CRUSH rule 0 x 794 [5,12] + CRUSH rule 0 x 795 [6,14] + CRUSH rule 0 x 796 [11,2] + CRUSH rule 0 x 797 [14,3] + CRUSH rule 0 x 798 [5,11] + CRUSH rule 0 x 799 [2,9] + CRUSH rule 0 x 800 [6,3] + CRUSH rule 0 x 801 [2,5] + CRUSH rule 0 x 802 [1,4] + CRUSH rule 0 x 803 [7,2] + CRUSH rule 0 x 804 [5,14] + CRUSH rule 0 x 805 [13,4] + CRUSH rule 0 x 806 [6,2] + CRUSH rule 0 x 807 [14,2] + CRUSH rule 0 x 808 [2,15] + CRUSH rule 0 x 809 [1,11] + CRUSH rule 0 x 810 [2,5] + CRUSH rule 0 x 811 [15,6] + CRUSH rule 0 x 812 [7,11] + CRUSH rule 0 x 813 [4,10] + CRUSH rule 0 x 814 [13,4] + CRUSH rule 0 x 815 [15,12] + CRUSH rule 0 x 816 [14,10] + CRUSH rule 0 x 817 [10,7] + CRUSH rule 0 x 818 [15,2] + CRUSH rule 0 x 819 [5,12] + CRUSH rule 0 x 820 [3,6] + CRUSH rule 0 x 821 [15,10] + CRUSH rule 0 x 822 [10,13] + CRUSH rule 0 x 823 [2,6] + CRUSH rule 0 x 824 [3,7] + CRUSH rule 0 x 825 [10,5] + CRUSH rule 0 x 826 [5,2] + CRUSH rule 0 x 827 [13,5] + CRUSH rule 0 x 828 [12,6] + CRUSH rule 0 x 829 [13,6] + CRUSH rule 0 x 830 [15,13] + CRUSH rule 0 x 831 [1,4] + CRUSH rule 0 x 832 [14,11] + CRUSH rule 0 x 833 [9,13] + CRUSH rule 0 x 834 [9,7] + CRUSH rule 0 x 835 [14,3] + CRUSH rule 0 x 836 [3,9] + CRUSH rule 0 x 837 [15,12] + CRUSH rule 0 x 838 [12,14] + CRUSH rule 0 x 839 [3,4] + CRUSH rule 0 x 840 [10,15] + CRUSH rule 0 x 841 [3,5] + CRUSH rule 0 x 842 [9,13] + CRUSH rule 0 x 843 [14,7] + CRUSH rule 0 x 844 [7,1] + CRUSH rule 0 x 845 [13,6] + CRUSH rule 0 x 846 [3,7] + CRUSH rule 0 x 847 [12,15] + CRUSH rule 0 x 848 [11,13] + CRUSH rule 0 x 849 [3,15] + CRUSH rule 0 x 850 [1,3] + CRUSH rule 0 x 851 [14,4] + CRUSH rule 0 x 852 [9,12] + CRUSH rule 0 x 853 [13,14] + CRUSH rule 0 x 854 [7,11] + CRUSH rule 0 x 855 [14,4] + CRUSH rule 0 x 856 [5,10] + CRUSH rule 0 x 857 [4,3] + CRUSH rule 0 x 858 [5,15] + CRUSH rule 0 x 859 [5,15] + CRUSH rule 0 x 860 [11,14] + CRUSH rule 0 x 861 [13,7] + CRUSH rule 0 x 862 [5,10] + CRUSH rule 0 x 863 [11,6] + CRUSH rule 0 x 864 [6,13] + CRUSH rule 0 x 865 [4,1] + CRUSH rule 0 x 866 [2,13] + CRUSH rule 0 x 867 [12,2] + CRUSH rule 0 x 868 [14,11] + CRUSH rule 0 x 869 [10,13] + CRUSH rule 0 x 870 [14,9] + CRUSH rule 0 x 871 [6,2] + CRUSH rule 0 x 872 [6,1] + CRUSH rule 0 x 873 [2,5] + CRUSH rule 0 x 874 [12,4] + CRUSH rule 0 x 875 [10,6] + CRUSH rule 0 x 876 [14,7] + CRUSH rule 0 x 877 [15,11] + CRUSH rule 0 x 878 [7,14] + CRUSH rule 0 x 879 [12,2] + CRUSH rule 0 x 880 [2,12] + CRUSH rule 0 x 881 [6,3] + CRUSH rule 0 x 882 [11,13] + CRUSH rule 0 x 883 [13,1] + CRUSH rule 0 x 884 [6,15] + CRUSH rule 0 x 885 [14,7] + CRUSH rule 0 x 886 [13,11] + CRUSH rule 0 x 887 [14,4] + CRUSH rule 0 x 888 [10,12] + CRUSH rule 0 x 889 [15,13] + CRUSH rule 0 x 890 [10,12] + CRUSH rule 0 x 891 [9,5] + CRUSH rule 0 x 892 [12,15] + CRUSH rule 0 x 893 [1,3] + CRUSH rule 0 x 894 [7,2] + CRUSH rule 0 x 895 [2,1] + CRUSH rule 0 x 896 [9,1] + CRUSH rule 0 x 897 [7,5] + CRUSH rule 0 x 898 [10,6] + CRUSH rule 0 x 899 [1,11] + CRUSH rule 0 x 900 [2,9] + CRUSH rule 0 x 901 [9,12] + CRUSH rule 0 x 902 [4,2] + CRUSH rule 0 x 903 [14,10] + CRUSH rule 0 x 904 [15,12] + CRUSH rule 0 x 905 [12,6] + CRUSH rule 0 x 906 [14,11] + CRUSH rule 0 x 907 [7,12] + CRUSH rule 0 x 908 [2,15] + CRUSH rule 0 x 909 [10,14] + CRUSH rule 0 x 910 [12,7] + CRUSH rule 0 x 911 [11,15] + CRUSH rule 0 x 912 [6,4] + CRUSH rule 0 x 913 [4,6] + CRUSH rule 0 x 914 [4,15] + CRUSH rule 0 x 915 [12,14] + CRUSH rule 0 x 916 [3,1] + CRUSH rule 0 x 917 [1,15] + CRUSH rule 0 x 918 [7,14] + CRUSH rule 0 x 919 [10,7] + CRUSH rule 0 x 920 [4,2] + CRUSH rule 0 x 921 [1,11] + CRUSH rule 0 x 922 [6,4] + CRUSH rule 0 x 923 [12,2] + CRUSH rule 0 x 924 [6,2] + CRUSH rule 0 x 925 [12,15] + CRUSH rule 0 x 926 [3,13] + CRUSH rule 0 x 927 [6,5] + CRUSH rule 0 x 928 [13,1] + CRUSH rule 0 x 929 [10,7] + CRUSH rule 0 x 930 [7,15] + CRUSH rule 0 x 931 [6,15] + CRUSH rule 0 x 932 [13,2] + CRUSH rule 0 x 933 [12,7] + CRUSH rule 0 x 934 [12,2] + CRUSH rule 0 x 935 [6,11] + CRUSH rule 0 x 936 [9,12] + CRUSH rule 0 x 937 [14,2] + CRUSH rule 0 x 938 [14,3] + CRUSH rule 0 x 939 [6,4] + CRUSH rule 0 x 940 [13,11] + CRUSH rule 0 x 941 [3,12] + CRUSH rule 0 x 942 [15,12] + CRUSH rule 0 x 943 [10,2] + CRUSH rule 0 x 944 [2,9] + CRUSH rule 0 x 945 [10,15] + CRUSH rule 0 x 946 [11,15] + CRUSH rule 0 x 947 [11,3] + CRUSH rule 0 x 948 [7,13] + CRUSH rule 0 x 949 [9,1] + CRUSH rule 0 x 950 [9,15] + CRUSH rule 0 x 951 [2,6] + CRUSH rule 0 x 952 [9,7] + CRUSH rule 0 x 953 [1,3] + CRUSH rule 0 x 954 [10,2] + CRUSH rule 0 x 955 [7,14] + CRUSH rule 0 x 956 [1,6] + CRUSH rule 0 x 957 [14,11] + CRUSH rule 0 x 958 [15,4] + CRUSH rule 0 x 959 [2,1] + CRUSH rule 0 x 960 [2,6] + CRUSH rule 0 x 961 [3,13] + CRUSH rule 0 x 962 [5,11] + CRUSH rule 0 x 963 [13,10] + CRUSH rule 0 x 964 [7,11] + CRUSH rule 0 x 965 [12,2] + CRUSH rule 0 x 966 [12,14] + CRUSH rule 0 x 967 [7,5] + CRUSH rule 0 x 968 [12,15] + CRUSH rule 0 x 969 [11,4] + CRUSH rule 0 x 970 [5,12] + CRUSH rule 0 x 971 [1,9] + CRUSH rule 0 x 972 [12,3] + CRUSH rule 0 x 973 [1,10] + CRUSH rule 0 x 974 [7,11] + CRUSH rule 0 x 975 [7,9] + CRUSH rule 0 x 976 [7,3] + CRUSH rule 0 x 977 [14,3] + CRUSH rule 0 x 978 [12,5] + CRUSH rule 0 x 979 [5,1] + CRUSH rule 0 x 980 [15,11] + CRUSH rule 0 x 981 [5,11] + CRUSH rule 0 x 982 [2,6] + CRUSH rule 0 x 983 [3,12] + CRUSH rule 0 x 984 [15,13] + CRUSH rule 0 x 985 [11,2] + CRUSH rule 0 x 986 [6,13] + CRUSH rule 0 x 987 [13,14] + CRUSH rule 0 x 988 [12,9] + CRUSH rule 0 x 989 [7,4] + CRUSH rule 0 x 990 [1,10] + CRUSH rule 0 x 991 [7,11] + CRUSH rule 0 x 992 [9,10] + CRUSH rule 0 x 993 [6,10] + CRUSH rule 0 x 994 [3,13] + CRUSH rule 0 x 995 [15,6] + CRUSH rule 0 x 996 [15,10] + CRUSH rule 0 x 997 [15,2] + CRUSH rule 0 x 998 [6,1] + CRUSH rule 0 x 999 [9,10] + CRUSH rule 0 x 1000 [14,2] + CRUSH rule 0 x 1001 [11,14] + CRUSH rule 0 x 1002 [1,10] + CRUSH rule 0 x 1003 [10,7] + CRUSH rule 0 x 1004 [15,1] + CRUSH rule 0 x 1005 [6,12] + CRUSH rule 0 x 1006 [10,12] + CRUSH rule 0 x 1007 [1,7] + CRUSH rule 0 x 1008 [7,4] + CRUSH rule 0 x 1009 [5,2] + CRUSH rule 0 x 1010 [10,2] + CRUSH rule 0 x 1011 [6,3] + CRUSH rule 0 x 1012 [12,6] + CRUSH rule 0 x 1013 [2,14] + CRUSH rule 0 x 1014 [1,13] + CRUSH rule 0 x 1015 [12,6] + CRUSH rule 0 x 1016 [10,13] + CRUSH rule 0 x 1017 [5,11] + CRUSH rule 0 x 1018 [13,11] + CRUSH rule 0 x 1019 [10,13] + CRUSH rule 0 x 1020 [3,1] + CRUSH rule 0 x 1021 [2,11] + CRUSH rule 0 x 1022 [15,5] + CRUSH rule 0 x 1023 [15,2] + rule 0 (replicated_ruleset) num_rep 2 result size == 2:\t1024/1024 (esc) + CRUSH rule 0 x 0 [7,10,3] + CRUSH rule 0 x 1 [10,15,1] + CRUSH rule 0 x 2 [1,12,2] + CRUSH rule 0 x 3 [15,4,10] + CRUSH rule 0 x 4 [14,2,10] + CRUSH rule 0 x 5 [7,4,11] + CRUSH rule 0 x 6 [12,6,10] + CRUSH rule 0 x 7 [9,2,6] + CRUSH rule 0 x 8 [10,2,15] + CRUSH rule 0 x 9 [7,1,14] + CRUSH rule 0 x 10 [10,14,4] + CRUSH rule 0 x 11 [13,9,14] + CRUSH rule 0 x 12 [7,1,2] + CRUSH rule 0 x 13 [3,5,12] + CRUSH rule 0 x 14 [13,5,2] + CRUSH rule 0 x 15 [15,1,9] + CRUSH rule 0 x 16 [7,11,14] + CRUSH rule 0 x 17 [10,1,13] + CRUSH rule 0 x 18 [1,7,3] + CRUSH rule 0 x 19 [7,12,2] + CRUSH rule 0 x 20 [14,12,3] + CRUSH rule 0 x 21 [3,12,1] + CRUSH rule 0 x 22 [6,3,13] + CRUSH rule 0 x 23 [10,5,13] + CRUSH rule 0 x 24 [12,11,3] + CRUSH rule 0 x 25 [7,12,15] + CRUSH rule 0 x 26 [1,7,13] + CRUSH rule 0 x 27 [3,6,15] + CRUSH rule 0 x 28 [14,4,3] + CRUSH rule 0 x 29 [5,14,12] + CRUSH rule 0 x 30 [2,5,6] + CRUSH rule 0 x 31 [5,15,10] + CRUSH rule 0 x 32 [9,10,2] + CRUSH rule 0 x 33 [13,4,9] + CRUSH rule 0 x 34 [13,15,2] + CRUSH rule 0 x 35 [4,14,3] + CRUSH rule 0 x 36 [3,12,9] + CRUSH rule 0 x 37 [9,2,6] + CRUSH rule 0 x 38 [3,4,13] + CRUSH rule 0 x 39 [12,7,14] + CRUSH rule 0 x 40 [10,1,9] + CRUSH rule 0 x 41 [4,9,11] + CRUSH rule 0 x 42 [3,6,14] + CRUSH rule 0 x 43 [10,5,15] + CRUSH rule 0 x 44 [11,4,13] + CRUSH rule 0 x 45 [11,12,15] + CRUSH rule 0 x 46 [6,9,2] + CRUSH rule 0 x 47 [3,9,6] + CRUSH rule 0 x 48 [4,6,2] + CRUSH rule 0 x 49 [9,15,10] + CRUSH rule 0 x 50 [14,12,1] + CRUSH rule 0 x 51 [10,6,5] + CRUSH rule 0 x 52 [12,1,9] + CRUSH rule 0 x 53 [3,6,13] + CRUSH rule 0 x 54 [4,13,9] + CRUSH rule 0 x 55 [4,11,2] + CRUSH rule 0 x 56 [5,9,10] + CRUSH rule 0 x 57 [6,2,1] + CRUSH rule 0 x 58 [7,1,11] + CRUSH rule 0 x 59 [2,13,1] + CRUSH rule 0 x 60 [3,6,11] + CRUSH rule 0 x 61 [3,15,13] + CRUSH rule 0 x 62 [15,11,7] + CRUSH rule 0 x 63 [10,14,12] + CRUSH rule 0 x 64 [3,9,1] + CRUSH rule 0 x 65 [4,12,11] + CRUSH rule 0 x 66 [15,11,6] + CRUSH rule 0 x 67 [2,6,4] + CRUSH rule 0 x 68 [15,7,4] + CRUSH rule 0 x 69 [2,1,15] + CRUSH rule 0 x 70 [9,6,1] + CRUSH rule 0 x 71 [15,5,1] + CRUSH rule 0 x 72 [9,10,3] + CRUSH rule 0 x 73 [5,3,11] + CRUSH rule 0 x 74 [11,7,9] + CRUSH rule 0 x 75 [9,7,11] + CRUSH rule 0 x 76 [6,1,3] + CRUSH rule 0 x 77 [7,4,2] + CRUSH rule 0 x 78 [9,3,1] + CRUSH rule 0 x 79 [13,2,15] + CRUSH rule 0 x 80 [15,2,6] + CRUSH rule 0 x 81 [15,2,1] + CRUSH rule 0 x 82 [14,13,5] + CRUSH rule 0 x 83 [4,15,3] + CRUSH rule 0 x 84 [10,7,9] + CRUSH rule 0 x 85 [3,15,9] + CRUSH rule 0 x 86 [10,9,14] + CRUSH rule 0 x 87 [15,10,7] + CRUSH rule 0 x 88 [4,13,3] + CRUSH rule 0 x 89 [3,9,7] + CRUSH rule 0 x 90 [4,9,7] + CRUSH rule 0 x 91 [6,11,9] + CRUSH rule 0 x 92 [1,5,10] + CRUSH rule 0 x 93 [9,3,15] + CRUSH rule 0 x 94 [9,2,12] + CRUSH rule 0 x 95 [7,15,4] + CRUSH rule 0 x 96 [2,15,11] + CRUSH rule 0 x 97 [4,11,2] + CRUSH rule 0 x 98 [11,13,9] + CRUSH rule 0 x 99 [12,4,11] + CRUSH rule 0 x 100 [9,4,10] + CRUSH rule 0 x 101 [15,7,1] + CRUSH rule 0 x 102 [3,11,14] + CRUSH rule 0 x 103 [13,11,6] + CRUSH rule 0 x 104 [14,6,3] + CRUSH rule 0 x 105 [14,10,1] + CRUSH rule 0 x 106 [6,5,13] + CRUSH rule 0 x 107 [3,1,10] + CRUSH rule 0 x 108 [5,10,7] + CRUSH rule 0 x 109 [9,1,13] + CRUSH rule 0 x 110 [5,1,11] + CRUSH rule 0 x 111 [10,1,9] + CRUSH rule 0 x 112 [1,10,4] + CRUSH rule 0 x 113 [6,10,13] + CRUSH rule 0 x 114 [5,13,6] + CRUSH rule 0 x 115 [10,13,14] + CRUSH rule 0 x 116 [1,14,13] + CRUSH rule 0 x 117 [5,6,1] + CRUSH rule 0 x 118 [10,4,13] + CRUSH rule 0 x 119 [14,12,11] + CRUSH rule 0 x 120 [11,3,14] + CRUSH rule 0 x 121 [9,5,1] + CRUSH rule 0 x 122 [4,3,14] + CRUSH rule 0 x 123 [3,10,5] + CRUSH rule 0 x 124 [12,2,1] + CRUSH rule 0 x 125 [9,12,15] + CRUSH rule 0 x 126 [7,15,10] + CRUSH rule 0 x 127 [4,14,9] + CRUSH rule 0 x 128 [3,12,1] + CRUSH rule 0 x 129 [11,13,14] + CRUSH rule 0 x 130 [3,13,5] + CRUSH rule 0 x 131 [12,1,6] + CRUSH rule 0 x 132 [11,15,13] + CRUSH rule 0 x 133 [3,6,9] + CRUSH rule 0 x 134 [12,5,6] + CRUSH rule 0 x 135 [3,14,12] + CRUSH rule 0 x 136 [15,6,9] + CRUSH rule 0 x 137 [14,3,6] + CRUSH rule 0 x 138 [13,15,4] + CRUSH rule 0 x 139 [11,2,13] + CRUSH rule 0 x 140 [11,4,12] + CRUSH rule 0 x 141 [6,12,15] + CRUSH rule 0 x 142 [3,14,7] + CRUSH rule 0 x 143 [9,6,4] + CRUSH rule 0 x 144 [13,7,11] + CRUSH rule 0 x 145 [12,2,6] + CRUSH rule 0 x 146 [1,5,9] + CRUSH rule 0 x 147 [1,4,9] + CRUSH rule 0 x 148 [12,7,9] + CRUSH rule 0 x 149 [2,5,9] + CRUSH rule 0 x 150 [1,15,2] + CRUSH rule 0 x 151 [2,9,14] + CRUSH rule 0 x 152 [5,9,2] + CRUSH rule 0 x 153 [6,9,4] + CRUSH rule 0 x 154 [3,11,7] + CRUSH rule 0 x 155 [14,12,7] + CRUSH rule 0 x 156 [7,13,3] + CRUSH rule 0 x 157 [15,1,6] + CRUSH rule 0 x 158 [15,1,10] + CRUSH rule 0 x 159 [4,14,3] + CRUSH rule 0 x 160 [5,7,3] + CRUSH rule 0 x 161 [1,2,11] + CRUSH rule 0 x 162 [10,6,1] + CRUSH rule 0 x 163 [15,1,10] + CRUSH rule 0 x 164 [9,14,10] + CRUSH rule 0 x 165 [11,7,2] + CRUSH rule 0 x 166 [1,2,12] + CRUSH rule 0 x 167 [9,7,3] + CRUSH rule 0 x 168 [13,2,4] + CRUSH rule 0 x 169 [1,4,9] + CRUSH rule 0 x 170 [1,15,7] + CRUSH rule 0 x 171 [9,2,10] + CRUSH rule 0 x 172 [14,4,10] + CRUSH rule 0 x 173 [5,10,12] + CRUSH rule 0 x 174 [15,6,4] + CRUSH rule 0 x 175 [5,7,9] + CRUSH rule 0 x 176 [9,6,3] + CRUSH rule 0 x 177 [2,9,10] + CRUSH rule 0 x 178 [12,11,7] + CRUSH rule 0 x 179 [2,10,13] + CRUSH rule 0 x 180 [3,11,5] + CRUSH rule 0 x 181 [9,12,6] + CRUSH rule 0 x 182 [5,13,11] + CRUSH rule 0 x 183 [5,7,10] + CRUSH rule 0 x 184 [2,5,11] + CRUSH rule 0 x 185 [13,5,7] + CRUSH rule 0 x 186 [6,14,13] + CRUSH rule 0 x 187 [1,4,11] + CRUSH rule 0 x 188 [9,13,5] + CRUSH rule 0 x 189 [6,12,4] + CRUSH rule 0 x 190 [9,13,15] + CRUSH rule 0 x 191 [7,11,4] + CRUSH rule 0 x 192 [2,11,5] + CRUSH rule 0 x 193 [3,13,6] + CRUSH rule 0 x 194 [3,13,4] + CRUSH rule 0 x 195 [5,7,10] + CRUSH rule 0 x 196 [4,15,1] + CRUSH rule 0 x 197 [14,10,13] + CRUSH rule 0 x 198 [2,5,6] + CRUSH rule 0 x 199 [2,10,4] + CRUSH rule 0 x 200 [7,14,11] + CRUSH rule 0 x 201 [9,14,1] + CRUSH rule 0 x 202 [14,11,7] + CRUSH rule 0 x 203 [12,5,7] + CRUSH rule 0 x 204 [6,11,3] + CRUSH rule 0 x 205 [15,4,6] + CRUSH rule 0 x 206 [13,11,2] + CRUSH rule 0 x 207 [2,11,7] + CRUSH rule 0 x 208 [13,1,6] + CRUSH rule 0 x 209 [6,15,13] + CRUSH rule 0 x 210 [13,11,2] + CRUSH rule 0 x 211 [2,14,1] + CRUSH rule 0 x 212 [10,1,12] + CRUSH rule 0 x 213 [3,9,6] + CRUSH rule 0 x 214 [7,15,4] + CRUSH rule 0 x 215 [6,1,4] + CRUSH rule 0 x 216 [12,9,6] + CRUSH rule 0 x 217 [12,11,1] + CRUSH rule 0 x 218 [12,10,15] + CRUSH rule 0 x 219 [3,11,14] + CRUSH rule 0 x 220 [14,4,3] + CRUSH rule 0 x 221 [15,5,2] + CRUSH rule 0 x 222 [10,4,3] + CRUSH rule 0 x 223 [9,7,11] + CRUSH rule 0 x 224 [1,7,10] + CRUSH rule 0 x 225 [10,5,2] + CRUSH rule 0 x 226 [4,1,9] + CRUSH rule 0 x 227 [7,2,12] + CRUSH rule 0 x 228 [2,15,11] + CRUSH rule 0 x 229 [9,3,7] + CRUSH rule 0 x 230 [10,5,7] + CRUSH rule 0 x 231 [2,7,5] + CRUSH rule 0 x 232 [10,5,13] + CRUSH rule 0 x 233 [6,12,11] + CRUSH rule 0 x 234 [10,1,2] + CRUSH rule 0 x 235 [13,14,7] + CRUSH rule 0 x 236 [2,15,9] + CRUSH rule 0 x 237 [3,12,9] + CRUSH rule 0 x 238 [2,10,4] + CRUSH rule 0 x 239 [4,15,10] + CRUSH rule 0 x 240 [15,5,13] + CRUSH rule 0 x 241 [7,9,15] + CRUSH rule 0 x 242 [14,2,6] + CRUSH rule 0 x 243 [2,11,5] + CRUSH rule 0 x 244 [13,9,15] + CRUSH rule 0 x 245 [12,9,15] + CRUSH rule 0 x 246 [15,3,5] + CRUSH rule 0 x 247 [6,4,9] + CRUSH rule 0 x 248 [5,13,7] + CRUSH rule 0 x 249 [10,14,7] + CRUSH rule 0 x 250 [12,15,1] + CRUSH rule 0 x 251 [13,2,15] + CRUSH rule 0 x 252 [7,5,13] + CRUSH rule 0 x 253 [3,13,15] + CRUSH rule 0 x 254 [2,9,13] + CRUSH rule 0 x 255 [1,9,13] + CRUSH rule 0 x 256 [6,9,13] + CRUSH rule 0 x 257 [15,12,3] + CRUSH rule 0 x 258 [12,5,6] + CRUSH rule 0 x 259 [9,10,4] + CRUSH rule 0 x 260 [10,12,6] + CRUSH rule 0 x 261 [13,7,2] + CRUSH rule 0 x 262 [15,3,12] + CRUSH rule 0 x 263 [12,6,10] + CRUSH rule 0 x 264 [13,14,11] + CRUSH rule 0 x 265 [12,10,14] + CRUSH rule 0 x 266 [14,7,11] + CRUSH rule 0 x 267 [12,11,6] + CRUSH rule 0 x 268 [4,1,15] + CRUSH rule 0 x 269 [11,1,15] + CRUSH rule 0 x 270 [7,11,12] + CRUSH rule 0 x 271 [4,7,3] + CRUSH rule 0 x 272 [15,5,13] + CRUSH rule 0 x 273 [2,10,7] + CRUSH rule 0 x 274 [10,2,5] + CRUSH rule 0 x 275 [10,3,4] + CRUSH rule 0 x 276 [5,12,9] + CRUSH rule 0 x 277 [14,3,13] + CRUSH rule 0 x 278 [5,6,14] + CRUSH rule 0 x 279 [6,10,13] + CRUSH rule 0 x 280 [7,3,14] + CRUSH rule 0 x 281 [5,11,14] + CRUSH rule 0 x 282 [2,1,13] + CRUSH rule 0 x 283 [4,1,12] + CRUSH rule 0 x 284 [5,11,7] + CRUSH rule 0 x 285 [15,5,3] + CRUSH rule 0 x 286 [10,4,3] + CRUSH rule 0 x 287 [12,4,9] + CRUSH rule 0 x 288 [4,12,10] + CRUSH rule 0 x 289 [2,5,14] + CRUSH rule 0 x 290 [12,2,5] + CRUSH rule 0 x 291 [7,11,1] + CRUSH rule 0 x 292 [4,10,6] + CRUSH rule 0 x 293 [6,5,11] + CRUSH rule 0 x 294 [9,12,3] + CRUSH rule 0 x 295 [6,10,3] + CRUSH rule 0 x 296 [3,1,13] + CRUSH rule 0 x 297 [6,13,4] + CRUSH rule 0 x 298 [14,9,13] + CRUSH rule 0 x 299 [14,12,11] + CRUSH rule 0 x 300 [15,7,10] + CRUSH rule 0 x 301 [9,11,7] + CRUSH rule 0 x 302 [9,7,1] + CRUSH rule 0 x 303 [4,13,3] + CRUSH rule 0 x 304 [6,9,2] + CRUSH rule 0 x 305 [13,7,5] + CRUSH rule 0 x 306 [10,12,4] + CRUSH rule 0 x 307 [11,12,15] + CRUSH rule 0 x 308 [12,14,10] + CRUSH rule 0 x 309 [9,3,12] + CRUSH rule 0 x 310 [3,1,5] + CRUSH rule 0 x 311 [3,9,7] + CRUSH rule 0 x 312 [15,13,9] + CRUSH rule 0 x 313 [9,15,3] + CRUSH rule 0 x 314 [2,15,9] + CRUSH rule 0 x 315 [15,2,13] + CRUSH rule 0 x 316 [4,9,11] + CRUSH rule 0 x 317 [1,5,3] + CRUSH rule 0 x 318 [4,1,15] + CRUSH rule 0 x 319 [2,15,4] + CRUSH rule 0 x 320 [5,7,13] + CRUSH rule 0 x 321 [1,6,11] + CRUSH rule 0 x 322 [13,7,5] + CRUSH rule 0 x 323 [7,4,10] + CRUSH rule 0 x 324 [5,6,10] + CRUSH rule 0 x 325 [9,10,14] + CRUSH rule 0 x 326 [11,7,13] + CRUSH rule 0 x 327 [12,5,10] + CRUSH rule 0 x 328 [5,2,6] + CRUSH rule 0 x 329 [2,6,15] + CRUSH rule 0 x 330 [3,9,11] + CRUSH rule 0 x 331 [12,14,6] + CRUSH rule 0 x 332 [10,12,6] + CRUSH rule 0 x 333 [6,5,3] + CRUSH rule 0 x 334 [4,9,2] + CRUSH rule 0 x 335 [11,7,1] + CRUSH rule 0 x 336 [6,14,13] + CRUSH rule 0 x 337 [15,11,3] + CRUSH rule 0 x 338 [10,5,3] + CRUSH rule 0 x 339 [11,14,13] + CRUSH rule 0 x 340 [11,6,12] + CRUSH rule 0 x 341 [7,5,2] + CRUSH rule 0 x 342 [12,14,1] + CRUSH rule 0 x 343 [12,14,9] + CRUSH rule 0 x 344 [9,11,5] + CRUSH rule 0 x 345 [14,2,11] + CRUSH rule 0 x 346 [5,3,14] + CRUSH rule 0 x 347 [10,2,12] + CRUSH rule 0 x 348 [7,9,10] + CRUSH rule 0 x 349 [9,6,10] + CRUSH rule 0 x 350 [13,9,15] + CRUSH rule 0 x 351 [13,5,15] + CRUSH rule 0 x 352 [1,12,11] + CRUSH rule 0 x 353 [10,14,12] + CRUSH rule 0 x 354 [6,3,15] + CRUSH rule 0 x 355 [13,14,6] + CRUSH rule 0 x 356 [15,13,2] + CRUSH rule 0 x 357 [4,11,1] + CRUSH rule 0 x 358 [12,7,2] + CRUSH rule 0 x 359 [5,15,7] + CRUSH rule 0 x 360 [13,10,1] + CRUSH rule 0 x 361 [5,3,13] + CRUSH rule 0 x 362 [2,9,11] + CRUSH rule 0 x 363 [7,12,3] + CRUSH rule 0 x 364 [2,12,6] + CRUSH rule 0 x 365 [13,5,11] + CRUSH rule 0 x 366 [12,7,3] + CRUSH rule 0 x 367 [7,13,3] + CRUSH rule 0 x 368 [7,9,10] + CRUSH rule 0 x 369 [7,5,3] + CRUSH rule 0 x 370 [4,7,14] + CRUSH rule 0 x 371 [1,7,12] + CRUSH rule 0 x 372 [10,4,3] + CRUSH rule 0 x 373 [15,5,2] + CRUSH rule 0 x 374 [3,15,12] + CRUSH rule 0 x 375 [5,2,14] + CRUSH rule 0 x 376 [5,14,10] + CRUSH rule 0 x 377 [1,15,2] + CRUSH rule 0 x 378 [9,12,2] + CRUSH rule 0 x 379 [11,2,15] + CRUSH rule 0 x 380 [6,1,12] + CRUSH rule 0 x 381 [15,13,7] + CRUSH rule 0 x 382 [14,3,1] + CRUSH rule 0 x 383 [3,6,11] + CRUSH rule 0 x 384 [4,13,6] + CRUSH rule 0 x 385 [4,6,15] + CRUSH rule 0 x 386 [14,3,11] + CRUSH rule 0 x 387 [1,11,5] + CRUSH rule 0 x 388 [2,6,11] + CRUSH rule 0 x 389 [12,7,2] + CRUSH rule 0 x 390 [2,11,13] + CRUSH rule 0 x 391 [3,4,9] + CRUSH rule 0 x 392 [11,5,14] + CRUSH rule 0 x 393 [2,14,5] + CRUSH rule 0 x 394 [4,9,3] + CRUSH rule 0 x 395 [10,13,5] + CRUSH rule 0 x 396 [2,12,15] + CRUSH rule 0 x 397 [1,14,9] + CRUSH rule 0 x 398 [9,2,1] + CRUSH rule 0 x 399 [5,9,14] + CRUSH rule 0 x 400 [10,6,2] + CRUSH rule 0 x 401 [6,9,11] + CRUSH rule 0 x 402 [4,7,9] + CRUSH rule 0 x 403 [7,15,13] + CRUSH rule 0 x 404 [14,12,7] + CRUSH rule 0 x 405 [9,15,11] + CRUSH rule 0 x 406 [12,14,9] + CRUSH rule 0 x 407 [9,5,12] + CRUSH rule 0 x 408 [7,1,5] + CRUSH rule 0 x 409 [11,2,4] + CRUSH rule 0 x 410 [6,4,14] + CRUSH rule 0 x 411 [13,11,15] + CRUSH rule 0 x 412 [5,9,6] + CRUSH rule 0 x 413 [13,5,3] + CRUSH rule 0 x 414 [3,11,9] + CRUSH rule 0 x 415 [6,10,14] + CRUSH rule 0 x 416 [13,1,4] + CRUSH rule 0 x 417 [4,12,1] + CRUSH rule 0 x 418 [14,5,10] + CRUSH rule 0 x 419 [5,14,10] + CRUSH rule 0 x 420 [2,4,9] + CRUSH rule 0 x 421 [15,4,10] + CRUSH rule 0 x 422 [4,11,2] + CRUSH rule 0 x 423 [3,15,12] + CRUSH rule 0 x 424 [6,10,12] + CRUSH rule 0 x 425 [11,15,2] + CRUSH rule 0 x 426 [12,4,7] + CRUSH rule 0 x 427 [14,10,3] + CRUSH rule 0 x 428 [12,7,9] + CRUSH rule 0 x 429 [3,4,9] + CRUSH rule 0 x 430 [3,5,10] + CRUSH rule 0 x 431 [9,3,7] + CRUSH rule 0 x 432 [4,1,12] + CRUSH rule 0 x 433 [4,11,12] + CRUSH rule 0 x 434 [2,14,9] + CRUSH rule 0 x 435 [13,11,5] + CRUSH rule 0 x 436 [9,15,10] + CRUSH rule 0 x 437 [9,6,3] + CRUSH rule 0 x 438 [7,2,13] + CRUSH rule 0 x 439 [7,14,4] + CRUSH rule 0 x 440 [14,11,9] + CRUSH rule 0 x 441 [2,4,11] + CRUSH rule 0 x 442 [10,13,9] + CRUSH rule 0 x 443 [12,15,10] + CRUSH rule 0 x 444 [4,13,7] + CRUSH rule 0 x 445 [4,2,15] + CRUSH rule 0 x 446 [12,10,6] + CRUSH rule 0 x 447 [15,7,13] + CRUSH rule 0 x 448 [5,2,13] + CRUSH rule 0 x 449 [14,5,3] + CRUSH rule 0 x 450 [2,4,6] + CRUSH rule 0 x 451 [6,14,11] + CRUSH rule 0 x 452 [14,9,10] + CRUSH rule 0 x 453 [5,15,13] + CRUSH rule 0 x 454 [10,4,2] + CRUSH rule 0 x 455 [6,13,2] + CRUSH rule 0 x 456 [5,7,13] + CRUSH rule 0 x 457 [9,1,5] + CRUSH rule 0 x 458 [9,11,15] + CRUSH rule 0 x 459 [13,15,11] + CRUSH rule 0 x 460 [5,12,10] + CRUSH rule 0 x 461 [4,3,9] + CRUSH rule 0 x 462 [4,7,12] + CRUSH rule 0 x 463 [4,12,14] + CRUSH rule 0 x 464 [4,2,15] + CRUSH rule 0 x 465 [5,10,9] + CRUSH rule 0 x 466 [13,5,2] + CRUSH rule 0 x 467 [13,6,14] + CRUSH rule 0 x 468 [10,7,12] + CRUSH rule 0 x 469 [4,9,6] + CRUSH rule 0 x 470 [3,9,12] + CRUSH rule 0 x 471 [6,1,5] + CRUSH rule 0 x 472 [2,14,7] + CRUSH rule 0 x 473 [15,10,6] + CRUSH rule 0 x 474 [15,10,4] + CRUSH rule 0 x 475 [10,5,12] + CRUSH rule 0 x 476 [3,6,10] + CRUSH rule 0 x 477 [6,13,5] + CRUSH rule 0 x 478 [4,15,1] + CRUSH rule 0 x 479 [13,11,1] + CRUSH rule 0 x 480 [1,13,6] + CRUSH rule 0 x 481 [15,12,7] + CRUSH rule 0 x 482 [2,12,9] + CRUSH rule 0 x 483 [10,1,4] + CRUSH rule 0 x 484 [1,4,10] + CRUSH rule 0 x 485 [9,4,3] + CRUSH rule 0 x 486 [3,10,15] + CRUSH rule 0 x 487 [12,11,4] + CRUSH rule 0 x 488 [14,4,1] + CRUSH rule 0 x 489 [11,4,2] + CRUSH rule 0 x 490 [4,9,1] + CRUSH rule 0 x 491 [1,12,5] + CRUSH rule 0 x 492 [5,7,11] + CRUSH rule 0 x 493 [12,1,4] + CRUSH rule 0 x 494 [1,7,13] + CRUSH rule 0 x 495 [3,15,7] + CRUSH rule 0 x 496 [5,3,7] + CRUSH rule 0 x 497 [13,10,3] + CRUSH rule 0 x 498 [10,6,1] + CRUSH rule 0 x 499 [14,3,12] + CRUSH rule 0 x 500 [15,9,6] + CRUSH rule 0 x 501 [10,13,1] + CRUSH rule 0 x 502 [5,1,14] + CRUSH rule 0 x 503 [15,10,7] + CRUSH rule 0 x 504 [13,2,7] + CRUSH rule 0 x 505 [12,7,5] + CRUSH rule 0 x 506 [11,7,9] + CRUSH rule 0 x 507 [4,14,13] + CRUSH rule 0 x 508 [12,1,4] + CRUSH rule 0 x 509 [4,2,6] + CRUSH rule 0 x 510 [5,3,1] + CRUSH rule 0 x 511 [2,12,10] + CRUSH rule 0 x 512 [15,11,3] + CRUSH rule 0 x 513 [4,9,11] + CRUSH rule 0 x 514 [11,9,3] + CRUSH rule 0 x 515 [12,14,6] + CRUSH rule 0 x 516 [14,11,1] + CRUSH rule 0 x 517 [11,5,6] + CRUSH rule 0 x 518 [3,5,7] + CRUSH rule 0 x 519 [12,14,2] + CRUSH rule 0 x 520 [12,4,2] + CRUSH rule 0 x 521 [11,5,9] + CRUSH rule 0 x 522 [4,12,11] + CRUSH rule 0 x 523 [3,1,5] + CRUSH rule 0 x 524 [15,9,3] + CRUSH rule 0 x 525 [3,15,11] + CRUSH rule 0 x 526 [10,2,5] + CRUSH rule 0 x 527 [3,13,4] + CRUSH rule 0 x 528 [12,7,15] + CRUSH rule 0 x 529 [6,4,10] + CRUSH rule 0 x 530 [11,9,12] + CRUSH rule 0 x 531 [9,15,4] + CRUSH rule 0 x 532 [5,3,13] + CRUSH rule 0 x 533 [12,15,1] + CRUSH rule 0 x 534 [11,9,3] + CRUSH rule 0 x 535 [11,1,3] + CRUSH rule 0 x 536 [9,1,14] + CRUSH rule 0 x 537 [15,5,13] + CRUSH rule 0 x 538 [13,5,11] + CRUSH rule 0 x 539 [10,12,6] + CRUSH rule 0 x 540 [12,15,7] + CRUSH rule 0 x 541 [2,1,6] + CRUSH rule 0 x 542 [3,9,15] + CRUSH rule 0 x 543 [4,10,9] + CRUSH rule 0 x 544 [3,15,9] + CRUSH rule 0 x 545 [14,10,7] + CRUSH rule 0 x 546 [5,15,13] + CRUSH rule 0 x 547 [5,13,7] + CRUSH rule 0 x 548 [11,7,12] + CRUSH rule 0 x 549 [14,1,4] + CRUSH rule 0 x 550 [9,15,3] + CRUSH rule 0 x 551 [11,2,15] + CRUSH rule 0 x 552 [2,11,14] + CRUSH rule 0 x 553 [11,9,14] + CRUSH rule 0 x 554 [11,14,6] + CRUSH rule 0 x 555 [6,5,10] + CRUSH rule 0 x 556 [15,6,3] + CRUSH rule 0 x 557 [12,2,5] + CRUSH rule 0 x 558 [12,1,6] + CRUSH rule 0 x 559 [2,13,5] + CRUSH rule 0 x 560 [4,9,12] + CRUSH rule 0 x 561 [12,7,1] + CRUSH rule 0 x 562 [7,13,9] + CRUSH rule 0 x 563 [15,4,3] + CRUSH rule 0 x 564 [2,13,7] + CRUSH rule 0 x 565 [3,12,4] + CRUSH rule 0 x 566 [6,14,4] + CRUSH rule 0 x 567 [15,4,11] + CRUSH rule 0 x 568 [4,14,1] + CRUSH rule 0 x 569 [11,3,15] + CRUSH rule 0 x 570 [1,10,13] + CRUSH rule 0 x 571 [10,12,14] + CRUSH rule 0 x 572 [12,14,3] + CRUSH rule 0 x 573 [7,15,11] + CRUSH rule 0 x 574 [11,14,13] + CRUSH rule 0 x 575 [5,13,15] + CRUSH rule 0 x 576 [3,15,11] + CRUSH rule 0 x 577 [13,9,6] + CRUSH rule 0 x 578 [4,10,1] + CRUSH rule 0 x 579 [13,1,15] + CRUSH rule 0 x 580 [3,12,4] + CRUSH rule 0 x 581 [7,14,12] + CRUSH rule 0 x 582 [10,5,13] + CRUSH rule 0 x 583 [4,15,1] + CRUSH rule 0 x 584 [10,1,5] + CRUSH rule 0 x 585 [5,3,6] + CRUSH rule 0 x 586 [7,10,14] + CRUSH rule 0 x 587 [11,6,9] + CRUSH rule 0 x 588 [3,12,7] + CRUSH rule 0 x 589 [9,7,12] + CRUSH rule 0 x 590 [12,1,3] + CRUSH rule 0 x 591 [2,6,14] + CRUSH rule 0 x 592 [15,12,9] + CRUSH rule 0 x 593 [13,14,5] + CRUSH rule 0 x 594 [12,14,2] + CRUSH rule 0 x 595 [12,7,10] + CRUSH rule 0 x 596 [2,7,12] + CRUSH rule 0 x 597 [15,1,2] + CRUSH rule 0 x 598 [11,5,9] + CRUSH rule 0 x 599 [13,11,1] + CRUSH rule 0 x 600 [4,12,3] + CRUSH rule 0 x 601 [13,5,15] + CRUSH rule 0 x 602 [3,11,7] + CRUSH rule 0 x 603 [3,1,4] + CRUSH rule 0 x 604 [14,2,6] + CRUSH rule 0 x 605 [2,7,12] + CRUSH rule 0 x 606 [12,15,1] + CRUSH rule 0 x 607 [3,9,10] + CRUSH rule 0 x 608 [13,10,1] + CRUSH rule 0 x 609 [14,3,7] + CRUSH rule 0 x 610 [7,10,5] + CRUSH rule 0 x 611 [13,1,5] + CRUSH rule 0 x 612 [7,1,2] + CRUSH rule 0 x 613 [10,7,14] + CRUSH rule 0 x 614 [9,4,15] + CRUSH rule 0 x 615 [9,4,11] + CRUSH rule 0 x 616 [10,14,1] + CRUSH rule 0 x 617 [15,7,2] + CRUSH rule 0 x 618 [4,2,10] + CRUSH rule 0 x 619 [15,4,3] + CRUSH rule 0 x 620 [3,7,11] + CRUSH rule 0 x 621 [3,6,4] + CRUSH rule 0 x 622 [10,2,13] + CRUSH rule 0 x 623 [4,9,14] + CRUSH rule 0 x 624 [3,9,15] + CRUSH rule 0 x 625 [11,7,3] + CRUSH rule 0 x 626 [10,12,2] + CRUSH rule 0 x 627 [1,12,10] + CRUSH rule 0 x 628 [15,13,11] + CRUSH rule 0 x 629 [5,6,15] + CRUSH rule 0 x 630 [1,4,12] + CRUSH rule 0 x 631 [5,7,1] + CRUSH rule 0 x 632 [12,3,11] + CRUSH rule 0 x 633 [14,4,3] + CRUSH rule 0 x 634 [6,9,5] + CRUSH rule 0 x 635 [6,5,2] + CRUSH rule 0 x 636 [13,6,11] + CRUSH rule 0 x 637 [3,1,10] + CRUSH rule 0 x 638 [10,15,3] + CRUSH rule 0 x 639 [6,9,14] + CRUSH rule 0 x 640 [9,6,1] + CRUSH rule 0 x 641 [10,6,5] + CRUSH rule 0 x 642 [1,15,4] + CRUSH rule 0 x 643 [3,7,5] + CRUSH rule 0 x 644 [15,13,6] + CRUSH rule 0 x 645 [14,2,4] + CRUSH rule 0 x 646 [5,13,14] + CRUSH rule 0 x 647 [10,1,9] + CRUSH rule 0 x 648 [6,5,2] + CRUSH rule 0 x 649 [3,9,13] + CRUSH rule 0 x 650 [10,9,4] + CRUSH rule 0 x 651 [3,9,5] + CRUSH rule 0 x 652 [15,9,4] + CRUSH rule 0 x 653 [11,14,1] + CRUSH rule 0 x 654 [13,6,2] + CRUSH rule 0 x 655 [6,3,4] + CRUSH rule 0 x 656 [3,15,1] + CRUSH rule 0 x 657 [11,15,3] + CRUSH rule 0 x 658 [7,2,10] + CRUSH rule 0 x 659 [2,5,14] + CRUSH rule 0 x 660 [13,14,10] + CRUSH rule 0 x 661 [7,15,3] + CRUSH rule 0 x 662 [15,2,12] + CRUSH rule 0 x 663 [14,9,13] + CRUSH rule 0 x 664 [6,10,12] + CRUSH rule 0 x 665 [2,9,12] + CRUSH rule 0 x 666 [12,3,6] + CRUSH rule 0 x 667 [1,9,12] + CRUSH rule 0 x 668 [9,5,1] + CRUSH rule 0 x 669 [9,7,14] + CRUSH rule 0 x 670 [6,10,9] + CRUSH rule 0 x 671 [6,15,5] + CRUSH rule 0 x 672 [2,9,13] + CRUSH rule 0 x 673 [7,10,5] + CRUSH rule 0 x 674 [7,12,10] + CRUSH rule 0 x 675 [9,5,1] + CRUSH rule 0 x 676 [10,12,2] + CRUSH rule 0 x 677 [2,12,1] + CRUSH rule 0 x 678 [1,2,4] + CRUSH rule 0 x 679 [5,6,12] + CRUSH rule 0 x 680 [7,11,3] + CRUSH rule 0 x 681 [6,4,3] + CRUSH rule 0 x 682 [6,1,11] + CRUSH rule 0 x 683 [6,13,2] + CRUSH rule 0 x 684 [9,11,3] + CRUSH rule 0 x 685 [5,1,15] + CRUSH rule 0 x 686 [1,9,11] + CRUSH rule 0 x 687 [7,13,3] + CRUSH rule 0 x 688 [11,9,1] + CRUSH rule 0 x 689 [5,2,9] + CRUSH rule 0 x 690 [9,7,10] + CRUSH rule 0 x 691 [11,15,9] + CRUSH rule 0 x 692 [15,5,1] + CRUSH rule 0 x 693 [5,6,12] + CRUSH rule 0 x 694 [4,7,1] + CRUSH rule 0 x 695 [6,13,14] + CRUSH rule 0 x 696 [1,2,4] + CRUSH rule 0 x 697 [13,11,3] + CRUSH rule 0 x 698 [11,13,4] + CRUSH rule 0 x 699 [7,14,12] + CRUSH rule 0 x 700 [12,14,11] + CRUSH rule 0 x 701 [3,13,1] + CRUSH rule 0 x 702 [3,12,15] + CRUSH rule 0 x 703 [15,11,13] + CRUSH rule 0 x 704 [6,4,2] + CRUSH rule 0 x 705 [14,6,11] + CRUSH rule 0 x 706 [1,12,3] + CRUSH rule 0 x 707 [4,7,14] + CRUSH rule 0 x 708 [3,10,5] + CRUSH rule 0 x 709 [11,12,3] + CRUSH rule 0 x 710 [14,2,11] + CRUSH rule 0 x 711 [14,3,9] + CRUSH rule 0 x 712 [12,3,11] + CRUSH rule 0 x 713 [11,9,3] + CRUSH rule 0 x 714 [12,1,9] + CRUSH rule 0 x 715 [6,1,14] + CRUSH rule 0 x 716 [11,13,9] + CRUSH rule 0 x 717 [12,4,10] + CRUSH rule 0 x 718 [7,15,5] + CRUSH rule 0 x 719 [5,15,13] + CRUSH rule 0 x 720 [4,13,10] + CRUSH rule 0 x 721 [11,3,14] + CRUSH rule 0 x 722 [2,4,6] + CRUSH rule 0 x 723 [2,1,12] + CRUSH rule 0 x 724 [7,1,9] + CRUSH rule 0 x 725 [11,12,7] + CRUSH rule 0 x 726 [7,14,4] + CRUSH rule 0 x 727 [2,5,1] + CRUSH rule 0 x 728 [13,11,4] + CRUSH rule 0 x 729 [15,11,4] + CRUSH rule 0 x 730 [3,7,1] + CRUSH rule 0 x 731 [9,1,6] + CRUSH rule 0 x 732 [1,2,10] + CRUSH rule 0 x 733 [11,3,5] + CRUSH rule 0 x 734 [14,3,11] + CRUSH rule 0 x 735 [6,9,2] + CRUSH rule 0 x 736 [3,9,1] + CRUSH rule 0 x 737 [1,4,2] + CRUSH rule 0 x 738 [11,15,7] + CRUSH rule 0 x 739 [11,12,6] + CRUSH rule 0 x 740 [7,9,10] + CRUSH rule 0 x 741 [12,11,7] + CRUSH rule 0 x 742 [9,7,4] + CRUSH rule 0 x 743 [5,13,9] + CRUSH rule 0 x 744 [6,2,13] + CRUSH rule 0 x 745 [3,6,1] + CRUSH rule 0 x 746 [3,7,9] + CRUSH rule 0 x 747 [15,11,5] + CRUSH rule 0 x 748 [6,10,13] + CRUSH rule 0 x 749 [14,9,10] + CRUSH rule 0 x 750 [1,14,6] + CRUSH rule 0 x 751 [15,1,6] + CRUSH rule 0 x 752 [13,1,7] + CRUSH rule 0 x 753 [4,11,1] + CRUSH rule 0 x 754 [14,12,11] + CRUSH rule 0 x 755 [13,6,1] + CRUSH rule 0 x 756 [3,4,14] + CRUSH rule 0 x 757 [10,6,1] + CRUSH rule 0 x 758 [6,3,4] + CRUSH rule 0 x 759 [5,7,3] + CRUSH rule 0 x 760 [1,15,10] + CRUSH rule 0 x 761 [2,12,1] + CRUSH rule 0 x 762 [1,4,10] + CRUSH rule 0 x 763 [4,13,1] + CRUSH rule 0 x 764 [1,14,6] + CRUSH rule 0 x 765 [9,15,2] + CRUSH rule 0 x 766 [11,2,7] + CRUSH rule 0 x 767 [6,11,4] + CRUSH rule 0 x 768 [2,12,15] + CRUSH rule 0 x 769 [15,1,9] + CRUSH rule 0 x 770 [15,13,4] + CRUSH rule 0 x 771 [9,2,12] + CRUSH rule 0 x 772 [4,3,13] + CRUSH rule 0 x 773 [3,7,4] + CRUSH rule 0 x 774 [12,6,3] + CRUSH rule 0 x 775 [5,10,14] + CRUSH rule 0 x 776 [10,15,3] + CRUSH rule 0 x 777 [11,13,4] + CRUSH rule 0 x 778 [13,1,9] + CRUSH rule 0 x 779 [5,11,1] + CRUSH rule 0 x 780 [13,9,3] + CRUSH rule 0 x 781 [5,7,14] + CRUSH rule 0 x 782 [2,15,9] + CRUSH rule 0 x 783 [12,7,5] + CRUSH rule 0 x 784 [14,1,10] + CRUSH rule 0 x 785 [6,12,1] + CRUSH rule 0 x 786 [10,5,2] + CRUSH rule 0 x 787 [1,12,10] + CRUSH rule 0 x 788 [4,2,9] + CRUSH rule 0 x 789 [9,2,14] + CRUSH rule 0 x 790 [15,2,7] + CRUSH rule 0 x 791 [9,4,7] + CRUSH rule 0 x 792 [6,4,15] + CRUSH rule 0 x 793 [15,9,6] + CRUSH rule 0 x 794 [5,12,2] + CRUSH rule 0 x 795 [6,14,12] + CRUSH rule 0 x 796 [11,2,12] + CRUSH rule 0 x 797 [14,3,7] + CRUSH rule 0 x 798 [5,11,6] + CRUSH rule 0 x 799 [2,9,14] + CRUSH rule 0 x 800 [6,3,4] + CRUSH rule 0 x 801 [2,5,6] + CRUSH rule 0 x 802 [1,4,12] + CRUSH rule 0 x 803 [7,2,4] + CRUSH rule 0 x 804 [5,14,9] + CRUSH rule 0 x 805 [13,4,3] + CRUSH rule 0 x 806 [6,2,13] + CRUSH rule 0 x 807 [14,2,7] + CRUSH rule 0 x 808 [2,15,12] + CRUSH rule 0 x 809 [1,11,7] + CRUSH rule 0 x 810 [2,5,9] + CRUSH rule 0 x 811 [15,6,3] + CRUSH rule 0 x 812 [7,11,2] + CRUSH rule 0 x 813 [4,10,13] + CRUSH rule 0 x 814 [13,4,9] + CRUSH rule 0 x 815 [15,12,9] + CRUSH rule 0 x 816 [14,10,13] + CRUSH rule 0 x 817 [10,7,2] + CRUSH rule 0 x 818 [15,2,11] + CRUSH rule 0 x 819 [5,12,10] + CRUSH rule 0 x 820 [3,6,9] + CRUSH rule 0 x 821 [15,10,9] + CRUSH rule 0 x 822 [10,13,2] + CRUSH rule 0 x 823 [2,6,12] + CRUSH rule 0 x 824 [3,7,9] + CRUSH rule 0 x 825 [10,5,14] + CRUSH rule 0 x 826 [5,2,11] + CRUSH rule 0 x 827 [13,5,1] + CRUSH rule 0 x 828 [12,6,10] + CRUSH rule 0 x 829 [13,6,15] + CRUSH rule 0 x 830 [15,13,2] + CRUSH rule 0 x 831 [1,4,11] + CRUSH rule 0 x 832 [14,11,13] + CRUSH rule 0 x 833 [9,13,3] + CRUSH rule 0 x 834 [9,7,5] + CRUSH rule 0 x 835 [14,3,13] + CRUSH rule 0 x 836 [3,9,10] + CRUSH rule 0 x 837 [15,12,11] + CRUSH rule 0 x 838 [12,14,9] + CRUSH rule 0 x 839 [3,4,6] + CRUSH rule 0 x 840 [10,15,12] + CRUSH rule 0 x 841 [3,5,7] + CRUSH rule 0 x 842 [9,13,2] + CRUSH rule 0 x 843 [14,7,4] + CRUSH rule 0 x 844 [7,1,4] + CRUSH rule 0 x 845 [13,6,1] + CRUSH rule 0 x 846 [3,7,15] + CRUSH rule 0 x 847 [12,15,11] + CRUSH rule 0 x 848 [11,13,1] + CRUSH rule 0 x 849 [3,15,11] + CRUSH rule 0 x 850 [1,3,10] + CRUSH rule 0 x 851 [14,4,3] + CRUSH rule 0 x 852 [9,12,4] + CRUSH rule 0 x 853 [13,14,6] + CRUSH rule 0 x 854 [7,11,12] + CRUSH rule 0 x 855 [14,4,12] + CRUSH rule 0 x 856 [5,10,7] + CRUSH rule 0 x 857 [4,3,13] + CRUSH rule 0 x 858 [5,15,6] + CRUSH rule 0 x 859 [5,15,6] + CRUSH rule 0 x 860 [11,14,1] + CRUSH rule 0 x 861 [13,7,4] + CRUSH rule 0 x 862 [5,10,9] + CRUSH rule 0 x 863 [11,6,3] + CRUSH rule 0 x 864 [6,13,4] + CRUSH rule 0 x 865 [4,1,14] + CRUSH rule 0 x 866 [2,13,4] + CRUSH rule 0 x 867 [12,2,9] + CRUSH rule 0 x 868 [14,11,7] + CRUSH rule 0 x 869 [10,13,7] + CRUSH rule 0 x 870 [14,9,11] + CRUSH rule 0 x 871 [6,2,1] + CRUSH rule 0 x 872 [6,1,15] + CRUSH rule 0 x 873 [2,5,12] + CRUSH rule 0 x 874 [12,4,7] + CRUSH rule 0 x 875 [10,6,14] + CRUSH rule 0 x 876 [14,7,13] + CRUSH rule 0 x 877 [15,11,13] + CRUSH rule 0 x 878 [7,14,3] + CRUSH rule 0 x 879 [12,2,7] + CRUSH rule 0 x 880 [2,12,10] + CRUSH rule 0 x 881 [6,3,1] + CRUSH rule 0 x 882 [11,13,7] + CRUSH rule 0 x 883 [13,1,3] + CRUSH rule 0 x 884 [6,15,4] + CRUSH rule 0 x 885 [14,7,9] + CRUSH rule 0 x 886 [13,11,4] + CRUSH rule 0 x 887 [14,4,12] + CRUSH rule 0 x 888 [10,12,7] + CRUSH rule 0 x 889 [15,13,4] + CRUSH rule 0 x 890 [10,12,14] + CRUSH rule 0 x 891 [9,5,11] + CRUSH rule 0 x 892 [12,15,2] + CRUSH rule 0 x 893 [1,3,5] + CRUSH rule 0 x 894 [7,2,11] + CRUSH rule 0 x 895 [2,1,11] + CRUSH rule 0 x 896 [9,1,14] + CRUSH rule 0 x 897 [7,5,14] + CRUSH rule 0 x 898 [10,6,12] + CRUSH rule 0 x 899 [1,11,5] + CRUSH rule 0 x 900 [2,9,10] + CRUSH rule 0 x 901 [9,12,11] + CRUSH rule 0 x 902 [4,2,6] + CRUSH rule 0 x 903 [14,10,3] + CRUSH rule 0 x 904 [15,12,4] + CRUSH rule 0 x 905 [12,6,11] + CRUSH rule 0 x 906 [14,11,12] + CRUSH rule 0 x 907 [7,12,3] + CRUSH rule 0 x 908 [2,15,9] + CRUSH rule 0 x 909 [10,14,1] + CRUSH rule 0 x 910 [12,7,4] + CRUSH rule 0 x 911 [11,15,2] + CRUSH rule 0 x 912 [6,4,14] + CRUSH rule 0 x 913 [4,6,10] + CRUSH rule 0 x 914 [4,15,2] + CRUSH rule 0 x 915 [12,14,1] + CRUSH rule 0 x 916 [3,1,11] + CRUSH rule 0 x 917 [1,15,6] + CRUSH rule 0 x 918 [7,14,11] + CRUSH rule 0 x 919 [10,7,3] + CRUSH rule 0 x 920 [4,2,10] + CRUSH rule 0 x 921 [1,11,6] + CRUSH rule 0 x 922 [6,4,14] + CRUSH rule 0 x 923 [12,2,5] + CRUSH rule 0 x 924 [6,2,14] + CRUSH rule 0 x 925 [12,15,2] + CRUSH rule 0 x 926 [3,13,10] + CRUSH rule 0 x 927 [6,5,1] + CRUSH rule 0 x 928 [13,1,3] + CRUSH rule 0 x 929 [10,7,1] + CRUSH rule 0 x 930 [7,15,10] + CRUSH rule 0 x 931 [6,15,11] + CRUSH rule 0 x 932 [13,2,5] + CRUSH rule 0 x 933 [12,7,14] + CRUSH rule 0 x 934 [12,2,5] + CRUSH rule 0 x 935 [6,11,1] + CRUSH rule 0 x 936 [9,12,7] + CRUSH rule 0 x 937 [14,2,11] + CRUSH rule 0 x 938 [14,3,5] + CRUSH rule 0 x 939 [6,4,14] + CRUSH rule 0 x 940 [13,11,4] + CRUSH rule 0 x 941 [3,12,4] + CRUSH rule 0 x 942 [15,12,10] + CRUSH rule 0 x 943 [10,2,4] + CRUSH rule 0 x 944 [2,9,4] + CRUSH rule 0 x 945 [10,15,2] + CRUSH rule 0 x 946 [11,15,7] + CRUSH rule 0 x 947 [11,3,14] + CRUSH rule 0 x 948 [7,13,11] + CRUSH rule 0 x 949 [9,1,12] + CRUSH rule 0 x 950 [9,15,13] + CRUSH rule 0 x 951 [2,6,12] + CRUSH rule 0 x 952 [9,7,15] + CRUSH rule 0 x 953 [1,3,6] + CRUSH rule 0 x 954 [10,2,14] + CRUSH rule 0 x 955 [7,14,3] + CRUSH rule 0 x 956 [1,6,11] + CRUSH rule 0 x 957 [14,11,1] + CRUSH rule 0 x 958 [15,4,3] + CRUSH rule 0 x 959 [2,1,12] + CRUSH rule 0 x 960 [2,6,11] + CRUSH rule 0 x 961 [3,13,11] + CRUSH rule 0 x 962 [5,11,3] + CRUSH rule 0 x 963 [13,10,15] + CRUSH rule 0 x 964 [7,11,4] + CRUSH rule 0 x 965 [12,2,9] + CRUSH rule 0 x 966 [12,14,9] + CRUSH rule 0 x 967 [7,5,3] + CRUSH rule 0 x 968 [12,15,4] + CRUSH rule 0 x 969 [11,4,7] + CRUSH rule 0 x 970 [5,12,10] + CRUSH rule 0 x 971 [1,9,4] + CRUSH rule 0 x 972 [12,3,14] + CRUSH rule 0 x 973 [1,10,4] + CRUSH rule 0 x 974 [7,11,1] + CRUSH rule 0 x 975 [7,9,15] + CRUSH rule 0 x 976 [7,3,15] + CRUSH rule 0 x 977 [14,3,6] + CRUSH rule 0 x 978 [12,5,11] + CRUSH rule 0 x 979 [5,1,13] + CRUSH rule 0 x 980 [15,11,5] + CRUSH rule 0 x 981 [5,11,15] + CRUSH rule 0 x 982 [2,6,14] + CRUSH rule 0 x 983 [3,12,10] + CRUSH rule 0 x 984 [15,13,1] + CRUSH rule 0 x 985 [11,2,15] + CRUSH rule 0 x 986 [6,13,9] + CRUSH rule 0 x 987 [13,14,5] + CRUSH rule 0 x 988 [12,9,10] + CRUSH rule 0 x 989 [7,4,3] + CRUSH rule 0 x 990 [1,10,9] + CRUSH rule 0 x 991 [7,11,1] + CRUSH rule 0 x 992 [9,10,2] + CRUSH rule 0 x 993 [6,10,14] + CRUSH rule 0 x 994 [3,13,15] + CRUSH rule 0 x 995 [15,6,12] + CRUSH rule 0 x 996 [15,10,5] + CRUSH rule 0 x 997 [15,2,1] + CRUSH rule 0 x 998 [6,1,9] + CRUSH rule 0 x 999 [9,10,15] + CRUSH rule 0 x 1000 [14,2,9] + CRUSH rule 0 x 1001 [11,14,4] + CRUSH rule 0 x 1002 [1,10,14] + CRUSH rule 0 x 1003 [10,7,5] + CRUSH rule 0 x 1004 [15,1,4] + CRUSH rule 0 x 1005 [6,12,2] + CRUSH rule 0 x 1006 [10,12,15] + CRUSH rule 0 x 1007 [1,7,13] + CRUSH rule 0 x 1008 [7,4,9] + CRUSH rule 0 x 1009 [5,2,11] + CRUSH rule 0 x 1010 [10,2,15] + CRUSH rule 0 x 1011 [6,3,12] + CRUSH rule 0 x 1012 [12,6,9] + CRUSH rule 0 x 1013 [2,14,12] + CRUSH rule 0 x 1014 [1,13,7] + CRUSH rule 0 x 1015 [12,6,10] + CRUSH rule 0 x 1016 [10,13,14] + CRUSH rule 0 x 1017 [5,11,14] + CRUSH rule 0 x 1018 [13,11,14] + CRUSH rule 0 x 1019 [10,13,14] + CRUSH rule 0 x 1020 [3,1,13] + CRUSH rule 0 x 1021 [2,11,14] + CRUSH rule 0 x 1022 [15,5,7] + CRUSH rule 0 x 1023 [15,2,9] + rule 0 (replicated_ruleset) num_rep 3 result size == 3:\t1024/1024 (esc) + CRUSH rule 0 x 0 [7,10,3,15] + CRUSH rule 0 x 1 [10,15,1,2] + CRUSH rule 0 x 2 [1,12,2,6] + CRUSH rule 0 x 3 [15,4,10,2] + CRUSH rule 0 x 4 [14,2,10,1] + CRUSH rule 0 x 5 [7,4,11,2] + CRUSH rule 0 x 6 [12,6,10,9] + CRUSH rule 0 x 7 [9,2,6,12] + CRUSH rule 0 x 8 [10,2,15,1] + CRUSH rule 0 x 9 [7,1,14,2] + CRUSH rule 0 x 10 [10,14,4,1] + CRUSH rule 0 x 11 [13,9,14,7] + CRUSH rule 0 x 12 [7,1,2,5] + CRUSH rule 0 x 13 [3,5,12,7] + CRUSH rule 0 x 14 [13,5,2,7] + CRUSH rule 0 x 15 [15,1,9,6] + CRUSH rule 0 x 16 [7,11,14,2] + CRUSH rule 0 x 17 [10,1,13,2] + CRUSH rule 0 x 18 [1,7,3,10] + CRUSH rule 0 x 19 [7,12,2,4] + CRUSH rule 0 x 20 [14,12,3,10] + CRUSH rule 0 x 21 [3,12,1,10] + CRUSH rule 0 x 22 [6,3,13,11] + CRUSH rule 0 x 23 [10,5,13,9] + CRUSH rule 0 x 24 [12,11,3,1] + CRUSH rule 0 x 25 [7,12,15,1] + CRUSH rule 0 x 26 [1,7,13,2] + CRUSH rule 0 x 27 [3,6,15,4] + CRUSH rule 0 x 28 [14,4,3,9] + CRUSH rule 0 x 29 [5,14,12,11] + CRUSH rule 0 x 30 [2,5,6,9] + CRUSH rule 0 x 31 [5,15,10,1] + CRUSH rule 0 x 32 [9,10,2,1] + CRUSH rule 0 x 33 [13,4,9,2] + CRUSH rule 0 x 34 [13,15,2,4] + CRUSH rule 0 x 35 [4,14,3,13] + CRUSH rule 0 x 36 [3,12,9,7] + CRUSH rule 0 x 37 [9,2,6,14] + CRUSH rule 0 x 38 [3,4,13,10] + CRUSH rule 0 x 39 [12,7,14,11] + CRUSH rule 0 x 40 [10,1,9,5] + CRUSH rule 0 x 41 [4,9,11,1] + CRUSH rule 0 x 42 [3,6,14,10] + CRUSH rule 0 x 43 [10,5,15,7] + CRUSH rule 0 x 44 [11,4,13,3] + CRUSH rule 0 x 45 [11,12,15,9] + CRUSH rule 0 x 46 [6,9,2,14] + CRUSH rule 0 x 47 [3,9,6,4] + CRUSH rule 0 x 48 [4,6,2,1] + CRUSH rule 0 x 49 [9,15,10,7] + CRUSH rule 0 x 50 [14,12,1,4] + CRUSH rule 0 x 51 [10,6,5,12] + CRUSH rule 0 x 52 [12,1,9,11] + CRUSH rule 0 x 53 [3,6,13,9] + CRUSH rule 0 x 54 [4,13,9,2] + CRUSH rule 0 x 55 [4,11,2,7] + CRUSH rule 0 x 56 [5,9,10,1] + CRUSH rule 0 x 57 [6,2,1,15] + CRUSH rule 0 x 58 [7,1,11,4] + CRUSH rule 0 x 59 [2,13,1,10] + CRUSH rule 0 x 60 [3,6,11,1] + CRUSH rule 0 x 61 [3,15,13,7] + CRUSH rule 0 x 62 [15,11,7,12] + CRUSH rule 0 x 63 [10,14,12,1] + CRUSH rule 0 x 64 [3,9,1,4] + CRUSH rule 0 x 65 [4,12,11,7] + CRUSH rule 0 x 66 [15,11,6,9] + CRUSH rule 0 x 67 [2,6,4,14] + CRUSH rule 0 x 68 [15,7,4,2] + CRUSH rule 0 x 69 [2,1,15,10] + CRUSH rule 0 x 70 [9,6,1,3] + CRUSH rule 0 x 71 [15,5,1,3] + CRUSH rule 0 x 72 [9,10,3,5] + CRUSH rule 0 x 73 [5,3,11,1] + CRUSH rule 0 x 74 [11,7,9,5] + CRUSH rule 0 x 75 [9,7,11,14] + CRUSH rule 0 x 76 [6,1,3,5] + CRUSH rule 0 x 77 [7,4,2,13] + CRUSH rule 0 x 78 [9,3,1,5] + CRUSH rule 0 x 79 [13,2,15,5] + CRUSH rule 0 x 80 [15,2,6,4] + CRUSH rule 0 x 81 [15,2,1,11] + CRUSH rule 0 x 82 [14,13,5,11] + CRUSH rule 0 x 83 [4,15,3,9] + CRUSH rule 0 x 84 [10,7,9,15] + CRUSH rule 0 x 85 [3,15,9,7] + CRUSH rule 0 x 86 [10,9,14,1] + CRUSH rule 0 x 87 [15,10,7,12] + CRUSH rule 0 x 88 [4,13,3,1] + CRUSH rule 0 x 89 [3,9,7,4] + CRUSH rule 0 x 90 [4,9,7,12] + CRUSH rule 0 x 91 [6,11,9,1] + CRUSH rule 0 x 92 [1,5,10,9] + CRUSH rule 0 x 93 [9,3,15,13] + CRUSH rule 0 x 94 [9,2,12,5] + CRUSH rule 0 x 95 [7,15,4,10] + CRUSH rule 0 x 96 [2,15,11,7] + CRUSH rule 0 x 97 [4,11,2,13] + CRUSH rule 0 x 98 [11,13,9,3] + CRUSH rule 0 x 99 [12,4,11,7] + CRUSH rule 0 x 100 [9,4,10,15] + CRUSH rule 0 x 101 [15,7,1,9] + CRUSH rule 0 x 102 [3,11,14,6] + CRUSH rule 0 x 103 [13,11,6,14] + CRUSH rule 0 x 104 [14,6,3,5] + CRUSH rule 0 x 105 [14,10,1,9] + CRUSH rule 0 x 106 [6,5,13,2] + CRUSH rule 0 x 107 [3,1,10,14] + CRUSH rule 0 x 108 [5,10,7,2] + CRUSH rule 0 x 109 [9,1,13,7] + CRUSH rule 0 x 110 [5,1,11,3] + CRUSH rule 0 x 111 [10,1,9,7] + CRUSH rule 0 x 112 [1,10,4,14] + CRUSH rule 0 x 113 [6,10,13,9] + CRUSH rule 0 x 114 [5,13,6,2] + CRUSH rule 0 x 115 [10,13,14,3] + CRUSH rule 0 x 116 [1,14,13,2] + CRUSH rule 0 x 117 [5,6,1,12] + CRUSH rule 0 x 118 [10,4,13,15] + CRUSH rule 0 x 119 [14,12,11,4] + CRUSH rule 0 x 120 [11,3,14,13] + CRUSH rule 0 x 121 [9,5,1,11] + CRUSH rule 0 x 122 [4,3,14,1] + CRUSH rule 0 x 123 [3,10,5,6] + CRUSH rule 0 x 124 [12,2,1,5] + CRUSH rule 0 x 125 [9,12,15,1] + CRUSH rule 0 x 126 [7,15,10,9] + CRUSH rule 0 x 127 [4,14,9,13] + CRUSH rule 0 x 128 [3,12,1,10] + CRUSH rule 0 x 129 [11,13,14,2] + CRUSH rule 0 x 130 [3,13,5,14] + CRUSH rule 0 x 131 [12,1,6,15] + CRUSH rule 0 x 132 [11,15,13,9] + CRUSH rule 0 x 133 [3,6,9,11] + CRUSH rule 0 x 134 [12,5,6,15] + CRUSH rule 0 x 135 [3,14,12,4] + CRUSH rule 0 x 136 [15,6,9,4] + CRUSH rule 0 x 137 [14,3,6,11] + CRUSH rule 0 x 138 [13,15,4,10] + CRUSH rule 0 x 139 [11,2,13,9] + CRUSH rule 0 x 140 [11,4,12,15] + CRUSH rule 0 x 141 [6,12,15,11] + CRUSH rule 0 x 142 [3,14,7,9] + CRUSH rule 0 x 143 [9,6,4,2] + CRUSH rule 0 x 144 [13,7,11,2] + CRUSH rule 0 x 145 [12,2,6,10] + CRUSH rule 0 x 146 [1,5,9,2] + CRUSH rule 0 x 147 [1,4,9,11] + CRUSH rule 0 x 148 [12,7,9,2] + CRUSH rule 0 x 149 [2,5,9,12] + CRUSH rule 0 x 150 [1,15,2,10] + CRUSH rule 0 x 151 [2,9,14,7] + CRUSH rule 0 x 152 [5,9,2,6] + CRUSH rule 0 x 153 [6,9,4,15] + CRUSH rule 0 x 154 [3,11,7,1] + CRUSH rule 0 x 155 [14,12,7,3] + CRUSH rule 0 x 156 [7,13,3,10] + CRUSH rule 0 x 157 [15,1,6,4] + CRUSH rule 0 x 158 [15,1,10,6] + CRUSH rule 0 x 159 [4,14,3,12] + CRUSH rule 0 x 160 [5,7,3,14] + CRUSH rule 0 x 161 [1,2,11,4] + CRUSH rule 0 x 162 [10,6,1,12] + CRUSH rule 0 x 163 [15,1,10,2] + CRUSH rule 0 x 164 [9,14,10,7] + CRUSH rule 0 x 165 [11,7,2,13] + CRUSH rule 0 x 166 [1,2,12,14] + CRUSH rule 0 x 167 [9,7,3,4] + CRUSH rule 0 x 168 [13,2,4,1] + CRUSH rule 0 x 169 [1,4,9,14] + CRUSH rule 0 x 170 [1,15,7,9] + CRUSH rule 0 x 171 [9,2,10,7] + CRUSH rule 0 x 172 [14,4,10,12] + CRUSH rule 0 x 173 [5,10,12,15] + CRUSH rule 0 x 174 [15,6,4,12] + CRUSH rule 0 x 175 [5,7,9,3] + CRUSH rule 0 x 176 [9,6,3,14] + CRUSH rule 0 x 177 [2,9,10,13] + CRUSH rule 0 x 178 [12,11,7,14] + CRUSH rule 0 x 179 [2,10,13,9] + CRUSH rule 0 x 180 [3,11,5,15] + CRUSH rule 0 x 181 [9,12,6,5] + CRUSH rule 0 x 182 [5,13,11,2] + CRUSH rule 0 x 183 [5,7,10,13] + CRUSH rule 0 x 184 [2,5,11,12] + CRUSH rule 0 x 185 [13,5,7,11] + CRUSH rule 0 x 186 [6,14,13,5] + CRUSH rule 0 x 187 [1,4,11,13] + CRUSH rule 0 x 188 [9,13,5,14] + CRUSH rule 0 x 189 [6,12,4,9] + CRUSH rule 0 x 190 [9,13,15,10] + CRUSH rule 0 x 191 [7,11,4,1] + CRUSH rule 0 x 192 [2,11,5,15] + CRUSH rule 0 x 193 [3,13,6,10] + CRUSH rule 0 x 194 [3,13,4,14] + CRUSH rule 0 x 195 [5,7,10,12] + CRUSH rule 0 x 196 [4,15,1,10] + CRUSH rule 0 x 197 [14,10,13,4] + CRUSH rule 0 x 198 [2,5,6,15] + CRUSH rule 0 x 199 [2,10,4,15] + CRUSH rule 0 x 200 [7,14,11,4] + CRUSH rule 0 x 201 [9,14,1,7] + CRUSH rule 0 x 202 [14,11,7,3] + CRUSH rule 0 x 203 [12,5,7,15] + CRUSH rule 0 x 204 [6,11,3,12] + CRUSH rule 0 x 205 [15,4,6,10] + CRUSH rule 0 x 206 [13,11,2,15] + CRUSH rule 0 x 207 [2,11,7,4] + CRUSH rule 0 x 208 [13,1,6,14] + CRUSH rule 0 x 209 [6,15,13,1] + CRUSH rule 0 x 210 [13,11,2,7] + CRUSH rule 0 x 211 [2,14,1,13] + CRUSH rule 0 x 212 [10,1,12,15] + CRUSH rule 0 x 213 [3,9,6,5] + CRUSH rule 0 x 214 [7,15,4,1] + CRUSH rule 0 x 215 [6,1,4,13] + CRUSH rule 0 x 216 [12,9,6,2] + CRUSH rule 0 x 217 [12,11,1,14] + CRUSH rule 0 x 218 [12,10,15,6] + CRUSH rule 0 x 219 [3,11,14,6] + CRUSH rule 0 x 220 [14,4,3,12] + CRUSH rule 0 x 221 [15,5,2,6] + CRUSH rule 0 x 222 [10,4,3,15] + CRUSH rule 0 x 223 [9,7,11,1] + CRUSH rule 0 x 224 [1,7,10,2] + CRUSH rule 0 x 225 [10,5,2,6] + CRUSH rule 0 x 226 [4,1,9,3] + CRUSH rule 0 x 227 [7,2,12,15] + CRUSH rule 0 x 228 [2,15,11,1] + CRUSH rule 0 x 229 [9,3,7,14] + CRUSH rule 0 x 230 [10,5,7,2] + CRUSH rule 0 x 231 [2,7,5,13] + CRUSH rule 0 x 232 [10,5,13,1] + CRUSH rule 0 x 233 [6,12,11,4] + CRUSH rule 0 x 234 [10,1,2,12] + CRUSH rule 0 x 235 [13,14,7,10] + CRUSH rule 0 x 236 [2,15,9,12] + CRUSH rule 0 x 237 [3,12,9,10] + CRUSH rule 0 x 238 [2,10,4,15] + CRUSH rule 0 x 239 [4,15,10,7] + CRUSH rule 0 x 240 [15,5,13,7] + CRUSH rule 0 x 241 [7,9,15,12] + CRUSH rule 0 x 242 [14,2,6,9] + CRUSH rule 0 x 243 [2,11,5,1] + CRUSH rule 0 x 244 [13,9,15,3] + CRUSH rule 0 x 245 [12,9,15,3] + CRUSH rule 0 x 246 [15,3,5,11] + CRUSH rule 0 x 247 [6,4,9,12] + CRUSH rule 0 x 248 [5,13,7,11] + CRUSH rule 0 x 249 [10,14,7,3] + CRUSH rule 0 x 250 [12,15,1,10] + CRUSH rule 0 x 251 [13,2,15,5] + CRUSH rule 0 x 252 [7,5,13,9] + CRUSH rule 0 x 253 [3,13,15,10] + CRUSH rule 0 x 254 [2,9,13,14] + CRUSH rule 0 x 255 [1,9,13,2] + CRUSH rule 0 x 256 [6,9,13,1] + CRUSH rule 0 x 257 [15,12,3,9] + CRUSH rule 0 x 258 [12,5,6,10] + CRUSH rule 0 x 259 [9,10,4,3] + CRUSH rule 0 x 260 [10,12,6,9] + CRUSH rule 0 x 261 [13,7,2,1] + CRUSH rule 0 x 262 [15,3,12,7] + CRUSH rule 0 x 263 [12,6,10,9] + CRUSH rule 0 x 264 [13,14,11,3] + CRUSH rule 0 x 265 [12,10,14,5] + CRUSH rule 0 x 266 [14,7,11,1] + CRUSH rule 0 x 267 [12,11,6,5] + CRUSH rule 0 x 268 [4,1,15,12] + CRUSH rule 0 x 269 [11,1,15,5] + CRUSH rule 0 x 270 [7,11,12,3] + CRUSH rule 0 x 271 [4,7,3,13] + CRUSH rule 0 x 272 [15,5,13,10] + CRUSH rule 0 x 273 [2,10,7,12] + CRUSH rule 0 x 274 [10,2,5,6] + CRUSH rule 0 x 275 [10,3,4,7] + CRUSH rule 0 x 276 [5,12,9,2] + CRUSH rule 0 x 277 [14,3,13,4] + CRUSH rule 0 x 278 [5,6,14,3] + CRUSH rule 0 x 279 [6,10,13,3] + CRUSH rule 0 x 280 [7,3,14,9] + CRUSH rule 0 x 281 [5,11,14,7] + CRUSH rule 0 x 282 [2,1,13,14] + CRUSH rule 0 x 283 [4,1,12,3] + CRUSH rule 0 x 284 [5,11,7,15] + CRUSH rule 0 x 285 [15,5,3,1] + CRUSH rule 0 x 286 [10,4,3,6] + CRUSH rule 0 x 287 [12,4,9,1] + CRUSH rule 0 x 288 [4,12,10,7] + CRUSH rule 0 x 289 [2,5,14,9] + CRUSH rule 0 x 290 [12,2,5,6] + CRUSH rule 0 x 291 [7,11,1,14] + CRUSH rule 0 x 292 [4,10,6,3] + CRUSH rule 0 x 293 [6,5,11,1] + CRUSH rule 0 x 294 [9,12,3,14] + CRUSH rule 0 x 295 [6,10,3,14] + CRUSH rule 0 x 296 [3,1,13,7] + CRUSH rule 0 x 297 [6,13,4,14] + CRUSH rule 0 x 298 [14,9,13,1] + CRUSH rule 0 x 299 [14,12,11,6] + CRUSH rule 0 x 300 [15,7,10,5] + CRUSH rule 0 x 301 [9,11,7,1] + CRUSH rule 0 x 302 [9,7,1,13] + CRUSH rule 0 x 303 [4,13,3,7] + CRUSH rule 0 x 304 [6,9,2,11] + CRUSH rule 0 x 305 [13,7,5,11] + CRUSH rule 0 x 306 [10,12,4,6] + CRUSH rule 0 x 307 [11,12,15,5] + CRUSH rule 0 x 308 [12,14,10,9] + CRUSH rule 0 x 309 [9,3,12,5] + CRUSH rule 0 x 310 [3,1,5,10] + CRUSH rule 0 x 311 [3,9,7,1] + CRUSH rule 0 x 312 [15,13,9,7] + CRUSH rule 0 x 313 [9,15,3,7] + CRUSH rule 0 x 314 [2,15,9,5] + CRUSH rule 0 x 315 [15,2,13,1] + CRUSH rule 0 x 316 [4,9,11,2] + CRUSH rule 0 x 317 [1,5,3,13] + CRUSH rule 0 x 318 [4,1,15,11] + CRUSH rule 0 x 319 [2,15,4,1] + CRUSH rule 0 x 320 [5,7,13,9] + CRUSH rule 0 x 321 [1,6,11,15] + CRUSH rule 0 x 322 [13,7,5,3] + CRUSH rule 0 x 323 [7,4,10,1] + CRUSH rule 0 x 324 [5,6,10,15] + CRUSH rule 0 x 325 [9,10,14,5] + CRUSH rule 0 x 326 [11,7,13,4] + CRUSH rule 0 x 327 [12,5,10,14] + CRUSH rule 0 x 328 [5,2,6,14] + CRUSH rule 0 x 329 [2,6,15,5] + CRUSH rule 0 x 330 [3,9,11,13] + CRUSH rule 0 x 331 [12,14,6,3] + CRUSH rule 0 x 332 [10,12,6,15] + CRUSH rule 0 x 333 [6,5,3,12] + CRUSH rule 0 x 334 [4,9,2,12] + CRUSH rule 0 x 335 [11,7,1,5] + CRUSH rule 0 x 336 [6,14,13,2] + CRUSH rule 0 x 337 [15,11,3,7] + CRUSH rule 0 x 338 [10,5,3,6] + CRUSH rule 0 x 339 [11,14,13,5] + CRUSH rule 0 x 340 [11,6,12,4] + CRUSH rule 0 x 341 [7,5,2,10] + CRUSH rule 0 x 342 [12,14,1,9] + CRUSH rule 0 x 343 [12,14,9,6] + CRUSH rule 0 x 344 [9,11,5,2] + CRUSH rule 0 x 345 [14,2,11,9] + CRUSH rule 0 x 346 [5,3,14,10] + CRUSH rule 0 x 347 [10,2,12,6] + CRUSH rule 0 x 348 [7,9,10,1] + CRUSH rule 0 x 349 [9,6,10,12] + CRUSH rule 0 x 350 [13,9,15,4] + CRUSH rule 0 x 351 [13,5,15,3] + CRUSH rule 0 x 352 [1,12,11,9] + CRUSH rule 0 x 353 [10,14,12,2] + CRUSH rule 0 x 354 [6,3,15,10] + CRUSH rule 0 x 355 [13,14,6,10] + CRUSH rule 0 x 356 [15,13,2,9] + CRUSH rule 0 x 357 [4,11,1,13] + CRUSH rule 0 x 358 [12,7,2,9] + CRUSH rule 0 x 359 [5,15,7,11] + CRUSH rule 0 x 360 [13,10,1,2] + CRUSH rule 0 x 361 [5,3,13,6] + CRUSH rule 0 x 362 [2,9,11,13] + CRUSH rule 0 x 363 [7,12,3,9] + CRUSH rule 0 x 364 [2,12,6,9] + CRUSH rule 0 x 365 [13,5,11,15] + CRUSH rule 0 x 366 [12,7,3,14] + CRUSH rule 0 x 367 [7,13,3,1] + CRUSH rule 0 x 368 [7,9,10,15] + CRUSH rule 0 x 369 [7,5,3,13] + CRUSH rule 0 x 370 [4,7,14,1] + CRUSH rule 0 x 371 [1,7,12,3] + CRUSH rule 0 x 372 [10,4,3,14] + CRUSH rule 0 x 373 [15,5,2,6] + CRUSH rule 0 x 374 [3,15,12,5] + CRUSH rule 0 x 375 [5,2,14,1] + CRUSH rule 0 x 376 [5,14,10,13] + CRUSH rule 0 x 377 [1,15,2,4] + CRUSH rule 0 x 378 [9,12,2,15] + CRUSH rule 0 x 379 [11,2,15,5] + CRUSH rule 0 x 380 [6,1,12,11] + CRUSH rule 0 x 381 [15,13,7,5] + CRUSH rule 0 x 382 [14,3,1,4] + CRUSH rule 0 x 383 [3,6,11,4] + CRUSH rule 0 x 384 [4,13,6,3] + CRUSH rule 0 x 385 [4,6,15,3] + CRUSH rule 0 x 386 [14,3,11,13] + CRUSH rule 0 x 387 [1,11,5,7] + CRUSH rule 0 x 388 [2,6,11,9] + CRUSH rule 0 x 389 [12,7,2,4] + CRUSH rule 0 x 390 [2,11,13,7] + CRUSH rule 0 x 391 [3,4,9,13] + CRUSH rule 0 x 392 [11,5,14,7] + CRUSH rule 0 x 393 [2,14,5,9] + CRUSH rule 0 x 394 [4,9,3,15] + CRUSH rule 0 x 395 [10,13,5,15] + CRUSH rule 0 x 396 [2,12,15,9] + CRUSH rule 0 x 397 [1,14,9,4] + CRUSH rule 0 x 398 [9,2,1,5] + CRUSH rule 0 x 399 [5,9,14,3] + CRUSH rule 0 x 400 [10,6,2,4] + CRUSH rule 0 x 401 [6,9,11,12] + CRUSH rule 0 x 402 [4,7,9,2] + CRUSH rule 0 x 403 [7,15,13,3] + CRUSH rule 0 x 404 [14,12,7,9] + CRUSH rule 0 x 405 [9,15,11,2] + CRUSH rule 0 x 406 [12,14,9,2] + CRUSH rule 0 x 407 [9,5,12,10] + CRUSH rule 0 x 408 [7,1,5,2] + CRUSH rule 0 x 409 [11,2,4,13] + CRUSH rule 0 x 410 [6,4,14,2] + CRUSH rule 0 x 411 [13,11,15,6] + CRUSH rule 0 x 412 [5,9,6,11] + CRUSH rule 0 x 413 [13,5,3,11] + CRUSH rule 0 x 414 [3,11,9,13] + CRUSH rule 0 x 415 [6,10,14,5] + CRUSH rule 0 x 416 [13,1,4,7] + CRUSH rule 0 x 417 [4,12,1,15] + CRUSH rule 0 x 418 [14,5,10,2] + CRUSH rule 0 x 419 [5,14,10,9] + CRUSH rule 0 x 420 [2,4,9,11] + CRUSH rule 0 x 421 [15,4,10,3] + CRUSH rule 0 x 422 [4,11,2,7] + CRUSH rule 0 x 423 [3,15,12,6] + CRUSH rule 0 x 424 [6,10,12,2] + CRUSH rule 0 x 425 [11,15,2,13] + CRUSH rule 0 x 426 [12,4,7,1] + CRUSH rule 0 x 427 [14,10,3,1] + CRUSH rule 0 x 428 [12,7,9,4] + CRUSH rule 0 x 429 [3,4,9,7] + CRUSH rule 0 x 430 [3,5,10,13] + CRUSH rule 0 x 431 [9,3,7,1] + CRUSH rule 0 x 432 [4,1,12,7] + CRUSH rule 0 x 433 [4,11,12,15] + CRUSH rule 0 x 434 [2,14,9,1] + CRUSH rule 0 x 435 [13,11,5,6] + CRUSH rule 0 x 436 [9,15,10,2] + CRUSH rule 0 x 437 [9,6,3,14] + CRUSH rule 0 x 438 [7,2,13,4] + CRUSH rule 0 x 439 [7,14,4,3] + CRUSH rule 0 x 440 [14,11,9,2] + CRUSH rule 0 x 441 [2,4,11,9] + CRUSH rule 0 x 442 [10,13,9,7] + CRUSH rule 0 x 443 [12,15,10,9] + CRUSH rule 0 x 444 [4,13,7,14] + CRUSH rule 0 x 445 [4,2,15,7] + CRUSH rule 0 x 446 [12,10,6,9] + CRUSH rule 0 x 447 [15,7,13,1] + CRUSH rule 0 x 448 [5,2,13,7] + CRUSH rule 0 x 449 [14,5,3,12] + CRUSH rule 0 x 450 [2,4,6,9] + CRUSH rule 0 x 451 [6,14,11,3] + CRUSH rule 0 x 452 [14,9,10,4] + CRUSH rule 0 x 453 [5,15,13,2] + CRUSH rule 0 x 454 [10,4,2,6] + CRUSH rule 0 x 455 [6,13,2,4] + CRUSH rule 0 x 456 [5,7,13,1] + CRUSH rule 0 x 457 [9,1,5,7] + CRUSH rule 0 x 458 [9,11,15,4] + CRUSH rule 0 x 459 [13,15,11,1] + CRUSH rule 0 x 460 [5,12,10,15] + CRUSH rule 0 x 461 [4,3,9,13] + CRUSH rule 0 x 462 [4,7,12,14] + CRUSH rule 0 x 463 [4,12,14,11] + CRUSH rule 0 x 464 [4,2,15,10] + CRUSH rule 0 x 465 [5,10,9,7] + CRUSH rule 0 x 466 [13,5,2,15] + CRUSH rule 0 x 467 [13,6,14,3] + CRUSH rule 0 x 468 [10,7,12,14] + CRUSH rule 0 x 469 [4,9,6,14] + CRUSH rule 0 x 470 [3,9,12,15] + CRUSH rule 0 x 471 [6,1,5,14] + CRUSH rule 0 x 472 [2,14,7,5] + CRUSH rule 0 x 473 [15,10,6,9] + CRUSH rule 0 x 474 [15,10,4,12] + CRUSH rule 0 x 475 [10,5,12,9] + CRUSH rule 0 x 476 [3,6,10,12] + CRUSH rule 0 x 477 [6,13,5,15] + CRUSH rule 0 x 478 [4,15,1,3] + CRUSH rule 0 x 479 [13,11,1,6] + CRUSH rule 0 x 480 [1,13,6,4] + CRUSH rule 0 x 481 [15,12,7,9] + CRUSH rule 0 x 482 [2,12,9,1] + CRUSH rule 0 x 483 [10,1,4,15] + CRUSH rule 0 x 484 [1,4,10,13] + CRUSH rule 0 x 485 [9,4,3,1] + CRUSH rule 0 x 486 [3,10,15,9] + CRUSH rule 0 x 487 [12,11,4,14] + CRUSH rule 0 x 488 [14,4,1,9] + CRUSH rule 0 x 489 [11,4,2,13] + CRUSH rule 0 x 490 [4,9,1,3] + CRUSH rule 0 x 491 [1,12,5,2] + CRUSH rule 0 x 492 [5,7,11,3] + CRUSH rule 0 x 493 [12,1,4,15] + CRUSH rule 0 x 494 [1,7,13,4] + CRUSH rule 0 x 495 [3,15,7,1] + CRUSH rule 0 x 496 [5,3,7,13] + CRUSH rule 0 x 497 [13,10,3,6] + CRUSH rule 0 x 498 [10,6,1,5] + CRUSH rule 0 x 499 [14,3,12,5] + CRUSH rule 0 x 500 [15,9,6,12] + CRUSH rule 0 x 501 [10,13,1,9] + CRUSH rule 0 x 502 [5,1,14,11] + CRUSH rule 0 x 503 [15,10,7,9] + CRUSH rule 0 x 504 [13,2,7,1] + CRUSH rule 0 x 505 [12,7,5,2] + CRUSH rule 0 x 506 [11,7,9,14] + CRUSH rule 0 x 507 [4,14,13,3] + CRUSH rule 0 x 508 [12,1,4,9] + CRUSH rule 0 x 509 [4,2,6,9] + CRUSH rule 0 x 510 [5,3,1,12] + CRUSH rule 0 x 511 [2,12,10,6] + CRUSH rule 0 x 512 [15,11,3,5] + CRUSH rule 0 x 513 [4,9,11,3] + CRUSH rule 0 x 514 [11,9,3,4] + CRUSH rule 0 x 515 [12,14,6,5] + CRUSH rule 0 x 516 [14,11,1,12] + CRUSH rule 0 x 517 [11,5,6,13] + CRUSH rule 0 x 518 [3,5,7,12] + CRUSH rule 0 x 519 [12,14,2,1] + CRUSH rule 0 x 520 [12,4,2,10] + CRUSH rule 0 x 521 [11,5,9,6] + CRUSH rule 0 x 522 [4,12,11,1] + CRUSH rule 0 x 523 [3,1,5,9] + CRUSH rule 0 x 524 [15,9,3,11] + CRUSH rule 0 x 525 [3,15,11,6] + CRUSH rule 0 x 526 [10,2,5,13] + CRUSH rule 0 x 527 [3,13,4,1] + CRUSH rule 0 x 528 [12,7,15,10] + CRUSH rule 0 x 529 [6,4,10,12] + CRUSH rule 0 x 530 [11,9,12,7] + CRUSH rule 0 x 531 [9,15,4,7] + CRUSH rule 0 x 532 [5,3,13,7] + CRUSH rule 0 x 533 [12,15,1,2] + CRUSH rule 0 x 534 [11,9,3,7] + CRUSH rule 0 x 535 [11,1,3,5] + CRUSH rule 0 x 536 [9,1,14,13] + CRUSH rule 0 x 537 [15,5,13,2] + CRUSH rule 0 x 538 [13,5,11,2] + CRUSH rule 0 x 539 [10,12,6,14] + CRUSH rule 0 x 540 [12,15,7,3] + CRUSH rule 0 x 541 [2,1,6,11] + CRUSH rule 0 x 542 [3,9,15,5] + CRUSH rule 0 x 543 [4,10,9,3] + CRUSH rule 0 x 544 [3,15,9,11] + CRUSH rule 0 x 545 [14,10,7,12] + CRUSH rule 0 x 546 [5,15,13,7] + CRUSH rule 0 x 547 [5,13,7,9] + CRUSH rule 0 x 548 [11,7,12,15] + CRUSH rule 0 x 549 [14,1,4,9] + CRUSH rule 0 x 550 [9,15,3,13] + CRUSH rule 0 x 551 [11,2,15,6] + CRUSH rule 0 x 552 [2,11,14,1] + CRUSH rule 0 x 553 [11,9,14,6] + CRUSH rule 0 x 554 [11,14,6,4] + CRUSH rule 0 x 555 [6,5,10,9] + CRUSH rule 0 x 556 [15,6,3,13] + CRUSH rule 0 x 557 [12,2,5,14] + CRUSH rule 0 x 558 [12,1,6,15] + CRUSH rule 0 x 559 [2,13,5,10] + CRUSH rule 0 x 560 [4,9,12,6] + CRUSH rule 0 x 561 [12,7,1,2] + CRUSH rule 0 x 562 [7,13,9,14] + CRUSH rule 0 x 563 [15,4,3,10] + CRUSH rule 0 x 564 [2,13,7,1] + CRUSH rule 0 x 565 [3,12,4,1] + CRUSH rule 0 x 566 [6,14,4,2] + CRUSH rule 0 x 567 [15,4,11,6] + CRUSH rule 0 x 568 [4,14,1,6] + CRUSH rule 0 x 569 [11,3,15,13] + CRUSH rule 0 x 570 [1,10,13,4] + CRUSH rule 0 x 571 [10,12,14,9] + CRUSH rule 0 x 572 [12,14,3,10] + CRUSH rule 0 x 573 [7,15,11,2] + CRUSH rule 0 x 574 [11,14,13,1] + CRUSH rule 0 x 575 [5,13,15,9] + CRUSH rule 0 x 576 [3,15,11,9] + CRUSH rule 0 x 577 [13,9,6,15] + CRUSH rule 0 x 578 [4,10,1,2] + CRUSH rule 0 x 579 [13,1,15,2] + CRUSH rule 0 x 580 [3,12,4,1] + CRUSH rule 0 x 581 [7,14,12,10] + CRUSH rule 0 x 582 [10,5,13,14] + CRUSH rule 0 x 583 [4,15,1,9] + CRUSH rule 0 x 584 [10,1,5,13] + CRUSH rule 0 x 585 [5,3,6,1] + CRUSH rule 0 x 586 [7,10,14,12] + CRUSH rule 0 x 587 [11,6,9,4] + CRUSH rule 0 x 588 [3,12,7,15] + CRUSH rule 0 x 589 [9,7,12,1] + CRUSH rule 0 x 590 [12,1,3,9] + CRUSH rule 0 x 591 [2,6,14,13] + CRUSH rule 0 x 592 [15,12,9,7] + CRUSH rule 0 x 593 [13,14,5,11] + CRUSH rule 0 x 594 [12,14,2,9] + CRUSH rule 0 x 595 [12,7,10,3] + CRUSH rule 0 x 596 [2,7,12,11] + CRUSH rule 0 x 597 [15,1,2,10] + CRUSH rule 0 x 598 [11,5,9,14] + CRUSH rule 0 x 599 [13,11,1,5] + CRUSH rule 0 x 600 [4,12,3,10] + CRUSH rule 0 x 601 [13,5,15,2] + CRUSH rule 0 x 602 [3,11,7,1] + CRUSH rule 0 x 603 [3,1,4,14] + CRUSH rule 0 x 604 [14,2,6,1] + CRUSH rule 0 x 605 [2,7,12,5] + CRUSH rule 0 x 606 [12,15,1,5] + CRUSH rule 0 x 607 [3,9,10,14] + CRUSH rule 0 x 608 [13,10,1,7] + CRUSH rule 0 x 609 [14,3,7,9] + CRUSH rule 0 x 610 [7,10,5,1] + CRUSH rule 0 x 611 [13,1,5,3] + CRUSH rule 0 x 612 [7,1,2,13] + CRUSH rule 0 x 613 [10,7,14,9] + CRUSH rule 0 x 614 [9,4,15,3] + CRUSH rule 0 x 615 [9,4,11,2] + CRUSH rule 0 x 616 [10,14,1,5] + CRUSH rule 0 x 617 [15,7,2,11] + CRUSH rule 0 x 618 [4,2,10,6] + CRUSH rule 0 x 619 [15,4,3,9] + CRUSH rule 0 x 620 [3,7,11,14] + CRUSH rule 0 x 621 [3,6,4,14] + CRUSH rule 0 x 622 [10,2,13,5] + CRUSH rule 0 x 623 [4,9,14,7] + CRUSH rule 0 x 624 [3,9,15,6] + CRUSH rule 0 x 625 [11,7,3,5] + CRUSH rule 0 x 626 [10,12,2,1] + CRUSH rule 0 x 627 [1,12,10,14] + CRUSH rule 0 x 628 [15,13,11,4] + CRUSH rule 0 x 629 [5,6,15,12] + CRUSH rule 0 x 630 [1,4,12,9] + CRUSH rule 0 x 631 [5,7,1,15] + CRUSH rule 0 x 632 [12,3,11,9] + CRUSH rule 0 x 633 [14,4,3,7] + CRUSH rule 0 x 634 [6,9,5,3] + CRUSH rule 0 x 635 [6,5,2,15] + CRUSH rule 0 x 636 [13,6,11,3] + CRUSH rule 0 x 637 [3,1,10,6] + CRUSH rule 0 x 638 [10,15,3,5] + CRUSH rule 0 x 639 [6,9,14,4] + CRUSH rule 0 x 640 [9,6,1,11] + CRUSH rule 0 x 641 [10,6,5,14] + CRUSH rule 0 x 642 [1,15,4,6] + CRUSH rule 0 x 643 [3,7,5,1] + CRUSH rule 0 x 644 [15,13,6,9] + CRUSH rule 0 x 645 [14,2,4,9] + CRUSH rule 0 x 646 [5,13,14,1] + CRUSH rule 0 x 647 [10,1,9,13] + CRUSH rule 0 x 648 [6,5,2,14] + CRUSH rule 0 x 649 [3,9,13,11] + CRUSH rule 0 x 650 [10,9,4,15] + CRUSH rule 0 x 651 [3,9,5,7] + CRUSH rule 0 x 652 [15,9,4,6] + CRUSH rule 0 x 653 [11,14,1,3] + CRUSH rule 0 x 654 [13,6,2,10] + CRUSH rule 0 x 655 [6,3,4,15] + CRUSH rule 0 x 656 [3,15,1,4] + CRUSH rule 0 x 657 [11,15,3,5] + CRUSH rule 0 x 658 [7,2,10,12] + CRUSH rule 0 x 659 [2,5,14,6] + CRUSH rule 0 x 660 [13,14,10,6] + CRUSH rule 0 x 661 [7,15,3,12] + CRUSH rule 0 x 662 [15,2,12,5] + CRUSH rule 0 x 663 [14,9,13,10] + CRUSH rule 0 x 664 [6,10,12,4] + CRUSH rule 0 x 665 [2,9,12,1] + CRUSH rule 0 x 666 [12,3,6,1] + CRUSH rule 0 x 667 [1,9,12,10] + CRUSH rule 0 x 668 [9,5,1,2] + CRUSH rule 0 x 669 [9,7,14,5] + CRUSH rule 0 x 670 [6,10,9,13] + CRUSH rule 0 x 671 [6,15,5,10] + CRUSH rule 0 x 672 [2,9,13,1] + CRUSH rule 0 x 673 [7,10,5,9] + CRUSH rule 0 x 674 [7,12,10,1] + CRUSH rule 0 x 675 [9,5,1,10] + CRUSH rule 0 x 676 [10,12,2,1] + CRUSH rule 0 x 677 [2,12,1,4] + CRUSH rule 0 x 678 [1,2,4,10] + CRUSH rule 0 x 679 [5,6,12,15] + CRUSH rule 0 x 680 [7,11,3,1] + CRUSH rule 0 x 681 [6,4,3,11] + CRUSH rule 0 x 682 [6,1,11,15] + CRUSH rule 0 x 683 [6,13,2,4] + CRUSH rule 0 x 684 [9,11,3,7] + CRUSH rule 0 x 685 [5,1,15,7] + CRUSH rule 0 x 686 [1,9,11,14] + CRUSH rule 0 x 687 [7,13,3,5] + CRUSH rule 0 x 688 [11,9,1,14] + CRUSH rule 0 x 689 [5,2,9,12] + CRUSH rule 0 x 690 [9,7,10,3] + CRUSH rule 0 x 691 [11,15,9,5] + CRUSH rule 0 x 692 [15,5,1,2] + CRUSH rule 0 x 693 [5,6,12,15] + CRUSH rule 0 x 694 [4,7,1,10] + CRUSH rule 0 x 695 [6,13,14,10] + CRUSH rule 0 x 696 [1,2,4,14] + CRUSH rule 0 x 697 [13,11,3,6] + CRUSH rule 0 x 698 [11,13,4,2] + CRUSH rule 0 x 699 [7,14,12,4] + CRUSH rule 0 x 700 [12,14,11,9] + CRUSH rule 0 x 701 [3,13,1,14] + CRUSH rule 0 x 702 [3,12,15,6] + CRUSH rule 0 x 703 [15,11,13,3] + CRUSH rule 0 x 704 [6,4,2,15] + CRUSH rule 0 x 705 [14,6,11,5] + CRUSH rule 0 x 706 [1,12,3,6] + CRUSH rule 0 x 707 [4,7,14,3] + CRUSH rule 0 x 708 [3,10,5,1] + CRUSH rule 0 x 709 [11,12,3,7] + CRUSH rule 0 x 710 [14,2,11,9] + CRUSH rule 0 x 711 [14,3,9,10] + CRUSH rule 0 x 712 [12,3,11,15] + CRUSH rule 0 x 713 [11,9,3,15] + CRUSH rule 0 x 714 [12,1,9,7] + CRUSH rule 0 x 715 [6,1,14,4] + CRUSH rule 0 x 716 [11,13,9,14] + CRUSH rule 0 x 717 [12,4,10,9] + CRUSH rule 0 x 718 [7,15,5,2] + CRUSH rule 0 x 719 [5,15,13,3] + CRUSH rule 0 x 720 [4,13,10,2] + CRUSH rule 0 x 721 [11,3,14,9] + CRUSH rule 0 x 722 [2,4,6,1] + CRUSH rule 0 x 723 [2,1,12,15] + CRUSH rule 0 x 724 [7,1,9,10] + CRUSH rule 0 x 725 [11,12,7,15] + CRUSH rule 0 x 726 [7,14,4,3] + CRUSH rule 0 x 727 [2,5,1,11] + CRUSH rule 0 x 728 [13,11,4,6] + CRUSH rule 0 x 729 [15,11,4,6] + CRUSH rule 0 x 730 [3,7,1,13] + CRUSH rule 0 x 731 [9,1,6,5] + CRUSH rule 0 x 732 [1,2,10,13] + CRUSH rule 0 x 733 [11,3,5,6] + CRUSH rule 0 x 734 [14,3,11,7] + CRUSH rule 0 x 735 [6,9,2,10] + CRUSH rule 0 x 736 [3,9,1,11] + CRUSH rule 0 x 737 [1,4,2,12] + CRUSH rule 0 x 738 [11,15,7,4] + CRUSH rule 0 x 739 [11,12,6,2] + CRUSH rule 0 x 740 [7,9,10,13] + CRUSH rule 0 x 741 [12,11,7,15] + CRUSH rule 0 x 742 [9,7,4,11] + CRUSH rule 0 x 743 [5,13,9,15] + CRUSH rule 0 x 744 [6,2,13,1] + CRUSH rule 0 x 745 [3,6,1,4] + CRUSH rule 0 x 746 [3,7,9,10] + CRUSH rule 0 x 747 [15,11,5,2] + CRUSH rule 0 x 748 [6,10,13,2] + CRUSH rule 0 x 749 [14,9,10,7] + CRUSH rule 0 x 750 [1,14,6,5] + CRUSH rule 0 x 751 [15,1,6,9] + CRUSH rule 0 x 752 [13,1,7,3] + CRUSH rule 0 x 753 [4,11,1,3] + CRUSH rule 0 x 754 [14,12,11,4] + CRUSH rule 0 x 755 [13,6,1,10] + CRUSH rule 0 x 756 [3,4,14,6] + CRUSH rule 0 x 757 [10,6,1,4] + CRUSH rule 0 x 758 [6,3,4,10] + CRUSH rule 0 x 759 [5,7,3,14] + CRUSH rule 0 x 760 [1,15,10,12] + CRUSH rule 0 x 761 [2,12,1,14] + CRUSH rule 0 x 762 [1,4,10,9] + CRUSH rule 0 x 763 [4,13,1,14] + CRUSH rule 0 x 764 [1,14,6,13] + CRUSH rule 0 x 765 [9,15,2,13] + CRUSH rule 0 x 766 [11,2,7,15] + CRUSH rule 0 x 767 [6,11,4,3] + CRUSH rule 0 x 768 [2,12,15,7] + CRUSH rule 0 x 769 [15,1,9,2] + CRUSH rule 0 x 770 [15,13,4,6] + CRUSH rule 0 x 771 [9,2,12,11] + CRUSH rule 0 x 772 [4,3,13,11] + CRUSH rule 0 x 773 [3,7,4,15] + CRUSH rule 0 x 774 [12,6,3,15] + CRUSH rule 0 x 775 [5,10,14,2] + CRUSH rule 0 x 776 [10,15,3,9] + CRUSH rule 0 x 777 [11,13,4,7] + CRUSH rule 0 x 778 [13,1,9,11] + CRUSH rule 0 x 779 [5,11,1,14] + CRUSH rule 0 x 780 [13,9,3,6] + CRUSH rule 0 x 781 [5,7,14,3] + CRUSH rule 0 x 782 [2,15,9,7] + CRUSH rule 0 x 783 [12,7,5,14] + CRUSH rule 0 x 784 [14,1,10,13] + CRUSH rule 0 x 785 [6,12,1,2] + CRUSH rule 0 x 786 [10,5,2,15] + CRUSH rule 0 x 787 [1,12,10,2] + CRUSH rule 0 x 788 [4,2,9,13] + CRUSH rule 0 x 789 [9,2,14,7] + CRUSH rule 0 x 790 [15,2,7,4] + CRUSH rule 0 x 791 [9,4,7,13] + CRUSH rule 0 x 792 [6,4,15,10] + CRUSH rule 0 x 793 [15,9,6,2] + CRUSH rule 0 x 794 [5,12,2,14] + CRUSH rule 0 x 795 [6,14,12,4] + CRUSH rule 0 x 796 [11,2,12,6] + CRUSH rule 0 x 797 [14,3,7,1] + CRUSH rule 0 x 798 [5,11,6,13] + CRUSH rule 0 x 799 [2,9,14,4] + CRUSH rule 0 x 800 [6,3,4,11] + CRUSH rule 0 x 801 [2,5,6,13] + CRUSH rule 0 x 802 [1,4,12,7] + CRUSH rule 0 x 803 [7,2,4,1] + CRUSH rule 0 x 804 [5,14,9,7] + CRUSH rule 0 x 805 [13,4,3,1] + CRUSH rule 0 x 806 [6,2,13,4] + CRUSH rule 0 x 807 [14,2,7,4] + CRUSH rule 0 x 808 [2,15,12,7] + CRUSH rule 0 x 809 [1,11,7,12] + CRUSH rule 0 x 810 [2,5,9,12] + CRUSH rule 0 x 811 [15,6,3,10] + CRUSH rule 0 x 812 [7,11,2,14] + CRUSH rule 0 x 813 [4,10,13,14] + CRUSH rule 0 x 814 [13,4,9,3] + CRUSH rule 0 x 815 [15,12,9,4] + CRUSH rule 0 x 816 [14,10,13,7] + CRUSH rule 0 x 817 [10,7,2,15] + CRUSH rule 0 x 818 [15,2,11,4] + CRUSH rule 0 x 819 [5,12,10,6] + CRUSH rule 0 x 820 [3,6,9,12] + CRUSH rule 0 x 821 [15,10,9,13] + CRUSH rule 0 x 822 [10,13,2,9] + CRUSH rule 0 x 823 [2,6,12,10] + CRUSH rule 0 x 824 [3,7,9,13] + CRUSH rule 0 x 825 [10,5,14,6] + CRUSH rule 0 x 826 [5,2,11,15] + CRUSH rule 0 x 827 [13,5,1,3] + CRUSH rule 0 x 828 [12,6,10,5] + CRUSH rule 0 x 829 [13,6,15,10] + CRUSH rule 0 x 830 [15,13,2,9] + CRUSH rule 0 x 831 [1,4,11,12] + CRUSH rule 0 x 832 [14,11,13,2] + CRUSH rule 0 x 833 [9,13,3,11] + CRUSH rule 0 x 834 [9,7,5,1] + CRUSH rule 0 x 835 [14,3,13,6] + CRUSH rule 0 x 836 [3,9,10,13] + CRUSH rule 0 x 837 [15,12,11,2] + CRUSH rule 0 x 838 [12,14,9,2] + CRUSH rule 0 x 839 [3,4,6,10] + CRUSH rule 0 x 840 [10,15,12,4] + CRUSH rule 0 x 841 [3,5,7,12] + CRUSH rule 0 x 842 [9,13,2,6] + CRUSH rule 0 x 843 [14,7,4,9] + CRUSH rule 0 x 844 [7,1,4,15] + CRUSH rule 0 x 845 [13,6,1,15] + CRUSH rule 0 x 846 [3,7,15,13] + CRUSH rule 0 x 847 [12,15,11,5] + CRUSH rule 0 x 848 [11,13,1,14] + CRUSH rule 0 x 849 [3,15,11,9] + CRUSH rule 0 x 850 [1,3,10,6] + CRUSH rule 0 x 851 [14,4,3,6] + CRUSH rule 0 x 852 [9,12,4,7] + CRUSH rule 0 x 853 [13,14,6,11] + CRUSH rule 0 x 854 [7,11,12,1] + CRUSH rule 0 x 855 [14,4,12,6] + CRUSH rule 0 x 856 [5,10,7,3] + CRUSH rule 0 x 857 [4,3,13,11] + CRUSH rule 0 x 858 [5,15,6,3] + CRUSH rule 0 x 859 [5,15,6,2] + CRUSH rule 0 x 860 [11,14,1,12] + CRUSH rule 0 x 861 [13,7,4,10] + CRUSH rule 0 x 862 [5,10,9,7] + CRUSH rule 0 x 863 [11,6,3,9] + CRUSH rule 0 x 864 [6,13,4,2] + CRUSH rule 0 x 865 [4,1,14,11] + CRUSH rule 0 x 866 [2,13,4,15] + CRUSH rule 0 x 867 [12,2,9,10] + CRUSH rule 0 x 868 [14,11,7,2] + CRUSH rule 0 x 869 [10,13,7,14] + CRUSH rule 0 x 870 [14,9,11,4] + CRUSH rule 0 x 871 [6,2,1,4] + CRUSH rule 0 x 872 [6,1,15,3] + CRUSH rule 0 x 873 [2,5,12,10] + CRUSH rule 0 x 874 [12,4,7,2] + CRUSH rule 0 x 875 [10,6,14,1] + CRUSH rule 0 x 876 [14,7,13,3] + CRUSH rule 0 x 877 [15,11,13,9] + CRUSH rule 0 x 878 [7,14,3,13] + CRUSH rule 0 x 879 [12,2,7,4] + CRUSH rule 0 x 880 [2,12,10,7] + CRUSH rule 0 x 881 [6,3,1,11] + CRUSH rule 0 x 882 [11,13,7,1] + CRUSH rule 0 x 883 [13,1,3,10] + CRUSH rule 0 x 884 [6,15,4,9] + CRUSH rule 0 x 885 [14,7,9,4] + CRUSH rule 0 x 886 [13,11,4,2] + CRUSH rule 0 x 887 [14,4,12,11] + CRUSH rule 0 x 888 [10,12,7,15] + CRUSH rule 0 x 889 [15,13,4,1] + CRUSH rule 0 x 890 [10,12,14,2] + CRUSH rule 0 x 891 [9,5,11,6] + CRUSH rule 0 x 892 [12,15,2,4] + CRUSH rule 0 x 893 [1,3,5,9] + CRUSH rule 0 x 894 [7,2,11,13] + CRUSH rule 0 x 895 [2,1,11,5] + CRUSH rule 0 x 896 [9,1,14,10] + CRUSH rule 0 x 897 [7,5,14,3] + CRUSH rule 0 x 898 [10,6,12,9] + CRUSH rule 0 x 899 [1,11,5,3] + CRUSH rule 0 x 900 [2,9,10,7] + CRUSH rule 0 x 901 [9,12,11,3] + CRUSH rule 0 x 902 [4,2,6,15] + CRUSH rule 0 x 903 [14,10,3,1] + CRUSH rule 0 x 904 [15,12,4,9] + CRUSH rule 0 x 905 [12,6,11,3] + CRUSH rule 0 x 906 [14,11,12,2] + CRUSH rule 0 x 907 [7,12,3,9] + CRUSH rule 0 x 908 [2,15,9,6] + CRUSH rule 0 x 909 [10,14,1,13] + CRUSH rule 0 x 910 [12,7,4,15] + CRUSH rule 0 x 911 [11,15,2,4] + CRUSH rule 0 x 912 [6,4,14,13] + CRUSH rule 0 x 913 [4,6,10,1] + CRUSH rule 0 x 914 [4,15,2,10] + CRUSH rule 0 x 915 [12,14,1,9] + CRUSH rule 0 x 916 [3,1,11,5] + CRUSH rule 0 x 917 [1,15,6,5] + CRUSH rule 0 x 918 [7,14,11,4] + CRUSH rule 0 x 919 [10,7,3,13] + CRUSH rule 0 x 920 [4,2,10,15] + CRUSH rule 0 x 921 [1,11,6,13] + CRUSH rule 0 x 922 [6,4,14,13] + CRUSH rule 0 x 923 [12,2,5,14] + CRUSH rule 0 x 924 [6,2,14,13] + CRUSH rule 0 x 925 [12,15,2,10] + CRUSH rule 0 x 926 [3,13,10,1] + CRUSH rule 0 x 927 [6,5,1,11] + CRUSH rule 0 x 928 [13,1,3,9] + CRUSH rule 0 x 929 [10,7,1,5] + CRUSH rule 0 x 930 [7,15,10,5] + CRUSH rule 0 x 931 [6,15,11,9] + CRUSH rule 0 x 932 [13,2,5,11] + CRUSH rule 0 x 933 [12,7,14,10] + CRUSH rule 0 x 934 [12,2,5,7] + CRUSH rule 0 x 935 [6,11,1,14] + CRUSH rule 0 x 936 [9,12,7,5] + CRUSH rule 0 x 937 [14,2,11,1] + CRUSH rule 0 x 938 [14,3,5,11] + CRUSH rule 0 x 939 [6,4,14,9] + CRUSH rule 0 x 940 [13,11,4,2] + CRUSH rule 0 x 941 [3,12,4,7] + CRUSH rule 0 x 942 [15,12,10,4] + CRUSH rule 0 x 943 [10,2,4,9] + CRUSH rule 0 x 944 [2,9,4,7] + CRUSH rule 0 x 945 [10,15,2,9] + CRUSH rule 0 x 946 [11,15,7,12] + CRUSH rule 0 x 947 [11,3,14,1] + CRUSH rule 0 x 948 [7,13,11,5] + CRUSH rule 0 x 949 [9,1,12,5] + CRUSH rule 0 x 950 [9,15,13,6] + CRUSH rule 0 x 951 [2,6,12,9] + CRUSH rule 0 x 952 [9,7,15,3] + CRUSH rule 0 x 953 [1,3,6,10] + CRUSH rule 0 x 954 [10,2,14,9] + CRUSH rule 0 x 955 [7,14,3,1] + CRUSH rule 0 x 956 [1,6,11,5] + CRUSH rule 0 x 957 [14,11,1,12] + CRUSH rule 0 x 958 [15,4,3,11] + CRUSH rule 0 x 959 [2,1,12,15] + CRUSH rule 0 x 960 [2,6,11,13] + CRUSH rule 0 x 961 [3,13,11,9] + CRUSH rule 0 x 962 [5,11,3,14] + CRUSH rule 0 x 963 [13,10,15,4] + CRUSH rule 0 x 964 [7,11,4,9] + CRUSH rule 0 x 965 [12,2,9,7] + CRUSH rule 0 x 966 [12,14,9,4] + CRUSH rule 0 x 967 [7,5,3,10] + CRUSH rule 0 x 968 [12,15,4,9] + CRUSH rule 0 x 969 [11,4,7,1] + CRUSH rule 0 x 970 [5,12,10,1] + CRUSH rule 0 x 971 [1,9,4,12] + CRUSH rule 0 x 972 [12,3,14,5] + CRUSH rule 0 x 973 [1,10,4,12] + CRUSH rule 0 x 974 [7,11,1,2] + CRUSH rule 0 x 975 [7,9,15,12] + CRUSH rule 0 x 976 [7,3,15,5] + CRUSH rule 0 x 977 [14,3,6,10] + CRUSH rule 0 x 978 [12,5,11,1] + CRUSH rule 0 x 979 [5,1,13,6] + CRUSH rule 0 x 980 [15,11,5,6] + CRUSH rule 0 x 981 [5,11,15,12] + CRUSH rule 0 x 982 [2,6,14,11] + CRUSH rule 0 x 983 [3,12,10,9] + CRUSH rule 0 x 984 [15,13,1,10] + CRUSH rule 0 x 985 [11,2,15,1] + CRUSH rule 0 x 986 [6,13,9,1] + CRUSH rule 0 x 987 [13,14,5,10] + CRUSH rule 0 x 988 [12,9,10,14] + CRUSH rule 0 x 989 [7,4,3,15] + CRUSH rule 0 x 990 [1,10,9,13] + CRUSH rule 0 x 991 [7,11,1,14] + CRUSH rule 0 x 992 [9,10,2,13] + CRUSH rule 0 x 993 [6,10,14,12] + CRUSH rule 0 x 994 [3,13,15,4] + CRUSH rule 0 x 995 [15,6,12,2] + CRUSH rule 0 x 996 [15,10,5,3] + CRUSH rule 0 x 997 [15,2,1,12] + CRUSH rule 0 x 998 [6,1,9,5] + CRUSH rule 0 x 999 [9,10,15,5] + CRUSH rule 0 x 1000 [14,2,9,4] + CRUSH rule 0 x 1001 [11,14,4,2] + CRUSH rule 0 x 1002 [1,10,14,2] + CRUSH rule 0 x 1003 [10,7,5,14] + CRUSH rule 0 x 1004 [15,1,4,6] + CRUSH rule 0 x 1005 [6,12,2,10] + CRUSH rule 0 x 1006 [10,12,15,1] + CRUSH rule 0 x 1007 [1,7,13,14] + CRUSH rule 0 x 1008 [7,4,9,11] + CRUSH rule 0 x 1009 [5,2,11,7] + CRUSH rule 0 x 1010 [10,2,15,6] + CRUSH rule 0 x 1011 [6,3,12,1] + CRUSH rule 0 x 1012 [12,6,9,15] + CRUSH rule 0 x 1013 [2,14,12,4] + CRUSH rule 0 x 1014 [1,13,7,2] + CRUSH rule 0 x 1015 [12,6,10,1] + CRUSH rule 0 x 1016 [10,13,14,3] + CRUSH rule 0 x 1017 [5,11,14,7] + CRUSH rule 0 x 1018 [13,11,14,1] + CRUSH rule 0 x 1019 [10,13,14,7] + CRUSH rule 0 x 1020 [3,1,13,4] + CRUSH rule 0 x 1021 [2,11,14,9] + CRUSH rule 0 x 1022 [15,5,7,2] + CRUSH rule 0 x 1023 [15,2,9,12] + rule 0 (replicated_ruleset) num_rep 4 result size == 4:\t1024/1024 (esc) + CRUSH rule 0 x 0 [7,10,3,15,12] + CRUSH rule 0 x 1 [10,15,1,2,13] + CRUSH rule 0 x 2 [1,12,2,6,5] + CRUSH rule 0 x 3 [15,4,10,2,9] + CRUSH rule 0 x 4 [14,2,10,1,9] + CRUSH rule 0 x 5 [7,4,11,2,13] + CRUSH rule 0 x 6 [12,6,10,9,3] + CRUSH rule 0 x 7 [9,2,6,12,11] + CRUSH rule 0 x 8 [10,2,15,1,4] + CRUSH rule 0 x 9 [7,1,14,2,11] + CRUSH rule 0 x 10 [10,14,4,1,2] + CRUSH rule 0 x 11 [13,9,14,7,5] + CRUSH rule 0 x 12 [7,1,2,5,13] + CRUSH rule 0 x 13 [3,5,12,7,9] + CRUSH rule 0 x 14 [13,5,2,7,10] + CRUSH rule 0 x 15 [15,1,9,6,13] + CRUSH rule 0 x 16 [7,11,14,2,13] + CRUSH rule 0 x 17 [10,1,13,2,4] + CRUSH rule 0 x 18 [1,7,3,10,5] + CRUSH rule 0 x 19 [7,12,2,4,15] + CRUSH rule 0 x 20 [14,12,3,10,9] + CRUSH rule 0 x 21 [3,12,1,10,4] + CRUSH rule 0 x 22 [6,3,13,11,4] + CRUSH rule 0 x 23 [10,5,13,9,3] + CRUSH rule 0 x 24 [12,11,3,1,9] + CRUSH rule 0 x 25 [7,12,15,1,3] + CRUSH rule 0 x 26 [1,7,13,2,14] + CRUSH rule 0 x 27 [3,6,15,4,13] + CRUSH rule 0 x 28 [14,4,3,9,6] + CRUSH rule 0 x 29 [5,14,12,11,6] + CRUSH rule 0 x 30 [2,5,6,9,1] + CRUSH rule 0 x 31 [5,15,10,1,9] + CRUSH rule 0 x 32 [9,10,2,1,13] + CRUSH rule 0 x 33 [13,4,9,2,7] + CRUSH rule 0 x 34 [13,15,2,4,1] + CRUSH rule 0 x 35 [4,14,3,13,10] + CRUSH rule 0 x 36 [3,12,9,7,5] + CRUSH rule 0 x 37 [9,2,6,14,11] + CRUSH rule 0 x 38 [3,4,13,10,9] + CRUSH rule 0 x 39 [12,7,14,11,1] + CRUSH rule 0 x 40 [10,1,9,5,15] + CRUSH rule 0 x 41 [4,9,11,1,14] + CRUSH rule 0 x 42 [3,6,14,10,12] + CRUSH rule 0 x 43 [10,5,15,7,2] + CRUSH rule 0 x 44 [11,4,13,3,7] + CRUSH rule 0 x 45 [11,12,15,9,1] + CRUSH rule 0 x 46 [6,9,2,14,11] + CRUSH rule 0 x 47 [3,9,6,4,13] + CRUSH rule 0 x 48 [4,6,2,1,10] + CRUSH rule 0 x 49 [9,15,10,7,4] + CRUSH rule 0 x 50 [14,12,1,4,2] + CRUSH rule 0 x 51 [10,6,5,12,15] + CRUSH rule 0 x 52 [12,1,9,11,7] + CRUSH rule 0 x 53 [3,6,13,9,5] + CRUSH rule 0 x 54 [4,13,9,2,14] + CRUSH rule 0 x 55 [4,11,2,7,1] + CRUSH rule 0 x 56 [5,9,10,1,3] + CRUSH rule 0 x 57 [6,2,1,15,10] + CRUSH rule 0 x 58 [7,1,11,4,3] + CRUSH rule 0 x 59 [2,13,1,10,9] + CRUSH rule 0 x 60 [3,6,11,1,4] + CRUSH rule 0 x 61 [3,15,13,7,4] + CRUSH rule 0 x 62 [15,11,7,12,5] + CRUSH rule 0 x 63 [10,14,12,1,7] + CRUSH rule 0 x 64 [3,9,1,4,7] + CRUSH rule 0 x 65 [4,12,11,7,14] + CRUSH rule 0 x 66 [15,11,6,9,4] + CRUSH rule 0 x 67 [2,6,4,14,1] + CRUSH rule 0 x 68 [15,7,4,2,9] + CRUSH rule 0 x 69 [2,1,15,10,4] + CRUSH rule 0 x 70 [9,6,1,3,13] + CRUSH rule 0 x 71 [15,5,1,3,13] + CRUSH rule 0 x 72 [9,10,3,5,7] + CRUSH rule 0 x 73 [5,3,11,1,7] + CRUSH rule 0 x 74 [11,7,9,5,1] + CRUSH rule 0 x 75 [9,7,11,14,12] + CRUSH rule 0 x 76 [6,1,3,5,14] + CRUSH rule 0 x 77 [7,4,2,13,9] + CRUSH rule 0 x 78 [9,3,1,5,6] + CRUSH rule 0 x 79 [13,2,15,5,7] + CRUSH rule 0 x 80 [15,2,6,4,13] + CRUSH rule 0 x 81 [15,2,1,11,4] + CRUSH rule 0 x 82 [14,13,5,11,6] + CRUSH rule 0 x 83 [4,15,3,9,10] + CRUSH rule 0 x 84 [10,7,9,15,3] + CRUSH rule 0 x 85 [3,15,9,7,4] + CRUSH rule 0 x 86 [10,9,14,1,13] + CRUSH rule 0 x 87 [15,10,7,12,5] + CRUSH rule 0 x 88 [4,13,3,1,9] + CRUSH rule 0 x 89 [3,9,7,4,1] + CRUSH rule 0 x 90 [4,9,7,12,11] + CRUSH rule 0 x 91 [6,11,9,1,2] + CRUSH rule 0 x 92 [1,5,10,9,13] + CRUSH rule 0 x 93 [9,3,15,13,7] + CRUSH rule 0 x 94 [9,2,12,5,6] + CRUSH rule 0 x 95 [7,15,4,10,9] + CRUSH rule 0 x 96 [2,15,11,7,5] + CRUSH rule 0 x 97 [4,11,2,13,1] + CRUSH rule 0 x 98 [11,13,9,3,15] + CRUSH rule 0 x 99 [12,4,11,7,3] + CRUSH rule 0 x 100 [9,4,10,15,7] + CRUSH rule 0 x 101 [15,7,1,9,10] + CRUSH rule 0 x 102 [3,11,14,6,13] + CRUSH rule 0 x 103 [13,11,6,14,4] + CRUSH rule 0 x 104 [14,6,3,5,9] + CRUSH rule 0 x 105 [14,10,1,9,3] + CRUSH rule 0 x 106 [6,5,13,2,14] + CRUSH rule 0 x 107 [3,1,10,14,13] + CRUSH rule 0 x 108 [5,10,7,2,15] + CRUSH rule 0 x 109 [9,1,13,7,15] + CRUSH rule 0 x 110 [5,1,11,3,7] + CRUSH rule 0 x 111 [10,1,9,7,5] + CRUSH rule 0 x 112 [1,10,4,14,2] + CRUSH rule 0 x 113 [6,10,13,9,1] + CRUSH rule 0 x 114 [5,13,6,2,1] + CRUSH rule 0 x 115 [10,13,14,3,9] + CRUSH rule 0 x 116 [1,14,13,2,11] + CRUSH rule 0 x 117 [5,6,1,12,15] + CRUSH rule 0 x 118 [10,4,13,15,9] + CRUSH rule 0 x 119 [14,12,11,4,6] + CRUSH rule 0 x 120 [11,3,14,13,4] + CRUSH rule 0 x 121 [9,5,1,11,7] + CRUSH rule 0 x 122 [4,3,14,1,11] + CRUSH rule 0 x 123 [3,10,5,6,9] + CRUSH rule 0 x 124 [12,2,1,5,14] + CRUSH rule 0 x 125 [9,12,15,1,6] + CRUSH rule 0 x 126 [7,15,10,9,2] + CRUSH rule 0 x 127 [4,14,9,13,1] + CRUSH rule 0 x 128 [3,12,1,10,4] + CRUSH rule 0 x 129 [11,13,14,2,9] + CRUSH rule 0 x 130 [3,13,5,14,10] + CRUSH rule 0 x 131 [12,1,6,15,4] + CRUSH rule 0 x 132 [11,15,13,9,2] + CRUSH rule 0 x 133 [3,6,9,11,15] + CRUSH rule 0 x 134 [12,5,6,15,3] + CRUSH rule 0 x 135 [3,14,12,4,6] + CRUSH rule 0 x 136 [15,6,9,4,10] + CRUSH rule 0 x 137 [14,3,6,11,1] + CRUSH rule 0 x 138 [13,15,4,10,2] + CRUSH rule 0 x 139 [11,2,13,9,1] + CRUSH rule 0 x 140 [11,4,12,15,2] + CRUSH rule 0 x 141 [6,12,15,11,3] + CRUSH rule 0 x 142 [3,14,7,9,11] + CRUSH rule 0 x 143 [9,6,4,2,14] + CRUSH rule 0 x 144 [13,7,11,2,14] + CRUSH rule 0 x 145 [12,2,6,10,9] + CRUSH rule 0 x 146 [1,5,9,2,6] + CRUSH rule 0 x 147 [1,4,9,11,2] + CRUSH rule 0 x 148 [12,7,9,2,14] + CRUSH rule 0 x 149 [2,5,9,12,11] + CRUSH rule 0 x 150 [1,15,2,10,7] + CRUSH rule 0 x 151 [2,9,14,7,1] + CRUSH rule 0 x 152 [5,9,2,6,10] + CRUSH rule 0 x 153 [6,9,4,15,2] + CRUSH rule 0 x 154 [3,11,7,1,4] + CRUSH rule 0 x 155 [14,12,7,3,5] + CRUSH rule 0 x 156 [7,13,3,10,15] + CRUSH rule 0 x 157 [15,1,6,4,3] + CRUSH rule 0 x 158 [15,1,10,6,12] + CRUSH rule 0 x 159 [4,14,3,12,10] + CRUSH rule 0 x 160 [5,7,3,14,11] + CRUSH rule 0 x 161 [1,2,11,4,6] + CRUSH rule 0 x 162 [10,6,1,12,2] + CRUSH rule 0 x 163 [15,1,10,2,6] + CRUSH rule 0 x 164 [9,14,10,7,12] + CRUSH rule 0 x 165 [11,7,2,13,9] + CRUSH rule 0 x 166 [1,2,12,14,4] + CRUSH rule 0 x 167 [9,7,3,4,11] + CRUSH rule 0 x 168 [13,2,4,1,6] + CRUSH rule 0 x 169 [1,4,9,14,13] + CRUSH rule 0 x 170 [1,15,7,9,12] + CRUSH rule 0 x 171 [9,2,10,7,1] + CRUSH rule 0 x 172 [14,4,10,12,9] + CRUSH rule 0 x 173 [5,10,12,15,6] + CRUSH rule 0 x 174 [15,6,4,12,1] + CRUSH rule 0 x 175 [5,7,9,3,10] + CRUSH rule 0 x 176 [9,6,3,14,13] + CRUSH rule 0 x 177 [2,9,10,13,4] + CRUSH rule 0 x 178 [12,11,7,14,3] + CRUSH rule 0 x 179 [2,10,13,9,5] + CRUSH rule 0 x 180 [3,11,5,15,7] + CRUSH rule 0 x 181 [9,12,6,5,1] + CRUSH rule 0 x 182 [5,13,11,2,1] + CRUSH rule 0 x 183 [5,7,10,13,3] + CRUSH rule 0 x 184 [2,5,11,12,7] + CRUSH rule 0 x 185 [13,5,7,11,2] + CRUSH rule 0 x 186 [6,14,13,5,10] + CRUSH rule 0 x 187 [1,4,11,13,6] + CRUSH rule 0 x 188 [9,13,5,14,10] + CRUSH rule 0 x 189 [6,12,4,9,2] + CRUSH rule 0 x 190 [9,13,15,10,3] + CRUSH rule 0 x 191 [7,11,4,1,15] + CRUSH rule 0 x 192 [2,11,5,15,6] + CRUSH rule 0 x 193 [3,13,6,10,4] + CRUSH rule 0 x 194 [3,13,4,14,6] + CRUSH rule 0 x 195 [5,7,10,12,1] + CRUSH rule 0 x 196 [4,15,1,10,9] + CRUSH rule 0 x 197 [14,10,13,4,6] + CRUSH rule 0 x 198 [2,5,6,15,9] + CRUSH rule 0 x 199 [2,10,4,15,1] + CRUSH rule 0 x 200 [7,14,11,4,1] + CRUSH rule 0 x 201 [9,14,1,7,4] + CRUSH rule 0 x 202 [14,11,7,3,5] + CRUSH rule 0 x 203 [12,5,7,15,1] + CRUSH rule 0 x 204 [6,11,3,12,14] + CRUSH rule 0 x 205 [15,4,6,10,13] + CRUSH rule 0 x 206 [13,11,2,15,7] + CRUSH rule 0 x 207 [2,11,7,4,14] + CRUSH rule 0 x 208 [13,1,6,14,9] + CRUSH rule 0 x 209 [6,15,13,1,11] + CRUSH rule 0 x 210 [13,11,2,7,5] + CRUSH rule 0 x 211 [2,14,1,13,11] + CRUSH rule 0 x 212 [10,1,12,15,5] + CRUSH rule 0 x 213 [3,9,6,5,15] + CRUSH rule 0 x 214 [7,15,4,1,10] + CRUSH rule 0 x 215 [6,1,4,13,3] + CRUSH rule 0 x 216 [12,9,6,2,1] + CRUSH rule 0 x 217 [12,11,1,14,2] + CRUSH rule 0 x 218 [12,10,15,6,1] + CRUSH rule 0 x 219 [3,11,14,6,4] + CRUSH rule 0 x 220 [14,4,3,12,10] + CRUSH rule 0 x 221 [15,5,2,6,12] + CRUSH rule 0 x 222 [10,4,3,15,7] + CRUSH rule 0 x 223 [9,7,11,1,4] + CRUSH rule 0 x 224 [1,7,10,2,12] + CRUSH rule 0 x 225 [10,5,2,6,1] + CRUSH rule 0 x 226 [4,1,9,3,13] + CRUSH rule 0 x 227 [7,2,12,15,5] + CRUSH rule 0 x 228 [2,15,11,1,6] + CRUSH rule 0 x 229 [9,3,7,14,1] + CRUSH rule 0 x 230 [10,5,7,2,15] + CRUSH rule 0 x 231 [2,7,5,13,9] + CRUSH rule 0 x 232 [10,5,13,1,9] + CRUSH rule 0 x 233 [6,12,11,4,9] + CRUSH rule 0 x 234 [10,1,2,12,5] + CRUSH rule 0 x 235 [13,14,7,10,1] + CRUSH rule 0 x 236 [2,15,9,12,1] + CRUSH rule 0 x 237 [3,12,9,10,4] + CRUSH rule 0 x 238 [2,10,4,15,6] + CRUSH rule 0 x 239 [4,15,10,7,9] + CRUSH rule 0 x 240 [15,5,13,7,2] + CRUSH rule 0 x 241 [7,9,15,12,1] + CRUSH rule 0 x 242 [14,2,6,9,10] + CRUSH rule 0 x 243 [2,11,5,1,15] + CRUSH rule 0 x 244 [13,9,15,3,11] + CRUSH rule 0 x 245 [12,9,15,3,1] + CRUSH rule 0 x 246 [15,3,5,11,7] + CRUSH rule 0 x 247 [6,4,9,12,1] + CRUSH rule 0 x 248 [5,13,7,11,9] + CRUSH rule 0 x 249 [10,14,7,3,9] + CRUSH rule 0 x 250 [12,15,1,10,5] + CRUSH rule 0 x 251 [13,2,15,5,6] + CRUSH rule 0 x 252 [7,5,13,9,3] + CRUSH rule 0 x 253 [3,13,15,10,7] + CRUSH rule 0 x 254 [2,9,13,14,4] + CRUSH rule 0 x 255 [1,9,13,2,6] + CRUSH rule 0 x 256 [6,9,13,1,3] + CRUSH rule 0 x 257 [15,12,3,9,6] + CRUSH rule 0 x 258 [12,5,6,10,2] + CRUSH rule 0 x 259 [9,10,4,3,14] + CRUSH rule 0 x 260 [10,12,6,9,3] + CRUSH rule 0 x 261 [13,7,2,1,15] + CRUSH rule 0 x 262 [15,3,12,7,4] + CRUSH rule 0 x 263 [12,6,10,9,5] + CRUSH rule 0 x 264 [13,14,11,3,1] + CRUSH rule 0 x 265 [12,10,14,5,7] + CRUSH rule 0 x 266 [14,7,11,1,2] + CRUSH rule 0 x 267 [12,11,6,5,1] + CRUSH rule 0 x 268 [4,1,15,12,6] + CRUSH rule 0 x 269 [11,1,15,5,13] + CRUSH rule 0 x 270 [7,11,12,3,1] + CRUSH rule 0 x 271 [4,7,3,13,15] + CRUSH rule 0 x 272 [15,5,13,10,6] + CRUSH rule 0 x 273 [2,10,7,12,1] + CRUSH rule 0 x 274 [10,2,5,6,13] + CRUSH rule 0 x 275 [10,3,4,7,14] + CRUSH rule 0 x 276 [5,12,9,2,11] + CRUSH rule 0 x 277 [14,3,13,4,1] + CRUSH rule 0 x 278 [5,6,14,3,1] + CRUSH rule 0 x 279 [6,10,13,3,9] + CRUSH rule 0 x 280 [7,3,14,9,1] + CRUSH rule 0 x 281 [5,11,14,7,9] + CRUSH rule 0 x 282 [2,1,13,14,9] + CRUSH rule 0 x 283 [4,1,12,3,10] + CRUSH rule 0 x 284 [5,11,7,15,3] + CRUSH rule 0 x 285 [15,5,3,1,6] + CRUSH rule 0 x 286 [10,4,3,6,12] + CRUSH rule 0 x 287 [12,4,9,1,3] + CRUSH rule 0 x 288 [4,12,10,7,1] + CRUSH rule 0 x 289 [2,5,14,9,13] + CRUSH rule 0 x 290 [12,2,5,6,15] + CRUSH rule 0 x 291 [7,11,1,14,5] + CRUSH rule 0 x 292 [4,10,6,3,14] + CRUSH rule 0 x 293 [6,5,11,1,2] + CRUSH rule 0 x 294 [9,12,3,14,6] + CRUSH rule 0 x 295 [6,10,3,14,9] + CRUSH rule 0 x 296 [3,1,13,7,14] + CRUSH rule 0 x 297 [6,13,4,14,10] + CRUSH rule 0 x 298 [14,9,13,1,4] + CRUSH rule 0 x 299 [14,12,11,6,4] + CRUSH rule 0 x 300 [15,7,10,5,1] + CRUSH rule 0 x 301 [9,11,7,1,13] + CRUSH rule 0 x 302 [9,7,1,13,5] + CRUSH rule 0 x 303 [4,13,3,7,10] + CRUSH rule 0 x 304 [6,9,2,11,15] + CRUSH rule 0 x 305 [13,7,5,11,2] + CRUSH rule 0 x 306 [10,12,4,6,9] + CRUSH rule 0 x 307 [11,12,15,5,6] + CRUSH rule 0 x 308 [12,14,10,9,1] + CRUSH rule 0 x 309 [9,3,12,5,11] + CRUSH rule 0 x 310 [3,1,5,10,14] + CRUSH rule 0 x 311 [3,9,7,1,14] + CRUSH rule 0 x 312 [15,13,9,7,5] + CRUSH rule 0 x 313 [9,15,3,7,5] + CRUSH rule 0 x 314 [2,15,9,5,6] + CRUSH rule 0 x 315 [15,2,13,1,11] + CRUSH rule 0 x 316 [4,9,11,2,12] + CRUSH rule 0 x 317 [1,5,3,13,15] + CRUSH rule 0 x 318 [4,1,15,11,9] + CRUSH rule 0 x 319 [2,15,4,1,11] + CRUSH rule 0 x 320 [5,7,13,9,11] + CRUSH rule 0 x 321 [1,6,11,15,5] + CRUSH rule 0 x 322 [13,7,5,3,14] + CRUSH rule 0 x 323 [7,4,10,1,2] + CRUSH rule 0 x 324 [5,6,10,15,2] + CRUSH rule 0 x 325 [9,10,14,5,1] + CRUSH rule 0 x 326 [11,7,13,4,2] + CRUSH rule 0 x 327 [12,5,10,14,3] + CRUSH rule 0 x 328 [5,2,6,14,1] + CRUSH rule 0 x 329 [2,6,15,5,9] + CRUSH rule 0 x 330 [3,9,11,13,1] + CRUSH rule 0 x 331 [12,14,6,3,1] + CRUSH rule 0 x 332 [10,12,6,15,9] + CRUSH rule 0 x 333 [6,5,3,12,14] + CRUSH rule 0 x 334 [4,9,2,12,7] + CRUSH rule 0 x 335 [11,7,1,5,13] + CRUSH rule 0 x 336 [6,14,13,2,5] + CRUSH rule 0 x 337 [15,11,3,7,12] + CRUSH rule 0 x 338 [10,5,3,6,15] + CRUSH rule 0 x 339 [11,14,13,5,3] + CRUSH rule 0 x 340 [11,6,12,4,9] + CRUSH rule 0 x 341 [7,5,2,10,14] + CRUSH rule 0 x 342 [12,14,1,9,2] + CRUSH rule 0 x 343 [12,14,9,6,10] + CRUSH rule 0 x 344 [9,11,5,2,14] + CRUSH rule 0 x 345 [14,2,11,9,6] + CRUSH rule 0 x 346 [5,3,14,10,7] + CRUSH rule 0 x 347 [10,2,12,6,9] + CRUSH rule 0 x 348 [7,9,10,1,14] + CRUSH rule 0 x 349 [9,6,10,12,1] + CRUSH rule 0 x 350 [13,9,15,4,10] + CRUSH rule 0 x 351 [13,5,15,3,1] + CRUSH rule 0 x 352 [1,12,11,9,4] + CRUSH rule 0 x 353 [10,14,12,2,9] + CRUSH rule 0 x 354 [6,3,15,10,9] + CRUSH rule 0 x 355 [13,14,6,10,2] + CRUSH rule 0 x 356 [15,13,2,9,6] + CRUSH rule 0 x 357 [4,11,1,13,3] + CRUSH rule 0 x 358 [12,7,2,9,1] + CRUSH rule 0 x 359 [5,15,7,11,3] + CRUSH rule 0 x 360 [13,10,1,2,6] + CRUSH rule 0 x 361 [5,3,13,6,1] + CRUSH rule 0 x 362 [2,9,11,13,1] + CRUSH rule 0 x 363 [7,12,3,9,15] + CRUSH rule 0 x 364 [2,12,6,9,5] + CRUSH rule 0 x 365 [13,5,11,15,6] + CRUSH rule 0 x 366 [12,7,3,14,5] + CRUSH rule 0 x 367 [7,13,3,1,5] + CRUSH rule 0 x 368 [7,9,10,15,3] + CRUSH rule 0 x 369 [7,5,3,13,14] + CRUSH rule 0 x 370 [4,7,14,1,2] + CRUSH rule 0 x 371 [1,7,12,3,4] + CRUSH rule 0 x 372 [10,4,3,14,6] + CRUSH rule 0 x 373 [15,5,2,6,13] + CRUSH rule 0 x 374 [3,15,12,5,1] + CRUSH rule 0 x 375 [5,2,14,1,6] + CRUSH rule 0 x 376 [5,14,10,13,3] + CRUSH rule 0 x 377 [1,15,2,4,9] + CRUSH rule 0 x 378 [9,12,2,15,1] + CRUSH rule 0 x 379 [11,2,15,5,7] + CRUSH rule 0 x 380 [6,1,12,11,2] + CRUSH rule 0 x 381 [15,13,7,5,10] + CRUSH rule 0 x 382 [14,3,1,4,13] + CRUSH rule 0 x 383 [3,6,11,4,13] + CRUSH rule 0 x 384 [4,13,6,3,15] + CRUSH rule 0 x 385 [4,6,15,3,10] + CRUSH rule 0 x 386 [14,3,11,13,5] + CRUSH rule 0 x 387 [1,11,5,7,9] + CRUSH rule 0 x 388 [2,6,11,9,15] + CRUSH rule 0 x 389 [12,7,2,4,15] + CRUSH rule 0 x 390 [2,11,13,7,5] + CRUSH rule 0 x 391 [3,4,9,13,7] + CRUSH rule 0 x 392 [11,5,14,7,1] + CRUSH rule 0 x 393 [2,14,5,9,7] + CRUSH rule 0 x 394 [4,9,3,15,13] + CRUSH rule 0 x 395 [10,13,5,15,6] + CRUSH rule 0 x 396 [2,12,15,9,4] + CRUSH rule 0 x 397 [1,14,9,4,12] + CRUSH rule 0 x 398 [9,2,1,5,12] + CRUSH rule 0 x 399 [5,9,14,3,1] + CRUSH rule 0 x 400 [10,6,2,4,15] + CRUSH rule 0 x 401 [6,9,11,12,4] + CRUSH rule 0 x 402 [4,7,9,2,13] + CRUSH rule 0 x 403 [7,15,13,3,5] + CRUSH rule 0 x 404 [14,12,7,9,2] + CRUSH rule 0 x 405 [9,15,11,2,4] + CRUSH rule 0 x 406 [12,14,9,2,7] + CRUSH rule 0 x 407 [9,5,12,10,15] + CRUSH rule 0 x 408 [7,1,5,2,10] + CRUSH rule 0 x 409 [11,2,4,13,1] + CRUSH rule 0 x 410 [6,4,14,2,12] + CRUSH rule 0 x 411 [13,11,15,6,4] + CRUSH rule 0 x 412 [5,9,6,11,14] + CRUSH rule 0 x 413 [13,5,3,11,6] + CRUSH rule 0 x 414 [3,11,9,13,4] + CRUSH rule 0 x 415 [6,10,14,5,1] + CRUSH rule 0 x 416 [13,1,4,7,2] + CRUSH rule 0 x 417 [4,12,1,15,2] + CRUSH rule 0 x 418 [14,5,10,2,6] + CRUSH rule 0 x 419 [5,14,10,9,2] + CRUSH rule 0 x 420 [2,4,9,11,6] + CRUSH rule 0 x 421 [15,4,10,3,9] + CRUSH rule 0 x 422 [4,11,2,7,13] + CRUSH rule 0 x 423 [3,15,12,6,5] + CRUSH rule 0 x 424 [6,10,12,2,5] + CRUSH rule 0 x 425 [11,15,2,13,5] + CRUSH rule 0 x 426 [12,4,7,1,9] + CRUSH rule 0 x 427 [14,10,3,1,9] + CRUSH rule 0 x 428 [12,7,9,4,2] + CRUSH rule 0 x 429 [3,4,9,7,11] + CRUSH rule 0 x 430 [3,5,10,13,1] + CRUSH rule 0 x 431 [9,3,7,1,12] + CRUSH rule 0 x 432 [4,1,12,7,15] + CRUSH rule 0 x 433 [4,11,12,15,7] + CRUSH rule 0 x 434 [2,14,9,1,5] + CRUSH rule 0 x 435 [13,11,5,6,9] + CRUSH rule 0 x 436 [9,15,10,2,4] + CRUSH rule 0 x 437 [9,6,3,14,10] + CRUSH rule 0 x 438 [7,2,13,4,11] + CRUSH rule 0 x 439 [7,14,4,3,12] + CRUSH rule 0 x 440 [14,11,9,2,7] + CRUSH rule 0 x 441 [2,4,11,9,13] + CRUSH rule 0 x 442 [10,13,9,7,15] + CRUSH rule 0 x 443 [12,15,10,9,2] + CRUSH rule 0 x 444 [4,13,7,14,3] + CRUSH rule 0 x 445 [4,2,15,7,1] + CRUSH rule 0 x 446 [12,10,6,9,4] + CRUSH rule 0 x 447 [15,7,13,1,4] + CRUSH rule 0 x 448 [5,2,13,7,15] + CRUSH rule 0 x 449 [14,5,3,12,10] + CRUSH rule 0 x 450 [2,4,6,9,15] + CRUSH rule 0 x 451 [6,14,11,3,9] + CRUSH rule 0 x 452 [14,9,10,4,2] + CRUSH rule 0 x 453 [5,15,13,2,6] + CRUSH rule 0 x 454 [10,4,2,6,15] + CRUSH rule 0 x 455 [6,13,2,4,10] + CRUSH rule 0 x 456 [5,7,13,1,11] + CRUSH rule 0 x 457 [9,1,5,7,11] + CRUSH rule 0 x 458 [9,11,15,4,7] + CRUSH rule 0 x 459 [13,15,11,1,5] + CRUSH rule 0 x 460 [5,12,10,15,7] + CRUSH rule 0 x 461 [4,3,9,13,15] + CRUSH rule 0 x 462 [4,7,12,14,11] + CRUSH rule 0 x 463 [4,12,14,11,2] + CRUSH rule 0 x 464 [4,2,15,10,1] + CRUSH rule 0 x 465 [5,10,9,7,13] + CRUSH rule 0 x 466 [13,5,2,15,9] + CRUSH rule 0 x 467 [13,6,14,3,9] + CRUSH rule 0 x 468 [10,7,12,14,4] + CRUSH rule 0 x 469 [4,9,6,14,12] + CRUSH rule 0 x 470 [3,9,12,15,5] + CRUSH rule 0 x 471 [6,1,5,14,13] + CRUSH rule 0 x 472 [2,14,7,5,13] + CRUSH rule 0 x 473 [15,10,6,9,4] + CRUSH rule 0 x 474 [15,10,4,12,6] + CRUSH rule 0 x 475 [10,5,12,9,14] + CRUSH rule 0 x 476 [3,6,10,12,1] + CRUSH rule 0 x 477 [6,13,5,15,11] + CRUSH rule 0 x 478 [4,15,1,3,7] + CRUSH rule 0 x 479 [13,11,1,6,14] + CRUSH rule 0 x 480 [1,13,6,4,9] + CRUSH rule 0 x 481 [15,12,7,9,1] + CRUSH rule 0 x 482 [2,12,9,1,7] + CRUSH rule 0 x 483 [10,1,4,15,9] + CRUSH rule 0 x 484 [1,4,10,13,7] + CRUSH rule 0 x 485 [9,4,3,1,14] + CRUSH rule 0 x 486 [3,10,15,9,7] + CRUSH rule 0 x 487 [12,11,4,14,7] + CRUSH rule 0 x 488 [14,4,1,9,2] + CRUSH rule 0 x 489 [11,4,2,13,15] + CRUSH rule 0 x 490 [4,9,1,3,13] + CRUSH rule 0 x 491 [1,12,5,2,14] + CRUSH rule 0 x 492 [5,7,11,3,14] + CRUSH rule 0 x 493 [12,1,4,15,3] + CRUSH rule 0 x 494 [1,7,13,4,15] + CRUSH rule 0 x 495 [3,15,7,1,9] + CRUSH rule 0 x 496 [5,3,7,13,9] + CRUSH rule 0 x 497 [13,10,3,6,5] + CRUSH rule 0 x 498 [10,6,1,5,9] + CRUSH rule 0 x 499 [14,3,12,5,1] + CRUSH rule 0 x 500 [15,9,6,12,11] + CRUSH rule 0 x 501 [10,13,1,9,3] + CRUSH rule 0 x 502 [5,1,14,11,7] + CRUSH rule 0 x 503 [15,10,7,9,1] + CRUSH rule 0 x 504 [13,2,7,1,14] + CRUSH rule 0 x 505 [12,7,5,2,14] + CRUSH rule 0 x 506 [11,7,9,14,12] + CRUSH rule 0 x 507 [4,14,13,3,9] + CRUSH rule 0 x 508 [12,1,4,9,2] + CRUSH rule 0 x 509 [4,2,6,9,14] + CRUSH rule 0 x 510 [5,3,1,12,11] + CRUSH rule 0 x 511 [2,12,10,6,14] + CRUSH rule 0 x 512 [15,11,3,5,7] + CRUSH rule 0 x 513 [4,9,11,3,13] + CRUSH rule 0 x 514 [11,9,3,4,12] + CRUSH rule 0 x 515 [12,14,6,5,3] + CRUSH rule 0 x 516 [14,11,1,12,3] + CRUSH rule 0 x 517 [11,5,6,13,9] + CRUSH rule 0 x 518 [3,5,7,12,15] + CRUSH rule 0 x 519 [12,14,2,1,4] + CRUSH rule 0 x 520 [12,4,2,10,6] + CRUSH rule 0 x 521 [11,5,9,6,15] + CRUSH rule 0 x 522 [4,12,11,1,15] + CRUSH rule 0 x 523 [3,1,5,9,15] + CRUSH rule 0 x 524 [15,9,3,11,13] + CRUSH rule 0 x 525 [3,15,11,6,9] + CRUSH rule 0 x 526 [10,2,5,13,6] + CRUSH rule 0 x 527 [3,13,4,1,9] + CRUSH rule 0 x 528 [12,7,15,10,2] + CRUSH rule 0 x 529 [6,4,10,12,2] + CRUSH rule 0 x 530 [11,9,12,7,5] + CRUSH rule 0 x 531 [9,15,4,7,2] + CRUSH rule 0 x 532 [5,3,13,7,9] + CRUSH rule 0 x 533 [12,15,1,2,7] + CRUSH rule 0 x 534 [11,9,3,7,15] + CRUSH rule 0 x 535 [11,1,3,5,14] + CRUSH rule 0 x 536 [9,1,14,13,4] + CRUSH rule 0 x 537 [15,5,13,2,7] + CRUSH rule 0 x 538 [13,5,11,2,6] + CRUSH rule 0 x 539 [10,12,6,14,1] + CRUSH rule 0 x 540 [12,15,7,3,9] + CRUSH rule 0 x 541 [2,1,6,11,14] + CRUSH rule 0 x 542 [3,9,15,5,11] + CRUSH rule 0 x 543 [4,10,9,3,6] + CRUSH rule 0 x 544 [3,15,9,11,7] + CRUSH rule 0 x 545 [14,10,7,12,4] + CRUSH rule 0 x 546 [5,15,13,7,1] + CRUSH rule 0 x 547 [5,13,7,9,3] + CRUSH rule 0 x 548 [11,7,12,15,4] + CRUSH rule 0 x 549 [14,1,4,9,13] + CRUSH rule 0 x 550 [9,15,3,13,1] + CRUSH rule 0 x 551 [11,2,15,6,13] + CRUSH rule 0 x 552 [2,11,14,1,9] + CRUSH rule 0 x 553 [11,9,14,6,4] + CRUSH rule 0 x 554 [11,14,6,4,13] + CRUSH rule 0 x 555 [6,5,10,9,14] + CRUSH rule 0 x 556 [15,6,3,13,11] + CRUSH rule 0 x 557 [12,2,5,14,10] + CRUSH rule 0 x 558 [12,1,6,15,5] + CRUSH rule 0 x 559 [2,13,5,10,14] + CRUSH rule 0 x 560 [4,9,12,6,3] + CRUSH rule 0 x 561 [12,7,1,2,5] + CRUSH rule 0 x 562 [7,13,9,14,2] + CRUSH rule 0 x 563 [15,4,3,10,13] + CRUSH rule 0 x 564 [2,13,7,1,15] + CRUSH rule 0 x 565 [3,12,4,1,14] + CRUSH rule 0 x 566 [6,14,4,2,13] + CRUSH rule 0 x 567 [15,4,11,6,3] + CRUSH rule 0 x 568 [4,14,1,6,10] + CRUSH rule 0 x 569 [11,3,15,13,5] + CRUSH rule 0 x 570 [1,10,13,4,7] + CRUSH rule 0 x 571 [10,12,14,9,4] + CRUSH rule 0 x 572 [12,14,3,10,6] + CRUSH rule 0 x 573 [7,15,11,2,12] + CRUSH rule 0 x 574 [11,14,13,1,3] + CRUSH rule 0 x 575 [5,13,15,9,6] + CRUSH rule 0 x 576 [3,15,11,9,1] + CRUSH rule 0 x 577 [13,9,6,15,3] + CRUSH rule 0 x 578 [4,10,1,2,7] + CRUSH rule 0 x 579 [13,1,15,2,10] + CRUSH rule 0 x 580 [3,12,4,1,10] + CRUSH rule 0 x 581 [7,14,12,10,1] + CRUSH rule 0 x 582 [10,5,13,14,1] + CRUSH rule 0 x 583 [4,15,1,9,10] + CRUSH rule 0 x 584 [10,1,5,13,6] + CRUSH rule 0 x 585 [5,3,6,1,11] + CRUSH rule 0 x 586 [7,10,14,12,9] + CRUSH rule 0 x 587 [11,6,9,4,1] + CRUSH rule 0 x 588 [3,12,7,15,4] + CRUSH rule 0 x 589 [9,7,12,1,10] + CRUSH rule 0 x 590 [12,1,3,9,10] + CRUSH rule 0 x 591 [2,6,14,13,9] + CRUSH rule 0 x 592 [15,12,9,7,5] + CRUSH rule 0 x 593 [13,14,5,11,9] + CRUSH rule 0 x 594 [12,14,2,9,7] + CRUSH rule 0 x 595 [12,7,10,3,1] + CRUSH rule 0 x 596 [2,7,12,11,1] + CRUSH rule 0 x 597 [15,1,2,10,7] + CRUSH rule 0 x 598 [11,5,9,14,12] + CRUSH rule 0 x 599 [13,11,1,5,6] + CRUSH rule 0 x 600 [4,12,3,10,9] + CRUSH rule 0 x 601 [13,5,15,2,1] + CRUSH rule 0 x 602 [3,11,7,1,13] + CRUSH rule 0 x 603 [3,1,4,14,10] + CRUSH rule 0 x 604 [14,2,6,1,11] + CRUSH rule 0 x 605 [2,7,12,5,14] + CRUSH rule 0 x 606 [12,15,1,5,7] + CRUSH rule 0 x 607 [3,9,10,14,7] + CRUSH rule 0 x 608 [13,10,1,7,9] + CRUSH rule 0 x 609 [14,3,7,9,11] + CRUSH rule 0 x 610 [7,10,5,1,12] + CRUSH rule 0 x 611 [13,1,5,3,10] + CRUSH rule 0 x 612 [7,1,2,13,9] + CRUSH rule 0 x 613 [10,7,14,9,5] + CRUSH rule 0 x 614 [9,4,15,3,1] + CRUSH rule 0 x 615 [9,4,11,2,1] + CRUSH rule 0 x 616 [10,14,1,5,3] + CRUSH rule 0 x 617 [15,7,2,11,12] + CRUSH rule 0 x 618 [4,2,10,6,14] + CRUSH rule 0 x 619 [15,4,3,9,6] + CRUSH rule 0 x 620 [3,7,11,14,13] + CRUSH rule 0 x 621 [3,6,4,14,1] + CRUSH rule 0 x 622 [10,2,13,5,15] + CRUSH rule 0 x 623 [4,9,14,7,3] + CRUSH rule 0 x 624 [3,9,15,6,10] + CRUSH rule 0 x 625 [11,7,3,5,13] + CRUSH rule 0 x 626 [10,12,2,1,9] + CRUSH rule 0 x 627 [1,12,10,14,3] + CRUSH rule 0 x 628 [15,13,11,4,2] + CRUSH rule 0 x 629 [5,6,15,12,1] + CRUSH rule 0 x 630 [1,4,12,9,3] + CRUSH rule 0 x 631 [5,7,1,15,12] + CRUSH rule 0 x 632 [12,3,11,9,6] + CRUSH rule 0 x 633 [14,4,3,7,10] + CRUSH rule 0 x 634 [6,9,5,3,13] + CRUSH rule 0 x 635 [6,5,2,15,9] + CRUSH rule 0 x 636 [13,6,11,3,15] + CRUSH rule 0 x 637 [3,1,10,6,9] + CRUSH rule 0 x 638 [10,15,3,5,13] + CRUSH rule 0 x 639 [6,9,14,4,3] + CRUSH rule 0 x 640 [9,6,1,11,14] + CRUSH rule 0 x 641 [10,6,5,14,1] + CRUSH rule 0 x 642 [1,15,4,6,2] + CRUSH rule 0 x 643 [3,7,5,1,10] + CRUSH rule 0 x 644 [15,13,6,9,3] + CRUSH rule 0 x 645 [14,2,4,9,10] + CRUSH rule 0 x 646 [5,13,14,1,6] + CRUSH rule 0 x 647 [10,1,9,13,6] + CRUSH rule 0 x 648 [6,5,2,14,11] + CRUSH rule 0 x 649 [3,9,13,11,4] + CRUSH rule 0 x 650 [10,9,4,15,12] + CRUSH rule 0 x 651 [3,9,5,7,14] + CRUSH rule 0 x 652 [15,9,4,6,13] + CRUSH rule 0 x 653 [11,14,1,3,6] + CRUSH rule 0 x 654 [13,6,2,10,15] + CRUSH rule 0 x 655 [6,3,4,15,12] + CRUSH rule 0 x 656 [3,15,1,4,6] + CRUSH rule 0 x 657 [11,15,3,5,7] + CRUSH rule 0 x 658 [7,2,10,12,1] + CRUSH rule 0 x 659 [2,5,14,6,10] + CRUSH rule 0 x 660 [13,14,10,6,4] + CRUSH rule 0 x 661 [7,15,3,12,11] + CRUSH rule 0 x 662 [15,2,12,5,1] + CRUSH rule 0 x 663 [14,9,13,10,5] + CRUSH rule 0 x 664 [6,10,12,4,9] + CRUSH rule 0 x 665 [2,9,12,1,7] + CRUSH rule 0 x 666 [12,3,6,1,15] + CRUSH rule 0 x 667 [1,9,12,10,2] + CRUSH rule 0 x 668 [9,5,1,2,6] + CRUSH rule 0 x 669 [9,7,14,5,11] + CRUSH rule 0 x 670 [6,10,9,13,1] + CRUSH rule 0 x 671 [6,15,5,10,13] + CRUSH rule 0 x 672 [2,9,13,1,4] + CRUSH rule 0 x 673 [7,10,5,9,15] + CRUSH rule 0 x 674 [7,12,10,1,14] + CRUSH rule 0 x 675 [9,5,1,10,6] + CRUSH rule 0 x 676 [10,12,2,1,4] + CRUSH rule 0 x 677 [2,12,1,4,10] + CRUSH rule 0 x 678 [1,2,4,10,12] + CRUSH rule 0 x 679 [5,6,12,15,9] + CRUSH rule 0 x 680 [7,11,3,1,15] + CRUSH rule 0 x 681 [6,4,3,11,14] + CRUSH rule 0 x 682 [6,1,11,15,12] + CRUSH rule 0 x 683 [6,13,2,4,9] + CRUSH rule 0 x 684 [9,11,3,7,15] + CRUSH rule 0 x 685 [5,1,15,7,9] + CRUSH rule 0 x 686 [1,9,11,14,6] + CRUSH rule 0 x 687 [7,13,3,5,11] + CRUSH rule 0 x 688 [11,9,1,14,3] + CRUSH rule 0 x 689 [5,2,9,12,1] + CRUSH rule 0 x 690 [9,7,10,3,13] + CRUSH rule 0 x 691 [11,15,9,5,7] + CRUSH rule 0 x 692 [15,5,1,2,9] + CRUSH rule 0 x 693 [5,6,12,15,2] + CRUSH rule 0 x 694 [4,7,1,10,12] + CRUSH rule 0 x 695 [6,13,14,10,9] + CRUSH rule 0 x 696 [1,2,4,14,7] + CRUSH rule 0 x 697 [13,11,3,6,4] + CRUSH rule 0 x 698 [11,13,4,2,6] + CRUSH rule 0 x 699 [7,14,12,4,2] + CRUSH rule 0 x 700 [12,14,11,9,4] + CRUSH rule 0 x 701 [3,13,1,14,4] + CRUSH rule 0 x 702 [3,12,15,6,5] + CRUSH rule 0 x 703 [15,11,13,3,4] + CRUSH rule 0 x 704 [6,4,2,15,11] + CRUSH rule 0 x 705 [14,6,11,5,1] + CRUSH rule 0 x 706 [1,12,3,6,4] + CRUSH rule 0 x 707 [4,7,14,3,10] + CRUSH rule 0 x 708 [3,10,5,1,15] + CRUSH rule 0 x 709 [11,12,3,7,5] + CRUSH rule 0 x 710 [14,2,11,9,5] + CRUSH rule 0 x 711 [14,3,9,10,12] + CRUSH rule 0 x 712 [12,3,11,15,9] + CRUSH rule 0 x 713 [11,9,3,15,13] + CRUSH rule 0 x 714 [12,1,9,7,2] + CRUSH rule 0 x 715 [6,1,14,4,11] + CRUSH rule 0 x 716 [11,13,9,14,5] + CRUSH rule 0 x 717 [12,4,10,9,15] + CRUSH rule 0 x 718 [7,15,5,2,11] + CRUSH rule 0 x 719 [5,15,13,3,1] + CRUSH rule 0 x 720 [4,13,10,2,7] + CRUSH rule 0 x 721 [11,3,14,9,1] + CRUSH rule 0 x 722 [2,4,6,1,9] + CRUSH rule 0 x 723 [2,1,12,15,11] + CRUSH rule 0 x 724 [7,1,9,10,5] + CRUSH rule 0 x 725 [11,12,7,15,4] + CRUSH rule 0 x 726 [7,14,4,3,11] + CRUSH rule 0 x 727 [2,5,1,11,15] + CRUSH rule 0 x 728 [13,11,4,6,15] + CRUSH rule 0 x 729 [15,11,4,6,2] + CRUSH rule 0 x 730 [3,7,1,13,11] + CRUSH rule 0 x 731 [9,1,6,5,2] + CRUSH rule 0 x 732 [1,2,10,13,9] + CRUSH rule 0 x 733 [11,3,5,6,1] + CRUSH rule 0 x 734 [14,3,11,7,12] + CRUSH rule 0 x 735 [6,9,2,10,13] + CRUSH rule 0 x 736 [3,9,1,11,7] + CRUSH rule 0 x 737 [1,4,2,12,9] + CRUSH rule 0 x 738 [11,15,7,4,9] + CRUSH rule 0 x 739 [11,12,6,2,4] + CRUSH rule 0 x 740 [7,9,10,13,1] + CRUSH rule 0 x 741 [12,11,7,15,2] + CRUSH rule 0 x 742 [9,7,4,11,12] + CRUSH rule 0 x 743 [5,13,9,15,10] + CRUSH rule 0 x 744 [6,2,13,1,14] + CRUSH rule 0 x 745 [3,6,1,4,11] + CRUSH rule 0 x 746 [3,7,9,10,14] + CRUSH rule 0 x 747 [15,11,5,2,13] + CRUSH rule 0 x 748 [6,10,13,2,14] + CRUSH rule 0 x 749 [14,9,10,7,5] + CRUSH rule 0 x 750 [1,14,6,5,11] + CRUSH rule 0 x 751 [15,1,6,9,5] + CRUSH rule 0 x 752 [13,1,7,3,11] + CRUSH rule 0 x 753 [4,11,1,3,15] + CRUSH rule 0 x 754 [14,12,11,4,2] + CRUSH rule 0 x 755 [13,6,1,10,4] + CRUSH rule 0 x 756 [3,4,14,6,1] + CRUSH rule 0 x 757 [10,6,1,4,13] + CRUSH rule 0 x 758 [6,3,4,10,15] + CRUSH rule 0 x 759 [5,7,3,14,11] + CRUSH rule 0 x 760 [1,15,10,12,4] + CRUSH rule 0 x 761 [2,12,1,14,5] + CRUSH rule 0 x 762 [1,4,10,9,3] + CRUSH rule 0 x 763 [4,13,1,14,7] + CRUSH rule 0 x 764 [1,14,6,13,9] + CRUSH rule 0 x 765 [9,15,2,13,4] + CRUSH rule 0 x 766 [11,2,7,15,9] + CRUSH rule 0 x 767 [6,11,4,3,12] + CRUSH rule 0 x 768 [2,12,15,7,1] + CRUSH rule 0 x 769 [15,1,9,2,11] + CRUSH rule 0 x 770 [15,13,4,6,3] + CRUSH rule 0 x 771 [9,2,12,11,6] + CRUSH rule 0 x 772 [4,3,13,11,14] + CRUSH rule 0 x 773 [3,7,4,15,1] + CRUSH rule 0 x 774 [12,6,3,15,5] + CRUSH rule 0 x 775 [5,10,14,2,6] + CRUSH rule 0 x 776 [10,15,3,9,6] + CRUSH rule 0 x 777 [11,13,4,7,1] + CRUSH rule 0 x 778 [13,1,9,11,15] + CRUSH rule 0 x 779 [5,11,1,14,2] + CRUSH rule 0 x 780 [13,9,3,6,4] + CRUSH rule 0 x 781 [5,7,14,3,1] + CRUSH rule 0 x 782 [2,15,9,7,11] + CRUSH rule 0 x 783 [12,7,5,14,9] + CRUSH rule 0 x 784 [14,1,10,13,3] + CRUSH rule 0 x 785 [6,12,1,2,4] + CRUSH rule 0 x 786 [10,5,2,15,1] + CRUSH rule 0 x 787 [1,12,10,2,9] + CRUSH rule 0 x 788 [4,2,9,13,6] + CRUSH rule 0 x 789 [9,2,14,7,4] + CRUSH rule 0 x 790 [15,2,7,4,1] + CRUSH rule 0 x 791 [9,4,7,13,14] + CRUSH rule 0 x 792 [6,4,15,10,12] + CRUSH rule 0 x 793 [15,9,6,2,13] + CRUSH rule 0 x 794 [5,12,2,14,9] + CRUSH rule 0 x 795 [6,14,12,4,10] + CRUSH rule 0 x 796 [11,2,12,6,15] + CRUSH rule 0 x 797 [14,3,7,1,5] + CRUSH rule 0 x 798 [5,11,6,13,1] + CRUSH rule 0 x 799 [2,9,14,4,13] + CRUSH rule 0 x 800 [6,3,4,11,15] + CRUSH rule 0 x 801 [2,5,6,13,9] + CRUSH rule 0 x 802 [1,4,12,7,3] + CRUSH rule 0 x 803 [7,2,4,1,11] + CRUSH rule 0 x 804 [5,14,9,7,3] + CRUSH rule 0 x 805 [13,4,3,1,10] + CRUSH rule 0 x 806 [6,2,13,4,15] + CRUSH rule 0 x 807 [14,2,7,4,9] + CRUSH rule 0 x 808 [2,15,12,7,9] + CRUSH rule 0 x 809 [1,11,7,12,4] + CRUSH rule 0 x 810 [2,5,9,12,15] + CRUSH rule 0 x 811 [15,6,3,10,1] + CRUSH rule 0 x 812 [7,11,2,14,9] + CRUSH rule 0 x 813 [4,10,13,14,2] + CRUSH rule 0 x 814 [13,4,9,3,10] + CRUSH rule 0 x 815 [15,12,9,4,10] + CRUSH rule 0 x 816 [14,10,13,7,3] + CRUSH rule 0 x 817 [10,7,2,15,13] + CRUSH rule 0 x 818 [15,2,11,4,1] + CRUSH rule 0 x 819 [5,12,10,6,1] + CRUSH rule 0 x 820 [3,6,9,12,11] + CRUSH rule 0 x 821 [15,10,9,13,3] + CRUSH rule 0 x 822 [10,13,2,9,7] + CRUSH rule 0 x 823 [2,6,12,10,15] + CRUSH rule 0 x 824 [3,7,9,13,15] + CRUSH rule 0 x 825 [10,5,14,6,12] + CRUSH rule 0 x 826 [5,2,11,15,1] + CRUSH rule 0 x 827 [13,5,1,3,7] + CRUSH rule 0 x 828 [12,6,10,5,1] + CRUSH rule 0 x 829 [13,6,15,10,5] + CRUSH rule 0 x 830 [15,13,2,9,7] + CRUSH rule 0 x 831 [1,4,11,12,6] + CRUSH rule 0 x 832 [14,11,13,2,9] + CRUSH rule 0 x 833 [9,13,3,11,7] + CRUSH rule 0 x 834 [9,7,5,1,11] + CRUSH rule 0 x 835 [14,3,13,6,4] + CRUSH rule 0 x 836 [3,9,10,13,1] + CRUSH rule 0 x 837 [15,12,11,2,7] + CRUSH rule 0 x 838 [12,14,9,2,5] + CRUSH rule 0 x 839 [3,4,6,10,15] + CRUSH rule 0 x 840 [10,15,12,4,7] + CRUSH rule 0 x 841 [3,5,7,12,11] + CRUSH rule 0 x 842 [9,13,2,6,5] + CRUSH rule 0 x 843 [14,7,4,9,3] + CRUSH rule 0 x 844 [7,1,4,15,9] + CRUSH rule 0 x 845 [13,6,1,15,4] + CRUSH rule 0 x 846 [3,7,15,13,1] + CRUSH rule 0 x 847 [12,15,11,5,2] + CRUSH rule 0 x 848 [11,13,1,14,5] + CRUSH rule 0 x 849 [3,15,11,9,6] + CRUSH rule 0 x 850 [1,3,10,6,14] + CRUSH rule 0 x 851 [14,4,3,6,11] + CRUSH rule 0 x 852 [9,12,4,7,15] + CRUSH rule 0 x 853 [13,14,6,11,2] + CRUSH rule 0 x 854 [7,11,12,1,4] + CRUSH rule 0 x 855 [14,4,12,6,3] + CRUSH rule 0 x 856 [5,10,7,3,15] + CRUSH rule 0 x 857 [4,3,13,11,9] + CRUSH rule 0 x 858 [5,15,6,3,9] + CRUSH rule 0 x 859 [5,15,6,2,1] + CRUSH rule 0 x 860 [11,14,1,12,6] + CRUSH rule 0 x 861 [13,7,4,10,1] + CRUSH rule 0 x 862 [5,10,9,7,3] + CRUSH rule 0 x 863 [11,6,3,9,4] + CRUSH rule 0 x 864 [6,13,4,2,10] + CRUSH rule 0 x 865 [4,1,14,11,6] + CRUSH rule 0 x 866 [2,13,4,15,9] + CRUSH rule 0 x 867 [12,2,9,10,4] + CRUSH rule 0 x 868 [14,11,7,2,1] + CRUSH rule 0 x 869 [10,13,7,14,3] + CRUSH rule 0 x 870 [14,9,11,4,3] + CRUSH rule 0 x 871 [6,2,1,4,15] + CRUSH rule 0 x 872 [6,1,15,3,10] + CRUSH rule 0 x 873 [2,5,12,10,1] + CRUSH rule 0 x 874 [12,4,7,2,15] + CRUSH rule 0 x 875 [10,6,14,1,12] + CRUSH rule 0 x 876 [14,7,13,3,9] + CRUSH rule 0 x 877 [15,11,13,9,5] + CRUSH rule 0 x 878 [7,14,3,13,9] + CRUSH rule 0 x 879 [12,2,7,4,10] + CRUSH rule 0 x 880 [2,12,10,7,1] + CRUSH rule 0 x 881 [6,3,1,11,4] + CRUSH rule 0 x 882 [11,13,7,1,2] + CRUSH rule 0 x 883 [13,1,3,10,6] + CRUSH rule 0 x 884 [6,15,4,9,3] + CRUSH rule 0 x 885 [14,7,9,4,2] + CRUSH rule 0 x 886 [13,11,4,2,1] + CRUSH rule 0 x 887 [14,4,12,11,2] + CRUSH rule 0 x 888 [10,12,7,15,9] + CRUSH rule 0 x 889 [15,13,4,1,6] + CRUSH rule 0 x 890 [10,12,14,2,9] + CRUSH rule 0 x 891 [9,5,11,6,3] + CRUSH rule 0 x 892 [12,15,2,4,7] + CRUSH rule 0 x 893 [1,3,5,9,6] + CRUSH rule 0 x 894 [7,2,11,13,4] + CRUSH rule 0 x 895 [2,1,11,5,7] + CRUSH rule 0 x 896 [9,1,14,10,4] + CRUSH rule 0 x 897 [7,5,14,3,1] + CRUSH rule 0 x 898 [10,6,12,9,15] + CRUSH rule 0 x 899 [1,11,5,3,13] + CRUSH rule 0 x 900 [2,9,10,7,13] + CRUSH rule 0 x 901 [9,12,11,3,14] + CRUSH rule 0 x 902 [4,2,6,15,12] + CRUSH rule 0 x 903 [14,10,3,1,12] + CRUSH rule 0 x 904 [15,12,4,9,6] + CRUSH rule 0 x 905 [12,6,11,3,9] + CRUSH rule 0 x 906 [14,11,12,2,4] + CRUSH rule 0 x 907 [7,12,3,9,10] + CRUSH rule 0 x 908 [2,15,9,6,10] + CRUSH rule 0 x 909 [10,14,1,13,2] + CRUSH rule 0 x 910 [12,7,4,15,10] + CRUSH rule 0 x 911 [11,15,2,4,9] + CRUSH rule 0 x 912 [6,4,14,13,3] + CRUSH rule 0 x 913 [4,6,10,1,12] + CRUSH rule 0 x 914 [4,15,2,10,1] + CRUSH rule 0 x 915 [12,14,1,9,4] + CRUSH rule 0 x 916 [3,1,11,5,6] + CRUSH rule 0 x 917 [1,15,6,5,10] + CRUSH rule 0 x 918 [7,14,11,4,9] + CRUSH rule 0 x 919 [10,7,3,13,15] + CRUSH rule 0 x 920 [4,2,10,15,1] + CRUSH rule 0 x 921 [1,11,6,13,4] + CRUSH rule 0 x 922 [6,4,14,13,3] + CRUSH rule 0 x 923 [12,2,5,14,10] + CRUSH rule 0 x 924 [6,2,14,13,9] + CRUSH rule 0 x 925 [12,15,2,10,1] + CRUSH rule 0 x 926 [3,13,10,1,14] + CRUSH rule 0 x 927 [6,5,1,11,14] + CRUSH rule 0 x 928 [13,1,3,9,6] + CRUSH rule 0 x 929 [10,7,1,5,2] + CRUSH rule 0 x 930 [7,15,10,5,1] + CRUSH rule 0 x 931 [6,15,11,9,5] + CRUSH rule 0 x 932 [13,2,5,11,9] + CRUSH rule 0 x 933 [12,7,14,10,4] + CRUSH rule 0 x 934 [12,2,5,7,9] + CRUSH rule 0 x 935 [6,11,1,14,5] + CRUSH rule 0 x 936 [9,12,7,5,1] + CRUSH rule 0 x 937 [14,2,11,1,13] + CRUSH rule 0 x 938 [14,3,5,11,7] + CRUSH rule 0 x 939 [6,4,14,9,12] + CRUSH rule 0 x 940 [13,11,4,2,1] + CRUSH rule 0 x 941 [3,12,4,7,14] + CRUSH rule 0 x 942 [15,12,10,4,1] + CRUSH rule 0 x 943 [10,2,4,9,6] + CRUSH rule 0 x 944 [2,9,4,7,1] + CRUSH rule 0 x 945 [10,15,2,9,5] + CRUSH rule 0 x 946 [11,15,7,12,5] + CRUSH rule 0 x 947 [11,3,14,1,12] + CRUSH rule 0 x 948 [7,13,11,5,14] + CRUSH rule 0 x 949 [9,1,12,5,15] + CRUSH rule 0 x 950 [9,15,13,6,4] + CRUSH rule 0 x 951 [2,6,12,9,10] + CRUSH rule 0 x 952 [9,7,15,3,5] + CRUSH rule 0 x 953 [1,3,6,10,12] + CRUSH rule 0 x 954 [10,2,14,9,4] + CRUSH rule 0 x 955 [7,14,3,1,10] + CRUSH rule 0 x 956 [1,6,11,5,14] + CRUSH rule 0 x 957 [14,11,1,12,6] + CRUSH rule 0 x 958 [15,4,3,11,1] + CRUSH rule 0 x 959 [2,1,12,15,10] + CRUSH rule 0 x 960 [2,6,11,13,15] + CRUSH rule 0 x 961 [3,13,11,9,6] + CRUSH rule 0 x 962 [5,11,3,14,1] + CRUSH rule 0 x 963 [13,10,15,4,6] + CRUSH rule 0 x 964 [7,11,4,9,2] + CRUSH rule 0 x 965 [12,2,9,7,4] + CRUSH rule 0 x 966 [12,14,9,4,1] + CRUSH rule 0 x 967 [7,5,3,10,12] + CRUSH rule 0 x 968 [12,15,4,9,11] + CRUSH rule 0 x 969 [11,4,7,1,9] + CRUSH rule 0 x 970 [5,12,10,1,3] + CRUSH rule 0 x 971 [1,9,4,12,7] + CRUSH rule 0 x 972 [12,3,14,5,1] + CRUSH rule 0 x 973 [1,10,4,12,2] + CRUSH rule 0 x 974 [7,11,1,2,15] + CRUSH rule 0 x 975 [7,9,15,12,2] + CRUSH rule 0 x 976 [7,3,15,5,12] + CRUSH rule 0 x 977 [14,3,6,10,4] + CRUSH rule 0 x 978 [12,5,11,1,15] + CRUSH rule 0 x 979 [5,1,13,6,15] + CRUSH rule 0 x 980 [15,11,5,6,1] + CRUSH rule 0 x 981 [5,11,15,12,7] + CRUSH rule 0 x 982 [2,6,14,11,12] + CRUSH rule 0 x 983 [3,12,10,9,14] + CRUSH rule 0 x 984 [15,13,1,10,2] + CRUSH rule 0 x 985 [11,2,15,1,4] + CRUSH rule 0 x 986 [6,13,9,1,15] + CRUSH rule 0 x 987 [13,14,5,10,6] + CRUSH rule 0 x 988 [12,9,10,14,3] + CRUSH rule 0 x 989 [7,4,3,15,9] + CRUSH rule 0 x 990 [1,10,9,13,3] + CRUSH rule 0 x 991 [7,11,1,14,2] + CRUSH rule 0 x 992 [9,10,2,13,7] + CRUSH rule 0 x 993 [6,10,14,12,4] + CRUSH rule 0 x 994 [3,13,15,4,11] + CRUSH rule 0 x 995 [15,6,12,2,5] + CRUSH rule 0 x 996 [15,10,5,3,13] + CRUSH rule 0 x 997 [15,2,1,12,7] + CRUSH rule 0 x 998 [6,1,9,5,12] + CRUSH rule 0 x 999 [9,10,15,5,13] + CRUSH rule 0 x 1000 [14,2,9,4,12] + CRUSH rule 0 x 1001 [11,14,4,2,6] + CRUSH rule 0 x 1002 [1,10,14,2,9] + CRUSH rule 0 x 1003 [10,7,5,14,2] + CRUSH rule 0 x 1004 [15,1,4,6,10] + CRUSH rule 0 x 1005 [6,12,2,10,9] + CRUSH rule 0 x 1006 [10,12,15,1,2] + CRUSH rule 0 x 1007 [1,7,13,14,3] + CRUSH rule 0 x 1008 [7,4,9,11,3] + CRUSH rule 0 x 1009 [5,2,11,7,15] + CRUSH rule 0 x 1010 [10,2,15,6,9] + CRUSH rule 0 x 1011 [6,3,12,1,10] + CRUSH rule 0 x 1012 [12,6,9,15,3] + CRUSH rule 0 x 1013 [2,14,12,4,9] + CRUSH rule 0 x 1014 [1,13,7,2,10] + CRUSH rule 0 x 1015 [12,6,10,1,4] + CRUSH rule 0 x 1016 [10,13,14,3,5] + CRUSH rule 0 x 1017 [5,11,14,7,13] + CRUSH rule 0 x 1018 [13,11,14,1,9] + CRUSH rule 0 x 1019 [10,13,14,7,5] + CRUSH rule 0 x 1020 [3,1,13,4,10] + CRUSH rule 0 x 1021 [2,11,14,9,4] + CRUSH rule 0 x 1022 [15,5,7,2,12] + CRUSH rule 0 x 1023 [15,2,9,12,1] + rule 0 (replicated_ruleset) num_rep 5 result size == 5:\t1024/1024 (esc) + CRUSH rule 0 x 0 [7,10,3,15,12,1] + CRUSH rule 0 x 1 [10,15,1,2,13,4] + CRUSH rule 0 x 2 [1,12,2,6,5,10] + CRUSH rule 0 x 3 [15,4,10,2,9,6] + CRUSH rule 0 x 4 [14,2,10,1,9,4] + CRUSH rule 0 x 5 [7,4,11,2,13,15] + CRUSH rule 0 x 6 [12,6,10,9,3,4] + CRUSH rule 0 x 7 [9,2,6,12,11,4] + CRUSH rule 0 x 8 [10,2,15,1,4,13] + CRUSH rule 0 x 9 [7,1,14,2,11,9] + CRUSH rule 0 x 10 [10,14,4,1,2,7] + CRUSH rule 0 x 11 [13,9,14,7,5,11] + CRUSH rule 0 x 12 [7,1,2,5,13,15] + CRUSH rule 0 x 13 [3,5,12,7,9,1] + CRUSH rule 0 x 14 [13,5,2,7,10,15] + CRUSH rule 0 x 15 [15,1,9,6,13,3] + CRUSH rule 0 x 16 [7,11,14,2,13,1] + CRUSH rule 0 x 17 [10,1,13,2,4,6] + CRUSH rule 0 x 18 [1,7,3,10,5,12] + CRUSH rule 0 x 19 [7,12,2,4,15,10] + CRUSH rule 0 x 20 [14,12,3,10,9,4] + CRUSH rule 0 x 21 [3,12,1,10,4,15] + CRUSH rule 0 x 22 [6,3,13,11,4,1] + CRUSH rule 0 x 23 [10,5,13,9,3,15] + CRUSH rule 0 x 24 [12,11,3,1,9,4] + CRUSH rule 0 x 25 [7,12,15,1,3,10] + CRUSH rule 0 x 26 [1,7,13,2,14,5] + CRUSH rule 0 x 27 [3,6,15,4,13,9] + CRUSH rule 0 x 28 [14,4,3,9,6,11] + CRUSH rule 0 x 29 [5,14,12,11,6,3] + CRUSH rule 0 x 30 [2,5,6,9,1,11] + CRUSH rule 0 x 31 [5,15,10,1,9,13] + CRUSH rule 0 x 32 [9,10,2,1,13,14] + CRUSH rule 0 x 33 [13,4,9,2,7,1] + CRUSH rule 0 x 34 [13,15,2,4,1,10] + CRUSH rule 0 x 35 [4,14,3,13,10,9] + CRUSH rule 0 x 36 [3,12,9,7,5,10] + CRUSH rule 0 x 37 [9,2,6,14,11,1] + CRUSH rule 0 x 38 [3,4,13,10,9,1] + CRUSH rule 0 x 39 [12,7,14,11,1,9] + CRUSH rule 0 x 40 [10,1,9,5,15,2] + CRUSH rule 0 x 41 [4,9,11,1,14,13] + CRUSH rule 0 x 42 [3,6,14,10,12,5] + CRUSH rule 0 x 43 [10,5,15,7,2,9] + CRUSH rule 0 x 44 [11,4,13,3,7,14] + CRUSH rule 0 x 45 [11,12,15,9,1,5] + CRUSH rule 0 x 46 [6,9,2,14,11,13] + CRUSH rule 0 x 47 [3,9,6,4,13,1] + CRUSH rule 0 x 48 [4,6,2,1,10,14] + CRUSH rule 0 x 49 [9,15,10,7,4,3] + CRUSH rule 0 x 50 [14,12,1,4,2,11] + CRUSH rule 0 x 51 [10,6,5,12,15,2] + CRUSH rule 0 x 52 [12,1,9,11,7,3] + CRUSH rule 0 x 53 [3,6,13,9,5,1] + CRUSH rule 0 x 54 [4,13,9,2,14,10] + CRUSH rule 0 x 55 [4,11,2,7,1,13] + CRUSH rule 0 x 56 [5,9,10,1,3,13] + CRUSH rule 0 x 57 [6,2,1,15,10,12] + CRUSH rule 0 x 58 [7,1,11,4,3,14] + CRUSH rule 0 x 59 [2,13,1,10,9,5] + CRUSH rule 0 x 60 [3,6,11,1,4,9] + CRUSH rule 0 x 61 [3,15,13,7,4,1] + CRUSH rule 0 x 62 [15,11,7,12,5,9] + CRUSH rule 0 x 63 [10,14,12,1,7,3] + CRUSH rule 0 x 64 [3,9,1,4,7,12] + CRUSH rule 0 x 65 [4,12,11,7,14,3] + CRUSH rule 0 x 66 [15,11,6,9,4,1] + CRUSH rule 0 x 67 [2,6,4,14,1,11] + CRUSH rule 0 x 68 [15,7,4,2,9,12] + CRUSH rule 0 x 69 [2,1,15,10,4,9] + CRUSH rule 0 x 70 [9,6,1,3,13,15] + CRUSH rule 0 x 71 [15,5,1,3,13,10] + CRUSH rule 0 x 72 [9,10,3,5,7,12] + CRUSH rule 0 x 73 [5,3,11,1,7,12] + CRUSH rule 0 x 74 [11,7,9,5,1,15] + CRUSH rule 0 x 75 [9,7,11,14,12,1] + CRUSH rule 0 x 76 [6,1,3,5,14,10] + CRUSH rule 0 x 77 [7,4,2,13,9,1] + CRUSH rule 0 x 78 [9,3,1,5,6,13] + CRUSH rule 0 x 79 [13,2,15,5,7,9] + CRUSH rule 0 x 80 [15,2,6,4,13,10] + CRUSH rule 0 x 81 [15,2,1,11,4,6] + CRUSH rule 0 x 82 [14,13,5,11,6,2] + CRUSH rule 0 x 83 [4,15,3,9,10,13] + CRUSH rule 0 x 84 [10,7,9,15,3,4] + CRUSH rule 0 x 85 [3,15,9,7,4,11] + CRUSH rule 0 x 86 [10,9,14,1,13,4] + CRUSH rule 0 x 87 [15,10,7,12,5,3] + CRUSH rule 0 x 88 [4,13,3,1,9,15] + CRUSH rule 0 x 89 [3,9,7,4,1,14] + CRUSH rule 0 x 90 [4,9,7,12,11,14] + CRUSH rule 0 x 91 [6,11,9,1,2,4] + CRUSH rule 0 x 92 [1,5,10,9,13,15] + CRUSH rule 0 x 93 [9,3,15,13,7,5] + CRUSH rule 0 x 94 [9,2,12,5,6,11] + CRUSH rule 0 x 95 [7,15,4,10,9,13] + CRUSH rule 0 x 96 [2,15,11,7,5,1] + CRUSH rule 0 x 97 [4,11,2,13,1,7] + CRUSH rule 0 x 98 [11,13,9,3,15,1] + CRUSH rule 0 x 99 [12,4,11,7,3,14] + CRUSH rule 0 x 100 [9,4,10,15,7,3] + CRUSH rule 0 x 101 [15,7,1,9,10,5] + CRUSH rule 0 x 102 [3,11,14,6,13,4] + CRUSH rule 0 x 103 [13,11,6,14,4,3] + CRUSH rule 0 x 104 [14,6,3,5,9,1] + CRUSH rule 0 x 105 [14,10,1,9,3,5] + CRUSH rule 0 x 106 [6,5,13,2,14,11] + CRUSH rule 0 x 107 [3,1,10,14,13,5] + CRUSH rule 0 x 108 [5,10,7,2,15,9] + CRUSH rule 0 x 109 [9,1,13,7,15,5] + CRUSH rule 0 x 110 [5,1,11,3,7,14] + CRUSH rule 0 x 111 [10,1,9,7,5,2] + CRUSH rule 0 x 112 [1,10,4,14,2,12] + CRUSH rule 0 x 113 [6,10,13,9,1,5] + CRUSH rule 0 x 114 [5,13,6,2,1,14] + CRUSH rule 0 x 115 [10,13,14,3,9,1] + CRUSH rule 0 x 116 [1,14,13,2,11,5] + CRUSH rule 0 x 117 [5,6,1,12,15,9] + CRUSH rule 0 x 118 [10,4,13,15,9,3] + CRUSH rule 0 x 119 [14,12,11,4,6,9] + CRUSH rule 0 x 120 [11,3,14,13,4,7] + CRUSH rule 0 x 121 [9,5,1,11,7,3] + CRUSH rule 0 x 122 [4,3,14,1,11,13] + CRUSH rule 0 x 123 [3,10,5,6,9,1] + CRUSH rule 0 x 124 [12,2,1,5,14,7] + CRUSH rule 0 x 125 [9,12,15,1,6,5] + CRUSH rule 0 x 126 [7,15,10,9,2,12] + CRUSH rule 0 x 127 [4,14,9,13,1,3] + CRUSH rule 0 x 128 [3,12,1,10,4,9] + CRUSH rule 0 x 129 [11,13,14,2,9,4] + CRUSH rule 0 x 130 [3,13,5,14,10,1] + CRUSH rule 0 x 131 [12,1,6,15,4,2] + CRUSH rule 0 x 132 [11,15,13,9,2,5] + CRUSH rule 0 x 133 [3,6,9,11,15,12] + CRUSH rule 0 x 134 [12,5,6,15,3,9] + CRUSH rule 0 x 135 [3,14,12,4,6,11] + CRUSH rule 0 x 136 [15,6,9,4,10,3] + CRUSH rule 0 x 137 [14,3,6,11,1,9] + CRUSH rule 0 x 138 [13,15,4,10,2,7] + CRUSH rule 0 x 139 [11,2,13,9,1,15] + CRUSH rule 0 x 140 [11,4,12,15,2,6] + CRUSH rule 0 x 141 [6,12,15,11,3,5] + CRUSH rule 0 x 142 [3,14,7,9,11,1] + CRUSH rule 0 x 143 [9,6,4,2,14,10] + CRUSH rule 0 x 144 [13,7,11,2,14,4] + CRUSH rule 0 x 145 [12,2,6,10,9,4] + CRUSH rule 0 x 146 [1,5,9,2,6,13] + CRUSH rule 0 x 147 [1,4,9,11,2,7] + CRUSH rule 0 x 148 [12,7,9,2,14,11] + CRUSH rule 0 x 149 [2,5,9,12,11,1] + CRUSH rule 0 x 150 [1,15,2,10,7,9] + CRUSH rule 0 x 151 [2,9,14,7,1,10] + CRUSH rule 0 x 152 [5,9,2,6,10,13] + CRUSH rule 0 x 153 [6,9,4,15,2,1] + CRUSH rule 0 x 154 [3,11,7,1,4,12] + CRUSH rule 0 x 155 [14,12,7,3,5,1] + CRUSH rule 0 x 156 [7,13,3,10,15,5] + CRUSH rule 0 x 157 [15,1,6,4,3,10] + CRUSH rule 0 x 158 [15,1,10,6,12,2] + CRUSH rule 0 x 159 [4,14,3,12,10,6] + CRUSH rule 0 x 160 [5,7,3,14,11,1] + CRUSH rule 0 x 161 [1,2,11,4,6,13] + CRUSH rule 0 x 162 [10,6,1,12,2,4] + CRUSH rule 0 x 163 [15,1,10,2,6,4] + CRUSH rule 0 x 164 [9,14,10,7,12,2] + CRUSH rule 0 x 165 [11,7,2,13,9,15] + CRUSH rule 0 x 166 [1,2,12,14,4,11] + CRUSH rule 0 x 167 [9,7,3,4,11,13] + CRUSH rule 0 x 168 [13,2,4,1,6,15] + CRUSH rule 0 x 169 [1,4,9,14,13,10] + CRUSH rule 0 x 170 [1,15,7,9,12,10] + CRUSH rule 0 x 171 [9,2,10,7,1,5] + CRUSH rule 0 x 172 [14,4,10,12,9,3] + CRUSH rule 0 x 173 [5,10,12,15,6,1] + CRUSH rule 0 x 174 [15,6,4,12,1,11] + CRUSH rule 0 x 175 [5,7,9,3,10,1] + CRUSH rule 0 x 176 [9,6,3,14,13,10] + CRUSH rule 0 x 177 [2,9,10,13,4,1] + CRUSH rule 0 x 178 [12,11,7,14,3,4] + CRUSH rule 0 x 179 [2,10,13,9,5,1] + CRUSH rule 0 x 180 [3,11,5,15,7,12] + CRUSH rule 0 x 181 [9,12,6,5,1,10] + CRUSH rule 0 x 182 [5,13,11,2,1,6] + CRUSH rule 0 x 183 [5,7,10,13,3,9] + CRUSH rule 0 x 184 [2,5,11,12,7,1] + CRUSH rule 0 x 185 [13,5,7,11,2,14] + CRUSH rule 0 x 186 [6,14,13,5,10,1] + CRUSH rule 0 x 187 [1,4,11,13,6,14] + CRUSH rule 0 x 188 [9,13,5,14,10,6] + CRUSH rule 0 x 189 [6,12,4,9,2,1] + CRUSH rule 0 x 190 [9,13,15,10,3,1] + CRUSH rule 0 x 191 [7,11,4,1,15,12] + CRUSH rule 0 x 192 [2,11,5,15,6,1] + CRUSH rule 0 x 193 [3,13,6,10,4,1] + CRUSH rule 0 x 194 [3,13,4,14,6,9] + CRUSH rule 0 x 195 [5,7,10,12,1,3] + CRUSH rule 0 x 196 [4,15,1,10,9,2] + CRUSH rule 0 x 197 [14,10,13,4,6,3] + CRUSH rule 0 x 198 [2,5,6,15,9,13] + CRUSH rule 0 x 199 [2,10,4,15,1,9] + CRUSH rule 0 x 200 [7,14,11,4,1,3] + CRUSH rule 0 x 201 [9,14,1,7,4,3] + CRUSH rule 0 x 202 [14,11,7,3,5,1] + CRUSH rule 0 x 203 [12,5,7,15,1,2] + CRUSH rule 0 x 204 [6,11,3,12,14,1] + CRUSH rule 0 x 205 [15,4,6,10,13,9] + CRUSH rule 0 x 206 [13,11,2,15,7,1] + CRUSH rule 0 x 207 [2,11,7,4,14,1] + CRUSH rule 0 x 208 [13,1,6,14,9,11] + CRUSH rule 0 x 209 [6,15,13,1,11,4] + CRUSH rule 0 x 210 [13,11,2,7,5,14] + CRUSH rule 0 x 211 [2,14,1,13,11,7] + CRUSH rule 0 x 212 [10,1,12,15,5,6] + CRUSH rule 0 x 213 [3,9,6,5,15,13] + CRUSH rule 0 x 214 [7,15,4,1,10,2] + CRUSH rule 0 x 215 [6,1,4,13,3,11] + CRUSH rule 0 x 216 [12,9,6,2,1,11] + CRUSH rule 0 x 217 [12,11,1,14,2,4] + CRUSH rule 0 x 218 [12,10,15,6,1,4] + CRUSH rule 0 x 219 [3,11,14,6,4,1] + CRUSH rule 0 x 220 [14,4,3,12,10,9] + CRUSH rule 0 x 221 [15,5,2,6,12,11] + CRUSH rule 0 x 222 [10,4,3,15,7,12] + CRUSH rule 0 x 223 [9,7,11,1,4,14] + CRUSH rule 0 x 224 [1,7,10,2,12,9] + CRUSH rule 0 x 225 [10,5,2,6,1,13] + CRUSH rule 0 x 226 [4,1,9,3,13,10] + CRUSH rule 0 x 227 [7,2,12,15,5,11] + CRUSH rule 0 x 228 [2,15,11,1,6,13] + CRUSH rule 0 x 229 [9,3,7,14,1,12] + CRUSH rule 0 x 230 [10,5,7,2,15,1] + CRUSH rule 0 x 231 [2,7,5,13,9,15] + CRUSH rule 0 x 232 [10,5,13,1,9,2] + CRUSH rule 0 x 233 [6,12,11,4,9,14] + CRUSH rule 0 x 234 [10,1,2,12,5,9] + CRUSH rule 0 x 235 [13,14,7,10,1,9] + CRUSH rule 0 x 236 [2,15,9,12,1,7] + CRUSH rule 0 x 237 [3,12,9,10,4,7] + CRUSH rule 0 x 238 [2,10,4,15,6,12] + CRUSH rule 0 x 239 [4,15,10,7,9,13] + CRUSH rule 0 x 240 [15,5,13,7,2,9] + CRUSH rule 0 x 241 [7,9,15,12,1,5] + CRUSH rule 0 x 242 [14,2,6,9,10,12] + CRUSH rule 0 x 243 [2,11,5,1,15,6] + CRUSH rule 0 x 244 [13,9,15,3,11,7] + CRUSH rule 0 x 245 [12,9,15,3,1,5] + CRUSH rule 0 x 246 [15,3,5,11,7,1] + CRUSH rule 0 x 247 [6,4,9,12,1,2] + CRUSH rule 0 x 248 [5,13,7,11,9,15] + CRUSH rule 0 x 249 [10,14,7,3,9,13] + CRUSH rule 0 x 250 [12,15,1,10,5,6] + CRUSH rule 0 x 251 [13,2,15,5,6,1] + CRUSH rule 0 x 252 [7,5,13,9,3,10] + CRUSH rule 0 x 253 [3,13,15,10,7,4] + CRUSH rule 0 x 254 [2,9,13,14,4,6] + CRUSH rule 0 x 255 [1,9,13,2,6,10] + CRUSH rule 0 x 256 [6,9,13,1,3,14] + CRUSH rule 0 x 257 [15,12,3,9,6,4] + CRUSH rule 0 x 258 [12,5,6,10,2,1] + CRUSH rule 0 x 259 [9,10,4,3,14,13] + CRUSH rule 0 x 260 [10,12,6,9,3,15] + CRUSH rule 0 x 261 [13,7,2,1,15,5] + CRUSH rule 0 x 262 [15,3,12,7,4,9] + CRUSH rule 0 x 263 [12,6,10,9,5,15] + CRUSH rule 0 x 264 [13,14,11,3,1,4] + CRUSH rule 0 x 265 [12,10,14,5,7,1] + CRUSH rule 0 x 266 [14,7,11,1,2,9] + CRUSH rule 0 x 267 [12,11,6,5,1,2] + CRUSH rule 0 x 268 [4,1,15,12,6,11] + CRUSH rule 0 x 269 [11,1,15,5,13,9] + CRUSH rule 0 x 270 [7,11,12,3,1,14] + CRUSH rule 0 x 271 [4,7,3,13,15,10] + CRUSH rule 0 x 272 [15,5,13,10,6,2] + CRUSH rule 0 x 273 [2,10,7,12,1,15] + CRUSH rule 0 x 274 [10,2,5,6,13,9] + CRUSH rule 0 x 275 [10,3,4,7,14,13] + CRUSH rule 0 x 276 [5,12,9,2,11,7] + CRUSH rule 0 x 277 [14,3,13,4,1,9] + CRUSH rule 0 x 278 [5,6,14,3,1,11] + CRUSH rule 0 x 279 [6,10,13,3,9,4] + CRUSH rule 0 x 280 [7,3,14,9,1,11] + CRUSH rule 0 x 281 [5,11,14,7,9,13] + CRUSH rule 0 x 282 [2,1,13,14,9,7] + CRUSH rule 0 x 283 [4,1,12,3,10,7] + CRUSH rule 0 x 284 [5,11,7,15,3,13] + CRUSH rule 0 x 285 [15,5,3,1,6,13] + CRUSH rule 0 x 286 [10,4,3,6,12,15] + CRUSH rule 0 x 287 [12,4,9,1,3,11] + CRUSH rule 0 x 288 [4,12,10,7,1,3] + CRUSH rule 0 x 289 [2,5,14,9,13,6] + CRUSH rule 0 x 290 [12,2,5,6,15,9] + CRUSH rule 0 x 291 [7,11,1,14,5,9] + CRUSH rule 0 x 292 [4,10,6,3,14,9] + CRUSH rule 0 x 293 [6,5,11,1,2,14] + CRUSH rule 0 x 294 [9,12,3,14,6,11] + CRUSH rule 0 x 295 [6,10,3,14,9,4] + CRUSH rule 0 x 296 [3,1,13,7,14,9] + CRUSH rule 0 x 297 [6,13,4,14,10,1] + CRUSH rule 0 x 298 [14,9,13,1,4,2] + CRUSH rule 0 x 299 [14,12,11,6,4,2] + CRUSH rule 0 x 300 [15,7,10,5,1,3] + CRUSH rule 0 x 301 [9,11,7,1,13,14] + CRUSH rule 0 x 302 [9,7,1,13,5,10] + CRUSH rule 0 x 303 [4,13,3,7,10,15] + CRUSH rule 0 x 304 [6,9,2,11,15,13] + CRUSH rule 0 x 305 [13,7,5,11,2,15] + CRUSH rule 0 x 306 [10,12,4,6,9,2] + CRUSH rule 0 x 307 [11,12,15,5,6,2] + CRUSH rule 0 x 308 [12,14,10,9,1,2] + CRUSH rule 0 x 309 [9,3,12,5,11,15] + CRUSH rule 0 x 310 [3,1,5,10,14,9] + CRUSH rule 0 x 311 [3,9,7,1,14,13] + CRUSH rule 0 x 312 [15,13,9,7,5,10] + CRUSH rule 0 x 313 [9,15,3,7,5,13] + CRUSH rule 0 x 314 [2,15,9,5,6,12] + CRUSH rule 0 x 315 [15,2,13,1,11,9] + CRUSH rule 0 x 316 [4,9,11,2,12,14] + CRUSH rule 0 x 317 [1,5,3,13,15,7] + CRUSH rule 0 x 318 [4,1,15,11,9,13] + CRUSH rule 0 x 319 [2,15,4,1,11,9] + CRUSH rule 0 x 320 [5,7,13,9,11,2] + CRUSH rule 0 x 321 [1,6,11,15,5,3] + CRUSH rule 0 x 322 [13,7,5,3,14,11] + CRUSH rule 0 x 323 [7,4,10,1,2,13] + CRUSH rule 0 x 324 [5,6,10,15,2,13] + CRUSH rule 0 x 325 [9,10,14,5,1,6] + CRUSH rule 0 x 326 [11,7,13,4,2,15] + CRUSH rule 0 x 327 [12,5,10,14,3,7] + CRUSH rule 0 x 328 [5,2,6,14,1,11] + CRUSH rule 0 x 329 [2,6,15,5,9,10] + CRUSH rule 0 x 330 [3,9,11,13,1,6] + CRUSH rule 0 x 331 [12,14,6,3,1,4] + CRUSH rule 0 x 332 [10,12,6,15,9,2] + CRUSH rule 0 x 333 [6,5,3,12,14,10] + CRUSH rule 0 x 334 [4,9,2,12,7,11] + CRUSH rule 0 x 335 [11,7,1,5,13,2] + CRUSH rule 0 x 336 [6,14,13,2,5,9] + CRUSH rule 0 x 337 [15,11,3,7,12,5] + CRUSH rule 0 x 338 [10,5,3,6,15,1] + CRUSH rule 0 x 339 [11,14,13,5,3,7] + CRUSH rule 0 x 340 [11,6,12,4,9,3] + CRUSH rule 0 x 341 [7,5,2,10,14,9] + CRUSH rule 0 x 342 [12,14,1,9,2,11] + CRUSH rule 0 x 343 [12,14,9,6,10,2] + CRUSH rule 0 x 344 [9,11,5,2,14,13] + CRUSH rule 0 x 345 [14,2,11,9,6,12] + CRUSH rule 0 x 346 [5,3,14,10,7,1] + CRUSH rule 0 x 347 [10,2,12,6,9,1] + CRUSH rule 0 x 348 [7,9,10,1,14,13] + CRUSH rule 0 x 349 [9,6,10,12,1,5] + CRUSH rule 0 x 350 [13,9,15,4,10,7] + CRUSH rule 0 x 351 [13,5,15,3,1,6] + CRUSH rule 0 x 352 [1,12,11,9,4,7] + CRUSH rule 0 x 353 [10,14,12,2,9,1] + CRUSH rule 0 x 354 [6,3,15,10,9,4] + CRUSH rule 0 x 355 [13,14,6,10,2,5] + CRUSH rule 0 x 356 [15,13,2,9,6,5] + CRUSH rule 0 x 357 [4,11,1,13,3,14] + CRUSH rule 0 x 358 [12,7,2,9,1,14] + CRUSH rule 0 x 359 [5,15,7,11,3,13] + CRUSH rule 0 x 360 [13,10,1,2,6,14] + CRUSH rule 0 x 361 [5,3,13,6,1,14] + CRUSH rule 0 x 362 [2,9,11,13,1,6] + CRUSH rule 0 x 363 [7,12,3,9,15,4] + CRUSH rule 0 x 364 [2,12,6,9,5,10] + CRUSH rule 0 x 365 [13,5,11,15,6,2] + CRUSH rule 0 x 366 [12,7,3,14,5,10] + CRUSH rule 0 x 367 [7,13,3,1,5,11] + CRUSH rule 0 x 368 [7,9,10,15,3,4] + CRUSH rule 0 x 369 [7,5,3,13,14,9] + CRUSH rule 0 x 370 [4,7,14,1,2,9] + CRUSH rule 0 x 371 [1,7,12,3,4,15] + CRUSH rule 0 x 372 [10,4,3,14,6,1] + CRUSH rule 0 x 373 [15,5,2,6,13,1] + CRUSH rule 0 x 374 [3,15,12,5,1,6] + CRUSH rule 0 x 375 [5,2,14,1,6,13] + CRUSH rule 0 x 376 [5,14,10,13,3,6] + CRUSH rule 0 x 377 [1,15,2,4,9,11] + CRUSH rule 0 x 378 [9,12,2,15,1,5] + CRUSH rule 0 x 379 [11,2,15,5,7,9] + CRUSH rule 0 x 380 [6,1,12,11,2,9] + CRUSH rule 0 x 381 [15,13,7,5,10,2] + CRUSH rule 0 x 382 [14,3,1,4,13,7] + CRUSH rule 0 x 383 [3,6,11,4,13,15] + CRUSH rule 0 x 384 [4,13,6,3,15,11] + CRUSH rule 0 x 385 [4,6,15,3,10,9] + CRUSH rule 0 x 386 [14,3,11,13,5,6] + CRUSH rule 0 x 387 [1,11,5,7,9,2] + CRUSH rule 0 x 388 [2,6,11,9,15,4] + CRUSH rule 0 x 389 [12,7,2,4,15,10] + CRUSH rule 0 x 390 [2,11,13,7,5,9] + CRUSH rule 0 x 391 [3,4,9,13,7,10] + CRUSH rule 0 x 392 [11,5,14,7,1,9] + CRUSH rule 0 x 393 [2,14,5,9,7,13] + CRUSH rule 0 x 394 [4,9,3,15,13,6] + CRUSH rule 0 x 395 [10,13,5,15,6,9] + CRUSH rule 0 x 396 [2,12,15,9,4,6] + CRUSH rule 0 x 397 [1,14,9,4,12,10] + CRUSH rule 0 x 398 [9,2,1,5,12,6] + CRUSH rule 0 x 399 [5,9,14,3,1,10] + CRUSH rule 0 x 400 [10,6,2,4,15,12] + CRUSH rule 0 x 401 [6,9,11,12,4,3] + CRUSH rule 0 x 402 [4,7,9,2,13,1] + CRUSH rule 0 x 403 [7,15,13,3,5,9] + CRUSH rule 0 x 404 [14,12,7,9,2,1] + CRUSH rule 0 x 405 [9,15,11,2,4,7] + CRUSH rule 0 x 406 [12,14,9,2,7,10] + CRUSH rule 0 x 407 [9,5,12,10,15,6] + CRUSH rule 0 x 408 [7,1,5,2,10,15] + CRUSH rule 0 x 409 [11,2,4,13,1,15] + CRUSH rule 0 x 410 [6,4,14,2,12,9] + CRUSH rule 0 x 411 [13,11,15,6,4,1] + CRUSH rule 0 x 412 [5,9,6,11,14,2] + CRUSH rule 0 x 413 [13,5,3,11,6,9] + CRUSH rule 0 x 414 [3,11,9,13,4,1] + CRUSH rule 0 x 415 [6,10,14,5,1,13] + CRUSH rule 0 x 416 [13,1,4,7,2,9] + CRUSH rule 0 x 417 [4,12,1,15,2,11] + CRUSH rule 0 x 418 [14,5,10,2,6,9] + CRUSH rule 0 x 419 [5,14,10,9,2,12] + CRUSH rule 0 x 420 [2,4,9,11,6,14] + CRUSH rule 0 x 421 [15,4,10,3,9,12] + CRUSH rule 0 x 422 [4,11,2,7,13,9] + CRUSH rule 0 x 423 [3,15,12,6,5,1] + CRUSH rule 0 x 424 [6,10,12,2,5,1] + CRUSH rule 0 x 425 [11,15,2,13,5,7] + CRUSH rule 0 x 426 [12,4,7,1,9,10] + CRUSH rule 0 x 427 [14,10,3,1,9,7] + CRUSH rule 0 x 428 [12,7,9,4,2,1] + CRUSH rule 0 x 429 [3,4,9,7,11,12] + CRUSH rule 0 x 430 [3,5,10,13,1,15] + CRUSH rule 0 x 431 [9,3,7,1,12,5] + CRUSH rule 0 x 432 [4,1,12,7,15,2] + CRUSH rule 0 x 433 [4,11,12,15,7,3] + CRUSH rule 0 x 434 [2,14,9,1,5,11] + CRUSH rule 0 x 435 [13,11,5,6,9,2] + CRUSH rule 0 x 436 [9,15,10,2,4,1] + CRUSH rule 0 x 437 [9,6,3,14,10,12] + CRUSH rule 0 x 438 [7,2,13,4,11,1] + CRUSH rule 0 x 439 [7,14,4,3,12,10] + CRUSH rule 0 x 440 [14,11,9,2,7,12] + CRUSH rule 0 x 441 [2,4,11,9,13,6] + CRUSH rule 0 x 442 [10,13,9,7,15,1] + CRUSH rule 0 x 443 [12,15,10,9,2,1] + CRUSH rule 0 x 444 [4,13,7,14,3,1] + CRUSH rule 0 x 445 [4,2,15,7,1,9] + CRUSH rule 0 x 446 [12,10,6,9,4,1] + CRUSH rule 0 x 447 [15,7,13,1,4,9] + CRUSH rule 0 x 448 [5,2,13,7,15,10] + CRUSH rule 0 x 449 [14,5,3,12,10,9] + CRUSH rule 0 x 450 [2,4,6,9,15,1] + CRUSH rule 0 x 451 [6,14,11,3,9,1] + CRUSH rule 0 x 452 [14,9,10,4,2,13] + CRUSH rule 0 x 453 [5,15,13,2,6,9] + CRUSH rule 0 x 454 [10,4,2,6,15,12] + CRUSH rule 0 x 455 [6,13,2,4,10,1] + CRUSH rule 0 x 456 [5,7,13,1,11,3] + CRUSH rule 0 x 457 [9,1,5,7,11,13] + CRUSH rule 0 x 458 [9,11,15,4,7,2] + CRUSH rule 0 x 459 [13,15,11,1,5,2] + CRUSH rule 0 x 460 [5,12,10,15,7,3] + CRUSH rule 0 x 461 [4,3,9,13,15,6] + CRUSH rule 0 x 462 [4,7,12,14,11,1] + CRUSH rule 0 x 463 [4,12,14,11,2,7] + CRUSH rule 0 x 464 [4,2,15,10,1,9] + CRUSH rule 0 x 465 [5,10,9,7,13,1] + CRUSH rule 0 x 466 [13,5,2,15,9,11] + CRUSH rule 0 x 467 [13,6,14,3,9,1] + CRUSH rule 0 x 468 [10,7,12,14,4,1] + CRUSH rule 0 x 469 [4,9,6,14,12,11] + CRUSH rule 0 x 470 [3,9,12,15,5,6] + CRUSH rule 0 x 471 [6,1,5,14,13,10] + CRUSH rule 0 x 472 [2,14,7,5,13,1] + CRUSH rule 0 x 473 [15,10,6,9,4,12] + CRUSH rule 0 x 474 [15,10,4,12,6,9] + CRUSH rule 0 x 475 [10,5,12,9,14,3] + CRUSH rule 0 x 476 [3,6,10,12,1,15] + CRUSH rule 0 x 477 [6,13,5,15,11,9] + CRUSH rule 0 x 478 [4,15,1,3,7,12] + CRUSH rule 0 x 479 [13,11,1,6,14,5] + CRUSH rule 0 x 480 [1,13,6,4,9,14] + CRUSH rule 0 x 481 [15,12,7,9,1,3] + CRUSH rule 0 x 482 [2,12,9,1,7,11] + CRUSH rule 0 x 483 [10,1,4,15,9,7] + CRUSH rule 0 x 484 [1,4,10,13,7,14] + CRUSH rule 0 x 485 [9,4,3,1,14,12] + CRUSH rule 0 x 486 [3,10,15,9,7,13] + CRUSH rule 0 x 487 [12,11,4,14,7,2] + CRUSH rule 0 x 488 [14,4,1,9,2,6] + CRUSH rule 0 x 489 [11,4,2,13,15,7] + CRUSH rule 0 x 490 [4,9,1,3,13,15] + CRUSH rule 0 x 491 [1,12,5,2,14,11] + CRUSH rule 0 x 492 [5,7,11,3,14,9] + CRUSH rule 0 x 493 [12,1,4,15,3,11] + CRUSH rule 0 x 494 [1,7,13,4,15,9] + CRUSH rule 0 x 495 [3,15,7,1,9,5] + CRUSH rule 0 x 496 [5,3,7,13,9,14] + CRUSH rule 0 x 497 [13,10,3,6,5,14] + CRUSH rule 0 x 498 [10,6,1,5,9,12] + CRUSH rule 0 x 499 [14,3,12,5,1,11] + CRUSH rule 0 x 500 [15,9,6,12,11,2] + CRUSH rule 0 x 501 [10,13,1,9,3,14] + CRUSH rule 0 x 502 [5,1,14,11,7,12] + CRUSH rule 0 x 503 [15,10,7,9,1,12] + CRUSH rule 0 x 504 [13,2,7,1,14,11] + CRUSH rule 0 x 505 [12,7,5,2,14,10] + CRUSH rule 0 x 506 [11,7,9,14,12,1] + CRUSH rule 0 x 507 [4,14,13,3,9,7] + CRUSH rule 0 x 508 [12,1,4,9,2,11] + CRUSH rule 0 x 509 [4,2,6,9,14,1] + CRUSH rule 0 x 510 [5,3,1,12,11,14] + CRUSH rule 0 x 511 [2,12,10,6,14,5] + CRUSH rule 0 x 512 [15,11,3,5,7,1] + CRUSH rule 0 x 513 [4,9,11,3,13,7] + CRUSH rule 0 x 514 [11,9,3,4,12,15] + CRUSH rule 0 x 515 [12,14,6,5,3,9] + CRUSH rule 0 x 516 [14,11,1,12,3,7] + CRUSH rule 0 x 517 [11,5,6,13,9,3] + CRUSH rule 0 x 518 [3,5,7,12,15,11] + CRUSH rule 0 x 519 [12,14,2,1,4,6] + CRUSH rule 0 x 520 [12,4,2,10,6,15] + CRUSH rule 0 x 521 [11,5,9,6,15,3] + CRUSH rule 0 x 522 [4,12,11,1,15,3] + CRUSH rule 0 x 523 [3,1,5,9,15,10] + CRUSH rule 0 x 524 [15,9,3,11,13,7] + CRUSH rule 0 x 525 [3,15,11,6,9,12] + CRUSH rule 0 x 526 [10,2,5,13,6,15] + CRUSH rule 0 x 527 [3,13,4,1,9,10] + CRUSH rule 0 x 528 [12,7,15,10,2,5] + CRUSH rule 0 x 529 [6,4,10,12,2,9] + CRUSH rule 0 x 530 [11,9,12,7,5,1] + CRUSH rule 0 x 531 [9,15,4,7,2,13] + CRUSH rule 0 x 532 [5,3,13,7,9,14] + CRUSH rule 0 x 533 [12,15,1,2,7,5] + CRUSH rule 0 x 534 [11,9,3,7,15,4] + CRUSH rule 0 x 535 [11,1,3,5,14,9] + CRUSH rule 0 x 536 [9,1,14,13,4,6] + CRUSH rule 0 x 537 [15,5,13,2,7,11] + CRUSH rule 0 x 538 [13,5,11,2,6,15] + CRUSH rule 0 x 539 [10,12,6,14,1,2] + CRUSH rule 0 x 540 [12,15,7,3,9,11] + CRUSH rule 0 x 541 [2,1,6,11,14,13] + CRUSH rule 0 x 542 [3,9,15,5,11,12] + CRUSH rule 0 x 543 [4,10,9,3,6,13] + CRUSH rule 0 x 544 [3,15,9,11,7,4] + CRUSH rule 0 x 545 [14,10,7,12,4,9] + CRUSH rule 0 x 546 [5,15,13,7,1,10] + CRUSH rule 0 x 547 [5,13,7,9,3,14] + CRUSH rule 0 x 548 [11,7,12,15,4,2] + CRUSH rule 0 x 549 [14,1,4,9,13,6] + CRUSH rule 0 x 550 [9,15,3,13,1,6] + CRUSH rule 0 x 551 [11,2,15,6,13,5] + CRUSH rule 0 x 552 [2,11,14,1,9,6] + CRUSH rule 0 x 553 [11,9,14,6,4,13] + CRUSH rule 0 x 554 [11,14,6,4,13,9] + CRUSH rule 0 x 555 [6,5,10,9,14,2] + CRUSH rule 0 x 556 [15,6,3,13,11,4] + CRUSH rule 0 x 557 [12,2,5,14,10,9] + CRUSH rule 0 x 558 [12,1,6,15,5,10] + CRUSH rule 0 x 559 [2,13,5,10,14,7] + CRUSH rule 0 x 560 [4,9,12,6,3,10] + CRUSH rule 0 x 561 [12,7,1,2,5,15] + CRUSH rule 0 x 562 [7,13,9,14,2,1] + CRUSH rule 0 x 563 [15,4,3,10,13,9] + CRUSH rule 0 x 564 [2,13,7,1,15,10] + CRUSH rule 0 x 565 [3,12,4,1,14,7] + CRUSH rule 0 x 566 [6,14,4,2,13,11] + CRUSH rule 0 x 567 [15,4,11,6,3,12] + CRUSH rule 0 x 568 [4,14,1,6,10,13] + CRUSH rule 0 x 569 [11,3,15,13,5,1] + CRUSH rule 0 x 570 [1,10,13,4,7,2] + CRUSH rule 0 x 571 [10,12,14,9,4,2] + CRUSH rule 0 x 572 [12,14,3,10,6,1] + CRUSH rule 0 x 573 [7,15,11,2,12,9] + CRUSH rule 0 x 574 [11,14,13,1,3,7] + CRUSH rule 0 x 575 [5,13,15,9,6,10] + CRUSH rule 0 x 576 [3,15,11,9,1,6] + CRUSH rule 0 x 577 [13,9,6,15,3,11] + CRUSH rule 0 x 578 [4,10,1,2,7,13] + CRUSH rule 0 x 579 [13,1,15,2,10,7] + CRUSH rule 0 x 580 [3,12,4,1,10,15] + CRUSH rule 0 x 581 [7,14,12,10,1,2] + CRUSH rule 0 x 582 [10,5,13,14,1,2] + CRUSH rule 0 x 583 [4,15,1,9,10,12] + CRUSH rule 0 x 584 [10,1,5,13,6,9] + CRUSH rule 0 x 585 [5,3,6,1,11,14] + CRUSH rule 0 x 586 [7,10,14,12,9,3] + CRUSH rule 0 x 587 [11,6,9,4,1,14] + CRUSH rule 0 x 588 [3,12,7,15,4,9] + CRUSH rule 0 x 589 [9,7,12,1,10,3] + CRUSH rule 0 x 590 [12,1,3,9,10,6] + CRUSH rule 0 x 591 [2,6,14,13,9,11] + CRUSH rule 0 x 592 [15,12,9,7,5,2] + CRUSH rule 0 x 593 [13,14,5,11,9,6] + CRUSH rule 0 x 594 [12,14,2,9,7,4] + CRUSH rule 0 x 595 [12,7,10,3,1,14] + CRUSH rule 0 x 596 [2,7,12,11,1,5] + CRUSH rule 0 x 597 [15,1,2,10,7,13] + CRUSH rule 0 x 598 [11,5,9,14,12,7] + CRUSH rule 0 x 599 [13,11,1,5,6,2] + CRUSH rule 0 x 600 [4,12,3,10,9,7] + CRUSH rule 0 x 601 [13,5,15,2,1,7] + CRUSH rule 0 x 602 [3,11,7,1,13,15] + CRUSH rule 0 x 603 [3,1,4,14,10,9] + CRUSH rule 0 x 604 [14,2,6,1,11,13] + CRUSH rule 0 x 605 [2,7,12,5,14,10] + CRUSH rule 0 x 606 [12,15,1,5,7,9] + CRUSH rule 0 x 607 [3,9,10,14,7,1] + CRUSH rule 0 x 608 [13,10,1,7,9,15] + CRUSH rule 0 x 609 [14,3,7,9,11,12] + CRUSH rule 0 x 610 [7,10,5,1,12,2] + CRUSH rule 0 x 611 [13,1,5,3,10,7] + CRUSH rule 0 x 612 [7,1,2,13,9,15] + CRUSH rule 0 x 613 [10,7,14,9,5,2] + CRUSH rule 0 x 614 [9,4,15,3,1,11] + CRUSH rule 0 x 615 [9,4,11,2,1,12] + CRUSH rule 0 x 616 [10,14,1,5,3,6] + CRUSH rule 0 x 617 [15,7,2,11,12,1] + CRUSH rule 0 x 618 [4,2,10,6,14,9] + CRUSH rule 0 x 619 [15,4,3,9,6,1] + CRUSH rule 0 x 620 [3,7,11,14,13,1] + CRUSH rule 0 x 621 [3,6,4,14,1,11] + CRUSH rule 0 x 622 [10,2,13,5,15,9] + CRUSH rule 0 x 623 [4,9,14,7,3,13] + CRUSH rule 0 x 624 [3,9,15,6,10,1] + CRUSH rule 0 x 625 [11,7,3,5,13,15] + CRUSH rule 0 x 626 [10,12,2,1,9,7] + CRUSH rule 0 x 627 [1,12,10,14,3,5] + CRUSH rule 0 x 628 [15,13,11,4,2,1] + CRUSH rule 0 x 629 [5,6,15,12,1,10] + CRUSH rule 0 x 630 [1,4,12,9,3,7] + CRUSH rule 0 x 631 [5,7,1,15,12,11] + CRUSH rule 0 x 632 [12,3,11,9,6,1] + CRUSH rule 0 x 633 [14,4,3,7,10,12] + CRUSH rule 0 x 634 [6,9,5,3,13,11] + CRUSH rule 0 x 635 [6,5,2,15,9,12] + CRUSH rule 0 x 636 [13,6,11,3,15,9] + CRUSH rule 0 x 637 [3,1,10,6,9,12] + CRUSH rule 0 x 638 [10,15,3,5,13,1] + CRUSH rule 0 x 639 [6,9,14,4,3,1] + CRUSH rule 0 x 640 [9,6,1,11,14,2] + CRUSH rule 0 x 641 [10,6,5,14,1,9] + CRUSH rule 0 x 642 [1,15,4,6,2,10] + CRUSH rule 0 x 643 [3,7,5,1,10,15] + CRUSH rule 0 x 644 [15,13,6,9,3,11] + CRUSH rule 0 x 645 [14,2,4,9,10,1] + CRUSH rule 0 x 646 [5,13,14,1,6,9] + CRUSH rule 0 x 647 [10,1,9,13,6,2] + CRUSH rule 0 x 648 [6,5,2,14,11,1] + CRUSH rule 0 x 649 [3,9,13,11,4,14] + CRUSH rule 0 x 650 [10,9,4,15,12,7] + CRUSH rule 0 x 651 [3,9,5,7,14,1] + CRUSH rule 0 x 652 [15,9,4,6,13,1] + CRUSH rule 0 x 653 [11,14,1,3,6,9] + CRUSH rule 0 x 654 [13,6,2,10,15,4] + CRUSH rule 0 x 655 [6,3,4,15,12,11] + CRUSH rule 0 x 656 [3,15,1,4,6,12] + CRUSH rule 0 x 657 [11,15,3,5,7,13] + CRUSH rule 0 x 658 [7,2,10,12,1,4] + CRUSH rule 0 x 659 [2,5,14,6,10,12] + CRUSH rule 0 x 660 [13,14,10,6,4,9] + CRUSH rule 0 x 661 [7,15,3,12,11,4] + CRUSH rule 0 x 662 [15,2,12,5,1,10] + CRUSH rule 0 x 663 [14,9,13,10,5,3] + CRUSH rule 0 x 664 [6,10,12,4,9,2] + CRUSH rule 0 x 665 [2,9,12,1,7,10] + CRUSH rule 0 x 666 [12,3,6,1,15,9] + CRUSH rule 0 x 667 [1,9,12,10,2,14] + CRUSH rule 0 x 668 [9,5,1,2,6,11] + CRUSH rule 0 x 669 [9,7,14,5,11,13] + CRUSH rule 0 x 670 [6,10,9,13,1,2] + CRUSH rule 0 x 671 [6,15,5,10,13,3] + CRUSH rule 0 x 672 [2,9,13,1,4,14] + CRUSH rule 0 x 673 [7,10,5,9,15,13] + CRUSH rule 0 x 674 [7,12,10,1,14,9] + CRUSH rule 0 x 675 [9,5,1,10,6,14] + CRUSH rule 0 x 676 [10,12,2,1,4,15] + CRUSH rule 0 x 677 [2,12,1,4,10,6] + CRUSH rule 0 x 678 [1,2,4,10,12,14] + CRUSH rule 0 x 679 [5,6,12,15,9,11] + CRUSH rule 0 x 680 [7,11,3,1,15,4] + CRUSH rule 0 x 681 [6,4,3,11,14,13] + CRUSH rule 0 x 682 [6,1,11,15,12,2] + CRUSH rule 0 x 683 [6,13,2,4,9,14] + CRUSH rule 0 x 684 [9,11,3,7,15,4] + CRUSH rule 0 x 685 [5,1,15,7,9,2] + CRUSH rule 0 x 686 [1,9,11,14,6,13] + CRUSH rule 0 x 687 [7,13,3,5,11,9] + CRUSH rule 0 x 688 [11,9,1,14,3,5] + CRUSH rule 0 x 689 [5,2,9,12,1,14] + CRUSH rule 0 x 690 [9,7,10,3,13,15] + CRUSH rule 0 x 691 [11,15,9,5,7,13] + CRUSH rule 0 x 692 [15,5,1,2,9,11] + CRUSH rule 0 x 693 [5,6,12,15,2,10] + CRUSH rule 0 x 694 [4,7,1,10,12,3] + CRUSH rule 0 x 695 [6,13,14,10,9,5] + CRUSH rule 0 x 696 [1,2,4,14,7,11] + CRUSH rule 0 x 697 [13,11,3,6,4,14] + CRUSH rule 0 x 698 [11,13,4,2,6,1] + CRUSH rule 0 x 699 [7,14,12,4,2,11] + CRUSH rule 0 x 700 [12,14,11,9,4,6] + CRUSH rule 0 x 701 [3,13,1,14,4,7] + CRUSH rule 0 x 702 [3,12,15,6,5,11] + CRUSH rule 0 x 703 [15,11,13,3,4,7] + CRUSH rule 0 x 704 [6,4,2,15,11,1] + CRUSH rule 0 x 705 [14,6,11,5,1,13] + CRUSH rule 0 x 706 [1,12,3,6,4,10] + CRUSH rule 0 x 707 [4,7,14,3,10,9] + CRUSH rule 0 x 708 [3,10,5,1,15,9] + CRUSH rule 0 x 709 [11,12,3,7,5,14] + CRUSH rule 0 x 710 [14,2,11,9,5,7] + CRUSH rule 0 x 711 [14,3,9,10,12,5] + CRUSH rule 0 x 712 [12,3,11,15,9,1] + CRUSH rule 0 x 713 [11,9,3,15,13,6] + CRUSH rule 0 x 714 [12,1,9,7,2,15] + CRUSH rule 0 x 715 [6,1,14,4,11,12] + CRUSH rule 0 x 716 [11,13,9,14,5,2] + CRUSH rule 0 x 717 [12,4,10,9,15,1] + CRUSH rule 0 x 718 [7,15,5,2,11,13] + CRUSH rule 0 x 719 [5,15,13,3,1,7] + CRUSH rule 0 x 720 [4,13,10,2,7,9] + CRUSH rule 0 x 721 [11,3,14,9,1,12] + CRUSH rule 0 x 722 [2,4,6,1,9,15] + CRUSH rule 0 x 723 [2,1,12,15,11,7] + CRUSH rule 0 x 724 [7,1,9,10,5,15] + CRUSH rule 0 x 725 [11,12,7,15,4,1] + CRUSH rule 0 x 726 [7,14,4,3,11,13] + CRUSH rule 0 x 727 [2,5,1,11,15,7] + CRUSH rule 0 x 728 [13,11,4,6,15,2] + CRUSH rule 0 x 729 [15,11,4,6,2,9] + CRUSH rule 0 x 730 [3,7,1,13,11,15] + CRUSH rule 0 x 731 [9,1,6,5,2,11] + CRUSH rule 0 x 732 [1,2,10,13,9,4] + CRUSH rule 0 x 733 [11,3,5,6,1,9] + CRUSH rule 0 x 734 [14,3,11,7,12,9] + CRUSH rule 0 x 735 [6,9,2,10,13,14] + CRUSH rule 0 x 736 [3,9,1,11,7,5] + CRUSH rule 0 x 737 [1,4,2,12,9,10] + CRUSH rule 0 x 738 [11,15,7,4,9,2] + CRUSH rule 0 x 739 [11,12,6,2,4,1] + CRUSH rule 0 x 740 [7,9,10,13,1,15] + CRUSH rule 0 x 741 [12,11,7,15,2,5] + CRUSH rule 0 x 742 [9,7,4,11,12,1] + CRUSH rule 0 x 743 [5,13,9,15,10,7] + CRUSH rule 0 x 744 [6,2,13,1,14,11] + CRUSH rule 0 x 745 [3,6,1,4,11,12] + CRUSH rule 0 x 746 [3,7,9,10,14,5] + CRUSH rule 0 x 747 [15,11,5,2,13,9] + CRUSH rule 0 x 748 [6,10,13,2,14,5] + CRUSH rule 0 x 749 [14,9,10,7,5,1] + CRUSH rule 0 x 750 [1,14,6,5,11,2] + CRUSH rule 0 x 751 [15,1,6,9,5,11] + CRUSH rule 0 x 752 [13,1,7,3,11,15] + CRUSH rule 0 x 753 [4,11,1,3,15,7] + CRUSH rule 0 x 754 [14,12,11,4,2,1] + CRUSH rule 0 x 755 [13,6,1,10,4,2] + CRUSH rule 0 x 756 [3,4,14,6,1,10] + CRUSH rule 0 x 757 [10,6,1,4,13,15] + CRUSH rule 0 x 758 [6,3,4,10,15,13] + CRUSH rule 0 x 759 [5,7,3,14,11,1] + CRUSH rule 0 x 760 [1,15,10,12,4,3] + CRUSH rule 0 x 761 [2,12,1,14,5,7] + CRUSH rule 0 x 762 [1,4,10,9,3,7] + CRUSH rule 0 x 763 [4,13,1,14,7,10] + CRUSH rule 0 x 764 [1,14,6,13,9,5] + CRUSH rule 0 x 765 [9,15,2,13,4,1] + CRUSH rule 0 x 766 [11,2,7,15,9,12] + CRUSH rule 0 x 767 [6,11,4,3,12,14] + CRUSH rule 0 x 768 [2,12,15,7,1,11] + CRUSH rule 0 x 769 [15,1,9,2,11,12] + CRUSH rule 0 x 770 [15,13,4,6,3,10] + CRUSH rule 0 x 771 [9,2,12,11,6,14] + CRUSH rule 0 x 772 [4,3,13,11,14,1] + CRUSH rule 0 x 773 [3,7,4,15,1,12] + CRUSH rule 0 x 774 [12,6,3,15,5,9] + CRUSH rule 0 x 775 [5,10,14,2,6,1] + CRUSH rule 0 x 776 [10,15,3,9,6,13] + CRUSH rule 0 x 777 [11,13,4,7,1,14] + CRUSH rule 0 x 778 [13,1,9,11,15,6] + CRUSH rule 0 x 779 [5,11,1,14,2,9] + CRUSH rule 0 x 780 [13,9,3,6,4,1] + CRUSH rule 0 x 781 [5,7,14,3,1,12] + CRUSH rule 0 x 782 [2,15,9,7,11,13] + CRUSH rule 0 x 783 [12,7,5,14,9,1] + CRUSH rule 0 x 784 [14,1,10,13,3,4] + CRUSH rule 0 x 785 [6,12,1,2,4,9] + CRUSH rule 0 x 786 [10,5,2,15,1,7] + CRUSH rule 0 x 787 [1,12,10,2,9,4] + CRUSH rule 0 x 788 [4,2,9,13,6,15] + CRUSH rule 0 x 789 [9,2,14,7,4,12] + CRUSH rule 0 x 790 [15,2,7,4,1,10] + CRUSH rule 0 x 791 [9,4,7,13,14,11] + CRUSH rule 0 x 792 [6,4,15,10,12,3] + CRUSH rule 0 x 793 [15,9,6,2,13,11] + CRUSH rule 0 x 794 [5,12,2,14,9,10] + CRUSH rule 0 x 795 [6,14,12,4,10,1] + CRUSH rule 0 x 796 [11,2,12,6,15,4] + CRUSH rule 0 x 797 [14,3,7,1,5,13] + CRUSH rule 0 x 798 [5,11,6,13,1,3] + CRUSH rule 0 x 799 [2,9,14,4,13,6] + CRUSH rule 0 x 800 [6,3,4,11,15,13] + CRUSH rule 0 x 801 [2,5,6,13,9,1] + CRUSH rule 0 x 802 [1,4,12,7,3,9] + CRUSH rule 0 x 803 [7,2,4,1,11,13] + CRUSH rule 0 x 804 [5,14,9,7,3,1] + CRUSH rule 0 x 805 [13,4,3,1,10,15] + CRUSH rule 0 x 806 [6,2,13,4,15,1] + CRUSH rule 0 x 807 [14,2,7,4,9,12] + CRUSH rule 0 x 808 [2,15,12,7,9,1] + CRUSH rule 0 x 809 [1,11,7,12,4,2] + CRUSH rule 0 x 810 [2,5,9,12,15,1] + CRUSH rule 0 x 811 [15,6,3,10,1,5] + CRUSH rule 0 x 812 [7,11,2,14,9,5] + CRUSH rule 0 x 813 [4,10,13,14,2,6] + CRUSH rule 0 x 814 [13,4,9,3,10,6] + CRUSH rule 0 x 815 [15,12,9,4,10,6] + CRUSH rule 0 x 816 [14,10,13,7,3,9] + CRUSH rule 0 x 817 [10,7,2,15,13,9] + CRUSH rule 0 x 818 [15,2,11,4,1,12] + CRUSH rule 0 x 819 [5,12,10,6,1,14] + CRUSH rule 0 x 820 [3,6,9,12,11,15] + CRUSH rule 0 x 821 [15,10,9,13,3,4] + CRUSH rule 0 x 822 [10,13,2,9,7,4] + CRUSH rule 0 x 823 [2,6,12,10,15,4] + CRUSH rule 0 x 824 [3,7,9,13,15,5] + CRUSH rule 0 x 825 [10,5,14,6,12,9] + CRUSH rule 0 x 826 [5,2,11,15,1,12] + CRUSH rule 0 x 827 [13,5,1,3,7,9] + CRUSH rule 0 x 828 [12,6,10,5,1,9] + CRUSH rule 0 x 829 [13,6,15,10,5,3] + CRUSH rule 0 x 830 [15,13,2,9,7,11] + CRUSH rule 0 x 831 [1,4,11,12,6,3] + CRUSH rule 0 x 832 [14,11,13,2,9,4] + CRUSH rule 0 x 833 [9,13,3,11,7,5] + CRUSH rule 0 x 834 [9,7,5,1,11,2] + CRUSH rule 0 x 835 [14,3,13,6,4,9] + CRUSH rule 0 x 836 [3,9,10,13,1,5] + CRUSH rule 0 x 837 [15,12,11,2,7,9] + CRUSH rule 0 x 838 [12,14,9,2,5,7] + CRUSH rule 0 x 839 [3,4,6,10,15,1] + CRUSH rule 0 x 840 [10,15,12,4,7,1] + CRUSH rule 0 x 841 [3,5,7,12,11,15] + CRUSH rule 0 x 842 [9,13,2,6,5,14] + CRUSH rule 0 x 843 [14,7,4,9,3,12] + CRUSH rule 0 x 844 [7,1,4,15,9,2] + CRUSH rule 0 x 845 [13,6,1,15,4,2] + CRUSH rule 0 x 846 [3,7,15,13,1,9] + CRUSH rule 0 x 847 [12,15,11,5,2,7] + CRUSH rule 0 x 848 [11,13,1,14,5,9] + CRUSH rule 0 x 849 [3,15,11,9,6,1] + CRUSH rule 0 x 850 [1,3,10,6,14,4] + CRUSH rule 0 x 851 [14,4,3,6,11,1] + CRUSH rule 0 x 852 [9,12,4,7,15,2] + CRUSH rule 0 x 853 [13,14,6,11,2,4] + CRUSH rule 0 x 854 [7,11,12,1,4,15] + CRUSH rule 0 x 855 [14,4,12,6,3,1] + CRUSH rule 0 x 856 [5,10,7,3,15,9] + CRUSH rule 0 x 857 [4,3,13,11,9,1] + CRUSH rule 0 x 858 [5,15,6,3,9,12] + CRUSH rule 0 x 859 [5,15,6,2,1,11] + CRUSH rule 0 x 860 [11,14,1,12,6,9] + CRUSH rule 0 x 861 [13,7,4,10,1,14] + CRUSH rule 0 x 862 [5,10,9,7,3,12] + CRUSH rule 0 x 863 [11,6,3,9,4,12] + CRUSH rule 0 x 864 [6,13,4,2,10,15] + CRUSH rule 0 x 865 [4,1,14,11,6,9] + CRUSH rule 0 x 866 [2,13,4,15,9,6] + CRUSH rule 0 x 867 [12,2,9,10,4,14] + CRUSH rule 0 x 868 [14,11,7,2,1,4] + CRUSH rule 0 x 869 [10,13,7,14,3,5] + CRUSH rule 0 x 870 [14,9,11,4,3,12] + CRUSH rule 0 x 871 [6,2,1,4,15,13] + CRUSH rule 0 x 872 [6,1,15,3,10,12] + CRUSH rule 0 x 873 [2,5,12,10,1,9] + CRUSH rule 0 x 874 [12,4,7,2,15,10] + CRUSH rule 0 x 875 [10,6,14,1,12,5] + CRUSH rule 0 x 876 [14,7,13,3,9,1] + CRUSH rule 0 x 877 [15,11,13,9,5,1] + CRUSH rule 0 x 878 [7,14,3,13,9,1] + CRUSH rule 0 x 879 [12,2,7,4,10,15] + CRUSH rule 0 x 880 [2,12,10,7,1,4] + CRUSH rule 0 x 881 [6,3,1,11,4,15] + CRUSH rule 0 x 882 [11,13,7,1,2,15] + CRUSH rule 0 x 883 [13,1,3,10,6,5] + CRUSH rule 0 x 884 [6,15,4,9,3,11] + CRUSH rule 0 x 885 [14,7,9,4,2,13] + CRUSH rule 0 x 886 [13,11,4,2,1,14] + CRUSH rule 0 x 887 [14,4,12,11,2,6] + CRUSH rule 0 x 888 [10,12,7,15,9,2] + CRUSH rule 0 x 889 [15,13,4,1,6,2] + CRUSH rule 0 x 890 [10,12,14,2,9,5] + CRUSH rule 0 x 891 [9,5,11,6,3,15] + CRUSH rule 0 x 892 [12,15,2,4,7,9] + CRUSH rule 0 x 893 [1,3,5,9,6,10] + CRUSH rule 0 x 894 [7,2,11,13,4,1] + CRUSH rule 0 x 895 [2,1,11,5,7,15] + CRUSH rule 0 x 896 [9,1,14,10,4,12] + CRUSH rule 0 x 897 [7,5,14,3,1,9] + CRUSH rule 0 x 898 [10,6,12,9,15,5] + CRUSH rule 0 x 899 [1,11,5,3,13,14] + CRUSH rule 0 x 900 [2,9,10,7,13,14] + CRUSH rule 0 x 901 [9,12,11,3,14,4] + CRUSH rule 0 x 902 [4,2,6,15,12,10] + CRUSH rule 0 x 903 [14,10,3,1,12,6] + CRUSH rule 0 x 904 [15,12,4,9,6,3] + CRUSH rule 0 x 905 [12,6,11,3,9,4] + CRUSH rule 0 x 906 [14,11,12,2,4,9] + CRUSH rule 0 x 907 [7,12,3,9,10,5] + CRUSH rule 0 x 908 [2,15,9,6,10,13] + CRUSH rule 0 x 909 [10,14,1,13,2,9] + CRUSH rule 0 x 910 [12,7,4,15,10,3] + CRUSH rule 0 x 911 [11,15,2,4,9,13] + CRUSH rule 0 x 912 [6,4,14,13,3,1] + CRUSH rule 0 x 913 [4,6,10,1,12,3] + CRUSH rule 0 x 914 [4,15,2,10,1,13] + CRUSH rule 0 x 915 [12,14,1,9,4,3] + CRUSH rule 0 x 916 [3,1,11,5,6,13] + CRUSH rule 0 x 917 [1,15,6,5,10,3] + CRUSH rule 0 x 918 [7,14,11,4,9,2] + CRUSH rule 0 x 919 [10,7,3,13,15,1] + CRUSH rule 0 x 920 [4,2,10,15,1,13] + CRUSH rule 0 x 921 [1,11,6,13,4,2] + CRUSH rule 0 x 922 [6,4,14,13,3,1] + CRUSH rule 0 x 923 [12,2,5,14,10,1] + CRUSH rule 0 x 924 [6,2,14,13,9,1] + CRUSH rule 0 x 925 [12,15,2,10,1,5] + CRUSH rule 0 x 926 [3,13,10,1,14,9] + CRUSH rule 0 x 927 [6,5,1,11,14,2] + CRUSH rule 0 x 928 [13,1,3,9,6,11] + CRUSH rule 0 x 929 [10,7,1,5,2,12] + CRUSH rule 0 x 930 [7,15,10,5,1,13] + CRUSH rule 0 x 931 [6,15,11,9,5,3] + CRUSH rule 0 x 932 [13,2,5,11,9,1] + CRUSH rule 0 x 933 [12,7,14,10,4,1] + CRUSH rule 0 x 934 [12,2,5,7,9,1] + CRUSH rule 0 x 935 [6,11,1,14,5,13] + CRUSH rule 0 x 936 [9,12,7,5,1,2] + CRUSH rule 0 x 937 [14,2,11,1,13,4] + CRUSH rule 0 x 938 [14,3,5,11,7,9] + CRUSH rule 0 x 939 [6,4,14,9,12,1] + CRUSH rule 0 x 940 [13,11,4,2,1,6] + CRUSH rule 0 x 941 [3,12,4,7,14,10] + CRUSH rule 0 x 942 [15,12,10,4,1,9] + CRUSH rule 0 x 943 [10,2,4,9,6,15] + CRUSH rule 0 x 944 [2,9,4,7,1,14] + CRUSH rule 0 x 945 [10,15,2,9,5,12] + CRUSH rule 0 x 946 [11,15,7,12,5,9] + CRUSH rule 0 x 947 [11,3,14,1,12,5] + CRUSH rule 0 x 948 [7,13,11,5,14,2] + CRUSH rule 0 x 949 [9,1,12,5,15,10] + CRUSH rule 0 x 950 [9,15,13,6,4,2] + CRUSH rule 0 x 951 [2,6,12,9,10,4] + CRUSH rule 0 x 952 [9,7,15,3,5,13] + CRUSH rule 0 x 953 [1,3,6,10,12,14] + CRUSH rule 0 x 954 [10,2,14,9,4,6] + CRUSH rule 0 x 955 [7,14,3,1,10,4] + CRUSH rule 0 x 956 [1,6,11,5,14,3] + CRUSH rule 0 x 957 [14,11,1,12,6,9] + CRUSH rule 0 x 958 [15,4,3,11,1,6] + CRUSH rule 0 x 959 [2,1,12,15,10,9] + CRUSH rule 0 x 960 [2,6,11,13,15,4] + CRUSH rule 0 x 961 [3,13,11,9,6,1] + CRUSH rule 0 x 962 [5,11,3,14,1,6] + CRUSH rule 0 x 963 [13,10,15,4,6,9] + CRUSH rule 0 x 964 [7,11,4,9,2,12] + CRUSH rule 0 x 965 [12,2,9,7,4,15] + CRUSH rule 0 x 966 [12,14,9,4,1,2] + CRUSH rule 0 x 967 [7,5,3,10,12,14] + CRUSH rule 0 x 968 [12,15,4,9,11,6] + CRUSH rule 0 x 969 [11,4,7,1,9,14] + CRUSH rule 0 x 970 [5,12,10,1,3,14] + CRUSH rule 0 x 971 [1,9,4,12,7,2] + CRUSH rule 0 x 972 [12,3,14,5,1,9] + CRUSH rule 0 x 973 [1,10,4,12,2,7] + CRUSH rule 0 x 974 [7,11,1,2,15,4] + CRUSH rule 0 x 975 [7,9,15,12,2,11] + CRUSH rule 0 x 976 [7,3,15,5,12,11] + CRUSH rule 0 x 977 [14,3,6,10,4,1] + CRUSH rule 0 x 978 [12,5,11,1,15,3] + CRUSH rule 0 x 979 [5,1,13,6,15,10] + CRUSH rule 0 x 980 [15,11,5,6,1,3] + CRUSH rule 0 x 981 [5,11,15,12,7,1] + CRUSH rule 0 x 982 [2,6,14,11,12,9] + CRUSH rule 0 x 983 [3,12,10,9,14,5] + CRUSH rule 0 x 984 [15,13,1,10,2,5] + CRUSH rule 0 x 985 [11,2,15,1,4,13] + CRUSH rule 0 x 986 [6,13,9,1,15,10] + CRUSH rule 0 x 987 [13,14,5,10,6,1] + CRUSH rule 0 x 988 [12,9,10,14,3,1] + CRUSH rule 0 x 989 [7,4,3,15,9,13] + CRUSH rule 0 x 990 [1,10,9,13,3,4] + CRUSH rule 0 x 991 [7,11,1,14,2,5] + CRUSH rule 0 x 992 [9,10,2,13,7,4] + CRUSH rule 0 x 993 [6,10,14,12,4,1] + CRUSH rule 0 x 994 [3,13,15,4,11,7] + CRUSH rule 0 x 995 [15,6,12,2,5,11] + CRUSH rule 0 x 996 [15,10,5,3,13,1] + CRUSH rule 0 x 997 [15,2,1,12,7,9] + CRUSH rule 0 x 998 [6,1,9,5,12,11] + CRUSH rule 0 x 999 [9,10,15,5,13,3] + CRUSH rule 0 x 1000 [14,2,9,4,12,1] + CRUSH rule 0 x 1001 [11,14,4,2,6,9] + CRUSH rule 0 x 1002 [1,10,14,2,9,5] + CRUSH rule 0 x 1003 [10,7,5,14,2,1] + CRUSH rule 0 x 1004 [15,1,4,6,10,12] + CRUSH rule 0 x 1005 [6,12,2,10,9,15] + CRUSH rule 0 x 1006 [10,12,15,1,2,6] + CRUSH rule 0 x 1007 [1,7,13,14,3,4] + CRUSH rule 0 x 1008 [7,4,9,11,3,15] + CRUSH rule 0 x 1009 [5,2,11,7,15,9] + CRUSH rule 0 x 1010 [10,2,15,6,9,13] + CRUSH rule 0 x 1011 [6,3,12,1,10,4] + CRUSH rule 0 x 1012 [12,6,9,15,3,1] + CRUSH rule 0 x 1013 [2,14,12,4,9,1] + CRUSH rule 0 x 1014 [1,13,7,2,10,14] + CRUSH rule 0 x 1015 [12,6,10,1,4,15] + CRUSH rule 0 x 1016 [10,13,14,3,5,6] + CRUSH rule 0 x 1017 [5,11,14,7,13,9] + CRUSH rule 0 x 1018 [13,11,14,1,9,3] + CRUSH rule 0 x 1019 [10,13,14,7,5,1] + CRUSH rule 0 x 1020 [3,1,13,4,10,9] + CRUSH rule 0 x 1021 [2,11,14,9,4,6] + CRUSH rule 0 x 1022 [15,5,7,2,12,10] + CRUSH rule 0 x 1023 [15,2,9,12,1,7] + rule 0 (replicated_ruleset) num_rep 6 result size == 6:\t1024/1024 (esc) + CRUSH rule 0 x 0 [7,10,3,15,12,1,4] + CRUSH rule 0 x 1 [10,15,1,2,13,4,7] + CRUSH rule 0 x 2 [1,12,2,6,5,10,15] + CRUSH rule 0 x 3 [15,4,10,2,9,6,13] + CRUSH rule 0 x 4 [14,2,10,1,9,4,7] + CRUSH rule 0 x 5 [7,4,11,2,13,15,9] + CRUSH rule 0 x 6 [12,6,10,9,3,4,14] + CRUSH rule 0 x 7 [9,2,6,12,11,4,1] + CRUSH rule 0 x 8 [10,2,15,1,4,13,6] + CRUSH rule 0 x 9 [7,1,14,2,11,9,12] + CRUSH rule 0 x 10 [10,14,4,1,2,7,13] + CRUSH rule 0 x 11 [13,9,14,7,5,11,2] + CRUSH rule 0 x 12 [7,1,2,5,13,15,11] + CRUSH rule 0 x 13 [3,5,12,7,9,1,14] + CRUSH rule 0 x 14 [13,5,2,7,10,15,1] + CRUSH rule 0 x 15 [15,1,9,6,13,3,5] + CRUSH rule 0 x 16 [7,11,14,2,13,1,9] + CRUSH rule 0 x 17 [10,1,13,2,4,6,14] + CRUSH rule 0 x 18 [1,7,3,10,5,12,9] + CRUSH rule 0 x 19 [7,12,2,4,15,10,1] + CRUSH rule 0 x 20 [14,12,3,10,9,4,7] + CRUSH rule 0 x 21 [3,12,1,10,4,15,6] + CRUSH rule 0 x 22 [6,3,13,11,4,1,15] + CRUSH rule 0 x 23 [10,5,13,9,3,15,1] + CRUSH rule 0 x 24 [12,11,3,1,9,4,7] + CRUSH rule 0 x 25 [7,12,15,1,3,10,4] + CRUSH rule 0 x 26 [1,7,13,2,14,5,9] + CRUSH rule 0 x 27 [3,6,15,4,13,9,11] + CRUSH rule 0 x 28 [14,4,3,9,6,11,13] + CRUSH rule 0 x 29 [5,14,12,11,6,3,1] + CRUSH rule 0 x 30 [2,5,6,9,1,11,13] + CRUSH rule 0 x 31 [5,15,10,1,9,13,6] + CRUSH rule 0 x 32 [9,10,2,1,13,14,6] + CRUSH rule 0 x 33 [13,4,9,2,7,1,10] + CRUSH rule 0 x 34 [13,15,2,4,1,10,9] + CRUSH rule 0 x 35 [4,14,3,13,10,9,1] + CRUSH rule 0 x 36 [3,12,9,7,5,10,14] + CRUSH rule 0 x 37 [9,2,6,14,11,1,4] + CRUSH rule 0 x 38 [3,4,13,10,9,1,14] + CRUSH rule 0 x 39 [12,7,14,11,1,9,5] + CRUSH rule 0 x 40 [10,1,9,5,15,2,6] + CRUSH rule 0 x 41 [4,9,11,1,14,13,6] + CRUSH rule 0 x 42 [3,6,14,10,12,5,1] + CRUSH rule 0 x 43 [10,5,15,7,2,9,12] + CRUSH rule 0 x 44 [11,4,13,3,7,14,9] + CRUSH rule 0 x 45 [11,12,15,9,1,5,6] + CRUSH rule 0 x 46 [6,9,2,14,11,13,1] + CRUSH rule 0 x 47 [3,9,6,4,13,1,11] + CRUSH rule 0 x 48 [4,6,2,1,10,14,13] + CRUSH rule 0 x 49 [9,15,10,7,4,3,13] + CRUSH rule 0 x 50 [14,12,1,4,2,11,6] + CRUSH rule 0 x 51 [10,6,5,12,15,2,1] + CRUSH rule 0 x 52 [12,1,9,11,7,3,14] + CRUSH rule 0 x 53 [3,6,13,9,5,1,11] + CRUSH rule 0 x 54 [4,13,9,2,14,10,6] + CRUSH rule 0 x 55 [4,11,2,7,1,13,9] + CRUSH rule 0 x 56 [5,9,10,1,3,13,14] + CRUSH rule 0 x 57 [6,2,1,15,10,12,5] + CRUSH rule 0 x 58 [7,1,11,4,3,14,12] + CRUSH rule 0 x 59 [2,13,1,10,9,5,14] + CRUSH rule 0 x 60 [3,6,11,1,4,9,12] + CRUSH rule 0 x 61 [3,15,13,7,4,1,10] + CRUSH rule 0 x 62 [15,11,7,12,5,9,2] + CRUSH rule 0 x 63 [10,14,12,1,7,3] + CRUSH rule 0 x 64 [3,9,1,4,7,12,11] + CRUSH rule 0 x 65 [4,12,11,7,14,3,1] + CRUSH rule 0 x 66 [15,11,6,9,4,1,3] + CRUSH rule 0 x 67 [2,6,4,14,1,11,12] + CRUSH rule 0 x 68 [15,7,4,2,9,12,11] + CRUSH rule 0 x 69 [2,1,15,10,4,9,13] + CRUSH rule 0 x 70 [9,6,1,3,13,15,11] + CRUSH rule 0 x 71 [15,5,1,3,13,10,7] + CRUSH rule 0 x 72 [9,10,3,5,7,12,15] + CRUSH rule 0 x 73 [5,3,11,1,7,12,15] + CRUSH rule 0 x 74 [11,7,9,5,1,15,3] + CRUSH rule 0 x 75 [9,7,11,14,12,1,2] + CRUSH rule 0 x 76 [6,1,3,5,14,10,12] + CRUSH rule 0 x 77 [7,4,2,13,9,1,11] + CRUSH rule 0 x 78 [9,3,1,5,6,13,14] + CRUSH rule 0 x 79 [13,2,15,5,7,9,11] + CRUSH rule 0 x 80 [15,2,6,4,13,10,1] + CRUSH rule 0 x 81 [15,2,1,11,4,6,13] + CRUSH rule 0 x 82 [14,13,5,11,6,2,1] + CRUSH rule 0 x 83 [4,15,3,9,10,13,6] + CRUSH rule 0 x 84 [10,7,9,15,3,4,1] + CRUSH rule 0 x 85 [3,15,9,7,4,11,1] + CRUSH rule 0 x 86 [10,9,14,1,13,4,2] + CRUSH rule 0 x 87 [15,10,7,12,5,3,9] + CRUSH rule 0 x 88 [4,13,3,1,9,15,11] + CRUSH rule 0 x 89 [3,9,7,4,1,14,10] + CRUSH rule 0 x 90 [4,9,7,12,11,14,2] + CRUSH rule 0 x 91 [6,11,9,1,2,4,14] + CRUSH rule 0 x 92 [1,5,10,9,13,15,6] + CRUSH rule 0 x 93 [9,3,15,13,7,5,1] + CRUSH rule 0 x 94 [9,2,12,5,6,11,1] + CRUSH rule 0 x 95 [7,15,4,10,9,13,2] + CRUSH rule 0 x 96 [2,15,11,7,5,1,12] + CRUSH rule 0 x 97 [4,11,2,13,1,7,9] + CRUSH rule 0 x 98 [11,13,9,3,15,1,5] + CRUSH rule 0 x 99 [12,4,11,7,3,14,9] + CRUSH rule 0 x 100 [9,4,10,15,7,3,13] + CRUSH rule 0 x 101 [15,7,1,9,10,5,2] + CRUSH rule 0 x 102 [3,11,14,6,13,4,9] + CRUSH rule 0 x 103 [13,11,6,14,4,3,1] + CRUSH rule 0 x 104 [14,6,3,5,9,1,10] + CRUSH rule 0 x 105 [14,10,1,9,3,5,6] + CRUSH rule 0 x 106 [6,5,13,2,14,11,1] + CRUSH rule 0 x 107 [3,1,10,14,13,5,9] + CRUSH rule 0 x 108 [5,10,7,2,15,9,12] + CRUSH rule 0 x 109 [9,1,13,7,15,5,11] + CRUSH rule 0 x 110 [5,1,11,3,7,14,13] + CRUSH rule 0 x 111 [10,1,9,7,5,2,13] + CRUSH rule 0 x 112 [1,10,4,14,2,12,6] + CRUSH rule 0 x 113 [6,10,13,9,1,5,2] + CRUSH rule 0 x 114 [5,13,6,2,1,14,11] + CRUSH rule 0 x 115 [10,13,14,3,9,1,6] + CRUSH rule 0 x 116 [1,14,13,2,11,5,7] + CRUSH rule 0 x 117 [5,6,1,12,15,9,11] + CRUSH rule 0 x 118 [10,4,13,15,9,3,1] + CRUSH rule 0 x 119 [14,12,11,4,6,9,3] + CRUSH rule 0 x 120 [11,3,14,13,4,7] + CRUSH rule 0 x 121 [9,5,1,11,7,3,15] + CRUSH rule 0 x 122 [4,3,14,1,11,13,7] + CRUSH rule 0 x 123 [3,10,5,6,9,1,12] + CRUSH rule 0 x 124 [12,2,1,5,14,7,11] + CRUSH rule 0 x 125 [9,12,15,1,6,5,3] + CRUSH rule 0 x 126 [7,15,10,9,2,12,5] + CRUSH rule 0 x 127 [4,14,9,13,1,3,7] + CRUSH rule 0 x 128 [3,12,1,10,4,9,7] + CRUSH rule 0 x 129 [11,13,14,2,9,4,6] + CRUSH rule 0 x 130 [3,13,5,14,10,1,9] + CRUSH rule 0 x 131 [12,1,6,15,4,2,11] + CRUSH rule 0 x 132 [11,15,13,9,2,5,7] + CRUSH rule 0 x 133 [3,6,9,11,15,12,5] + CRUSH rule 0 x 134 [12,5,6,15,3,9,10] + CRUSH rule 0 x 135 [3,14,12,4,6,11,9] + CRUSH rule 0 x 136 [15,6,9,4,10,3,12] + CRUSH rule 0 x 137 [14,3,6,11,1,9,4] + CRUSH rule 0 x 138 [13,15,4,10,2,7,1] + CRUSH rule 0 x 139 [11,2,13,9,1,15,7] + CRUSH rule 0 x 140 [11,4,12,15,2,6,9] + CRUSH rule 0 x 141 [6,12,15,11,3,5,1] + CRUSH rule 0 x 142 [3,14,7,9,11,1,4] + CRUSH rule 0 x 143 [9,6,4,2,14,10,12] + CRUSH rule 0 x 144 [13,7,11,2,14,4,1] + CRUSH rule 0 x 145 [12,2,6,10,9,4,14] + CRUSH rule 0 x 146 [1,5,9,2,6,13,14] + CRUSH rule 0 x 147 [1,4,9,11,2,7,15] + CRUSH rule 0 x 148 [12,7,9,2,14,11,1] + CRUSH rule 0 x 149 [2,5,9,12,11,1,7] + CRUSH rule 0 x 150 [1,15,2,10,7,9,5] + CRUSH rule 0 x 151 [2,9,14,7,1,10,5] + CRUSH rule 0 x 152 [5,9,2,6,10,13,14] + CRUSH rule 0 x 153 [6,9,4,15,2,1,10] + CRUSH rule 0 x 154 [3,11,7,1,4,12,15] + CRUSH rule 0 x 155 [14,12,7,3,5,1,9] + CRUSH rule 0 x 156 [7,13,3,10,15,5,1] + CRUSH rule 0 x 157 [15,1,6,4,3,10,9] + CRUSH rule 0 x 158 [15,1,10,6,12,2,4] + CRUSH rule 0 x 159 [4,14,3,12,10,6,1] + CRUSH rule 0 x 160 [5,7,3,14,11,1,12] + CRUSH rule 0 x 161 [1,2,11,4,6,13,14] + CRUSH rule 0 x 162 [10,6,1,12,2,4,14] + CRUSH rule 0 x 163 [15,1,10,2,6,4,13] + CRUSH rule 0 x 164 [9,14,10,7,12,2,5] + CRUSH rule 0 x 165 [11,7,2,13,9,15,1] + CRUSH rule 0 x 166 [1,2,12,14,4,11,7] + CRUSH rule 0 x 167 [9,7,3,4,11,13,15] + CRUSH rule 0 x 168 [13,2,4,1,6,15,10] + CRUSH rule 0 x 169 [1,4,9,14,13,10,2] + CRUSH rule 0 x 170 [1,15,7,9,12,10,3] + CRUSH rule 0 x 171 [9,2,10,7,1,5,15] + CRUSH rule 0 x 172 [14,4,10,12,9,3,6] + CRUSH rule 0 x 173 [5,10,12,15,6,1,2] + CRUSH rule 0 x 174 [15,6,4,12,1,11,9] + CRUSH rule 0 x 175 [5,7,9,3,10,1,14] + CRUSH rule 0 x 176 [9,6,3,14,13,10,4] + CRUSH rule 0 x 177 [2,9,10,13,4,1,14] + CRUSH rule 0 x 178 [12,11,7,14,3,4] + CRUSH rule 0 x 179 [2,10,13,9,5,1,7] + CRUSH rule 0 x 180 [3,11,5,15,7,12] + CRUSH rule 0 x 181 [9,12,6,5,1,10,14] + CRUSH rule 0 x 182 [5,13,11,2,1,6,14] + CRUSH rule 0 x 183 [5,7,10,13,3,9,14] + CRUSH rule 0 x 184 [2,5,11,12,7,1,9] + CRUSH rule 0 x 185 [13,5,7,11,2,14] + CRUSH rule 0 x 186 [6,14,13,5,10,1,3] + CRUSH rule 0 x 187 [1,4,11,13,6,14,9] + CRUSH rule 0 x 188 [9,13,5,14,10,6,2] + CRUSH rule 0 x 189 [6,12,4,9,2,1,11] + CRUSH rule 0 x 190 [9,13,15,10,3,1,5] + CRUSH rule 0 x 191 [7,11,4,1,15,12,9] + CRUSH rule 0 x 192 [2,11,5,15,6,1,13] + CRUSH rule 0 x 193 [3,13,6,10,4,1,9] + CRUSH rule 0 x 194 [3,13,4,14,6,9,1] + CRUSH rule 0 x 195 [5,7,10,12,1,3,15] + CRUSH rule 0 x 196 [4,15,1,10,9,2,13] + CRUSH rule 0 x 197 [14,10,13,4,6,3,1] + CRUSH rule 0 x 198 [2,5,6,15,9,13,10] + CRUSH rule 0 x 199 [2,10,4,15,1,9,6] + CRUSH rule 0 x 200 [7,14,11,4,1,3,13] + CRUSH rule 0 x 201 [9,14,1,7,4,3,10] + CRUSH rule 0 x 202 [14,11,7,3,5,1,12] + CRUSH rule 0 x 203 [12,5,7,15,1,2,10] + CRUSH rule 0 x 204 [6,11,3,12,14,1,9] + CRUSH rule 0 x 205 [15,4,6,10,13,9,2] + CRUSH rule 0 x 206 [13,11,2,15,7,1,5] + CRUSH rule 0 x 207 [2,11,7,4,14,1,12] + CRUSH rule 0 x 208 [13,1,6,14,9,11,3] + CRUSH rule 0 x 209 [6,15,13,1,11,4,9] + CRUSH rule 0 x 210 [13,11,2,7,5,14,9] + CRUSH rule 0 x 211 [2,14,1,13,11,7,9] + CRUSH rule 0 x 212 [10,1,12,15,5,6,2] + CRUSH rule 0 x 213 [3,9,6,5,15,13,1] + CRUSH rule 0 x 214 [7,15,4,1,10,2,13] + CRUSH rule 0 x 215 [6,1,4,13,3,11,14] + CRUSH rule 0 x 216 [12,9,6,2,1,11,5] + CRUSH rule 0 x 217 [12,11,1,14,2,4,7] + CRUSH rule 0 x 218 [12,10,15,6,1,4,9] + CRUSH rule 0 x 219 [3,11,14,6,4,1,13] + CRUSH rule 0 x 220 [14,4,3,12,10,9,6] + CRUSH rule 0 x 221 [15,5,2,6,12,11,9] + CRUSH rule 0 x 222 [10,4,3,15,7,12,1] + CRUSH rule 0 x 223 [9,7,11,1,4,14,13] + CRUSH rule 0 x 224 [1,7,10,2,12,9,14] + CRUSH rule 0 x 225 [10,5,2,6,1,13,9] + CRUSH rule 0 x 226 [4,1,9,3,13,10,15] + CRUSH rule 0 x 227 [7,2,12,15,5,11] + CRUSH rule 0 x 228 [2,15,11,1,6,13,9] + CRUSH rule 0 x 229 [9,3,7,14,1,12,4] + CRUSH rule 0 x 230 [10,5,7,2,15,1,13] + CRUSH rule 0 x 231 [2,7,5,13,9,15,10] + CRUSH rule 0 x 232 [10,5,13,1,9,2,7] + CRUSH rule 0 x 233 [6,12,11,4,9,14,1] + CRUSH rule 0 x 234 [10,1,2,12,5,9,15] + CRUSH rule 0 x 235 [13,14,7,10,1,9,5] + CRUSH rule 0 x 236 [2,15,9,12,1,7,4] + CRUSH rule 0 x 237 [3,12,9,10,4,7,15] + CRUSH rule 0 x 238 [2,10,4,15,6,12,9] + CRUSH rule 0 x 239 [4,15,10,7,9,13,3] + CRUSH rule 0 x 240 [15,5,13,7,2,9,10] + CRUSH rule 0 x 241 [7,9,15,12,1,5,2] + CRUSH rule 0 x 242 [14,2,6,9,10,12,5] + CRUSH rule 0 x 243 [2,11,5,1,15,6,9] + CRUSH rule 0 x 244 [13,9,15,3,11,7,5] + CRUSH rule 0 x 245 [12,9,15,3,1,5,10] + CRUSH rule 0 x 246 [15,3,5,11,7,1,12] + CRUSH rule 0 x 247 [6,4,9,12,1,2,10] + CRUSH rule 0 x 248 [5,13,7,11,9,15,3] + CRUSH rule 0 x 249 [10,14,7,3,9,13,1] + CRUSH rule 0 x 250 [12,15,1,10,5,6,3] + CRUSH rule 0 x 251 [13,2,15,5,6,1,9] + CRUSH rule 0 x 252 [7,5,13,9,3,10,14] + CRUSH rule 0 x 253 [3,13,15,10,7,4] + CRUSH rule 0 x 254 [2,9,13,14,4,6,10] + CRUSH rule 0 x 255 [1,9,13,2,6,10,4] + CRUSH rule 0 x 256 [6,9,13,1,3,14,5] + CRUSH rule 0 x 257 [15,12,3,9,6,4,11] + CRUSH rule 0 x 258 [12,5,6,10,2,1,14] + CRUSH rule 0 x 259 [9,10,4,3,14,13,1] + CRUSH rule 0 x 260 [10,12,6,9,3,15,1] + CRUSH rule 0 x 261 [13,7,2,1,15,5,11] + CRUSH rule 0 x 262 [15,3,12,7,4,9,1] + CRUSH rule 0 x 263 [12,6,10,9,5,15,3] + CRUSH rule 0 x 264 [13,14,11,3,1,4,7] + CRUSH rule 0 x 265 [12,10,14,5,7,1,9] + CRUSH rule 0 x 266 [14,7,11,1,2,9,4] + CRUSH rule 0 x 267 [12,11,6,5,1,2,15] + CRUSH rule 0 x 268 [4,1,15,12,6,11,3] + CRUSH rule 0 x 269 [11,1,15,5,13,9,7] + CRUSH rule 0 x 270 [7,11,12,3,1,14,9] + CRUSH rule 0 x 271 [4,7,3,13,15,10,9] + CRUSH rule 0 x 272 [15,5,13,10,6,2] + CRUSH rule 0 x 273 [2,10,7,12,1,15,5] + CRUSH rule 0 x 274 [10,2,5,6,13,9,15] + CRUSH rule 0 x 275 [10,3,4,7,14,13] + CRUSH rule 0 x 276 [5,12,9,2,11,7,15] + CRUSH rule 0 x 277 [14,3,13,4,1,9,11] + CRUSH rule 0 x 278 [5,6,14,3,1,11,13] + CRUSH rule 0 x 279 [6,10,13,3,9,4,15] + CRUSH rule 0 x 280 [7,3,14,9,1,11,4] + CRUSH rule 0 x 281 [5,11,14,7,9,13,2] + CRUSH rule 0 x 282 [2,1,13,14,9,7,5] + CRUSH rule 0 x 283 [4,1,12,3,10,7,15] + CRUSH rule 0 x 284 [5,11,7,15,3,13,1] + CRUSH rule 0 x 285 [15,5,3,1,6,13,11] + CRUSH rule 0 x 286 [10,4,3,6,12,15,1] + CRUSH rule 0 x 287 [12,4,9,1,3,11,15] + CRUSH rule 0 x 288 [4,12,10,7,1,3,14] + CRUSH rule 0 x 289 [2,5,14,9,13,6,10] + CRUSH rule 0 x 290 [12,2,5,6,15,9,1] + CRUSH rule 0 x 291 [7,11,1,14,5,9,2] + CRUSH rule 0 x 292 [4,10,6,3,14,9,12] + CRUSH rule 0 x 293 [6,5,11,1,2,14,12] + CRUSH rule 0 x 294 [9,12,3,14,6,11,5] + CRUSH rule 0 x 295 [6,10,3,14,9,4,13] + CRUSH rule 0 x 296 [3,1,13,7,14,9,10] + CRUSH rule 0 x 297 [6,13,4,14,10,1,2] + CRUSH rule 0 x 298 [14,9,13,1,4,2,7] + CRUSH rule 0 x 299 [14,12,11,6,4,2,1] + CRUSH rule 0 x 300 [15,7,10,5,1,3,13] + CRUSH rule 0 x 301 [9,11,7,1,13,14,4] + CRUSH rule 0 x 302 [9,7,1,13,5,10,3] + CRUSH rule 0 x 303 [4,13,3,7,10,15,1] + CRUSH rule 0 x 304 [6,9,2,11,15,13,4] + CRUSH rule 0 x 305 [13,7,5,11,2,15,9] + CRUSH rule 0 x 306 [10,12,4,6,9,2,15] + CRUSH rule 0 x 307 [11,12,15,5,6,2,1] + CRUSH rule 0 x 308 [12,14,10,9,1,2,5] + CRUSH rule 0 x 309 [9,3,12,5,11,15,7] + CRUSH rule 0 x 310 [3,1,5,10,14,9,7] + CRUSH rule 0 x 311 [3,9,7,1,14,13,10] + CRUSH rule 0 x 312 [15,13,9,7,5,10,2] + CRUSH rule 0 x 313 [9,15,3,7,5,13,1] + CRUSH rule 0 x 314 [2,15,9,5,6,12,1] + CRUSH rule 0 x 315 [15,2,13,1,11,9,6] + CRUSH rule 0 x 316 [4,9,11,2,12,14,6] + CRUSH rule 0 x 317 [1,5,3,13,15,7,10] + CRUSH rule 0 x 318 [4,1,15,11,9,13,6] + CRUSH rule 0 x 319 [2,15,4,1,11,9,7] + CRUSH rule 0 x 320 [5,7,13,9,11,2,1] + CRUSH rule 0 x 321 [1,6,11,15,5,3,13] + CRUSH rule 0 x 322 [13,7,5,3,14,11,1] + CRUSH rule 0 x 323 [7,4,10,1,2,13,14] + CRUSH rule 0 x 324 [5,6,10,15,2,13] + CRUSH rule 0 x 325 [9,10,14,5,1,6,2] + CRUSH rule 0 x 326 [11,7,13,4,2,15,1] + CRUSH rule 0 x 327 [12,5,10,14,3,7,9] + CRUSH rule 0 x 328 [5,2,6,14,1,11,12] + CRUSH rule 0 x 329 [2,6,15,5,9,10,13] + CRUSH rule 0 x 330 [3,9,11,13,1,6,5] + CRUSH rule 0 x 331 [12,14,6,3,1,4,10] + CRUSH rule 0 x 332 [10,12,6,15,9,2,5] + CRUSH rule 0 x 333 [6,5,3,12,14,10,9] + CRUSH rule 0 x 334 [4,9,2,12,7,11,15] + CRUSH rule 0 x 335 [11,7,1,5,13,2,9] + CRUSH rule 0 x 336 [6,14,13,2,5,9,11] + CRUSH rule 0 x 337 [15,11,3,7,12,5] + CRUSH rule 0 x 338 [10,5,3,6,15,1,9] + CRUSH rule 0 x 339 [11,14,13,5,3,7,1] + CRUSH rule 0 x 340 [11,6,12,4,9,3,14] + CRUSH rule 0 x 341 [7,5,2,10,14,9,1] + CRUSH rule 0 x 342 [12,14,1,9,2,11,4] + CRUSH rule 0 x 343 [12,14,9,6,10,2,4] + CRUSH rule 0 x 344 [9,11,5,2,14,13,1] + CRUSH rule 0 x 345 [14,2,11,9,6,12,4] + CRUSH rule 0 x 346 [5,3,14,10,7,1,13] + CRUSH rule 0 x 347 [10,2,12,6,9,1,14] + CRUSH rule 0 x 348 [7,9,10,1,14,13,3] + CRUSH rule 0 x 349 [9,6,10,12,1,5,14] + CRUSH rule 0 x 350 [13,9,15,4,10,7,2] + CRUSH rule 0 x 351 [13,5,15,3,1,6,11] + CRUSH rule 0 x 352 [1,12,11,9,4,7,3] + CRUSH rule 0 x 353 [10,14,12,2,9,1,4] + CRUSH rule 0 x 354 [6,3,15,10,9,4,13] + CRUSH rule 0 x 355 [13,14,6,10,2,5,1] + CRUSH rule 0 x 356 [15,13,2,9,6,5,1] + CRUSH rule 0 x 357 [4,11,1,13,3,14,6] + CRUSH rule 0 x 358 [12,7,2,9,1,14,10] + CRUSH rule 0 x 359 [5,15,7,11,3,13] + CRUSH rule 0 x 360 [13,10,1,2,6,14,5] + CRUSH rule 0 x 361 [5,3,13,6,1,14,11] + CRUSH rule 0 x 362 [2,9,11,13,1,6,5] + CRUSH rule 0 x 363 [7,12,3,9,15,4,1] + CRUSH rule 0 x 364 [2,12,6,9,5,10,15] + CRUSH rule 0 x 365 [13,5,11,15,6,2,9] + CRUSH rule 0 x 366 [12,7,3,14,5,10,9] + CRUSH rule 0 x 367 [7,13,3,1,5,11,15] + CRUSH rule 0 x 368 [7,9,10,15,3,4,13] + CRUSH rule 0 x 369 [7,5,3,13,14,9,11] + CRUSH rule 0 x 370 [4,7,14,1,2,9,11] + CRUSH rule 0 x 371 [1,7,12,3,4,15,10] + CRUSH rule 0 x 372 [10,4,3,14,6,1,12] + CRUSH rule 0 x 373 [15,5,2,6,13,1,9] + CRUSH rule 0 x 374 [3,15,12,5,1,6,10] + CRUSH rule 0 x 375 [5,2,14,1,6,13,11] + CRUSH rule 0 x 376 [5,14,10,13,3,6,1] + CRUSH rule 0 x 377 [1,15,2,4,9,11,12] + CRUSH rule 0 x 378 [9,12,2,15,1,5,11] + CRUSH rule 0 x 379 [11,2,15,5,7,9,13] + CRUSH rule 0 x 380 [6,1,12,11,2,9,5] + CRUSH rule 0 x 381 [15,13,7,5,10,2,1] + CRUSH rule 0 x 382 [14,3,1,4,13,7,10] + CRUSH rule 0 x 383 [3,6,11,4,13,15,1] + CRUSH rule 0 x 384 [4,13,6,3,15,11,9] + CRUSH rule 0 x 385 [4,6,15,3,10,9,1] + CRUSH rule 0 x 386 [14,3,11,13,5,6,9] + CRUSH rule 0 x 387 [1,11,5,7,9,2,14] + CRUSH rule 0 x 388 [2,6,11,9,15,4,12] + CRUSH rule 0 x 389 [12,7,2,4,15,10,1] + CRUSH rule 0 x 390 [2,11,13,7,5,9,15] + CRUSH rule 0 x 391 [3,4,9,13,7,10,1] + CRUSH rule 0 x 392 [11,5,14,7,1,9,2] + CRUSH rule 0 x 393 [2,14,5,9,7,13,11] + CRUSH rule 0 x 394 [4,9,3,15,13,6,1] + CRUSH rule 0 x 395 [10,13,5,15,6,9,3] + CRUSH rule 0 x 396 [2,12,15,9,4,6,11] + CRUSH rule 0 x 397 [1,14,9,4,12,10,3] + CRUSH rule 0 x 398 [9,2,1,5,12,6,11] + CRUSH rule 0 x 399 [5,9,14,3,1,10,13] + CRUSH rule 0 x 400 [10,6,2,4,15,12,1] + CRUSH rule 0 x 401 [6,9,11,12,4,3,15] + CRUSH rule 0 x 402 [4,7,9,2,13,1,15] + CRUSH rule 0 x 403 [7,15,13,3,5,9,10] + CRUSH rule 0 x 404 [14,12,7,9,2,1,5] + CRUSH rule 0 x 405 [9,15,11,2,4,7,13] + CRUSH rule 0 x 406 [12,14,9,2,7,10,4] + CRUSH rule 0 x 407 [9,5,12,10,15,6,3] + CRUSH rule 0 x 408 [7,1,5,2,10,15,13] + CRUSH rule 0 x 409 [11,2,4,13,1,15,7] + CRUSH rule 0 x 410 [6,4,14,2,12,9,10] + CRUSH rule 0 x 411 [13,11,15,6,4,1,9] + CRUSH rule 0 x 412 [5,9,6,11,14,2,12] + CRUSH rule 0 x 413 [13,5,3,11,6,9,1] + CRUSH rule 0 x 414 [3,11,9,13,4,1,6] + CRUSH rule 0 x 415 [6,10,14,5,1,13,3] + CRUSH rule 0 x 416 [13,1,4,7,2,9,14] + CRUSH rule 0 x 417 [4,12,1,15,2,11,9] + CRUSH rule 0 x 418 [14,5,10,2,6,9,13] + CRUSH rule 0 x 419 [5,14,10,9,2,12,6] + CRUSH rule 0 x 420 [2,4,9,11,6,14,13] + CRUSH rule 0 x 421 [15,4,10,3,9,12,7] + CRUSH rule 0 x 422 [4,11,2,7,13,9,15] + CRUSH rule 0 x 423 [3,15,12,6,5,1,9] + CRUSH rule 0 x 424 [6,10,12,2,5,1,14] + CRUSH rule 0 x 425 [11,15,2,13,5,7,9] + CRUSH rule 0 x 426 [12,4,7,1,9,10,14] + CRUSH rule 0 x 427 [14,10,3,1,9,7,5] + CRUSH rule 0 x 428 [12,7,9,4,2,1,14] + CRUSH rule 0 x 429 [3,4,9,7,11,12,1] + CRUSH rule 0 x 430 [3,5,10,13,1,15,6] + CRUSH rule 0 x 431 [9,3,7,1,12,5,14] + CRUSH rule 0 x 432 [4,1,12,7,15,2,10] + CRUSH rule 0 x 433 [4,11,12,15,7,3] + CRUSH rule 0 x 434 [2,14,9,1,5,11,7] + CRUSH rule 0 x 435 [13,11,5,6,9,2,15] + CRUSH rule 0 x 436 [9,15,10,2,4,1,12] + CRUSH rule 0 x 437 [9,6,3,14,10,12,5] + CRUSH rule 0 x 438 [7,2,13,4,11,1,9] + CRUSH rule 0 x 439 [7,14,4,3,12,10] + CRUSH rule 0 x 440 [14,11,9,2,7,12,1] + CRUSH rule 0 x 441 [2,4,11,9,13,6,1] + CRUSH rule 0 x 442 [10,13,9,7,15,1,4] + CRUSH rule 0 x 443 [12,15,10,9,2,1,6] + CRUSH rule 0 x 444 [4,13,7,14,3,1,9] + CRUSH rule 0 x 445 [4,2,15,7,1,9,11] + CRUSH rule 0 x 446 [12,10,6,9,4,1,15] + CRUSH rule 0 x 447 [15,7,13,1,4,9,3] + CRUSH rule 0 x 448 [5,2,13,7,15,10] + CRUSH rule 0 x 449 [14,5,3,12,10,9,6] + CRUSH rule 0 x 450 [2,4,6,9,15,1,13] + CRUSH rule 0 x 451 [6,14,11,3,9,1,12] + CRUSH rule 0 x 452 [14,9,10,4,2,13,7] + CRUSH rule 0 x 453 [5,15,13,2,6,9,11] + CRUSH rule 0 x 454 [10,4,2,6,15,12,9] + CRUSH rule 0 x 455 [6,13,2,4,10,1,15] + CRUSH rule 0 x 456 [5,7,13,1,11,3,9] + CRUSH rule 0 x 457 [9,1,5,7,11,13,15] + CRUSH rule 0 x 458 [9,11,15,4,7,2,12] + CRUSH rule 0 x 459 [13,15,11,1,5,2,6] + CRUSH rule 0 x 460 [5,12,10,15,7,3,9] + CRUSH rule 0 x 461 [4,3,9,13,15,6,10] + CRUSH rule 0 x 462 [4,7,12,14,11,1,3] + CRUSH rule 0 x 463 [4,12,14,11,2,7,1] + CRUSH rule 0 x 464 [4,2,15,10,1,9,13] + CRUSH rule 0 x 465 [5,10,9,7,13,1,3] + CRUSH rule 0 x 466 [13,5,2,15,9,11,6] + CRUSH rule 0 x 467 [13,6,14,3,9,1,11] + CRUSH rule 0 x 468 [10,7,12,14,4,1,9] + CRUSH rule 0 x 469 [4,9,6,14,12,11,3] + CRUSH rule 0 x 470 [3,9,12,15,5,6,10] + CRUSH rule 0 x 471 [6,1,5,14,13,10,9] + CRUSH rule 0 x 472 [2,14,7,5,13,1,11] + CRUSH rule 0 x 473 [15,10,6,9,4,12,2] + CRUSH rule 0 x 474 [15,10,4,12,6,9,2] + CRUSH rule 0 x 475 [10,5,12,9,14,3,6] + CRUSH rule 0 x 476 [3,6,10,12,1,15,9] + CRUSH rule 0 x 477 [6,13,5,15,11,9,2] + CRUSH rule 0 x 478 [4,15,1,3,7,12,10] + CRUSH rule 0 x 479 [13,11,1,6,14,5,9] + CRUSH rule 0 x 480 [1,13,6,4,9,14,11] + CRUSH rule 0 x 481 [15,12,7,9,1,3,10] + CRUSH rule 0 x 482 [2,12,9,1,7,11,14] + CRUSH rule 0 x 483 [10,1,4,15,9,7,13] + CRUSH rule 0 x 484 [1,4,10,13,7,14,2] + CRUSH rule 0 x 485 [9,4,3,1,14,12,7] + CRUSH rule 0 x 486 [3,10,15,9,7,13,4] + CRUSH rule 0 x 487 [12,11,4,14,7,2,1] + CRUSH rule 0 x 488 [14,4,1,9,2,6,10] + CRUSH rule 0 x 489 [11,4,2,13,15,7] + CRUSH rule 0 x 490 [4,9,1,3,13,15,6] + CRUSH rule 0 x 491 [1,12,5,2,14,11,6] + CRUSH rule 0 x 492 [5,7,11,3,14,9,1] + CRUSH rule 0 x 493 [12,1,4,15,3,11,9] + CRUSH rule 0 x 494 [1,7,13,4,15,9,10] + CRUSH rule 0 x 495 [3,15,7,1,9,5,12] + CRUSH rule 0 x 496 [5,3,7,13,9,14,10] + CRUSH rule 0 x 497 [13,10,3,6,5,14,1] + CRUSH rule 0 x 498 [10,6,1,5,9,12,3] + CRUSH rule 0 x 499 [14,3,12,5,1,11,9] + CRUSH rule 0 x 500 [15,9,6,12,11,2,1] + CRUSH rule 0 x 501 [10,13,1,9,3,14,5] + CRUSH rule 0 x 502 [5,1,14,11,7,12,9] + CRUSH rule 0 x 503 [15,10,7,9,1,12,4] + CRUSH rule 0 x 504 [13,2,7,1,14,11,5] + CRUSH rule 0 x 505 [12,7,5,2,14,10,9] + CRUSH rule 0 x 506 [11,7,9,14,12,1,2] + CRUSH rule 0 x 507 [4,14,13,3,9,7,1] + CRUSH rule 0 x 508 [12,1,4,9,2,11,15] + CRUSH rule 0 x 509 [4,2,6,9,14,1,10] + CRUSH rule 0 x 510 [5,3,1,12,11,14,9] + CRUSH rule 0 x 511 [2,12,10,6,14,5] + CRUSH rule 0 x 512 [15,11,3,5,7,1,13] + CRUSH rule 0 x 513 [4,9,11,3,13,7,1] + CRUSH rule 0 x 514 [11,9,3,4,12,15,6] + CRUSH rule 0 x 515 [12,14,6,5,3,9,1] + CRUSH rule 0 x 516 [14,11,1,12,3,7,4] + CRUSH rule 0 x 517 [11,5,6,13,9,3,14] + CRUSH rule 0 x 518 [3,5,7,12,15,11,9] + CRUSH rule 0 x 519 [12,14,2,1,4,6,9] + CRUSH rule 0 x 520 [12,4,2,10,6,15,9] + CRUSH rule 0 x 521 [11,5,9,6,15,3,13] + CRUSH rule 0 x 522 [4,12,11,1,15,3,9] + CRUSH rule 0 x 523 [3,1,5,9,15,10,13] + CRUSH rule 0 x 524 [15,9,3,11,13,7,4] + CRUSH rule 0 x 525 [3,15,11,6,9,12,4] + CRUSH rule 0 x 526 [10,2,5,13,6,15,1] + CRUSH rule 0 x 527 [3,13,4,1,9,10,14] + CRUSH rule 0 x 528 [12,7,15,10,2,5,9] + CRUSH rule 0 x 529 [6,4,10,12,2,9,14] + CRUSH rule 0 x 530 [11,9,12,7,5,1,3] + CRUSH rule 0 x 531 [9,15,4,7,2,13,1] + CRUSH rule 0 x 532 [5,3,13,7,9,14,1] + CRUSH rule 0 x 533 [12,15,1,2,7,5,10] + CRUSH rule 0 x 534 [11,9,3,7,15,4,1] + CRUSH rule 0 x 535 [11,1,3,5,14,9,12] + CRUSH rule 0 x 536 [9,1,14,13,4,6,2] + CRUSH rule 0 x 537 [15,5,13,2,7,11] + CRUSH rule 0 x 538 [13,5,11,2,6,15,9] + CRUSH rule 0 x 539 [10,12,6,14,1,2,9] + CRUSH rule 0 x 540 [12,15,7,3,9,11,1] + CRUSH rule 0 x 541 [2,1,6,11,14,13,4] + CRUSH rule 0 x 542 [3,9,15,5,11,12,7] + CRUSH rule 0 x 543 [4,10,9,3,6,13,14] + CRUSH rule 0 x 544 [3,15,9,11,7,4,12] + CRUSH rule 0 x 545 [14,10,7,12,4,9,1] + CRUSH rule 0 x 546 [5,15,13,7,1,10,9] + CRUSH rule 0 x 547 [5,13,7,9,3,14,10] + CRUSH rule 0 x 548 [11,7,12,15,4,2] + CRUSH rule 0 x 549 [14,1,4,9,13,6,3] + CRUSH rule 0 x 550 [9,15,3,13,1,6,4] + CRUSH rule 0 x 551 [11,2,15,6,13,5,1] + CRUSH rule 0 x 552 [2,11,14,1,9,6,5] + CRUSH rule 0 x 553 [11,9,14,6,4,13,3] + CRUSH rule 0 x 554 [11,14,6,4,13,9,3] + CRUSH rule 0 x 555 [6,5,10,9,14,2,13] + CRUSH rule 0 x 556 [15,6,3,13,11,4,1] + CRUSH rule 0 x 557 [12,2,5,14,10,9,6] + CRUSH rule 0 x 558 [12,1,6,15,5,10,3] + CRUSH rule 0 x 559 [2,13,5,10,14,7,1] + CRUSH rule 0 x 560 [4,9,12,6,3,10,1] + CRUSH rule 0 x 561 [12,7,1,2,5,15,11] + CRUSH rule 0 x 562 [7,13,9,14,2,1,11] + CRUSH rule 0 x 563 [15,4,3,10,13,9,7] + CRUSH rule 0 x 564 [2,13,7,1,15,10,4] + CRUSH rule 0 x 565 [3,12,4,1,14,7,11] + CRUSH rule 0 x 566 [6,14,4,2,13,11] + CRUSH rule 0 x 567 [15,4,11,6,3,12] + CRUSH rule 0 x 568 [4,14,1,6,10,13,3] + CRUSH rule 0 x 569 [11,3,15,13,5,1,9] + CRUSH rule 0 x 570 [1,10,13,4,7,2,9] + CRUSH rule 0 x 571 [10,12,14,9,4,2,1] + CRUSH rule 0 x 572 [12,14,3,10,6,1,4] + CRUSH rule 0 x 573 [7,15,11,2,12,9,4] + CRUSH rule 0 x 574 [11,14,13,1,3,7,4] + CRUSH rule 0 x 575 [5,13,15,9,6,10,2] + CRUSH rule 0 x 576 [3,15,11,9,1,6,5] + CRUSH rule 0 x 577 [13,9,6,15,3,11,4] + CRUSH rule 0 x 578 [4,10,1,2,7,13,14] + CRUSH rule 0 x 579 [13,1,15,2,10,7,5] + CRUSH rule 0 x 580 [3,12,4,1,10,15,7] + CRUSH rule 0 x 581 [7,14,12,10,1,2,9] + CRUSH rule 0 x 582 [10,5,13,14,1,2,7] + CRUSH rule 0 x 583 [4,15,1,9,10,12,2] + CRUSH rule 0 x 584 [10,1,5,13,6,9,2] + CRUSH rule 0 x 585 [5,3,6,1,11,14,13] + CRUSH rule 0 x 586 [7,10,14,12,9,3,5] + CRUSH rule 0 x 587 [11,6,9,4,1,14,13] + CRUSH rule 0 x 588 [3,12,7,15,4,9,1] + CRUSH rule 0 x 589 [9,7,12,1,10,3,4] + CRUSH rule 0 x 590 [12,1,3,9,10,6,4] + CRUSH rule 0 x 591 [2,6,14,13,9,11,4] + CRUSH rule 0 x 592 [15,12,9,7,5,2,11] + CRUSH rule 0 x 593 [13,14,5,11,9,6,2] + CRUSH rule 0 x 594 [12,14,2,9,7,4,1] + CRUSH rule 0 x 595 [12,7,10,3,1,14,9] + CRUSH rule 0 x 596 [2,7,12,11,1,5,15] + CRUSH rule 0 x 597 [15,1,2,10,7,13,5] + CRUSH rule 0 x 598 [11,5,9,14,12,7,3] + CRUSH rule 0 x 599 [13,11,1,5,6,2,15] + CRUSH rule 0 x 600 [4,12,3,10,9,7,1] + CRUSH rule 0 x 601 [13,5,15,2,1,7,9] + CRUSH rule 0 x 602 [3,11,7,1,13,15,5] + CRUSH rule 0 x 603 [3,1,4,14,10,9,6] + CRUSH rule 0 x 604 [14,2,6,1,11,13,9] + CRUSH rule 0 x 605 [2,7,12,5,14,10,1] + CRUSH rule 0 x 606 [12,15,1,5,7,9,3] + CRUSH rule 0 x 607 [3,9,10,14,7,1,4] + CRUSH rule 0 x 608 [13,10,1,7,9,15,5] + CRUSH rule 0 x 609 [14,3,7,9,11,12,5] + CRUSH rule 0 x 610 [7,10,5,1,12,2,15] + CRUSH rule 0 x 611 [13,1,5,3,10,7,15] + CRUSH rule 0 x 612 [7,1,2,13,9,15,4] + CRUSH rule 0 x 613 [10,7,14,9,5,2,13] + CRUSH rule 0 x 614 [9,4,15,3,1,11,6] + CRUSH rule 0 x 615 [9,4,11,2,1,12,6] + CRUSH rule 0 x 616 [10,14,1,5,3,6,12] + CRUSH rule 0 x 617 [15,7,2,11,12,1,9] + CRUSH rule 0 x 618 [4,2,10,6,14,9,1] + CRUSH rule 0 x 619 [15,4,3,9,6,1,13] + CRUSH rule 0 x 620 [3,7,11,14,13,1,5] + CRUSH rule 0 x 621 [3,6,4,14,1,11,13] + CRUSH rule 0 x 622 [10,2,13,5,15,9,1] + CRUSH rule 0 x 623 [4,9,14,7,3,13,11] + CRUSH rule 0 x 624 [3,9,15,6,10,1,5] + CRUSH rule 0 x 625 [11,7,3,5,13,15,9] + CRUSH rule 0 x 626 [10,12,2,1,9,7,5] + CRUSH rule 0 x 627 [1,12,10,14,3,5,9] + CRUSH rule 0 x 628 [15,13,11,4,2,1,7] + CRUSH rule 0 x 629 [5,6,15,12,1,10,3] + CRUSH rule 0 x 630 [1,4,12,9,3,7,15] + CRUSH rule 0 x 631 [5,7,1,15,12,11,3] + CRUSH rule 0 x 632 [12,3,11,9,6,1,15] + CRUSH rule 0 x 633 [14,4,3,7,10,12,9] + CRUSH rule 0 x 634 [6,9,5,3,13,11,14] + CRUSH rule 0 x 635 [6,5,2,15,9,12,11] + CRUSH rule 0 x 636 [13,6,11,3,15,9,1] + CRUSH rule 0 x 637 [3,1,10,6,9,12,4] + CRUSH rule 0 x 638 [10,15,3,5,13,1,7] + CRUSH rule 0 x 639 [6,9,14,4,3,1,10] + CRUSH rule 0 x 640 [9,6,1,11,14,2,4] + CRUSH rule 0 x 641 [10,6,5,14,1,9,12] + CRUSH rule 0 x 642 [1,15,4,6,2,10,9] + CRUSH rule 0 x 643 [3,7,5,1,10,15,13] + CRUSH rule 0 x 644 [15,13,6,9,3,11,5] + CRUSH rule 0 x 645 [14,2,4,9,10,1,7] + CRUSH rule 0 x 646 [5,13,14,1,6,9,2] + CRUSH rule 0 x 647 [10,1,9,13,6,2,14] + CRUSH rule 0 x 648 [6,5,2,14,11,1,12] + CRUSH rule 0 x 649 [3,9,13,11,4,14,1] + CRUSH rule 0 x 650 [10,9,4,15,12,7,1] + CRUSH rule 0 x 651 [3,9,5,7,14,1,13] + CRUSH rule 0 x 652 [15,9,4,6,13,1,2] + CRUSH rule 0 x 653 [11,14,1,3,6,9,12] + CRUSH rule 0 x 654 [13,6,2,10,15,4,1] + CRUSH rule 0 x 655 [6,3,4,15,12,11,1] + CRUSH rule 0 x 656 [3,15,1,4,6,12,11] + CRUSH rule 0 x 657 [11,15,3,5,7,13,1] + CRUSH rule 0 x 658 [7,2,10,12,1,4,9] + CRUSH rule 0 x 659 [2,5,14,6,10,12] + CRUSH rule 0 x 660 [13,14,10,6,4,9,3] + CRUSH rule 0 x 661 [7,15,3,12,11,4,9] + CRUSH rule 0 x 662 [15,2,12,5,1,10,9] + CRUSH rule 0 x 663 [14,9,13,10,5,3,1] + CRUSH rule 0 x 664 [6,10,12,4,9,2,1] + CRUSH rule 0 x 665 [2,9,12,1,7,10,4] + CRUSH rule 0 x 666 [12,3,6,1,15,9,10] + CRUSH rule 0 x 667 [1,9,12,10,2,14,7] + CRUSH rule 0 x 668 [9,5,1,2,6,11,13] + CRUSH rule 0 x 669 [9,7,14,5,11,13,1] + CRUSH rule 0 x 670 [6,10,9,13,1,2,15] + CRUSH rule 0 x 671 [6,15,5,10,13,3] + CRUSH rule 0 x 672 [2,9,13,1,4,14,6] + CRUSH rule 0 x 673 [7,10,5,9,15,13,2] + CRUSH rule 0 x 674 [7,12,10,1,14,9,3] + CRUSH rule 0 x 675 [9,5,1,10,6,14,12] + CRUSH rule 0 x 676 [10,12,2,1,4,15,7] + CRUSH rule 0 x 677 [2,12,1,4,10,6,15] + CRUSH rule 0 x 678 [1,2,4,10,12,14,9] + CRUSH rule 0 x 679 [5,6,12,15,9,11,3] + CRUSH rule 0 x 680 [7,11,3,1,15,4,9] + CRUSH rule 0 x 681 [6,4,3,11,14,13,1] + CRUSH rule 0 x 682 [6,1,11,15,12,2,5] + CRUSH rule 0 x 683 [6,13,2,4,9,14,10] + CRUSH rule 0 x 684 [9,11,3,7,15,4,13] + CRUSH rule 0 x 685 [5,1,15,7,9,2,10] + CRUSH rule 0 x 686 [1,9,11,14,6,13,4] + CRUSH rule 0 x 687 [7,13,3,5,11,9,15] + CRUSH rule 0 x 688 [11,9,1,14,3,5,7] + CRUSH rule 0 x 689 [5,2,9,12,1,14,11] + CRUSH rule 0 x 690 [9,7,10,3,13,15,5] + CRUSH rule 0 x 691 [11,15,9,5,7,13,2] + CRUSH rule 0 x 692 [15,5,1,2,9,11,12] + CRUSH rule 0 x 693 [5,6,12,15,2,10,9] + CRUSH rule 0 x 694 [4,7,1,10,12,3,14] + CRUSH rule 0 x 695 [6,13,14,10,9,5,1] + CRUSH rule 0 x 696 [1,2,4,14,7,11,13] + CRUSH rule 0 x 697 [13,11,3,6,4,14,9] + CRUSH rule 0 x 698 [11,13,4,2,6,1,9] + CRUSH rule 0 x 699 [7,14,12,4,2,11] + CRUSH rule 0 x 700 [12,14,11,9,4,6,3] + CRUSH rule 0 x 701 [3,13,1,14,4,7,11] + CRUSH rule 0 x 702 [3,12,15,6,5,11,1] + CRUSH rule 0 x 703 [15,11,13,3,4,7,1] + CRUSH rule 0 x 704 [6,4,2,15,11,1,13] + CRUSH rule 0 x 705 [14,6,11,5,1,13,9] + CRUSH rule 0 x 706 [1,12,3,6,4,10,15] + CRUSH rule 0 x 707 [4,7,14,3,10,9,13] + CRUSH rule 0 x 708 [3,10,5,1,15,9,7] + CRUSH rule 0 x 709 [11,12,3,7,5,14,1] + CRUSH rule 0 x 710 [14,2,11,9,5,7,12] + CRUSH rule 0 x 711 [14,3,9,10,12,5,6] + CRUSH rule 0 x 712 [12,3,11,15,9,1,6] + CRUSH rule 0 x 713 [11,9,3,15,13,6,4] + CRUSH rule 0 x 714 [12,1,9,7,2,15,10] + CRUSH rule 0 x 715 [6,1,14,4,11,12,3] + CRUSH rule 0 x 716 [11,13,9,14,5,2,1] + CRUSH rule 0 x 717 [12,4,10,9,15,1,2] + CRUSH rule 0 x 718 [7,15,5,2,11,13] + CRUSH rule 0 x 719 [5,15,13,3,1,7,11] + CRUSH rule 0 x 720 [4,13,10,2,7,9,1] + CRUSH rule 0 x 721 [11,3,14,9,1,12,4] + CRUSH rule 0 x 722 [2,4,6,1,9,15,13] + CRUSH rule 0 x 723 [2,1,12,15,11,7,5] + CRUSH rule 0 x 724 [7,1,9,10,5,15,13] + CRUSH rule 0 x 725 [11,12,7,15,4,1,2] + CRUSH rule 0 x 726 [7,14,4,3,11,13,9] + CRUSH rule 0 x 727 [2,5,1,11,15,7,12] + CRUSH rule 0 x 728 [13,11,4,6,15,2] + CRUSH rule 0 x 729 [15,11,4,6,2,9,1] + CRUSH rule 0 x 730 [3,7,1,13,11,15,9] + CRUSH rule 0 x 731 [9,1,6,5,2,11,13] + CRUSH rule 0 x 732 [1,2,10,13,9,4,7] + CRUSH rule 0 x 733 [11,3,5,6,1,9,12] + CRUSH rule 0 x 734 [14,3,11,7,12,9,4] + CRUSH rule 0 x 735 [6,9,2,10,13,14,5] + CRUSH rule 0 x 736 [3,9,1,11,7,5,13] + CRUSH rule 0 x 737 [1,4,2,12,9,10,6] + CRUSH rule 0 x 738 [11,15,7,4,9,2,12] + CRUSH rule 0 x 739 [11,12,6,2,4,1,14] + CRUSH rule 0 x 740 [7,9,10,13,1,15,2] + CRUSH rule 0 x 741 [12,11,7,15,2,5] + CRUSH rule 0 x 742 [9,7,4,11,12,1,14] + CRUSH rule 0 x 743 [5,13,9,15,10,7,3] + CRUSH rule 0 x 744 [6,2,13,1,14,11,4] + CRUSH rule 0 x 745 [3,6,1,4,11,12,14] + CRUSH rule 0 x 746 [3,7,9,10,14,5,1] + CRUSH rule 0 x 747 [15,11,5,2,13,9,1] + CRUSH rule 0 x 748 [6,10,13,2,14,5,9] + CRUSH rule 0 x 749 [14,9,10,7,5,1,2] + CRUSH rule 0 x 750 [1,14,6,5,11,2,13] + CRUSH rule 0 x 751 [15,1,6,9,5,11,12] + CRUSH rule 0 x 752 [13,1,7,3,11,15,9] + CRUSH rule 0 x 753 [4,11,1,3,15,7,13] + CRUSH rule 0 x 754 [14,12,11,4,2,1,9] + CRUSH rule 0 x 755 [13,6,1,10,4,2,14] + CRUSH rule 0 x 756 [3,4,14,6,1,10,13] + CRUSH rule 0 x 757 [10,6,1,4,13,15,2] + CRUSH rule 0 x 758 [6,3,4,10,15,13,9] + CRUSH rule 0 x 759 [5,7,3,14,11,1,9] + CRUSH rule 0 x 760 [1,15,10,12,4,3,9] + CRUSH rule 0 x 761 [2,12,1,14,5,7,10] + CRUSH rule 0 x 762 [1,4,10,9,3,7,14] + CRUSH rule 0 x 763 [4,13,1,14,7,10,2] + CRUSH rule 0 x 764 [1,14,6,13,9,5,2] + CRUSH rule 0 x 765 [9,15,2,13,4,1,11] + CRUSH rule 0 x 766 [11,2,7,15,9,12,4] + CRUSH rule 0 x 767 [6,11,4,3,12,14] + CRUSH rule 0 x 768 [2,12,15,7,1,11,9] + CRUSH rule 0 x 769 [15,1,9,2,11,12,7] + CRUSH rule 0 x 770 [15,13,4,6,3,10,1] + CRUSH rule 0 x 771 [9,2,12,11,6,14,5] + CRUSH rule 0 x 772 [4,3,13,11,14,1,7] + CRUSH rule 0 x 773 [3,7,4,15,1,12,11] + CRUSH rule 0 x 774 [12,6,3,15,5,9,10] + CRUSH rule 0 x 775 [5,10,14,2,6,1,13] + CRUSH rule 0 x 776 [10,15,3,9,6,13,1] + CRUSH rule 0 x 777 [11,13,4,7,1,14,9] + CRUSH rule 0 x 778 [13,1,9,11,15,6,3] + CRUSH rule 0 x 779 [5,11,1,14,2,9,13] + CRUSH rule 0 x 780 [13,9,3,6,4,1,14] + CRUSH rule 0 x 781 [5,7,14,3,1,12,11] + CRUSH rule 0 x 782 [2,15,9,7,11,13,4] + CRUSH rule 0 x 783 [12,7,5,14,9,1,2] + CRUSH rule 0 x 784 [14,1,10,13,3,4,7] + CRUSH rule 0 x 785 [6,12,1,2,4,9,15] + CRUSH rule 0 x 786 [10,5,2,15,1,7,12] + CRUSH rule 0 x 787 [1,12,10,2,9,4,14] + CRUSH rule 0 x 788 [4,2,9,13,6,15,11] + CRUSH rule 0 x 789 [9,2,14,7,4,12,1] + CRUSH rule 0 x 790 [15,2,7,4,1,10,13] + CRUSH rule 0 x 791 [9,4,7,13,14,11,1] + CRUSH rule 0 x 792 [6,4,15,10,12,3] + CRUSH rule 0 x 793 [15,9,6,2,13,11,4] + CRUSH rule 0 x 794 [5,12,2,14,9,10,1] + CRUSH rule 0 x 795 [6,14,12,4,10,1,2] + CRUSH rule 0 x 796 [11,2,12,6,15,4] + CRUSH rule 0 x 797 [14,3,7,1,5,13,11] + CRUSH rule 0 x 798 [5,11,6,13,1,3,15] + CRUSH rule 0 x 799 [2,9,14,4,13,6,11] + CRUSH rule 0 x 800 [6,3,4,11,15,13] + CRUSH rule 0 x 801 [2,5,6,13,9,1,10] + CRUSH rule 0 x 802 [1,4,12,7,3,9,10] + CRUSH rule 0 x 803 [7,2,4,1,11,13,9] + CRUSH rule 0 x 804 [5,14,9,7,3,1,12] + CRUSH rule 0 x 805 [13,4,3,1,10,15,7] + CRUSH rule 0 x 806 [6,2,13,4,15,1,10] + CRUSH rule 0 x 807 [14,2,7,4,9,12,1] + CRUSH rule 0 x 808 [2,15,12,7,9,1,5] + CRUSH rule 0 x 809 [1,11,7,12,4,2,15] + CRUSH rule 0 x 810 [2,5,9,12,15,1,7] + CRUSH rule 0 x 811 [15,6,3,10,1,5,9] + CRUSH rule 0 x 812 [7,11,2,14,9,5,12] + CRUSH rule 0 x 813 [4,10,13,14,2,6,9] + CRUSH rule 0 x 814 [13,4,9,3,10,6,15] + CRUSH rule 0 x 815 [15,12,9,4,10,6,1] + CRUSH rule 0 x 816 [14,10,13,7,3,9,4] + CRUSH rule 0 x 817 [10,7,2,15,13,9,5] + CRUSH rule 0 x 818 [15,2,11,4,1,12,6] + CRUSH rule 0 x 819 [5,12,10,6,1,14,3] + CRUSH rule 0 x 820 [3,6,9,12,11,15,4] + CRUSH rule 0 x 821 [15,10,9,13,3,4,7] + CRUSH rule 0 x 822 [10,13,2,9,7,4,14] + CRUSH rule 0 x 823 [2,6,12,10,15,4,1] + CRUSH rule 0 x 824 [3,7,9,13,15,5,10] + CRUSH rule 0 x 825 [10,5,14,6,12,9,3] + CRUSH rule 0 x 826 [5,2,11,15,1,12,9] + CRUSH rule 0 x 827 [13,5,1,3,7,9,11] + CRUSH rule 0 x 828 [12,6,10,5,1,9,2] + CRUSH rule 0 x 829 [13,6,15,10,5,3,9] + CRUSH rule 0 x 830 [15,13,2,9,7,11,1] + CRUSH rule 0 x 831 [1,4,11,12,6,3,15] + CRUSH rule 0 x 832 [14,11,13,2,9,4,6] + CRUSH rule 0 x 833 [9,13,3,11,7,5,15] + CRUSH rule 0 x 834 [9,7,5,1,11,2,13] + CRUSH rule 0 x 835 [14,3,13,6,4,9,1] + CRUSH rule 0 x 836 [3,9,10,13,1,5,14] + CRUSH rule 0 x 837 [15,12,11,2,7,9,5] + CRUSH rule 0 x 838 [12,14,9,2,5,7,11] + CRUSH rule 0 x 839 [3,4,6,10,15,1,13] + CRUSH rule 0 x 840 [10,15,12,4,7,1,2] + CRUSH rule 0 x 841 [3,5,7,12,11,15,1] + CRUSH rule 0 x 842 [9,13,2,6,5,14,10] + CRUSH rule 0 x 843 [14,7,4,9,3,12,1] + CRUSH rule 0 x 844 [7,1,4,15,9,2,11] + CRUSH rule 0 x 845 [13,6,1,15,4,2,11] + CRUSH rule 0 x 846 [3,7,15,13,1,9,10] + CRUSH rule 0 x 847 [12,15,11,5,2,7,1] + CRUSH rule 0 x 848 [11,13,1,14,5,9,2] + CRUSH rule 0 x 849 [3,15,11,9,6,1,13] + CRUSH rule 0 x 850 [1,3,10,6,14,4,9] + CRUSH rule 0 x 851 [14,4,3,6,11,1,13] + CRUSH rule 0 x 852 [9,12,4,7,15,2,11] + CRUSH rule 0 x 853 [13,14,6,11,2,4,9] + CRUSH rule 0 x 854 [7,11,12,1,4,15,3] + CRUSH rule 0 x 855 [14,4,12,6,3,1,10] + CRUSH rule 0 x 856 [5,10,7,3,15,9,12] + CRUSH rule 0 x 857 [4,3,13,11,9,1,7] + CRUSH rule 0 x 858 [5,15,6,3,9,12,1] + CRUSH rule 0 x 859 [5,15,6,2,1,11,12] + CRUSH rule 0 x 860 [11,14,1,12,6,9,2] + CRUSH rule 0 x 861 [13,7,4,10,1,14,3] + CRUSH rule 0 x 862 [5,10,9,7,3,12,1] + CRUSH rule 0 x 863 [11,6,3,9,4,12,15] + CRUSH rule 0 x 864 [6,13,4,2,10,15,1] + CRUSH rule 0 x 865 [4,1,14,11,6,9,3] + CRUSH rule 0 x 866 [2,13,4,15,9,6,11] + CRUSH rule 0 x 867 [12,2,9,10,4,14,6] + CRUSH rule 0 x 868 [14,11,7,2,1,4,9] + CRUSH rule 0 x 869 [10,13,7,14,3,5,1] + CRUSH rule 0 x 870 [14,9,11,4,3,12,6] + CRUSH rule 0 x 871 [6,2,1,4,15,13,11] + CRUSH rule 0 x 872 [6,1,15,3,10,12,5] + CRUSH rule 0 x 873 [2,5,12,10,1,9,15] + CRUSH rule 0 x 874 [12,4,7,2,15,10,1] + CRUSH rule 0 x 875 [10,6,14,1,12,5,9] + CRUSH rule 0 x 876 [14,7,13,3,9,1,11] + CRUSH rule 0 x 877 [15,11,13,9,5,1,6] + CRUSH rule 0 x 878 [7,14,3,13,9,1,11] + CRUSH rule 0 x 879 [12,2,7,4,10,15] + CRUSH rule 0 x 880 [2,12,10,7,1,4,9] + CRUSH rule 0 x 881 [6,3,1,11,4,15,9] + CRUSH rule 0 x 882 [11,13,7,1,2,15,4] + CRUSH rule 0 x 883 [13,1,3,10,6,5,9] + CRUSH rule 0 x 884 [6,15,4,9,3,11,12] + CRUSH rule 0 x 885 [14,7,9,4,2,13,11] + CRUSH rule 0 x 886 [13,11,4,2,1,14,9] + CRUSH rule 0 x 887 [14,4,12,11,2,6,9] + CRUSH rule 0 x 888 [10,12,7,15,9,2,1] + CRUSH rule 0 x 889 [15,13,4,1,6,2,10] + CRUSH rule 0 x 890 [10,12,14,2,9,5,6] + CRUSH rule 0 x 891 [9,5,11,6,3,15,12] + CRUSH rule 0 x 892 [12,15,2,4,7,9,11] + CRUSH rule 0 x 893 [1,3,5,9,6,10,14] + CRUSH rule 0 x 894 [7,2,11,13,4,1,14] + CRUSH rule 0 x 895 [2,1,11,5,7,15,13] + CRUSH rule 0 x 896 [9,1,14,10,4,12,2] + CRUSH rule 0 x 897 [7,5,14,3,1,9,11] + CRUSH rule 0 x 898 [10,6,12,9,15,5,2] + CRUSH rule 0 x 899 [1,11,5,3,13,14,9] + CRUSH rule 0 x 900 [2,9,10,7,13,14,5] + CRUSH rule 0 x 901 [9,12,11,3,14,4,1] + CRUSH rule 0 x 902 [4,2,6,15,12,10,1] + CRUSH rule 0 x 903 [14,10,3,1,12,6,5] + CRUSH rule 0 x 904 [15,12,4,9,6,3,11] + CRUSH rule 0 x 905 [12,6,11,3,9,4,15] + CRUSH rule 0 x 906 [14,11,12,2,4,9,6] + CRUSH rule 0 x 907 [7,12,3,9,10,5,14] + CRUSH rule 0 x 908 [2,15,9,6,10,13,5] + CRUSH rule 0 x 909 [10,14,1,13,2,9,7] + CRUSH rule 0 x 910 [12,7,4,15,10,3,1] + CRUSH rule 0 x 911 [11,15,2,4,9,13,6] + CRUSH rule 0 x 912 [6,4,14,13,3,1,11] + CRUSH rule 0 x 913 [4,6,10,1,12,3,9] + CRUSH rule 0 x 914 [4,15,2,10,1,13,7] + CRUSH rule 0 x 915 [12,14,1,9,4,3,11] + CRUSH rule 0 x 916 [3,1,11,5,6,13,14] + CRUSH rule 0 x 917 [1,15,6,5,10,3,13] + CRUSH rule 0 x 918 [7,14,11,4,9,2,13] + CRUSH rule 0 x 919 [10,7,3,13,15,1,4] + CRUSH rule 0 x 920 [4,2,10,15,1,13,6] + CRUSH rule 0 x 921 [1,11,6,13,4,2,9] + CRUSH rule 0 x 922 [6,4,14,13,3,1,10] + CRUSH rule 0 x 923 [12,2,5,14,10,1,9] + CRUSH rule 0 x 924 [6,2,14,13,9,1,11] + CRUSH rule 0 x 925 [12,15,2,10,1,5,7] + CRUSH rule 0 x 926 [3,13,10,1,14,9,6] + CRUSH rule 0 x 927 [6,5,1,11,14,2,13] + CRUSH rule 0 x 928 [13,1,3,9,6,11,15] + CRUSH rule 0 x 929 [10,7,1,5,2,12,9] + CRUSH rule 0 x 930 [7,15,10,5,1,13,2] + CRUSH rule 0 x 931 [6,15,11,9,5,3,1] + CRUSH rule 0 x 932 [13,2,5,11,9,1,6] + CRUSH rule 0 x 933 [12,7,14,10,4,1,2] + CRUSH rule 0 x 934 [12,2,5,7,9,1,15] + CRUSH rule 0 x 935 [6,11,1,14,5,13,3] + CRUSH rule 0 x 936 [9,12,7,5,1,2,14] + CRUSH rule 0 x 937 [14,2,11,1,13,4,9] + CRUSH rule 0 x 938 [14,3,5,11,7,9,13] + CRUSH rule 0 x 939 [6,4,14,9,12,1,11] + CRUSH rule 0 x 940 [13,11,4,2,1,6,15] + CRUSH rule 0 x 941 [3,12,4,7,14,10] + CRUSH rule 0 x 942 [15,12,10,4,1,9,3] + CRUSH rule 0 x 943 [10,2,4,9,6,15,12] + CRUSH rule 0 x 944 [2,9,4,7,1,14,12] + CRUSH rule 0 x 945 [10,15,2,9,5,12,7] + CRUSH rule 0 x 946 [11,15,7,12,5,9,2] + CRUSH rule 0 x 947 [11,3,14,1,12,5,6] + CRUSH rule 0 x 948 [7,13,11,5,14,2,1] + CRUSH rule 0 x 949 [9,1,12,5,15,10,2] + CRUSH rule 0 x 950 [9,15,13,6,4,2,10] + CRUSH rule 0 x 951 [2,6,12,9,10,4,14] + CRUSH rule 0 x 952 [9,7,15,3,5,13,11] + CRUSH rule 0 x 953 [1,3,6,10,12,14,4] + CRUSH rule 0 x 954 [10,2,14,9,4,6,12] + CRUSH rule 0 x 955 [7,14,3,1,10,4,9] + CRUSH rule 0 x 956 [1,6,11,5,14,3,9] + CRUSH rule 0 x 957 [14,11,1,12,6,9,4] + CRUSH rule 0 x 958 [15,4,3,11,1,6,12] + CRUSH rule 0 x 959 [2,1,12,15,10,9,4] + CRUSH rule 0 x 960 [2,6,11,13,15,4,9] + CRUSH rule 0 x 961 [3,13,11,9,6,1,4] + CRUSH rule 0 x 962 [5,11,3,14,1,6,13] + CRUSH rule 0 x 963 [13,10,15,4,6,9,1] + CRUSH rule 0 x 964 [7,11,4,9,2,12,1] + CRUSH rule 0 x 965 [12,2,9,7,4,15,11] + CRUSH rule 0 x 966 [12,14,9,4,1,2,11] + CRUSH rule 0 x 967 [7,5,3,10,12,14] + CRUSH rule 0 x 968 [12,15,4,9,11,6,3] + CRUSH rule 0 x 969 [11,4,7,1,9,14,13] + CRUSH rule 0 x 970 [5,12,10,1,3,14,9] + CRUSH rule 0 x 971 [1,9,4,12,7,2,10] + CRUSH rule 0 x 972 [12,3,14,5,1,9,7] + CRUSH rule 0 x 973 [1,10,4,12,2,7,15] + CRUSH rule 0 x 974 [7,11,1,2,15,4,12] + CRUSH rule 0 x 975 [7,9,15,12,2,11,4] + CRUSH rule 0 x 976 [7,3,15,5,12,11,1] + CRUSH rule 0 x 977 [14,3,6,10,4,1,12] + CRUSH rule 0 x 978 [12,5,11,1,15,3,6] + CRUSH rule 0 x 979 [5,1,13,6,15,10,3] + CRUSH rule 0 x 980 [15,11,5,6,1,3,13] + CRUSH rule 0 x 981 [5,11,15,12,7,1,2] + CRUSH rule 0 x 982 [2,6,14,11,12,9,5] + CRUSH rule 0 x 983 [3,12,10,9,14,5,6] + CRUSH rule 0 x 984 [15,13,1,10,2,5,7] + CRUSH rule 0 x 985 [11,2,15,1,4,13,6] + CRUSH rule 0 x 986 [6,13,9,1,15,10,5] + CRUSH rule 0 x 987 [13,14,5,10,6,1,3] + CRUSH rule 0 x 988 [12,9,10,14,3,1,4] + CRUSH rule 0 x 989 [7,4,3,15,9,13,10] + CRUSH rule 0 x 990 [1,10,9,13,3,4,6] + CRUSH rule 0 x 991 [7,11,1,14,2,5,9] + CRUSH rule 0 x 992 [9,10,2,13,7,4,1] + CRUSH rule 0 x 993 [6,10,14,12,4,1,2] + CRUSH rule 0 x 994 [3,13,15,4,11,7,1] + CRUSH rule 0 x 995 [15,6,12,2,5,11] + CRUSH rule 0 x 996 [15,10,5,3,13,1,9] + CRUSH rule 0 x 997 [15,2,1,12,7,9,4] + CRUSH rule 0 x 998 [6,1,9,5,12,11,15] + CRUSH rule 0 x 999 [9,10,15,5,13,3,7] + CRUSH rule 0 x 1000 [14,2,9,4,12,1,6] + CRUSH rule 0 x 1001 [11,14,4,2,6,9,1] + CRUSH rule 0 x 1002 [1,10,14,2,9,5,13] + CRUSH rule 0 x 1003 [10,7,5,14,2,1,9] + CRUSH rule 0 x 1004 [15,1,4,6,10,12,9] + CRUSH rule 0 x 1005 [6,12,2,10,9,15,5] + CRUSH rule 0 x 1006 [10,12,15,1,2,6,5] + CRUSH rule 0 x 1007 [1,7,13,14,3,4,10] + CRUSH rule 0 x 1008 [7,4,9,11,3,15,1] + CRUSH rule 0 x 1009 [5,2,11,7,15,9,1] + CRUSH rule 0 x 1010 [10,2,15,6,9,13,4] + CRUSH rule 0 x 1011 [6,3,12,1,10,4,9] + CRUSH rule 0 x 1012 [12,6,9,15,3,1,5] + CRUSH rule 0 x 1013 [2,14,12,4,9,1,6] + CRUSH rule 0 x 1014 [1,13,7,2,10,14,5] + CRUSH rule 0 x 1015 [12,6,10,1,4,15,9] + CRUSH rule 0 x 1016 [10,13,14,3,5,6,1] + CRUSH rule 0 x 1017 [5,11,14,7,13,9,2] + CRUSH rule 0 x 1018 [13,11,14,1,9,3,5] + CRUSH rule 0 x 1019 [10,13,14,7,5,1,2] + CRUSH rule 0 x 1020 [3,1,13,4,10,9,14] + CRUSH rule 0 x 1021 [2,11,14,9,4,6,1] + CRUSH rule 0 x 1022 [15,5,7,2,12,10] + CRUSH rule 0 x 1023 [15,2,9,12,1,7,4] + rule 0 (replicated_ruleset) num_rep 7 result size == 6:\t36/1024 (esc) + rule 0 (replicated_ruleset) num_rep 7 result size == 7:\t988/1024 (esc) + CRUSH rule 0 x 0 [7,10,3,15,12,1,4,9] + CRUSH rule 0 x 1 [10,15,1,2,13,4,7,9] + CRUSH rule 0 x 2 [1,12,2,6,5,10,15] + CRUSH rule 0 x 3 [15,4,10,2,9,6,13] + CRUSH rule 0 x 4 [14,2,10,1,9,4,7,13] + CRUSH rule 0 x 5 [7,4,11,2,13,15,9] + CRUSH rule 0 x 6 [12,6,10,9,3,4,14] + CRUSH rule 0 x 7 [9,2,6,12,11,4,1,14] + CRUSH rule 0 x 8 [10,2,15,1,4,13,6,9] + CRUSH rule 0 x 9 [7,1,14,2,11,9,12,4] + CRUSH rule 0 x 10 [10,14,4,1,2,7,13,9] + CRUSH rule 0 x 11 [13,9,14,7,5,11,2,1] + CRUSH rule 0 x 12 [7,1,2,5,13,15,11,9] + CRUSH rule 0 x 13 [3,5,12,7,9,1,14,11] + CRUSH rule 0 x 14 [13,5,2,7,10,15,1,9] + CRUSH rule 0 x 15 [15,1,9,6,13,3,5,11] + CRUSH rule 0 x 16 [7,11,14,2,13,1,9,4] + CRUSH rule 0 x 17 [10,1,13,2,4,6,14,9] + CRUSH rule 0 x 18 [1,7,3,10,5,12,9,14] + CRUSH rule 0 x 19 [7,12,2,4,15,10,1] + CRUSH rule 0 x 20 [14,12,3,10,9,4,7,1] + CRUSH rule 0 x 21 [3,12,1,10,4,15,6] + CRUSH rule 0 x 22 [6,3,13,11,4,1,15] + CRUSH rule 0 x 23 [10,5,13,9,3,15,1,6] + CRUSH rule 0 x 24 [12,11,3,1,9,4,7,15] + CRUSH rule 0 x 25 [7,12,15,1,3,10,4,9] + CRUSH rule 0 x 26 [1,7,13,2,14,5,9,11] + CRUSH rule 0 x 27 [3,6,15,4,13,9,11,1] + CRUSH rule 0 x 28 [14,4,3,9,6,11,13] + CRUSH rule 0 x 29 [5,14,12,11,6,3,1,9] + CRUSH rule 0 x 30 [2,5,6,9,1,11,13,14] + CRUSH rule 0 x 31 [5,15,10,1,9,13,6,3] + CRUSH rule 0 x 32 [9,10,2,1,13,14,6,4] + CRUSH rule 0 x 33 [13,4,9,2,7,1,10,14] + CRUSH rule 0 x 34 [13,15,2,4,1,10,9,6] + CRUSH rule 0 x 35 [4,14,3,13,10,9,1,6] + CRUSH rule 0 x 36 [3,12,9,7,5,10,14,1] + CRUSH rule 0 x 37 [9,2,6,14,11,1,4,13] + CRUSH rule 0 x 38 [3,4,13,10,9,1,14,6] + CRUSH rule 0 x 39 [12,7,14,11,1,9,5,2] + CRUSH rule 0 x 40 [10,1,9,5,15,2,6,13] + CRUSH rule 0 x 41 [4,9,11,1,14,13,6,3] + CRUSH rule 0 x 42 [3,6,14,10,12,5,1] + CRUSH rule 0 x 43 [10,5,15,7,2,9,12] + CRUSH rule 0 x 44 [11,4,13,3,7,14,9] + CRUSH rule 0 x 45 [11,12,15,9,1,5,6,3] + CRUSH rule 0 x 46 [6,9,2,14,11,13,1,5] + CRUSH rule 0 x 47 [3,9,6,4,13,1,11,15] + CRUSH rule 0 x 48 [4,6,2,1,10,14,13] + CRUSH rule 0 x 49 [9,15,10,7,4,3,13] + CRUSH rule 0 x 50 [14,12,1,4,2,11,6,9] + CRUSH rule 0 x 51 [10,6,5,12,15,2,1,9] + CRUSH rule 0 x 52 [12,1,9,11,7,3,14,4] + CRUSH rule 0 x 53 [3,6,13,9,5,1,11,15] + CRUSH rule 0 x 54 [4,13,9,2,14,10,6,1] + CRUSH rule 0 x 55 [4,11,2,7,1,13,9,15] + CRUSH rule 0 x 56 [5,9,10,1,3,13,14,7] + CRUSH rule 0 x 57 [6,2,1,15,10,12,5] + CRUSH rule 0 x 58 [7,1,11,4,3,14,12,9] + CRUSH rule 0 x 59 [2,13,1,10,9,5,14,6] + CRUSH rule 0 x 60 [3,6,11,1,4,9,12,15] + CRUSH rule 0 x 61 [3,15,13,7,4,1,10,9] + CRUSH rule 0 x 62 [15,11,7,12,5,9,2,1] + CRUSH rule 0 x 63 [10,14,12,1,7,3] + CRUSH rule 0 x 64 [3,9,1,4,7,12,11,15] + CRUSH rule 0 x 65 [4,12,11,7,14,3,1] + CRUSH rule 0 x 66 [15,11,6,9,4,1,3,12] + CRUSH rule 0 x 67 [2,6,4,14,1,11,12] + CRUSH rule 0 x 68 [15,7,4,2,9,12,11] + CRUSH rule 0 x 69 [2,1,15,10,4,9,13,7] + CRUSH rule 0 x 70 [9,6,1,3,13,15,11,5] + CRUSH rule 0 x 71 [15,5,1,3,13,10,7] + CRUSH rule 0 x 72 [9,10,3,5,7,12,15,1] + CRUSH rule 0 x 73 [5,3,11,1,7,12,15,9] + CRUSH rule 0 x 74 [11,7,9,5,1,15,3,12] + CRUSH rule 0 x 75 [9,7,11,14,12,1,2,5] + CRUSH rule 0 x 76 [6,1,3,5,14,10,12,9] + CRUSH rule 0 x 77 [7,4,2,13,9,1,11,15] + CRUSH rule 0 x 78 [9,3,1,5,6,13,14,11] + CRUSH rule 0 x 79 [13,2,15,5,7,9,11,1] + CRUSH rule 0 x 80 [15,2,6,4,13,10,1] + CRUSH rule 0 x 81 [15,2,1,11,4,6,13] + CRUSH rule 0 x 82 [14,13,5,11,6,2,1,9] + CRUSH rule 0 x 83 [4,15,3,9,10,13,6,1] + CRUSH rule 0 x 84 [10,7,9,15,3,4,1,13] + CRUSH rule 0 x 85 [3,15,9,7,4,11,1,12] + CRUSH rule 0 x 86 [10,9,14,1,13,4,2,7] + CRUSH rule 0 x 87 [15,10,7,12,5,3,9,1] + CRUSH rule 0 x 88 [4,13,3,1,9,15,11,7] + CRUSH rule 0 x 89 [3,9,7,4,1,14,10,12] + CRUSH rule 0 x 90 [4,9,7,12,11,14,2,1] + CRUSH rule 0 x 91 [6,11,9,1,2,4,14,13] + CRUSH rule 0 x 92 [1,5,10,9,13,15,6,2] + CRUSH rule 0 x 93 [9,3,15,13,7,5,1,10] + CRUSH rule 0 x 94 [9,2,12,5,6,11,1,14] + CRUSH rule 0 x 95 [7,15,4,10,9,13,2,1] + CRUSH rule 0 x 96 [2,15,11,7,5,1,12] + CRUSH rule 0 x 97 [4,11,2,13,1,7,9,14] + CRUSH rule 0 x 98 [11,13,9,3,15,1,5,6] + CRUSH rule 0 x 99 [12,4,11,7,3,14,9,1] + CRUSH rule 0 x 100 [9,4,10,15,7,3,13] + CRUSH rule 0 x 101 [15,7,1,9,10,5,2,12] + CRUSH rule 0 x 102 [3,11,14,6,13,4,9,1] + CRUSH rule 0 x 103 [13,11,6,14,4,3,1] + CRUSH rule 0 x 104 [14,6,3,5,9,1,10,13] + CRUSH rule 0 x 105 [14,10,1,9,3,5,6,13] + CRUSH rule 0 x 106 [6,5,13,2,14,11,1,9] + CRUSH rule 0 x 107 [3,1,10,14,13,5,9,6] + CRUSH rule 0 x 108 [5,10,7,2,15,9,12,1] + CRUSH rule 0 x 109 [9,1,13,7,15,5,11,3] + CRUSH rule 0 x 110 [5,1,11,3,7,14,13,9] + CRUSH rule 0 x 111 [10,1,9,7,5,2,13,14] + CRUSH rule 0 x 112 [1,10,4,14,2,12,6,9] + CRUSH rule 0 x 113 [6,10,13,9,1,5,2,14] + CRUSH rule 0 x 114 [5,13,6,2,1,14,11] + CRUSH rule 0 x 115 [10,13,14,3,9,1,6,5] + CRUSH rule 0 x 116 [1,14,13,2,11,5,7] + CRUSH rule 0 x 117 [5,6,1,12,15,9,11,3] + CRUSH rule 0 x 118 [10,4,13,15,9,3,1,6] + CRUSH rule 0 x 119 [14,12,11,4,6,9,3,1] + CRUSH rule 0 x 120 [11,3,14,13,4,7] + CRUSH rule 0 x 121 [9,5,1,11,7,3,15,12] + CRUSH rule 0 x 122 [4,3,14,1,11,13,7] + CRUSH rule 0 x 123 [3,10,5,6,9,1,12,15] + CRUSH rule 0 x 124 [12,2,1,5,14,7,11,9] + CRUSH rule 0 x 125 [9,12,15,1,6,5,3,10] + CRUSH rule 0 x 126 [7,15,10,9,2,12,5,1] + CRUSH rule 0 x 127 [4,14,9,13,1,3,7,10] + CRUSH rule 0 x 128 [3,12,1,10,4,9,7,14] + CRUSH rule 0 x 129 [11,13,14,2,9,4,6,1] + CRUSH rule 0 x 130 [3,13,5,14,10,1,9,6] + CRUSH rule 0 x 131 [12,1,6,15,4,2,11,9] + CRUSH rule 0 x 132 [11,15,13,9,2,5,7] + CRUSH rule 0 x 133 [3,6,9,11,15,12,5] + CRUSH rule 0 x 134 [12,5,6,15,3,9,10,1] + CRUSH rule 0 x 135 [3,14,12,4,6,11,9] + CRUSH rule 0 x 136 [15,6,9,4,10,3,12] + CRUSH rule 0 x 137 [14,3,6,11,1,9,4,13] + CRUSH rule 0 x 138 [13,15,4,10,2,7,1] + CRUSH rule 0 x 139 [11,2,13,9,1,15,7,5] + CRUSH rule 0 x 140 [11,4,12,15,2,6,9,1] + CRUSH rule 0 x 141 [6,12,15,11,3,5,1] + CRUSH rule 0 x 142 [3,14,7,9,11,1,4,13] + CRUSH rule 0 x 143 [9,6,4,2,14,10,12] + CRUSH rule 0 x 144 [13,7,11,2,14,4,1,9] + CRUSH rule 0 x 145 [12,2,6,10,9,4,14,1] + CRUSH rule 0 x 146 [1,5,9,2,6,13,14,10] + CRUSH rule 0 x 147 [1,4,9,11,2,7,15,12] + CRUSH rule 0 x 148 [12,7,9,2,14,11,1,4] + CRUSH rule 0 x 149 [2,5,9,12,11,1,7,14] + CRUSH rule 0 x 150 [1,15,2,10,7,9,5,12] + CRUSH rule 0 x 151 [2,9,14,7,1,10,5,13] + CRUSH rule 0 x 152 [5,9,2,6,10,13,14] + CRUSH rule 0 x 153 [6,9,4,15,2,1,10,12] + CRUSH rule 0 x 154 [3,11,7,1,4,12,15,9] + CRUSH rule 0 x 155 [14,12,7,3,5,1,9,11] + CRUSH rule 0 x 156 [7,13,3,10,15,5,1] + CRUSH rule 0 x 157 [15,1,6,4,3,10,9,13] + CRUSH rule 0 x 158 [15,1,10,6,12,2,4] + CRUSH rule 0 x 159 [4,14,3,12,10,6,1,9] + CRUSH rule 0 x 160 [5,7,3,14,11,1,12] + CRUSH rule 0 x 161 [1,2,11,4,6,13,14] + CRUSH rule 0 x 162 [10,6,1,12,2,4,14,9] + CRUSH rule 0 x 163 [15,1,10,2,6,4,13,9] + CRUSH rule 0 x 164 [9,14,10,7,12,2,5,1] + CRUSH rule 0 x 165 [11,7,2,13,9,15,1,5] + CRUSH rule 0 x 166 [1,2,12,14,4,11,7,9] + CRUSH rule 0 x 167 [9,7,3,4,11,13,15,1] + CRUSH rule 0 x 168 [13,2,4,1,6,15,10,9] + CRUSH rule 0 x 169 [1,4,9,14,13,10,2,7] + CRUSH rule 0 x 170 [1,15,7,9,12,10,3,5] + CRUSH rule 0 x 171 [9,2,10,7,1,5,15,12] + CRUSH rule 0 x 172 [14,4,10,12,9,3,6] + CRUSH rule 0 x 173 [5,10,12,15,6,1,2,9] + CRUSH rule 0 x 174 [15,6,4,12,1,11,9,2] + CRUSH rule 0 x 175 [5,7,9,3,10,1,14,13] + CRUSH rule 0 x 176 [9,6,3,14,13,10,4] + CRUSH rule 0 x 177 [2,9,10,13,4,1,14,7] + CRUSH rule 0 x 178 [12,11,7,14,3,4] + CRUSH rule 0 x 179 [2,10,13,9,5,1,7,14] + CRUSH rule 0 x 180 [3,11,5,15,7,12] + CRUSH rule 0 x 181 [9,12,6,5,1,10,14,2] + CRUSH rule 0 x 182 [5,13,11,2,1,6,14] + CRUSH rule 0 x 183 [5,7,10,13,3,9,14,1] + CRUSH rule 0 x 184 [2,5,11,12,7,1,9,15] + CRUSH rule 0 x 185 [13,5,7,11,2,14] + CRUSH rule 0 x 186 [6,14,13,5,10,1,3,9] + CRUSH rule 0 x 187 [1,4,11,13,6,14,9,3] + CRUSH rule 0 x 188 [9,13,5,14,10,6,2] + CRUSH rule 0 x 189 [6,12,4,9,2,1,11,15] + CRUSH rule 0 x 190 [9,13,15,10,3,1,5,6] + CRUSH rule 0 x 191 [7,11,4,1,15,12,9,2] + CRUSH rule 0 x 192 [2,11,5,15,6,1,13] + CRUSH rule 0 x 193 [3,13,6,10,4,1,9,14] + CRUSH rule 0 x 194 [3,13,4,14,6,9,1,11] + CRUSH rule 0 x 195 [5,7,10,12,1,3,15,9] + CRUSH rule 0 x 196 [4,15,1,10,9,2,13,7] + CRUSH rule 0 x 197 [14,10,13,4,6,3,1,9] + CRUSH rule 0 x 198 [2,5,6,15,9,13,10] + CRUSH rule 0 x 199 [2,10,4,15,1,9,6,12] + CRUSH rule 0 x 200 [7,14,11,4,1,3,13] + CRUSH rule 0 x 201 [9,14,1,7,4,3,10,13] + CRUSH rule 0 x 202 [14,11,7,3,5,1,12] + CRUSH rule 0 x 203 [12,5,7,15,1,2,10,9] + CRUSH rule 0 x 204 [6,11,3,12,14,1,9,4] + CRUSH rule 0 x 205 [15,4,6,10,13,9,2,1] + CRUSH rule 0 x 206 [13,11,2,15,7,1,5] + CRUSH rule 0 x 207 [2,11,7,4,14,1,12,9] + CRUSH rule 0 x 208 [13,1,6,14,9,11,3,5] + CRUSH rule 0 x 209 [6,15,13,1,11,4,9,2] + CRUSH rule 0 x 210 [13,11,2,7,5,14,9] + CRUSH rule 0 x 211 [2,14,1,13,11,7,9,5] + CRUSH rule 0 x 212 [10,1,12,15,5,6,2,9] + CRUSH rule 0 x 213 [3,9,6,5,15,13,1,11] + CRUSH rule 0 x 214 [7,15,4,1,10,2,13,9] + CRUSH rule 0 x 215 [6,1,4,13,3,11,14] + CRUSH rule 0 x 216 [12,9,6,2,1,11,5,15] + CRUSH rule 0 x 217 [12,11,1,14,2,4,7] + CRUSH rule 0 x 218 [12,10,15,6,1,4,9,2] + CRUSH rule 0 x 219 [3,11,14,6,4,1,13] + CRUSH rule 0 x 220 [14,4,3,12,10,9,6] + CRUSH rule 0 x 221 [15,5,2,6,12,11,9] + CRUSH rule 0 x 222 [10,4,3,15,7,12,1] + CRUSH rule 0 x 223 [9,7,11,1,4,14,13,3] + CRUSH rule 0 x 224 [1,7,10,2,12,9,14,5] + CRUSH rule 0 x 225 [10,5,2,6,1,13,9,15] + CRUSH rule 0 x 226 [4,1,9,3,13,10,15,7] + CRUSH rule 0 x 227 [7,2,12,15,5,11] + CRUSH rule 0 x 228 [2,15,11,1,6,13,9,4] + CRUSH rule 0 x 229 [9,3,7,14,1,12,4,10] + CRUSH rule 0 x 230 [10,5,7,2,15,1,13] + CRUSH rule 0 x 231 [2,7,5,13,9,15,10] + CRUSH rule 0 x 232 [10,5,13,1,9,2,7,14] + CRUSH rule 0 x 233 [6,12,11,4,9,14,1,3] + CRUSH rule 0 x 234 [10,1,2,12,5,9,15,7] + CRUSH rule 0 x 235 [13,14,7,10,1,9,5,3] + CRUSH rule 0 x 236 [2,15,9,12,1,7,4,10] + CRUSH rule 0 x 237 [3,12,9,10,4,7,15] + CRUSH rule 0 x 238 [2,10,4,15,6,12,9,1] + CRUSH rule 0 x 239 [4,15,10,7,9,13,3,1] + CRUSH rule 0 x 240 [15,5,13,7,2,9,10] + CRUSH rule 0 x 241 [7,9,15,12,1,5,2,10] + CRUSH rule 0 x 242 [14,2,6,9,10,12,5] + CRUSH rule 0 x 243 [2,11,5,1,15,6,9,13] + CRUSH rule 0 x 244 [13,9,15,3,11,7,5] + CRUSH rule 0 x 245 [12,9,15,3,1,5,10,7] + CRUSH rule 0 x 246 [15,3,5,11,7,1,12,9] + CRUSH rule 0 x 247 [6,4,9,12,1,2,10,14] + CRUSH rule 0 x 248 [5,13,7,11,9,15,3,1] + CRUSH rule 0 x 249 [10,14,7,3,9,13,1,4] + CRUSH rule 0 x 250 [12,15,1,10,5,6,3,9] + CRUSH rule 0 x 251 [13,2,15,5,6,1,9,10] + CRUSH rule 0 x 252 [7,5,13,9,3,10,14,1] + CRUSH rule 0 x 253 [3,13,15,10,7,4] + CRUSH rule 0 x 254 [2,9,13,14,4,6,10] + CRUSH rule 0 x 255 [1,9,13,2,6,10,4,15] + CRUSH rule 0 x 256 [6,9,13,1,3,14,5,10] + CRUSH rule 0 x 257 [15,12,3,9,6,4,11] + CRUSH rule 0 x 258 [12,5,6,10,2,1,14,9] + CRUSH rule 0 x 259 [9,10,4,3,14,13,1,7] + CRUSH rule 0 x 260 [10,12,6,9,3,15,1,4] + CRUSH rule 0 x 261 [13,7,2,1,15,5,11,9] + CRUSH rule 0 x 262 [15,3,12,7,4,9,1,11] + CRUSH rule 0 x 263 [12,6,10,9,5,15,3,1] + CRUSH rule 0 x 264 [13,14,11,3,1,4,7,9] + CRUSH rule 0 x 265 [12,10,14,5,7,1,9,3] + CRUSH rule 0 x 266 [14,7,11,1,2,9,4,12] + CRUSH rule 0 x 267 [12,11,6,5,1,2,15] + CRUSH rule 0 x 268 [4,1,15,12,6,11,3,9] + CRUSH rule 0 x 269 [11,1,15,5,13,9,7,2] + CRUSH rule 0 x 270 [7,11,12,3,1,14,9,4] + CRUSH rule 0 x 271 [4,7,3,13,15,10,9,1] + CRUSH rule 0 x 272 [15,5,13,10,6,2] + CRUSH rule 0 x 273 [2,10,7,12,1,15,5] + CRUSH rule 0 x 274 [10,2,5,6,13,9,15,1] + CRUSH rule 0 x 275 [10,3,4,7,14,13] + CRUSH rule 0 x 276 [5,12,9,2,11,7,15,1] + CRUSH rule 0 x 277 [14,3,13,4,1,9,11,7] + CRUSH rule 0 x 278 [5,6,14,3,1,11,13,9] + CRUSH rule 0 x 279 [6,10,13,3,9,4,15] + CRUSH rule 0 x 280 [7,3,14,9,1,11,4,13] + CRUSH rule 0 x 281 [5,11,14,7,9,13,2,1] + CRUSH rule 0 x 282 [2,1,13,14,9,7,5,10] + CRUSH rule 0 x 283 [4,1,12,3,10,7,15] + CRUSH rule 0 x 284 [5,11,7,15,3,13,1,9] + CRUSH rule 0 x 285 [15,5,3,1,6,13,11,9] + CRUSH rule 0 x 286 [10,4,3,6,12,15,1] + CRUSH rule 0 x 287 [12,4,9,1,3,11,15,7] + CRUSH rule 0 x 288 [4,12,10,7,1,3,14,9] + CRUSH rule 0 x 289 [2,5,14,9,13,6,10] + CRUSH rule 0 x 290 [12,2,5,6,15,9,1,10] + CRUSH rule 0 x 291 [7,11,1,14,5,9,2,12] + CRUSH rule 0 x 292 [4,10,6,3,14,9,12,1] + CRUSH rule 0 x 293 [6,5,11,1,2,14,12] + CRUSH rule 0 x 294 [9,12,3,14,6,11,5,1] + CRUSH rule 0 x 295 [6,10,3,14,9,4,13] + CRUSH rule 0 x 296 [3,1,13,7,14,9,10,4] + CRUSH rule 0 x 297 [6,13,4,14,10,1,2,9] + CRUSH rule 0 x 298 [14,9,13,1,4,2,7,10] + CRUSH rule 0 x 299 [14,12,11,6,4,2,1,9] + CRUSH rule 0 x 300 [15,7,10,5,1,3,13,9] + CRUSH rule 0 x 301 [9,11,7,1,13,14,4,2] + CRUSH rule 0 x 302 [9,7,1,13,5,10,3,15] + CRUSH rule 0 x 303 [4,13,3,7,10,15,1] + CRUSH rule 0 x 304 [6,9,2,11,15,13,4] + CRUSH rule 0 x 305 [13,7,5,11,2,15,9] + CRUSH rule 0 x 306 [10,12,4,6,9,2,15,1] + CRUSH rule 0 x 307 [11,12,15,5,6,2,1,9] + CRUSH rule 0 x 308 [12,14,10,9,1,2,5,7] + CRUSH rule 0 x 309 [9,3,12,5,11,15,7] + CRUSH rule 0 x 310 [3,1,5,10,14,9,7,12] + CRUSH rule 0 x 311 [3,9,7,1,14,13,10,5] + CRUSH rule 0 x 312 [15,13,9,7,5,10,2] + CRUSH rule 0 x 313 [9,15,3,7,5,13,1,11] + CRUSH rule 0 x 314 [2,15,9,5,6,12,1,11] + CRUSH rule 0 x 315 [15,2,13,1,11,9,6,4] + CRUSH rule 0 x 316 [4,9,11,2,12,14,6] + CRUSH rule 0 x 317 [1,5,3,13,15,7,10] + CRUSH rule 0 x 318 [4,1,15,11,9,13,6,2] + CRUSH rule 0 x 319 [2,15,4,1,11,9,7,12] + CRUSH rule 0 x 320 [5,7,13,9,11,2,1,15] + CRUSH rule 0 x 321 [1,6,11,15,5,3,13] + CRUSH rule 0 x 322 [13,7,5,3,14,11,1] + CRUSH rule 0 x 323 [7,4,10,1,2,13,14] + CRUSH rule 0 x 324 [5,6,10,15,2,13] + CRUSH rule 0 x 325 [9,10,14,5,1,6,2,13] + CRUSH rule 0 x 326 [11,7,13,4,2,15,1] + CRUSH rule 0 x 327 [12,5,10,14,3,7,9] + CRUSH rule 0 x 328 [5,2,6,14,1,11,12] + CRUSH rule 0 x 329 [2,6,15,5,9,10,13,1] + CRUSH rule 0 x 330 [3,9,11,13,1,6,5,14] + CRUSH rule 0 x 331 [12,14,6,3,1,4,10,9] + CRUSH rule 0 x 332 [10,12,6,15,9,2,5] + CRUSH rule 0 x 333 [6,5,3,12,14,10,9,1] + CRUSH rule 0 x 334 [4,9,2,12,7,11,15,1] + CRUSH rule 0 x 335 [11,7,1,5,13,2,9,15] + CRUSH rule 0 x 336 [6,14,13,2,5,9,11] + CRUSH rule 0 x 337 [15,11,3,7,12,5] + CRUSH rule 0 x 338 [10,5,3,6,15,1,9,13] + CRUSH rule 0 x 339 [11,14,13,5,3,7,1] + CRUSH rule 0 x 340 [11,6,12,4,9,3,14,1] + CRUSH rule 0 x 341 [7,5,2,10,14,9,1,12] + CRUSH rule 0 x 342 [12,14,1,9,2,11,4,7] + CRUSH rule 0 x 343 [12,14,9,6,10,2,4,1] + CRUSH rule 0 x 344 [9,11,5,2,14,13,1,7] + CRUSH rule 0 x 345 [14,2,11,9,6,12,4] + CRUSH rule 0 x 346 [5,3,14,10,7,1,13] + CRUSH rule 0 x 347 [10,2,12,6,9,1,14,5] + CRUSH rule 0 x 348 [7,9,10,1,14,13,3,4] + CRUSH rule 0 x 349 [9,6,10,12,1,5,14] + CRUSH rule 0 x 350 [13,9,15,4,10,7,2,1] + CRUSH rule 0 x 351 [13,5,15,3,1,6,11] + CRUSH rule 0 x 352 [1,12,11,9,4,7,3,15] + CRUSH rule 0 x 353 [10,14,12,2,9,1,4,6] + CRUSH rule 0 x 354 [6,3,15,10,9,4,13] + CRUSH rule 0 x 355 [13,14,6,10,2,5,1,9] + CRUSH rule 0 x 356 [15,13,2,9,6,5,1,11] + CRUSH rule 0 x 357 [4,11,1,13,3,14,6,9] + CRUSH rule 0 x 358 [12,7,2,9,1,14,10,4] + CRUSH rule 0 x 359 [5,15,7,11,3,13] + CRUSH rule 0 x 360 [13,10,1,2,6,14,5] + CRUSH rule 0 x 361 [5,3,13,6,1,14,11,9] + CRUSH rule 0 x 362 [2,9,11,13,1,6,5,15] + CRUSH rule 0 x 363 [7,12,3,9,15,4,1,10] + CRUSH rule 0 x 364 [2,12,6,9,5,10,15] + CRUSH rule 0 x 365 [13,5,11,15,6,2,9] + CRUSH rule 0 x 366 [12,7,3,14,5,10,9] + CRUSH rule 0 x 367 [7,13,3,1,5,11,15,9] + CRUSH rule 0 x 368 [7,9,10,15,3,4,13] + CRUSH rule 0 x 369 [7,5,3,13,14,9,11,1] + CRUSH rule 0 x 370 [4,7,14,1,2,9,11,12] + CRUSH rule 0 x 371 [1,7,12,3,4,15,10,9] + CRUSH rule 0 x 372 [10,4,3,14,6,1,12,9] + CRUSH rule 0 x 373 [15,5,2,6,13,1,9,10] + CRUSH rule 0 x 374 [3,15,12,5,1,6,10,9] + CRUSH rule 0 x 375 [5,2,14,1,6,13,11,9] + CRUSH rule 0 x 376 [5,14,10,13,3,6,1] + CRUSH rule 0 x 377 [1,15,2,4,9,11,12,6] + CRUSH rule 0 x 378 [9,12,2,15,1,5,11,6] + CRUSH rule 0 x 379 [11,2,15,5,7,9,13,1] + CRUSH rule 0 x 380 [6,1,12,11,2,9,5,14] + CRUSH rule 0 x 381 [15,13,7,5,10,2,1,9] + CRUSH rule 0 x 382 [14,3,1,4,13,7,10] + CRUSH rule 0 x 383 [3,6,11,4,13,15,1] + CRUSH rule 0 x 384 [4,13,6,3,15,11,9] + CRUSH rule 0 x 385 [4,6,15,3,10,9,1,13] + CRUSH rule 0 x 386 [14,3,11,13,5,6,9,1] + CRUSH rule 0 x 387 [1,11,5,7,9,2,14,12] + CRUSH rule 0 x 388 [2,6,11,9,15,4,12] + CRUSH rule 0 x 389 [12,7,2,4,15,10,1] + CRUSH rule 0 x 390 [2,11,13,7,5,9,15] + CRUSH rule 0 x 391 [3,4,9,13,7,10,1,14] + CRUSH rule 0 x 392 [11,5,14,7,1,9,2,12] + CRUSH rule 0 x 393 [2,14,5,9,7,13,11] + CRUSH rule 0 x 394 [4,9,3,15,13,6,1,11] + CRUSH rule 0 x 395 [10,13,5,15,6,9,3,1] + CRUSH rule 0 x 396 [2,12,15,9,4,6,11] + CRUSH rule 0 x 397 [1,14,9,4,12,10,3,7] + CRUSH rule 0 x 398 [9,2,1,5,12,6,11,15] + CRUSH rule 0 x 399 [5,9,14,3,1,10,13,7] + CRUSH rule 0 x 400 [10,6,2,4,15,12,1,9] + CRUSH rule 0 x 401 [6,9,11,12,4,3,15,1] + CRUSH rule 0 x 402 [4,7,9,2,13,1,15,11] + CRUSH rule 0 x 403 [7,15,13,3,5,9,10] + CRUSH rule 0 x 404 [14,12,7,9,2,1,5,11] + CRUSH rule 0 x 405 [9,15,11,2,4,7,13,1] + CRUSH rule 0 x 406 [12,14,9,2,7,10,4,1] + CRUSH rule 0 x 407 [9,5,12,10,15,6,3] + CRUSH rule 0 x 408 [7,1,5,2,10,15,13,9] + CRUSH rule 0 x 409 [11,2,4,13,1,15,7,9] + CRUSH rule 0 x 410 [6,4,14,2,12,9,10,1] + CRUSH rule 0 x 411 [13,11,15,6,4,1,9,2] + CRUSH rule 0 x 412 [5,9,6,11,14,2,12] + CRUSH rule 0 x 413 [13,5,3,11,6,9,1,14] + CRUSH rule 0 x 414 [3,11,9,13,4,1,6,15] + CRUSH rule 0 x 415 [6,10,14,5,1,13,3,9] + CRUSH rule 0 x 416 [13,1,4,7,2,9,14,11] + CRUSH rule 0 x 417 [4,12,1,15,2,11,9,6] + CRUSH rule 0 x 418 [14,5,10,2,6,9,13] + CRUSH rule 0 x 419 [5,14,10,9,2,12,6,1] + CRUSH rule 0 x 420 [2,4,9,11,6,14,13,1] + CRUSH rule 0 x 421 [15,4,10,3,9,12,7] + CRUSH rule 0 x 422 [4,11,2,7,13,9,15] + CRUSH rule 0 x 423 [3,15,12,6,5,1,9,10] + CRUSH rule 0 x 424 [6,10,12,2,5,1,14,9] + CRUSH rule 0 x 425 [11,15,2,13,5,7,9,1] + CRUSH rule 0 x 426 [12,4,7,1,9,10,14,2] + CRUSH rule 0 x 427 [14,10,3,1,9,7,5,13] + CRUSH rule 0 x 428 [12,7,9,4,2,1,14,10] + CRUSH rule 0 x 429 [3,4,9,7,11,12,1,14] + CRUSH rule 0 x 430 [3,5,10,13,1,15,6] + CRUSH rule 0 x 431 [9,3,7,1,12,5,14,11] + CRUSH rule 0 x 432 [4,1,12,7,15,2,10,9] + CRUSH rule 0 x 433 [4,11,12,15,7,3] + CRUSH rule 0 x 434 [2,14,9,1,5,11,7,13] + CRUSH rule 0 x 435 [13,11,5,6,9,2,15] + CRUSH rule 0 x 436 [9,15,10,2,4,1,12,7] + CRUSH rule 0 x 437 [9,6,3,14,10,12,5,1] + CRUSH rule 0 x 438 [7,2,13,4,11,1,9,14] + CRUSH rule 0 x 439 [7,14,4,3,12,10] + CRUSH rule 0 x 440 [14,11,9,2,7,12,1,5] + CRUSH rule 0 x 441 [2,4,11,9,13,6,1,14] + CRUSH rule 0 x 442 [10,13,9,7,15,1,4,2] + CRUSH rule 0 x 443 [12,15,10,9,2,1,6,4] + CRUSH rule 0 x 444 [4,13,7,14,3,1,9,11] + CRUSH rule 0 x 445 [4,2,15,7,1,9,11,12] + CRUSH rule 0 x 446 [12,10,6,9,4,1,15,3] + CRUSH rule 0 x 447 [15,7,13,1,4,9,3,11] + CRUSH rule 0 x 448 [5,2,13,7,15,10] + CRUSH rule 0 x 449 [14,5,3,12,10,9,6] + CRUSH rule 0 x 450 [2,4,6,9,15,1,13,10] + CRUSH rule 0 x 451 [6,14,11,3,9,1,12,5] + CRUSH rule 0 x 452 [14,9,10,4,2,13,7] + CRUSH rule 0 x 453 [5,15,13,2,6,9,11] + CRUSH rule 0 x 454 [10,4,2,6,15,12,9,1] + CRUSH rule 0 x 455 [6,13,2,4,10,1,15] + CRUSH rule 0 x 456 [5,7,13,1,11,3,9,15] + CRUSH rule 0 x 457 [9,1,5,7,11,13,15] + CRUSH rule 0 x 458 [9,11,15,4,7,2,12,1] + CRUSH rule 0 x 459 [13,15,11,1,5,2,6] + CRUSH rule 0 x 460 [5,12,10,15,7,3,9] + CRUSH rule 0 x 461 [4,3,9,13,15,6,10] + CRUSH rule 0 x 462 [4,7,12,14,11,1,3,9] + CRUSH rule 0 x 463 [4,12,14,11,2,7,1,9] + CRUSH rule 0 x 464 [4,2,15,10,1,9,13,7] + CRUSH rule 0 x 465 [5,10,9,7,13,1,3,14] + CRUSH rule 0 x 466 [13,5,2,15,9,11,6,1] + CRUSH rule 0 x 467 [13,6,14,3,9,1,11,5] + CRUSH rule 0 x 468 [10,7,12,14,4,1,9,2] + CRUSH rule 0 x 469 [4,9,6,14,12,11,3,1] + CRUSH rule 0 x 470 [3,9,12,15,5,6,10] + CRUSH rule 0 x 471 [6,1,5,14,13,10,9,3] + CRUSH rule 0 x 472 [2,14,7,5,13,1,11,9] + CRUSH rule 0 x 473 [15,10,6,9,4,12,2] + CRUSH rule 0 x 474 [15,10,4,12,6,9,2,1] + CRUSH rule 0 x 475 [10,5,12,9,14,3,6,1] + CRUSH rule 0 x 476 [3,6,10,12,1,15,9,4] + CRUSH rule 0 x 477 [6,13,5,15,11,9,2,1] + CRUSH rule 0 x 478 [4,15,1,3,7,12,10,9] + CRUSH rule 0 x 479 [13,11,1,6,14,5,9,3] + CRUSH rule 0 x 480 [1,13,6,4,9,14,11,3] + CRUSH rule 0 x 481 [15,12,7,9,1,3,10,4] + CRUSH rule 0 x 482 [2,12,9,1,7,11,14,4] + CRUSH rule 0 x 483 [10,1,4,15,9,7,13,2] + CRUSH rule 0 x 484 [1,4,10,13,7,14,2,9] + CRUSH rule 0 x 485 [9,4,3,1,14,12,7,10] + CRUSH rule 0 x 486 [3,10,15,9,7,13,4,1] + CRUSH rule 0 x 487 [12,11,4,14,7,2,1] + CRUSH rule 0 x 488 [14,4,1,9,2,6,10,12] + CRUSH rule 0 x 489 [11,4,2,13,15,7] + CRUSH rule 0 x 490 [4,9,1,3,13,15,6,11] + CRUSH rule 0 x 491 [1,12,5,2,14,11,6] + CRUSH rule 0 x 492 [5,7,11,3,14,9,1,13] + CRUSH rule 0 x 493 [12,1,4,15,3,11,9,6] + CRUSH rule 0 x 494 [1,7,13,4,15,9,10,3] + CRUSH rule 0 x 495 [3,15,7,1,9,5,12,11] + CRUSH rule 0 x 496 [5,3,7,13,9,14,10] + CRUSH rule 0 x 497 [13,10,3,6,5,14,1] + CRUSH rule 0 x 498 [10,6,1,5,9,12,3,15] + CRUSH rule 0 x 499 [14,3,12,5,1,11,9,7] + CRUSH rule 0 x 500 [15,9,6,12,11,2,1,5] + CRUSH rule 0 x 501 [10,13,1,9,3,14,5,7] + CRUSH rule 0 x 502 [5,1,14,11,7,12,9,2] + CRUSH rule 0 x 503 [15,10,7,9,1,12,4,2] + CRUSH rule 0 x 504 [13,2,7,1,14,11,5] + CRUSH rule 0 x 505 [12,7,5,2,14,10,9] + CRUSH rule 0 x 506 [11,7,9,14,12,1,2,5] + CRUSH rule 0 x 507 [4,14,13,3,9,7,1,10] + CRUSH rule 0 x 508 [12,1,4,9,2,11,15,7] + CRUSH rule 0 x 509 [4,2,6,9,14,1,10,13] + CRUSH rule 0 x 510 [5,3,1,12,11,14,9,7] + CRUSH rule 0 x 511 [2,12,10,6,14,5] + CRUSH rule 0 x 512 [15,11,3,5,7,1,13] + CRUSH rule 0 x 513 [4,9,11,3,13,7,1,14] + CRUSH rule 0 x 514 [11,9,3,4,12,15,6,1] + CRUSH rule 0 x 515 [12,14,6,5,3,9,1,10] + CRUSH rule 0 x 516 [14,11,1,12,3,7,4,9] + CRUSH rule 0 x 517 [11,5,6,13,9,3,14] + CRUSH rule 0 x 518 [3,5,7,12,15,11,9,1] + CRUSH rule 0 x 519 [12,14,2,1,4,6,9,10] + CRUSH rule 0 x 520 [12,4,2,10,6,15,9] + CRUSH rule 0 x 521 [11,5,9,6,15,3,13] + CRUSH rule 0 x 522 [4,12,11,1,15,3,9,6] + CRUSH rule 0 x 523 [3,1,5,9,15,10,13,7] + CRUSH rule 0 x 524 [15,9,3,11,13,7,4,1] + CRUSH rule 0 x 525 [3,15,11,6,9,12,4] + CRUSH rule 0 x 526 [10,2,5,13,6,15,1,9] + CRUSH rule 0 x 527 [3,13,4,1,9,10,14,7] + CRUSH rule 0 x 528 [12,7,15,10,2,5,9] + CRUSH rule 0 x 529 [6,4,10,12,2,9,14] + CRUSH rule 0 x 530 [11,9,12,7,5,1,3,15] + CRUSH rule 0 x 531 [9,15,4,7,2,13,1,11] + CRUSH rule 0 x 532 [5,3,13,7,9,14,1,10] + CRUSH rule 0 x 533 [12,15,1,2,7,5,10] + CRUSH rule 0 x 534 [11,9,3,7,15,4,1,12] + CRUSH rule 0 x 535 [11,1,3,5,14,9,12,7] + CRUSH rule 0 x 536 [9,1,14,13,4,6,2,11] + CRUSH rule 0 x 537 [15,5,13,2,7,11] + CRUSH rule 0 x 538 [13,5,11,2,6,15,9] + CRUSH rule 0 x 539 [10,12,6,14,1,2,9,5] + CRUSH rule 0 x 540 [12,15,7,3,9,11,1,4] + CRUSH rule 0 x 541 [2,1,6,11,14,13,4] + CRUSH rule 0 x 542 [3,9,15,5,11,12,7,1] + CRUSH rule 0 x 543 [4,10,9,3,6,13,14] + CRUSH rule 0 x 544 [3,15,9,11,7,4,12,1] + CRUSH rule 0 x 545 [14,10,7,12,4,9,1,3] + CRUSH rule 0 x 546 [5,15,13,7,1,10,9,2] + CRUSH rule 0 x 547 [5,13,7,9,3,14,10] + CRUSH rule 0 x 548 [11,7,12,15,4,2] + CRUSH rule 0 x 549 [14,1,4,9,13,6,3,10] + CRUSH rule 0 x 550 [9,15,3,13,1,6,4,11] + CRUSH rule 0 x 551 [11,2,15,6,13,5,1] + CRUSH rule 0 x 552 [2,11,14,1,9,6,5,12] + CRUSH rule 0 x 553 [11,9,14,6,4,13,3] + CRUSH rule 0 x 554 [11,14,6,4,13,9,3,1] + CRUSH rule 0 x 555 [6,5,10,9,14,2,13,1] + CRUSH rule 0 x 556 [15,6,3,13,11,4,1,9] + CRUSH rule 0 x 557 [12,2,5,14,10,9,6] + CRUSH rule 0 x 558 [12,1,6,15,5,10,3] + CRUSH rule 0 x 559 [2,13,5,10,14,7,1] + CRUSH rule 0 x 560 [4,9,12,6,3,10,1,15] + CRUSH rule 0 x 561 [12,7,1,2,5,15,11,9] + CRUSH rule 0 x 562 [7,13,9,14,2,1,11,4] + CRUSH rule 0 x 563 [15,4,3,10,13,9,7] + CRUSH rule 0 x 564 [2,13,7,1,15,10,4] + CRUSH rule 0 x 565 [3,12,4,1,14,7,11] + CRUSH rule 0 x 566 [6,14,4,2,13,11] + CRUSH rule 0 x 567 [15,4,11,6,3,12] + CRUSH rule 0 x 568 [4,14,1,6,10,13,3,9] + CRUSH rule 0 x 569 [11,3,15,13,5,1,9,7] + CRUSH rule 0 x 570 [1,10,13,4,7,2,9,14] + CRUSH rule 0 x 571 [10,12,14,9,4,2,1,6] + CRUSH rule 0 x 572 [12,14,3,10,6,1,4,9] + CRUSH rule 0 x 573 [7,15,11,2,12,9,4,1] + CRUSH rule 0 x 574 [11,14,13,1,3,7,4,9] + CRUSH rule 0 x 575 [5,13,15,9,6,10,2] + CRUSH rule 0 x 576 [3,15,11,9,1,6,5,13] + CRUSH rule 0 x 577 [13,9,6,15,3,11,4,1] + CRUSH rule 0 x 578 [4,10,1,2,7,13,14,9] + CRUSH rule 0 x 579 [13,1,15,2,10,7,5,9] + CRUSH rule 0 x 580 [3,12,4,1,10,15,7,9] + CRUSH rule 0 x 581 [7,14,12,10,1,2,9,5] + CRUSH rule 0 x 582 [10,5,13,14,1,2,7] + CRUSH rule 0 x 583 [4,15,1,9,10,12,2,6] + CRUSH rule 0 x 584 [10,1,5,13,6,9,2,15] + CRUSH rule 0 x 585 [5,3,6,1,11,14,13,9] + CRUSH rule 0 x 586 [7,10,14,12,9,3,5,1] + CRUSH rule 0 x 587 [11,6,9,4,1,14,13,2] + CRUSH rule 0 x 588 [3,12,7,15,4,9,1,10] + CRUSH rule 0 x 589 [9,7,12,1,10,3,4,15] + CRUSH rule 0 x 590 [12,1,3,9,10,6,4,14] + CRUSH rule 0 x 591 [2,6,14,13,9,11,4] + CRUSH rule 0 x 592 [15,12,9,7,5,2,11,1] + CRUSH rule 0 x 593 [13,14,5,11,9,6,2] + CRUSH rule 0 x 594 [12,14,2,9,7,4,1,11] + CRUSH rule 0 x 595 [12,7,10,3,1,14,9,4] + CRUSH rule 0 x 596 [2,7,12,11,1,5,15,9] + CRUSH rule 0 x 597 [15,1,2,10,7,13,5,9] + CRUSH rule 0 x 598 [11,5,9,14,12,7,3] + CRUSH rule 0 x 599 [13,11,1,5,6,2,15,9] + CRUSH rule 0 x 600 [4,12,3,10,9,7,1,14] + CRUSH rule 0 x 601 [13,5,15,2,1,7,9,10] + CRUSH rule 0 x 602 [3,11,7,1,13,15,5,9] + CRUSH rule 0 x 603 [3,1,4,14,10,9,6,12] + CRUSH rule 0 x 604 [14,2,6,1,11,13,9,4] + CRUSH rule 0 x 605 [2,7,12,5,14,10,1,9] + CRUSH rule 0 x 606 [12,15,1,5,7,9,3,11] + CRUSH rule 0 x 607 [3,9,10,14,7,1,4,12] + CRUSH rule 0 x 608 [13,10,1,7,9,15,5,2] + CRUSH rule 0 x 609 [14,3,7,9,11,12,5] + CRUSH rule 0 x 610 [7,10,5,1,12,2,15] + CRUSH rule 0 x 611 [13,1,5,3,10,7,15,9] + CRUSH rule 0 x 612 [7,1,2,13,9,15,4,11] + CRUSH rule 0 x 613 [10,7,14,9,5,2,13] + CRUSH rule 0 x 614 [9,4,15,3,1,11,6,12] + CRUSH rule 0 x 615 [9,4,11,2,1,12,6,15] + CRUSH rule 0 x 616 [10,14,1,5,3,6,12,9] + CRUSH rule 0 x 617 [15,7,2,11,12,1,9,4] + CRUSH rule 0 x 618 [4,2,10,6,14,9,1,12] + CRUSH rule 0 x 619 [15,4,3,9,6,1,13,11] + CRUSH rule 0 x 620 [3,7,11,14,13,1,5] + CRUSH rule 0 x 621 [3,6,4,14,1,11,13] + CRUSH rule 0 x 622 [10,2,13,5,15,9,1,7] + CRUSH rule 0 x 623 [4,9,14,7,3,13,11] + CRUSH rule 0 x 624 [3,9,15,6,10,1,5,12] + CRUSH rule 0 x 625 [11,7,3,5,13,15,9] + CRUSH rule 0 x 626 [10,12,2,1,9,7,5,14] + CRUSH rule 0 x 627 [1,12,10,14,3,5,9,7] + CRUSH rule 0 x 628 [15,13,11,4,2,1,7,9] + CRUSH rule 0 x 629 [5,6,15,12,1,10,3,9] + CRUSH rule 0 x 630 [1,4,12,9,3,7,15,11] + CRUSH rule 0 x 631 [5,7,1,15,12,11,3,9] + CRUSH rule 0 x 632 [12,3,11,9,6,1,15,5] + CRUSH rule 0 x 633 [14,4,3,7,10,12,9] + CRUSH rule 0 x 634 [6,9,5,3,13,11,14] + CRUSH rule 0 x 635 [6,5,2,15,9,12,11] + CRUSH rule 0 x 636 [13,6,11,3,15,9,1,4] + CRUSH rule 0 x 637 [3,1,10,6,9,12,4,14] + CRUSH rule 0 x 638 [10,15,3,5,13,1,7] + CRUSH rule 0 x 639 [6,9,14,4,3,1,10,13] + CRUSH rule 0 x 640 [9,6,1,11,14,2,4,13] + CRUSH rule 0 x 641 [10,6,5,14,1,9,12,2] + CRUSH rule 0 x 642 [1,15,4,6,2,10,9,12] + CRUSH rule 0 x 643 [3,7,5,1,10,15,13] + CRUSH rule 0 x 644 [15,13,6,9,3,11,5] + CRUSH rule 0 x 645 [14,2,4,9,10,1,7,13] + CRUSH rule 0 x 646 [5,13,14,1,6,9,2,11] + CRUSH rule 0 x 647 [10,1,9,13,6,2,14,5] + CRUSH rule 0 x 648 [6,5,2,14,11,1,12,9] + CRUSH rule 0 x 649 [3,9,13,11,4,14,1,7] + CRUSH rule 0 x 650 [10,9,4,15,12,7,1,2] + CRUSH rule 0 x 651 [3,9,5,7,14,1,13,11] + CRUSH rule 0 x 652 [15,9,4,6,13,1,2,11] + CRUSH rule 0 x 653 [11,14,1,3,6,9,12,5] + CRUSH rule 0 x 654 [13,6,2,10,15,4,1,9] + CRUSH rule 0 x 655 [6,3,4,15,12,11,1] + CRUSH rule 0 x 656 [3,15,1,4,6,12,11] + CRUSH rule 0 x 657 [11,15,3,5,7,13,1,9] + CRUSH rule 0 x 658 [7,2,10,12,1,4,9,14] + CRUSH rule 0 x 659 [2,5,14,6,10,12] + CRUSH rule 0 x 660 [13,14,10,6,4,9,3] + CRUSH rule 0 x 661 [7,15,3,12,11,4,9,1] + CRUSH rule 0 x 662 [15,2,12,5,1,10,9,7] + CRUSH rule 0 x 663 [14,9,13,10,5,3,1,6] + CRUSH rule 0 x 664 [6,10,12,4,9,2,1,15] + CRUSH rule 0 x 665 [2,9,12,1,7,10,4,15] + CRUSH rule 0 x 666 [12,3,6,1,15,9,10,4] + CRUSH rule 0 x 667 [1,9,12,10,2,14,7,4] + CRUSH rule 0 x 668 [9,5,1,2,6,11,13,15] + CRUSH rule 0 x 669 [9,7,14,5,11,13,1,2] + CRUSH rule 0 x 670 [6,10,9,13,1,2,15,4] + CRUSH rule 0 x 671 [6,15,5,10,13,3] + CRUSH rule 0 x 672 [2,9,13,1,4,14,6,10] + CRUSH rule 0 x 673 [7,10,5,9,15,13,2,1] + CRUSH rule 0 x 674 [7,12,10,1,14,9,3,4] + CRUSH rule 0 x 675 [9,5,1,10,6,14,12,2] + CRUSH rule 0 x 676 [10,12,2,1,4,15,7] + CRUSH rule 0 x 677 [2,12,1,4,10,6,15,9] + CRUSH rule 0 x 678 [1,2,4,10,12,14,9,6] + CRUSH rule 0 x 679 [5,6,12,15,9,11,3] + CRUSH rule 0 x 680 [7,11,3,1,15,4,9,12] + CRUSH rule 0 x 681 [6,4,3,11,14,13,1,9] + CRUSH rule 0 x 682 [6,1,11,15,12,2,5,9] + CRUSH rule 0 x 683 [6,13,2,4,9,14,10,1] + CRUSH rule 0 x 684 [9,11,3,7,15,4,13] + CRUSH rule 0 x 685 [5,1,15,7,9,2,10,13] + CRUSH rule 0 x 686 [1,9,11,14,6,13,4,3] + CRUSH rule 0 x 687 [7,13,3,5,11,9,15,1] + CRUSH rule 0 x 688 [11,9,1,14,3,5,7,12] + CRUSH rule 0 x 689 [5,2,9,12,1,14,11,7] + CRUSH rule 0 x 690 [9,7,10,3,13,15,5,1] + CRUSH rule 0 x 691 [11,15,9,5,7,13,2] + CRUSH rule 0 x 692 [15,5,1,2,9,11,12,7] + CRUSH rule 0 x 693 [5,6,12,15,2,10,9,1] + CRUSH rule 0 x 694 [4,7,1,10,12,3,14] + CRUSH rule 0 x 695 [6,13,14,10,9,5,1,3] + CRUSH rule 0 x 696 [1,2,4,14,7,11,13] + CRUSH rule 0 x 697 [13,11,3,6,4,14,9,1] + CRUSH rule 0 x 698 [11,13,4,2,6,1,9,15] + CRUSH rule 0 x 699 [7,14,12,4,2,11] + CRUSH rule 0 x 700 [12,14,11,9,4,6,3,1] + CRUSH rule 0 x 701 [3,13,1,14,4,7,11] + CRUSH rule 0 x 702 [3,12,15,6,5,11,1,9] + CRUSH rule 0 x 703 [15,11,13,3,4,7,1,9] + CRUSH rule 0 x 704 [6,4,2,15,11,1,13,9] + CRUSH rule 0 x 705 [14,6,11,5,1,13,9,3] + CRUSH rule 0 x 706 [1,12,3,6,4,10,15,9] + CRUSH rule 0 x 707 [4,7,14,3,10,9,13] + CRUSH rule 0 x 708 [3,10,5,1,15,9,7,13] + CRUSH rule 0 x 709 [11,12,3,7,5,14,1,9] + CRUSH rule 0 x 710 [14,2,11,9,5,7,12,1] + CRUSH rule 0 x 711 [14,3,9,10,12,5,6,1] + CRUSH rule 0 x 712 [12,3,11,15,9,1,6,4] + CRUSH rule 0 x 713 [11,9,3,15,13,6,4,1] + CRUSH rule 0 x 714 [12,1,9,7,2,15,10,5] + CRUSH rule 0 x 715 [6,1,14,4,11,12,3,9] + CRUSH rule 0 x 716 [11,13,9,14,5,2,1,7] + CRUSH rule 0 x 717 [12,4,10,9,15,1,2,7] + CRUSH rule 0 x 718 [7,15,5,2,11,13] + CRUSH rule 0 x 719 [5,15,13,3,1,7,11] + CRUSH rule 0 x 720 [4,13,10,2,7,9,1,14] + CRUSH rule 0 x 721 [11,3,14,9,1,12,4,6] + CRUSH rule 0 x 722 [2,4,6,1,9,15,13,10] + CRUSH rule 0 x 723 [2,1,12,15,11,7,5,9] + CRUSH rule 0 x 724 [7,1,9,10,5,15,13,2] + CRUSH rule 0 x 725 [11,12,7,15,4,1,2] + CRUSH rule 0 x 726 [7,14,4,3,11,13,9,1] + CRUSH rule 0 x 727 [2,5,1,11,15,7,12] + CRUSH rule 0 x 728 [13,11,4,6,15,2] + CRUSH rule 0 x 729 [15,11,4,6,2,9,1,13] + CRUSH rule 0 x 730 [3,7,1,13,11,15,9,5] + CRUSH rule 0 x 731 [9,1,6,5,2,11,13,15] + CRUSH rule 0 x 732 [1,2,10,13,9,4,7,15] + CRUSH rule 0 x 733 [11,3,5,6,1,9,12,15] + CRUSH rule 0 x 734 [14,3,11,7,12,9,4,1] + CRUSH rule 0 x 735 [6,9,2,10,13,14,5] + CRUSH rule 0 x 736 [3,9,1,11,7,5,13,14] + CRUSH rule 0 x 737 [1,4,2,12,9,10,6,15] + CRUSH rule 0 x 738 [11,15,7,4,9,2,12] + CRUSH rule 0 x 739 [11,12,6,2,4,1,14] + CRUSH rule 0 x 740 [7,9,10,13,1,15,2,5] + CRUSH rule 0 x 741 [12,11,7,15,2,5] + CRUSH rule 0 x 742 [9,7,4,11,12,1,14,3] + CRUSH rule 0 x 743 [5,13,9,15,10,7,3] + CRUSH rule 0 x 744 [6,2,13,1,14,11,4] + CRUSH rule 0 x 745 [3,6,1,4,11,12,14,9] + CRUSH rule 0 x 746 [3,7,9,10,14,5,1,13] + CRUSH rule 0 x 747 [15,11,5,2,13,9,1,7] + CRUSH rule 0 x 748 [6,10,13,2,14,5,9,1] + CRUSH rule 0 x 749 [14,9,10,7,5,1,2,12] + CRUSH rule 0 x 750 [1,14,6,5,11,2,13] + CRUSH rule 0 x 751 [15,1,6,9,5,11,12,3] + CRUSH rule 0 x 752 [13,1,7,3,11,15,9,4] + CRUSH rule 0 x 753 [4,11,1,3,15,7,13] + CRUSH rule 0 x 754 [14,12,11,4,2,1,9,6] + CRUSH rule 0 x 755 [13,6,1,10,4,2,14,9] + CRUSH rule 0 x 756 [3,4,14,6,1,10,13,9] + CRUSH rule 0 x 757 [10,6,1,4,13,15,2] + CRUSH rule 0 x 758 [6,3,4,10,15,13,9,1] + CRUSH rule 0 x 759 [5,7,3,14,11,1,9,13] + CRUSH rule 0 x 760 [1,15,10,12,4,3,9,7] + CRUSH rule 0 x 761 [2,12,1,14,5,7,10] + CRUSH rule 0 x 762 [1,4,10,9,3,7,14,12] + CRUSH rule 0 x 763 [4,13,1,14,7,10,2,9] + CRUSH rule 0 x 764 [1,14,6,13,9,5,2,10] + CRUSH rule 0 x 765 [9,15,2,13,4,1,11,7] + CRUSH rule 0 x 766 [11,2,7,15,9,12,4] + CRUSH rule 0 x 767 [6,11,4,3,12,14] + CRUSH rule 0 x 768 [2,12,15,7,1,11,9,4] + CRUSH rule 0 x 769 [15,1,9,2,11,12,7,4] + CRUSH rule 0 x 770 [15,13,4,6,3,10,1,9] + CRUSH rule 0 x 771 [9,2,12,11,6,14,5,1] + CRUSH rule 0 x 772 [4,3,13,11,14,1,7] + CRUSH rule 0 x 773 [3,7,4,15,1,12,11,9] + CRUSH rule 0 x 774 [12,6,3,15,5,9,10,1] + CRUSH rule 0 x 775 [5,10,14,2,6,1,13] + CRUSH rule 0 x 776 [10,15,3,9,6,13,1,5] + CRUSH rule 0 x 777 [11,13,4,7,1,14,9,2] + CRUSH rule 0 x 778 [13,1,9,11,15,6,3,5] + CRUSH rule 0 x 779 [5,11,1,14,2,9,13,6] + CRUSH rule 0 x 780 [13,9,3,6,4,1,14,10] + CRUSH rule 0 x 781 [5,7,14,3,1,12,11,9] + CRUSH rule 0 x 782 [2,15,9,7,11,13,4,1] + CRUSH rule 0 x 783 [12,7,5,14,9,1,2,10] + CRUSH rule 0 x 784 [14,1,10,13,3,4,7,9] + CRUSH rule 0 x 785 [6,12,1,2,4,9,15,10] + CRUSH rule 0 x 786 [10,5,2,15,1,7,12,9] + CRUSH rule 0 x 787 [1,12,10,2,9,4,14,6] + CRUSH rule 0 x 788 [4,2,9,13,6,15,11] + CRUSH rule 0 x 789 [9,2,14,7,4,12,1,10] + CRUSH rule 0 x 790 [15,2,7,4,1,10,13] + CRUSH rule 0 x 791 [9,4,7,13,14,11,1,3] + CRUSH rule 0 x 792 [6,4,15,10,12,3] + CRUSH rule 0 x 793 [15,9,6,2,13,11,4] + CRUSH rule 0 x 794 [5,12,2,14,9,10,1,6] + CRUSH rule 0 x 795 [6,14,12,4,10,1,2,9] + CRUSH rule 0 x 796 [11,2,12,6,15,4] + CRUSH rule 0 x 797 [14,3,7,1,5,13,11] + CRUSH rule 0 x 798 [5,11,6,13,1,3,15,9] + CRUSH rule 0 x 799 [2,9,14,4,13,6,11] + CRUSH rule 0 x 800 [6,3,4,11,15,13] + CRUSH rule 0 x 801 [2,5,6,13,9,1,10,15] + CRUSH rule 0 x 802 [1,4,12,7,3,9,10,14] + CRUSH rule 0 x 803 [7,2,4,1,11,13,9,14] + CRUSH rule 0 x 804 [5,14,9,7,3,1,12,10] + CRUSH rule 0 x 805 [13,4,3,1,10,15,7] + CRUSH rule 0 x 806 [6,2,13,4,15,1,10] + CRUSH rule 0 x 807 [14,2,7,4,9,12,1,10] + CRUSH rule 0 x 808 [2,15,12,7,9,1,5,10] + CRUSH rule 0 x 809 [1,11,7,12,4,2,15,9] + CRUSH rule 0 x 810 [2,5,9,12,15,1,7,11] + CRUSH rule 0 x 811 [15,6,3,10,1,5,9,12] + CRUSH rule 0 x 812 [7,11,2,14,9,5,12] + CRUSH rule 0 x 813 [4,10,13,14,2,6,9] + CRUSH rule 0 x 814 [13,4,9,3,10,6,15] + CRUSH rule 0 x 815 [15,12,9,4,10,6,1,2] + CRUSH rule 0 x 816 [14,10,13,7,3,9,4,1] + CRUSH rule 0 x 817 [10,7,2,15,13,9,5] + CRUSH rule 0 x 818 [15,2,11,4,1,12,6,9] + CRUSH rule 0 x 819 [5,12,10,6,1,14,3] + CRUSH rule 0 x 820 [3,6,9,12,11,15,4,1] + CRUSH rule 0 x 821 [15,10,9,13,3,4,7,1] + CRUSH rule 0 x 822 [10,13,2,9,7,4,14,1] + CRUSH rule 0 x 823 [2,6,12,10,15,4,1,9] + CRUSH rule 0 x 824 [3,7,9,13,15,5,10] + CRUSH rule 0 x 825 [10,5,14,6,12,9,3] + CRUSH rule 0 x 826 [5,2,11,15,1,12,9,7] + CRUSH rule 0 x 827 [13,5,1,3,7,9,11,14] + CRUSH rule 0 x 828 [12,6,10,5,1,9,2,15] + CRUSH rule 0 x 829 [13,6,15,10,5,3,9] + CRUSH rule 0 x 830 [15,13,2,9,7,11,1,5] + CRUSH rule 0 x 831 [1,4,11,12,6,3,15] + CRUSH rule 0 x 832 [14,11,13,2,9,4,6,1] + CRUSH rule 0 x 833 [9,13,3,11,7,5,15,1] + CRUSH rule 0 x 834 [9,7,5,1,11,2,13,14] + CRUSH rule 0 x 835 [14,3,13,6,4,9,1,10] + CRUSH rule 0 x 836 [3,9,10,13,1,5,14,7] + CRUSH rule 0 x 837 [15,12,11,2,7,9,5] + CRUSH rule 0 x 838 [12,14,9,2,5,7,11] + CRUSH rule 0 x 839 [3,4,6,10,15,1,13,9] + CRUSH rule 0 x 840 [10,15,12,4,7,1,2,9] + CRUSH rule 0 x 841 [3,5,7,12,11,15,1,9] + CRUSH rule 0 x 842 [9,13,2,6,5,14,10,1] + CRUSH rule 0 x 843 [14,7,4,9,3,12,1,10] + CRUSH rule 0 x 844 [7,1,4,15,9,2,11,12] + CRUSH rule 0 x 845 [13,6,1,15,4,2,11] + CRUSH rule 0 x 846 [3,7,15,13,1,9,10,4] + CRUSH rule 0 x 847 [12,15,11,5,2,7,1] + CRUSH rule 0 x 848 [11,13,1,14,5,9,2,7] + CRUSH rule 0 x 849 [3,15,11,9,6,1,13,5] + CRUSH rule 0 x 850 [1,3,10,6,14,4,9,12] + CRUSH rule 0 x 851 [14,4,3,6,11,1,13] + CRUSH rule 0 x 852 [9,12,4,7,15,2,11,1] + CRUSH rule 0 x 853 [13,14,6,11,2,4,9,1] + CRUSH rule 0 x 854 [7,11,12,1,4,15,3] + CRUSH rule 0 x 855 [14,4,12,6,3,1,10] + CRUSH rule 0 x 856 [5,10,7,3,15,9,12,1] + CRUSH rule 0 x 857 [4,3,13,11,9,1,7,14] + CRUSH rule 0 x 858 [5,15,6,3,9,12,1,10] + CRUSH rule 0 x 859 [5,15,6,2,1,11,12,9] + CRUSH rule 0 x 860 [11,14,1,12,6,9,2,4] + CRUSH rule 0 x 861 [13,7,4,10,1,14,3,9] + CRUSH rule 0 x 862 [5,10,9,7,3,12,1,15] + CRUSH rule 0 x 863 [11,6,3,9,4,12,15] + CRUSH rule 0 x 864 [6,13,4,2,10,15,1,9] + CRUSH rule 0 x 865 [4,1,14,11,6,9,3,13] + CRUSH rule 0 x 866 [2,13,4,15,9,6,11] + CRUSH rule 0 x 867 [12,2,9,10,4,14,6] + CRUSH rule 0 x 868 [14,11,7,2,1,4,9,12] + CRUSH rule 0 x 869 [10,13,7,14,3,5,1] + CRUSH rule 0 x 870 [14,9,11,4,3,12,6,1] + CRUSH rule 0 x 871 [6,2,1,4,15,13,11,9] + CRUSH rule 0 x 872 [6,1,15,3,10,12,5] + CRUSH rule 0 x 873 [2,5,12,10,1,9,15,7] + CRUSH rule 0 x 874 [12,4,7,2,15,10,1] + CRUSH rule 0 x 875 [10,6,14,1,12,5,9,3] + CRUSH rule 0 x 876 [14,7,13,3,9,1,11,4] + CRUSH rule 0 x 877 [15,11,13,9,5,1,6,3] + CRUSH rule 0 x 878 [7,14,3,13,9,1,11,4] + CRUSH rule 0 x 879 [12,2,7,4,10,15] + CRUSH rule 0 x 880 [2,12,10,7,1,4,9,14] + CRUSH rule 0 x 881 [6,3,1,11,4,15,9,13] + CRUSH rule 0 x 882 [11,13,7,1,2,15,4,9] + CRUSH rule 0 x 883 [13,1,3,10,6,5,9,15] + CRUSH rule 0 x 884 [6,15,4,9,3,11,12,1] + CRUSH rule 0 x 885 [14,7,9,4,2,13,11] + CRUSH rule 0 x 886 [13,11,4,2,1,14,9,6] + CRUSH rule 0 x 887 [14,4,12,11,2,6,9,1] + CRUSH rule 0 x 888 [10,12,7,15,9,2,1,5] + CRUSH rule 0 x 889 [15,13,4,1,6,2,10,9] + CRUSH rule 0 x 890 [10,12,14,2,9,5,6,1] + CRUSH rule 0 x 891 [9,5,11,6,3,15,12,1] + CRUSH rule 0 x 892 [12,15,2,4,7,9,11,1] + CRUSH rule 0 x 893 [1,3,5,9,6,10,14,12] + CRUSH rule 0 x 894 [7,2,11,13,4,1,14] + CRUSH rule 0 x 895 [2,1,11,5,7,15,13,9] + CRUSH rule 0 x 896 [9,1,14,10,4,12,2,7] + CRUSH rule 0 x 897 [7,5,14,3,1,9,11,12] + CRUSH rule 0 x 898 [10,6,12,9,15,5,2,1] + CRUSH rule 0 x 899 [1,11,5,3,13,14,9,6] + CRUSH rule 0 x 900 [2,9,10,7,13,14,5,1] + CRUSH rule 0 x 901 [9,12,11,3,14,4,1,6] + CRUSH rule 0 x 902 [4,2,6,15,12,10,1] + CRUSH rule 0 x 903 [14,10,3,1,12,6,5] + CRUSH rule 0 x 904 [15,12,4,9,6,3,11] + CRUSH rule 0 x 905 [12,6,11,3,9,4,15] + CRUSH rule 0 x 906 [14,11,12,2,4,9,6] + CRUSH rule 0 x 907 [7,12,3,9,10,5,14,1] + CRUSH rule 0 x 908 [2,15,9,6,10,13,5,1] + CRUSH rule 0 x 909 [10,14,1,13,2,9,7,4] + CRUSH rule 0 x 910 [12,7,4,15,10,3,1,9] + CRUSH rule 0 x 911 [11,15,2,4,9,13,6,1] + CRUSH rule 0 x 912 [6,4,14,13,3,1,11] + CRUSH rule 0 x 913 [4,6,10,1,12,3,9,14] + CRUSH rule 0 x 914 [4,15,2,10,1,13,7] + CRUSH rule 0 x 915 [12,14,1,9,4,3,11,6] + CRUSH rule 0 x 916 [3,1,11,5,6,13,14] + CRUSH rule 0 x 917 [1,15,6,5,10,3,13,9] + CRUSH rule 0 x 918 [7,14,11,4,9,2,13] + CRUSH rule 0 x 919 [10,7,3,13,15,1,4] + CRUSH rule 0 x 920 [4,2,10,15,1,13,6] + CRUSH rule 0 x 921 [1,11,6,13,4,2,9,14] + CRUSH rule 0 x 922 [6,4,14,13,3,1,10,9] + CRUSH rule 0 x 923 [12,2,5,14,10,1,9,6] + CRUSH rule 0 x 924 [6,2,14,13,9,1,11,5] + CRUSH rule 0 x 925 [12,15,2,10,1,5,7] + CRUSH rule 0 x 926 [3,13,10,1,14,9,6,5] + CRUSH rule 0 x 927 [6,5,1,11,14,2,13,9] + CRUSH rule 0 x 928 [13,1,3,9,6,11,15,5] + CRUSH rule 0 x 929 [10,7,1,5,2,12,9,14] + CRUSH rule 0 x 930 [7,15,10,5,1,13,2] + CRUSH rule 0 x 931 [6,15,11,9,5,3,1,13] + CRUSH rule 0 x 932 [13,2,5,11,9,1,6,15] + CRUSH rule 0 x 933 [12,7,14,10,4,1,2,9] + CRUSH rule 0 x 934 [12,2,5,7,9,1,15,11] + CRUSH rule 0 x 935 [6,11,1,14,5,13,3,9] + CRUSH rule 0 x 936 [9,12,7,5,1,2,14,11] + CRUSH rule 0 x 937 [14,2,11,1,13,4,9,6] + CRUSH rule 0 x 938 [14,3,5,11,7,9,13] + CRUSH rule 0 x 939 [6,4,14,9,12,1,11,2] + CRUSH rule 0 x 940 [13,11,4,2,1,6,15] + CRUSH rule 0 x 941 [3,12,4,7,14,10] + CRUSH rule 0 x 942 [15,12,10,4,1,9,3,7] + CRUSH rule 0 x 943 [10,2,4,9,6,15,12] + CRUSH rule 0 x 944 [2,9,4,7,1,14,12,11] + CRUSH rule 0 x 945 [10,15,2,9,5,12,7] + CRUSH rule 0 x 946 [11,15,7,12,5,9,2] + CRUSH rule 0 x 947 [11,3,14,1,12,5,6,9] + CRUSH rule 0 x 948 [7,13,11,5,14,2,1,9] + CRUSH rule 0 x 949 [9,1,12,5,15,10,2,6] + CRUSH rule 0 x 950 [9,15,13,6,4,2,10] + CRUSH rule 0 x 951 [2,6,12,9,10,4,14] + CRUSH rule 0 x 952 [9,7,15,3,5,13,11] + CRUSH rule 0 x 953 [1,3,6,10,12,14,4,9] + CRUSH rule 0 x 954 [10,2,14,9,4,6,12,1] + CRUSH rule 0 x 955 [7,14,3,1,10,4,9,12] + CRUSH rule 0 x 956 [1,6,11,5,14,3,9,13] + CRUSH rule 0 x 957 [14,11,1,12,6,9,4,3] + CRUSH rule 0 x 958 [15,4,3,11,1,6,12,9] + CRUSH rule 0 x 959 [2,1,12,15,10,9,4,6] + CRUSH rule 0 x 960 [2,6,11,13,15,4,9] + CRUSH rule 0 x 961 [3,13,11,9,6,1,4,15] + CRUSH rule 0 x 962 [5,11,3,14,1,6,13,9] + CRUSH rule 0 x 963 [13,10,15,4,6,9,1,3] + CRUSH rule 0 x 964 [7,11,4,9,2,12,1,15] + CRUSH rule 0 x 965 [12,2,9,7,4,15,11,1] + CRUSH rule 0 x 966 [12,14,9,4,1,2,11,7] + CRUSH rule 0 x 967 [7,5,3,10,12,14] + CRUSH rule 0 x 968 [12,15,4,9,11,6,3] + CRUSH rule 0 x 969 [11,4,7,1,9,14,13,2] + CRUSH rule 0 x 970 [5,12,10,1,3,14,9,6] + CRUSH rule 0 x 971 [1,9,4,12,7,2,10,15] + CRUSH rule 0 x 972 [12,3,14,5,1,9,7,11] + CRUSH rule 0 x 973 [1,10,4,12,2,7,15] + CRUSH rule 0 x 974 [7,11,1,2,15,4,12,9] + CRUSH rule 0 x 975 [7,9,15,12,2,11,4] + CRUSH rule 0 x 976 [7,3,15,5,12,11,1] + CRUSH rule 0 x 977 [14,3,6,10,4,1,12] + CRUSH rule 0 x 978 [12,5,11,1,15,3,6] + CRUSH rule 0 x 979 [5,1,13,6,15,10,3,9] + CRUSH rule 0 x 980 [15,11,5,6,1,3,13,9] + CRUSH rule 0 x 981 [5,11,15,12,7,1,2] + CRUSH rule 0 x 982 [2,6,14,11,12,9,5] + CRUSH rule 0 x 983 [3,12,10,9,14,5,6] + CRUSH rule 0 x 984 [15,13,1,10,2,5,7] + CRUSH rule 0 x 985 [11,2,15,1,4,13,6,9] + CRUSH rule 0 x 986 [6,13,9,1,15,10,5,2] + CRUSH rule 0 x 987 [13,14,5,10,6,1,3,9] + CRUSH rule 0 x 988 [12,9,10,14,3,1,4,7] + CRUSH rule 0 x 989 [7,4,3,15,9,13,10,1] + CRUSH rule 0 x 990 [1,10,9,13,3,4,6,15] + CRUSH rule 0 x 991 [7,11,1,14,2,5,9,12] + CRUSH rule 0 x 992 [9,10,2,13,7,4,1,15] + CRUSH rule 0 x 993 [6,10,14,12,4,1,2] + CRUSH rule 0 x 994 [3,13,15,4,11,7,1,9] + CRUSH rule 0 x 995 [15,6,12,2,5,11] + CRUSH rule 0 x 996 [15,10,5,3,13,1,9,7] + CRUSH rule 0 x 997 [15,2,1,12,7,9,4,10] + CRUSH rule 0 x 998 [6,1,9,5,12,11,15,2] + CRUSH rule 0 x 999 [9,10,15,5,13,3,7] + CRUSH rule 0 x 1000 [14,2,9,4,12,1,6,11] + CRUSH rule 0 x 1001 [11,14,4,2,6,9,1,13] + CRUSH rule 0 x 1002 [1,10,14,2,9,5,13,7] + CRUSH rule 0 x 1003 [10,7,5,14,2,1,9,12] + CRUSH rule 0 x 1004 [15,1,4,6,10,12,9,3] + CRUSH rule 0 x 1005 [6,12,2,10,9,15,5,1] + CRUSH rule 0 x 1006 [10,12,15,1,2,6,5] + CRUSH rule 0 x 1007 [1,7,13,14,3,4,10] + CRUSH rule 0 x 1008 [7,4,9,11,3,15,1,13] + CRUSH rule 0 x 1009 [5,2,11,7,15,9,1,12] + CRUSH rule 0 x 1010 [10,2,15,6,9,13,4,1] + CRUSH rule 0 x 1011 [6,3,12,1,10,4,9,14] + CRUSH rule 0 x 1012 [12,6,9,15,3,1,5,11] + CRUSH rule 0 x 1013 [2,14,12,4,9,1,6,10] + CRUSH rule 0 x 1014 [1,13,7,2,10,14,5] + CRUSH rule 0 x 1015 [12,6,10,1,4,15,9,2] + CRUSH rule 0 x 1016 [10,13,14,3,5,6,1] + CRUSH rule 0 x 1017 [5,11,14,7,13,9,2] + CRUSH rule 0 x 1018 [13,11,14,1,9,3,5,7] + CRUSH rule 0 x 1019 [10,13,14,7,5,1,2] + CRUSH rule 0 x 1020 [3,1,13,4,10,9,14,6] + CRUSH rule 0 x 1021 [2,11,14,9,4,6,1,13] + CRUSH rule 0 x 1022 [15,5,7,2,12,10] + CRUSH rule 0 x 1023 [15,2,9,12,1,7,4,11] + rule 0 (replicated_ruleset) num_rep 8 result size == 6:\t36/1024 (esc) + rule 0 (replicated_ruleset) num_rep 8 result size == 7:\t264/1024 (esc) + rule 0 (replicated_ruleset) num_rep 8 result size == 8:\t724/1024 (esc) + CRUSH rule 0 x 0 [7,10,3,15,12,1,4,9] + CRUSH rule 0 x 1 [10,15,1,2,13,4,7,9] + CRUSH rule 0 x 2 [1,12,2,6,5,10,15] + CRUSH rule 0 x 3 [15,4,10,2,9,6,13] + CRUSH rule 0 x 4 [14,2,10,1,9,4,7,13] + CRUSH rule 0 x 5 [7,4,11,2,13,15,9] + CRUSH rule 0 x 6 [12,6,10,9,3,4,14] + CRUSH rule 0 x 7 [9,2,6,12,11,4,1,14] + CRUSH rule 0 x 8 [10,2,15,1,4,13,6,9] + CRUSH rule 0 x 9 [7,1,14,2,11,9,12,4] + CRUSH rule 0 x 10 [10,14,4,1,2,7,13,9] + CRUSH rule 0 x 11 [13,9,14,7,5,11,2,1] + CRUSH rule 0 x 12 [7,1,2,5,13,15,11,9] + CRUSH rule 0 x 13 [3,5,12,7,9,1,14,11] + CRUSH rule 0 x 14 [13,5,2,7,10,15,1,9] + CRUSH rule 0 x 15 [15,1,9,6,13,3,5,11] + CRUSH rule 0 x 16 [7,11,14,2,13,1,9,4] + CRUSH rule 0 x 17 [10,1,13,2,4,6,14,9] + CRUSH rule 0 x 18 [1,7,3,10,5,12,9,14] + CRUSH rule 0 x 19 [7,12,2,4,15,10,1] + CRUSH rule 0 x 20 [14,12,3,10,9,4,7,1] + CRUSH rule 0 x 21 [3,12,1,10,4,15,6] + CRUSH rule 0 x 22 [6,3,13,11,4,1,15] + CRUSH rule 0 x 23 [10,5,13,9,3,15,1,6] + CRUSH rule 0 x 24 [12,11,3,1,9,4,7,15] + CRUSH rule 0 x 25 [7,12,15,1,3,10,4,9] + CRUSH rule 0 x 26 [1,7,13,2,14,5,9,11] + CRUSH rule 0 x 27 [3,6,15,4,13,9,11,1] + CRUSH rule 0 x 28 [14,4,3,9,6,11,13] + CRUSH rule 0 x 29 [5,14,12,11,6,3,1,9] + CRUSH rule 0 x 30 [2,5,6,9,1,11,13,14] + CRUSH rule 0 x 31 [5,15,10,1,9,13,6,3] + CRUSH rule 0 x 32 [9,10,2,1,13,14,6,4] + CRUSH rule 0 x 33 [13,4,9,2,7,1,10,14] + CRUSH rule 0 x 34 [13,15,2,4,1,10,9,6] + CRUSH rule 0 x 35 [4,14,3,13,10,9,1,6] + CRUSH rule 0 x 36 [3,12,9,7,5,10,14,1] + CRUSH rule 0 x 37 [9,2,6,14,11,1,4,13] + CRUSH rule 0 x 38 [3,4,13,10,9,1,14,6] + CRUSH rule 0 x 39 [12,7,14,11,1,9,5,2] + CRUSH rule 0 x 40 [10,1,9,5,15,2,6,13] + CRUSH rule 0 x 41 [4,9,11,1,14,13,6,3] + CRUSH rule 0 x 42 [3,6,14,10,12,5,1] + CRUSH rule 0 x 43 [10,5,15,7,2,9,12] + CRUSH rule 0 x 44 [11,4,13,3,7,14,9] + CRUSH rule 0 x 45 [11,12,15,9,1,5,6,3] + CRUSH rule 0 x 46 [6,9,2,14,11,13,1,5] + CRUSH rule 0 x 47 [3,9,6,4,13,1,11,15] + CRUSH rule 0 x 48 [4,6,2,1,10,14,13] + CRUSH rule 0 x 49 [9,15,10,7,4,3,13] + CRUSH rule 0 x 50 [14,12,1,4,2,11,6,9] + CRUSH rule 0 x 51 [10,6,5,12,15,2,1,9] + CRUSH rule 0 x 52 [12,1,9,11,7,3,14,4] + CRUSH rule 0 x 53 [3,6,13,9,5,1,11,15] + CRUSH rule 0 x 54 [4,13,9,2,14,10,6,1] + CRUSH rule 0 x 55 [4,11,2,7,1,13,9,15] + CRUSH rule 0 x 56 [5,9,10,1,3,13,14,7] + CRUSH rule 0 x 57 [6,2,1,15,10,12,5] + CRUSH rule 0 x 58 [7,1,11,4,3,14,12,9] + CRUSH rule 0 x 59 [2,13,1,10,9,5,14,6] + CRUSH rule 0 x 60 [3,6,11,1,4,9,12,15] + CRUSH rule 0 x 61 [3,15,13,7,4,1,10,9] + CRUSH rule 0 x 62 [15,11,7,12,5,9,2,1] + CRUSH rule 0 x 63 [10,14,12,1,7,3] + CRUSH rule 0 x 64 [3,9,1,4,7,12,11,15] + CRUSH rule 0 x 65 [4,12,11,7,14,3,1] + CRUSH rule 0 x 66 [15,11,6,9,4,1,3,12] + CRUSH rule 0 x 67 [2,6,4,14,1,11,12] + CRUSH rule 0 x 68 [15,7,4,2,9,12,11] + CRUSH rule 0 x 69 [2,1,15,10,4,9,13,7] + CRUSH rule 0 x 70 [9,6,1,3,13,15,11,5] + CRUSH rule 0 x 71 [15,5,1,3,13,10,7] + CRUSH rule 0 x 72 [9,10,3,5,7,12,15,1] + CRUSH rule 0 x 73 [5,3,11,1,7,12,15,9] + CRUSH rule 0 x 74 [11,7,9,5,1,15,3,12] + CRUSH rule 0 x 75 [9,7,11,14,12,1,2,5] + CRUSH rule 0 x 76 [6,1,3,5,14,10,12,9] + CRUSH rule 0 x 77 [7,4,2,13,9,1,11,15] + CRUSH rule 0 x 78 [9,3,1,5,6,13,14,11] + CRUSH rule 0 x 79 [13,2,15,5,7,9,11,1] + CRUSH rule 0 x 80 [15,2,6,4,13,10,1] + CRUSH rule 0 x 81 [15,2,1,11,4,6,13] + CRUSH rule 0 x 82 [14,13,5,11,6,2,1,9] + CRUSH rule 0 x 83 [4,15,3,9,10,13,6,1] + CRUSH rule 0 x 84 [10,7,9,15,3,4,1,13] + CRUSH rule 0 x 85 [3,15,9,7,4,11,1,12] + CRUSH rule 0 x 86 [10,9,14,1,13,4,2,7] + CRUSH rule 0 x 87 [15,10,7,12,5,3,9,1] + CRUSH rule 0 x 88 [4,13,3,1,9,15,11,7] + CRUSH rule 0 x 89 [3,9,7,4,1,14,10,12] + CRUSH rule 0 x 90 [4,9,7,12,11,14,2,1] + CRUSH rule 0 x 91 [6,11,9,1,2,4,14,13] + CRUSH rule 0 x 92 [1,5,10,9,13,15,6,2] + CRUSH rule 0 x 93 [9,3,15,13,7,5,1,10] + CRUSH rule 0 x 94 [9,2,12,5,6,11,1,14] + CRUSH rule 0 x 95 [7,15,4,10,9,13,2,1] + CRUSH rule 0 x 96 [2,15,11,7,5,1,12] + CRUSH rule 0 x 97 [4,11,2,13,1,7,9,14] + CRUSH rule 0 x 98 [11,13,9,3,15,1,5,6] + CRUSH rule 0 x 99 [12,4,11,7,3,14,9,1] + CRUSH rule 0 x 100 [9,4,10,15,7,3,13] + CRUSH rule 0 x 101 [15,7,1,9,10,5,2,12] + CRUSH rule 0 x 102 [3,11,14,6,13,4,9,1] + CRUSH rule 0 x 103 [13,11,6,14,4,3,1] + CRUSH rule 0 x 104 [14,6,3,5,9,1,10,13] + CRUSH rule 0 x 105 [14,10,1,9,3,5,6,13] + CRUSH rule 0 x 106 [6,5,13,2,14,11,1,9] + CRUSH rule 0 x 107 [3,1,10,14,13,5,9,6] + CRUSH rule 0 x 108 [5,10,7,2,15,9,12,1] + CRUSH rule 0 x 109 [9,1,13,7,15,5,11,3] + CRUSH rule 0 x 110 [5,1,11,3,7,14,13,9] + CRUSH rule 0 x 111 [10,1,9,7,5,2,13,14] + CRUSH rule 0 x 112 [1,10,4,14,2,12,6,9] + CRUSH rule 0 x 113 [6,10,13,9,1,5,2,14] + CRUSH rule 0 x 114 [5,13,6,2,1,14,11] + CRUSH rule 0 x 115 [10,13,14,3,9,1,6,5] + CRUSH rule 0 x 116 [1,14,13,2,11,5,7] + CRUSH rule 0 x 117 [5,6,1,12,15,9,11,3] + CRUSH rule 0 x 118 [10,4,13,15,9,3,1,6] + CRUSH rule 0 x 119 [14,12,11,4,6,9,3,1] + CRUSH rule 0 x 120 [11,3,14,13,4,7] + CRUSH rule 0 x 121 [9,5,1,11,7,3,15,12] + CRUSH rule 0 x 122 [4,3,14,1,11,13,7] + CRUSH rule 0 x 123 [3,10,5,6,9,1,12,15] + CRUSH rule 0 x 124 [12,2,1,5,14,7,11,9] + CRUSH rule 0 x 125 [9,12,15,1,6,5,3,10] + CRUSH rule 0 x 126 [7,15,10,9,2,12,5,1] + CRUSH rule 0 x 127 [4,14,9,13,1,3,7,10] + CRUSH rule 0 x 128 [3,12,1,10,4,9,7,14] + CRUSH rule 0 x 129 [11,13,14,2,9,4,6,1] + CRUSH rule 0 x 130 [3,13,5,14,10,1,9,6] + CRUSH rule 0 x 131 [12,1,6,15,4,2,11,9] + CRUSH rule 0 x 132 [11,15,13,9,2,5,7] + CRUSH rule 0 x 133 [3,6,9,11,15,12,5] + CRUSH rule 0 x 134 [12,5,6,15,3,9,10,1] + CRUSH rule 0 x 135 [3,14,12,4,6,11,9] + CRUSH rule 0 x 136 [15,6,9,4,10,3,12] + CRUSH rule 0 x 137 [14,3,6,11,1,9,4,13] + CRUSH rule 0 x 138 [13,15,4,10,2,7,1] + CRUSH rule 0 x 139 [11,2,13,9,1,15,7,5] + CRUSH rule 0 x 140 [11,4,12,15,2,6,9,1] + CRUSH rule 0 x 141 [6,12,15,11,3,5,1] + CRUSH rule 0 x 142 [3,14,7,9,11,1,4,13] + CRUSH rule 0 x 143 [9,6,4,2,14,10,12] + CRUSH rule 0 x 144 [13,7,11,2,14,4,1,9] + CRUSH rule 0 x 145 [12,2,6,10,9,4,14,1] + CRUSH rule 0 x 146 [1,5,9,2,6,13,14,10] + CRUSH rule 0 x 147 [1,4,9,11,2,7,15,12] + CRUSH rule 0 x 148 [12,7,9,2,14,11,1,4] + CRUSH rule 0 x 149 [2,5,9,12,11,1,7,14] + CRUSH rule 0 x 150 [1,15,2,10,7,9,5,12] + CRUSH rule 0 x 151 [2,9,14,7,1,10,5,13] + CRUSH rule 0 x 152 [5,9,2,6,10,13,14] + CRUSH rule 0 x 153 [6,9,4,15,2,1,10,12] + CRUSH rule 0 x 154 [3,11,7,1,4,12,15,9] + CRUSH rule 0 x 155 [14,12,7,3,5,1,9,11] + CRUSH rule 0 x 156 [7,13,3,10,15,5,1] + CRUSH rule 0 x 157 [15,1,6,4,3,10,9,13] + CRUSH rule 0 x 158 [15,1,10,6,12,2,4] + CRUSH rule 0 x 159 [4,14,3,12,10,6,1,9] + CRUSH rule 0 x 160 [5,7,3,14,11,1,12] + CRUSH rule 0 x 161 [1,2,11,4,6,13,14] + CRUSH rule 0 x 162 [10,6,1,12,2,4,14,9] + CRUSH rule 0 x 163 [15,1,10,2,6,4,13,9] + CRUSH rule 0 x 164 [9,14,10,7,12,2,5,1] + CRUSH rule 0 x 165 [11,7,2,13,9,15,1,5] + CRUSH rule 0 x 166 [1,2,12,14,4,11,7,9] + CRUSH rule 0 x 167 [9,7,3,4,11,13,15,1] + CRUSH rule 0 x 168 [13,2,4,1,6,15,10,9] + CRUSH rule 0 x 169 [1,4,9,14,13,10,2,7] + CRUSH rule 0 x 170 [1,15,7,9,12,10,3,5] + CRUSH rule 0 x 171 [9,2,10,7,1,5,15,12] + CRUSH rule 0 x 172 [14,4,10,12,9,3,6] + CRUSH rule 0 x 173 [5,10,12,15,6,1,2,9] + CRUSH rule 0 x 174 [15,6,4,12,1,11,9,2] + CRUSH rule 0 x 175 [5,7,9,3,10,1,14,13] + CRUSH rule 0 x 176 [9,6,3,14,13,10,4] + CRUSH rule 0 x 177 [2,9,10,13,4,1,14,7] + CRUSH rule 0 x 178 [12,11,7,14,3,4] + CRUSH rule 0 x 179 [2,10,13,9,5,1,7,14] + CRUSH rule 0 x 180 [3,11,5,15,7,12] + CRUSH rule 0 x 181 [9,12,6,5,1,10,14,2] + CRUSH rule 0 x 182 [5,13,11,2,1,6,14] + CRUSH rule 0 x 183 [5,7,10,13,3,9,14,1] + CRUSH rule 0 x 184 [2,5,11,12,7,1,9,15] + CRUSH rule 0 x 185 [13,5,7,11,2,14] + CRUSH rule 0 x 186 [6,14,13,5,10,1,3,9] + CRUSH rule 0 x 187 [1,4,11,13,6,14,9,3] + CRUSH rule 0 x 188 [9,13,5,14,10,6,2] + CRUSH rule 0 x 189 [6,12,4,9,2,1,11,15] + CRUSH rule 0 x 190 [9,13,15,10,3,1,5,6] + CRUSH rule 0 x 191 [7,11,4,1,15,12,9,2] + CRUSH rule 0 x 192 [2,11,5,15,6,1,13] + CRUSH rule 0 x 193 [3,13,6,10,4,1,9,14] + CRUSH rule 0 x 194 [3,13,4,14,6,9,1,11] + CRUSH rule 0 x 195 [5,7,10,12,1,3,15,9] + CRUSH rule 0 x 196 [4,15,1,10,9,2,13,7] + CRUSH rule 0 x 197 [14,10,13,4,6,3,1,9] + CRUSH rule 0 x 198 [2,5,6,15,9,13,10] + CRUSH rule 0 x 199 [2,10,4,15,1,9,6,12] + CRUSH rule 0 x 200 [7,14,11,4,1,3,13] + CRUSH rule 0 x 201 [9,14,1,7,4,3,10,13] + CRUSH rule 0 x 202 [14,11,7,3,5,1,12] + CRUSH rule 0 x 203 [12,5,7,15,1,2,10,9] + CRUSH rule 0 x 204 [6,11,3,12,14,1,9,4] + CRUSH rule 0 x 205 [15,4,6,10,13,9,2,1] + CRUSH rule 0 x 206 [13,11,2,15,7,1,5] + CRUSH rule 0 x 207 [2,11,7,4,14,1,12,9] + CRUSH rule 0 x 208 [13,1,6,14,9,11,3,5] + CRUSH rule 0 x 209 [6,15,13,1,11,4,9,2] + CRUSH rule 0 x 210 [13,11,2,7,5,14,9] + CRUSH rule 0 x 211 [2,14,1,13,11,7,9,5] + CRUSH rule 0 x 212 [10,1,12,15,5,6,2,9] + CRUSH rule 0 x 213 [3,9,6,5,15,13,1,11] + CRUSH rule 0 x 214 [7,15,4,1,10,2,13,9] + CRUSH rule 0 x 215 [6,1,4,13,3,11,14] + CRUSH rule 0 x 216 [12,9,6,2,1,11,5,15] + CRUSH rule 0 x 217 [12,11,1,14,2,4,7] + CRUSH rule 0 x 218 [12,10,15,6,1,4,9,2] + CRUSH rule 0 x 219 [3,11,14,6,4,1,13] + CRUSH rule 0 x 220 [14,4,3,12,10,9,6] + CRUSH rule 0 x 221 [15,5,2,6,12,11,9] + CRUSH rule 0 x 222 [10,4,3,15,7,12,1] + CRUSH rule 0 x 223 [9,7,11,1,4,14,13,3] + CRUSH rule 0 x 224 [1,7,10,2,12,9,14,5] + CRUSH rule 0 x 225 [10,5,2,6,1,13,9,15] + CRUSH rule 0 x 226 [4,1,9,3,13,10,15,7] + CRUSH rule 0 x 227 [7,2,12,15,5,11] + CRUSH rule 0 x 228 [2,15,11,1,6,13,9,4] + CRUSH rule 0 x 229 [9,3,7,14,1,12,4,10] + CRUSH rule 0 x 230 [10,5,7,2,15,1,13] + CRUSH rule 0 x 231 [2,7,5,13,9,15,10] + CRUSH rule 0 x 232 [10,5,13,1,9,2,7,14] + CRUSH rule 0 x 233 [6,12,11,4,9,14,1,3] + CRUSH rule 0 x 234 [10,1,2,12,5,9,15,7] + CRUSH rule 0 x 235 [13,14,7,10,1,9,5,3] + CRUSH rule 0 x 236 [2,15,9,12,1,7,4,10] + CRUSH rule 0 x 237 [3,12,9,10,4,7,15] + CRUSH rule 0 x 238 [2,10,4,15,6,12,9,1] + CRUSH rule 0 x 239 [4,15,10,7,9,13,3,1] + CRUSH rule 0 x 240 [15,5,13,7,2,9,10] + CRUSH rule 0 x 241 [7,9,15,12,1,5,2,10] + CRUSH rule 0 x 242 [14,2,6,9,10,12,5] + CRUSH rule 0 x 243 [2,11,5,1,15,6,9,13] + CRUSH rule 0 x 244 [13,9,15,3,11,7,5] + CRUSH rule 0 x 245 [12,9,15,3,1,5,10,7] + CRUSH rule 0 x 246 [15,3,5,11,7,1,12,9] + CRUSH rule 0 x 247 [6,4,9,12,1,2,10,14] + CRUSH rule 0 x 248 [5,13,7,11,9,15,3,1] + CRUSH rule 0 x 249 [10,14,7,3,9,13,1,4] + CRUSH rule 0 x 250 [12,15,1,10,5,6,3,9] + CRUSH rule 0 x 251 [13,2,15,5,6,1,9,10] + CRUSH rule 0 x 252 [7,5,13,9,3,10,14,1] + CRUSH rule 0 x 253 [3,13,15,10,7,4] + CRUSH rule 0 x 254 [2,9,13,14,4,6,10] + CRUSH rule 0 x 255 [1,9,13,2,6,10,4,15] + CRUSH rule 0 x 256 [6,9,13,1,3,14,5,10] + CRUSH rule 0 x 257 [15,12,3,9,6,4,11] + CRUSH rule 0 x 258 [12,5,6,10,2,1,14,9] + CRUSH rule 0 x 259 [9,10,4,3,14,13,1,7] + CRUSH rule 0 x 260 [10,12,6,9,3,15,1,4] + CRUSH rule 0 x 261 [13,7,2,1,15,5,11,9] + CRUSH rule 0 x 262 [15,3,12,7,4,9,1,11] + CRUSH rule 0 x 263 [12,6,10,9,5,15,3,1] + CRUSH rule 0 x 264 [13,14,11,3,1,4,7,9] + CRUSH rule 0 x 265 [12,10,14,5,7,1,9,3] + CRUSH rule 0 x 266 [14,7,11,1,2,9,4,12] + CRUSH rule 0 x 267 [12,11,6,5,1,2,15] + CRUSH rule 0 x 268 [4,1,15,12,6,11,3,9] + CRUSH rule 0 x 269 [11,1,15,5,13,9,7,2] + CRUSH rule 0 x 270 [7,11,12,3,1,14,9,4] + CRUSH rule 0 x 271 [4,7,3,13,15,10,9,1] + CRUSH rule 0 x 272 [15,5,13,10,6,2] + CRUSH rule 0 x 273 [2,10,7,12,1,15,5] + CRUSH rule 0 x 274 [10,2,5,6,13,9,15,1] + CRUSH rule 0 x 275 [10,3,4,7,14,13] + CRUSH rule 0 x 276 [5,12,9,2,11,7,15,1] + CRUSH rule 0 x 277 [14,3,13,4,1,9,11,7] + CRUSH rule 0 x 278 [5,6,14,3,1,11,13,9] + CRUSH rule 0 x 279 [6,10,13,3,9,4,15] + CRUSH rule 0 x 280 [7,3,14,9,1,11,4,13] + CRUSH rule 0 x 281 [5,11,14,7,9,13,2,1] + CRUSH rule 0 x 282 [2,1,13,14,9,7,5,10] + CRUSH rule 0 x 283 [4,1,12,3,10,7,15] + CRUSH rule 0 x 284 [5,11,7,15,3,13,1,9] + CRUSH rule 0 x 285 [15,5,3,1,6,13,11,9] + CRUSH rule 0 x 286 [10,4,3,6,12,15,1] + CRUSH rule 0 x 287 [12,4,9,1,3,11,15,7] + CRUSH rule 0 x 288 [4,12,10,7,1,3,14,9] + CRUSH rule 0 x 289 [2,5,14,9,13,6,10] + CRUSH rule 0 x 290 [12,2,5,6,15,9,1,10] + CRUSH rule 0 x 291 [7,11,1,14,5,9,2,12] + CRUSH rule 0 x 292 [4,10,6,3,14,9,12,1] + CRUSH rule 0 x 293 [6,5,11,1,2,14,12] + CRUSH rule 0 x 294 [9,12,3,14,6,11,5,1] + CRUSH rule 0 x 295 [6,10,3,14,9,4,13] + CRUSH rule 0 x 296 [3,1,13,7,14,9,10,4] + CRUSH rule 0 x 297 [6,13,4,14,10,1,2,9] + CRUSH rule 0 x 298 [14,9,13,1,4,2,7,10] + CRUSH rule 0 x 299 [14,12,11,6,4,2,1,9] + CRUSH rule 0 x 300 [15,7,10,5,1,3,13,9] + CRUSH rule 0 x 301 [9,11,7,1,13,14,4,2] + CRUSH rule 0 x 302 [9,7,1,13,5,10,3,15] + CRUSH rule 0 x 303 [4,13,3,7,10,15,1] + CRUSH rule 0 x 304 [6,9,2,11,15,13,4] + CRUSH rule 0 x 305 [13,7,5,11,2,15,9] + CRUSH rule 0 x 306 [10,12,4,6,9,2,15,1] + CRUSH rule 0 x 307 [11,12,15,5,6,2,1,9] + CRUSH rule 0 x 308 [12,14,10,9,1,2,5,7] + CRUSH rule 0 x 309 [9,3,12,5,11,15,7] + CRUSH rule 0 x 310 [3,1,5,10,14,9,7,12] + CRUSH rule 0 x 311 [3,9,7,1,14,13,10,5] + CRUSH rule 0 x 312 [15,13,9,7,5,10,2] + CRUSH rule 0 x 313 [9,15,3,7,5,13,1,11] + CRUSH rule 0 x 314 [2,15,9,5,6,12,1,11] + CRUSH rule 0 x 315 [15,2,13,1,11,9,6,4] + CRUSH rule 0 x 316 [4,9,11,2,12,14,6] + CRUSH rule 0 x 317 [1,5,3,13,15,7,10] + CRUSH rule 0 x 318 [4,1,15,11,9,13,6,2] + CRUSH rule 0 x 319 [2,15,4,1,11,9,7,12] + CRUSH rule 0 x 320 [5,7,13,9,11,2,1,15] + CRUSH rule 0 x 321 [1,6,11,15,5,3,13] + CRUSH rule 0 x 322 [13,7,5,3,14,11,1] + CRUSH rule 0 x 323 [7,4,10,1,2,13,14] + CRUSH rule 0 x 324 [5,6,10,15,2,13] + CRUSH rule 0 x 325 [9,10,14,5,1,6,2,13] + CRUSH rule 0 x 326 [11,7,13,4,2,15,1] + CRUSH rule 0 x 327 [12,5,10,14,3,7,9] + CRUSH rule 0 x 328 [5,2,6,14,1,11,12] + CRUSH rule 0 x 329 [2,6,15,5,9,10,13,1] + CRUSH rule 0 x 330 [3,9,11,13,1,6,5,14] + CRUSH rule 0 x 331 [12,14,6,3,1,4,10,9] + CRUSH rule 0 x 332 [10,12,6,15,9,2,5] + CRUSH rule 0 x 333 [6,5,3,12,14,10,9,1] + CRUSH rule 0 x 334 [4,9,2,12,7,11,15,1] + CRUSH rule 0 x 335 [11,7,1,5,13,2,9,15] + CRUSH rule 0 x 336 [6,14,13,2,5,9,11] + CRUSH rule 0 x 337 [15,11,3,7,12,5] + CRUSH rule 0 x 338 [10,5,3,6,15,1,9,13] + CRUSH rule 0 x 339 [11,14,13,5,3,7,1] + CRUSH rule 0 x 340 [11,6,12,4,9,3,14,1] + CRUSH rule 0 x 341 [7,5,2,10,14,9,1,12] + CRUSH rule 0 x 342 [12,14,1,9,2,11,4,7] + CRUSH rule 0 x 343 [12,14,9,6,10,2,4,1] + CRUSH rule 0 x 344 [9,11,5,2,14,13,1,7] + CRUSH rule 0 x 345 [14,2,11,9,6,12,4] + CRUSH rule 0 x 346 [5,3,14,10,7,1,13] + CRUSH rule 0 x 347 [10,2,12,6,9,1,14,5] + CRUSH rule 0 x 348 [7,9,10,1,14,13,3,4] + CRUSH rule 0 x 349 [9,6,10,12,1,5,14] + CRUSH rule 0 x 350 [13,9,15,4,10,7,2,1] + CRUSH rule 0 x 351 [13,5,15,3,1,6,11] + CRUSH rule 0 x 352 [1,12,11,9,4,7,3,15] + CRUSH rule 0 x 353 [10,14,12,2,9,1,4,6] + CRUSH rule 0 x 354 [6,3,15,10,9,4,13] + CRUSH rule 0 x 355 [13,14,6,10,2,5,1,9] + CRUSH rule 0 x 356 [15,13,2,9,6,5,1,11] + CRUSH rule 0 x 357 [4,11,1,13,3,14,6,9] + CRUSH rule 0 x 358 [12,7,2,9,1,14,10,4] + CRUSH rule 0 x 359 [5,15,7,11,3,13] + CRUSH rule 0 x 360 [13,10,1,2,6,14,5] + CRUSH rule 0 x 361 [5,3,13,6,1,14,11,9] + CRUSH rule 0 x 362 [2,9,11,13,1,6,5,15] + CRUSH rule 0 x 363 [7,12,3,9,15,4,1,10] + CRUSH rule 0 x 364 [2,12,6,9,5,10,15] + CRUSH rule 0 x 365 [13,5,11,15,6,2,9] + CRUSH rule 0 x 366 [12,7,3,14,5,10,9] + CRUSH rule 0 x 367 [7,13,3,1,5,11,15,9] + CRUSH rule 0 x 368 [7,9,10,15,3,4,13] + CRUSH rule 0 x 369 [7,5,3,13,14,9,11,1] + CRUSH rule 0 x 370 [4,7,14,1,2,9,11,12] + CRUSH rule 0 x 371 [1,7,12,3,4,15,10,9] + CRUSH rule 0 x 372 [10,4,3,14,6,1,12,9] + CRUSH rule 0 x 373 [15,5,2,6,13,1,9,10] + CRUSH rule 0 x 374 [3,15,12,5,1,6,10,9] + CRUSH rule 0 x 375 [5,2,14,1,6,13,11,9] + CRUSH rule 0 x 376 [5,14,10,13,3,6,1] + CRUSH rule 0 x 377 [1,15,2,4,9,11,12,6] + CRUSH rule 0 x 378 [9,12,2,15,1,5,11,6] + CRUSH rule 0 x 379 [11,2,15,5,7,9,13,1] + CRUSH rule 0 x 380 [6,1,12,11,2,9,5,14] + CRUSH rule 0 x 381 [15,13,7,5,10,2,1,9] + CRUSH rule 0 x 382 [14,3,1,4,13,7,10] + CRUSH rule 0 x 383 [3,6,11,4,13,15,1] + CRUSH rule 0 x 384 [4,13,6,3,15,11,9] + CRUSH rule 0 x 385 [4,6,15,3,10,9,1,13] + CRUSH rule 0 x 386 [14,3,11,13,5,6,9,1] + CRUSH rule 0 x 387 [1,11,5,7,9,2,14,12] + CRUSH rule 0 x 388 [2,6,11,9,15,4,12] + CRUSH rule 0 x 389 [12,7,2,4,15,10,1] + CRUSH rule 0 x 390 [2,11,13,7,5,9,15] + CRUSH rule 0 x 391 [3,4,9,13,7,10,1,14] + CRUSH rule 0 x 392 [11,5,14,7,1,9,2,12] + CRUSH rule 0 x 393 [2,14,5,9,7,13,11] + CRUSH rule 0 x 394 [4,9,3,15,13,6,1,11] + CRUSH rule 0 x 395 [10,13,5,15,6,9,3,1] + CRUSH rule 0 x 396 [2,12,15,9,4,6,11] + CRUSH rule 0 x 397 [1,14,9,4,12,10,3,7] + CRUSH rule 0 x 398 [9,2,1,5,12,6,11,15] + CRUSH rule 0 x 399 [5,9,14,3,1,10,13,7] + CRUSH rule 0 x 400 [10,6,2,4,15,12,1,9] + CRUSH rule 0 x 401 [6,9,11,12,4,3,15,1] + CRUSH rule 0 x 402 [4,7,9,2,13,1,15,11] + CRUSH rule 0 x 403 [7,15,13,3,5,9,10] + CRUSH rule 0 x 404 [14,12,7,9,2,1,5,11] + CRUSH rule 0 x 405 [9,15,11,2,4,7,13,1] + CRUSH rule 0 x 406 [12,14,9,2,7,10,4,1] + CRUSH rule 0 x 407 [9,5,12,10,15,6,3] + CRUSH rule 0 x 408 [7,1,5,2,10,15,13,9] + CRUSH rule 0 x 409 [11,2,4,13,1,15,7,9] + CRUSH rule 0 x 410 [6,4,14,2,12,9,10,1] + CRUSH rule 0 x 411 [13,11,15,6,4,1,9,2] + CRUSH rule 0 x 412 [5,9,6,11,14,2,12] + CRUSH rule 0 x 413 [13,5,3,11,6,9,1,14] + CRUSH rule 0 x 414 [3,11,9,13,4,1,6,15] + CRUSH rule 0 x 415 [6,10,14,5,1,13,3,9] + CRUSH rule 0 x 416 [13,1,4,7,2,9,14,11] + CRUSH rule 0 x 417 [4,12,1,15,2,11,9,6] + CRUSH rule 0 x 418 [14,5,10,2,6,9,13] + CRUSH rule 0 x 419 [5,14,10,9,2,12,6,1] + CRUSH rule 0 x 420 [2,4,9,11,6,14,13,1] + CRUSH rule 0 x 421 [15,4,10,3,9,12,7] + CRUSH rule 0 x 422 [4,11,2,7,13,9,15] + CRUSH rule 0 x 423 [3,15,12,6,5,1,9,10] + CRUSH rule 0 x 424 [6,10,12,2,5,1,14,9] + CRUSH rule 0 x 425 [11,15,2,13,5,7,9,1] + CRUSH rule 0 x 426 [12,4,7,1,9,10,14,2] + CRUSH rule 0 x 427 [14,10,3,1,9,7,5,13] + CRUSH rule 0 x 428 [12,7,9,4,2,1,14,10] + CRUSH rule 0 x 429 [3,4,9,7,11,12,1,14] + CRUSH rule 0 x 430 [3,5,10,13,1,15,6] + CRUSH rule 0 x 431 [9,3,7,1,12,5,14,11] + CRUSH rule 0 x 432 [4,1,12,7,15,2,10,9] + CRUSH rule 0 x 433 [4,11,12,15,7,3] + CRUSH rule 0 x 434 [2,14,9,1,5,11,7,13] + CRUSH rule 0 x 435 [13,11,5,6,9,2,15] + CRUSH rule 0 x 436 [9,15,10,2,4,1,12,7] + CRUSH rule 0 x 437 [9,6,3,14,10,12,5,1] + CRUSH rule 0 x 438 [7,2,13,4,11,1,9,14] + CRUSH rule 0 x 439 [7,14,4,3,12,10] + CRUSH rule 0 x 440 [14,11,9,2,7,12,1,5] + CRUSH rule 0 x 441 [2,4,11,9,13,6,1,14] + CRUSH rule 0 x 442 [10,13,9,7,15,1,4,2] + CRUSH rule 0 x 443 [12,15,10,9,2,1,6,4] + CRUSH rule 0 x 444 [4,13,7,14,3,1,9,11] + CRUSH rule 0 x 445 [4,2,15,7,1,9,11,12] + CRUSH rule 0 x 446 [12,10,6,9,4,1,15,3] + CRUSH rule 0 x 447 [15,7,13,1,4,9,3,11] + CRUSH rule 0 x 448 [5,2,13,7,15,10] + CRUSH rule 0 x 449 [14,5,3,12,10,9,6] + CRUSH rule 0 x 450 [2,4,6,9,15,1,13,10] + CRUSH rule 0 x 451 [6,14,11,3,9,1,12,5] + CRUSH rule 0 x 452 [14,9,10,4,2,13,7] + CRUSH rule 0 x 453 [5,15,13,2,6,9,11] + CRUSH rule 0 x 454 [10,4,2,6,15,12,9,1] + CRUSH rule 0 x 455 [6,13,2,4,10,1,15] + CRUSH rule 0 x 456 [5,7,13,1,11,3,9,15] + CRUSH rule 0 x 457 [9,1,5,7,11,13,15,2] + CRUSH rule 0 x 458 [9,11,15,4,7,2,12,1] + CRUSH rule 0 x 459 [13,15,11,1,5,2,6] + CRUSH rule 0 x 460 [5,12,10,15,7,3,9] + CRUSH rule 0 x 461 [4,3,9,13,15,6,10] + CRUSH rule 0 x 462 [4,7,12,14,11,1,3,9] + CRUSH rule 0 x 463 [4,12,14,11,2,7,1,9] + CRUSH rule 0 x 464 [4,2,15,10,1,9,13,7] + CRUSH rule 0 x 465 [5,10,9,7,13,1,3,14] + CRUSH rule 0 x 466 [13,5,2,15,9,11,6,1] + CRUSH rule 0 x 467 [13,6,14,3,9,1,11,5] + CRUSH rule 0 x 468 [10,7,12,14,4,1,9,2] + CRUSH rule 0 x 469 [4,9,6,14,12,11,3,1] + CRUSH rule 0 x 470 [3,9,12,15,5,6,10] + CRUSH rule 0 x 471 [6,1,5,14,13,10,9,3] + CRUSH rule 0 x 472 [2,14,7,5,13,1,11,9] + CRUSH rule 0 x 473 [15,10,6,9,4,12,2] + CRUSH rule 0 x 474 [15,10,4,12,6,9,2,1] + CRUSH rule 0 x 475 [10,5,12,9,14,3,6,1] + CRUSH rule 0 x 476 [3,6,10,12,1,15,9,4] + CRUSH rule 0 x 477 [6,13,5,15,11,9,2,1] + CRUSH rule 0 x 478 [4,15,1,3,7,12,10,9] + CRUSH rule 0 x 479 [13,11,1,6,14,5,9,3] + CRUSH rule 0 x 480 [1,13,6,4,9,14,11,3] + CRUSH rule 0 x 481 [15,12,7,9,1,3,10,4] + CRUSH rule 0 x 482 [2,12,9,1,7,11,14,4] + CRUSH rule 0 x 483 [10,1,4,15,9,7,13,2] + CRUSH rule 0 x 484 [1,4,10,13,7,14,2,9] + CRUSH rule 0 x 485 [9,4,3,1,14,12,7,10] + CRUSH rule 0 x 486 [3,10,15,9,7,13,4,1] + CRUSH rule 0 x 487 [12,11,4,14,7,2,1] + CRUSH rule 0 x 488 [14,4,1,9,2,6,10,12] + CRUSH rule 0 x 489 [11,4,2,13,15,7] + CRUSH rule 0 x 490 [4,9,1,3,13,15,6,11] + CRUSH rule 0 x 491 [1,12,5,2,14,11,6] + CRUSH rule 0 x 492 [5,7,11,3,14,9,1,13] + CRUSH rule 0 x 493 [12,1,4,15,3,11,9,6] + CRUSH rule 0 x 494 [1,7,13,4,15,9,10,3] + CRUSH rule 0 x 495 [3,15,7,1,9,5,12,11] + CRUSH rule 0 x 496 [5,3,7,13,9,14,10] + CRUSH rule 0 x 497 [13,10,3,6,5,14,1] + CRUSH rule 0 x 498 [10,6,1,5,9,12,3,15] + CRUSH rule 0 x 499 [14,3,12,5,1,11,9,7] + CRUSH rule 0 x 500 [15,9,6,12,11,2,1,5] + CRUSH rule 0 x 501 [10,13,1,9,3,14,5,7] + CRUSH rule 0 x 502 [5,1,14,11,7,12,9,2] + CRUSH rule 0 x 503 [15,10,7,9,1,12,4,2] + CRUSH rule 0 x 504 [13,2,7,1,14,11,5] + CRUSH rule 0 x 505 [12,7,5,2,14,10,9] + CRUSH rule 0 x 506 [11,7,9,14,12,1,2,5] + CRUSH rule 0 x 507 [4,14,13,3,9,7,1,10] + CRUSH rule 0 x 508 [12,1,4,9,2,11,15,7] + CRUSH rule 0 x 509 [4,2,6,9,14,1,10,13] + CRUSH rule 0 x 510 [5,3,1,12,11,14,9,7] + CRUSH rule 0 x 511 [2,12,10,6,14,5] + CRUSH rule 0 x 512 [15,11,3,5,7,1,13] + CRUSH rule 0 x 513 [4,9,11,3,13,7,1,14] + CRUSH rule 0 x 514 [11,9,3,4,12,15,6,1] + CRUSH rule 0 x 515 [12,14,6,5,3,9,1,10] + CRUSH rule 0 x 516 [14,11,1,12,3,7,4,9] + CRUSH rule 0 x 517 [11,5,6,13,9,3,14] + CRUSH rule 0 x 518 [3,5,7,12,15,11,9,1] + CRUSH rule 0 x 519 [12,14,2,1,4,6,9,10] + CRUSH rule 0 x 520 [12,4,2,10,6,15,9] + CRUSH rule 0 x 521 [11,5,9,6,15,3,13] + CRUSH rule 0 x 522 [4,12,11,1,15,3,9,6] + CRUSH rule 0 x 523 [3,1,5,9,15,10,13,7] + CRUSH rule 0 x 524 [15,9,3,11,13,7,4,1] + CRUSH rule 0 x 525 [3,15,11,6,9,12,4] + CRUSH rule 0 x 526 [10,2,5,13,6,15,1,9] + CRUSH rule 0 x 527 [3,13,4,1,9,10,14,7] + CRUSH rule 0 x 528 [12,7,15,10,2,5,9] + CRUSH rule 0 x 529 [6,4,10,12,2,9,14] + CRUSH rule 0 x 530 [11,9,12,7,5,1,3,15] + CRUSH rule 0 x 531 [9,15,4,7,2,13,1,11] + CRUSH rule 0 x 532 [5,3,13,7,9,14,1,10] + CRUSH rule 0 x 533 [12,15,1,2,7,5,10] + CRUSH rule 0 x 534 [11,9,3,7,15,4,1,12] + CRUSH rule 0 x 535 [11,1,3,5,14,9,12,7] + CRUSH rule 0 x 536 [9,1,14,13,4,6,2,11] + CRUSH rule 0 x 537 [15,5,13,2,7,11] + CRUSH rule 0 x 538 [13,5,11,2,6,15,9] + CRUSH rule 0 x 539 [10,12,6,14,1,2,9,5] + CRUSH rule 0 x 540 [12,15,7,3,9,11,1,4] + CRUSH rule 0 x 541 [2,1,6,11,14,13,4] + CRUSH rule 0 x 542 [3,9,15,5,11,12,7,1] + CRUSH rule 0 x 543 [4,10,9,3,6,13,14] + CRUSH rule 0 x 544 [3,15,9,11,7,4,12,1] + CRUSH rule 0 x 545 [14,10,7,12,4,9,1,3] + CRUSH rule 0 x 546 [5,15,13,7,1,10,9,2] + CRUSH rule 0 x 547 [5,13,7,9,3,14,10] + CRUSH rule 0 x 548 [11,7,12,15,4,2] + CRUSH rule 0 x 549 [14,1,4,9,13,6,3,10] + CRUSH rule 0 x 550 [9,15,3,13,1,6,4,11] + CRUSH rule 0 x 551 [11,2,15,6,13,5,1] + CRUSH rule 0 x 552 [2,11,14,1,9,6,5,12] + CRUSH rule 0 x 553 [11,9,14,6,4,13,3] + CRUSH rule 0 x 554 [11,14,6,4,13,9,3,1] + CRUSH rule 0 x 555 [6,5,10,9,14,2,13,1] + CRUSH rule 0 x 556 [15,6,3,13,11,4,1,9] + CRUSH rule 0 x 557 [12,2,5,14,10,9,6] + CRUSH rule 0 x 558 [12,1,6,15,5,10,3] + CRUSH rule 0 x 559 [2,13,5,10,14,7,1] + CRUSH rule 0 x 560 [4,9,12,6,3,10,1,15] + CRUSH rule 0 x 561 [12,7,1,2,5,15,11,9] + CRUSH rule 0 x 562 [7,13,9,14,2,1,11,4] + CRUSH rule 0 x 563 [15,4,3,10,13,9,7] + CRUSH rule 0 x 564 [2,13,7,1,15,10,4] + CRUSH rule 0 x 565 [3,12,4,1,14,7,11] + CRUSH rule 0 x 566 [6,14,4,2,13,11] + CRUSH rule 0 x 567 [15,4,11,6,3,12] + CRUSH rule 0 x 568 [4,14,1,6,10,13,3,9] + CRUSH rule 0 x 569 [11,3,15,13,5,1,9,7] + CRUSH rule 0 x 570 [1,10,13,4,7,2,9,14] + CRUSH rule 0 x 571 [10,12,14,9,4,2,1,6] + CRUSH rule 0 x 572 [12,14,3,10,6,1,4,9] + CRUSH rule 0 x 573 [7,15,11,2,12,9,4,1] + CRUSH rule 0 x 574 [11,14,13,1,3,7,4,9] + CRUSH rule 0 x 575 [5,13,15,9,6,10,2] + CRUSH rule 0 x 576 [3,15,11,9,1,6,5,13] + CRUSH rule 0 x 577 [13,9,6,15,3,11,4,1] + CRUSH rule 0 x 578 [4,10,1,2,7,13,14,9] + CRUSH rule 0 x 579 [13,1,15,2,10,7,5,9] + CRUSH rule 0 x 580 [3,12,4,1,10,15,7,9] + CRUSH rule 0 x 581 [7,14,12,10,1,2,9,5] + CRUSH rule 0 x 582 [10,5,13,14,1,2,7] + CRUSH rule 0 x 583 [4,15,1,9,10,12,2,6] + CRUSH rule 0 x 584 [10,1,5,13,6,9,2,15] + CRUSH rule 0 x 585 [5,3,6,1,11,14,13,9] + CRUSH rule 0 x 586 [7,10,14,12,9,3,5,1] + CRUSH rule 0 x 587 [11,6,9,4,1,14,13,2] + CRUSH rule 0 x 588 [3,12,7,15,4,9,1,10] + CRUSH rule 0 x 589 [9,7,12,1,10,3,4,15] + CRUSH rule 0 x 590 [12,1,3,9,10,6,4,14] + CRUSH rule 0 x 591 [2,6,14,13,9,11,4] + CRUSH rule 0 x 592 [15,12,9,7,5,2,11,1] + CRUSH rule 0 x 593 [13,14,5,11,9,6,2] + CRUSH rule 0 x 594 [12,14,2,9,7,4,1,11] + CRUSH rule 0 x 595 [12,7,10,3,1,14,9,4] + CRUSH rule 0 x 596 [2,7,12,11,1,5,15,9] + CRUSH rule 0 x 597 [15,1,2,10,7,13,5,9] + CRUSH rule 0 x 598 [11,5,9,14,12,7,3] + CRUSH rule 0 x 599 [13,11,1,5,6,2,15,9] + CRUSH rule 0 x 600 [4,12,3,10,9,7,1,14] + CRUSH rule 0 x 601 [13,5,15,2,1,7,9,10] + CRUSH rule 0 x 602 [3,11,7,1,13,15,5,9] + CRUSH rule 0 x 603 [3,1,4,14,10,9,6,12] + CRUSH rule 0 x 604 [14,2,6,1,11,13,9,4] + CRUSH rule 0 x 605 [2,7,12,5,14,10,1,9] + CRUSH rule 0 x 606 [12,15,1,5,7,9,3,11] + CRUSH rule 0 x 607 [3,9,10,14,7,1,4,12] + CRUSH rule 0 x 608 [13,10,1,7,9,15,5,2] + CRUSH rule 0 x 609 [14,3,7,9,11,12,5] + CRUSH rule 0 x 610 [7,10,5,1,12,2,15] + CRUSH rule 0 x 611 [13,1,5,3,10,7,15,9] + CRUSH rule 0 x 612 [7,1,2,13,9,15,4,11] + CRUSH rule 0 x 613 [10,7,14,9,5,2,13] + CRUSH rule 0 x 614 [9,4,15,3,1,11,6,12] + CRUSH rule 0 x 615 [9,4,11,2,1,12,6,15] + CRUSH rule 0 x 616 [10,14,1,5,3,6,12,9] + CRUSH rule 0 x 617 [15,7,2,11,12,1,9,4] + CRUSH rule 0 x 618 [4,2,10,6,14,9,1,12] + CRUSH rule 0 x 619 [15,4,3,9,6,1,13,11] + CRUSH rule 0 x 620 [3,7,11,14,13,1,5] + CRUSH rule 0 x 621 [3,6,4,14,1,11,13] + CRUSH rule 0 x 622 [10,2,13,5,15,9,1,7] + CRUSH rule 0 x 623 [4,9,14,7,3,13,11] + CRUSH rule 0 x 624 [3,9,15,6,10,1,5,12] + CRUSH rule 0 x 625 [11,7,3,5,13,15,9] + CRUSH rule 0 x 626 [10,12,2,1,9,7,5,14] + CRUSH rule 0 x 627 [1,12,10,14,3,5,9,7] + CRUSH rule 0 x 628 [15,13,11,4,2,1,7,9] + CRUSH rule 0 x 629 [5,6,15,12,1,10,3,9] + CRUSH rule 0 x 630 [1,4,12,9,3,7,15,11] + CRUSH rule 0 x 631 [5,7,1,15,12,11,3,9] + CRUSH rule 0 x 632 [12,3,11,9,6,1,15,5] + CRUSH rule 0 x 633 [14,4,3,7,10,12,9] + CRUSH rule 0 x 634 [6,9,5,3,13,11,14] + CRUSH rule 0 x 635 [6,5,2,15,9,12,11] + CRUSH rule 0 x 636 [13,6,11,3,15,9,1,4] + CRUSH rule 0 x 637 [3,1,10,6,9,12,4,14] + CRUSH rule 0 x 638 [10,15,3,5,13,1,7] + CRUSH rule 0 x 639 [6,9,14,4,3,1,10,13] + CRUSH rule 0 x 640 [9,6,1,11,14,2,4,13] + CRUSH rule 0 x 641 [10,6,5,14,1,9,12,2] + CRUSH rule 0 x 642 [1,15,4,6,2,10,9,12] + CRUSH rule 0 x 643 [3,7,5,1,10,15,13] + CRUSH rule 0 x 644 [15,13,6,9,3,11,5] + CRUSH rule 0 x 645 [14,2,4,9,10,1,7,13] + CRUSH rule 0 x 646 [5,13,14,1,6,9,2,11] + CRUSH rule 0 x 647 [10,1,9,13,6,2,14,5] + CRUSH rule 0 x 648 [6,5,2,14,11,1,12,9] + CRUSH rule 0 x 649 [3,9,13,11,4,14,1,7] + CRUSH rule 0 x 650 [10,9,4,15,12,7,1,2] + CRUSH rule 0 x 651 [3,9,5,7,14,1,13,11] + CRUSH rule 0 x 652 [15,9,4,6,13,1,2,11] + CRUSH rule 0 x 653 [11,14,1,3,6,9,12,5] + CRUSH rule 0 x 654 [13,6,2,10,15,4,1,9] + CRUSH rule 0 x 655 [6,3,4,15,12,11,1] + CRUSH rule 0 x 656 [3,15,1,4,6,12,11] + CRUSH rule 0 x 657 [11,15,3,5,7,13,1,9] + CRUSH rule 0 x 658 [7,2,10,12,1,4,9,14] + CRUSH rule 0 x 659 [2,5,14,6,10,12] + CRUSH rule 0 x 660 [13,14,10,6,4,9,3] + CRUSH rule 0 x 661 [7,15,3,12,11,4,9,1] + CRUSH rule 0 x 662 [15,2,12,5,1,10,9,7] + CRUSH rule 0 x 663 [14,9,13,10,5,3,1,6] + CRUSH rule 0 x 664 [6,10,12,4,9,2,1,15] + CRUSH rule 0 x 665 [2,9,12,1,7,10,4,15] + CRUSH rule 0 x 666 [12,3,6,1,15,9,10,4] + CRUSH rule 0 x 667 [1,9,12,10,2,14,7,4] + CRUSH rule 0 x 668 [9,5,1,2,6,11,13,15] + CRUSH rule 0 x 669 [9,7,14,5,11,13,1,2] + CRUSH rule 0 x 670 [6,10,9,13,1,2,15,4] + CRUSH rule 0 x 671 [6,15,5,10,13,3] + CRUSH rule 0 x 672 [2,9,13,1,4,14,6,10] + CRUSH rule 0 x 673 [7,10,5,9,15,13,2,1] + CRUSH rule 0 x 674 [7,12,10,1,14,9,3,4] + CRUSH rule 0 x 675 [9,5,1,10,6,14,12,2] + CRUSH rule 0 x 676 [10,12,2,1,4,15,7] + CRUSH rule 0 x 677 [2,12,1,4,10,6,15,9] + CRUSH rule 0 x 678 [1,2,4,10,12,14,9,6] + CRUSH rule 0 x 679 [5,6,12,15,9,11,3] + CRUSH rule 0 x 680 [7,11,3,1,15,4,9,12] + CRUSH rule 0 x 681 [6,4,3,11,14,13,1,9] + CRUSH rule 0 x 682 [6,1,11,15,12,2,5,9] + CRUSH rule 0 x 683 [6,13,2,4,9,14,10,1] + CRUSH rule 0 x 684 [9,11,3,7,15,4,13] + CRUSH rule 0 x 685 [5,1,15,7,9,2,10,13] + CRUSH rule 0 x 686 [1,9,11,14,6,13,4,3] + CRUSH rule 0 x 687 [7,13,3,5,11,9,15,1] + CRUSH rule 0 x 688 [11,9,1,14,3,5,7,12] + CRUSH rule 0 x 689 [5,2,9,12,1,14,11,7] + CRUSH rule 0 x 690 [9,7,10,3,13,15,5,1] + CRUSH rule 0 x 691 [11,15,9,5,7,13,2] + CRUSH rule 0 x 692 [15,5,1,2,9,11,12,7] + CRUSH rule 0 x 693 [5,6,12,15,2,10,9,1] + CRUSH rule 0 x 694 [4,7,1,10,12,3,14] + CRUSH rule 0 x 695 [6,13,14,10,9,5,1,3] + CRUSH rule 0 x 696 [1,2,4,14,7,11,13] + CRUSH rule 0 x 697 [13,11,3,6,4,14,9,1] + CRUSH rule 0 x 698 [11,13,4,2,6,1,9,15] + CRUSH rule 0 x 699 [7,14,12,4,2,11] + CRUSH rule 0 x 700 [12,14,11,9,4,6,3,1] + CRUSH rule 0 x 701 [3,13,1,14,4,7,11] + CRUSH rule 0 x 702 [3,12,15,6,5,11,1,9] + CRUSH rule 0 x 703 [15,11,13,3,4,7,1,9] + CRUSH rule 0 x 704 [6,4,2,15,11,1,13,9] + CRUSH rule 0 x 705 [14,6,11,5,1,13,9,3] + CRUSH rule 0 x 706 [1,12,3,6,4,10,15,9] + CRUSH rule 0 x 707 [4,7,14,3,10,9,13] + CRUSH rule 0 x 708 [3,10,5,1,15,9,7,13] + CRUSH rule 0 x 709 [11,12,3,7,5,14,1,9] + CRUSH rule 0 x 710 [14,2,11,9,5,7,12,1] + CRUSH rule 0 x 711 [14,3,9,10,12,5,6,1] + CRUSH rule 0 x 712 [12,3,11,15,9,1,6,4] + CRUSH rule 0 x 713 [11,9,3,15,13,6,4,1] + CRUSH rule 0 x 714 [12,1,9,7,2,15,10,5] + CRUSH rule 0 x 715 [6,1,14,4,11,12,3,9] + CRUSH rule 0 x 716 [11,13,9,14,5,2,1,7] + CRUSH rule 0 x 717 [12,4,10,9,15,1,2,7] + CRUSH rule 0 x 718 [7,15,5,2,11,13] + CRUSH rule 0 x 719 [5,15,13,3,1,7,11] + CRUSH rule 0 x 720 [4,13,10,2,7,9,1,14] + CRUSH rule 0 x 721 [11,3,14,9,1,12,4,6] + CRUSH rule 0 x 722 [2,4,6,1,9,15,13,10] + CRUSH rule 0 x 723 [2,1,12,15,11,7,5,9] + CRUSH rule 0 x 724 [7,1,9,10,5,15,13,2] + CRUSH rule 0 x 725 [11,12,7,15,4,1,2] + CRUSH rule 0 x 726 [7,14,4,3,11,13,9,1] + CRUSH rule 0 x 727 [2,5,1,11,15,7,12] + CRUSH rule 0 x 728 [13,11,4,6,15,2] + CRUSH rule 0 x 729 [15,11,4,6,2,9,1,13] + CRUSH rule 0 x 730 [3,7,1,13,11,15,9,5] + CRUSH rule 0 x 731 [9,1,6,5,2,11,13,15] + CRUSH rule 0 x 732 [1,2,10,13,9,4,7,15] + CRUSH rule 0 x 733 [11,3,5,6,1,9,12,15] + CRUSH rule 0 x 734 [14,3,11,7,12,9,4,1] + CRUSH rule 0 x 735 [6,9,2,10,13,14,5] + CRUSH rule 0 x 736 [3,9,1,11,7,5,13,14] + CRUSH rule 0 x 737 [1,4,2,12,9,10,6,15] + CRUSH rule 0 x 738 [11,15,7,4,9,2,12] + CRUSH rule 0 x 739 [11,12,6,2,4,1,14] + CRUSH rule 0 x 740 [7,9,10,13,1,15,2,5] + CRUSH rule 0 x 741 [12,11,7,15,2,5] + CRUSH rule 0 x 742 [9,7,4,11,12,1,14,3] + CRUSH rule 0 x 743 [5,13,9,15,10,7,3] + CRUSH rule 0 x 744 [6,2,13,1,14,11,4] + CRUSH rule 0 x 745 [3,6,1,4,11,12,14,9] + CRUSH rule 0 x 746 [3,7,9,10,14,5,1,13] + CRUSH rule 0 x 747 [15,11,5,2,13,9,1,7] + CRUSH rule 0 x 748 [6,10,13,2,14,5,9,1] + CRUSH rule 0 x 749 [14,9,10,7,5,1,2,12] + CRUSH rule 0 x 750 [1,14,6,5,11,2,13] + CRUSH rule 0 x 751 [15,1,6,9,5,11,12,3] + CRUSH rule 0 x 752 [13,1,7,3,11,15,9,4] + CRUSH rule 0 x 753 [4,11,1,3,15,7,13] + CRUSH rule 0 x 754 [14,12,11,4,2,1,9,6] + CRUSH rule 0 x 755 [13,6,1,10,4,2,14,9] + CRUSH rule 0 x 756 [3,4,14,6,1,10,13,9] + CRUSH rule 0 x 757 [10,6,1,4,13,15,2] + CRUSH rule 0 x 758 [6,3,4,10,15,13,9,1] + CRUSH rule 0 x 759 [5,7,3,14,11,1,9,13] + CRUSH rule 0 x 760 [1,15,10,12,4,3,9,7] + CRUSH rule 0 x 761 [2,12,1,14,5,7,10] + CRUSH rule 0 x 762 [1,4,10,9,3,7,14,12] + CRUSH rule 0 x 763 [4,13,1,14,7,10,2,9] + CRUSH rule 0 x 764 [1,14,6,13,9,5,2,10] + CRUSH rule 0 x 765 [9,15,2,13,4,1,11,7] + CRUSH rule 0 x 766 [11,2,7,15,9,12,4] + CRUSH rule 0 x 767 [6,11,4,3,12,14] + CRUSH rule 0 x 768 [2,12,15,7,1,11,9,4] + CRUSH rule 0 x 769 [15,1,9,2,11,12,7,4] + CRUSH rule 0 x 770 [15,13,4,6,3,10,1,9] + CRUSH rule 0 x 771 [9,2,12,11,6,14,5,1] + CRUSH rule 0 x 772 [4,3,13,11,14,1,7] + CRUSH rule 0 x 773 [3,7,4,15,1,12,11,9] + CRUSH rule 0 x 774 [12,6,3,15,5,9,10,1] + CRUSH rule 0 x 775 [5,10,14,2,6,1,13] + CRUSH rule 0 x 776 [10,15,3,9,6,13,1,5] + CRUSH rule 0 x 777 [11,13,4,7,1,14,9,2] + CRUSH rule 0 x 778 [13,1,9,11,15,6,3,5] + CRUSH rule 0 x 779 [5,11,1,14,2,9,13,6] + CRUSH rule 0 x 780 [13,9,3,6,4,1,14,10] + CRUSH rule 0 x 781 [5,7,14,3,1,12,11,9] + CRUSH rule 0 x 782 [2,15,9,7,11,13,4,1] + CRUSH rule 0 x 783 [12,7,5,14,9,1,2,10] + CRUSH rule 0 x 784 [14,1,10,13,3,4,7,9] + CRUSH rule 0 x 785 [6,12,1,2,4,9,15,10] + CRUSH rule 0 x 786 [10,5,2,15,1,7,12,9] + CRUSH rule 0 x 787 [1,12,10,2,9,4,14,6] + CRUSH rule 0 x 788 [4,2,9,13,6,15,11] + CRUSH rule 0 x 789 [9,2,14,7,4,12,1,10] + CRUSH rule 0 x 790 [15,2,7,4,1,10,13] + CRUSH rule 0 x 791 [9,4,7,13,14,11,1,3] + CRUSH rule 0 x 792 [6,4,15,10,12,3] + CRUSH rule 0 x 793 [15,9,6,2,13,11,4] + CRUSH rule 0 x 794 [5,12,2,14,9,10,1,6] + CRUSH rule 0 x 795 [6,14,12,4,10,1,2,9] + CRUSH rule 0 x 796 [11,2,12,6,15,4] + CRUSH rule 0 x 797 [14,3,7,1,5,13,11] + CRUSH rule 0 x 798 [5,11,6,13,1,3,15,9] + CRUSH rule 0 x 799 [2,9,14,4,13,6,11] + CRUSH rule 0 x 800 [6,3,4,11,15,13] + CRUSH rule 0 x 801 [2,5,6,13,9,1,10,15] + CRUSH rule 0 x 802 [1,4,12,7,3,9,10,14] + CRUSH rule 0 x 803 [7,2,4,1,11,13,9,14] + CRUSH rule 0 x 804 [5,14,9,7,3,1,12,10] + CRUSH rule 0 x 805 [13,4,3,1,10,15,7] + CRUSH rule 0 x 806 [6,2,13,4,15,1,10] + CRUSH rule 0 x 807 [14,2,7,4,9,12,1,10] + CRUSH rule 0 x 808 [2,15,12,7,9,1,5,10] + CRUSH rule 0 x 809 [1,11,7,12,4,2,15,9] + CRUSH rule 0 x 810 [2,5,9,12,15,1,7,11] + CRUSH rule 0 x 811 [15,6,3,10,1,5,9,12] + CRUSH rule 0 x 812 [7,11,2,14,9,5,12] + CRUSH rule 0 x 813 [4,10,13,14,2,6,9] + CRUSH rule 0 x 814 [13,4,9,3,10,6,15] + CRUSH rule 0 x 815 [15,12,9,4,10,6,1,2] + CRUSH rule 0 x 816 [14,10,13,7,3,9,4,1] + CRUSH rule 0 x 817 [10,7,2,15,13,9,5] + CRUSH rule 0 x 818 [15,2,11,4,1,12,6,9] + CRUSH rule 0 x 819 [5,12,10,6,1,14,3] + CRUSH rule 0 x 820 [3,6,9,12,11,15,4,1] + CRUSH rule 0 x 821 [15,10,9,13,3,4,7,1] + CRUSH rule 0 x 822 [10,13,2,9,7,4,14,1] + CRUSH rule 0 x 823 [2,6,12,10,15,4,1,9] + CRUSH rule 0 x 824 [3,7,9,13,15,5,10] + CRUSH rule 0 x 825 [10,5,14,6,12,9,3] + CRUSH rule 0 x 826 [5,2,11,15,1,12,9,7] + CRUSH rule 0 x 827 [13,5,1,3,7,9,11,14] + CRUSH rule 0 x 828 [12,6,10,5,1,9,2,15] + CRUSH rule 0 x 829 [13,6,15,10,5,3,9] + CRUSH rule 0 x 830 [15,13,2,9,7,11,1,5] + CRUSH rule 0 x 831 [1,4,11,12,6,3,15] + CRUSH rule 0 x 832 [14,11,13,2,9,4,6,1] + CRUSH rule 0 x 833 [9,13,3,11,7,5,15,1] + CRUSH rule 0 x 834 [9,7,5,1,11,2,13,14] + CRUSH rule 0 x 835 [14,3,13,6,4,9,1,10] + CRUSH rule 0 x 836 [3,9,10,13,1,5,14,7] + CRUSH rule 0 x 837 [15,12,11,2,7,9,5] + CRUSH rule 0 x 838 [12,14,9,2,5,7,11] + CRUSH rule 0 x 839 [3,4,6,10,15,1,13,9] + CRUSH rule 0 x 840 [10,15,12,4,7,1,2,9] + CRUSH rule 0 x 841 [3,5,7,12,11,15,1,9] + CRUSH rule 0 x 842 [9,13,2,6,5,14,10,1] + CRUSH rule 0 x 843 [14,7,4,9,3,12,1,10] + CRUSH rule 0 x 844 [7,1,4,15,9,2,11,12] + CRUSH rule 0 x 845 [13,6,1,15,4,2,11] + CRUSH rule 0 x 846 [3,7,15,13,1,9,10,4] + CRUSH rule 0 x 847 [12,15,11,5,2,7,1] + CRUSH rule 0 x 848 [11,13,1,14,5,9,2,7] + CRUSH rule 0 x 849 [3,15,11,9,6,1,13,5] + CRUSH rule 0 x 850 [1,3,10,6,14,4,9,12] + CRUSH rule 0 x 851 [14,4,3,6,11,1,13] + CRUSH rule 0 x 852 [9,12,4,7,15,2,11,1] + CRUSH rule 0 x 853 [13,14,6,11,2,4,9,1] + CRUSH rule 0 x 854 [7,11,12,1,4,15,3] + CRUSH rule 0 x 855 [14,4,12,6,3,1,10] + CRUSH rule 0 x 856 [5,10,7,3,15,9,12,1] + CRUSH rule 0 x 857 [4,3,13,11,9,1,7,14] + CRUSH rule 0 x 858 [5,15,6,3,9,12,1,10] + CRUSH rule 0 x 859 [5,15,6,2,1,11,12,9] + CRUSH rule 0 x 860 [11,14,1,12,6,9,2,4] + CRUSH rule 0 x 861 [13,7,4,10,1,14,3,9] + CRUSH rule 0 x 862 [5,10,9,7,3,12,1,15] + CRUSH rule 0 x 863 [11,6,3,9,4,12,15] + CRUSH rule 0 x 864 [6,13,4,2,10,15,1,9] + CRUSH rule 0 x 865 [4,1,14,11,6,9,3,13] + CRUSH rule 0 x 866 [2,13,4,15,9,6,11] + CRUSH rule 0 x 867 [12,2,9,10,4,14,6] + CRUSH rule 0 x 868 [14,11,7,2,1,4,9,12] + CRUSH rule 0 x 869 [10,13,7,14,3,5,1] + CRUSH rule 0 x 870 [14,9,11,4,3,12,6,1] + CRUSH rule 0 x 871 [6,2,1,4,15,13,11,9] + CRUSH rule 0 x 872 [6,1,15,3,10,12,5] + CRUSH rule 0 x 873 [2,5,12,10,1,9,15,7] + CRUSH rule 0 x 874 [12,4,7,2,15,10,1] + CRUSH rule 0 x 875 [10,6,14,1,12,5,9,3] + CRUSH rule 0 x 876 [14,7,13,3,9,1,11,4] + CRUSH rule 0 x 877 [15,11,13,9,5,1,6,3] + CRUSH rule 0 x 878 [7,14,3,13,9,1,11,4] + CRUSH rule 0 x 879 [12,2,7,4,10,15] + CRUSH rule 0 x 880 [2,12,10,7,1,4,9,14] + CRUSH rule 0 x 881 [6,3,1,11,4,15,9,13] + CRUSH rule 0 x 882 [11,13,7,1,2,15,4,9] + CRUSH rule 0 x 883 [13,1,3,10,6,5,9,15] + CRUSH rule 0 x 884 [6,15,4,9,3,11,12,1] + CRUSH rule 0 x 885 [14,7,9,4,2,13,11] + CRUSH rule 0 x 886 [13,11,4,2,1,14,9,6] + CRUSH rule 0 x 887 [14,4,12,11,2,6,9,1] + CRUSH rule 0 x 888 [10,12,7,15,9,2,1,5] + CRUSH rule 0 x 889 [15,13,4,1,6,2,10,9] + CRUSH rule 0 x 890 [10,12,14,2,9,5,6,1] + CRUSH rule 0 x 891 [9,5,11,6,3,15,12,1] + CRUSH rule 0 x 892 [12,15,2,4,7,9,11,1] + CRUSH rule 0 x 893 [1,3,5,9,6,10,14,12] + CRUSH rule 0 x 894 [7,2,11,13,4,1,14] + CRUSH rule 0 x 895 [2,1,11,5,7,15,13,9] + CRUSH rule 0 x 896 [9,1,14,10,4,12,2,7] + CRUSH rule 0 x 897 [7,5,14,3,1,9,11,12] + CRUSH rule 0 x 898 [10,6,12,9,15,5,2,1] + CRUSH rule 0 x 899 [1,11,5,3,13,14,9,6] + CRUSH rule 0 x 900 [2,9,10,7,13,14,5,1] + CRUSH rule 0 x 901 [9,12,11,3,14,4,1,6] + CRUSH rule 0 x 902 [4,2,6,15,12,10,1] + CRUSH rule 0 x 903 [14,10,3,1,12,6,5] + CRUSH rule 0 x 904 [15,12,4,9,6,3,11] + CRUSH rule 0 x 905 [12,6,11,3,9,4,15] + CRUSH rule 0 x 906 [14,11,12,2,4,9,6] + CRUSH rule 0 x 907 [7,12,3,9,10,5,14,1] + CRUSH rule 0 x 908 [2,15,9,6,10,13,5,1] + CRUSH rule 0 x 909 [10,14,1,13,2,9,7,4] + CRUSH rule 0 x 910 [12,7,4,15,10,3,1,9] + CRUSH rule 0 x 911 [11,15,2,4,9,13,6,1] + CRUSH rule 0 x 912 [6,4,14,13,3,1,11] + CRUSH rule 0 x 913 [4,6,10,1,12,3,9,14] + CRUSH rule 0 x 914 [4,15,2,10,1,13,7] + CRUSH rule 0 x 915 [12,14,1,9,4,3,11,6] + CRUSH rule 0 x 916 [3,1,11,5,6,13,14] + CRUSH rule 0 x 917 [1,15,6,5,10,3,13,9] + CRUSH rule 0 x 918 [7,14,11,4,9,2,13] + CRUSH rule 0 x 919 [10,7,3,13,15,1,4] + CRUSH rule 0 x 920 [4,2,10,15,1,13,6] + CRUSH rule 0 x 921 [1,11,6,13,4,2,9,14] + CRUSH rule 0 x 922 [6,4,14,13,3,1,10,9] + CRUSH rule 0 x 923 [12,2,5,14,10,1,9,6] + CRUSH rule 0 x 924 [6,2,14,13,9,1,11,5] + CRUSH rule 0 x 925 [12,15,2,10,1,5,7] + CRUSH rule 0 x 926 [3,13,10,1,14,9,6,5] + CRUSH rule 0 x 927 [6,5,1,11,14,2,13,9] + CRUSH rule 0 x 928 [13,1,3,9,6,11,15,5] + CRUSH rule 0 x 929 [10,7,1,5,2,12,9,14] + CRUSH rule 0 x 930 [7,15,10,5,1,13,2] + CRUSH rule 0 x 931 [6,15,11,9,5,3,1,13] + CRUSH rule 0 x 932 [13,2,5,11,9,1,6,15] + CRUSH rule 0 x 933 [12,7,14,10,4,1,2,9] + CRUSH rule 0 x 934 [12,2,5,7,9,1,15,11] + CRUSH rule 0 x 935 [6,11,1,14,5,13,3,9] + CRUSH rule 0 x 936 [9,12,7,5,1,2,14,11] + CRUSH rule 0 x 937 [14,2,11,1,13,4,9,6] + CRUSH rule 0 x 938 [14,3,5,11,7,9,13] + CRUSH rule 0 x 939 [6,4,14,9,12,1,11,2] + CRUSH rule 0 x 940 [13,11,4,2,1,6,15] + CRUSH rule 0 x 941 [3,12,4,7,14,10] + CRUSH rule 0 x 942 [15,12,10,4,1,9,3,7] + CRUSH rule 0 x 943 [10,2,4,9,6,15,12] + CRUSH rule 0 x 944 [2,9,4,7,1,14,12,11] + CRUSH rule 0 x 945 [10,15,2,9,5,12,7] + CRUSH rule 0 x 946 [11,15,7,12,5,9,2] + CRUSH rule 0 x 947 [11,3,14,1,12,5,6,9] + CRUSH rule 0 x 948 [7,13,11,5,14,2,1,9] + CRUSH rule 0 x 949 [9,1,12,5,15,10,2,6] + CRUSH rule 0 x 950 [9,15,13,6,4,2,10] + CRUSH rule 0 x 951 [2,6,12,9,10,4,14] + CRUSH rule 0 x 952 [9,7,15,3,5,13,11] + CRUSH rule 0 x 953 [1,3,6,10,12,14,4,9] + CRUSH rule 0 x 954 [10,2,14,9,4,6,12,1] + CRUSH rule 0 x 955 [7,14,3,1,10,4,9,12] + CRUSH rule 0 x 956 [1,6,11,5,14,3,9,13] + CRUSH rule 0 x 957 [14,11,1,12,6,9,4,3] + CRUSH rule 0 x 958 [15,4,3,11,1,6,12,9] + CRUSH rule 0 x 959 [2,1,12,15,10,9,4,6] + CRUSH rule 0 x 960 [2,6,11,13,15,4,9] + CRUSH rule 0 x 961 [3,13,11,9,6,1,4,15] + CRUSH rule 0 x 962 [5,11,3,14,1,6,13,9] + CRUSH rule 0 x 963 [13,10,15,4,6,9,1,3] + CRUSH rule 0 x 964 [7,11,4,9,2,12,1,15] + CRUSH rule 0 x 965 [12,2,9,7,4,15,11,1] + CRUSH rule 0 x 966 [12,14,9,4,1,2,11,7] + CRUSH rule 0 x 967 [7,5,3,10,12,14] + CRUSH rule 0 x 968 [12,15,4,9,11,6,3] + CRUSH rule 0 x 969 [11,4,7,1,9,14,13,2] + CRUSH rule 0 x 970 [5,12,10,1,3,14,9,6] + CRUSH rule 0 x 971 [1,9,4,12,7,2,10,15] + CRUSH rule 0 x 972 [12,3,14,5,1,9,7,11] + CRUSH rule 0 x 973 [1,10,4,12,2,7,15] + CRUSH rule 0 x 974 [7,11,1,2,15,4,12,9] + CRUSH rule 0 x 975 [7,9,15,12,2,11,4] + CRUSH rule 0 x 976 [7,3,15,5,12,11,1] + CRUSH rule 0 x 977 [14,3,6,10,4,1,12] + CRUSH rule 0 x 978 [12,5,11,1,15,3,6] + CRUSH rule 0 x 979 [5,1,13,6,15,10,3,9] + CRUSH rule 0 x 980 [15,11,5,6,1,3,13,9] + CRUSH rule 0 x 981 [5,11,15,12,7,1,2] + CRUSH rule 0 x 982 [2,6,14,11,12,9,5] + CRUSH rule 0 x 983 [3,12,10,9,14,5,6] + CRUSH rule 0 x 984 [15,13,1,10,2,5,7] + CRUSH rule 0 x 985 [11,2,15,1,4,13,6,9] + CRUSH rule 0 x 986 [6,13,9,1,15,10,5,2] + CRUSH rule 0 x 987 [13,14,5,10,6,1,3,9] + CRUSH rule 0 x 988 [12,9,10,14,3,1,4,7] + CRUSH rule 0 x 989 [7,4,3,15,9,13,10,1] + CRUSH rule 0 x 990 [1,10,9,13,3,4,6,15] + CRUSH rule 0 x 991 [7,11,1,14,2,5,9,12] + CRUSH rule 0 x 992 [9,10,2,13,7,4,1,15] + CRUSH rule 0 x 993 [6,10,14,12,4,1,2] + CRUSH rule 0 x 994 [3,13,15,4,11,7,1,9] + CRUSH rule 0 x 995 [15,6,12,2,5,11] + CRUSH rule 0 x 996 [15,10,5,3,13,1,9,7] + CRUSH rule 0 x 997 [15,2,1,12,7,9,4,10] + CRUSH rule 0 x 998 [6,1,9,5,12,11,15,2] + CRUSH rule 0 x 999 [9,10,15,5,13,3,7] + CRUSH rule 0 x 1000 [14,2,9,4,12,1,6,11] + CRUSH rule 0 x 1001 [11,14,4,2,6,9,1,13] + CRUSH rule 0 x 1002 [1,10,14,2,9,5,13,7] + CRUSH rule 0 x 1003 [10,7,5,14,2,1,9,12] + CRUSH rule 0 x 1004 [15,1,4,6,10,12,9,3] + CRUSH rule 0 x 1005 [6,12,2,10,9,15,5,1] + CRUSH rule 0 x 1006 [10,12,15,1,2,6,5] + CRUSH rule 0 x 1007 [1,7,13,14,3,4,10] + CRUSH rule 0 x 1008 [7,4,9,11,3,15,1,13] + CRUSH rule 0 x 1009 [5,2,11,7,15,9,1,12] + CRUSH rule 0 x 1010 [10,2,15,6,9,13,4,1] + CRUSH rule 0 x 1011 [6,3,12,1,10,4,9,14] + CRUSH rule 0 x 1012 [12,6,9,15,3,1,5,11] + CRUSH rule 0 x 1013 [2,14,12,4,9,1,6,10] + CRUSH rule 0 x 1014 [1,13,7,2,10,14,5] + CRUSH rule 0 x 1015 [12,6,10,1,4,15,9,2] + CRUSH rule 0 x 1016 [10,13,14,3,5,6,1] + CRUSH rule 0 x 1017 [5,11,14,7,13,9,2] + CRUSH rule 0 x 1018 [13,11,14,1,9,3,5,7] + CRUSH rule 0 x 1019 [10,13,14,7,5,1,2] + CRUSH rule 0 x 1020 [3,1,13,4,10,9,14,6] + CRUSH rule 0 x 1021 [2,11,14,9,4,6,1,13] + CRUSH rule 0 x 1022 [15,5,7,2,12,10] + CRUSH rule 0 x 1023 [15,2,9,12,1,7,4,11] + rule 0 (replicated_ruleset) num_rep 9 result size == 6:\t36/1024 (esc) + rule 0 (replicated_ruleset) num_rep 9 result size == 7:\t263/1024 (esc) + rule 0 (replicated_ruleset) num_rep 9 result size == 8:\t725/1024 (esc) + CRUSH rule 0 x 0 [7,10,3,15,12,1,4,9] + CRUSH rule 0 x 1 [10,15,1,2,13,4,7,9] + CRUSH rule 0 x 2 [1,12,2,6,5,10,15] + CRUSH rule 0 x 3 [15,4,10,2,9,6,13] + CRUSH rule 0 x 4 [14,2,10,1,9,4,7,13] + CRUSH rule 0 x 5 [7,4,11,2,13,15,9] + CRUSH rule 0 x 6 [12,6,10,9,3,4,14] + CRUSH rule 0 x 7 [9,2,6,12,11,4,1,14] + CRUSH rule 0 x 8 [10,2,15,1,4,13,6,9] + CRUSH rule 0 x 9 [7,1,14,2,11,9,12,4] + CRUSH rule 0 x 10 [10,14,4,1,2,7,13,9] + CRUSH rule 0 x 11 [13,9,14,7,5,11,2,1] + CRUSH rule 0 x 12 [7,1,2,5,13,15,11,9] + CRUSH rule 0 x 13 [3,5,12,7,9,1,14,11] + CRUSH rule 0 x 14 [13,5,2,7,10,15,1,9] + CRUSH rule 0 x 15 [15,1,9,6,13,3,5,11] + CRUSH rule 0 x 16 [7,11,14,2,13,1,9,4] + CRUSH rule 0 x 17 [10,1,13,2,4,6,14,9] + CRUSH rule 0 x 18 [1,7,3,10,5,12,9,14] + CRUSH rule 0 x 19 [7,12,2,4,15,10,1] + CRUSH rule 0 x 20 [14,12,3,10,9,4,7,1] + CRUSH rule 0 x 21 [3,12,1,10,4,15,6] + CRUSH rule 0 x 22 [6,3,13,11,4,1,15] + CRUSH rule 0 x 23 [10,5,13,9,3,15,1,6] + CRUSH rule 0 x 24 [12,11,3,1,9,4,7,15] + CRUSH rule 0 x 25 [7,12,15,1,3,10,4,9] + CRUSH rule 0 x 26 [1,7,13,2,14,5,9,11] + CRUSH rule 0 x 27 [3,6,15,4,13,9,11,1] + CRUSH rule 0 x 28 [14,4,3,9,6,11,13] + CRUSH rule 0 x 29 [5,14,12,11,6,3,1,9] + CRUSH rule 0 x 30 [2,5,6,9,1,11,13,14] + CRUSH rule 0 x 31 [5,15,10,1,9,13,6,3] + CRUSH rule 0 x 32 [9,10,2,1,13,14,6,4] + CRUSH rule 0 x 33 [13,4,9,2,7,1,10,14] + CRUSH rule 0 x 34 [13,15,2,4,1,10,9,6] + CRUSH rule 0 x 35 [4,14,3,13,10,9,1,6] + CRUSH rule 0 x 36 [3,12,9,7,5,10,14,1] + CRUSH rule 0 x 37 [9,2,6,14,11,1,4,13] + CRUSH rule 0 x 38 [3,4,13,10,9,1,14,6] + CRUSH rule 0 x 39 [12,7,14,11,1,9,5,2] + CRUSH rule 0 x 40 [10,1,9,5,15,2,6,13] + CRUSH rule 0 x 41 [4,9,11,1,14,13,6,3] + CRUSH rule 0 x 42 [3,6,14,10,12,5,1] + CRUSH rule 0 x 43 [10,5,15,7,2,9,12] + CRUSH rule 0 x 44 [11,4,13,3,7,14,9] + CRUSH rule 0 x 45 [11,12,15,9,1,5,6,3] + CRUSH rule 0 x 46 [6,9,2,14,11,13,1,5] + CRUSH rule 0 x 47 [3,9,6,4,13,1,11,15] + CRUSH rule 0 x 48 [4,6,2,1,10,14,13] + CRUSH rule 0 x 49 [9,15,10,7,4,3,13] + CRUSH rule 0 x 50 [14,12,1,4,2,11,6,9] + CRUSH rule 0 x 51 [10,6,5,12,15,2,1,9] + CRUSH rule 0 x 52 [12,1,9,11,7,3,14,4] + CRUSH rule 0 x 53 [3,6,13,9,5,1,11,15] + CRUSH rule 0 x 54 [4,13,9,2,14,10,6,1] + CRUSH rule 0 x 55 [4,11,2,7,1,13,9,15] + CRUSH rule 0 x 56 [5,9,10,1,3,13,14,7] + CRUSH rule 0 x 57 [6,2,1,15,10,12,5] + CRUSH rule 0 x 58 [7,1,11,4,3,14,12,9] + CRUSH rule 0 x 59 [2,13,1,10,9,5,14,6] + CRUSH rule 0 x 60 [3,6,11,1,4,9,12,15] + CRUSH rule 0 x 61 [3,15,13,7,4,1,10,9] + CRUSH rule 0 x 62 [15,11,7,12,5,9,2,1] + CRUSH rule 0 x 63 [10,14,12,1,7,3] + CRUSH rule 0 x 64 [3,9,1,4,7,12,11,15] + CRUSH rule 0 x 65 [4,12,11,7,14,3,1] + CRUSH rule 0 x 66 [15,11,6,9,4,1,3,12] + CRUSH rule 0 x 67 [2,6,4,14,1,11,12] + CRUSH rule 0 x 68 [15,7,4,2,9,12,11] + CRUSH rule 0 x 69 [2,1,15,10,4,9,13,7] + CRUSH rule 0 x 70 [9,6,1,3,13,15,11,5] + CRUSH rule 0 x 71 [15,5,1,3,13,10,7] + CRUSH rule 0 x 72 [9,10,3,5,7,12,15,1] + CRUSH rule 0 x 73 [5,3,11,1,7,12,15,9] + CRUSH rule 0 x 74 [11,7,9,5,1,15,3,12] + CRUSH rule 0 x 75 [9,7,11,14,12,1,2,5] + CRUSH rule 0 x 76 [6,1,3,5,14,10,12,9] + CRUSH rule 0 x 77 [7,4,2,13,9,1,11,15] + CRUSH rule 0 x 78 [9,3,1,5,6,13,14,11] + CRUSH rule 0 x 79 [13,2,15,5,7,9,11,1] + CRUSH rule 0 x 80 [15,2,6,4,13,10,1] + CRUSH rule 0 x 81 [15,2,1,11,4,6,13] + CRUSH rule 0 x 82 [14,13,5,11,6,2,1,9] + CRUSH rule 0 x 83 [4,15,3,9,10,13,6,1] + CRUSH rule 0 x 84 [10,7,9,15,3,4,1,13] + CRUSH rule 0 x 85 [3,15,9,7,4,11,1,12] + CRUSH rule 0 x 86 [10,9,14,1,13,4,2,7] + CRUSH rule 0 x 87 [15,10,7,12,5,3,9,1] + CRUSH rule 0 x 88 [4,13,3,1,9,15,11,7] + CRUSH rule 0 x 89 [3,9,7,4,1,14,10,12] + CRUSH rule 0 x 90 [4,9,7,12,11,14,2,1] + CRUSH rule 0 x 91 [6,11,9,1,2,4,14,13] + CRUSH rule 0 x 92 [1,5,10,9,13,15,6,2] + CRUSH rule 0 x 93 [9,3,15,13,7,5,1,10] + CRUSH rule 0 x 94 [9,2,12,5,6,11,1,14] + CRUSH rule 0 x 95 [7,15,4,10,9,13,2,1] + CRUSH rule 0 x 96 [2,15,11,7,5,1,12] + CRUSH rule 0 x 97 [4,11,2,13,1,7,9,14] + CRUSH rule 0 x 98 [11,13,9,3,15,1,5,6] + CRUSH rule 0 x 99 [12,4,11,7,3,14,9,1] + CRUSH rule 0 x 100 [9,4,10,15,7,3,13] + CRUSH rule 0 x 101 [15,7,1,9,10,5,2,12] + CRUSH rule 0 x 102 [3,11,14,6,13,4,9,1] + CRUSH rule 0 x 103 [13,11,6,14,4,3,1] + CRUSH rule 0 x 104 [14,6,3,5,9,1,10,13] + CRUSH rule 0 x 105 [14,10,1,9,3,5,6,13] + CRUSH rule 0 x 106 [6,5,13,2,14,11,1,9] + CRUSH rule 0 x 107 [3,1,10,14,13,5,9,6] + CRUSH rule 0 x 108 [5,10,7,2,15,9,12,1] + CRUSH rule 0 x 109 [9,1,13,7,15,5,11,3] + CRUSH rule 0 x 110 [5,1,11,3,7,14,13,9] + CRUSH rule 0 x 111 [10,1,9,7,5,2,13,14] + CRUSH rule 0 x 112 [1,10,4,14,2,12,6,9] + CRUSH rule 0 x 113 [6,10,13,9,1,5,2,14] + CRUSH rule 0 x 114 [5,13,6,2,1,14,11] + CRUSH rule 0 x 115 [10,13,14,3,9,1,6,5] + CRUSH rule 0 x 116 [1,14,13,2,11,5,7] + CRUSH rule 0 x 117 [5,6,1,12,15,9,11,3] + CRUSH rule 0 x 118 [10,4,13,15,9,3,1,6] + CRUSH rule 0 x 119 [14,12,11,4,6,9,3,1] + CRUSH rule 0 x 120 [11,3,14,13,4,7] + CRUSH rule 0 x 121 [9,5,1,11,7,3,15,12] + CRUSH rule 0 x 122 [4,3,14,1,11,13,7] + CRUSH rule 0 x 123 [3,10,5,6,9,1,12,15] + CRUSH rule 0 x 124 [12,2,1,5,14,7,11,9] + CRUSH rule 0 x 125 [9,12,15,1,6,5,3,10] + CRUSH rule 0 x 126 [7,15,10,9,2,12,5,1] + CRUSH rule 0 x 127 [4,14,9,13,1,3,7,10] + CRUSH rule 0 x 128 [3,12,1,10,4,9,7,14] + CRUSH rule 0 x 129 [11,13,14,2,9,4,6,1] + CRUSH rule 0 x 130 [3,13,5,14,10,1,9,6] + CRUSH rule 0 x 131 [12,1,6,15,4,2,11,9] + CRUSH rule 0 x 132 [11,15,13,9,2,5,7] + CRUSH rule 0 x 133 [3,6,9,11,15,12,5] + CRUSH rule 0 x 134 [12,5,6,15,3,9,10,1] + CRUSH rule 0 x 135 [3,14,12,4,6,11,9] + CRUSH rule 0 x 136 [15,6,9,4,10,3,12] + CRUSH rule 0 x 137 [14,3,6,11,1,9,4,13] + CRUSH rule 0 x 138 [13,15,4,10,2,7,1] + CRUSH rule 0 x 139 [11,2,13,9,1,15,7,5] + CRUSH rule 0 x 140 [11,4,12,15,2,6,9,1] + CRUSH rule 0 x 141 [6,12,15,11,3,5,1] + CRUSH rule 0 x 142 [3,14,7,9,11,1,4,13] + CRUSH rule 0 x 143 [9,6,4,2,14,10,12] + CRUSH rule 0 x 144 [13,7,11,2,14,4,1,9] + CRUSH rule 0 x 145 [12,2,6,10,9,4,14,1] + CRUSH rule 0 x 146 [1,5,9,2,6,13,14,10] + CRUSH rule 0 x 147 [1,4,9,11,2,7,15,12] + CRUSH rule 0 x 148 [12,7,9,2,14,11,1,4] + CRUSH rule 0 x 149 [2,5,9,12,11,1,7,14] + CRUSH rule 0 x 150 [1,15,2,10,7,9,5,12] + CRUSH rule 0 x 151 [2,9,14,7,1,10,5,13] + CRUSH rule 0 x 152 [5,9,2,6,10,13,14] + CRUSH rule 0 x 153 [6,9,4,15,2,1,10,12] + CRUSH rule 0 x 154 [3,11,7,1,4,12,15,9] + CRUSH rule 0 x 155 [14,12,7,3,5,1,9,11] + CRUSH rule 0 x 156 [7,13,3,10,15,5,1] + CRUSH rule 0 x 157 [15,1,6,4,3,10,9,13] + CRUSH rule 0 x 158 [15,1,10,6,12,2,4] + CRUSH rule 0 x 159 [4,14,3,12,10,6,1,9] + CRUSH rule 0 x 160 [5,7,3,14,11,1,12] + CRUSH rule 0 x 161 [1,2,11,4,6,13,14] + CRUSH rule 0 x 162 [10,6,1,12,2,4,14,9] + CRUSH rule 0 x 163 [15,1,10,2,6,4,13,9] + CRUSH rule 0 x 164 [9,14,10,7,12,2,5,1] + CRUSH rule 0 x 165 [11,7,2,13,9,15,1,5] + CRUSH rule 0 x 166 [1,2,12,14,4,11,7,9] + CRUSH rule 0 x 167 [9,7,3,4,11,13,15,1] + CRUSH rule 0 x 168 [13,2,4,1,6,15,10,9] + CRUSH rule 0 x 169 [1,4,9,14,13,10,2,7] + CRUSH rule 0 x 170 [1,15,7,9,12,10,3,5] + CRUSH rule 0 x 171 [9,2,10,7,1,5,15,12] + CRUSH rule 0 x 172 [14,4,10,12,9,3,6] + CRUSH rule 0 x 173 [5,10,12,15,6,1,2,9] + CRUSH rule 0 x 174 [15,6,4,12,1,11,9,2] + CRUSH rule 0 x 175 [5,7,9,3,10,1,14,13] + CRUSH rule 0 x 176 [9,6,3,14,13,10,4] + CRUSH rule 0 x 177 [2,9,10,13,4,1,14,7] + CRUSH rule 0 x 178 [12,11,7,14,3,4] + CRUSH rule 0 x 179 [2,10,13,9,5,1,7,14] + CRUSH rule 0 x 180 [3,11,5,15,7,12] + CRUSH rule 0 x 181 [9,12,6,5,1,10,14,2] + CRUSH rule 0 x 182 [5,13,11,2,1,6,14] + CRUSH rule 0 x 183 [5,7,10,13,3,9,14,1] + CRUSH rule 0 x 184 [2,5,11,12,7,1,9,15] + CRUSH rule 0 x 185 [13,5,7,11,2,14] + CRUSH rule 0 x 186 [6,14,13,5,10,1,3,9] + CRUSH rule 0 x 187 [1,4,11,13,6,14,9,3] + CRUSH rule 0 x 188 [9,13,5,14,10,6,2] + CRUSH rule 0 x 189 [6,12,4,9,2,1,11,15] + CRUSH rule 0 x 190 [9,13,15,10,3,1,5,6] + CRUSH rule 0 x 191 [7,11,4,1,15,12,9,2] + CRUSH rule 0 x 192 [2,11,5,15,6,1,13] + CRUSH rule 0 x 193 [3,13,6,10,4,1,9,14] + CRUSH rule 0 x 194 [3,13,4,14,6,9,1,11] + CRUSH rule 0 x 195 [5,7,10,12,1,3,15,9] + CRUSH rule 0 x 196 [4,15,1,10,9,2,13,7] + CRUSH rule 0 x 197 [14,10,13,4,6,3,1,9] + CRUSH rule 0 x 198 [2,5,6,15,9,13,10] + CRUSH rule 0 x 199 [2,10,4,15,1,9,6,12] + CRUSH rule 0 x 200 [7,14,11,4,1,3,13] + CRUSH rule 0 x 201 [9,14,1,7,4,3,10,13] + CRUSH rule 0 x 202 [14,11,7,3,5,1,12] + CRUSH rule 0 x 203 [12,5,7,15,1,2,10,9] + CRUSH rule 0 x 204 [6,11,3,12,14,1,9,4] + CRUSH rule 0 x 205 [15,4,6,10,13,9,2,1] + CRUSH rule 0 x 206 [13,11,2,15,7,1,5] + CRUSH rule 0 x 207 [2,11,7,4,14,1,12,9] + CRUSH rule 0 x 208 [13,1,6,14,9,11,3,5] + CRUSH rule 0 x 209 [6,15,13,1,11,4,9,2] + CRUSH rule 0 x 210 [13,11,2,7,5,14,9] + CRUSH rule 0 x 211 [2,14,1,13,11,7,9,5] + CRUSH rule 0 x 212 [10,1,12,15,5,6,2,9] + CRUSH rule 0 x 213 [3,9,6,5,15,13,1,11] + CRUSH rule 0 x 214 [7,15,4,1,10,2,13,9] + CRUSH rule 0 x 215 [6,1,4,13,3,11,14] + CRUSH rule 0 x 216 [12,9,6,2,1,11,5,15] + CRUSH rule 0 x 217 [12,11,1,14,2,4,7] + CRUSH rule 0 x 218 [12,10,15,6,1,4,9,2] + CRUSH rule 0 x 219 [3,11,14,6,4,1,13] + CRUSH rule 0 x 220 [14,4,3,12,10,9,6] + CRUSH rule 0 x 221 [15,5,2,6,12,11,9] + CRUSH rule 0 x 222 [10,4,3,15,7,12,1] + CRUSH rule 0 x 223 [9,7,11,1,4,14,13,3] + CRUSH rule 0 x 224 [1,7,10,2,12,9,14,5] + CRUSH rule 0 x 225 [10,5,2,6,1,13,9,15] + CRUSH rule 0 x 226 [4,1,9,3,13,10,15,7] + CRUSH rule 0 x 227 [7,2,12,15,5,11] + CRUSH rule 0 x 228 [2,15,11,1,6,13,9,4] + CRUSH rule 0 x 229 [9,3,7,14,1,12,4,10] + CRUSH rule 0 x 230 [10,5,7,2,15,1,13] + CRUSH rule 0 x 231 [2,7,5,13,9,15,10] + CRUSH rule 0 x 232 [10,5,13,1,9,2,7,14] + CRUSH rule 0 x 233 [6,12,11,4,9,14,1,3] + CRUSH rule 0 x 234 [10,1,2,12,5,9,15,7] + CRUSH rule 0 x 235 [13,14,7,10,1,9,5,3] + CRUSH rule 0 x 236 [2,15,9,12,1,7,4,10] + CRUSH rule 0 x 237 [3,12,9,10,4,7,15] + CRUSH rule 0 x 238 [2,10,4,15,6,12,9,1] + CRUSH rule 0 x 239 [4,15,10,7,9,13,3,1] + CRUSH rule 0 x 240 [15,5,13,7,2,9,10] + CRUSH rule 0 x 241 [7,9,15,12,1,5,2,10] + CRUSH rule 0 x 242 [14,2,6,9,10,12,5] + CRUSH rule 0 x 243 [2,11,5,1,15,6,9,13] + CRUSH rule 0 x 244 [13,9,15,3,11,7,5] + CRUSH rule 0 x 245 [12,9,15,3,1,5,10,7] + CRUSH rule 0 x 246 [15,3,5,11,7,1,12,9] + CRUSH rule 0 x 247 [6,4,9,12,1,2,10,14] + CRUSH rule 0 x 248 [5,13,7,11,9,15,3,1] + CRUSH rule 0 x 249 [10,14,7,3,9,13,1,4] + CRUSH rule 0 x 250 [12,15,1,10,5,6,3,9] + CRUSH rule 0 x 251 [13,2,15,5,6,1,9,10] + CRUSH rule 0 x 252 [7,5,13,9,3,10,14,1] + CRUSH rule 0 x 253 [3,13,15,10,7,4] + CRUSH rule 0 x 254 [2,9,13,14,4,6,10] + CRUSH rule 0 x 255 [1,9,13,2,6,10,4,15] + CRUSH rule 0 x 256 [6,9,13,1,3,14,5,10] + CRUSH rule 0 x 257 [15,12,3,9,6,4,11] + CRUSH rule 0 x 258 [12,5,6,10,2,1,14,9] + CRUSH rule 0 x 259 [9,10,4,3,14,13,1,7] + CRUSH rule 0 x 260 [10,12,6,9,3,15,1,4] + CRUSH rule 0 x 261 [13,7,2,1,15,5,11,9] + CRUSH rule 0 x 262 [15,3,12,7,4,9,1,11] + CRUSH rule 0 x 263 [12,6,10,9,5,15,3,1] + CRUSH rule 0 x 264 [13,14,11,3,1,4,7,9] + CRUSH rule 0 x 265 [12,10,14,5,7,1,9,3] + CRUSH rule 0 x 266 [14,7,11,1,2,9,4,12] + CRUSH rule 0 x 267 [12,11,6,5,1,2,15] + CRUSH rule 0 x 268 [4,1,15,12,6,11,3,9] + CRUSH rule 0 x 269 [11,1,15,5,13,9,7,2] + CRUSH rule 0 x 270 [7,11,12,3,1,14,9,4] + CRUSH rule 0 x 271 [4,7,3,13,15,10,9,1] + CRUSH rule 0 x 272 [15,5,13,10,6,2] + CRUSH rule 0 x 273 [2,10,7,12,1,15,5] + CRUSH rule 0 x 274 [10,2,5,6,13,9,15,1] + CRUSH rule 0 x 275 [10,3,4,7,14,13] + CRUSH rule 0 x 276 [5,12,9,2,11,7,15,1] + CRUSH rule 0 x 277 [14,3,13,4,1,9,11,7] + CRUSH rule 0 x 278 [5,6,14,3,1,11,13,9] + CRUSH rule 0 x 279 [6,10,13,3,9,4,15] + CRUSH rule 0 x 280 [7,3,14,9,1,11,4,13] + CRUSH rule 0 x 281 [5,11,14,7,9,13,2,1] + CRUSH rule 0 x 282 [2,1,13,14,9,7,5,10] + CRUSH rule 0 x 283 [4,1,12,3,10,7,15] + CRUSH rule 0 x 284 [5,11,7,15,3,13,1,9] + CRUSH rule 0 x 285 [15,5,3,1,6,13,11,9] + CRUSH rule 0 x 286 [10,4,3,6,12,15,1] + CRUSH rule 0 x 287 [12,4,9,1,3,11,15,7] + CRUSH rule 0 x 288 [4,12,10,7,1,3,14,9] + CRUSH rule 0 x 289 [2,5,14,9,13,6,10] + CRUSH rule 0 x 290 [12,2,5,6,15,9,1,10] + CRUSH rule 0 x 291 [7,11,1,14,5,9,2,12] + CRUSH rule 0 x 292 [4,10,6,3,14,9,12,1] + CRUSH rule 0 x 293 [6,5,11,1,2,14,12] + CRUSH rule 0 x 294 [9,12,3,14,6,11,5,1] + CRUSH rule 0 x 295 [6,10,3,14,9,4,13] + CRUSH rule 0 x 296 [3,1,13,7,14,9,10,4] + CRUSH rule 0 x 297 [6,13,4,14,10,1,2,9] + CRUSH rule 0 x 298 [14,9,13,1,4,2,7,10] + CRUSH rule 0 x 299 [14,12,11,6,4,2,1,9] + CRUSH rule 0 x 300 [15,7,10,5,1,3,13,9] + CRUSH rule 0 x 301 [9,11,7,1,13,14,4,2] + CRUSH rule 0 x 302 [9,7,1,13,5,10,3,15] + CRUSH rule 0 x 303 [4,13,3,7,10,15,1] + CRUSH rule 0 x 304 [6,9,2,11,15,13,4] + CRUSH rule 0 x 305 [13,7,5,11,2,15,9] + CRUSH rule 0 x 306 [10,12,4,6,9,2,15,1] + CRUSH rule 0 x 307 [11,12,15,5,6,2,1,9] + CRUSH rule 0 x 308 [12,14,10,9,1,2,5,7] + CRUSH rule 0 x 309 [9,3,12,5,11,15,7] + CRUSH rule 0 x 310 [3,1,5,10,14,9,7,12] + CRUSH rule 0 x 311 [3,9,7,1,14,13,10,5] + CRUSH rule 0 x 312 [15,13,9,7,5,10,2] + CRUSH rule 0 x 313 [9,15,3,7,5,13,1,11] + CRUSH rule 0 x 314 [2,15,9,5,6,12,1,11] + CRUSH rule 0 x 315 [15,2,13,1,11,9,6,4] + CRUSH rule 0 x 316 [4,9,11,2,12,14,6] + CRUSH rule 0 x 317 [1,5,3,13,15,7,10] + CRUSH rule 0 x 318 [4,1,15,11,9,13,6,2] + CRUSH rule 0 x 319 [2,15,4,1,11,9,7,12] + CRUSH rule 0 x 320 [5,7,13,9,11,2,1,15] + CRUSH rule 0 x 321 [1,6,11,15,5,3,13] + CRUSH rule 0 x 322 [13,7,5,3,14,11,1] + CRUSH rule 0 x 323 [7,4,10,1,2,13,14] + CRUSH rule 0 x 324 [5,6,10,15,2,13] + CRUSH rule 0 x 325 [9,10,14,5,1,6,2,13] + CRUSH rule 0 x 326 [11,7,13,4,2,15,1] + CRUSH rule 0 x 327 [12,5,10,14,3,7,9] + CRUSH rule 0 x 328 [5,2,6,14,1,11,12] + CRUSH rule 0 x 329 [2,6,15,5,9,10,13,1] + CRUSH rule 0 x 330 [3,9,11,13,1,6,5,14] + CRUSH rule 0 x 331 [12,14,6,3,1,4,10,9] + CRUSH rule 0 x 332 [10,12,6,15,9,2,5] + CRUSH rule 0 x 333 [6,5,3,12,14,10,9,1] + CRUSH rule 0 x 334 [4,9,2,12,7,11,15,1] + CRUSH rule 0 x 335 [11,7,1,5,13,2,9,15] + CRUSH rule 0 x 336 [6,14,13,2,5,9,11] + CRUSH rule 0 x 337 [15,11,3,7,12,5] + CRUSH rule 0 x 338 [10,5,3,6,15,1,9,13] + CRUSH rule 0 x 339 [11,14,13,5,3,7,1] + CRUSH rule 0 x 340 [11,6,12,4,9,3,14,1] + CRUSH rule 0 x 341 [7,5,2,10,14,9,1,12] + CRUSH rule 0 x 342 [12,14,1,9,2,11,4,7] + CRUSH rule 0 x 343 [12,14,9,6,10,2,4,1] + CRUSH rule 0 x 344 [9,11,5,2,14,13,1,7] + CRUSH rule 0 x 345 [14,2,11,9,6,12,4] + CRUSH rule 0 x 346 [5,3,14,10,7,1,13] + CRUSH rule 0 x 347 [10,2,12,6,9,1,14,5] + CRUSH rule 0 x 348 [7,9,10,1,14,13,3,4] + CRUSH rule 0 x 349 [9,6,10,12,1,5,14] + CRUSH rule 0 x 350 [13,9,15,4,10,7,2,1] + CRUSH rule 0 x 351 [13,5,15,3,1,6,11] + CRUSH rule 0 x 352 [1,12,11,9,4,7,3,15] + CRUSH rule 0 x 353 [10,14,12,2,9,1,4,6] + CRUSH rule 0 x 354 [6,3,15,10,9,4,13] + CRUSH rule 0 x 355 [13,14,6,10,2,5,1,9] + CRUSH rule 0 x 356 [15,13,2,9,6,5,1,11] + CRUSH rule 0 x 357 [4,11,1,13,3,14,6,9] + CRUSH rule 0 x 358 [12,7,2,9,1,14,10,4] + CRUSH rule 0 x 359 [5,15,7,11,3,13] + CRUSH rule 0 x 360 [13,10,1,2,6,14,5] + CRUSH rule 0 x 361 [5,3,13,6,1,14,11,9] + CRUSH rule 0 x 362 [2,9,11,13,1,6,5,15] + CRUSH rule 0 x 363 [7,12,3,9,15,4,1,10] + CRUSH rule 0 x 364 [2,12,6,9,5,10,15] + CRUSH rule 0 x 365 [13,5,11,15,6,2,9] + CRUSH rule 0 x 366 [12,7,3,14,5,10,9] + CRUSH rule 0 x 367 [7,13,3,1,5,11,15,9] + CRUSH rule 0 x 368 [7,9,10,15,3,4,13] + CRUSH rule 0 x 369 [7,5,3,13,14,9,11,1] + CRUSH rule 0 x 370 [4,7,14,1,2,9,11,12] + CRUSH rule 0 x 371 [1,7,12,3,4,15,10,9] + CRUSH rule 0 x 372 [10,4,3,14,6,1,12,9] + CRUSH rule 0 x 373 [15,5,2,6,13,1,9,10] + CRUSH rule 0 x 374 [3,15,12,5,1,6,10,9] + CRUSH rule 0 x 375 [5,2,14,1,6,13,11,9] + CRUSH rule 0 x 376 [5,14,10,13,3,6,1] + CRUSH rule 0 x 377 [1,15,2,4,9,11,12,6] + CRUSH rule 0 x 378 [9,12,2,15,1,5,11,6] + CRUSH rule 0 x 379 [11,2,15,5,7,9,13,1] + CRUSH rule 0 x 380 [6,1,12,11,2,9,5,14] + CRUSH rule 0 x 381 [15,13,7,5,10,2,1,9] + CRUSH rule 0 x 382 [14,3,1,4,13,7,10] + CRUSH rule 0 x 383 [3,6,11,4,13,15,1] + CRUSH rule 0 x 384 [4,13,6,3,15,11,9] + CRUSH rule 0 x 385 [4,6,15,3,10,9,1,13] + CRUSH rule 0 x 386 [14,3,11,13,5,6,9,1] + CRUSH rule 0 x 387 [1,11,5,7,9,2,14,12] + CRUSH rule 0 x 388 [2,6,11,9,15,4,12] + CRUSH rule 0 x 389 [12,7,2,4,15,10,1] + CRUSH rule 0 x 390 [2,11,13,7,5,9,15] + CRUSH rule 0 x 391 [3,4,9,13,7,10,1,14] + CRUSH rule 0 x 392 [11,5,14,7,1,9,2,12] + CRUSH rule 0 x 393 [2,14,5,9,7,13,11] + CRUSH rule 0 x 394 [4,9,3,15,13,6,1,11] + CRUSH rule 0 x 395 [10,13,5,15,6,9,3,1] + CRUSH rule 0 x 396 [2,12,15,9,4,6,11] + CRUSH rule 0 x 397 [1,14,9,4,12,10,3,7] + CRUSH rule 0 x 398 [9,2,1,5,12,6,11,15] + CRUSH rule 0 x 399 [5,9,14,3,1,10,13,7] + CRUSH rule 0 x 400 [10,6,2,4,15,12,1,9] + CRUSH rule 0 x 401 [6,9,11,12,4,3,15,1] + CRUSH rule 0 x 402 [4,7,9,2,13,1,15,11] + CRUSH rule 0 x 403 [7,15,13,3,5,9,10] + CRUSH rule 0 x 404 [14,12,7,9,2,1,5,11] + CRUSH rule 0 x 405 [9,15,11,2,4,7,13,1] + CRUSH rule 0 x 406 [12,14,9,2,7,10,4,1] + CRUSH rule 0 x 407 [9,5,12,10,15,6,3] + CRUSH rule 0 x 408 [7,1,5,2,10,15,13,9] + CRUSH rule 0 x 409 [11,2,4,13,1,15,7,9] + CRUSH rule 0 x 410 [6,4,14,2,12,9,10,1] + CRUSH rule 0 x 411 [13,11,15,6,4,1,9,2] + CRUSH rule 0 x 412 [5,9,6,11,14,2,12] + CRUSH rule 0 x 413 [13,5,3,11,6,9,1,14] + CRUSH rule 0 x 414 [3,11,9,13,4,1,6,15] + CRUSH rule 0 x 415 [6,10,14,5,1,13,3,9] + CRUSH rule 0 x 416 [13,1,4,7,2,9,14,11] + CRUSH rule 0 x 417 [4,12,1,15,2,11,9,6] + CRUSH rule 0 x 418 [14,5,10,2,6,9,13] + CRUSH rule 0 x 419 [5,14,10,9,2,12,6,1] + CRUSH rule 0 x 420 [2,4,9,11,6,14,13,1] + CRUSH rule 0 x 421 [15,4,10,3,9,12,7] + CRUSH rule 0 x 422 [4,11,2,7,13,9,15] + CRUSH rule 0 x 423 [3,15,12,6,5,1,9,10] + CRUSH rule 0 x 424 [6,10,12,2,5,1,14,9] + CRUSH rule 0 x 425 [11,15,2,13,5,7,9,1] + CRUSH rule 0 x 426 [12,4,7,1,9,10,14,2] + CRUSH rule 0 x 427 [14,10,3,1,9,7,5,13] + CRUSH rule 0 x 428 [12,7,9,4,2,1,14,10] + CRUSH rule 0 x 429 [3,4,9,7,11,12,1,14] + CRUSH rule 0 x 430 [3,5,10,13,1,15,6] + CRUSH rule 0 x 431 [9,3,7,1,12,5,14,11] + CRUSH rule 0 x 432 [4,1,12,7,15,2,10,9] + CRUSH rule 0 x 433 [4,11,12,15,7,3] + CRUSH rule 0 x 434 [2,14,9,1,5,11,7,13] + CRUSH rule 0 x 435 [13,11,5,6,9,2,15] + CRUSH rule 0 x 436 [9,15,10,2,4,1,12,7] + CRUSH rule 0 x 437 [9,6,3,14,10,12,5,1] + CRUSH rule 0 x 438 [7,2,13,4,11,1,9,14] + CRUSH rule 0 x 439 [7,14,4,3,12,10] + CRUSH rule 0 x 440 [14,11,9,2,7,12,1,5] + CRUSH rule 0 x 441 [2,4,11,9,13,6,1,14] + CRUSH rule 0 x 442 [10,13,9,7,15,1,4,2] + CRUSH rule 0 x 443 [12,15,10,9,2,1,6,4] + CRUSH rule 0 x 444 [4,13,7,14,3,1,9,11] + CRUSH rule 0 x 445 [4,2,15,7,1,9,11,12] + CRUSH rule 0 x 446 [12,10,6,9,4,1,15,3] + CRUSH rule 0 x 447 [15,7,13,1,4,9,3,11] + CRUSH rule 0 x 448 [5,2,13,7,15,10] + CRUSH rule 0 x 449 [14,5,3,12,10,9,6] + CRUSH rule 0 x 450 [2,4,6,9,15,1,13,10] + CRUSH rule 0 x 451 [6,14,11,3,9,1,12,5] + CRUSH rule 0 x 452 [14,9,10,4,2,13,7] + CRUSH rule 0 x 453 [5,15,13,2,6,9,11] + CRUSH rule 0 x 454 [10,4,2,6,15,12,9,1] + CRUSH rule 0 x 455 [6,13,2,4,10,1,15] + CRUSH rule 0 x 456 [5,7,13,1,11,3,9,15] + CRUSH rule 0 x 457 [9,1,5,7,11,13,15,2] + CRUSH rule 0 x 458 [9,11,15,4,7,2,12,1] + CRUSH rule 0 x 459 [13,15,11,1,5,2,6] + CRUSH rule 0 x 460 [5,12,10,15,7,3,9] + CRUSH rule 0 x 461 [4,3,9,13,15,6,10] + CRUSH rule 0 x 462 [4,7,12,14,11,1,3,9] + CRUSH rule 0 x 463 [4,12,14,11,2,7,1,9] + CRUSH rule 0 x 464 [4,2,15,10,1,9,13,7] + CRUSH rule 0 x 465 [5,10,9,7,13,1,3,14] + CRUSH rule 0 x 466 [13,5,2,15,9,11,6,1] + CRUSH rule 0 x 467 [13,6,14,3,9,1,11,5] + CRUSH rule 0 x 468 [10,7,12,14,4,1,9,2] + CRUSH rule 0 x 469 [4,9,6,14,12,11,3,1] + CRUSH rule 0 x 470 [3,9,12,15,5,6,10] + CRUSH rule 0 x 471 [6,1,5,14,13,10,9,3] + CRUSH rule 0 x 472 [2,14,7,5,13,1,11,9] + CRUSH rule 0 x 473 [15,10,6,9,4,12,2] + CRUSH rule 0 x 474 [15,10,4,12,6,9,2,1] + CRUSH rule 0 x 475 [10,5,12,9,14,3,6,1] + CRUSH rule 0 x 476 [3,6,10,12,1,15,9,4] + CRUSH rule 0 x 477 [6,13,5,15,11,9,2,1] + CRUSH rule 0 x 478 [4,15,1,3,7,12,10,9] + CRUSH rule 0 x 479 [13,11,1,6,14,5,9,3] + CRUSH rule 0 x 480 [1,13,6,4,9,14,11,3] + CRUSH rule 0 x 481 [15,12,7,9,1,3,10,4] + CRUSH rule 0 x 482 [2,12,9,1,7,11,14,4] + CRUSH rule 0 x 483 [10,1,4,15,9,7,13,2] + CRUSH rule 0 x 484 [1,4,10,13,7,14,2,9] + CRUSH rule 0 x 485 [9,4,3,1,14,12,7,10] + CRUSH rule 0 x 486 [3,10,15,9,7,13,4,1] + CRUSH rule 0 x 487 [12,11,4,14,7,2,1] + CRUSH rule 0 x 488 [14,4,1,9,2,6,10,12] + CRUSH rule 0 x 489 [11,4,2,13,15,7] + CRUSH rule 0 x 490 [4,9,1,3,13,15,6,11] + CRUSH rule 0 x 491 [1,12,5,2,14,11,6] + CRUSH rule 0 x 492 [5,7,11,3,14,9,1,13] + CRUSH rule 0 x 493 [12,1,4,15,3,11,9,6] + CRUSH rule 0 x 494 [1,7,13,4,15,9,10,3] + CRUSH rule 0 x 495 [3,15,7,1,9,5,12,11] + CRUSH rule 0 x 496 [5,3,7,13,9,14,10] + CRUSH rule 0 x 497 [13,10,3,6,5,14,1] + CRUSH rule 0 x 498 [10,6,1,5,9,12,3,15] + CRUSH rule 0 x 499 [14,3,12,5,1,11,9,7] + CRUSH rule 0 x 500 [15,9,6,12,11,2,1,5] + CRUSH rule 0 x 501 [10,13,1,9,3,14,5,7] + CRUSH rule 0 x 502 [5,1,14,11,7,12,9,2] + CRUSH rule 0 x 503 [15,10,7,9,1,12,4,2] + CRUSH rule 0 x 504 [13,2,7,1,14,11,5] + CRUSH rule 0 x 505 [12,7,5,2,14,10,9] + CRUSH rule 0 x 506 [11,7,9,14,12,1,2,5] + CRUSH rule 0 x 507 [4,14,13,3,9,7,1,10] + CRUSH rule 0 x 508 [12,1,4,9,2,11,15,7] + CRUSH rule 0 x 509 [4,2,6,9,14,1,10,13] + CRUSH rule 0 x 510 [5,3,1,12,11,14,9,7] + CRUSH rule 0 x 511 [2,12,10,6,14,5] + CRUSH rule 0 x 512 [15,11,3,5,7,1,13] + CRUSH rule 0 x 513 [4,9,11,3,13,7,1,14] + CRUSH rule 0 x 514 [11,9,3,4,12,15,6,1] + CRUSH rule 0 x 515 [12,14,6,5,3,9,1,10] + CRUSH rule 0 x 516 [14,11,1,12,3,7,4,9] + CRUSH rule 0 x 517 [11,5,6,13,9,3,14] + CRUSH rule 0 x 518 [3,5,7,12,15,11,9,1] + CRUSH rule 0 x 519 [12,14,2,1,4,6,9,10] + CRUSH rule 0 x 520 [12,4,2,10,6,15,9] + CRUSH rule 0 x 521 [11,5,9,6,15,3,13] + CRUSH rule 0 x 522 [4,12,11,1,15,3,9,6] + CRUSH rule 0 x 523 [3,1,5,9,15,10,13,7] + CRUSH rule 0 x 524 [15,9,3,11,13,7,4,1] + CRUSH rule 0 x 525 [3,15,11,6,9,12,4] + CRUSH rule 0 x 526 [10,2,5,13,6,15,1,9] + CRUSH rule 0 x 527 [3,13,4,1,9,10,14,7] + CRUSH rule 0 x 528 [12,7,15,10,2,5,9] + CRUSH rule 0 x 529 [6,4,10,12,2,9,14] + CRUSH rule 0 x 530 [11,9,12,7,5,1,3,15] + CRUSH rule 0 x 531 [9,15,4,7,2,13,1,11] + CRUSH rule 0 x 532 [5,3,13,7,9,14,1,10] + CRUSH rule 0 x 533 [12,15,1,2,7,5,10] + CRUSH rule 0 x 534 [11,9,3,7,15,4,1,12] + CRUSH rule 0 x 535 [11,1,3,5,14,9,12,7] + CRUSH rule 0 x 536 [9,1,14,13,4,6,2,11] + CRUSH rule 0 x 537 [15,5,13,2,7,11] + CRUSH rule 0 x 538 [13,5,11,2,6,15,9] + CRUSH rule 0 x 539 [10,12,6,14,1,2,9,5] + CRUSH rule 0 x 540 [12,15,7,3,9,11,1,4] + CRUSH rule 0 x 541 [2,1,6,11,14,13,4] + CRUSH rule 0 x 542 [3,9,15,5,11,12,7,1] + CRUSH rule 0 x 543 [4,10,9,3,6,13,14] + CRUSH rule 0 x 544 [3,15,9,11,7,4,12,1] + CRUSH rule 0 x 545 [14,10,7,12,4,9,1,3] + CRUSH rule 0 x 546 [5,15,13,7,1,10,9,2] + CRUSH rule 0 x 547 [5,13,7,9,3,14,10] + CRUSH rule 0 x 548 [11,7,12,15,4,2] + CRUSH rule 0 x 549 [14,1,4,9,13,6,3,10] + CRUSH rule 0 x 550 [9,15,3,13,1,6,4,11] + CRUSH rule 0 x 551 [11,2,15,6,13,5,1] + CRUSH rule 0 x 552 [2,11,14,1,9,6,5,12] + CRUSH rule 0 x 553 [11,9,14,6,4,13,3] + CRUSH rule 0 x 554 [11,14,6,4,13,9,3,1] + CRUSH rule 0 x 555 [6,5,10,9,14,2,13,1] + CRUSH rule 0 x 556 [15,6,3,13,11,4,1,9] + CRUSH rule 0 x 557 [12,2,5,14,10,9,6] + CRUSH rule 0 x 558 [12,1,6,15,5,10,3] + CRUSH rule 0 x 559 [2,13,5,10,14,7,1] + CRUSH rule 0 x 560 [4,9,12,6,3,10,1,15] + CRUSH rule 0 x 561 [12,7,1,2,5,15,11,9] + CRUSH rule 0 x 562 [7,13,9,14,2,1,11,4] + CRUSH rule 0 x 563 [15,4,3,10,13,9,7] + CRUSH rule 0 x 564 [2,13,7,1,15,10,4] + CRUSH rule 0 x 565 [3,12,4,1,14,7,11] + CRUSH rule 0 x 566 [6,14,4,2,13,11] + CRUSH rule 0 x 567 [15,4,11,6,3,12] + CRUSH rule 0 x 568 [4,14,1,6,10,13,3,9] + CRUSH rule 0 x 569 [11,3,15,13,5,1,9,7] + CRUSH rule 0 x 570 [1,10,13,4,7,2,9,14] + CRUSH rule 0 x 571 [10,12,14,9,4,2,1,6] + CRUSH rule 0 x 572 [12,14,3,10,6,1,4,9] + CRUSH rule 0 x 573 [7,15,11,2,12,9,4,1] + CRUSH rule 0 x 574 [11,14,13,1,3,7,4,9] + CRUSH rule 0 x 575 [5,13,15,9,6,10,2] + CRUSH rule 0 x 576 [3,15,11,9,1,6,5,13] + CRUSH rule 0 x 577 [13,9,6,15,3,11,4,1] + CRUSH rule 0 x 578 [4,10,1,2,7,13,14,9] + CRUSH rule 0 x 579 [13,1,15,2,10,7,5,9] + CRUSH rule 0 x 580 [3,12,4,1,10,15,7,9] + CRUSH rule 0 x 581 [7,14,12,10,1,2,9,5] + CRUSH rule 0 x 582 [10,5,13,14,1,2,7] + CRUSH rule 0 x 583 [4,15,1,9,10,12,2,6] + CRUSH rule 0 x 584 [10,1,5,13,6,9,2,15] + CRUSH rule 0 x 585 [5,3,6,1,11,14,13,9] + CRUSH rule 0 x 586 [7,10,14,12,9,3,5,1] + CRUSH rule 0 x 587 [11,6,9,4,1,14,13,2] + CRUSH rule 0 x 588 [3,12,7,15,4,9,1,10] + CRUSH rule 0 x 589 [9,7,12,1,10,3,4,15] + CRUSH rule 0 x 590 [12,1,3,9,10,6,4,14] + CRUSH rule 0 x 591 [2,6,14,13,9,11,4] + CRUSH rule 0 x 592 [15,12,9,7,5,2,11,1] + CRUSH rule 0 x 593 [13,14,5,11,9,6,2] + CRUSH rule 0 x 594 [12,14,2,9,7,4,1,11] + CRUSH rule 0 x 595 [12,7,10,3,1,14,9,4] + CRUSH rule 0 x 596 [2,7,12,11,1,5,15,9] + CRUSH rule 0 x 597 [15,1,2,10,7,13,5,9] + CRUSH rule 0 x 598 [11,5,9,14,12,7,3] + CRUSH rule 0 x 599 [13,11,1,5,6,2,15,9] + CRUSH rule 0 x 600 [4,12,3,10,9,7,1,14] + CRUSH rule 0 x 601 [13,5,15,2,1,7,9,10] + CRUSH rule 0 x 602 [3,11,7,1,13,15,5,9] + CRUSH rule 0 x 603 [3,1,4,14,10,9,6,12] + CRUSH rule 0 x 604 [14,2,6,1,11,13,9,4] + CRUSH rule 0 x 605 [2,7,12,5,14,10,1,9] + CRUSH rule 0 x 606 [12,15,1,5,7,9,3,11] + CRUSH rule 0 x 607 [3,9,10,14,7,1,4,12] + CRUSH rule 0 x 608 [13,10,1,7,9,15,5,2] + CRUSH rule 0 x 609 [14,3,7,9,11,12,5] + CRUSH rule 0 x 610 [7,10,5,1,12,2,15] + CRUSH rule 0 x 611 [13,1,5,3,10,7,15,9] + CRUSH rule 0 x 612 [7,1,2,13,9,15,4,11] + CRUSH rule 0 x 613 [10,7,14,9,5,2,13] + CRUSH rule 0 x 614 [9,4,15,3,1,11,6,12] + CRUSH rule 0 x 615 [9,4,11,2,1,12,6,15] + CRUSH rule 0 x 616 [10,14,1,5,3,6,12,9] + CRUSH rule 0 x 617 [15,7,2,11,12,1,9,4] + CRUSH rule 0 x 618 [4,2,10,6,14,9,1,12] + CRUSH rule 0 x 619 [15,4,3,9,6,1,13,11] + CRUSH rule 0 x 620 [3,7,11,14,13,1,5] + CRUSH rule 0 x 621 [3,6,4,14,1,11,13] + CRUSH rule 0 x 622 [10,2,13,5,15,9,1,7] + CRUSH rule 0 x 623 [4,9,14,7,3,13,11] + CRUSH rule 0 x 624 [3,9,15,6,10,1,5,12] + CRUSH rule 0 x 625 [11,7,3,5,13,15,9] + CRUSH rule 0 x 626 [10,12,2,1,9,7,5,14] + CRUSH rule 0 x 627 [1,12,10,14,3,5,9,7] + CRUSH rule 0 x 628 [15,13,11,4,2,1,7,9] + CRUSH rule 0 x 629 [5,6,15,12,1,10,3,9] + CRUSH rule 0 x 630 [1,4,12,9,3,7,15,11] + CRUSH rule 0 x 631 [5,7,1,15,12,11,3,9] + CRUSH rule 0 x 632 [12,3,11,9,6,1,15,5] + CRUSH rule 0 x 633 [14,4,3,7,10,12,9] + CRUSH rule 0 x 634 [6,9,5,3,13,11,14] + CRUSH rule 0 x 635 [6,5,2,15,9,12,11] + CRUSH rule 0 x 636 [13,6,11,3,15,9,1,4] + CRUSH rule 0 x 637 [3,1,10,6,9,12,4,14] + CRUSH rule 0 x 638 [10,15,3,5,13,1,7] + CRUSH rule 0 x 639 [6,9,14,4,3,1,10,13] + CRUSH rule 0 x 640 [9,6,1,11,14,2,4,13] + CRUSH rule 0 x 641 [10,6,5,14,1,9,12,2] + CRUSH rule 0 x 642 [1,15,4,6,2,10,9,12] + CRUSH rule 0 x 643 [3,7,5,1,10,15,13] + CRUSH rule 0 x 644 [15,13,6,9,3,11,5] + CRUSH rule 0 x 645 [14,2,4,9,10,1,7,13] + CRUSH rule 0 x 646 [5,13,14,1,6,9,2,11] + CRUSH rule 0 x 647 [10,1,9,13,6,2,14,5] + CRUSH rule 0 x 648 [6,5,2,14,11,1,12,9] + CRUSH rule 0 x 649 [3,9,13,11,4,14,1,7] + CRUSH rule 0 x 650 [10,9,4,15,12,7,1,2] + CRUSH rule 0 x 651 [3,9,5,7,14,1,13,11] + CRUSH rule 0 x 652 [15,9,4,6,13,1,2,11] + CRUSH rule 0 x 653 [11,14,1,3,6,9,12,5] + CRUSH rule 0 x 654 [13,6,2,10,15,4,1,9] + CRUSH rule 0 x 655 [6,3,4,15,12,11,1] + CRUSH rule 0 x 656 [3,15,1,4,6,12,11] + CRUSH rule 0 x 657 [11,15,3,5,7,13,1,9] + CRUSH rule 0 x 658 [7,2,10,12,1,4,9,14] + CRUSH rule 0 x 659 [2,5,14,6,10,12] + CRUSH rule 0 x 660 [13,14,10,6,4,9,3] + CRUSH rule 0 x 661 [7,15,3,12,11,4,9,1] + CRUSH rule 0 x 662 [15,2,12,5,1,10,9,7] + CRUSH rule 0 x 663 [14,9,13,10,5,3,1,6] + CRUSH rule 0 x 664 [6,10,12,4,9,2,1,15] + CRUSH rule 0 x 665 [2,9,12,1,7,10,4,15] + CRUSH rule 0 x 666 [12,3,6,1,15,9,10,4] + CRUSH rule 0 x 667 [1,9,12,10,2,14,7,4] + CRUSH rule 0 x 668 [9,5,1,2,6,11,13,15] + CRUSH rule 0 x 669 [9,7,14,5,11,13,1,2] + CRUSH rule 0 x 670 [6,10,9,13,1,2,15,4] + CRUSH rule 0 x 671 [6,15,5,10,13,3] + CRUSH rule 0 x 672 [2,9,13,1,4,14,6,10] + CRUSH rule 0 x 673 [7,10,5,9,15,13,2,1] + CRUSH rule 0 x 674 [7,12,10,1,14,9,3,4] + CRUSH rule 0 x 675 [9,5,1,10,6,14,12,2] + CRUSH rule 0 x 676 [10,12,2,1,4,15,7] + CRUSH rule 0 x 677 [2,12,1,4,10,6,15,9] + CRUSH rule 0 x 678 [1,2,4,10,12,14,9,6] + CRUSH rule 0 x 679 [5,6,12,15,9,11,3] + CRUSH rule 0 x 680 [7,11,3,1,15,4,9,12] + CRUSH rule 0 x 681 [6,4,3,11,14,13,1,9] + CRUSH rule 0 x 682 [6,1,11,15,12,2,5,9] + CRUSH rule 0 x 683 [6,13,2,4,9,14,10,1] + CRUSH rule 0 x 684 [9,11,3,7,15,4,13] + CRUSH rule 0 x 685 [5,1,15,7,9,2,10,13] + CRUSH rule 0 x 686 [1,9,11,14,6,13,4,3] + CRUSH rule 0 x 687 [7,13,3,5,11,9,15,1] + CRUSH rule 0 x 688 [11,9,1,14,3,5,7,12] + CRUSH rule 0 x 689 [5,2,9,12,1,14,11,7] + CRUSH rule 0 x 690 [9,7,10,3,13,15,5,1] + CRUSH rule 0 x 691 [11,15,9,5,7,13,2] + CRUSH rule 0 x 692 [15,5,1,2,9,11,12,7] + CRUSH rule 0 x 693 [5,6,12,15,2,10,9,1] + CRUSH rule 0 x 694 [4,7,1,10,12,3,14] + CRUSH rule 0 x 695 [6,13,14,10,9,5,1,3] + CRUSH rule 0 x 696 [1,2,4,14,7,11,13] + CRUSH rule 0 x 697 [13,11,3,6,4,14,9,1] + CRUSH rule 0 x 698 [11,13,4,2,6,1,9,15] + CRUSH rule 0 x 699 [7,14,12,4,2,11] + CRUSH rule 0 x 700 [12,14,11,9,4,6,3,1] + CRUSH rule 0 x 701 [3,13,1,14,4,7,11] + CRUSH rule 0 x 702 [3,12,15,6,5,11,1,9] + CRUSH rule 0 x 703 [15,11,13,3,4,7,1,9] + CRUSH rule 0 x 704 [6,4,2,15,11,1,13,9] + CRUSH rule 0 x 705 [14,6,11,5,1,13,9,3] + CRUSH rule 0 x 706 [1,12,3,6,4,10,15,9] + CRUSH rule 0 x 707 [4,7,14,3,10,9,13] + CRUSH rule 0 x 708 [3,10,5,1,15,9,7,13] + CRUSH rule 0 x 709 [11,12,3,7,5,14,1,9] + CRUSH rule 0 x 710 [14,2,11,9,5,7,12,1] + CRUSH rule 0 x 711 [14,3,9,10,12,5,6,1] + CRUSH rule 0 x 712 [12,3,11,15,9,1,6,4] + CRUSH rule 0 x 713 [11,9,3,15,13,6,4,1] + CRUSH rule 0 x 714 [12,1,9,7,2,15,10,5] + CRUSH rule 0 x 715 [6,1,14,4,11,12,3,9] + CRUSH rule 0 x 716 [11,13,9,14,5,2,1,7] + CRUSH rule 0 x 717 [12,4,10,9,15,1,2,7] + CRUSH rule 0 x 718 [7,15,5,2,11,13] + CRUSH rule 0 x 719 [5,15,13,3,1,7,11] + CRUSH rule 0 x 720 [4,13,10,2,7,9,1,14] + CRUSH rule 0 x 721 [11,3,14,9,1,12,4,6] + CRUSH rule 0 x 722 [2,4,6,1,9,15,13,10] + CRUSH rule 0 x 723 [2,1,12,15,11,7,5,9] + CRUSH rule 0 x 724 [7,1,9,10,5,15,13,2] + CRUSH rule 0 x 725 [11,12,7,15,4,1,2] + CRUSH rule 0 x 726 [7,14,4,3,11,13,9,1] + CRUSH rule 0 x 727 [2,5,1,11,15,7,12] + CRUSH rule 0 x 728 [13,11,4,6,15,2] + CRUSH rule 0 x 729 [15,11,4,6,2,9,1,13] + CRUSH rule 0 x 730 [3,7,1,13,11,15,9,5] + CRUSH rule 0 x 731 [9,1,6,5,2,11,13,15] + CRUSH rule 0 x 732 [1,2,10,13,9,4,7,15] + CRUSH rule 0 x 733 [11,3,5,6,1,9,12,15] + CRUSH rule 0 x 734 [14,3,11,7,12,9,4,1] + CRUSH rule 0 x 735 [6,9,2,10,13,14,5] + CRUSH rule 0 x 736 [3,9,1,11,7,5,13,14] + CRUSH rule 0 x 737 [1,4,2,12,9,10,6,15] + CRUSH rule 0 x 738 [11,15,7,4,9,2,12] + CRUSH rule 0 x 739 [11,12,6,2,4,1,14] + CRUSH rule 0 x 740 [7,9,10,13,1,15,2,5] + CRUSH rule 0 x 741 [12,11,7,15,2,5] + CRUSH rule 0 x 742 [9,7,4,11,12,1,14,3] + CRUSH rule 0 x 743 [5,13,9,15,10,7,3] + CRUSH rule 0 x 744 [6,2,13,1,14,11,4] + CRUSH rule 0 x 745 [3,6,1,4,11,12,14,9] + CRUSH rule 0 x 746 [3,7,9,10,14,5,1,13] + CRUSH rule 0 x 747 [15,11,5,2,13,9,1,7] + CRUSH rule 0 x 748 [6,10,13,2,14,5,9,1] + CRUSH rule 0 x 749 [14,9,10,7,5,1,2,12] + CRUSH rule 0 x 750 [1,14,6,5,11,2,13] + CRUSH rule 0 x 751 [15,1,6,9,5,11,12,3] + CRUSH rule 0 x 752 [13,1,7,3,11,15,9,4] + CRUSH rule 0 x 753 [4,11,1,3,15,7,13] + CRUSH rule 0 x 754 [14,12,11,4,2,1,9,6] + CRUSH rule 0 x 755 [13,6,1,10,4,2,14,9] + CRUSH rule 0 x 756 [3,4,14,6,1,10,13,9] + CRUSH rule 0 x 757 [10,6,1,4,13,15,2] + CRUSH rule 0 x 758 [6,3,4,10,15,13,9,1] + CRUSH rule 0 x 759 [5,7,3,14,11,1,9,13] + CRUSH rule 0 x 760 [1,15,10,12,4,3,9,7] + CRUSH rule 0 x 761 [2,12,1,14,5,7,10] + CRUSH rule 0 x 762 [1,4,10,9,3,7,14,12] + CRUSH rule 0 x 763 [4,13,1,14,7,10,2,9] + CRUSH rule 0 x 764 [1,14,6,13,9,5,2,10] + CRUSH rule 0 x 765 [9,15,2,13,4,1,11,7] + CRUSH rule 0 x 766 [11,2,7,15,9,12,4] + CRUSH rule 0 x 767 [6,11,4,3,12,14] + CRUSH rule 0 x 768 [2,12,15,7,1,11,9,4] + CRUSH rule 0 x 769 [15,1,9,2,11,12,7,4] + CRUSH rule 0 x 770 [15,13,4,6,3,10,1,9] + CRUSH rule 0 x 771 [9,2,12,11,6,14,5,1] + CRUSH rule 0 x 772 [4,3,13,11,14,1,7] + CRUSH rule 0 x 773 [3,7,4,15,1,12,11,9] + CRUSH rule 0 x 774 [12,6,3,15,5,9,10,1] + CRUSH rule 0 x 775 [5,10,14,2,6,1,13] + CRUSH rule 0 x 776 [10,15,3,9,6,13,1,5] + CRUSH rule 0 x 777 [11,13,4,7,1,14,9,2] + CRUSH rule 0 x 778 [13,1,9,11,15,6,3,5] + CRUSH rule 0 x 779 [5,11,1,14,2,9,13,6] + CRUSH rule 0 x 780 [13,9,3,6,4,1,14,10] + CRUSH rule 0 x 781 [5,7,14,3,1,12,11,9] + CRUSH rule 0 x 782 [2,15,9,7,11,13,4,1] + CRUSH rule 0 x 783 [12,7,5,14,9,1,2,10] + CRUSH rule 0 x 784 [14,1,10,13,3,4,7,9] + CRUSH rule 0 x 785 [6,12,1,2,4,9,15,10] + CRUSH rule 0 x 786 [10,5,2,15,1,7,12,9] + CRUSH rule 0 x 787 [1,12,10,2,9,4,14,6] + CRUSH rule 0 x 788 [4,2,9,13,6,15,11] + CRUSH rule 0 x 789 [9,2,14,7,4,12,1,10] + CRUSH rule 0 x 790 [15,2,7,4,1,10,13] + CRUSH rule 0 x 791 [9,4,7,13,14,11,1,3] + CRUSH rule 0 x 792 [6,4,15,10,12,3] + CRUSH rule 0 x 793 [15,9,6,2,13,11,4] + CRUSH rule 0 x 794 [5,12,2,14,9,10,1,6] + CRUSH rule 0 x 795 [6,14,12,4,10,1,2,9] + CRUSH rule 0 x 796 [11,2,12,6,15,4] + CRUSH rule 0 x 797 [14,3,7,1,5,13,11] + CRUSH rule 0 x 798 [5,11,6,13,1,3,15,9] + CRUSH rule 0 x 799 [2,9,14,4,13,6,11] + CRUSH rule 0 x 800 [6,3,4,11,15,13] + CRUSH rule 0 x 801 [2,5,6,13,9,1,10,15] + CRUSH rule 0 x 802 [1,4,12,7,3,9,10,14] + CRUSH rule 0 x 803 [7,2,4,1,11,13,9,14] + CRUSH rule 0 x 804 [5,14,9,7,3,1,12,10] + CRUSH rule 0 x 805 [13,4,3,1,10,15,7] + CRUSH rule 0 x 806 [6,2,13,4,15,1,10] + CRUSH rule 0 x 807 [14,2,7,4,9,12,1,10] + CRUSH rule 0 x 808 [2,15,12,7,9,1,5,10] + CRUSH rule 0 x 809 [1,11,7,12,4,2,15,9] + CRUSH rule 0 x 810 [2,5,9,12,15,1,7,11] + CRUSH rule 0 x 811 [15,6,3,10,1,5,9,12] + CRUSH rule 0 x 812 [7,11,2,14,9,5,12] + CRUSH rule 0 x 813 [4,10,13,14,2,6,9] + CRUSH rule 0 x 814 [13,4,9,3,10,6,15] + CRUSH rule 0 x 815 [15,12,9,4,10,6,1,2] + CRUSH rule 0 x 816 [14,10,13,7,3,9,4,1] + CRUSH rule 0 x 817 [10,7,2,15,13,9,5] + CRUSH rule 0 x 818 [15,2,11,4,1,12,6,9] + CRUSH rule 0 x 819 [5,12,10,6,1,14,3] + CRUSH rule 0 x 820 [3,6,9,12,11,15,4,1] + CRUSH rule 0 x 821 [15,10,9,13,3,4,7,1] + CRUSH rule 0 x 822 [10,13,2,9,7,4,14,1] + CRUSH rule 0 x 823 [2,6,12,10,15,4,1,9] + CRUSH rule 0 x 824 [3,7,9,13,15,5,10] + CRUSH rule 0 x 825 [10,5,14,6,12,9,3] + CRUSH rule 0 x 826 [5,2,11,15,1,12,9,7] + CRUSH rule 0 x 827 [13,5,1,3,7,9,11,14] + CRUSH rule 0 x 828 [12,6,10,5,1,9,2,15] + CRUSH rule 0 x 829 [13,6,15,10,5,3,9] + CRUSH rule 0 x 830 [15,13,2,9,7,11,1,5] + CRUSH rule 0 x 831 [1,4,11,12,6,3,15] + CRUSH rule 0 x 832 [14,11,13,2,9,4,6,1] + CRUSH rule 0 x 833 [9,13,3,11,7,5,15,1] + CRUSH rule 0 x 834 [9,7,5,1,11,2,13,14] + CRUSH rule 0 x 835 [14,3,13,6,4,9,1,10] + CRUSH rule 0 x 836 [3,9,10,13,1,5,14,7] + CRUSH rule 0 x 837 [15,12,11,2,7,9,5] + CRUSH rule 0 x 838 [12,14,9,2,5,7,11] + CRUSH rule 0 x 839 [3,4,6,10,15,1,13,9] + CRUSH rule 0 x 840 [10,15,12,4,7,1,2,9] + CRUSH rule 0 x 841 [3,5,7,12,11,15,1,9] + CRUSH rule 0 x 842 [9,13,2,6,5,14,10,1] + CRUSH rule 0 x 843 [14,7,4,9,3,12,1,10] + CRUSH rule 0 x 844 [7,1,4,15,9,2,11,12] + CRUSH rule 0 x 845 [13,6,1,15,4,2,11] + CRUSH rule 0 x 846 [3,7,15,13,1,9,10,4] + CRUSH rule 0 x 847 [12,15,11,5,2,7,1] + CRUSH rule 0 x 848 [11,13,1,14,5,9,2,7] + CRUSH rule 0 x 849 [3,15,11,9,6,1,13,5] + CRUSH rule 0 x 850 [1,3,10,6,14,4,9,12] + CRUSH rule 0 x 851 [14,4,3,6,11,1,13] + CRUSH rule 0 x 852 [9,12,4,7,15,2,11,1] + CRUSH rule 0 x 853 [13,14,6,11,2,4,9,1] + CRUSH rule 0 x 854 [7,11,12,1,4,15,3] + CRUSH rule 0 x 855 [14,4,12,6,3,1,10] + CRUSH rule 0 x 856 [5,10,7,3,15,9,12,1] + CRUSH rule 0 x 857 [4,3,13,11,9,1,7,14] + CRUSH rule 0 x 858 [5,15,6,3,9,12,1,10] + CRUSH rule 0 x 859 [5,15,6,2,1,11,12,9] + CRUSH rule 0 x 860 [11,14,1,12,6,9,2,4] + CRUSH rule 0 x 861 [13,7,4,10,1,14,3,9] + CRUSH rule 0 x 862 [5,10,9,7,3,12,1,15] + CRUSH rule 0 x 863 [11,6,3,9,4,12,15] + CRUSH rule 0 x 864 [6,13,4,2,10,15,1,9] + CRUSH rule 0 x 865 [4,1,14,11,6,9,3,13] + CRUSH rule 0 x 866 [2,13,4,15,9,6,11] + CRUSH rule 0 x 867 [12,2,9,10,4,14,6] + CRUSH rule 0 x 868 [14,11,7,2,1,4,9,12] + CRUSH rule 0 x 869 [10,13,7,14,3,5,1] + CRUSH rule 0 x 870 [14,9,11,4,3,12,6,1] + CRUSH rule 0 x 871 [6,2,1,4,15,13,11,9] + CRUSH rule 0 x 872 [6,1,15,3,10,12,5] + CRUSH rule 0 x 873 [2,5,12,10,1,9,15,7] + CRUSH rule 0 x 874 [12,4,7,2,15,10,1] + CRUSH rule 0 x 875 [10,6,14,1,12,5,9,3] + CRUSH rule 0 x 876 [14,7,13,3,9,1,11,4] + CRUSH rule 0 x 877 [15,11,13,9,5,1,6,3] + CRUSH rule 0 x 878 [7,14,3,13,9,1,11,4] + CRUSH rule 0 x 879 [12,2,7,4,10,15] + CRUSH rule 0 x 880 [2,12,10,7,1,4,9,14] + CRUSH rule 0 x 881 [6,3,1,11,4,15,9,13] + CRUSH rule 0 x 882 [11,13,7,1,2,15,4,9] + CRUSH rule 0 x 883 [13,1,3,10,6,5,9,15] + CRUSH rule 0 x 884 [6,15,4,9,3,11,12,1] + CRUSH rule 0 x 885 [14,7,9,4,2,13,11] + CRUSH rule 0 x 886 [13,11,4,2,1,14,9,6] + CRUSH rule 0 x 887 [14,4,12,11,2,6,9,1] + CRUSH rule 0 x 888 [10,12,7,15,9,2,1,5] + CRUSH rule 0 x 889 [15,13,4,1,6,2,10,9] + CRUSH rule 0 x 890 [10,12,14,2,9,5,6,1] + CRUSH rule 0 x 891 [9,5,11,6,3,15,12,1] + CRUSH rule 0 x 892 [12,15,2,4,7,9,11,1] + CRUSH rule 0 x 893 [1,3,5,9,6,10,14,12] + CRUSH rule 0 x 894 [7,2,11,13,4,1,14] + CRUSH rule 0 x 895 [2,1,11,5,7,15,13,9] + CRUSH rule 0 x 896 [9,1,14,10,4,12,2,7] + CRUSH rule 0 x 897 [7,5,14,3,1,9,11,12] + CRUSH rule 0 x 898 [10,6,12,9,15,5,2,1] + CRUSH rule 0 x 899 [1,11,5,3,13,14,9,6] + CRUSH rule 0 x 900 [2,9,10,7,13,14,5,1] + CRUSH rule 0 x 901 [9,12,11,3,14,4,1,6] + CRUSH rule 0 x 902 [4,2,6,15,12,10,1] + CRUSH rule 0 x 903 [14,10,3,1,12,6,5] + CRUSH rule 0 x 904 [15,12,4,9,6,3,11] + CRUSH rule 0 x 905 [12,6,11,3,9,4,15] + CRUSH rule 0 x 906 [14,11,12,2,4,9,6] + CRUSH rule 0 x 907 [7,12,3,9,10,5,14,1] + CRUSH rule 0 x 908 [2,15,9,6,10,13,5,1] + CRUSH rule 0 x 909 [10,14,1,13,2,9,7,4] + CRUSH rule 0 x 910 [12,7,4,15,10,3,1,9] + CRUSH rule 0 x 911 [11,15,2,4,9,13,6,1] + CRUSH rule 0 x 912 [6,4,14,13,3,1,11] + CRUSH rule 0 x 913 [4,6,10,1,12,3,9,14] + CRUSH rule 0 x 914 [4,15,2,10,1,13,7] + CRUSH rule 0 x 915 [12,14,1,9,4,3,11,6] + CRUSH rule 0 x 916 [3,1,11,5,6,13,14] + CRUSH rule 0 x 917 [1,15,6,5,10,3,13,9] + CRUSH rule 0 x 918 [7,14,11,4,9,2,13] + CRUSH rule 0 x 919 [10,7,3,13,15,1,4] + CRUSH rule 0 x 920 [4,2,10,15,1,13,6] + CRUSH rule 0 x 921 [1,11,6,13,4,2,9,14] + CRUSH rule 0 x 922 [6,4,14,13,3,1,10,9] + CRUSH rule 0 x 923 [12,2,5,14,10,1,9,6] + CRUSH rule 0 x 924 [6,2,14,13,9,1,11,5] + CRUSH rule 0 x 925 [12,15,2,10,1,5,7] + CRUSH rule 0 x 926 [3,13,10,1,14,9,6,5] + CRUSH rule 0 x 927 [6,5,1,11,14,2,13,9] + CRUSH rule 0 x 928 [13,1,3,9,6,11,15,5] + CRUSH rule 0 x 929 [10,7,1,5,2,12,9,14] + CRUSH rule 0 x 930 [7,15,10,5,1,13,2] + CRUSH rule 0 x 931 [6,15,11,9,5,3,1,13] + CRUSH rule 0 x 932 [13,2,5,11,9,1,6,15] + CRUSH rule 0 x 933 [12,7,14,10,4,1,2,9] + CRUSH rule 0 x 934 [12,2,5,7,9,1,15,11] + CRUSH rule 0 x 935 [6,11,1,14,5,13,3,9] + CRUSH rule 0 x 936 [9,12,7,5,1,2,14,11] + CRUSH rule 0 x 937 [14,2,11,1,13,4,9,6] + CRUSH rule 0 x 938 [14,3,5,11,7,9,13] + CRUSH rule 0 x 939 [6,4,14,9,12,1,11,2] + CRUSH rule 0 x 940 [13,11,4,2,1,6,15] + CRUSH rule 0 x 941 [3,12,4,7,14,10] + CRUSH rule 0 x 942 [15,12,10,4,1,9,3,7] + CRUSH rule 0 x 943 [10,2,4,9,6,15,12] + CRUSH rule 0 x 944 [2,9,4,7,1,14,12,11] + CRUSH rule 0 x 945 [10,15,2,9,5,12,7] + CRUSH rule 0 x 946 [11,15,7,12,5,9,2] + CRUSH rule 0 x 947 [11,3,14,1,12,5,6,9] + CRUSH rule 0 x 948 [7,13,11,5,14,2,1,9] + CRUSH rule 0 x 949 [9,1,12,5,15,10,2,6] + CRUSH rule 0 x 950 [9,15,13,6,4,2,10] + CRUSH rule 0 x 951 [2,6,12,9,10,4,14] + CRUSH rule 0 x 952 [9,7,15,3,5,13,11] + CRUSH rule 0 x 953 [1,3,6,10,12,14,4,9] + CRUSH rule 0 x 954 [10,2,14,9,4,6,12,1] + CRUSH rule 0 x 955 [7,14,3,1,10,4,9,12] + CRUSH rule 0 x 956 [1,6,11,5,14,3,9,13] + CRUSH rule 0 x 957 [14,11,1,12,6,9,4,3] + CRUSH rule 0 x 958 [15,4,3,11,1,6,12,9] + CRUSH rule 0 x 959 [2,1,12,15,10,9,4,6] + CRUSH rule 0 x 960 [2,6,11,13,15,4,9] + CRUSH rule 0 x 961 [3,13,11,9,6,1,4,15] + CRUSH rule 0 x 962 [5,11,3,14,1,6,13,9] + CRUSH rule 0 x 963 [13,10,15,4,6,9,1,3] + CRUSH rule 0 x 964 [7,11,4,9,2,12,1,15] + CRUSH rule 0 x 965 [12,2,9,7,4,15,11,1] + CRUSH rule 0 x 966 [12,14,9,4,1,2,11,7] + CRUSH rule 0 x 967 [7,5,3,10,12,14] + CRUSH rule 0 x 968 [12,15,4,9,11,6,3] + CRUSH rule 0 x 969 [11,4,7,1,9,14,13,2] + CRUSH rule 0 x 970 [5,12,10,1,3,14,9,6] + CRUSH rule 0 x 971 [1,9,4,12,7,2,10,15] + CRUSH rule 0 x 972 [12,3,14,5,1,9,7,11] + CRUSH rule 0 x 973 [1,10,4,12,2,7,15] + CRUSH rule 0 x 974 [7,11,1,2,15,4,12,9] + CRUSH rule 0 x 975 [7,9,15,12,2,11,4] + CRUSH rule 0 x 976 [7,3,15,5,12,11,1] + CRUSH rule 0 x 977 [14,3,6,10,4,1,12] + CRUSH rule 0 x 978 [12,5,11,1,15,3,6] + CRUSH rule 0 x 979 [5,1,13,6,15,10,3,9] + CRUSH rule 0 x 980 [15,11,5,6,1,3,13,9] + CRUSH rule 0 x 981 [5,11,15,12,7,1,2] + CRUSH rule 0 x 982 [2,6,14,11,12,9,5] + CRUSH rule 0 x 983 [3,12,10,9,14,5,6] + CRUSH rule 0 x 984 [15,13,1,10,2,5,7] + CRUSH rule 0 x 985 [11,2,15,1,4,13,6,9] + CRUSH rule 0 x 986 [6,13,9,1,15,10,5,2] + CRUSH rule 0 x 987 [13,14,5,10,6,1,3,9] + CRUSH rule 0 x 988 [12,9,10,14,3,1,4,7] + CRUSH rule 0 x 989 [7,4,3,15,9,13,10,1] + CRUSH rule 0 x 990 [1,10,9,13,3,4,6,15] + CRUSH rule 0 x 991 [7,11,1,14,2,5,9,12] + CRUSH rule 0 x 992 [9,10,2,13,7,4,1,15] + CRUSH rule 0 x 993 [6,10,14,12,4,1,2] + CRUSH rule 0 x 994 [3,13,15,4,11,7,1,9] + CRUSH rule 0 x 995 [15,6,12,2,5,11] + CRUSH rule 0 x 996 [15,10,5,3,13,1,9,7] + CRUSH rule 0 x 997 [15,2,1,12,7,9,4,10] + CRUSH rule 0 x 998 [6,1,9,5,12,11,15,2] + CRUSH rule 0 x 999 [9,10,15,5,13,3,7] + CRUSH rule 0 x 1000 [14,2,9,4,12,1,6,11] + CRUSH rule 0 x 1001 [11,14,4,2,6,9,1,13] + CRUSH rule 0 x 1002 [1,10,14,2,9,5,13,7] + CRUSH rule 0 x 1003 [10,7,5,14,2,1,9,12] + CRUSH rule 0 x 1004 [15,1,4,6,10,12,9,3] + CRUSH rule 0 x 1005 [6,12,2,10,9,15,5,1] + CRUSH rule 0 x 1006 [10,12,15,1,2,6,5] + CRUSH rule 0 x 1007 [1,7,13,14,3,4,10] + CRUSH rule 0 x 1008 [7,4,9,11,3,15,1,13] + CRUSH rule 0 x 1009 [5,2,11,7,15,9,1,12] + CRUSH rule 0 x 1010 [10,2,15,6,9,13,4,1] + CRUSH rule 0 x 1011 [6,3,12,1,10,4,9,14] + CRUSH rule 0 x 1012 [12,6,9,15,3,1,5,11] + CRUSH rule 0 x 1013 [2,14,12,4,9,1,6,10] + CRUSH rule 0 x 1014 [1,13,7,2,10,14,5] + CRUSH rule 0 x 1015 [12,6,10,1,4,15,9,2] + CRUSH rule 0 x 1016 [10,13,14,3,5,6,1] + CRUSH rule 0 x 1017 [5,11,14,7,13,9,2] + CRUSH rule 0 x 1018 [13,11,14,1,9,3,5,7] + CRUSH rule 0 x 1019 [10,13,14,7,5,1,2] + CRUSH rule 0 x 1020 [3,1,13,4,10,9,14,6] + CRUSH rule 0 x 1021 [2,11,14,9,4,6,1,13] + CRUSH rule 0 x 1022 [15,5,7,2,12,10] + CRUSH rule 0 x 1023 [15,2,9,12,1,7,4,11] + rule 0 (replicated_ruleset) num_rep 10 result size == 6:\t36/1024 (esc) + rule 0 (replicated_ruleset) num_rep 10 result size == 7:\t263/1024 (esc) + rule 0 (replicated_ruleset) num_rep 10 result size == 8:\t725/1024 (esc) diff -Nru ceph-0.67.4/src/test/cli/radosgw-admin/help.t ceph-0.67.7/src/test/cli/radosgw-admin/help.t --- ceph-0.67.4/src/test/cli/radosgw-admin/help.t 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/test/cli/radosgw-admin/help.t 2014-02-19 20:12:48.000000000 +0000 @@ -114,9 +114,10 @@ := "YYYY-MM-DD[ hh:mm:ss]" - --conf/-c Read configuration from the given configuration file - --id/-i set ID portion of my name - --name/-n set name (TYPE.ID) - --version show version and quit + --conf/-c FILE read configuration from the given configuration file + --id/-i ID set ID portion of my name + --name/-n TYPE.ID set name + --cluster NAME set cluster name (default: ceph) + --version show version and quit [1] diff -Nru ceph-0.67.4/src/test/common/test_context.cc ceph-0.67.7/src/test/common/test_context.cc --- ceph-0.67.4/src/test/common/test_context.cc 1970-01-01 00:00:00.000000000 +0000 +++ ceph-0.67.7/src/test/common/test_context.cc 2014-02-19 20:12:47.000000000 +0000 @@ -0,0 +1,64 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2014 Cloudwatt + * + * Author: Loic Dachary + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library Public License for more details. + * + * + */ +#include "gtest/gtest.h" +#include "include/types.h" +#include "include/msgr.h" +#include "common/ceph_context.h" +#include "common/config.h" + +TEST(CephContext, do_command) +{ + CephContext *cct = (new CephContext(CEPH_ENTITY_TYPE_CLIENT))->get(); + + string key("key"); + string value("value"); + cct->_conf->set_val(key.c_str(), value.c_str(), false); + cmdmap_t cmdmap; + cmdmap["var"] = key; + + { + bufferlist out; + cct->do_command("config get", cmdmap, "xml", &out); + string s(out.c_str(), out.length()); + EXPECT_EQ("" + value + "", s); + } + + { + bufferlist out; + cct->do_command("config get", cmdmap, "UNSUPPORTED", &out); + string s(out.c_str(), out.length()); + EXPECT_EQ("{ \"key\": \"value\"}", s); + } + + cct->put(); +} + +/* + * Local Variables: + * compile-command: "cd ../.. ; + * make unittest_context && + * valgrind \ + * --max-stackframe=20000000 --tool=memcheck \ + * ./unittest_context # --gtest_filter=CephContext.* + * " + * End: + */ diff -Nru ceph-0.67.4/src/test/encoding/types.h ceph-0.67.7/src/test/encoding/types.h --- ceph-0.67.4/src/test/encoding/types.h 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/test/encoding/types.h 2014-02-19 20:12:48.000000000 +0000 @@ -35,6 +35,7 @@ TYPE(pg_t) TYPE(coll_t) TYPE(pow2_hist_t) +TYPE(filestore_perf_stat_t) TYPE(osd_stat_t) TYPE(OSDSuperblock) TYPE_FEATUREFUL(pool_snap_info_t) diff -Nru ceph-0.67.4/src/test/mon/test_mon_workloadgen.cc ceph-0.67.7/src/test/mon/test_mon_workloadgen.cc --- ceph-0.67.4/src/test/mon/test_mon_workloadgen.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/test/mon/test_mon_workloadgen.cc 2014-02-19 20:12:48.000000000 +0000 @@ -247,7 +247,7 @@ << messenger->get_myaddr() << dendl; objecter.reset(new Objecter(cct, messenger.get(), &monc, &osdmap, - lock, timer)); + lock, timer, 0, 0)); assert(objecter.get() != NULL); objecter->set_balanced_budget(); diff -Nru ceph-0.67.4/src/test/osd/RadosModel.h ceph-0.67.7/src/test/osd/RadosModel.h --- ceph-0.67.4/src/test/osd/RadosModel.h 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/test/osd/RadosModel.h 2014-02-19 20:12:48.000000000 +0000 @@ -139,6 +139,7 @@ map > pool_obj_cont; set oid_in_use; set oid_not_in_use; + set snaps_in_use; int current_snap; string pool_name; librados::IoCtx io_ctx; @@ -1298,6 +1299,8 @@ } context->oid_in_use.insert(oid); context->oid_not_in_use.erase(oid); + context->snaps_in_use.insert(roll_back_to); + context->roll_back(oid, roll_back_to); uint64_t snap = context->snaps[roll_back_to]; @@ -1323,7 +1326,8 @@ Mutex::Locker l(context->state_lock); context->oid_in_use.erase(oid); context->oid_not_in_use.insert(oid); - } + context->snaps_in_use.erase(roll_back_to); + } } string getType() diff -Nru ceph-0.67.4/src/test/osd/TestRados.cc ceph-0.67.7/src/test/osd/TestRados.cc --- ceph-0.67.4/src/test/osd/TestRados.cc 2013-10-03 23:00:26.000000000 +0000 +++ ceph-0.67.7/src/test/osd/TestRados.cc 2014-02-19 20:12:48.000000000 +0000 @@ -119,10 +119,13 @@ } case TEST_OP_ROLLBACK: - if (context.snaps.empty()) { + if (context.snaps.size() <= context.snaps_in_use.size()) { return NULL; - } else { + } + while (true) { int snap = rand_choose(context.snaps)->first; + if (context.snaps_in_use.count(snap)) + continue; // in use; try again! string oid = *(rand_choose(context.oid_not_in_use)); cout << "RollingBack " << oid << " to " << snap << std::endl; return new RollbackOp(&context, oid, snap); diff -Nru ceph-0.67.4/src/test/test_striper.cc ceph-0.67.7/src/test/test_striper.cc --- ceph-0.67.4/src/test/test_striper.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/test/test_striper.cc 2014-02-19 20:12:47.000000000 +0000 @@ -26,6 +26,37 @@ ASSERT_EQ(94208u, ex[2].truncate_size); } +TEST(Striper, EmptyPartialResult) +{ + ceph_file_layout l; + memset(&l, 0, sizeof(l)); + + l.fl_object_size = 4194304; + l.fl_stripe_unit = 4194304; + l.fl_stripe_count = 1; + + vector ex; + Striper::file_to_extents(g_ceph_context, 1, &l, 725549056, 131072, 72554905600, ex); + cout << "ex " << ex << std::endl; + ASSERT_EQ(2u, ex.size()); + + Striper::StripedReadResult r; + + bufferlist bl; + r.add_partial_result(g_ceph_context, bl, ex[1].buffer_extents); + + bufferptr bp(65536); + bp.zero(); + bl.append(bp); + + r.add_partial_result(g_ceph_context, bl, ex[0].buffer_extents); + + bufferlist outbl; + r.assemble_result(g_ceph_context, outbl, false); + + ASSERT_EQ(65536u, outbl.length()); +} + int main(int argc, char **argv) diff -Nru ceph-0.67.4/src/tools/ceph-filestore-dump.cc ceph-0.67.7/src/tools/ceph-filestore-dump.cc --- ceph-0.67.4/src/tools/ceph-filestore-dump.cc 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/tools/ceph-filestore-dump.cc 2014-02-19 20:12:48.000000000 +0000 @@ -52,6 +52,32 @@ END_OF_TYPES, //Keep at the end }; +//#define INTERNAL_TEST +//#define INTERNAL_TEST2 + +#ifdef INTERNAL_TEST +CompatSet get_test_compat_set() { + CompatSet::FeatureSet ceph_osd_feature_compat; + CompatSet::FeatureSet ceph_osd_feature_ro_compat; + CompatSet::FeatureSet ceph_osd_feature_incompat; + ceph_osd_feature_incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_BASE); + ceph_osd_feature_incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_PGINFO); + ceph_osd_feature_incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_OLOC); + ceph_osd_feature_incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_LEC); + ceph_osd_feature_incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_CATEGORIES); + ceph_osd_feature_incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_HOBJECTPOOL); + ceph_osd_feature_incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_BIGINFO); + ceph_osd_feature_incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_LEVELDBINFO); + ceph_osd_feature_incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_LEVELDBLOG); +#ifdef INTERNAL_TEST2 + ceph_osd_feature_incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_SNAPMAPPER); + ceph_osd_feature_incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_SHARDS); +#endif + return CompatSet(ceph_osd_feature_compat, ceph_osd_feature_ro_compat, + ceph_osd_feature_incompat); +} +#endif + typedef uint8_t sectiontype_t; typedef uint32_t mymagic_t; typedef int64_t mysize_t; @@ -69,7 +95,7 @@ //can be added to the export format. struct super_header { static const uint32_t super_magic = (shortmagic << 16) | shortmagic; - static const uint32_t super_ver = 1; + static const uint32_t super_ver = 2; static const uint32_t FIXED_LENGTH = 16; uint32_t magic; uint32_t version; @@ -139,18 +165,25 @@ struct pg_begin { pg_t pgid; + OSDSuperblock superblock; - pg_begin(pg_t pg): pgid(pg) { } + pg_begin(pg_t pg, OSDSuperblock sb): + pgid(pg), superblock(sb) { } pg_begin() { } void encode(bufferlist& bl) const { - ENCODE_START(1, 1, bl); + // New super_ver prevents decode from ver 1 + ENCODE_START(2, 2, bl); ::encode(pgid, bl); + ::encode(superblock, bl); ENCODE_FINISH(bl); } void decode(bufferlist::iterator& bl) { - DECODE_START(1, bl); + DECODE_START(2, bl); ::decode(pgid, bl); + if (struct_v > 1) { + ::decode(superblock, bl); + } DECODE_FINISH(bl); } }; @@ -664,7 +697,7 @@ } int do_export(ObjectStore *fs, coll_t coll, pg_t pgid, pg_info_t &info, - epoch_t map_epoch, __u8 struct_ver) + epoch_t map_epoch, __u8 struct_ver, OSDSuperblock superblock) { PGLog::IndexedLog log; pg_missing_t missing; @@ -675,7 +708,7 @@ write_super(); - pg_begin pgb(pgid); + pg_begin pgb(pgid, superblock); ret = write_section(TYPE_PG_BEGIN, pgb, file_fd); if (ret) return ret; @@ -909,7 +942,7 @@ return 0; } -int do_import(ObjectStore *store) +int do_import(ObjectStore *store, OSDSuperblock sb) { bufferlist ebl; pg_info_t info; @@ -943,7 +976,16 @@ pg_begin pgb; pgb.decode(ebliter); pg_t pgid = pgb.pgid; - + + if (debug) { + cout << "Exported features: " << pgb.superblock.compat_features << std::endl; + } + if (sb.compat_features.compare(pgb.superblock.compat_features) == -1) { + cout << "Export has incompatible features set " + << pgb.superblock.compat_features << std::endl; + return 1; + } + log_oid = OSD::make_pg_log_oid(pgid); biginfo_oid = OSD::make_pg_biginfo_oid(pgid); @@ -1173,11 +1215,45 @@ int ret = 0; vector ls; vector::iterator it; + CompatSet supported; + +#ifdef INTERNAL_TEST + supported = get_test_compat_set(); +#else + supported = OSD::get_osd_compat_set(); +#endif + + bufferlist bl; + OSDSuperblock superblock; + bufferlist::iterator p; + ret = fs->read(coll_t::META_COLL, OSD_SUPERBLOCK_POBJECT, 0, 0, bl); + if (ret < 0) { + cout << "Failure to read OSD superblock error= " << r << std::endl; + goto out; + } + + p = bl.begin(); + ::decode(superblock, p); + +#ifdef INTERNAL_TEST2 + superblock.compat_features.incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_SHARDS); +#endif + + if (debug && file_fd != STDOUT_FILENO) { + cout << "Supported features: " << supported << std::endl; + cout << "On-disk features: " << superblock.compat_features << std::endl; + } + if (supported.compare(superblock.compat_features) == -1) { + cout << "On-disk OSD incompatible features set " + << superblock.compat_features << std::endl; + ret = EINVAL; + goto out; + } if (type == "import") { try { - ret = do_import(fs); + ret = do_import(fs, superblock); } catch (const buffer::error &e) { cout << "do_import threw exception error " << e.what() << std::endl; @@ -1260,7 +1336,7 @@ cerr << "struct_v " << (int)struct_ver << std::endl; if (type == "export") { - ret = do_export(fs, coll, pgid, info, map_epoch, struct_ver); + ret = do_export(fs, coll, pgid, info, map_epoch, struct_ver, superblock); } else if (type == "info") { formatter->open_object_section("info"); info.dump(formatter); diff -Nru ceph-0.67.4/src/upstart/ceph-mds-all-starter.conf ceph-0.67.7/src/upstart/ceph-mds-all-starter.conf --- ceph-0.67.4/src/upstart/ceph-mds-all-starter.conf 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/upstart/ceph-mds-all-starter.conf 2014-02-19 20:12:47.000000000 +0000 @@ -9,7 +9,7 @@ # TODO what's the valid charset for cluster names and mds ids? find -L /var/lib/ceph/mds/ -mindepth 1 -maxdepth 1 -regextype posix-egrep -regex '.*/[A-Za-z0-9]+-[A-Za-z0-9._-]+' -printf '%P\n' \ | while read f; do - if [ -e "/var/lib/ceph/mds/$f/done" ] && [ -e "/var/lib/ceph/mds/$f/upstart" ]; then + if [ -e "/var/lib/ceph/mds/$f/done" ] && [ -e "/var/lib/ceph/mds/$f/upstart" ] && [ ! -e "/var/lib/ceph/mds/$f/sysvinit" ]; then cluster="${f%%-*}" id="${f#*-}" initctl emit ceph-mds cluster="$cluster" id="$id" diff -Nru ceph-0.67.4/src/upstart/ceph-mon-all-starter.conf ceph-0.67.7/src/upstart/ceph-mon-all-starter.conf --- ceph-0.67.4/src/upstart/ceph-mon-all-starter.conf 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/upstart/ceph-mon-all-starter.conf 2014-02-19 20:12:47.000000000 +0000 @@ -9,7 +9,7 @@ # TODO what's the valid charset for cluster names and mon ids? find -L /var/lib/ceph/mon/ -mindepth 1 -maxdepth 1 -regextype posix-egrep -regex '.*/[A-Za-z0-9]+-[A-Za-z0-9._-]+' -printf '%P\n' \ | while read f; do - if [ -e "/var/lib/ceph/mon/$f/done" ] && [ -e "/var/lib/ceph/mon/$f/upstart" ]; then + if [ -e "/var/lib/ceph/mon/$f/done" ] && [ -e "/var/lib/ceph/mon/$f/upstart" ] && [ ! -e "/var/lib/ceph/mon/$f/sysvinit" ]; then cluster="${f%%-*}" id="${f#*-}" diff -Nru ceph-0.67.4/src/upstart/ceph-osd-all-starter.conf ceph-0.67.7/src/upstart/ceph-osd-all-starter.conf --- ceph-0.67.4/src/upstart/ceph-osd-all-starter.conf 2013-08-30 07:03:41.000000000 +0000 +++ ceph-0.67.7/src/upstart/ceph-osd-all-starter.conf 2014-02-19 20:12:47.000000000 +0000 @@ -13,7 +13,7 @@ # TODO what's the valid charset for cluster names and osd ids? find -L /var/lib/ceph/osd/ -mindepth 1 -maxdepth 1 -regextype posix-egrep -regex '.*/[A-Za-z0-9]+-[A-Za-z0-9._-]+' -printf '%P\n' \ | while read f; do - if [ -e "/var/lib/ceph/osd/$f/ready" ] && [ -e "/var/lib/ceph/osd/$f/upstart" ]; then + if [ -e "/var/lib/ceph/osd/$f/ready" ] && [ -e "/var/lib/ceph/osd/$f/upstart" ] && [ ! -e "/var/lib/ceph/osd/$f/sysvinit" ]; then cluster="${f%%-*}" id="${f#*-}" initctl emit ceph-osd cluster="$cluster" id="$id"