[jruby-joni] 24/194: rejigger tests

Hideki Yamane henrich at moszumanska.debian.org
Thu Feb 1 12:04:10 UTC 2018


This is an automated email from the git hooks/post-receive script.

henrich pushed a commit to branch debian/sid
in repository jruby-joni.

commit 95e5ebd622cc194b5a51cc3852a9fc42669070db
Author: Marcin Mielzynski <lopx at gazeta.pl>
Date:   Sat Dec 23 19:11:19 2017 +0100

    rejigger tests
---
 pom.xml                                 |   11 +-
 test/org/joni/test/Test.java            |   19 +-
 test/org/joni/test/TestA.java           | 1076 ++++++++++-----------
 test/org/joni/test/TestAU.java          |   52 -
 test/org/joni/test/TestC.java           | 1470 ++++++++++++++--------------
 test/org/joni/test/TestCornerCases.java |   16 +-
 test/org/joni/test/TestCrnl.java        |   18 +-
 test/org/joni/test/TestInterrupt.java   |   10 +-
 test/org/joni/test/TestJoni.java        |   84 --
 test/org/joni/test/TestLookBehind.java  |   54 --
 test/org/joni/test/TestNSU8.java        |  128 ++-
 test/org/joni/test/TestPerl.java        |   18 +-
 test/org/joni/test/TestU.java           | 1600 +++++++++++++++----------------
 test/org/joni/test/TestU8.java          |   20 +-
 14 files changed, 2185 insertions(+), 2391 deletions(-)

diff --git a/pom.xml b/pom.xml
index fb42c50..403312a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -71,7 +71,7 @@
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
-      <version>3.8.1</version>
+      <version>4.10</version>
       <scope>test</scope>
     </dependency>
     <dependency>
@@ -104,12 +104,7 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
-        <version>2.4.3</version>
-        <configuration>
-          <includes>
-            <include>**/TestJoni.java</include>
-          </includes>
-        </configuration>
+        <version>2.20.1</version>
       </plugin>
       <plugin>
         <artifactId>maven-jar-plugin</artifactId>
@@ -137,7 +132,7 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-javadoc-plugin</artifactId>
-        <version>2.8.1</version>
+        <version>2.9</version>
         <configuration>
           <show>private</show>
           <nohelp>true</nohelp>
diff --git a/test/org/joni/test/Test.java b/test/org/joni/test/Test.java
index b343f20..3f66337 100644
--- a/test/org/joni/test/Test.java
+++ b/test/org/joni/test/Test.java
@@ -19,15 +19,17 @@
  */
 package org.joni.test;
 
+import static org.junit.Assert.assertEquals;
+
 import java.io.UnsupportedEncodingException;
 
+import org.jcodings.Encoding;
 import org.joni.Config;
 import org.joni.Matcher;
 import org.joni.Option;
 import org.joni.Regex;
 import org.joni.Region;
 import org.joni.Syntax;
-import org.jcodings.Encoding;
 import org.joni.exception.JOniException;
 
 public abstract class Test {
@@ -127,7 +129,6 @@ public abstract class Test {
                 }
             }
         }
-        
         return r;
     }
     
@@ -292,17 +293,9 @@ public abstract class Test {
         }
     }
 
-    public void printResults() {
+    @org.junit.Test
+    public void test() throws Exception {
         Config.log.println("RESULT   SUCC: " + nsucc + ",  FAIL: " + nfail + ",  ERROR: " + nerror + " Test: " + getClass().getSimpleName() + ", Encoding: " + encoding());
+        assertEquals(0, nfail + nerror);
     }
-
-    public abstract void test() throws InterruptedException;
-
-    public final void run() {
-        try {
-          test();
-        } catch (InterruptedException ie) { }
-        printResults();
-    }
-
 }
diff --git a/test/org/joni/test/TestA.java b/test/org/joni/test/TestA.java
index de5e3b5..383062a 100644
--- a/test/org/joni/test/TestA.java
+++ b/test/org/joni/test/TestA.java
@@ -1,536 +1,540 @@
-/*
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is furnished to do
- * so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-package org.joni.test;
-
-import org.joni.Option;
-import org.joni.Syntax;
-import org.jcodings.Encoding;
-import org.jcodings.specific.ASCIIEncoding;
-
-public class TestA extends Test {
-
-    public int option() {
-        return Option.DEFAULT;
-    }
-
-    public Encoding encoding() {
-        return ASCIIEncoding.INSTANCE;
-    }
-
-    public String testEncoding() {
-        return "iso-8859-2";
-    }
-
-    public Syntax syntax() {
-        return Syntax.DEFAULT;
-    }
-
-    public void test() throws InterruptedException {
-        x2s("", "", 0, 0);
-        x2s("^", "", 0, 0);
-        x2s("$", "", 0, 0);
-        x2s("\\G", "", 0, 0);
-        x2s("\\A", "", 0, 0);
-        x2s("\\Z", "", 0, 0);
-        x2s("\\z", "", 0, 0);
-        x2s("^$", "", 0, 0);
-        x2s("\\ca", "\001", 0, 1);
-        x2s("\\C-b", "\002", 0, 1);
-        x2s("\\c\\\\", "\034", 0, 1);
-        x2s("q[\\c\\\\]", "q\034", 0, 2);
-        x2s("", "a", 0, 0);
-        x2s("a", "a", 0, 1);
-        x2s("\\x61", "a", 0, 1);
-        x2s("aa", "aa", 0, 2);
-        x2s("aaa", "aaa", 0, 3);
-        x2s("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 0, 35);
-        x2s("ab", "ab", 0, 2);
-        x2s("b", "ab", 1, 2);
-        x2s("bc", "abc", 1, 3);
-        x2s("(?i:#RET#)", "#INS##RET#", 5, 10);
-        x2s("\\17", "\017", 0, 1);
-        x2s("\\x1f", "\u001f", 0, 1);
-        x2s("\\xED\\xF2", "\u00ed\u0148", 0, 2);
-        x2s("a(?#....\\\\JJJJ)b", "ab", 0, 2);
-        x2s("(?x)  G (o O(?-x)oO) g L", "GoOoOgLe", 0, 7);
-        x2s(".", "a", 0, 1);
-        ns(".", "");
-        x2s("..", "ab", 0, 2);
-        x2s("\\w", "e", 0, 1);
-        ns("\\W", "e");
-        x2s("\\s", " ", 0, 1);
-        x2s("\\S", "b", 0, 1);
-        x2s("\\d", "4", 0, 1);
-        ns("\\D", "4");
-        x2s("\\b", "z ", 0, 0);
-        x2s("\\b", " z", 1, 1);
-        x2s("\\B", "zz ", 1, 1);
-        x2s("\\B", "z ", 2, 2);
-        x2s("\\B", " z", 0, 0);
-        x2s("[ab]", "b", 0, 1);
-        ns("[ab]", "c");
-        x2s("[a-z]", "t", 0, 1);
-        ns("[^a]", "a");
-        x2s("[^a]", "\n", 0, 1);
-        x2s("[]]", "]", 0, 1);
-        ns("[^]]", "]");
-        x2s("[\\^]+", "0^^1", 1, 3);
-        x2s("[b-]", "b", 0, 1);
-        x2s("[b-]", "-", 0, 1);
-        x2s("[\\w]", "z", 0, 1);
-        ns("[\\w]", " ");
-        x2s("[\\W]", "b$", 1, 2);
-        x2s("[\\d]", "5", 0, 1);
-        ns("[\\d]", "e");
-        x2s("[\\D]", "t", 0, 1);
-        ns("[\\D]", "3");
-        x2s("[\\s]", " ", 0, 1);
-        ns("[\\s]", "a");
-        x2s("[\\S]", "b", 0, 1);
-        ns("[\\S]", " ");
-        x2s("[\\w\\d]", "2", 0, 1);
-        ns("[\\w\\d]", " ");
-        x2s("[[:upper:]]", "B", 0, 1);
-        x2s("[*[:xdigit:]+]", "+", 0, 1);
-        x2s("[*[:xdigit:]+]", "GHIKK-9+*", 6, 7);
-        x2s("[*[:xdigit:]+]", "-@^+", 3, 4);
-        ns("[[:upper]]", "A");
-        x2s("[[:upper]]", ":", 0, 1);
-        x2s("[\\044-\\047]", "\046", 0, 1);
-        x2s("[\\x5a-\\x5c]", "\u005b", 0, 1);
-        x2s("[\\x6A-\\x6D]", "\u006c", 0, 1);
-        ns("[\\x6A-\\x6D]", "\u006e");
-        ns("^[0-9A-F]+ 0+ UNDEF ", "75F 00000000 SECT14A notype ()    External    | _rb_apply");
-        x2s("[\\[]", "[", 0, 1);
-        x2s("[\\]]", "]", 0, 1);
-        x2s("[&]", "&", 0, 1);
-        x2s("[[ab]]", "b", 0, 1);
-        x2s("[[ab]c]", "c", 0, 1);
-        ns("[[^a]]", "a");
-        ns("[^[a]]", "a");
-        x2s("[[ab]&&bc]", "b", 0, 1);
-        ns("[[ab]&&bc]", "a");
-        ns("[[ab]&&bc]", "c");
-        x2s("[a-z&&b-y&&c-x]", "w", 0, 1);
-        ns("[^a-z&&b-y&&c-x]", "w");
-        x2s("[[^a&&a]&&a-z]", "b", 0, 1);
-        ns("[[^a&&a]&&a-z]", "a");
-        x2s("[[^a-z&&bcdef]&&[^c-g]]", "h", 0, 1);
-        ns("[[^a-z&&bcdef]&&[^c-g]]", "c");
-        x2s("[^[^abc]&&[^cde]]", "c", 0, 1);
-        x2s("[^[^abc]&&[^cde]]", "e", 0, 1);
-        ns("[^[^abc]&&[^cde]]", "f");
-        x2s("[a-&&-a]", "-", 0, 1);
-        ns("[a\\-&&\\-a]", "&");
-        ns("\\wabc", " abc");
-        x2s("a\\Wbc", "a bc", 0, 4);
-        x2s("a.b.c", "aabbc", 0, 5);
-        x2s(".\\wb\\W..c", "abb bcc", 0, 7);
-        x2s("\\s\\wzzz", " zzzz", 0, 5);
-        x2s("aa.b", "aabb", 0, 4);
-        ns(".a", "ab");
-        x2s(".a", "aa", 0, 2);
-        x2s("^a", "a", 0, 1);
-        x2s("^a$", "a", 0, 1);
-        x2s("^\\w$", "a", 0, 1);
-        ns("^\\w$", " ");
-        x2s("^\\wab$", "zab", 0, 3);
-        x2s("^\\wabcdef$", "zabcdef", 0, 7);
-        x2s("^\\w...def$", "zabcdef", 0, 7);
-        x2s("\\w\\w\\s\\Waaa\\d", "aa  aaa4", 0, 8);
-        x2s("\\A\\Z", "", 0, 0);
-        x2s("\\Axyz", "xyz", 0, 3);
-        x2s("xyz\\Z", "xyz", 0, 3);
-        x2s("xyz\\z", "xyz", 0, 3);
-        x2s("a\\Z", "a", 0, 1);
-        x2s("\\Gaz", "az", 0, 2);
-        ns("\\Gz", "bza");
-        ns("az\\G", "az");
-        ns("az\\A", "az");
-        ns("a\\Az", "az");
-        x2s("\\^\\$", "^$", 0, 2);
-        x2s("^x?y", "xy", 0, 2);
-        x2s("^(x?y)", "xy", 0, 2);
-        x2s("\\w", "_", 0, 1);
-        ns("\\W", "_");
-        x2s("(?=z)z", "z", 0, 1);
-        ns("(?=z).", "a");
-        x2s("(?!z)a", "a", 0, 1);
-        ns("(?!z)a", "z");
-        x2s("(?i:a)", "a", 0, 1);
-        x2s("(?i:a)", "A", 0, 1);
-        x2s("(?i:A)", "a", 0, 1);
-        ns("(?i:A)", "b");
-        x2s("(?i:[A-Z])", "a", 0, 1);
-        x2s("(?i:[f-m])", "H", 0, 1);
-        x2s("(?i:[f-m])", "h", 0, 1);
-        ns("(?i:[f-m])", "e");
-        x2s("(?i:[A-c])", "D", 0, 1);
-        x2s("(?i:[!-k])", "Z", 0, 1);
-        x2s("(?i:[!-k])", "7", 0, 1);
-        x2s("(?i:[T-}])", "b", 0, 1);
-        x2s("(?i:[T-}])", "{", 0, 1);
-        x2s("(?i:\\?a)", "?A", 0, 2);
-        x2s("(?i:\\*A)", "*a", 0, 2);
-        ns(".", "\n");
-        x2s("(?m:.)", "\n", 0, 1);
-        x2s("(?m:a.)", "a\n", 0, 2);
-        x2s("(?m:.b)", "a\nb", 1, 3);
-        x2s(".*abc", "dddabdd\nddabc", 8, 13);
-        x2s("(?m:.*abc)", "dddabddabc", 0, 10);
-        ns("(?i)(?-i)a", "A");
-        ns("(?i)(?-i:a)", "A");
-        x2s("a?", "", 0, 0);
-        x2s("a?", "b", 0, 0);
-        x2s("a?", "a", 0, 1);
-        x2s("a*", "", 0, 0);
-        x2s("a*", "a", 0, 1);
-        x2s("a*", "aaa", 0, 3);
-        x2s("a*", "baaaa", 0, 0);
-        ns("a+", "");
-        x2s("a+", "a", 0, 1);
-        x2s("a+", "aaaa", 0, 4);
-        x2s("a+", "aabbb", 0, 2);
-        x2s("a+", "baaaa", 1, 5);
-        x2s(".?", "", 0, 0);
-        x2s(".?", "f", 0, 1);
-        x2s(".?", "\n", 0, 0);
-        x2s(".*", "", 0, 0);
-        x2s(".*", "abcde", 0, 5);
-        x2s(".+", "z", 0, 1);
-        x2s(".+", "zdswer\n", 0, 6);
-        x2s("(.*)a\\1f", "babfbac", 0, 4);
-        x2s("(.*)a\\1f", "bacbabf", 3, 7);
-        x2s("((.*)a\\2f)", "bacbabf", 3, 7);
-        x2s("(.*)a\\1f", "baczzzzzz\nbazz\nzzzzbabf", 19, 23);
-        x2s("a|b", "a", 0, 1);
-        x2s("a|b", "b", 0, 1);
-        x2s("|a", "a", 0, 0);
-        x2s("(|a)", "a", 0, 0);
-        x2s("ab|bc", "ab", 0, 2);
-        x2s("ab|bc", "bc", 0, 2);
-        x2s("z(?:ab|bc)", "zbc", 0, 3);
-        x2s("a(?:ab|bc)c", "aabc", 0, 4);
-        x2s("ab|(?:ac|az)", "az", 0, 2);
-        x2s("a|b|c", "dc", 1, 2);
-        x2s("a|b|cd|efg|h|ijk|lmn|o|pq|rstuvwx|yz", "pqr", 0, 2);
-        ns("a|b|cd|efg|h|ijk|lmn|o|pq|rstuvwx|yz", "mn");
-        x2s("a|^z", "ba", 1, 2);
-        x2s("a|^z", "za", 0, 1);
-        x2s("a|\\Gz", "bza", 2, 3);
-        x2s("a|\\Gz", "za", 0, 1);
-        x2s("a|\\Az", "bza", 2, 3);
-        x2s("a|\\Az", "za", 0, 1);
-        x2s("a|b\\Z", "ba", 1, 2);
-        x2s("a|b\\Z", "b", 0, 1);
-        x2s("a|b\\z", "ba", 1, 2);
-        x2s("a|b\\z", "b", 0, 1);
-        x2s("\\w|\\s", " ", 0, 1);
-        ns("\\w|\\w", " ");
-        x2s("\\w|%", "%", 0, 1);
-        x2s("\\w|[&$]", "&", 0, 1);
-        x2s("[b-d]|[^e-z]", "a", 0, 1);
-        x2s("(?:a|[c-f])|bz", "dz", 0, 1);
-        x2s("(?:a|[c-f])|bz", "bz", 0, 2);
-        x2s("abc|(?=zz)..f", "zzf", 0, 3);
-        x2s("abc|(?!zz)..f", "abf", 0, 3);
-        x2s("(?=za)..a|(?=zz)..a", "zza", 0, 3);
-        ns("(?>a|abd)c", "abdc");
-        x2s("(?>abd|a)c", "abdc", 0, 4);
-        x2s("a?|b", "a", 0, 1);
-        x2s("a?|b", "b", 0, 0);
-        x2s("a?|b", "", 0, 0);
-        x2s("a*|b", "aa", 0, 2);
-        x2s("a*|b*", "ba", 0, 0);
-        x2s("a*|b*", "ab", 0, 1);
-        x2s("a+|b*", "", 0, 0);
-        x2s("a+|b*", "bbb", 0, 3);
-        x2s("a+|b*", "abbb", 0, 1);
-        ns("a+|b+", "");
-        x2s("(a|b)?", "b", 0, 1);
-        x2s("(a|b)*", "ba", 0, 2);
-        x2s("(a|b)+", "bab", 0, 3);
-        x2s("(ab|ca)+", "caabbc", 0, 4);
-        x2s("(ab|ca)+", "aabca", 1, 5);
-        x2s("(ab|ca)+", "abzca", 0, 2);
-        x2s("(a|bab)+", "ababa", 0, 5);
-        x2s("(a|bab)+", "ba", 1, 2);
-        x2s("(a|bab)+", "baaaba", 1, 4);
-        x2s("(?:a|b)(?:a|b)", "ab", 0, 2);
-        x2s("(?:a*|b*)(?:a*|b*)", "aaabbb", 0, 3);
-        x2s("(?:a*|b*)(?:a+|b+)", "aaabbb", 0, 6);
-        x2s("(?:a+|b+){2}", "aaabbb", 0, 6);
-        x2s("h{0,}", "hhhh", 0, 4);
-        x2s("(?:a+|b+){1,2}", "aaabbb", 0, 6);
-        ns("ax{2}*a", "0axxxa1");
-        ns("a.{0,2}a", "0aXXXa0");
-        ns("a.{0,2}?a", "0aXXXa0");
-        ns("a.{0,2}?a", "0aXXXXa0");
-        x2s("^a{2,}?a$", "aaa", 0, 3);
-        x2s("^[a-z]{2,}?$", "aaa", 0, 3);
-        x2s("(?:a+|\\Ab*)cc", "cc", 0, 2);
-        ns("(?:a+|\\Ab*)cc", "abcc");
-        x2s("(?:^a+|b+)*c", "aabbbabc", 6, 8);
-        x2s("(?:^a+|b+)*c", "aabbbbc", 0, 7);
-        x2s("a|(?i)c", "C", 0, 1);
-        x2s("(?i)c|a", "C", 0, 1);
-        x2s("(?i)c|a", "A", 0, 1);
-        x2s("(?i:c)|a", "C", 0, 1);
-        ns("(?i:c)|a", "A");
-        x2s("[abc]?", "abc", 0, 1);
-        x2s("[abc]*", "abc", 0, 3);
-        x2s("[^abc]*", "abc", 0, 0);
-        ns("[^abc]+", "abc");
-        x2s("a??", "aaa", 0, 0);
-        x2s("ba??b", "bab", 0, 3);
-        x2s("a*?", "aaa", 0, 0);
-        x2s("ba*?", "baa", 0, 1);
-        x2s("ba*?b", "baab", 0, 4);
-        x2s("a+?", "aaa", 0, 1);
-        x2s("ba+?", "baa", 0, 2);
-        x2s("ba+?b", "baab", 0, 4);
-        x2s("(?:a?)??", "a", 0, 0);
-        x2s("(?:a??)?", "a", 0, 0);
-        x2s("(?:a?)+?", "aaa", 0, 1);
-        x2s("(?:a+)??", "aaa", 0, 0);
-        x2s("(?:a+)??b", "aaab", 0, 4);
-        x2s("(?:ab)?{2}", "", 0, 0);
-        x2s("(?:ab)?{2}", "ababa", 0, 4);
-        x2s("(?:ab)*{0}", "ababa", 0, 0);
-        x2s("(?:ab){3,}", "abababab", 0, 8);
-        ns("(?:ab){3,}", "abab");
-        x2s("(?:ab){2,4}", "ababab", 0, 6);
-        x2s("(?:ab){2,4}", "ababababab", 0, 8);
-        x2s("(?:ab){2,4}?", "ababababab", 0, 4);
-        x2s("(?:ab){,}", "ab{,}", 0, 5);
-        x2s("(?:abc)+?{2}", "abcabcabc", 0, 6);
-        x2s("(?:X*)(?i:xa)", "XXXa", 0, 4);
-        x2s("(d+)([^abc]z)", "dddz", 0, 4);
-        x2s("([^abc]*)([^abc]z)", "dddz", 0, 4);
-        x2s("(\\w+)(\\wz)", "dddz", 0, 4);
-        x3s("(a)", "a", 0, 1, 1);
-        x3s("(ab)", "ab", 0, 2, 1);
-        x2s("((ab))", "ab", 0, 2);
-        x3s("((ab))", "ab", 0, 2, 1);
-        x3s("((ab))", "ab", 0, 2, 2);
-        x3s("((((((((((((((((((((ab))))))))))))))))))))", "ab", 0, 2, 20);
-        x3s("(ab)(cd)", "abcd", 0, 2, 1);
-        x3s("(ab)(cd)", "abcd", 2, 4, 2);
-        x3s("()(a)bc(def)ghijk", "abcdefghijk", 3, 6, 3);
-        x3s("(()(a)bc(def)ghijk)", "abcdefghijk", 3, 6, 4);
-        x2s("(^a)", "a", 0, 1);
-        x3s("(a)|(a)", "ba", 1, 2, 1);
-        x3s("(^a)|(a)", "ba", 1, 2, 2);
-        x3s("(a?)", "aaa", 0, 1, 1);
-        x3s("(a*)", "aaa", 0, 3, 1);
-        x3s("(a*)", "", 0, 0, 1);
-        x3s("(a+)", "aaaaaaa", 0, 7, 1);
-        x3s("(a+|b*)", "bbbaa", 0, 3, 1);
-        x3s("(a+|b?)", "bbbaa", 0, 1, 1);
-        x3s("(abc)?", "abc", 0, 3, 1);
-        x3s("(abc)*", "abc", 0, 3, 1);
-        x3s("(abc)+", "abc", 0, 3, 1);
-        x3s("(xyz|abc)+", "abc", 0, 3, 1);
-        x3s("([xyz][abc]|abc)+", "abc", 0, 3, 1);
-        x3s("((?i:abc))", "AbC", 0, 3, 1);
-        x2s("(abc)(?i:\\1)", "abcABC", 0, 6);
-        x3s("((?m:a.c))", "a\nc", 0, 3, 1);
-        x3s("((?=az)a)", "azb", 0, 1, 1);
-        x3s("abc|(.abd)", "zabd", 0, 4, 1);
-        x2s("(?:abc)|(ABC)", "abc", 0, 3);
-        x3s("(?i:(abc))|(zzz)", "ABC", 0, 3, 1);
-        x3s("a*(.)", "aaaaz", 4, 5, 1);
-        x3s("a*?(.)", "aaaaz", 0, 1, 1);
-        x3s("a*?(c)", "aaaac", 4, 5, 1);
-        x3s("[bcd]a*(.)", "caaaaz", 5, 6, 1);
-        x3s("(\\Abb)cc", "bbcc", 0, 2, 1);
-        ns("(\\Abb)cc", "zbbcc");
-        x3s("(^bb)cc", "bbcc", 0, 2, 1);
-        ns("(^bb)cc", "zbbcc");
-        x3s("cc(bb$)", "ccbb", 2, 4, 1);
-        ns("cc(bb$)", "ccbbb");
-        ns("(\\1)", "");
-        ns("\\1(a)", "aa");
-        ns("(a(b)\\1)\\2+", "ababb");
-        ns("(?:(?:\\1|z)(a))+$", "zaa");
-        x2s("(?:(?:\\1|z)(a))+$", "zaaa", 0, 4);
-        x2s("(a)(?=\\1)", "aa", 0, 1);
-        ns("(a)$|\\1", "az");
-        x2s("(a)\\1", "aa", 0, 2);
-        ns("(a)\\1", "ab");
-        x2s("(a?)\\1", "aa", 0, 2);
-        x2s("(a??)\\1", "aa", 0, 0);
-        x2s("(a*)\\1", "aaaaa", 0, 4);
-        x3s("(a*)\\1", "aaaaa", 0, 2, 1);
-        x2s("a(b*)\\1", "abbbb", 0, 5);
-        x2s("a(b*)\\1", "ab", 0, 1);
-        x2s("(a*)(b*)\\1\\2", "aaabbaaabb", 0, 10);
-        x2s("(a*)(b*)\\2", "aaabbbb", 0, 7);
-        x2s("(((((((a*)b))))))c\\7", "aaabcaaa", 0, 8);
-        x3s("(((((((a*)b))))))c\\7", "aaabcaaa", 0, 3, 7);
-        x2s("(a)(b)(c)\\2\\1\\3", "abcbac", 0, 6);
-        x2s("([a-d])\\1", "cc", 0, 2);
-        x2s("(\\w\\d\\s)\\1", "f5 f5 ", 0, 6);
-        ns("(\\w\\d\\s)\\1", "f5 f5");
-        x2s("(who|[a-c]{3})\\1", "whowho", 0, 6);
-        x2s("...(who|[a-c]{3})\\1", "abcwhowho", 0, 9);
-        x2s("(who|[a-c]{3})\\1", "cbccbc", 0, 6);
-        x2s("(^a)\\1", "aa", 0, 2);
-        ns("(^a)\\1", "baa");
-        ns("(a$)\\1", "aa");
-        ns("(ab\\Z)\\1", "ab");
-        x2s("(a*\\Z)\\1", "a", 1, 1);
-        x2s(".(a*\\Z)\\1", "ba", 1, 2);
-        x3s("(.(abc)\\2)", "zabcabc", 0, 7, 1);
-        x3s("(.(..\\d.)\\2)", "z12341234", 0, 9, 1);
-        x2s("((?i:az))\\1", "AzAz", 0, 4);
-        ns("((?i:az))\\1", "Azaz");
-        x2s("(?<=a)b", "ab", 1, 2);
-        ns("(?<=a)b", "bb");
-        x2s("(?<=a|b)b", "bb", 1, 2);
-        x2s("(?<=a|bc)b", "bcb", 2, 3);
-        x2s("(?<=a|bc)b", "ab", 1, 2);
-        x2s("(?<=a|bc||defghij|klmnopq|r)z", "rz", 1, 2);
-        x2s("(a)\\g<1>", "aa", 0, 2);
-        x2s("(?<!a)b", "cb", 1, 2);
-        ns("(?<!a)b", "ab");
-        x2s("(?<!a|bc)b", "bbb", 0, 1);
-        ns("(?<!a|bc)z", "bcz");
-        x2s("(?<name1>a)", "a", 0, 1);
-        x2s("(?<name_2>ab)\\g<name_2>", "abab", 0, 4);
-        x2s("(?<name_3>.zv.)\\k<name_3>", "azvbazvb", 0, 8);
-        x2s("(?<=\\g<ab>)|-\\zEND (?<ab>XyZ)", "XyZ", 3, 3);
-        x2s("(?<n>|a\\g<n>)+", "", 0, 0);
-        x2s("(?<n>|\\(\\g<n>\\))+$", "()(())", 0, 6);
-        x3s("\\g<n>(?<n>.){0}", "X", 0, 1, 1);
-        x2s("\\g<n>(abc|df(?<n>.YZ){2,8}){0}", "XYZ", 0, 3);
-        x2s("\\A(?<n>(a\\g<n>)|)\\z", "aaaa", 0, 4);
-        x2s("(?<n>|\\g<m>\\g<n>)\\z|\\zEND (?<m>a|(b)\\g<m>)", "bbbbabba", 0, 8);
-        x2s("(?<name1240>\\w+\\sx)a+\\k<name1240>", "  fg xaaaaaaaafg x", 2, 18);
-        x3s("(z)()()(?<_9>a)\\g<_9>", "zaa", 2, 3, 1);
-        x2s("(.)(((?<_>a)))\\k<_>", "zaa", 0, 3);
-        x2s("((?<name1>\\d)|(?<name2>\\w))(\\k<name1>|\\k<name2>)", "ff", 0, 2);
-        x2s("(?:(?<x>)|(?<x>efg))\\k<x>", "", 0, 0);
-        x2s("(?:(?<x>abc)|(?<x>efg))\\k<x>", "abcefgefg", 3, 9);
-        ns("(?:(?<x>abc)|(?<x>efg))\\k<x>", "abcefg");
-        x2s("(?:(?<n1>.)|(?<n1>..)|(?<n1>...)|(?<n1>....)|(?<n1>.....)|(?<n1>......)|(?<n1>.......)|(?<n1>........)|(?<n1>.........)|(?<n1>..........)|(?<n1>...........)|(?<n1>............)|(?<n1>.............)|(?<n1>..............))\\k<n1>$", "a-pyumpyum", 2, 10);
-        x3s("(?:(?<n1>.)|(?<n1>..)|(?<n1>...)|(?<n1>....)|(?<n1>.....)|(?<n1>......)|(?<n1>.......)|(?<n1>........)|(?<n1>.........)|(?<n1>..........)|(?<n1>...........)|(?<n1>............)|(?<n1>.............)|(?<n1>..............))\\k<n1>$", "xxxxabcdefghijklmnabcdefghijklmn", 4, 18, 14);
-        x3s("(?<name1>)(?<name2>)(?<name3>)(?<name4>)(?<name5>)(?<name6>)(?<name7>)(?<name8>)(?<name9>)(?<name10>)(?<name11>)(?<name12>)(?<name13>)(?<name14>)(?<name15>)(?<name16>aaa)(?<name17>)$", "aaa", 0, 3, 16);
-        x2s("(?<foo>a|\\(\\g<foo>\\))", "a", 0, 1);
-        x2s("(?<foo>a|\\(\\g<foo>\\))", "((((((a))))))", 0, 13);
-        x3s("(?<foo>a|\\(\\g<foo>\\))", "((((((((a))))))))", 0, 17, 1);
-        x2s("\\g<bar>|\\zEND(?<bar>.*abc$)", "abcxxxabc", 0, 9);
-        x2s("\\g<1>|\\zEND(.a.)", "bac", 0, 3);
-        x3s("\\g<_A>\\g<_A>|\\zEND(.a.)(?<_A>.b.)", "xbxyby", 3, 6, 1);
-        x2s("\\A(?:\\g<pon>|\\g<pan>|\\zEND  (?<pan>a|c\\g<pon>c)(?<pon>b|d\\g<pan>d))$", "cdcbcdc", 0, 7);
-        x2s("\\A(?<n>|a\\g<m>)\\z|\\zEND (?<m>\\g<n>)", "aaaa", 0, 4);
-        x2s("(?<n>(a|b\\g<n>c){3,5})", "baaaaca", 1, 5);
-        x2s("(?<n>(a|b\\g<n>c){3,5})", "baaaacaaaaa", 0, 10);
-        x2s("(?<pare>\\(([^\\(\\)]++|\\g<pare>)*+\\))", "((a))", 0, 5);
-        x2s("()*\\1", "", 0, 0);
-        x2s("(?:()|())*\\1\\2", "", 0, 0);
-        x3s("(?:\\1a|())*", "a", 0, 0, 1);
-        x2s("x((.)*)*x", "0x1x2x3", 1, 6);
-        x2s("x((.)*)*x(?i:\\1)\\Z", "0x1x2x1X2", 1, 9);
-        x2s("(?:()|()|()|()|()|())*\\2\\5", "", 0, 0);
-        x2s("(?:()|()|()|(x)|()|())*\\2b\\5", "b", 0, 1);
-
-        x3s("\\A(?<a>|.|(?:(?<b>.)\\g<a>\\k<b+0>))\\z", "reer", 0, 4, 1);
-        x3s("(?-i:\\g<name>)(?i:(?<name>a)){0}", "A", 0, 1, 1);
-
-        String pat =
-            "(?<element> \\g<stag> \\g<content>* \\g<etag> ){0}" +
-            "(?<stag> < \\g<name> \\s* > ){0}" +
-            "(?<name> [a-zA-Z_:]+ ){0}" +
-            "(?<content> [^<&]+ (\\g<element> | [^<&]+)* ){0}" +
-            "(?<etag> </ \\k<name+1> >){0}" +
-            "\\g<element>";
-
-        String str = "<foo>f<bar>bbb</bar>f</foo>";
-
-        x3s(pat, str, 0, 27, 0, Option.EXTEND);
-        x3s(pat, str, 0, 27, 1, Option.EXTEND);
-        x3s(pat, str, 6, 11, 2, Option.EXTEND);
-        x3s(pat, str, 7, 10, 3, Option.EXTEND);
-        x3s(pat, str, 5, 21, 4, Option.EXTEND);
-        x3s(pat, str, 21, 27, 5, Option.EXTEND);
-
-        x2s("(a)b\\k<1>", "aba", 0, 3);
-        x2s("^(?>(?=a)(a|))++$", "a", 0, 1);
-        x2s("\\k", "k", 0, 1);
-        x2s("\\kx", "kx", 0, 2);
-        x2s("\\g", "g", 0, 1);
-        x2s("\\gx", "gx", 0, 2);
-        x2s("\\k\\g", "kg", 0, 2);
-        ns("\\00", "00");
-        ns("\\70", "70");
-        x2s("\\80", "80", 0, 2);
-        x2s("\\90", "90", 0, 2);
-
-        ns("(?<!b|aa)c", "Aac", Option.IGNORECASE);
-        x2s("(?<!b|aa)", "Aac", 0, 0, Option.IGNORECASE);
-        x2s("(?<=b|aa)c", "Aac", 2, 3, Option.IGNORECASE);
-        x2s("(?<=b|aa)", "Aac", 2, 2, Option.IGNORECASE);
-
-        ns("\\A[a-f&&[^b-c]&&[^e]]\\z", "e");
-        ns("[[^a]&&e&&[^e]]", "e");
-
-        x2s("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 0, 35, Option.IGNORECASE);
-        x2s("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 0, 35, Option.IGNORECASE);
-        x2s("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAA", 0, 35, Option.IGNORECASE);
-
-        x2s("(?mix)", "", 0, 0);
-
-        x2s("(?<=\\babc)d", " abcd", 4, 5);
-        x2s("(?<=\\Babc)d", "aabcd", 4, 5);
-        x2s("([^\\s]+),(.*)+", " xxxx,         xxx xxxxxx xxxxxxxxx xxxxxxx, xxxx xxxxx xxxxx ", 1, 62);
-        x2s(",(.*)+", " xxxx,         xxx xxxxxx xxxxxxxxx xxxxxxx, xxxx xxxxx xxxxx ", 5, 62);
-
-        x2s("(?:(a)|(b))(?(1)cd)e", "acde", 0, 4);
-        ns("(?:(a)|(b))(?(1)cd)e", "ae");
-        x2s("(?:(a)|(b))(?(2)cd)e", "ae", 0, 2);
-        ns("(?:(a)|(b))(?(2)cd)e", "acde");
-        x2s("(?:(a)|(b))(?(1)c|d)", "ac", 0, 2);
-        x2s("(?:(a)|(b))(?(1)c|d)", "bd", 0, 2);
-        ns("(?:(a)|(b))(?(1)c|d)", "ad");
-        ns("(?:(a)|(b))(?(1)c|d)", "bc");
-        x2s("(?:(a)|(b))(?:(?(1)cd)e|fg)", "acde", 0, 4);
-        x2s("(?:(a)|(b))(?:(?(1)cd|x)e|fg)", "bxe", 0, 3);
-        ns("(?:(a)|(b))(?:(?(2)cd|x)e|fg)", "bxe");
-        x2s("(?:(?<x>a)|(?<y>b))(?:(?(<x>)cd|x)e|fg)", "bxe", 0, 3);
-        ns("(?:(?<x>a)|(?<y>b))(?:(?(<y>)cd|x)e|fg)", "bxe");
-        x2s("((?<=a))?(?(1)b|c)", "abc", 1, 2);
-        x2s("((?<=a))?(?(1)b|c)", "bc", 1, 2);
-        x2s("((?<x>x)|(?<y>y))(?(<x>)y|x)", "xy", 0, 2);
-        x2s("((?<x>x)|(?<y>y))(?(<x>)y|x)", "yx", 0, 2);
-        ns("((?<x>x)|(?<y>y))(?(<x>)y|x)", "xx");
-        ns("((?<x>x)|(?<y>y))(?(<x>)y|x)", "yy");
-
-        x2s("\\R", "\n", 0, 1);
-        x2s("\\R", "\r", 0, 1);
-        x2s("\\R{3}", "\r\r\n\n", 0, 4);
-
-        x2s("\\X{5}", "あいab\n", 0, 5);
-    }
-
-    public static void main(String[] args) throws Throwable{
-        new TestA().run();
-    }
-}
+/*
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is furnished to do
+ * so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+package org.joni.test;
+
+import org.jcodings.Encoding;
+import org.jcodings.specific.ASCIIEncoding;
+import org.joni.Option;
+import org.joni.Syntax;
+
+public class TestA extends Test {
+	@Override
+    public int option() {
+        return Option.DEFAULT;
+    }
+
+    @Override
+    public Encoding encoding() {
+        return ASCIIEncoding.INSTANCE;
+    }
+
+    @Override
+    public String testEncoding() {
+        return "iso-8859-2";
+    }
+
+    @Override
+    public Syntax syntax() {
+        return Syntax.DEFAULT;
+    }
+
+    @Override
+    public void test() throws Exception {
+        x2s("", "", 0, 0);
+        x2s("^", "", 0, 0);
+        x2s("$", "", 0, 0);
+        x2s("\\G", "", 0, 0);
+        x2s("\\A", "", 0, 0);
+        x2s("\\Z", "", 0, 0);
+        x2s("\\z", "", 0, 0);
+        x2s("^$", "", 0, 0);
+        x2s("\\ca", "\001", 0, 1);
+        x2s("\\C-b", "\002", 0, 1);
+        x2s("\\c\\\\", "\034", 0, 1);
+        x2s("q[\\c\\\\]", "q\034", 0, 2);
+        x2s("", "a", 0, 0);
+        x2s("a", "a", 0, 1);
+        x2s("\\x61", "a", 0, 1);
+        x2s("aa", "aa", 0, 2);
+        x2s("aaa", "aaa", 0, 3);
+        x2s("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 0, 35);
+        x2s("ab", "ab", 0, 2);
+        x2s("b", "ab", 1, 2);
+        x2s("bc", "abc", 1, 3);
+        x2s("(?i:#RET#)", "#INS##RET#", 5, 10);
+        x2s("\\17", "\017", 0, 1);
+        x2s("\\x1f", "\u001f", 0, 1);
+        x2s("\\xED\\xF2", "\u00ed\u0148", 0, 2);
+        x2s("a(?#....\\\\JJJJ)b", "ab", 0, 2);
+        x2s("(?x)  G (o O(?-x)oO) g L", "GoOoOgLe", 0, 7);
+        x2s(".", "a", 0, 1);
+        ns(".", "");
+        x2s("..", "ab", 0, 2);
+        x2s("\\w", "e", 0, 1);
+        ns("\\W", "e");
+        x2s("\\s", " ", 0, 1);
+        x2s("\\S", "b", 0, 1);
+        x2s("\\d", "4", 0, 1);
+        ns("\\D", "4");
+        x2s("\\b", "z ", 0, 0);
+        x2s("\\b", " z", 1, 1);
+        x2s("\\B", "zz ", 1, 1);
+        x2s("\\B", "z ", 2, 2);
+        x2s("\\B", " z", 0, 0);
+        x2s("[ab]", "b", 0, 1);
+        ns("[ab]", "c");
+        x2s("[a-z]", "t", 0, 1);
+        ns("[^a]", "a");
+        x2s("[^a]", "\n", 0, 1);
+        x2s("[]]", "]", 0, 1);
+        ns("[^]]", "]");
+        x2s("[\\^]+", "0^^1", 1, 3);
+        x2s("[b-]", "b", 0, 1);
+        x2s("[b-]", "-", 0, 1);
+        x2s("[\\w]", "z", 0, 1);
+        ns("[\\w]", " ");
+        x2s("[\\W]", "b$", 1, 2);
+        x2s("[\\d]", "5", 0, 1);
+        ns("[\\d]", "e");
+        x2s("[\\D]", "t", 0, 1);
+        ns("[\\D]", "3");
+        x2s("[\\s]", " ", 0, 1);
+        ns("[\\s]", "a");
+        x2s("[\\S]", "b", 0, 1);
+        ns("[\\S]", " ");
+        x2s("[\\w\\d]", "2", 0, 1);
+        ns("[\\w\\d]", " ");
+        x2s("[[:upper:]]", "B", 0, 1);
+        x2s("[*[:xdigit:]+]", "+", 0, 1);
+        x2s("[*[:xdigit:]+]", "GHIKK-9+*", 6, 7);
+        x2s("[*[:xdigit:]+]", "-@^+", 3, 4);
+        ns("[[:upper]]", "A");
+        x2s("[[:upper]]", ":", 0, 1);
+        x2s("[\\044-\\047]", "\046", 0, 1);
+        x2s("[\\x5a-\\x5c]", "\u005b", 0, 1);
+        x2s("[\\x6A-\\x6D]", "\u006c", 0, 1);
+        ns("[\\x6A-\\x6D]", "\u006e");
+        ns("^[0-9A-F]+ 0+ UNDEF ", "75F 00000000 SECT14A notype ()    External    | _rb_apply");
+        x2s("[\\[]", "[", 0, 1);
+        x2s("[\\]]", "]", 0, 1);
+        x2s("[&]", "&", 0, 1);
+        x2s("[[ab]]", "b", 0, 1);
+        x2s("[[ab]c]", "c", 0, 1);
+        ns("[[^a]]", "a");
+        ns("[^[a]]", "a");
+        x2s("[[ab]&&bc]", "b", 0, 1);
+        ns("[[ab]&&bc]", "a");
+        ns("[[ab]&&bc]", "c");
+        x2s("[a-z&&b-y&&c-x]", "w", 0, 1);
+        ns("[^a-z&&b-y&&c-x]", "w");
+        x2s("[[^a&&a]&&a-z]", "b", 0, 1);
+        ns("[[^a&&a]&&a-z]", "a");
+        x2s("[[^a-z&&bcdef]&&[^c-g]]", "h", 0, 1);
+        ns("[[^a-z&&bcdef]&&[^c-g]]", "c");
+        x2s("[^[^abc]&&[^cde]]", "c", 0, 1);
+        x2s("[^[^abc]&&[^cde]]", "e", 0, 1);
+        ns("[^[^abc]&&[^cde]]", "f");
+        x2s("[a-&&-a]", "-", 0, 1);
+        ns("[a\\-&&\\-a]", "&");
+        ns("\\wabc", " abc");
+        x2s("a\\Wbc", "a bc", 0, 4);
+        x2s("a.b.c", "aabbc", 0, 5);
+        x2s(".\\wb\\W..c", "abb bcc", 0, 7);
+        x2s("\\s\\wzzz", " zzzz", 0, 5);
+        x2s("aa.b", "aabb", 0, 4);
+        ns(".a", "ab");
+        x2s(".a", "aa", 0, 2);
+        x2s("^a", "a", 0, 1);
+        x2s("^a$", "a", 0, 1);
+        x2s("^\\w$", "a", 0, 1);
+        ns("^\\w$", " ");
+        x2s("^\\wab$", "zab", 0, 3);
+        x2s("^\\wabcdef$", "zabcdef", 0, 7);
+        x2s("^\\w...def$", "zabcdef", 0, 7);
+        x2s("\\w\\w\\s\\Waaa\\d", "aa  aaa4", 0, 8);
+        x2s("\\A\\Z", "", 0, 0);
+        x2s("\\Axyz", "xyz", 0, 3);
+        x2s("xyz\\Z", "xyz", 0, 3);
+        x2s("xyz\\z", "xyz", 0, 3);
+        x2s("a\\Z", "a", 0, 1);
+        x2s("\\Gaz", "az", 0, 2);
+        ns("\\Gz", "bza");
+        ns("az\\G", "az");
+        ns("az\\A", "az");
+        ns("a\\Az", "az");
+        x2s("\\^\\$", "^$", 0, 2);
+        x2s("^x?y", "xy", 0, 2);
+        x2s("^(x?y)", "xy", 0, 2);
+        x2s("\\w", "_", 0, 1);
+        ns("\\W", "_");
+        x2s("(?=z)z", "z", 0, 1);
+        ns("(?=z).", "a");
+        x2s("(?!z)a", "a", 0, 1);
+        ns("(?!z)a", "z");
+        x2s("(?i:a)", "a", 0, 1);
+        x2s("(?i:a)", "A", 0, 1);
+        x2s("(?i:A)", "a", 0, 1);
+        ns("(?i:A)", "b");
+        x2s("(?i:[A-Z])", "a", 0, 1);
+        x2s("(?i:[f-m])", "H", 0, 1);
+        x2s("(?i:[f-m])", "h", 0, 1);
+        ns("(?i:[f-m])", "e");
+        x2s("(?i:[A-c])", "D", 0, 1);
+        x2s("(?i:[!-k])", "Z", 0, 1);
+        x2s("(?i:[!-k])", "7", 0, 1);
+        x2s("(?i:[T-}])", "b", 0, 1);
+        x2s("(?i:[T-}])", "{", 0, 1);
+        x2s("(?i:\\?a)", "?A", 0, 2);
+        x2s("(?i:\\*A)", "*a", 0, 2);
+        ns(".", "\n");
+        x2s("(?m:.)", "\n", 0, 1);
+        x2s("(?m:a.)", "a\n", 0, 2);
+        x2s("(?m:.b)", "a\nb", 1, 3);
+        x2s(".*abc", "dddabdd\nddabc", 8, 13);
+        x2s("(?m:.*abc)", "dddabddabc", 0, 10);
+        ns("(?i)(?-i)a", "A");
+        ns("(?i)(?-i:a)", "A");
+        x2s("a?", "", 0, 0);
+        x2s("a?", "b", 0, 0);
+        x2s("a?", "a", 0, 1);
+        x2s("a*", "", 0, 0);
+        x2s("a*", "a", 0, 1);
+        x2s("a*", "aaa", 0, 3);
+        x2s("a*", "baaaa", 0, 0);
+        ns("a+", "");
+        x2s("a+", "a", 0, 1);
+        x2s("a+", "aaaa", 0, 4);
+        x2s("a+", "aabbb", 0, 2);
+        x2s("a+", "baaaa", 1, 5);
+        x2s(".?", "", 0, 0);
+        x2s(".?", "f", 0, 1);
+        x2s(".?", "\n", 0, 0);
+        x2s(".*", "", 0, 0);
+        x2s(".*", "abcde", 0, 5);
+        x2s(".+", "z", 0, 1);
+        x2s(".+", "zdswer\n", 0, 6);
+        x2s("(.*)a\\1f", "babfbac", 0, 4);
+        x2s("(.*)a\\1f", "bacbabf", 3, 7);
+        x2s("((.*)a\\2f)", "bacbabf", 3, 7);
+        x2s("(.*)a\\1f", "baczzzzzz\nbazz\nzzzzbabf", 19, 23);
+        x2s("a|b", "a", 0, 1);
+        x2s("a|b", "b", 0, 1);
+        x2s("|a", "a", 0, 0);
+        x2s("(|a)", "a", 0, 0);
+        x2s("ab|bc", "ab", 0, 2);
+        x2s("ab|bc", "bc", 0, 2);
+        x2s("z(?:ab|bc)", "zbc", 0, 3);
+        x2s("a(?:ab|bc)c", "aabc", 0, 4);
+        x2s("ab|(?:ac|az)", "az", 0, 2);
+        x2s("a|b|c", "dc", 1, 2);
+        x2s("a|b|cd|efg|h|ijk|lmn|o|pq|rstuvwx|yz", "pqr", 0, 2);
+        ns("a|b|cd|efg|h|ijk|lmn|o|pq|rstuvwx|yz", "mn");
+        x2s("a|^z", "ba", 1, 2);
+        x2s("a|^z", "za", 0, 1);
+        x2s("a|\\Gz", "bza", 2, 3);
+        x2s("a|\\Gz", "za", 0, 1);
+        x2s("a|\\Az", "bza", 2, 3);
+        x2s("a|\\Az", "za", 0, 1);
+        x2s("a|b\\Z", "ba", 1, 2);
+        x2s("a|b\\Z", "b", 0, 1);
+        x2s("a|b\\z", "ba", 1, 2);
+        x2s("a|b\\z", "b", 0, 1);
+        x2s("\\w|\\s", " ", 0, 1);
+        ns("\\w|\\w", " ");
+        x2s("\\w|%", "%", 0, 1);
+        x2s("\\w|[&$]", "&", 0, 1);
+        x2s("[b-d]|[^e-z]", "a", 0, 1);
+        x2s("(?:a|[c-f])|bz", "dz", 0, 1);
+        x2s("(?:a|[c-f])|bz", "bz", 0, 2);
+        x2s("abc|(?=zz)..f", "zzf", 0, 3);
+        x2s("abc|(?!zz)..f", "abf", 0, 3);
+        x2s("(?=za)..a|(?=zz)..a", "zza", 0, 3);
+        ns("(?>a|abd)c", "abdc");
+        x2s("(?>abd|a)c", "abdc", 0, 4);
+        x2s("a?|b", "a", 0, 1);
+        x2s("a?|b", "b", 0, 0);
+        x2s("a?|b", "", 0, 0);
+        x2s("a*|b", "aa", 0, 2);
+        x2s("a*|b*", "ba", 0, 0);
+        x2s("a*|b*", "ab", 0, 1);
+        x2s("a+|b*", "", 0, 0);
+        x2s("a+|b*", "bbb", 0, 3);
+        x2s("a+|b*", "abbb", 0, 1);
+        ns("a+|b+", "");
+        x2s("(a|b)?", "b", 0, 1);
+        x2s("(a|b)*", "ba", 0, 2);
+        x2s("(a|b)+", "bab", 0, 3);
+        x2s("(ab|ca)+", "caabbc", 0, 4);
+        x2s("(ab|ca)+", "aabca", 1, 5);
+        x2s("(ab|ca)+", "abzca", 0, 2);
+        x2s("(a|bab)+", "ababa", 0, 5);
+        x2s("(a|bab)+", "ba", 1, 2);
+        x2s("(a|bab)+", "baaaba", 1, 4);
+        x2s("(?:a|b)(?:a|b)", "ab", 0, 2);
+        x2s("(?:a*|b*)(?:a*|b*)", "aaabbb", 0, 3);
+        x2s("(?:a*|b*)(?:a+|b+)", "aaabbb", 0, 6);
+        x2s("(?:a+|b+){2}", "aaabbb", 0, 6);
+        x2s("h{0,}", "hhhh", 0, 4);
+        x2s("(?:a+|b+){1,2}", "aaabbb", 0, 6);
+        ns("ax{2}*a", "0axxxa1");
+        ns("a.{0,2}a", "0aXXXa0");
+        ns("a.{0,2}?a", "0aXXXa0");
+        ns("a.{0,2}?a", "0aXXXXa0");
+        x2s("^a{2,}?a$", "aaa", 0, 3);
+        x2s("^[a-z]{2,}?$", "aaa", 0, 3);
+        x2s("(?:a+|\\Ab*)cc", "cc", 0, 2);
+        ns("(?:a+|\\Ab*)cc", "abcc");
+        x2s("(?:^a+|b+)*c", "aabbbabc", 6, 8);
+        x2s("(?:^a+|b+)*c", "aabbbbc", 0, 7);
+        x2s("a|(?i)c", "C", 0, 1);
+        x2s("(?i)c|a", "C", 0, 1);
+        x2s("(?i)c|a", "A", 0, 1);
+        x2s("(?i:c)|a", "C", 0, 1);
+        ns("(?i:c)|a", "A");
+        x2s("[abc]?", "abc", 0, 1);
+        x2s("[abc]*", "abc", 0, 3);
+        x2s("[^abc]*", "abc", 0, 0);
+        ns("[^abc]+", "abc");
+        x2s("a??", "aaa", 0, 0);
+        x2s("ba??b", "bab", 0, 3);
+        x2s("a*?", "aaa", 0, 0);
+        x2s("ba*?", "baa", 0, 1);
+        x2s("ba*?b", "baab", 0, 4);
+        x2s("a+?", "aaa", 0, 1);
+        x2s("ba+?", "baa", 0, 2);
+        x2s("ba+?b", "baab", 0, 4);
+        x2s("(?:a?)??", "a", 0, 0);
+        x2s("(?:a??)?", "a", 0, 0);
+        x2s("(?:a?)+?", "aaa", 0, 1);
+        x2s("(?:a+)??", "aaa", 0, 0);
+        x2s("(?:a+)??b", "aaab", 0, 4);
+        x2s("(?:ab)?{2}", "", 0, 0);
+        x2s("(?:ab)?{2}", "ababa", 0, 4);
+        x2s("(?:ab)*{0}", "ababa", 0, 0);
+        x2s("(?:ab){3,}", "abababab", 0, 8);
+        ns("(?:ab){3,}", "abab");
+        x2s("(?:ab){2,4}", "ababab", 0, 6);
+        x2s("(?:ab){2,4}", "ababababab", 0, 8);
+        x2s("(?:ab){2,4}?", "ababababab", 0, 4);
+        x2s("(?:ab){,}", "ab{,}", 0, 5);
+        x2s("(?:abc)+?{2}", "abcabcabc", 0, 6);
+        x2s("(?:X*)(?i:xa)", "XXXa", 0, 4);
+        x2s("(d+)([^abc]z)", "dddz", 0, 4);
+        x2s("([^abc]*)([^abc]z)", "dddz", 0, 4);
+        x2s("(\\w+)(\\wz)", "dddz", 0, 4);
+        x3s("(a)", "a", 0, 1, 1);
+        x3s("(ab)", "ab", 0, 2, 1);
+        x2s("((ab))", "ab", 0, 2);
+        x3s("((ab))", "ab", 0, 2, 1);
+        x3s("((ab))", "ab", 0, 2, 2);
+        x3s("((((((((((((((((((((ab))))))))))))))))))))", "ab", 0, 2, 20);
+        x3s("(ab)(cd)", "abcd", 0, 2, 1);
+        x3s("(ab)(cd)", "abcd", 2, 4, 2);
+        x3s("()(a)bc(def)ghijk", "abcdefghijk", 3, 6, 3);
+        x3s("(()(a)bc(def)ghijk)", "abcdefghijk", 3, 6, 4);
+        x2s("(^a)", "a", 0, 1);
+        x3s("(a)|(a)", "ba", 1, 2, 1);
+        x3s("(^a)|(a)", "ba", 1, 2, 2);
+        x3s("(a?)", "aaa", 0, 1, 1);
+        x3s("(a*)", "aaa", 0, 3, 1);
+        x3s("(a*)", "", 0, 0, 1);
+        x3s("(a+)", "aaaaaaa", 0, 7, 1);
+        x3s("(a+|b*)", "bbbaa", 0, 3, 1);
+        x3s("(a+|b?)", "bbbaa", 0, 1, 1);
+        x3s("(abc)?", "abc", 0, 3, 1);
+        x3s("(abc)*", "abc", 0, 3, 1);
+        x3s("(abc)+", "abc", 0, 3, 1);
+        x3s("(xyz|abc)+", "abc", 0, 3, 1);
+        x3s("([xyz][abc]|abc)+", "abc", 0, 3, 1);
+        x3s("((?i:abc))", "AbC", 0, 3, 1);
+        x2s("(abc)(?i:\\1)", "abcABC", 0, 6);
+        x3s("((?m:a.c))", "a\nc", 0, 3, 1);
+        x3s("((?=az)a)", "azb", 0, 1, 1);
+        x3s("abc|(.abd)", "zabd", 0, 4, 1);
+        x2s("(?:abc)|(ABC)", "abc", 0, 3);
+        x3s("(?i:(abc))|(zzz)", "ABC", 0, 3, 1);
+        x3s("a*(.)", "aaaaz", 4, 5, 1);
+        x3s("a*?(.)", "aaaaz", 0, 1, 1);
+        x3s("a*?(c)", "aaaac", 4, 5, 1);
+        x3s("[bcd]a*(.)", "caaaaz", 5, 6, 1);
+        x3s("(\\Abb)cc", "bbcc", 0, 2, 1);
+        ns("(\\Abb)cc", "zbbcc");
+        x3s("(^bb)cc", "bbcc", 0, 2, 1);
+        ns("(^bb)cc", "zbbcc");
+        x3s("cc(bb$)", "ccbb", 2, 4, 1);
+        ns("cc(bb$)", "ccbbb");
+        ns("(\\1)", "");
+        ns("\\1(a)", "aa");
+        ns("(a(b)\\1)\\2+", "ababb");
+        ns("(?:(?:\\1|z)(a))+$", "zaa");
+        x2s("(?:(?:\\1|z)(a))+$", "zaaa", 0, 4);
+        x2s("(a)(?=\\1)", "aa", 0, 1);
+        ns("(a)$|\\1", "az");
+        x2s("(a)\\1", "aa", 0, 2);
+        ns("(a)\\1", "ab");
+        x2s("(a?)\\1", "aa", 0, 2);
+        x2s("(a??)\\1", "aa", 0, 0);
+        x2s("(a*)\\1", "aaaaa", 0, 4);
+        x3s("(a*)\\1", "aaaaa", 0, 2, 1);
+        x2s("a(b*)\\1", "abbbb", 0, 5);
+        x2s("a(b*)\\1", "ab", 0, 1);
+        x2s("(a*)(b*)\\1\\2", "aaabbaaabb", 0, 10);
+        x2s("(a*)(b*)\\2", "aaabbbb", 0, 7);
+        x2s("(((((((a*)b))))))c\\7", "aaabcaaa", 0, 8);
+        x3s("(((((((a*)b))))))c\\7", "aaabcaaa", 0, 3, 7);
+        x2s("(a)(b)(c)\\2\\1\\3", "abcbac", 0, 6);
+        x2s("([a-d])\\1", "cc", 0, 2);
+        x2s("(\\w\\d\\s)\\1", "f5 f5 ", 0, 6);
+        ns("(\\w\\d\\s)\\1", "f5 f5");
+        x2s("(who|[a-c]{3})\\1", "whowho", 0, 6);
+        x2s("...(who|[a-c]{3})\\1", "abcwhowho", 0, 9);
+        x2s("(who|[a-c]{3})\\1", "cbccbc", 0, 6);
+        x2s("(^a)\\1", "aa", 0, 2);
+        ns("(^a)\\1", "baa");
+        ns("(a$)\\1", "aa");
+        ns("(ab\\Z)\\1", "ab");
+        x2s("(a*\\Z)\\1", "a", 1, 1);
+        x2s(".(a*\\Z)\\1", "ba", 1, 2);
+        x3s("(.(abc)\\2)", "zabcabc", 0, 7, 1);
+        x3s("(.(..\\d.)\\2)", "z12341234", 0, 9, 1);
+        x2s("((?i:az))\\1", "AzAz", 0, 4);
+        ns("((?i:az))\\1", "Azaz");
+        x2s("(?<=a)b", "ab", 1, 2);
+        ns("(?<=a)b", "bb");
+        x2s("(?<=a|b)b", "bb", 1, 2);
+        x2s("(?<=a|bc)b", "bcb", 2, 3);
+        x2s("(?<=a|bc)b", "ab", 1, 2);
+        x2s("(?<=a|bc||defghij|klmnopq|r)z", "rz", 1, 2);
+        x2s("(a)\\g<1>", "aa", 0, 2);
+        x2s("(?<!a)b", "cb", 1, 2);
+        ns("(?<!a)b", "ab");
+        x2s("(?<!a|bc)b", "bbb", 0, 1);
+        ns("(?<!a|bc)z", "bcz");
+        x2s("(?<name1>a)", "a", 0, 1);
+        x2s("(?<name_2>ab)\\g<name_2>", "abab", 0, 4);
+        x2s("(?<name_3>.zv.)\\k<name_3>", "azvbazvb", 0, 8);
+        x2s("(?<=\\g<ab>)|-\\zEND (?<ab>XyZ)", "XyZ", 3, 3);
+        x2s("(?<n>|a\\g<n>)+", "", 0, 0);
+        x2s("(?<n>|\\(\\g<n>\\))+$", "()(())", 0, 6);
+        x3s("\\g<n>(?<n>.){0}", "X", 0, 1, 1);
+        x2s("\\g<n>(abc|df(?<n>.YZ){2,8}){0}", "XYZ", 0, 3);
+        x2s("\\A(?<n>(a\\g<n>)|)\\z", "aaaa", 0, 4);
+        x2s("(?<n>|\\g<m>\\g<n>)\\z|\\zEND (?<m>a|(b)\\g<m>)", "bbbbabba", 0, 8);
+        x2s("(?<name1240>\\w+\\sx)a+\\k<name1240>", "  fg xaaaaaaaafg x", 2, 18);
+        x3s("(z)()()(?<_9>a)\\g<_9>", "zaa", 2, 3, 1);
+        x2s("(.)(((?<_>a)))\\k<_>", "zaa", 0, 3);
+        x2s("((?<name1>\\d)|(?<name2>\\w))(\\k<name1>|\\k<name2>)", "ff", 0, 2);
+        x2s("(?:(?<x>)|(?<x>efg))\\k<x>", "", 0, 0);
+        x2s("(?:(?<x>abc)|(?<x>efg))\\k<x>", "abcefgefg", 3, 9);
+        ns("(?:(?<x>abc)|(?<x>efg))\\k<x>", "abcefg");
+        x2s("(?:(?<n1>.)|(?<n1>..)|(?<n1>...)|(?<n1>....)|(?<n1>.....)|(?<n1>......)|(?<n1>.......)|(?<n1>........)|(?<n1>.........)|(?<n1>..........)|(?<n1>...........)|(?<n1>............)|(?<n1>.............)|(?<n1>..............))\\k<n1>$", "a-pyumpyum", 2, 10);
+        x3s("(?:(?<n1>.)|(?<n1>..)|(?<n1>...)|(?<n1>....)|(?<n1>.....)|(?<n1>......)|(?<n1>.......)|(?<n1>........)|(?<n1>.........)|(?<n1>..........)|(?<n1>...........)|(?<n1>............)|(?<n1>.............)|(?<n1>..............))\\k<n1>$", "xxxxabcdefghijklmnabcdefghijklmn", 4, 18, 14);
+        x3s("(?<name1>)(?<name2>)(?<name3>)(?<name4>)(?<name5>)(?<name6>)(?<name7>)(?<name8>)(?<name9>)(?<name10>)(?<name11>)(?<name12>)(?<name13>)(?<name14>)(?<name15>)(?<name16>aaa)(?<name17>)$", "aaa", 0, 3, 16);
+        x2s("(?<foo>a|\\(\\g<foo>\\))", "a", 0, 1);
+        x2s("(?<foo>a|\\(\\g<foo>\\))", "((((((a))))))", 0, 13);
+        x3s("(?<foo>a|\\(\\g<foo>\\))", "((((((((a))))))))", 0, 17, 1);
+        x2s("\\g<bar>|\\zEND(?<bar>.*abc$)", "abcxxxabc", 0, 9);
+        x2s("\\g<1>|\\zEND(.a.)", "bac", 0, 3);
+        x3s("\\g<_A>\\g<_A>|\\zEND(.a.)(?<_A>.b.)", "xbxyby", 3, 6, 1);
+        x2s("\\A(?:\\g<pon>|\\g<pan>|\\zEND  (?<pan>a|c\\g<pon>c)(?<pon>b|d\\g<pan>d))$", "cdcbcdc", 0, 7);
+        x2s("\\A(?<n>|a\\g<m>)\\z|\\zEND (?<m>\\g<n>)", "aaaa", 0, 4);
+        x2s("(?<n>(a|b\\g<n>c){3,5})", "baaaaca", 1, 5);
+        x2s("(?<n>(a|b\\g<n>c){3,5})", "baaaacaaaaa", 0, 10);
+        x2s("(?<pare>\\(([^\\(\\)]++|\\g<pare>)*+\\))", "((a))", 0, 5);
+        x2s("()*\\1", "", 0, 0);
+        x2s("(?:()|())*\\1\\2", "", 0, 0);
+        x3s("(?:\\1a|())*", "a", 0, 0, 1);
+        x2s("x((.)*)*x", "0x1x2x3", 1, 6);
+        x2s("x((.)*)*x(?i:\\1)\\Z", "0x1x2x1X2", 1, 9);
+        x2s("(?:()|()|()|()|()|())*\\2\\5", "", 0, 0);
+        x2s("(?:()|()|()|(x)|()|())*\\2b\\5", "b", 0, 1);
+
+        x3s("\\A(?<a>|.|(?:(?<b>.)\\g<a>\\k<b+0>))\\z", "reer", 0, 4, 1);
+        x3s("(?-i:\\g<name>)(?i:(?<name>a)){0}", "A", 0, 1, 1);
+
+        String pat =
+            "(?<element> \\g<stag> \\g<content>* \\g<etag> ){0}" +
+            "(?<stag> < \\g<name> \\s* > ){0}" +
+            "(?<name> [a-zA-Z_:]+ ){0}" +
+            "(?<content> [^<&]+ (\\g<element> | [^<&]+)* ){0}" +
+            "(?<etag> </ \\k<name+1> >){0}" +
+            "\\g<element>";
+
+        String str = "<foo>f<bar>bbb</bar>f</foo>";
+
+        x3s(pat, str, 0, 27, 0, Option.EXTEND);
+        x3s(pat, str, 0, 27, 1, Option.EXTEND);
+        x3s(pat, str, 6, 11, 2, Option.EXTEND);
+        x3s(pat, str, 7, 10, 3, Option.EXTEND);
+        x3s(pat, str, 5, 21, 4, Option.EXTEND);
+        x3s(pat, str, 21, 27, 5, Option.EXTEND);
+
+        x2s("(a)b\\k<1>", "aba", 0, 3);
+        x2s("^(?>(?=a)(a|))++$", "a", 0, 1);
+        x2s("\\k", "k", 0, 1);
+        x2s("\\kx", "kx", 0, 2);
+        x2s("\\g", "g", 0, 1);
+        x2s("\\gx", "gx", 0, 2);
+        x2s("\\k\\g", "kg", 0, 2);
+        ns("\\00", "00");
+        ns("\\70", "70");
+        x2s("\\80", "80", 0, 2);
+        x2s("\\90", "90", 0, 2);
+
+        ns("(?<!b|aa)c", "Aac", Option.IGNORECASE);
+        x2s("(?<!b|aa)", "Aac", 0, 0, Option.IGNORECASE);
+        x2s("(?<=b|aa)c", "Aac", 2, 3, Option.IGNORECASE);
+        x2s("(?<=b|aa)", "Aac", 2, 2, Option.IGNORECASE);
+
+        ns("\\A[a-f&&[^b-c]&&[^e]]\\z", "e");
+        ns("[[^a]&&e&&[^e]]", "e");
+
+        x2s("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 0, 35, Option.IGNORECASE);
+        x2s("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 0, 35, Option.IGNORECASE);
+        x2s("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAA", 0, 35, Option.IGNORECASE);
+
+        x2s("(?mix)", "", 0, 0);
+
+        x2s("(?<=\\babc)d", " abcd", 4, 5);
+        x2s("(?<=\\Babc)d", "aabcd", 4, 5);
+        x2s("([^\\s]+),(.*)+", " xxxx,         xxx xxxxxx xxxxxxxxx xxxxxxx, xxxx xxxxx xxxxx ", 1, 62);
+        x2s(",(.*)+", " xxxx,         xxx xxxxxx xxxxxxxxx xxxxxxx, xxxx xxxxx xxxxx ", 5, 62);
+
+        x2s("(?:(a)|(b))(?(1)cd)e", "acde", 0, 4);
+        ns("(?:(a)|(b))(?(1)cd)e", "ae");
+        x2s("(?:(a)|(b))(?(2)cd)e", "ae", 0, 2);
+        ns("(?:(a)|(b))(?(2)cd)e", "acde");
+        x2s("(?:(a)|(b))(?(1)c|d)", "ac", 0, 2);
+        x2s("(?:(a)|(b))(?(1)c|d)", "bd", 0, 2);
+        ns("(?:(a)|(b))(?(1)c|d)", "ad");
+        ns("(?:(a)|(b))(?(1)c|d)", "bc");
+        x2s("(?:(a)|(b))(?:(?(1)cd)e|fg)", "acde", 0, 4);
+        x2s("(?:(a)|(b))(?:(?(1)cd|x)e|fg)", "bxe", 0, 3);
+        ns("(?:(a)|(b))(?:(?(2)cd|x)e|fg)", "bxe");
+        x2s("(?:(?<x>a)|(?<y>b))(?:(?(<x>)cd|x)e|fg)", "bxe", 0, 3);
+        ns("(?:(?<x>a)|(?<y>b))(?:(?(<y>)cd|x)e|fg)", "bxe");
+        x2s("((?<=a))?(?(1)b|c)", "abc", 1, 2);
+        x2s("((?<=a))?(?(1)b|c)", "bc", 1, 2);
+        x2s("((?<x>x)|(?<y>y))(?(<x>)y|x)", "xy", 0, 2);
+        x2s("((?<x>x)|(?<y>y))(?(<x>)y|x)", "yx", 0, 2);
+        ns("((?<x>x)|(?<y>y))(?(<x>)y|x)", "xx");
+        ns("((?<x>x)|(?<y>y))(?(<x>)y|x)", "yy");
+
+        x2s("\\R", "\n", 0, 1);
+        x2s("\\R", "\r", 0, 1);
+        x2s("\\R{3}", "\r\r\n\n", 0, 4);
+
+        x2s("\\X{5}", "あいab\n", 0, 5);
+        x2s("\\X{5}", "あいab\n", 0, 5);
+        x2s("(?<=a).*b", "aab", 1, 3);
+
+        super.test();
+    }
+}
diff --git a/test/org/joni/test/TestAU.java b/test/org/joni/test/TestAU.java
deleted file mode 100644
index 0d37a88..0000000
--- a/test/org/joni/test/TestAU.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is furnished to do
- * so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-package org.joni.test;
-
-import org.jcodings.Encoding;
-import org.jcodings.specific.ASCIIEncoding;
-import org.joni.Option;
-import org.joni.Syntax;
-
-public class TestAU extends Test {
-
-    public int option() {
-        return Option.DEFAULT;
-    }
-
-    public Encoding encoding() {
-        return ASCIIEncoding.INSTANCE;
-    }
-
-    public String testEncoding() {
-        return "utf-8";
-    }
-
-    public Syntax syntax() {
-        return Syntax.DEFAULT;
-    }
-
-    public void test() throws InterruptedException {
-        x2s("\\X{5}", "あいab\n", 0, 5);
-    }
-
-    public static void main(String[] args) throws Throwable {
-        new TestU8().run();
-    }
-}
diff --git a/test/org/joni/test/TestC.java b/test/org/joni/test/TestC.java
old mode 100644
new mode 100755
index 04963d5..5455f15
--- a/test/org/joni/test/TestC.java
+++ b/test/org/joni/test/TestC.java
@@ -1,736 +1,734 @@
-/*
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is furnished to do
- * so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-package org.joni.test;
-
-import org.joni.Option;
-import org.joni.Syntax;
-import org.jcodings.Config;
-import org.jcodings.Encoding;
-import org.jcodings.specific.EUCJPEncoding;
-
-public class TestC extends Test {
-
-    public int option() {
-        return Option.DEFAULT;
-    }
-
-    public Encoding encoding() {
-        return EUCJPEncoding.INSTANCE;
-    }
-
-    public String testEncoding() {
-        return "cp1250";
-    }
-
-    public Syntax syntax() {
-        return Syntax.DEFAULT;
-    }
-
-    public void test() throws InterruptedException {
-        x2s("", "", 0, 0);
-        x2s("^", "", 0, 0);
-        x2s("$", "", 0, 0);
-        x2s("\\G", "", 0, 0);
-        x2s("\\A", "", 0, 0);
-        x2s("\\Z", "", 0, 0);
-        x2s("\\z", "", 0, 0);
-        x2s("^$", "", 0, 0);
-        x2s("\\ca", "\001", 0, 1);
-        x2s("\\C-b", "\002", 0, 1);
-        x2s("\\c\\\\", "\034", 0, 1);
-        x2s("q[\\c\\\\]", "q\034", 0, 2);
-        x2s("", "a", 0, 0);
-        x2s("a", "a", 0, 1);
-        x2s("\\x61", "a", 0, 1);
-        x2s("aa", "aa", 0, 2);
-        x2s("aaa", "aaa", 0, 3);
-        x2s("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 0, 35);
-        x2s("ab", "ab", 0, 2);
-        x2s("b", "ab", 1, 2);
-        x2s("bc", "abc", 1, 3);
-        x2s("(?i:#RET#)", "#INS##RET#", 5, 10);
-        x2s("\\17", "\017", 0, 1);
-        x2s("\\x1f", "\u001f", 0, 1);
-        x2s("a(?#....\\\\JJJJ)b", "ab", 0, 2);
-        x2s("(?x)  G (o O(?-x)oO) g L", "GoOoOgLe", 0, 7);
-        x2s(".", "a", 0, 1);
-        ns(".", "");
-        x2s("..", "ab", 0, 2);
-        x2s("\\w", "e", 0, 1);
-        ns("\\W", "e");
-        x2s("\\s", " ", 0, 1);
-        x2s("\\S", "b", 0, 1);
-        x2s("\\d", "4", 0, 1);
-        ns("\\D", "4");
-        x2s("\\b", "z ", 0, 0);
-        x2s("\\b", " z", 1, 1);
-        x2s("\\B", "zz ", 1, 1);
-        x2s("\\B", "z ", 2, 2);
-        x2s("\\B", " z", 0, 0);
-        x2s("[ab]", "b", 0, 1);
-        ns("[ab]", "c");
-        x2s("[a-z]", "t", 0, 1);
-        ns("[^a]", "a");
-        x2s("[^a]", "\n", 0, 1);
-        x2s("[]]", "]", 0, 1);
-        ns("[^]]", "]");
-        x2s("[\\^]+", "0^^1", 1, 3);
-        x2s("[b-]", "b", 0, 1);
-        x2s("[b-]", "-", 0, 1);
-        x2s("[\\w]", "z", 0, 1);
-        ns("[\\w]", " ");
-        x2s("[\\W]", "b$", 1, 2);
-        x2s("[\\d]", "5", 0, 1);
-        ns("[\\d]", "e");
-        x2s("[\\D]", "t", 0, 1);
-        ns("[\\D]", "3");
-        x2s("[\\s]", " ", 0, 1);
-        ns("[\\s]", "a");
-        x2s("[\\S]", "b", 0, 1);
-        ns("[\\S]", " ");
-        x2s("[\\w\\d]", "2", 0, 1);
-        ns("[\\w\\d]", " ");
-        x2s("[[:upper:]]", "B", 0, 1);
-        x2s("[*[:xdigit:]+]", "+", 0, 1);
-        x2s("[*[:xdigit:]+]", "GHIKK-9+*", 6, 7);
-        x2s("[*[:xdigit:]+]", "-@^+", 3, 4);
-        ns("[[:upper]]", "A");
-        x2s("[[:upper]]", ":", 0, 1);
-        x2s("[\\044-\\047]", "\046", 0, 1);
-        x2s("[\\x5a-\\x5c]", "\u005b", 0, 1);
-        x2s("[\\x6A-\\x6D]", "\u006c", 0, 1);
-        ns("[\\x6A-\\x6D]", "\u006e");
-        ns("^[0-9A-F]+ 0+ UNDEF ", "75F 00000000 SECT14A notype ()    External    | _rb_apply");
-        x2s("[\\[]", "[", 0, 1);
-        x2s("[\\]]", "]", 0, 1);
-        x2s("[&]", "&", 0, 1);
-        x2s("[[ab]]", "b", 0, 1);
-        x2s("[[ab]c]", "c", 0, 1);
-        ns("[[^a]]", "a");
-        ns("[^[a]]", "a");
-        x2s("[[ab]&&bc]", "b", 0, 1);
-        ns("[[ab]&&bc]", "a");
-        ns("[[ab]&&bc]", "c");
-        x2s("[a-z&&b-y&&c-x]", "w", 0, 1);
-        ns("[^a-z&&b-y&&c-x]", "w");
-        x2s("[[^a&&a]&&a-z]", "b", 0, 1);
-        ns("[[^a&&a]&&a-z]", "a");
-        x2s("[[^a-z&&bcdef]&&[^c-g]]", "h", 0, 1);
-        ns("[[^a-z&&bcdef]&&[^c-g]]", "c");
-        x2s("[^[^abc]&&[^cde]]", "c", 0, 1);
-        x2s("[^[^abc]&&[^cde]]", "e", 0, 1);
-        ns("[^[^abc]&&[^cde]]", "f");
-        x2s("[a-&&-a]", "-", 0, 1);
-        ns("[a\\-&&\\-a]", "&");
-        ns("\\wabc", " abc");
-        x2s("a\\Wbc", "a bc", 0, 4);
-        x2s("a.b.c", "aabbc", 0, 5);
-        x2s(".\\wb\\W..c", "abb bcc", 0, 7);
-        x2s("\\s\\wzzz", " zzzz", 0, 5);
-        x2s("aa.b", "aabb", 0, 4);
-        ns(".a", "ab");
-        x2s(".a", "aa", 0, 2);
-        x2s("^a", "a", 0, 1);
-        x2s("^a$", "a", 0, 1);
-        x2s("^\\w$", "a", 0, 1);
-        ns("^\\w$", " ");
-        x2s("^\\wab$", "zab", 0, 3);
-        x2s("^\\wabcdef$", "zabcdef", 0, 7);
-        x2s("^\\w...def$", "zabcdef", 0, 7);
-        x2s("\\w\\w\\s\\Waaa\\d", "aa  aaa4", 0, 8);
-        x2s("\\A\\Z", "", 0, 0);
-        x2s("\\Axyz", "xyz", 0, 3);
-        x2s("xyz\\Z", "xyz", 0, 3);
-        x2s("xyz\\z", "xyz", 0, 3);
-        x2s("a\\Z", "a", 0, 1);
-        x2s("\\Gaz", "az", 0, 2);
-        ns("\\Gz", "bza");
-        ns("az\\G", "az");
-        ns("az\\A", "az");
-        ns("a\\Az", "az");
-        x2s("\\^\\$", "^$", 0, 2);
-        x2s("^x?y", "xy", 0, 2);
-        x2s("^(x?y)", "xy", 0, 2);
-        x2s("\\w", "_", 0, 1);
-        ns("\\W", "_");
-        x2s("(?=z)z", "z", 0, 1);
-        ns("(?=z).", "a");
-        x2s("(?!z)a", "a", 0, 1);
-        ns("(?!z)a", "z");
-        x2s("(?i:a)", "a", 0, 1);
-        x2s("(?i:a)", "A", 0, 1);
-        x2s("(?i:A)", "a", 0, 1);
-        ns("(?i:A)", "b");
-        x2s("(?i:[A-Z])", "a", 0, 1);
-        x2s("(?i:[f-m])", "H", 0, 1);
-        x2s("(?i:[f-m])", "h", 0, 1);
-        ns("(?i:[f-m])", "e");
-        x2s("(?i:[A-c])", "D", 0, 1);
-        ns("(?i:[^a-z])", "A");
-        ns("(?i:[^a-z])", "a");
-        x2s("(?i:[!-k])", "Z", 0, 1);
-        x2s("(?i:[!-k])", "7", 0, 1);
-        x2s("(?i:[T-}])", "b", 0, 1);
-        x2s("(?i:[T-}])", "{", 0, 1);
-        x2s("(?i:\\?a)", "?A", 0, 2);
-        x2s("(?i:\\*A)", "*a", 0, 2);
-        ns(".", "\n");
-        x2s("(?m:.)", "\n", 0, 1);
-        x2s("(?m:a.)", "a\n", 0, 2);
-        x2s("(?m:.b)", "a\nb", 1, 3);
-        x2s(".*abc", "dddabdd\nddabc", 8, 13);
-        x2s("(?m:.*abc)", "dddabddabc", 0, 10);
-        ns("(?i)(?-i)a", "A");
-        ns("(?i)(?-i:a)", "A");
-        x2s("a?", "", 0, 0);
-        x2s("a?", "b", 0, 0);
-        x2s("a?", "a", 0, 1);
-        x2s("a*", "", 0, 0);
-        x2s("a*", "a", 0, 1);
-        x2s("a*", "aaa", 0, 3);
-        x2s("a*", "baaaa", 0, 0);
-        ns("a+", "");
-        x2s("a+", "a", 0, 1);
-        x2s("a+", "aaaa", 0, 4);
-        x2s("a+", "aabbb", 0, 2);
-        x2s("a+", "baaaa", 1, 5);
-        x2s(".?", "", 0, 0);
-        x2s(".?", "f", 0, 1);
-        x2s(".?", "\n", 0, 0);
-        x2s(".*", "", 0, 0);
-        x2s(".*", "abcde", 0, 5);
-        x2s(".+", "z", 0, 1);
-        x2s(".+", "zdswer\n", 0, 6);
-        x2s("(.*)a\\1f", "babfbac", 0, 4);
-        x2s("(.*)a\\1f", "bacbabf", 3, 7);
-        x2s("((.*)a\\2f)", "bacbabf", 3, 7);
-        x2s("(.*)a\\1f", "baczzzzzz\nbazz\nzzzzbabf", 19, 23);
-        x2s("a|b", "a", 0, 1);
-        x2s("a|b", "b", 0, 1);
-        x2s("|a", "a", 0, 0);
-        x2s("(|a)", "a", 0, 0);
-        x2s("ab|bc", "ab", 0, 2);
-        x2s("ab|bc", "bc", 0, 2);
-        x2s("z(?:ab|bc)", "zbc", 0, 3);
-        x2s("a(?:ab|bc)c", "aabc", 0, 4);
-        x2s("ab|(?:ac|az)", "az", 0, 2);
-        x2s("a|b|c", "dc", 1, 2);
-        x2s("a|b|cd|efg|h|ijk|lmn|o|pq|rstuvwx|yz", "pqr", 0, 2);
-        ns("a|b|cd|efg|h|ijk|lmn|o|pq|rstuvwx|yz", "mn");
-        x2s("a|^z", "ba", 1, 2);
-        x2s("a|^z", "za", 0, 1);
-        x2s("a|\\Gz", "bza", 2, 3);
-        x2s("a|\\Gz", "za", 0, 1);
-        x2s("a|\\Az", "bza", 2, 3);
-        x2s("a|\\Az", "za", 0, 1);
-        x2s("a|b\\Z", "ba", 1, 2);
-        x2s("a|b\\Z", "b", 0, 1);
-        x2s("a|b\\z", "ba", 1, 2);
-        x2s("a|b\\z", "b", 0, 1);
-        x2s("\\w|\\s", " ", 0, 1);
-        ns("\\w|\\w", " ");
-        x2s("\\w|%", "%", 0, 1);
-        x2s("\\w|[&$]", "&", 0, 1);
-        x2s("[b-d]|[^e-z]", "a", 0, 1);
-        x2s("(?:a|[c-f])|bz", "dz", 0, 1);
-        x2s("(?:a|[c-f])|bz", "bz", 0, 2);
-        x2s("abc|(?=zz)..f", "zzf", 0, 3);
-        x2s("abc|(?!zz)..f", "abf", 0, 3);
-        x2s("(?=za)..a|(?=zz)..a", "zza", 0, 3);
-        ns("(?>a|abd)c", "abdc");
-        x2s("(?>abd|a)c", "abdc", 0, 4);
-        x2s("a?|b", "a", 0, 1);
-        x2s("a?|b", "b", 0, 0);
-        x2s("a?|b", "", 0, 0);
-        x2s("a*|b", "aa", 0, 2);
-        x2s("a*|b*", "ba", 0, 0);
-        x2s("a*|b*", "ab", 0, 1);
-        x2s("a+|b*", "", 0, 0);
-        x2s("a+|b*", "bbb", 0, 3);
-        x2s("a+|b*", "abbb", 0, 1);
-        ns("a+|b+", "");
-        x2s("(a|b)?", "b", 0, 1);
-        x2s("(a|b)*", "ba", 0, 2);
-        x2s("(a|b)+", "bab", 0, 3);
-        x2s("(ab|ca)+", "caabbc", 0, 4);
-        x2s("(ab|ca)+", "aabca", 1, 5);
-        x2s("(ab|ca)+", "abzca", 0, 2);
-        x2s("(a|bab)+", "ababa", 0, 5);
-        x2s("(a|bab)+", "ba", 1, 2);
-        x2s("(a|bab)+", "baaaba", 1, 4);
-        x2s("(?:a|b)(?:a|b)", "ab", 0, 2);
-        x2s("(?:a*|b*)(?:a*|b*)", "aaabbb", 0, 3);
-        x2s("(?:a*|b*)(?:a+|b+)", "aaabbb", 0, 6);
-        x2s("(?:a+|b+){2}", "aaabbb", 0, 6);
-        x2s("h{0,}", "hhhh", 0, 4);
-        x2s("(?:a+|b+){1,2}", "aaabbb", 0, 6);
-        ns("ax{2}*a", "0axxxa1");
-        ns("a.{0,2}a", "0aXXXa0");
-        ns("a.{0,2}?a", "0aXXXa0");
-        ns("a.{0,2}?a", "0aXXXXa0");
-        x2s("^a{2,}?a$", "aaa", 0, 3);
-        x2s("^[a-z]{2,}?$", "aaa", 0, 3);
-        x2s("(?:a+|\\Ab*)cc", "cc", 0, 2);
-        ns("(?:a+|\\Ab*)cc", "abcc");
-        x2s("(?:^a+|b+)*c", "aabbbabc", 6, 8);
-        x2s("(?:^a+|b+)*c", "aabbbbc", 0, 7);
-        x2s("a|(?i)c", "C", 0, 1);
-        x2s("(?i)c|a", "C", 0, 1);
-        x2s("(?i)c|a", "A", 0, 1);
-        x2s("(?i:c)|a", "C", 0, 1);
-        ns("(?i:c)|a", "A");
-        x2s("[abc]?", "abc", 0, 1);
-        x2s("[abc]*", "abc", 0, 3);
-        x2s("[^abc]*", "abc", 0, 0);
-        ns("[^abc]+", "abc");
-        x2s("a??", "aaa", 0, 0);
-        x2s("ba??b", "bab", 0, 3);
-        x2s("a*?", "aaa", 0, 0);
-        x2s("ba*?", "baa", 0, 1);
-        x2s("ba*?b", "baab", 0, 4);
-        x2s("a+?", "aaa", 0, 1);
-        x2s("ba+?", "baa", 0, 2);
-        x2s("ba+?b", "baab", 0, 4);
-        x2s("(?:a?)??", "a", 0, 0);
-        x2s("(?:a??)?", "a", 0, 0);
-        x2s("(?:a?)+?", "aaa", 0, 1);
-        x2s("(?:a+)??", "aaa", 0, 0);
-        x2s("(?:a+)??b", "aaab", 0, 4);
-        x2s("(?:ab)?{2}", "", 0, 0);
-        x2s("(?:ab)?{2}", "ababa", 0, 4);
-        x2s("(?:ab)*{0}", "ababa", 0, 0);
-        x2s("(?:ab){3,}", "abababab", 0, 8);
-        ns("(?:ab){3,}", "abab");
-        x2s("(?:ab){2,4}", "ababab", 0, 6);
-        x2s("(?:ab){2,4}", "ababababab", 0, 8);
-        x2s("(?:ab){2,4}?", "ababababab", 0, 4);
-        x2s("(?:ab){,}", "ab{,}", 0, 5);
-        x2s("(?:abc)+?{2}", "abcabcabc", 0, 6);
-        x2s("(?:X*)(?i:xa)", "XXXa", 0, 4);
-        x2s("(d+)([^abc]z)", "dddz", 0, 4);
-        x2s("([^abc]*)([^abc]z)", "dddz", 0, 4);
-        x2s("(\\w+)(\\wz)", "dddz", 0, 4);
-        x3s("(a)", "a", 0, 1, 1);
-        x3s("(ab)", "ab", 0, 2, 1);
-        x2s("((ab))", "ab", 0, 2);
-        x3s("((ab))", "ab", 0, 2, 1);
-        x3s("((ab))", "ab", 0, 2, 2);
-        x3s("((((((((((((((((((((ab))))))))))))))))))))", "ab", 0, 2, 20);
-        x3s("(ab)(cd)", "abcd", 0, 2, 1);
-        x3s("(ab)(cd)", "abcd", 2, 4, 2);
-        x3s("()(a)bc(def)ghijk", "abcdefghijk", 3, 6, 3);
-        x3s("(()(a)bc(def)ghijk)", "abcdefghijk", 3, 6, 4);
-        x2s("(^a)", "a", 0, 1);
-        x3s("(a)|(a)", "ba", 1, 2, 1);
-        x3s("(^a)|(a)", "ba", 1, 2, 2);
-        x3s("(a?)", "aaa", 0, 1, 1);
-        x3s("(a*)", "aaa", 0, 3, 1);
-        x3s("(a*)", "", 0, 0, 1);
-        x3s("(a+)", "aaaaaaa", 0, 7, 1);
-        x3s("(a+|b*)", "bbbaa", 0, 3, 1);
-        x3s("(a+|b?)", "bbbaa", 0, 1, 1);
-        x3s("(abc)?", "abc", 0, 3, 1);
-        x3s("(abc)*", "abc", 0, 3, 1);
-        x3s("(abc)+", "abc", 0, 3, 1);
-        x3s("(xyz|abc)+", "abc", 0, 3, 1);
-        x3s("([xyz][abc]|abc)+", "abc", 0, 3, 1);
-        x3s("((?i:abc))", "AbC", 0, 3, 1);
-        x2s("(abc)(?i:\\1)", "abcABC", 0, 6);
-        x3s("((?m:a.c))", "a\nc", 0, 3, 1);
-        x3s("((?=az)a)", "azb", 0, 1, 1);
-        x3s("abc|(.abd)", "zabd", 0, 4, 1);
-        x2s("(?:abc)|(ABC)", "abc", 0, 3);
-        x3s("(?i:(abc))|(zzz)", "ABC", 0, 3, 1);
-        x3s("a*(.)", "aaaaz", 4, 5, 1);
-        x3s("a*?(.)", "aaaaz", 0, 1, 1);
-        x3s("a*?(c)", "aaaac", 4, 5, 1);
-        x3s("[bcd]a*(.)", "caaaaz", 5, 6, 1);
-        x3s("(\\Abb)cc", "bbcc", 0, 2, 1);
-        ns("(\\Abb)cc", "zbbcc");
-        x3s("(^bb)cc", "bbcc", 0, 2, 1);
-        ns("(^bb)cc", "zbbcc");
-        x3s("cc(bb$)", "ccbb", 2, 4, 1);
-        ns("cc(bb$)", "ccbbb");
-        ns("(\\1)", "");
-        ns("\\1(a)", "aa");
-        ns("(a(b)\\1)\\2+", "ababb");
-        ns("(?:(?:\\1|z)(a))+$", "zaa");
-        x2s("(?:(?:\\1|z)(a))+$", "zaaa", 0, 4);
-        x2s("(a)(?=\\1)", "aa", 0, 1);
-        ns("(a)$|\\1", "az");
-        x2s("(a)\\1", "aa", 0, 2);
-        ns("(a)\\1", "ab");
-        x2s("(a?)\\1", "aa", 0, 2);
-        x2s("(a??)\\1", "aa", 0, 0);
-        x2s("(a*)\\1", "aaaaa", 0, 4);
-        x3s("(a*)\\1", "aaaaa", 0, 2, 1);
-        x2s("a(b*)\\1", "abbbb", 0, 5);
-        x2s("a(b*)\\1", "ab", 0, 1);
-        x2s("(a*)(b*)\\1\\2", "aaabbaaabb", 0, 10);
-        x2s("(a*)(b*)\\2", "aaabbbb", 0, 7);
-        x2s("(((((((a*)b))))))c\\7", "aaabcaaa", 0, 8);
-        x3s("(((((((a*)b))))))c\\7", "aaabcaaa", 0, 3, 7);
-        x2s("(a)(b)(c)\\2\\1\\3", "abcbac", 0, 6);
-        x2s("([a-d])\\1", "cc", 0, 2);
-        x2s("(\\w\\d\\s)\\1", "f5 f5 ", 0, 6);
-        ns("(\\w\\d\\s)\\1", "f5 f5");
-        x2s("(who|[a-c]{3})\\1", "whowho", 0, 6);
-        x2s("...(who|[a-c]{3})\\1", "abcwhowho", 0, 9);
-        x2s("(who|[a-c]{3})\\1", "cbccbc", 0, 6);
-        x2s("(^a)\\1", "aa", 0, 2);
-        ns("(^a)\\1", "baa");
-        ns("(a$)\\1", "aa");
-        ns("(ab\\Z)\\1", "ab");
-        x2s("(a*\\Z)\\1", "a", 1, 1);
-        x2s(".(a*\\Z)\\1", "ba", 1, 2);
-        x3s("(.(abc)\\2)", "zabcabc", 0, 7, 1);
-        x3s("(.(..\\d.)\\2)", "z12341234", 0, 9, 1);
-        x2s("((?i:az))\\1", "AzAz", 0, 4);
-        ns("((?i:az))\\1", "Azaz");
-        x2s("(?<=a)b", "ab", 1, 2);
-        ns("(?<=a)b", "bb");
-        x2s("(?<=a|b)b", "bb", 1, 2);
-        x2s("(?<=a|bc)b", "bcb", 2, 3);
-        x2s("(?<=a|bc)b", "ab", 1, 2);
-        x2s("(?<=a|bc||defghij|klmnopq|r)z", "rz", 1, 2);
-        x2s("(a)\\g<1>", "aa", 0, 2);
-        x2s("(?<!a)b", "cb", 1, 2);
-        ns("(?<!a)b", "ab");
-        x2s("(?<!a|bc)b", "bbb", 0, 1);
-        ns("(?<!a|bc)z", "bcz");
-        x2s("(?<name1>a)", "a", 0, 1);
-        x2s("(?<name_2>ab)\\g<name_2>", "abab", 0, 4);
-        x2s("(?<name_3>.zv.)\\k<name_3>", "azvbazvb", 0, 8);
-        x2s("(?<=\\g<ab>)|-\\zEND (?<ab>XyZ)", "XyZ", 3, 3);
-        x2s("(?<n>|a\\g<n>)+", "", 0, 0);
-        x2s("(?<n>|\\(\\g<n>\\))+$", "()(())", 0, 6);
-        x3s("\\g<n>(?<n>.){0}", "X", 0, 1, 1);
-        x2s("\\g<n>(abc|df(?<n>.YZ){2,8}){0}", "XYZ", 0, 3);
-        x2s("\\A(?<n>(a\\g<n>)|)\\z", "aaaa", 0, 4);
-        x2s("(?<n>|\\g<m>\\g<n>)\\z|\\zEND (?<m>a|(b)\\g<m>)", "bbbbabba", 0, 8);
-        x2s("(?<name1240>\\w+\\sx)a+\\k<name1240>", "  fg xaaaaaaaafg x", 2, 18);
-        x3s("(z)()()(?<_9>a)\\g<_9>", "zaa", 2, 3, 1);
-        x2s("(.)(((?<_>a)))\\k<_>", "zaa", 0, 3);
-        x2s("((?<name1>\\d)|(?<name2>\\w))(\\k<name1>|\\k<name2>)", "ff", 0, 2);
-        x2s("(?:(?<x>)|(?<x>efg))\\k<x>", "", 0, 0);
-        x2s("(?:(?<x>abc)|(?<x>efg))\\k<x>", "abcefgefg", 3, 9);
-        ns("(?:(?<x>abc)|(?<x>efg))\\k<x>", "abcefg");
-        x2s("(?:(?<n1>.)|(?<n1>..)|(?<n1>...)|(?<n1>....)|(?<n1>.....)|(?<n1>......)|(?<n1>.......)|(?<n1>........)|(?<n1>.........)|(?<n1>..........)|(?<n1>...........)|(?<n1>............)|(?<n1>.............)|(?<n1>..............))\\k<n1>$", "a-pyumpyum", 2, 10);
-        x3s("(?:(?<n1>.)|(?<n1>..)|(?<n1>...)|(?<n1>....)|(?<n1>.....)|(?<n1>......)|(?<n1>.......)|(?<n1>........)|(?<n1>.........)|(?<n1>..........)|(?<n1>...........)|(?<n1>............)|(?<n1>.............)|(?<n1>..............))\\k<n1>$", "xxxxabcdefghijklmnabcdefghijklmn", 4, 18, 14);
-        x3s("(?<name1>)(?<name2>)(?<name3>)(?<name4>)(?<name5>)(?<name6>)(?<name7>)(?<name8>)(?<name9>)(?<name10>)(?<name11>)(?<name12>)(?<name13>)(?<name14>)(?<name15>)(?<name16>aaa)(?<name17>)$", "aaa", 0, 3, 16);
-        x2s("(?<foo>a|\\(\\g<foo>\\))", "a", 0, 1);
-        x2s("(?<foo>a|\\(\\g<foo>\\))", "((((((a))))))", 0, 13);
-        x3s("(?<foo>a|\\(\\g<foo>\\))", "((((((((a))))))))", 0, 17, 1);
-        x2s("\\g<bar>|\\zEND(?<bar>.*abc$)", "abcxxxabc", 0, 9);
-        x2s("\\g<1>|\\zEND(.a.)", "bac", 0, 3);
-        x3s("\\g<_A>\\g<_A>|\\zEND(.a.)(?<_A>.b.)", "xbxyby", 3, 6, 1);
-        x2s("\\A(?:\\g<pon>|\\g<pan>|\\zEND  (?<pan>a|c\\g<pon>c)(?<pon>b|d\\g<pan>d))$", "cdcbcdc", 0, 7);
-        x2s("\\A(?<n>|a\\g<m>)\\z|\\zEND (?<m>\\g<n>)", "aaaa", 0, 4);
-        x2s("(?<n>(a|b\\g<n>c){3,5})", "baaaaca", 1, 5);
-        x2s("(?<n>(a|b\\g<n>c){3,5})", "baaaacaaaaa", 0, 10);
-        x2s("(?<pare>\\(([^\\(\\)]++|\\g<pare>)*+\\))", "((a))", 0, 5);
-        x2s("()*\\1", "", 0, 0);
-        x2s("(?:()|())*\\1\\2", "", 0, 0);
-        x3s("(?:\\1a|())*", "a", 0, 0, 1);
-        x2s("x((.)*)*x", "0x1x2x3", 1, 6);
-        x2s("x((.)*)*x(?i:\\1)\\Z", "0x1x2x1X2", 1, 9);
-        x2s("(?:()|()|()|()|()|())*\\2\\5", "", 0, 0);
-        x2s("(?:()|()|()|(x)|()|())*\\2b\\5", "b", 0, 1);
-        // if (Config.VANILLA) x2s("\\xED\\xF2", "\u00ed\u0148", 0, 2);
-        x2s("", "\u00a4\u02d8", 0, 0);
-        x2s("\u00a4\u02d8", "\u00a4\u02d8", 0, 2);
-        ns("\u00a4\u00a4", "\u00a4\u02d8");
-        x2s("\u00a4\u00a6\u00a4\u00a6", "\u00a4\u00a6\u00a4\u00a6", 0, 4);
-        x2s("\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 0, 6);
-        x2s("\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142", "\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\ [...]
-        x2s("\u00a4\u02d8", "\u00a4\u00a4\u00a4\u02d8", 2, 4);
-        x2s("\u00a4\u00a4\u00a4\u00a6", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 2, 6);
-        // if (Config.VANILLA) x2s("\\xca\\xb8", "\u0118\u00b8", 0, 2);
-        x2s(".", "\u00a4\u02d8", 0, 2);
-        x2s("..", "\u00a4\u00ab\u00a4\u00ad", 0, 4);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\\w", "\u00a4\u015e", 0, 2);
-        if (!org.joni.Config.NON_UNICODE_SDW) ns("\\W", "\u00a4\u02d8");
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("[\\W]", "\u00a4\u00a6$", 2, 3);
-        x2s("\\S", "\u00a4\u02dd", 0, 2);
-        x2s("\\S", "\u00b4\u00c1", 0, 2);
-        x2s("\\b", "\u00b5\u00a4 ", 0, 0);
-        x2s("\\b", " \u00a4\u0170", 1, 1);
-        x2s("\\B", "\u00a4\u00bb\u00a4\u02dd ", 2, 2);
-        x2s("\\B", "\u00a4\u00a6 ", 3, 3);
-        x2s("\\B", " \u00a4\u00a4", 0, 0);
-        x2s("[\u00a4\u017c\u00a4\u00c1]", "\u00a4\u00c1", 0, 2);
-        ns("[\u00a4\u0118\u00a4\u00cb]", "\u00a4\u011a");
-        x2s("[\u00a4\u00a6-\u00a4\u015e]", "\u00a4\u00a8", 0, 2);
-        ns("[^\u00a4\u00b1]", "\u00a4\u00b1");
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("[\\w]", "\u00a4\u00cd", 0, 2);
-        ns("[\\d]", "\u00a4\u0150");
-        x2s("[\\D]", "\u00a4\u010e", 0, 2);
-        ns("[\\s]", "\u00a4\u017b");
-        x2s("[\\S]", "\u00a4\u0158", 0, 2);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("[\\w\\d]", "\u00a4\u010d", 0, 2);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("[\\w\\d]", "   \u00a4\u010d", 3, 5);
-        ns("\\w\u00b5\u00b4\u013d\u00d6", " \u00b5\u00b4\u013d\u00d6");
-        x2s("\u00b5\u00b4\\W\u013d\u00d6", "\u00b5\u00b4 \u013d\u00d6", 0, 5);
-        x2s("\u00a4\u02d8.\u00a4\u00a4.\u00a4\u00a6", "\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a6", 0, 10);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s(".\\w\u00a4\u00a6\\W..\u00a4\u013e", "\u00a4\u00a8\u00a4\u00a6\u00a4\u00a6 \u00a4\u00a6\u00a4\u013e\u00a4\u013e", 0, 13);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\\s\\w\u00a4\u0142\u00a4\u0142\u00a4\u0142", " \u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142", 0, 9);
-        x2s("\u00a4\u02d8\u00a4\u02d8.\u00a4\u00b1", "\u00a4\u02d8\u00a4\u02d8\u00a4\u00b1\u00a4\u00b1", 0, 8);
-        ns(".\u00a4\u00a4", "\u00a4\u00a4\u00a4\u00a8");
-        x2s(".\u00a4\u015e", "\u00a4\u015e\u00a4\u015e", 0, 4);
-        x2s("^\u00a4\u02d8", "\u00a4\u02d8", 0, 2);
-        x2s("^\u00a4\u0155$", "\u00a4\u0155", 0, 2);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("^\\w$", "\u00a4\u00cb", 0, 2);
-        x2s("^\\w\u00a4\u00ab\u00a4\u00ad\u00a4\u017b\u00a4\u00b1\u00a4\u0142$", "z\u00a4\u00ab\u00a4\u00ad\u00a4\u017b\u00a4\u00b1\u00a4\u0142", 0, 11);
-        x2s("^\\w...\u00a4\u00a6\u00a4\u00a8\u00a4\u015e$", "z\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6\u00a4\u00a6\u00a4\u00a8\u00a4\u015e", 0, 13);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\\w\\w\\s\\W\u00a4\u015e\u00a4\u015e\u00a4\u015e\\d", "a\u00a4\u015e  \u00a4\u015e\u00a4\u015e\u00a4\u015e4", 0, 12);
-        x2s("\\A\u00a4\u017c\u00a4\u00c1\u00a4\u00c4", "\u00a4\u017c\u00a4\u00c1\u00a4\u00c4", 0, 6);
-        x2s("\u00a4\u0155\u00a4\u00e1\u00a4\u00e2\\Z", "\u00a4\u0155\u00a4\u00e1\u00a4\u00e2", 0, 6);
-        x2s("\u00a4\u00ab\u00a4\u00ad\u00a4\u017b\\z", "\u00a4\u00ab\u00a4\u00ad\u00a4\u017b", 0, 6);
-        x2s("\u00a4\u00ab\u00a4\u00ad\u00a4\u017b\\Z", "\u00a4\u00ab\u00a4\u00ad\u00a4\u017b\n", 0, 6);
-        x2s("\\G\u00a4\u00dd\u00a4\u00d4", "\u00a4\u00dd\u00a4\u00d4", 0, 4);
-        ns("\\G\u00a4\u00a8", "\u00a4\u00a6\u00a4\u00a8\u00a4\u015e");
-        ns("\u00a4\u010c\u00a4\u0106\\G", "\u00a4\u010c\u00a4\u0106");
-        ns("\u00a4\u0162\u00a4\u00df\\A", "\u00a4\u0162\u00a4\u00df");
-        ns("\u00a4\u0162\\A\u00a4\u00df", "\u00a4\u0162\u00a4\u00df");
-        x2s("(?=\u00a4\u00bb)\u00a4\u00bb", "\u00a4\u00bb", 0, 2);
-        ns("(?=\u00a4\u00a6).", "\u00a4\u00a4");
-        x2s("(?!\u00a4\u00a6)\u00a4\u00ab", "\u00a4\u00ab", 0, 2);
-        ns("(?!\u00a4\u010c)\u00a4\u02d8", "\u00a4\u010c");
-        x2s("(?i:\u00a4\u02d8)", "\u00a4\u02d8", 0, 2);
-        x2s("(?i:\u00a4\u00d6\u00a4\u016e)", "\u00a4\u00d6\u00a4\u016e", 0, 4);
-        ns("(?i:\u00a4\u00a4)", "\u00a4\u00a6");
-        x2s("(?m:\u00a4\u010d.)", "\u00a4\u010d\n", 0, 3);
-        x2s("(?m:.\u00a4\u00e1)", "\u00a4\u0162\n\u00a4\u00e1", 2, 5);
-        x2s("\u00a4\u02d8?", "", 0, 0);
-        x2s("\u0118\u0143?", "\u02db\u02dd", 0, 0);
-        x2s("\u0118\u0143?", "\u0118\u0143", 0, 2);
-        x2s("\u00ce\u011a*", "", 0, 0);
-        x2s("\u00ce\u011a*", "\u00ce\u011a", 0, 2);
-        x2s("\u00bb\u0147*", "\u00bb\u0147\u00bb\u0147\u00bb\u0147", 0, 6);
-        x2s("\u00c7\u010e*", "\u013d\u017b\u00c7\u010e\u00c7\u010e\u00c7\u010e\u00c7\u010e", 0, 0);
-        ns("\u00bb\u0142+", "");
-        x2s("\u02db\u010e+", "\u02db\u010e", 0, 2);
-        x2s("\u00bb\u0163+", "\u00bb\u0163\u00bb\u0163\u00bb\u0163\u00bb\u0163", 0, 8);
-        x2s("\u00a4\u00a8+", "\u00a4\u00a8\u00a4\u00a8\u00a4\u00a6\u00a4\u00a6\u00a4\u00a6", 0, 4);
-        x2s("\u00a4\u00a6+", "\u00a4\u015e\u00a4\u00a6\u00a4\u00a6\u00a4\u00a6\u00a4\u00a6", 2, 10);
-        x2s(".?", "\u00a4\u017c", 0, 2);
-        x2s(".*", "\u00a4\u0143\u00a4\u00d4\u00a4\u00d7\u00a4\u00da", 0, 8);
-        x2s(".+", "\u00a4\u00ed", 0, 2);
-        x2s(".+", "\u00a4\u00a4\u00a4\u00a6\u00a4\u00a8\u00a4\u00ab\n", 0, 8);
-        x2s("\u00a4\u02d8|\u00a4\u00a4", "\u00a4\u02d8", 0, 2);
-        x2s("\u00a4\u02d8|\u00a4\u00a4", "\u00a4\u00a4", 0, 2);
-        x2s("\u00a4\u02d8\u00a4\u00a4|\u00a4\u00a4\u00a4\u00a6", "\u00a4\u02d8\u00a4\u00a4", 0, 4);
-        x2s("\u00a4\u02d8\u00a4\u00a4|\u00a4\u00a4\u00a4\u00a6", "\u00a4\u00a4\u00a4\u00a6", 0, 4);
-        x2s("\u00a4\u0148(?:\u00a4\u00ab\u00a4\u00ad|\u00a4\u00ad\u00a4\u017b)", "\u00a4\u0148\u00a4\u00ab\u00a4\u00ad", 0, 6);
-        x2s("\u00a4\u0148(?:\u00a4\u00ab\u00a4\u00ad|\u00a4\u00ad\u00a4\u017b)\u00a4\u00b1", "\u00a4\u0148\u00a4\u00ad\u00a4\u017b\u00a4\u00b1", 0, 8);
-        x2s("\u00a4\u02d8\u00a4\u00a4|(?:\u00a4\u02d8\u00a4\u00a6|\u00a4\u02d8\u00a4\u0148)", "\u00a4\u02d8\u00a4\u0148", 0, 4);
-        x2s("\u00a4\u02d8|\u00a4\u00a4|\u00a4\u00a6", "\u00a4\u00a8\u00a4\u00a6", 2, 4);
-        x2s("\u00a4\u02d8|\u00a4\u00a4|\u00a4\u00a6\u00a4\u00a8|\u00a4\u015e\u00a4\u00ab\u00a4\u00ad|\u00a4\u017b|\u00a4\u00b1\u00a4\u0142\u00a4\u00b5|\u00a4\u00b7\u00a4\u0105\u00a4\u00bb|\u00a4\u02dd|\u00a4\u017c\u00a4\u00c1|\u00a4\u00c4\u00a4\u0106\u00a4\u010c\u00a4\u0118\u00a4\u00cb|\u00a4\u011a\u00a4\u00cd", "\u00a4\u00b7\u00a4\u0105\u00a4\u00bb", 0, 6);
-        ns("\u00a4\u02d8|\u00a4\u00a4|\u00a4\u00a6\u00a4\u00a8|\u00a4\u015e\u00a4\u00ab\u00a4\u00ad|\u00a4\u017b|\u00a4\u00b1\u00a4\u0142\u00a4\u00b5|\u00a4\u00b7\u00a4\u0105\u00a4\u00bb|\u00a4\u02dd|\u00a4\u017c\u00a4\u00c1|\u00a4\u00c4\u00a4\u0106\u00a4\u010c\u00a4\u0118\u00a4\u00cb|\u00a4\u011a\u00a4\u00cd", "\u00a4\u0105\u00a4\u00bb");
-        x2s("\u00a4\u02d8|^\u00a4\u010f", "\u00a4\u00d6\u00a4\u02d8", 2, 4);
-        x2s("\u00a4\u02d8|^\u00a4\u0148", "\u00a4\u0148\u00a4\u02d8", 0, 2);
-        x2s("\u00b5\u00b4|\\G\u013d\u00d6", "\u00a4\u00b1\u013d\u00d6\u00b5\u00b4", 4, 6);
-        x2s("\u00b5\u00b4|\\G\u013d\u00d6", "\u013d\u00d6\u00b5\u00b4", 0, 2);
-        x2s("\u00b5\u00b4|\\A\u013d\u00d6", "b\u013d\u00d6\u00b5\u00b4", 3, 5);
-        x2s("\u00b5\u00b4|\\A\u013d\u00d6", "\u013d\u00d6", 0, 2);
-        x2s("\u00b5\u00b4|\u013d\u00d6\\Z", "\u013d\u00d6\u00b5\u00b4", 2, 4);
-        x2s("\u00b5\u00b4|\u013d\u00d6\\Z", "\u013d\u00d6", 0, 2);
-        x2s("\u00b5\u00b4|\u013d\u00d6\\Z", "\u013d\u00d6\n", 0, 2);
-        x2s("\u00b5\u00b4|\u013d\u00d6\\z", "\u013d\u00d6\u00b5\u00b4", 2, 4);
-        x2s("\u00b5\u00b4|\u013d\u00d6\\z", "\u013d\u00d6", 0, 2);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\\w|\\s", "\u00a4\u015e", 0, 2);
-        x2s("\\w|%", "%\u00a4\u015e", 0, 1);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\\w|[&$]", "\u00a4\u00a6&", 0, 2);
-        x2s("[\u00a4\u00a4-\u00a4\u00b1]", "\u00a4\u00a6", 0, 2);
-        x2s("[\u00a4\u00a4-\u00a4\u00b1]|[^\u00a4\u00ab-\u00a4\u0142]", "\u00a4\u02d8", 0, 2);
-        x2s("[\u00a4\u00a4-\u00a4\u00b1]|[^\u00a4\u00ab-\u00a4\u0142]", "\u00a4\u00ab", 0, 2);
-        x2s("[^\u00a4\u02d8]", "\n", 0, 1);
-        x2s("(?:\u00a4\u02d8|[\u00a4\u00a6-\u00a4\u00ad])|\u00a4\u00a4\u00a4\u0148", "\u00a4\u00a6\u00a4\u0148", 0, 2);
-        x2s("(?:\u00a4\u02d8|[\u00a4\u00a6-\u00a4\u00ad])|\u00a4\u00a4\u00a4\u0148", "\u00a4\u00a4\u00a4\u0148", 0, 4);
-        x2s("\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6|(?=\u00a4\u00b1\u00a4\u00b1)..\u00a4\u0170", "\u00a4\u00b1\u00a4\u00b1\u00a4\u0170", 0, 6);
-        x2s("\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6|(?!\u00a4\u00b1\u00a4\u00b1)..\u00a4\u0170", "\u00a4\u02d8\u00a4\u00a4\u00a4\u0170", 0, 6);
-        // if (Config.VANILLA) x2s("(?=\u00a4\u0148\u00a4\u02d8)..\u00a4\u02d8|(?=\u00a4\u0148\u00a4\u0148)..\u00a4\u02d8", "\u00a4\u0148\u00a4\u0148\u00a4\u02d8", 0, 6);
-        x2s("(?<=\u00a4\u02d8|\u00a4\u00a4\u00a4\u00a6)\u00a4\u00a4", "\u00a4\u00a4\u00a4\u00a6\u00a4\u00a4", 4, 6);
-        ns("(?>\u00a4\u02d8|\u00a4\u02d8\u00a4\u00a4\u00a4\u00a8)\u00a4\u00a6", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a8\u00a4\u00a6");
-        x2s("(?>\u00a4\u02d8\u00a4\u00a4\u00a4\u00a8|\u00a4\u02d8)\u00a4\u00a6", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a8\u00a4\u00a6", 0, 8);
-        x2s("\u00a4\u02d8?|\u00a4\u00a4", "\u00a4\u02d8", 0, 2);
-        x2s("\u00a4\u02d8?|\u00a4\u00a4", "\u00a4\u00a4", 0, 0);
-        x2s("\u00a4\u02d8?|\u00a4\u00a4", "", 0, 0);
-        x2s("\u00a4\u02d8*|\u00a4\u00a4", "\u00a4\u02d8\u00a4\u02d8", 0, 4);
-        x2s("\u00a4\u02d8*|\u00a4\u00a4*", "\u00a4\u00a4\u00a4\u02d8", 0, 0);
-        x2s("\u00a4\u02d8*|\u00a4\u00a4*", "\u00a4\u02d8\u00a4\u00a4", 0, 2);
-        x2s("[a\u00a4\u02d8]*|\u00a4\u00a4*", "a\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 0, 3);
-        x2s("\u00a4\u02d8+|\u00a4\u00a4*", "", 0, 0);
-        x2s("\u00a4\u02d8+|\u00a4\u00a4*", "\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 0, 6);
-        x2s("\u00a4\u02d8+|\u00a4\u00a4*", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 0, 2);
-        x2s("\u00a4\u02d8+|\u00a4\u00a4*", "a\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 0, 0);
-        ns("\u00a4\u02d8+|\u00a4\u00a4+", "");
-        x2s("(\u00a4\u02d8|\u00a4\u00a4)?", "\u00a4\u00a4", 0, 2);
-        x2s("(\u00a4\u02d8|\u00a4\u00a4)*", "\u00a4\u00a4\u00a4\u02d8", 0, 4);
-        x2s("(\u00a4\u02d8|\u00a4\u00a4)+", "\u00a4\u00a4\u00a4\u02d8\u00a4\u00a4", 0, 6);
-        x2s("(\u00a4\u02d8\u00a4\u00a4|\u00a4\u00a6\u00a4\u02d8)+", "\u00a4\u00a6\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6\u00a4\u00a8", 0, 8);
-        x2s("(\u00a4\u02d8\u00a4\u00a4|\u00a4\u00a6\u00a4\u00a8)+", "\u00a4\u00a6\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6\u00a4\u00a8", 4, 12);
-        x2s("(\u00a4\u02d8\u00a4\u00a4|\u00a4\u00a6\u00a4\u02d8)+", "\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6\u00a4\u02d8", 2, 10);
-        x2s("(\u00a4\u02d8\u00a4\u00a4|\u00a4\u00a6\u00a4\u02d8)+", "\u00a4\u02d8\u00a4\u00a4\u00a4\u0148\u00a4\u00a6\u00a4\u02d8", 0, 4);
-        x2s("(\u00a4\u02d8\u00a4\u00a4|\u00a4\u00a6\u00a4\u02d8)+", "$$zzzz\u00a4\u02d8\u00a4\u00a4\u00a4\u0148\u00a4\u00a6\u00a4\u02d8", 6, 10);
-        x2s("(\u00a4\u02d8|\u00a4\u00a4\u00a4\u02d8\u00a4\u00a4)+", "\u00a4\u02d8\u00a4\u00a4\u00a4\u02d8\u00a4\u00a4\u00a4\u02d8", 0, 10);
-        x2s("(\u00a4\u02d8|\u00a4\u00a4\u00a4\u02d8\u00a4\u00a4)+", "\u00a4\u00a4\u00a4\u02d8", 2, 4);
-        x2s("(\u00a4\u02d8|\u00a4\u00a4\u00a4\u02d8\u00a4\u00a4)+", "\u00a4\u00a4\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u02d8", 2, 8);
-        x2s("(?:\u00a4\u02d8|\u00a4\u00a4)(?:\u00a4\u02d8|\u00a4\u00a4)", "\u00a4\u02d8\u00a4\u00a4", 0, 4);
-        x2s("(?:\u00a4\u02d8*|\u00a4\u00a4*)(?:\u00a4\u02d8*|\u00a4\u00a4*)", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 0, 6);
-        x2s("(?:\u00a4\u02d8*|\u00a4\u00a4*)(?:\u00a4\u02d8+|\u00a4\u00a4+)", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 0, 12);
-        x2s("(?:\u00a4\u02d8+|\u00a4\u00a4+){2}", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 0, 12);
-        x2s("(?:\u00a4\u02d8+|\u00a4\u00a4+){1,2}", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 0, 12);
-        x2s("(?:\u00a4\u02d8+|\\A\u00a4\u00a4*)\u00a4\u00a6\u00a4\u00a6", "\u00a4\u00a6\u00a4\u00a6", 0, 4);
-        ns("(?:\u00a4\u02d8+|\\A\u00a4\u00a4*)\u00a4\u00a6\u00a4\u00a6", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6\u00a4\u00a6");
-        x2s("(?:^\u00a4\u02d8+|\u00a4\u00a4+)*\u00a4\u00a6", "\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 12, 16);
-        x2s("(?:^\u00a4\u02d8+|\u00a4\u00a4+)*\u00a4\u00a6", "\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a6", 0, 14);
-        x2s("\u00a4\u00a6{0,}", "\u00a4\u00a6\u00a4\u00a6\u00a4\u00a6\u00a4\u00a6", 0, 8);
-        x2s("\u00a4\u02d8|(?i)c", "C", 0, 1);
-        x2s("(?i)c|\u00a4\u02d8", "C", 0, 1);
-        x2s("(?i:\u00a4\u02d8)|a", "a", 0, 1);
-        ns("(?i:\u00a4\u02d8)|a", "A");
-        x2s("[\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]?", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 0, 2);
-        x2s("[\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]*", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 0, 6);
-        x2s("[^\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]*", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 0, 0);
-        ns("[^\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]+", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6");
-        x2s("\u00a4\u02d8??", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8", 0, 0);
-        x2s("\u00a4\u00a4\u00a4\u02d8??\u00a4\u00a4", "\u00a4\u00a4\u00a4\u02d8\u00a4\u00a4", 0, 6);
-        x2s("\u00a4\u02d8*?", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8", 0, 0);
-        x2s("\u00a4\u00a4\u00a4\u02d8*?", "\u00a4\u00a4\u00a4\u02d8\u00a4\u02d8", 0, 2);
-        x2s("\u00a4\u00a4\u00a4\u02d8*?\u00a4\u00a4", "\u00a4\u00a4\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4", 0, 8);
-        x2s("\u00a4\u02d8+?", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8", 0, 2);
-        x2s("\u00a4\u00a4\u00a4\u02d8+?", "\u00a4\u00a4\u00a4\u02d8\u00a4\u02d8", 0, 4);
-        x2s("\u00a4\u00a4\u00a4\u02d8+?\u00a4\u00a4", "\u00a4\u00a4\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4", 0, 8);
-        x2s("(?:\u0139\u00b7?)??", "\u0139\u00b7", 0, 0);
-        x2s("(?:\u0139\u00b7??)?", "\u0139\u00b7", 0, 0);
-        x2s("(?:\u011a\u00b4?)+?", "\u011a\u00b4\u011a\u00b4\u011a\u00b4", 0, 2);
-        x2s("(?:\u00c9\u00f7+)??", "\u00c9\u00f7\u00c9\u00f7\u00c9\u00f7", 0, 0);
-        x2s("(?:\u0154\u0103+)??\u00c1\u00fa", "\u0154\u0103\u0154\u0103\u0154\u0103\u00c1\u00fa", 0, 8);
-        x2s("(?:\u00a4\u02d8\u00a4\u00a4)?{2}", "", 0, 0);
-        x2s("(?:\u00b5\u00b4\u013d\u00d6)?{2}", "\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4", 0, 8);
-        x2s("(?:\u00b5\u00b4\u013d\u00d6)*{0}", "\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4", 0, 0);
-        x2s("(?:\u00b5\u00b4\u013d\u00d6){3,}", "\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6", 0, 16);
-        ns("(?:\u00b5\u00b4\u013d\u00d6){3,}", "\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6");
-        x2s("(?:\u00b5\u00b4\u013d\u00d6){2,4}", "\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6", 0, 12);
-        x2s("(?:\u00b5\u00b4\u013d\u00d6){2,4}", "\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6", 0, 16);
-        x2s("(?:\u00b5\u00b4\u013d\u00d6){2,4}?", "\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6", 0, 8);
-        x2s("(?:\u00b5\u00b4\u013d\u00d6){,}", "\u00b5\u00b4\u013d\u00d6{,}", 0, 7);
-        x2s("(?:\u00a4\u00ab\u00a4\u00ad\u00a4\u017b)+?{2}", "\u00a4\u00ab\u00a4\u00ad\u00a4\u017b\u00a4\u00ab\u00a4\u00ad\u00a4\u017b\u00a4\u00ab\u00a4\u00ad\u00a4\u017b", 0, 12);
-        x3s("(\u02db\u0110)", "\u02db\u0110", 0, 2, 1);
-        x3s("(\u02db\u0110\u017c\u013a)", "\u02db\u0110\u017c\u013a", 0, 4, 1);
-        x2s("((\u00bb\u0163\u00b4\u00d6))", "\u00bb\u0163\u00b4\u00d6", 0, 4);
-        x3s("((\u00c9\u00f7\u017c\u013a))", "\u00c9\u00f7\u017c\u013a", 0, 4, 1);
-        x3s("((\u015f\u0148\u0106\u00fc))", "\u015f\u0148\u0106\u00fc", 0, 4, 2);
-        x3s("((((((((((((((((((((\u00ce\u011a\u00bb\u0147))))))))))))))))))))", "\u00ce\u011a\u00bb\u0147", 0, 4, 20);
-        x3s("(\u00a4\u02d8\u00a4\u00a4)(\u00a4\u00a6\u00a4\u00a8)", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6\u00a4\u00a8", 0, 4, 1);
-        x3s("(\u00a4\u02d8\u00a4\u00a4)(\u00a4\u00a6\u00a4\u00a8)", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6\u00a4\u00a8", 4, 8, 2);
-        x3s("()(\u00a4\u02d8)\u00a4\u00a4\u00a4\u00a6(\u00a4\u00a8\u00a4\u015e\u00a4\u00ab)\u00a4\u00ad\u00a4\u017b\u00a4\u00b1\u00a4\u0142", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6\u00a4\u00a8\u00a4\u015e\u00a4\u00ab\u00a4\u00ad\u00a4\u017b\u00a4\u00b1\u00a4\u0142", 6, 12, 3);
-        x3s("(()(\u00a4\u02d8)\u00a4\u00a4\u00a4\u00a6(\u00a4\u00a8\u00a4\u015e\u00a4\u00ab)\u00a4\u00ad\u00a4\u017b\u00a4\u00b1\u00a4\u0142)", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6\u00a4\u00a8\u00a4\u015e\u00a4\u00ab\u00a4\u00ad\u00a4\u017b\u00a4\u00b1\u00a4\u0142", 6, 12, 4);
-        x3s(".*(\u0104\u0150\u0104\u00a9)\u0104\u00f3\u02c7\u00a6\u0104\u0162(\u0104\u00f3()\u0104\u00b7\u0104\u013a\u0104\u017c)\u0104\u00a4\u0104\u00f3", "\u0104\u0150\u0104\u00a9\u0104\u00f3\u02c7\u00a6\u0104\u0162\u0104\u00f3\u0104\u00b7\u0104\u013a\u0104\u017c\u0104\u00a4\u0104\u00f3", 10, 18, 2);
-        x2s("(^\u00a4\u02d8)", "\u00a4\u02d8", 0, 2);
-        x3s("(\u00a4\u02d8)|(\u00a4\u02d8)", "\u00a4\u00a4\u00a4\u02d8", 2, 4, 1);
-        x3s("(^\u00a4\u02d8)|(\u00a4\u02d8)", "\u00a4\u00a4\u00a4\u02d8", 2, 4, 2);
-        x3s("(\u00a4\u02d8?)", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8", 0, 2, 1);
-        x3s("(\u00a4\u0162*)", "\u00a4\u0162\u00a4\u0162\u00a4\u0162", 0, 6, 1);
-        x3s("(\u00a4\u010c*)", "", 0, 0, 1);
-        x3s("(\u00a4\u00eb+)", "\u00a4\u00eb\u00a4\u00eb\u00a4\u00eb\u00a4\u00eb\u00a4\u00eb\u00a4\u00eb\u00a4\u00eb", 0, 14, 1);
-        x3s("(\u00a4\u0150+|\u00a4\u0158*)", "\u00a4\u0150\u00a4\u0150\u00a4\u0150\u00a4\u0158\u00a4\u0158", 0, 6, 1);
-        x3s("(\u00a4\u02d8+|\u00a4\u00a4?)", "\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u02d8\u00a4\u02d8", 0, 2, 1);
-        x3s("(\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6)?", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 0, 6, 1);
-        x3s("(\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6)*", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 0, 6, 1);
-        x3s("(\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6)+", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 0, 6, 1);
-        x3s("(\u00a4\u00b5\u00a4\u00b7\u00a4\u0105|\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6)+", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 0, 6, 1);
-        x3s("([\u00a4\u0118\u00a4\u00cb\u00a4\u011a][\u00a4\u00ab\u00a4\u00ad\u00a4\u017b]|\u00a4\u00ab\u00a4\u00ad\u00a4\u017b)+", "\u00a4\u00ab\u00a4\u00ad\u00a4\u017b", 0, 6, 1);
-        x3s("((?i:\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6))", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 0, 6, 1);
-        x3s("((?m:\u00a4\u02d8.\u00a4\u00a6))", "\u00a4\u02d8\n\u00a4\u00a6", 0, 5, 1);
-        x3s("((?=\u00a4\u02d8\u00a4\u00f3)\u00a4\u02d8)", "\u00a4\u02d8\u00a4\u00f3\u00a4\u00a4", 0, 2, 1);
-        x3s("\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6|(.\u00a4\u02d8\u00a4\u00a4\u00a4\u00a8)", "\u00a4\u00f3\u00a4\u02d8\u00a4\u00a4\u00a4\u00a8", 0, 8, 1);
-        x3s("\u00a4\u02d8*(.)", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00f3", 8, 10, 1);
-        x3s("\u00a4\u02d8*?(.)", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00f3", 0, 2, 1);
-        x3s("\u00a4\u02d8*?(\u00a4\u00f3)", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00f3", 8, 10, 1);
-        x3s("[\u00a4\u00a4\u00a4\u00a6\u00a4\u00a8]\u00a4\u02d8*(.)", "\u00a4\u00a8\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00f3", 10, 12, 1);
-        x3s("(\\A\u00a4\u00a4\u00a4\u00a4)\u00a4\u00a6\u00a4\u00a6", "\u00a4\u00a4\u00a4\u00a4\u00a4\u00a6\u00a4\u00a6", 0, 4, 1);
-        ns("(\\A\u00a4\u00a4\u00a4\u00a4)\u00a4\u00a6\u00a4\u00a6", "\u00a4\u00f3\u00a4\u00a4\u00a4\u00a4\u00a4\u00a6\u00a4\u00a6");
-        x3s("(^\u00a4\u00a4\u00a4\u00a4)\u00a4\u00a6\u00a4\u00a6", "\u00a4\u00a4\u00a4\u00a4\u00a4\u00a6\u00a4\u00a6", 0, 4, 1);
-        ns("(^\u00a4\u00a4\u00a4\u00a4)\u00a4\u00a6\u00a4\u00a6", "\u00a4\u00f3\u00a4\u00a4\u00a4\u00a4\u00a4\u00a6\u00a4\u00a6");
-        x3s("\u00a4\u00ed\u00a4\u00ed(\u00a4\u00eb\u00a4\u00eb$)", "\u00a4\u00ed\u00a4\u00ed\u00a4\u00eb\u00a4\u00eb", 4, 8, 1);
-        ns("\u00a4\u00ed\u00a4\u00ed(\u00a4\u00eb\u00a4\u00eb$)", "\u00a4\u00ed\u00a4\u00ed\u00a4\u00eb\u00a4\u00eb\u00a4\u00eb");
-        x2s("(\u011a\u00b5)\\1", "\u011a\u00b5\u011a\u00b5", 0, 4);
-        ns("(\u011a\u00b5)\\1", "\u011a\u00b5\u00c9\u0111");
-        x2s("(\u00b6\u0151?)\\1", "\u00b6\u0151\u00b6\u0151", 0, 4);
-        x2s("(\u00b6\u0151??)\\1", "\u00b6\u0151\u00b6\u0151", 0, 0);
-        x2s("(\u00b6\u0151*)\\1", "\u00b6\u0151\u00b6\u0151\u00b6\u0151\u00b6\u0151\u00b6\u0151", 0, 8);
-        x3s("(\u00b6\u0151*)\\1", "\u00b6\u0151\u00b6\u0151\u00b6\u0151\u00b6\u0151\u00b6\u0151", 0, 4, 1);
-        x2s("\u00a4\u02d8(\u00a4\u00a4*)\\1", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 0, 10);
-        x2s("\u00a4\u02d8(\u00a4\u00a4*)\\1", "\u00a4\u02d8\u00a4\u00a4", 0, 2);
-        x2s("(\u00a4\u02d8*)(\u00a4\u00a4*)\\1\\2", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4", 0, 20);
-        x2s("(\u00a4\u02d8*)(\u00a4\u00a4*)\\2", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 0, 14);
-        x3s("(\u00a4\u02d8*)(\u00a4\u00a4*)\\2", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 6, 10, 2);
-        x2s("(((((((\u00a4\u00dd*)\u00a4\u00da))))))\u00a4\u00d4\\7", "\u00a4\u00dd\u00a4\u00dd\u00a4\u00dd\u00a4\u00da\u00a4\u00d4\u00a4\u00dd\u00a4\u00dd\u00a4\u00dd", 0, 16);
-        x3s("(((((((\u00a4\u00dd*)\u00a4\u00da))))))\u00a4\u00d4\\7", "\u00a4\u00dd\u00a4\u00dd\u00a4\u00dd\u00a4\u00da\u00a4\u00d4\u00a4\u00dd\u00a4\u00dd\u00a4\u00dd", 0, 6, 7);
-        x2s("(\u00a4\u010e)(\u00a4\u0147)(\u00a4\u0150)\\2\\1\\3", "\u00a4\u010e\u00a4\u0147\u00a4\u0150\u00a4\u0147\u00a4\u010e\u00a4\u0150", 0, 12);
-        x2s("([\u00a4\u00ad-\u00a4\u00b1])\\1", "\u00a4\u017b\u00a4\u017b", 0, 4);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("(\\w\\d\\s)\\1", "\u00a4\u02d85 \u00a4\u02d85 ", 0, 8);
-        ns("(\\w\\d\\s)\\1", "\u00a4\u02d85 \u00a4\u02d85");
-        x2s("(\u0102\u017b\u02c7\u00a9|[\u00a4\u02d8-\u00a4\u00a6]{3})\\1", "\u0102\u017b\u02c7\u00a9\u0102\u017b\u02c7\u00a9", 0, 8);
-        x2s("...(\u0102\u017b\u02c7\u00a9|[\u00a4\u02d8-\u00a4\u00a6]{3})\\1", "\u00a4\u02d8a\u00a4\u02d8\u0102\u017b\u02c7\u00a9\u0102\u017b\u02c7\u00a9", 0, 13);
-        x2s("(\u0102\u017b\u02c7\u00a9|[\u00a4\u02d8-\u00a4\u00a6]{3})\\1", "\u00a4\u00a6\u00a4\u00a4\u00a4\u00a6\u00a4\u00a6\u00a4\u00a4\u00a4\u00a6", 0, 12);
-        x2s("(^\u00a4\u0142)\\1", "\u00a4\u0142\u00a4\u0142", 0, 4);
-        ns("(^\u00a4\u0155)\\1", "\u00a4\u00e1\u00a4\u0155\u00a4\u0155");
-        ns("(\u00a4\u02d8$)\\1", "\u00a4\u02d8\u00a4\u02d8");
-        ns("(\u00a4\u02d8\u00a4\u00a4\\Z)\\1", "\u00a4\u02d8\u00a4\u00a4");
-        x2s("(\u00a4\u02d8*\\Z)\\1", "\u00a4\u02d8", 2, 2);
-        x2s(".(\u00a4\u02d8*\\Z)\\1", "\u00a4\u00a4\u00a4\u02d8", 2, 4);
-        x3s("(.(\u00a4\u00e4\u00a4\u00a4\u00a4\u0107)\\2)", "z\u00a4\u00e4\u00a4\u00a4\u00a4\u0107\u00a4\u00e4\u00a4\u00a4\u00a4\u0107", 0, 13, 1);
-        x3s("(.(..\\d.)\\2)", "\u00a4\u02d812341234", 0, 10, 1);
-        x2s("((?i:\u00a4\u02d8v\u00a4\u015f))\\1", "\u00a4\u02d8v\u00a4\u015f\u00a4\u02d8v\u00a4\u015f", 0, 10);
-        x2s("(?<\u00b6\u0148\u00a4\u00ab>\u0118\u0143|\\(\\g<\u00b6\u0148\u00a4\u00ab>\\))", "((((((\u0118\u0143))))))", 0, 14);
-        x2s("\\A(?:\\g<\u00b0\u00a4_1>|\\g<\u00b1\u013e_2>|\\z\u02dd\u015e\u00ce\u00bb  (?<\u00b0\u00a4_1>\u00b4\u0143|\u013d\u00ab\\g<\u00b1\u013e_2>\u013d\u00ab)(?<\u00b1\u013e_2>\u015f\u00df|\u0118\u00ee\u00bb\u00a7\\g<\u00b0\u00a4_1>\u0118\u00ee\u00bb\u00a7))$", "\u0118\u00ee\u00bb\u00a7\u013d\u00ab\u0118\u00ee\u00bb\u00a7\u013d\u00ab\u015f\u00df\u013d\u00ab\u0118\u00ee\u00bb\u00a7\u013d\u00ab\u0118\u00ee\u00bb\u00a7", 0, 26);
-        x2s("[[\u00a4\u0147\u00a4\u0150]]", "\u00a4\u0150", 0, 2);
-        x2s("[[\u00a4\u00a4\u00a4\u015e\u00a4\u00a6]\u00a4\u00ab]", "\u00a4\u00ab", 0, 2);
-        ns("[[^\u00a4\u02d8]]", "\u00a4\u02d8");
-        ns("[^[\u00a4\u02d8]]", "\u00a4\u02d8");
-        x2s("[^[^\u00a4\u02d8]]", "\u00a4\u02d8", 0, 2);
-        x2s("[[\u00a4\u00ab\u00a4\u00ad\u00a4\u017b]&&\u00a4\u00ad\u00a4\u017b]", "\u00a4\u017b", 0, 2);
-        ns("[[\u00a4\u00ab\u00a4\u00ad\u00a4\u017b]&&\u00a4\u00ad\u00a4\u017b]", "\u00a4\u00ab");
-        ns("[[\u00a4\u00ab\u00a4\u00ad\u00a4\u017b]&&\u00a4\u00ad\u00a4\u017b]", "\u00a4\u00b1");
-        x2s("[\u00a4\u02d8-\u00a4\u00f3&&\u00a4\u00a4-\u00a4\u0148&&\u00a4\u00a6-\u00a4\u0144]", "\u00a4\u0144", 0, 2);
-        ns("[^\u00a4\u02d8-\u00a4\u00f3&&\u00a4\u00a4-\u00a4\u0148&&\u00a4\u00a6-\u00a4\u0144]", "\u00a4\u0144");
-        x2s("[[^\u00a4\u02d8&&\u00a4\u02d8]&&\u00a4\u02d8-\u00a4\u00f3]", "\u00a4\u00a4", 0, 2);
-        ns("[[^\u00a4\u02d8&&\u00a4\u02d8]&&\u00a4\u02d8-\u00a4\u00f3]", "\u00a4\u02d8");
-        x2s("[[^\u00a4\u02d8-\u00a4\u00f3&&\u00a4\u00a4\u00a4\u00a6\u00a4\u00a8\u00a4\u015e]&&[^\u00a4\u00a6-\u00a4\u00ab]]", "\u00a4\u00ad", 0, 2);
-        ns("[[^\u00a4\u02d8-\u00a4\u00f3&&\u00a4\u00a4\u00a4\u00a6\u00a4\u00a8\u00a4\u015e]&&[^\u00a4\u00a6-\u00a4\u00ab]]", "\u00a4\u00a4");
-        x2s("[^[^\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]&&[^\u00a4\u00a6\u00a4\u00a8\u00a4\u015e]]", "\u00a4\u00a6", 0, 2);
-        x2s("[^[^\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]&&[^\u00a4\u00a6\u00a4\u00a8\u00a4\u015e]]", "\u00a4\u00a8", 0, 2);
-        ns("[^[^\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]&&[^\u00a4\u00a6\u00a4\u00a8\u00a4\u015e]]", "\u00a4\u00ab");
-        x2s("[\u00a4\u02d8-&&-\u00a4\u02d8]", "-", 0, 1);
-        x2s("[^[^a-z\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]&&[^bcdefg\u00a4\u00a6\u00a4\u00a8\u00a4\u015e]q-w]", "\u00a4\u00a8", 0, 2);
-        x2s("[^[^a-z\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]&&[^bcdefg\u00a4\u00a6\u00a4\u00a8\u00a4\u015e]g-w]", "f", 0, 1);
-        x2s("[^[^a-z\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]&&[^bcdefg\u00a4\u00a6\u00a4\u00a8\u00a4\u015e]g-w]", "g", 0, 1);
-        ns("[^[^a-z\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]&&[^bcdefg\u00a4\u00a6\u00a4\u00a8\u00a4\u015e]g-w]", "2");
-        x2s("a<b>\u0104\u0110\u02c7\u013d\u0104\u00b8\u0104\u00e7\u0104\u00f3\u00a4\u00ce\u0104\u0154\u0104\u00a6\u0104\u00f3\u0104\u00ed\u02c7\u013d\u0104\u00c9<\\/b>", "a<b>\u0104\u0110\u02c7\u013d\u0104\u00b8\u0104\u00e7\u0104\u00f3\u00a4\u00ce\u0104\u0154\u0104\u00a6\u0104\u00f3\u0104\u00ed\u02c7\u013d\u0104\u00c9</b>", 0, 32);
-        x2s(".<b>\u0104\u0110\u02c7\u013d\u0104\u00b8\u0104\u00e7\u0104\u00f3\u00a4\u00ce\u0104\u0154\u0104\u00a6\u0104\u00f3\u0104\u00ed\u02c7\u013d\u0104\u00c9<\\/b>", "a<b>\u0104\u0110\u02c7\u013d\u0104\u00b8\u0104\u00e7\u0104\u00f3\u00a4\u00ce\u0104\u0154\u0104\u00a6\u0104\u00f3\u0104\u00ed\u02c7\u013d\u0104\u00c9</b>", 0, 32);
-    }
-
-    public static void main(String[] args) throws Throwable{
-        new TestC().run();
-    }
-}
+/*
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is furnished to do
+ * so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+package org.joni.test;
+
+import org.jcodings.Encoding;
+import org.jcodings.specific.EUCJPEncoding;
+import org.joni.Option;
+import org.joni.Syntax;
+
+public class TestC extends Test {
+	@Override
+    public int option() {
+        return Option.DEFAULT;
+    }
+	@Override
+    public Encoding encoding() {
+        return EUCJPEncoding.INSTANCE;
+    }
+	@Override
+    public String testEncoding() {
+        return "cp1250";
+    }
+	@Override
+    public Syntax syntax() {
+        return Syntax.DEFAULT;
+    }
+	@Override
+    public void test() throws Exception {
+        x2s("", "", 0, 0);
+        x2s("^", "", 0, 0);
+        x2s("$", "", 0, 0);
+        x2s("\\G", "", 0, 0);
+        x2s("\\A", "", 0, 0);
+        x2s("\\Z", "", 0, 0);
+        x2s("\\z", "", 0, 0);
+        x2s("^$", "", 0, 0);
+        x2s("\\ca", "\001", 0, 1);
+        x2s("\\C-b", "\002", 0, 1);
+        x2s("\\c\\\\", "\034", 0, 1);
+        x2s("q[\\c\\\\]", "q\034", 0, 2);
+        x2s("", "a", 0, 0);
+        x2s("a", "a", 0, 1);
+        x2s("\\x61", "a", 0, 1);
+        x2s("aa", "aa", 0, 2);
+        x2s("aaa", "aaa", 0, 3);
+        x2s("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 0, 35);
+        x2s("ab", "ab", 0, 2);
+        x2s("b", "ab", 1, 2);
+        x2s("bc", "abc", 1, 3);
+        x2s("(?i:#RET#)", "#INS##RET#", 5, 10);
+        x2s("\\17", "\017", 0, 1);
+        x2s("\\x1f", "\u001f", 0, 1);
+        x2s("a(?#....\\\\JJJJ)b", "ab", 0, 2);
+        x2s("(?x)  G (o O(?-x)oO) g L", "GoOoOgLe", 0, 7);
+        x2s(".", "a", 0, 1);
+        ns(".", "");
+        x2s("..", "ab", 0, 2);
+        x2s("\\w", "e", 0, 1);
+        ns("\\W", "e");
+        x2s("\\s", " ", 0, 1);
+        x2s("\\S", "b", 0, 1);
+        x2s("\\d", "4", 0, 1);
+        ns("\\D", "4");
+        x2s("\\b", "z ", 0, 0);
+        x2s("\\b", " z", 1, 1);
+        x2s("\\B", "zz ", 1, 1);
+        x2s("\\B", "z ", 2, 2);
+        x2s("\\B", " z", 0, 0);
+        x2s("[ab]", "b", 0, 1);
+        ns("[ab]", "c");
+        x2s("[a-z]", "t", 0, 1);
+        ns("[^a]", "a");
+        x2s("[^a]", "\n", 0, 1);
+        x2s("[]]", "]", 0, 1);
+        ns("[^]]", "]");
+        x2s("[\\^]+", "0^^1", 1, 3);
+        x2s("[b-]", "b", 0, 1);
+        x2s("[b-]", "-", 0, 1);
+        x2s("[\\w]", "z", 0, 1);
+        ns("[\\w]", " ");
+        x2s("[\\W]", "b$", 1, 2);
+        x2s("[\\d]", "5", 0, 1);
+        ns("[\\d]", "e");
+        x2s("[\\D]", "t", 0, 1);
+        ns("[\\D]", "3");
+        x2s("[\\s]", " ", 0, 1);
+        ns("[\\s]", "a");
+        x2s("[\\S]", "b", 0, 1);
+        ns("[\\S]", " ");
+        x2s("[\\w\\d]", "2", 0, 1);
+        ns("[\\w\\d]", " ");
+        x2s("[[:upper:]]", "B", 0, 1);
+        x2s("[*[:xdigit:]+]", "+", 0, 1);
+        x2s("[*[:xdigit:]+]", "GHIKK-9+*", 6, 7);
+        x2s("[*[:xdigit:]+]", "-@^+", 3, 4);
+        ns("[[:upper]]", "A");
+        x2s("[[:upper]]", ":", 0, 1);
+        x2s("[\\044-\\047]", "\046", 0, 1);
+        x2s("[\\x5a-\\x5c]", "\u005b", 0, 1);
+        x2s("[\\x6A-\\x6D]", "\u006c", 0, 1);
+        ns("[\\x6A-\\x6D]", "\u006e");
+        ns("^[0-9A-F]+ 0+ UNDEF ", "75F 00000000 SECT14A notype ()    External    | _rb_apply");
+        x2s("[\\[]", "[", 0, 1);
+        x2s("[\\]]", "]", 0, 1);
+        x2s("[&]", "&", 0, 1);
+        x2s("[[ab]]", "b", 0, 1);
+        x2s("[[ab]c]", "c", 0, 1);
+        ns("[[^a]]", "a");
+        ns("[^[a]]", "a");
+        x2s("[[ab]&&bc]", "b", 0, 1);
+        ns("[[ab]&&bc]", "a");
+        ns("[[ab]&&bc]", "c");
+        x2s("[a-z&&b-y&&c-x]", "w", 0, 1);
+        ns("[^a-z&&b-y&&c-x]", "w");
+        x2s("[[^a&&a]&&a-z]", "b", 0, 1);
+        ns("[[^a&&a]&&a-z]", "a");
+        x2s("[[^a-z&&bcdef]&&[^c-g]]", "h", 0, 1);
+        ns("[[^a-z&&bcdef]&&[^c-g]]", "c");
+        x2s("[^[^abc]&&[^cde]]", "c", 0, 1);
+        x2s("[^[^abc]&&[^cde]]", "e", 0, 1);
+        ns("[^[^abc]&&[^cde]]", "f");
+        x2s("[a-&&-a]", "-", 0, 1);
+        ns("[a\\-&&\\-a]", "&");
+        ns("\\wabc", " abc");
+        x2s("a\\Wbc", "a bc", 0, 4);
+        x2s("a.b.c", "aabbc", 0, 5);
+        x2s(".\\wb\\W..c", "abb bcc", 0, 7);
+        x2s("\\s\\wzzz", " zzzz", 0, 5);
+        x2s("aa.b", "aabb", 0, 4);
+        ns(".a", "ab");
+        x2s(".a", "aa", 0, 2);
+        x2s("^a", "a", 0, 1);
+        x2s("^a$", "a", 0, 1);
+        x2s("^\\w$", "a", 0, 1);
+        ns("^\\w$", " ");
+        x2s("^\\wab$", "zab", 0, 3);
+        x2s("^\\wabcdef$", "zabcdef", 0, 7);
+        x2s("^\\w...def$", "zabcdef", 0, 7);
+        x2s("\\w\\w\\s\\Waaa\\d", "aa  aaa4", 0, 8);
+        x2s("\\A\\Z", "", 0, 0);
+        x2s("\\Axyz", "xyz", 0, 3);
+        x2s("xyz\\Z", "xyz", 0, 3);
+        x2s("xyz\\z", "xyz", 0, 3);
+        x2s("a\\Z", "a", 0, 1);
+        x2s("\\Gaz", "az", 0, 2);
+        ns("\\Gz", "bza");
+        ns("az\\G", "az");
+        ns("az\\A", "az");
+        ns("a\\Az", "az");
+        x2s("\\^\\$", "^$", 0, 2);
+        x2s("^x?y", "xy", 0, 2);
+        x2s("^(x?y)", "xy", 0, 2);
+        x2s("\\w", "_", 0, 1);
+        ns("\\W", "_");
+        x2s("(?=z)z", "z", 0, 1);
+        ns("(?=z).", "a");
+        x2s("(?!z)a", "a", 0, 1);
+        ns("(?!z)a", "z");
+        x2s("(?i:a)", "a", 0, 1);
+        x2s("(?i:a)", "A", 0, 1);
+        x2s("(?i:A)", "a", 0, 1);
+        ns("(?i:A)", "b");
+        x2s("(?i:[A-Z])", "a", 0, 1);
+        x2s("(?i:[f-m])", "H", 0, 1);
+        x2s("(?i:[f-m])", "h", 0, 1);
+        ns("(?i:[f-m])", "e");
+        x2s("(?i:[A-c])", "D", 0, 1);
+        ns("(?i:[^a-z])", "A");
+        ns("(?i:[^a-z])", "a");
+        x2s("(?i:[!-k])", "Z", 0, 1);
+        x2s("(?i:[!-k])", "7", 0, 1);
+        x2s("(?i:[T-}])", "b", 0, 1);
+        x2s("(?i:[T-}])", "{", 0, 1);
+        x2s("(?i:\\?a)", "?A", 0, 2);
+        x2s("(?i:\\*A)", "*a", 0, 2);
+        ns(".", "\n");
+        x2s("(?m:.)", "\n", 0, 1);
+        x2s("(?m:a.)", "a\n", 0, 2);
+        x2s("(?m:.b)", "a\nb", 1, 3);
+        x2s(".*abc", "dddabdd\nddabc", 8, 13);
+        x2s("(?m:.*abc)", "dddabddabc", 0, 10);
+        ns("(?i)(?-i)a", "A");
+        ns("(?i)(?-i:a)", "A");
+        x2s("a?", "", 0, 0);
+        x2s("a?", "b", 0, 0);
+        x2s("a?", "a", 0, 1);
+        x2s("a*", "", 0, 0);
+        x2s("a*", "a", 0, 1);
+        x2s("a*", "aaa", 0, 3);
+        x2s("a*", "baaaa", 0, 0);
+        ns("a+", "");
+        x2s("a+", "a", 0, 1);
+        x2s("a+", "aaaa", 0, 4);
+        x2s("a+", "aabbb", 0, 2);
+        x2s("a+", "baaaa", 1, 5);
+        x2s(".?", "", 0, 0);
+        x2s(".?", "f", 0, 1);
+        x2s(".?", "\n", 0, 0);
+        x2s(".*", "", 0, 0);
+        x2s(".*", "abcde", 0, 5);
+        x2s(".+", "z", 0, 1);
+        x2s(".+", "zdswer\n", 0, 6);
+        x2s("(.*)a\\1f", "babfbac", 0, 4);
+        x2s("(.*)a\\1f", "bacbabf", 3, 7);
+        x2s("((.*)a\\2f)", "bacbabf", 3, 7);
+        x2s("(.*)a\\1f", "baczzzzzz\nbazz\nzzzzbabf", 19, 23);
+        x2s("a|b", "a", 0, 1);
+        x2s("a|b", "b", 0, 1);
+        x2s("|a", "a", 0, 0);
+        x2s("(|a)", "a", 0, 0);
+        x2s("ab|bc", "ab", 0, 2);
+        x2s("ab|bc", "bc", 0, 2);
+        x2s("z(?:ab|bc)", "zbc", 0, 3);
+        x2s("a(?:ab|bc)c", "aabc", 0, 4);
+        x2s("ab|(?:ac|az)", "az", 0, 2);
+        x2s("a|b|c", "dc", 1, 2);
+        x2s("a|b|cd|efg|h|ijk|lmn|o|pq|rstuvwx|yz", "pqr", 0, 2);
+        ns("a|b|cd|efg|h|ijk|lmn|o|pq|rstuvwx|yz", "mn");
+        x2s("a|^z", "ba", 1, 2);
+        x2s("a|^z", "za", 0, 1);
+        x2s("a|\\Gz", "bza", 2, 3);
+        x2s("a|\\Gz", "za", 0, 1);
+        x2s("a|\\Az", "bza", 2, 3);
+        x2s("a|\\Az", "za", 0, 1);
+        x2s("a|b\\Z", "ba", 1, 2);
+        x2s("a|b\\Z", "b", 0, 1);
+        x2s("a|b\\z", "ba", 1, 2);
+        x2s("a|b\\z", "b", 0, 1);
+        x2s("\\w|\\s", " ", 0, 1);
+        ns("\\w|\\w", " ");
+        x2s("\\w|%", "%", 0, 1);
+        x2s("\\w|[&$]", "&", 0, 1);
+        x2s("[b-d]|[^e-z]", "a", 0, 1);
+        x2s("(?:a|[c-f])|bz", "dz", 0, 1);
+        x2s("(?:a|[c-f])|bz", "bz", 0, 2);
+        x2s("abc|(?=zz)..f", "zzf", 0, 3);
+        x2s("abc|(?!zz)..f", "abf", 0, 3);
+        x2s("(?=za)..a|(?=zz)..a", "zza", 0, 3);
+        ns("(?>a|abd)c", "abdc");
+        x2s("(?>abd|a)c", "abdc", 0, 4);
+        x2s("a?|b", "a", 0, 1);
+        x2s("a?|b", "b", 0, 0);
+        x2s("a?|b", "", 0, 0);
+        x2s("a*|b", "aa", 0, 2);
+        x2s("a*|b*", "ba", 0, 0);
+        x2s("a*|b*", "ab", 0, 1);
+        x2s("a+|b*", "", 0, 0);
+        x2s("a+|b*", "bbb", 0, 3);
+        x2s("a+|b*", "abbb", 0, 1);
+        ns("a+|b+", "");
+        x2s("(a|b)?", "b", 0, 1);
+        x2s("(a|b)*", "ba", 0, 2);
+        x2s("(a|b)+", "bab", 0, 3);
+        x2s("(ab|ca)+", "caabbc", 0, 4);
+        x2s("(ab|ca)+", "aabca", 1, 5);
+        x2s("(ab|ca)+", "abzca", 0, 2);
+        x2s("(a|bab)+", "ababa", 0, 5);
+        x2s("(a|bab)+", "ba", 1, 2);
+        x2s("(a|bab)+", "baaaba", 1, 4);
+        x2s("(?:a|b)(?:a|b)", "ab", 0, 2);
+        x2s("(?:a*|b*)(?:a*|b*)", "aaabbb", 0, 3);
+        x2s("(?:a*|b*)(?:a+|b+)", "aaabbb", 0, 6);
+        x2s("(?:a+|b+){2}", "aaabbb", 0, 6);
+        x2s("h{0,}", "hhhh", 0, 4);
+        x2s("(?:a+|b+){1,2}", "aaabbb", 0, 6);
+        ns("ax{2}*a", "0axxxa1");
+        ns("a.{0,2}a", "0aXXXa0");
+        ns("a.{0,2}?a", "0aXXXa0");
+        ns("a.{0,2}?a", "0aXXXXa0");
+        x2s("^a{2,}?a$", "aaa", 0, 3);
+        x2s("^[a-z]{2,}?$", "aaa", 0, 3);
+        x2s("(?:a+|\\Ab*)cc", "cc", 0, 2);
+        ns("(?:a+|\\Ab*)cc", "abcc");
+        x2s("(?:^a+|b+)*c", "aabbbabc", 6, 8);
+        x2s("(?:^a+|b+)*c", "aabbbbc", 0, 7);
+        x2s("a|(?i)c", "C", 0, 1);
+        x2s("(?i)c|a", "C", 0, 1);
+        x2s("(?i)c|a", "A", 0, 1);
+        x2s("(?i:c)|a", "C", 0, 1);
+        ns("(?i:c)|a", "A");
+        x2s("[abc]?", "abc", 0, 1);
+        x2s("[abc]*", "abc", 0, 3);
+        x2s("[^abc]*", "abc", 0, 0);
+        ns("[^abc]+", "abc");
+        x2s("a??", "aaa", 0, 0);
+        x2s("ba??b", "bab", 0, 3);
+        x2s("a*?", "aaa", 0, 0);
+        x2s("ba*?", "baa", 0, 1);
+        x2s("ba*?b", "baab", 0, 4);
+        x2s("a+?", "aaa", 0, 1);
+        x2s("ba+?", "baa", 0, 2);
+        x2s("ba+?b", "baab", 0, 4);
+        x2s("(?:a?)??", "a", 0, 0);
+        x2s("(?:a??)?", "a", 0, 0);
+        x2s("(?:a?)+?", "aaa", 0, 1);
+        x2s("(?:a+)??", "aaa", 0, 0);
+        x2s("(?:a+)??b", "aaab", 0, 4);
+        x2s("(?:ab)?{2}", "", 0, 0);
+        x2s("(?:ab)?{2}", "ababa", 0, 4);
+        x2s("(?:ab)*{0}", "ababa", 0, 0);
+        x2s("(?:ab){3,}", "abababab", 0, 8);
+        ns("(?:ab){3,}", "abab");
+        x2s("(?:ab){2,4}", "ababab", 0, 6);
+        x2s("(?:ab){2,4}", "ababababab", 0, 8);
+        x2s("(?:ab){2,4}?", "ababababab", 0, 4);
+        x2s("(?:ab){,}", "ab{,}", 0, 5);
+        x2s("(?:abc)+?{2}", "abcabcabc", 0, 6);
+        x2s("(?:X*)(?i:xa)", "XXXa", 0, 4);
+        x2s("(d+)([^abc]z)", "dddz", 0, 4);
+        x2s("([^abc]*)([^abc]z)", "dddz", 0, 4);
+        x2s("(\\w+)(\\wz)", "dddz", 0, 4);
+        x3s("(a)", "a", 0, 1, 1);
+        x3s("(ab)", "ab", 0, 2, 1);
+        x2s("((ab))", "ab", 0, 2);
+        x3s("((ab))", "ab", 0, 2, 1);
+        x3s("((ab))", "ab", 0, 2, 2);
+        x3s("((((((((((((((((((((ab))))))))))))))))))))", "ab", 0, 2, 20);
+        x3s("(ab)(cd)", "abcd", 0, 2, 1);
+        x3s("(ab)(cd)", "abcd", 2, 4, 2);
+        x3s("()(a)bc(def)ghijk", "abcdefghijk", 3, 6, 3);
+        x3s("(()(a)bc(def)ghijk)", "abcdefghijk", 3, 6, 4);
+        x2s("(^a)", "a", 0, 1);
+        x3s("(a)|(a)", "ba", 1, 2, 1);
+        x3s("(^a)|(a)", "ba", 1, 2, 2);
+        x3s("(a?)", "aaa", 0, 1, 1);
+        x3s("(a*)", "aaa", 0, 3, 1);
+        x3s("(a*)", "", 0, 0, 1);
+        x3s("(a+)", "aaaaaaa", 0, 7, 1);
+        x3s("(a+|b*)", "bbbaa", 0, 3, 1);
+        x3s("(a+|b?)", "bbbaa", 0, 1, 1);
+        x3s("(abc)?", "abc", 0, 3, 1);
+        x3s("(abc)*", "abc", 0, 3, 1);
+        x3s("(abc)+", "abc", 0, 3, 1);
+        x3s("(xyz|abc)+", "abc", 0, 3, 1);
+        x3s("([xyz][abc]|abc)+", "abc", 0, 3, 1);
+        x3s("((?i:abc))", "AbC", 0, 3, 1);
+        x2s("(abc)(?i:\\1)", "abcABC", 0, 6);
+        x3s("((?m:a.c))", "a\nc", 0, 3, 1);
+        x3s("((?=az)a)", "azb", 0, 1, 1);
+        x3s("abc|(.abd)", "zabd", 0, 4, 1);
+        x2s("(?:abc)|(ABC)", "abc", 0, 3);
+        x3s("(?i:(abc))|(zzz)", "ABC", 0, 3, 1);
+        x3s("a*(.)", "aaaaz", 4, 5, 1);
+        x3s("a*?(.)", "aaaaz", 0, 1, 1);
+        x3s("a*?(c)", "aaaac", 4, 5, 1);
+        x3s("[bcd]a*(.)", "caaaaz", 5, 6, 1);
+        x3s("(\\Abb)cc", "bbcc", 0, 2, 1);
+        ns("(\\Abb)cc", "zbbcc");
+        x3s("(^bb)cc", "bbcc", 0, 2, 1);
+        ns("(^bb)cc", "zbbcc");
+        x3s("cc(bb$)", "ccbb", 2, 4, 1);
+        ns("cc(bb$)", "ccbbb");
+        ns("(\\1)", "");
+        ns("\\1(a)", "aa");
+        ns("(a(b)\\1)\\2+", "ababb");
+        ns("(?:(?:\\1|z)(a))+$", "zaa");
+        x2s("(?:(?:\\1|z)(a))+$", "zaaa", 0, 4);
+        x2s("(a)(?=\\1)", "aa", 0, 1);
+        ns("(a)$|\\1", "az");
+        x2s("(a)\\1", "aa", 0, 2);
+        ns("(a)\\1", "ab");
+        x2s("(a?)\\1", "aa", 0, 2);
+        x2s("(a??)\\1", "aa", 0, 0);
+        x2s("(a*)\\1", "aaaaa", 0, 4);
+        x3s("(a*)\\1", "aaaaa", 0, 2, 1);
+        x2s("a(b*)\\1", "abbbb", 0, 5);
+        x2s("a(b*)\\1", "ab", 0, 1);
+        x2s("(a*)(b*)\\1\\2", "aaabbaaabb", 0, 10);
+        x2s("(a*)(b*)\\2", "aaabbbb", 0, 7);
+        x2s("(((((((a*)b))))))c\\7", "aaabcaaa", 0, 8);
+        x3s("(((((((a*)b))))))c\\7", "aaabcaaa", 0, 3, 7);
+        x2s("(a)(b)(c)\\2\\1\\3", "abcbac", 0, 6);
+        x2s("([a-d])\\1", "cc", 0, 2);
+        x2s("(\\w\\d\\s)\\1", "f5 f5 ", 0, 6);
+        ns("(\\w\\d\\s)\\1", "f5 f5");
+        x2s("(who|[a-c]{3})\\1", "whowho", 0, 6);
+        x2s("...(who|[a-c]{3})\\1", "abcwhowho", 0, 9);
+        x2s("(who|[a-c]{3})\\1", "cbccbc", 0, 6);
+        x2s("(^a)\\1", "aa", 0, 2);
+        ns("(^a)\\1", "baa");
+        ns("(a$)\\1", "aa");
+        ns("(ab\\Z)\\1", "ab");
+        x2s("(a*\\Z)\\1", "a", 1, 1);
+        x2s(".(a*\\Z)\\1", "ba", 1, 2);
+        x3s("(.(abc)\\2)", "zabcabc", 0, 7, 1);
+        x3s("(.(..\\d.)\\2)", "z12341234", 0, 9, 1);
+        x2s("((?i:az))\\1", "AzAz", 0, 4);
+        ns("((?i:az))\\1", "Azaz");
+        x2s("(?<=a)b", "ab", 1, 2);
+        ns("(?<=a)b", "bb");
+        x2s("(?<=a|b)b", "bb", 1, 2);
+        x2s("(?<=a|bc)b", "bcb", 2, 3);
+        x2s("(?<=a|bc)b", "ab", 1, 2);
+        x2s("(?<=a|bc||defghij|klmnopq|r)z", "rz", 1, 2);
+        x2s("(a)\\g<1>", "aa", 0, 2);
+        x2s("(?<!a)b", "cb", 1, 2);
+        ns("(?<!a)b", "ab");
+        x2s("(?<!a|bc)b", "bbb", 0, 1);
+        ns("(?<!a|bc)z", "bcz");
+        x2s("(?<name1>a)", "a", 0, 1);
+        x2s("(?<name_2>ab)\\g<name_2>", "abab", 0, 4);
+        x2s("(?<name_3>.zv.)\\k<name_3>", "azvbazvb", 0, 8);
+        x2s("(?<=\\g<ab>)|-\\zEND (?<ab>XyZ)", "XyZ", 3, 3);
+        x2s("(?<n>|a\\g<n>)+", "", 0, 0);
+        x2s("(?<n>|\\(\\g<n>\\))+$", "()(())", 0, 6);
+        x3s("\\g<n>(?<n>.){0}", "X", 0, 1, 1);
+        x2s("\\g<n>(abc|df(?<n>.YZ){2,8}){0}", "XYZ", 0, 3);
+        x2s("\\A(?<n>(a\\g<n>)|)\\z", "aaaa", 0, 4);
+        x2s("(?<n>|\\g<m>\\g<n>)\\z|\\zEND (?<m>a|(b)\\g<m>)", "bbbbabba", 0, 8);
+        x2s("(?<name1240>\\w+\\sx)a+\\k<name1240>", "  fg xaaaaaaaafg x", 2, 18);
+        x3s("(z)()()(?<_9>a)\\g<_9>", "zaa", 2, 3, 1);
+        x2s("(.)(((?<_>a)))\\k<_>", "zaa", 0, 3);
+        x2s("((?<name1>\\d)|(?<name2>\\w))(\\k<name1>|\\k<name2>)", "ff", 0, 2);
+        x2s("(?:(?<x>)|(?<x>efg))\\k<x>", "", 0, 0);
+        x2s("(?:(?<x>abc)|(?<x>efg))\\k<x>", "abcefgefg", 3, 9);
+        ns("(?:(?<x>abc)|(?<x>efg))\\k<x>", "abcefg");
+        x2s("(?:(?<n1>.)|(?<n1>..)|(?<n1>...)|(?<n1>....)|(?<n1>.....)|(?<n1>......)|(?<n1>.......)|(?<n1>........)|(?<n1>.........)|(?<n1>..........)|(?<n1>...........)|(?<n1>............)|(?<n1>.............)|(?<n1>..............))\\k<n1>$", "a-pyumpyum", 2, 10);
+        x3s("(?:(?<n1>.)|(?<n1>..)|(?<n1>...)|(?<n1>....)|(?<n1>.....)|(?<n1>......)|(?<n1>.......)|(?<n1>........)|(?<n1>.........)|(?<n1>..........)|(?<n1>...........)|(?<n1>............)|(?<n1>.............)|(?<n1>..............))\\k<n1>$", "xxxxabcdefghijklmnabcdefghijklmn", 4, 18, 14);
+        x3s("(?<name1>)(?<name2>)(?<name3>)(?<name4>)(?<name5>)(?<name6>)(?<name7>)(?<name8>)(?<name9>)(?<name10>)(?<name11>)(?<name12>)(?<name13>)(?<name14>)(?<name15>)(?<name16>aaa)(?<name17>)$", "aaa", 0, 3, 16);
+        x2s("(?<foo>a|\\(\\g<foo>\\))", "a", 0, 1);
+        x2s("(?<foo>a|\\(\\g<foo>\\))", "((((((a))))))", 0, 13);
+        x3s("(?<foo>a|\\(\\g<foo>\\))", "((((((((a))))))))", 0, 17, 1);
+        x2s("\\g<bar>|\\zEND(?<bar>.*abc$)", "abcxxxabc", 0, 9);
+        x2s("\\g<1>|\\zEND(.a.)", "bac", 0, 3);
+        x3s("\\g<_A>\\g<_A>|\\zEND(.a.)(?<_A>.b.)", "xbxyby", 3, 6, 1);
+        x2s("\\A(?:\\g<pon>|\\g<pan>|\\zEND  (?<pan>a|c\\g<pon>c)(?<pon>b|d\\g<pan>d))$", "cdcbcdc", 0, 7);
+        x2s("\\A(?<n>|a\\g<m>)\\z|\\zEND (?<m>\\g<n>)", "aaaa", 0, 4);
+        x2s("(?<n>(a|b\\g<n>c){3,5})", "baaaaca", 1, 5);
+        x2s("(?<n>(a|b\\g<n>c){3,5})", "baaaacaaaaa", 0, 10);
+        x2s("(?<pare>\\(([^\\(\\)]++|\\g<pare>)*+\\))", "((a))", 0, 5);
+        x2s("()*\\1", "", 0, 0);
+        x2s("(?:()|())*\\1\\2", "", 0, 0);
+        x3s("(?:\\1a|())*", "a", 0, 0, 1);
+        x2s("x((.)*)*x", "0x1x2x3", 1, 6);
+        x2s("x((.)*)*x(?i:\\1)\\Z", "0x1x2x1X2", 1, 9);
+        x2s("(?:()|()|()|()|()|())*\\2\\5", "", 0, 0);
+        x2s("(?:()|()|()|(x)|()|())*\\2b\\5", "b", 0, 1);
+        // if (Config.VANILLA) x2s("\\xED\\xF2", "\u00ed\u0148", 0, 2);
+        x2s("", "\u00a4\u02d8", 0, 0);
+        x2s("\u00a4\u02d8", "\u00a4\u02d8", 0, 2);
+        ns("\u00a4\u00a4", "\u00a4\u02d8");
+        x2s("\u00a4\u00a6\u00a4\u00a6", "\u00a4\u00a6\u00a4\u00a6", 0, 4);
+        x2s("\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 0, 6);
+        x2s("\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142", "\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\ [...]
+        x2s("\u00a4\u02d8", "\u00a4\u00a4\u00a4\u02d8", 2, 4);
+        x2s("\u00a4\u00a4\u00a4\u00a6", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 2, 6);
+        // if (Config.VANILLA) x2s("\\xca\\xb8", "\u0118\u00b8", 0, 2);
+        x2s(".", "\u00a4\u02d8", 0, 2);
+        x2s("..", "\u00a4\u00ab\u00a4\u00ad", 0, 4);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\\w", "\u00a4\u015e", 0, 2);
+        if (!org.joni.Config.NON_UNICODE_SDW) ns("\\W", "\u00a4\u02d8");
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("[\\W]", "\u00a4\u00a6$", 2, 3);
+        x2s("\\S", "\u00a4\u02dd", 0, 2);
+        x2s("\\S", "\u00b4\u00c1", 0, 2);
+        x2s("\\b", "\u00b5\u00a4 ", 0, 0);
+        x2s("\\b", " \u00a4\u0170", 1, 1);
+        x2s("\\B", "\u00a4\u00bb\u00a4\u02dd ", 2, 2);
+        x2s("\\B", "\u00a4\u00a6 ", 3, 3);
+        x2s("\\B", " \u00a4\u00a4", 0, 0);
+        x2s("[\u00a4\u017c\u00a4\u00c1]", "\u00a4\u00c1", 0, 2);
+        ns("[\u00a4\u0118\u00a4\u00cb]", "\u00a4\u011a");
+        x2s("[\u00a4\u00a6-\u00a4\u015e]", "\u00a4\u00a8", 0, 2);
+        ns("[^\u00a4\u00b1]", "\u00a4\u00b1");
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("[\\w]", "\u00a4\u00cd", 0, 2);
+        ns("[\\d]", "\u00a4\u0150");
+        x2s("[\\D]", "\u00a4\u010e", 0, 2);
+        ns("[\\s]", "\u00a4\u017b");
+        x2s("[\\S]", "\u00a4\u0158", 0, 2);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("[\\w\\d]", "\u00a4\u010d", 0, 2);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("[\\w\\d]", "   \u00a4\u010d", 3, 5);
+        ns("\\w\u00b5\u00b4\u013d\u00d6", " \u00b5\u00b4\u013d\u00d6");
+        x2s("\u00b5\u00b4\\W\u013d\u00d6", "\u00b5\u00b4 \u013d\u00d6", 0, 5);
+        x2s("\u00a4\u02d8.\u00a4\u00a4.\u00a4\u00a6", "\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a6", 0, 10);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s(".\\w\u00a4\u00a6\\W..\u00a4\u013e", "\u00a4\u00a8\u00a4\u00a6\u00a4\u00a6 \u00a4\u00a6\u00a4\u013e\u00a4\u013e", 0, 13);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\\s\\w\u00a4\u0142\u00a4\u0142\u00a4\u0142", " \u00a4\u0142\u00a4\u0142\u00a4\u0142\u00a4\u0142", 0, 9);
+        x2s("\u00a4\u02d8\u00a4\u02d8.\u00a4\u00b1", "\u00a4\u02d8\u00a4\u02d8\u00a4\u00b1\u00a4\u00b1", 0, 8);
+        ns(".\u00a4\u00a4", "\u00a4\u00a4\u00a4\u00a8");
+        x2s(".\u00a4\u015e", "\u00a4\u015e\u00a4\u015e", 0, 4);
+        x2s("^\u00a4\u02d8", "\u00a4\u02d8", 0, 2);
+        x2s("^\u00a4\u0155$", "\u00a4\u0155", 0, 2);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("^\\w$", "\u00a4\u00cb", 0, 2);
+        x2s("^\\w\u00a4\u00ab\u00a4\u00ad\u00a4\u017b\u00a4\u00b1\u00a4\u0142$", "z\u00a4\u00ab\u00a4\u00ad\u00a4\u017b\u00a4\u00b1\u00a4\u0142", 0, 11);
+        x2s("^\\w...\u00a4\u00a6\u00a4\u00a8\u00a4\u015e$", "z\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6\u00a4\u00a6\u00a4\u00a8\u00a4\u015e", 0, 13);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\\w\\w\\s\\W\u00a4\u015e\u00a4\u015e\u00a4\u015e\\d", "a\u00a4\u015e  \u00a4\u015e\u00a4\u015e\u00a4\u015e4", 0, 12);
+        x2s("\\A\u00a4\u017c\u00a4\u00c1\u00a4\u00c4", "\u00a4\u017c\u00a4\u00c1\u00a4\u00c4", 0, 6);
+        x2s("\u00a4\u0155\u00a4\u00e1\u00a4\u00e2\\Z", "\u00a4\u0155\u00a4\u00e1\u00a4\u00e2", 0, 6);
+        x2s("\u00a4\u00ab\u00a4\u00ad\u00a4\u017b\\z", "\u00a4\u00ab\u00a4\u00ad\u00a4\u017b", 0, 6);
+        x2s("\u00a4\u00ab\u00a4\u00ad\u00a4\u017b\\Z", "\u00a4\u00ab\u00a4\u00ad\u00a4\u017b\n", 0, 6);
+        x2s("\\G\u00a4\u00dd\u00a4\u00d4", "\u00a4\u00dd\u00a4\u00d4", 0, 4);
+        ns("\\G\u00a4\u00a8", "\u00a4\u00a6\u00a4\u00a8\u00a4\u015e");
+        ns("\u00a4\u010c\u00a4\u0106\\G", "\u00a4\u010c\u00a4\u0106");
+        ns("\u00a4\u0162\u00a4\u00df\\A", "\u00a4\u0162\u00a4\u00df");
+        ns("\u00a4\u0162\\A\u00a4\u00df", "\u00a4\u0162\u00a4\u00df");
+        x2s("(?=\u00a4\u00bb)\u00a4\u00bb", "\u00a4\u00bb", 0, 2);
+        ns("(?=\u00a4\u00a6).", "\u00a4\u00a4");
+        x2s("(?!\u00a4\u00a6)\u00a4\u00ab", "\u00a4\u00ab", 0, 2);
+        ns("(?!\u00a4\u010c)\u00a4\u02d8", "\u00a4\u010c");
+        x2s("(?i:\u00a4\u02d8)", "\u00a4\u02d8", 0, 2);
+        x2s("(?i:\u00a4\u00d6\u00a4\u016e)", "\u00a4\u00d6\u00a4\u016e", 0, 4);
+        ns("(?i:\u00a4\u00a4)", "\u00a4\u00a6");
+        x2s("(?m:\u00a4\u010d.)", "\u00a4\u010d\n", 0, 3);
+        x2s("(?m:.\u00a4\u00e1)", "\u00a4\u0162\n\u00a4\u00e1", 2, 5);
+        x2s("\u00a4\u02d8?", "", 0, 0);
+        x2s("\u0118\u0143?", "\u02db\u02dd", 0, 0);
+        x2s("\u0118\u0143?", "\u0118\u0143", 0, 2);
+        x2s("\u00ce\u011a*", "", 0, 0);
+        x2s("\u00ce\u011a*", "\u00ce\u011a", 0, 2);
+        x2s("\u00bb\u0147*", "\u00bb\u0147\u00bb\u0147\u00bb\u0147", 0, 6);
+        x2s("\u00c7\u010e*", "\u013d\u017b\u00c7\u010e\u00c7\u010e\u00c7\u010e\u00c7\u010e", 0, 0);
+        ns("\u00bb\u0142+", "");
+        x2s("\u02db\u010e+", "\u02db\u010e", 0, 2);
+        x2s("\u00bb\u0163+", "\u00bb\u0163\u00bb\u0163\u00bb\u0163\u00bb\u0163", 0, 8);
+        x2s("\u00a4\u00a8+", "\u00a4\u00a8\u00a4\u00a8\u00a4\u00a6\u00a4\u00a6\u00a4\u00a6", 0, 4);
+        x2s("\u00a4\u00a6+", "\u00a4\u015e\u00a4\u00a6\u00a4\u00a6\u00a4\u00a6\u00a4\u00a6", 2, 10);
+        x2s(".?", "\u00a4\u017c", 0, 2);
+        x2s(".*", "\u00a4\u0143\u00a4\u00d4\u00a4\u00d7\u00a4\u00da", 0, 8);
+        x2s(".+", "\u00a4\u00ed", 0, 2);
+        x2s(".+", "\u00a4\u00a4\u00a4\u00a6\u00a4\u00a8\u00a4\u00ab\n", 0, 8);
+        x2s("\u00a4\u02d8|\u00a4\u00a4", "\u00a4\u02d8", 0, 2);
+        x2s("\u00a4\u02d8|\u00a4\u00a4", "\u00a4\u00a4", 0, 2);
+        x2s("\u00a4\u02d8\u00a4\u00a4|\u00a4\u00a4\u00a4\u00a6", "\u00a4\u02d8\u00a4\u00a4", 0, 4);
+        x2s("\u00a4\u02d8\u00a4\u00a4|\u00a4\u00a4\u00a4\u00a6", "\u00a4\u00a4\u00a4\u00a6", 0, 4);
+        x2s("\u00a4\u0148(?:\u00a4\u00ab\u00a4\u00ad|\u00a4\u00ad\u00a4\u017b)", "\u00a4\u0148\u00a4\u00ab\u00a4\u00ad", 0, 6);
+        x2s("\u00a4\u0148(?:\u00a4\u00ab\u00a4\u00ad|\u00a4\u00ad\u00a4\u017b)\u00a4\u00b1", "\u00a4\u0148\u00a4\u00ad\u00a4\u017b\u00a4\u00b1", 0, 8);
+        x2s("\u00a4\u02d8\u00a4\u00a4|(?:\u00a4\u02d8\u00a4\u00a6|\u00a4\u02d8\u00a4\u0148)", "\u00a4\u02d8\u00a4\u0148", 0, 4);
+        x2s("\u00a4\u02d8|\u00a4\u00a4|\u00a4\u00a6", "\u00a4\u00a8\u00a4\u00a6", 2, 4);
+        x2s("\u00a4\u02d8|\u00a4\u00a4|\u00a4\u00a6\u00a4\u00a8|\u00a4\u015e\u00a4\u00ab\u00a4\u00ad|\u00a4\u017b|\u00a4\u00b1\u00a4\u0142\u00a4\u00b5|\u00a4\u00b7\u00a4\u0105\u00a4\u00bb|\u00a4\u02dd|\u00a4\u017c\u00a4\u00c1|\u00a4\u00c4\u00a4\u0106\u00a4\u010c\u00a4\u0118\u00a4\u00cb|\u00a4\u011a\u00a4\u00cd", "\u00a4\u00b7\u00a4\u0105\u00a4\u00bb", 0, 6);
+        ns("\u00a4\u02d8|\u00a4\u00a4|\u00a4\u00a6\u00a4\u00a8|\u00a4\u015e\u00a4\u00ab\u00a4\u00ad|\u00a4\u017b|\u00a4\u00b1\u00a4\u0142\u00a4\u00b5|\u00a4\u00b7\u00a4\u0105\u00a4\u00bb|\u00a4\u02dd|\u00a4\u017c\u00a4\u00c1|\u00a4\u00c4\u00a4\u0106\u00a4\u010c\u00a4\u0118\u00a4\u00cb|\u00a4\u011a\u00a4\u00cd", "\u00a4\u0105\u00a4\u00bb");
+        x2s("\u00a4\u02d8|^\u00a4\u010f", "\u00a4\u00d6\u00a4\u02d8", 2, 4);
+        x2s("\u00a4\u02d8|^\u00a4\u0148", "\u00a4\u0148\u00a4\u02d8", 0, 2);
+        x2s("\u00b5\u00b4|\\G\u013d\u00d6", "\u00a4\u00b1\u013d\u00d6\u00b5\u00b4", 4, 6);
+        x2s("\u00b5\u00b4|\\G\u013d\u00d6", "\u013d\u00d6\u00b5\u00b4", 0, 2);
+        x2s("\u00b5\u00b4|\\A\u013d\u00d6", "b\u013d\u00d6\u00b5\u00b4", 3, 5);
+        x2s("\u00b5\u00b4|\\A\u013d\u00d6", "\u013d\u00d6", 0, 2);
+        x2s("\u00b5\u00b4|\u013d\u00d6\\Z", "\u013d\u00d6\u00b5\u00b4", 2, 4);
+        x2s("\u00b5\u00b4|\u013d\u00d6\\Z", "\u013d\u00d6", 0, 2);
+        x2s("\u00b5\u00b4|\u013d\u00d6\\Z", "\u013d\u00d6\n", 0, 2);
+        x2s("\u00b5\u00b4|\u013d\u00d6\\z", "\u013d\u00d6\u00b5\u00b4", 2, 4);
+        x2s("\u00b5\u00b4|\u013d\u00d6\\z", "\u013d\u00d6", 0, 2);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\\w|\\s", "\u00a4\u015e", 0, 2);
+        x2s("\\w|%", "%\u00a4\u015e", 0, 1);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\\w|[&$]", "\u00a4\u00a6&", 0, 2);
+        x2s("[\u00a4\u00a4-\u00a4\u00b1]", "\u00a4\u00a6", 0, 2);
+        x2s("[\u00a4\u00a4-\u00a4\u00b1]|[^\u00a4\u00ab-\u00a4\u0142]", "\u00a4\u02d8", 0, 2);
+        x2s("[\u00a4\u00a4-\u00a4\u00b1]|[^\u00a4\u00ab-\u00a4\u0142]", "\u00a4\u00ab", 0, 2);
+        x2s("[^\u00a4\u02d8]", "\n", 0, 1);
+        x2s("(?:\u00a4\u02d8|[\u00a4\u00a6-\u00a4\u00ad])|\u00a4\u00a4\u00a4\u0148", "\u00a4\u00a6\u00a4\u0148", 0, 2);
+        x2s("(?:\u00a4\u02d8|[\u00a4\u00a6-\u00a4\u00ad])|\u00a4\u00a4\u00a4\u0148", "\u00a4\u00a4\u00a4\u0148", 0, 4);
+        x2s("\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6|(?=\u00a4\u00b1\u00a4\u00b1)..\u00a4\u0170", "\u00a4\u00b1\u00a4\u00b1\u00a4\u0170", 0, 6);
+        x2s("\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6|(?!\u00a4\u00b1\u00a4\u00b1)..\u00a4\u0170", "\u00a4\u02d8\u00a4\u00a4\u00a4\u0170", 0, 6);
+        // if (Config.VANILLA) x2s("(?=\u00a4\u0148\u00a4\u02d8)..\u00a4\u02d8|(?=\u00a4\u0148\u00a4\u0148)..\u00a4\u02d8", "\u00a4\u0148\u00a4\u0148\u00a4\u02d8", 0, 6);
+        x2s("(?<=\u00a4\u02d8|\u00a4\u00a4\u00a4\u00a6)\u00a4\u00a4", "\u00a4\u00a4\u00a4\u00a6\u00a4\u00a4", 4, 6);
+        ns("(?>\u00a4\u02d8|\u00a4\u02d8\u00a4\u00a4\u00a4\u00a8)\u00a4\u00a6", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a8\u00a4\u00a6");
+        x2s("(?>\u00a4\u02d8\u00a4\u00a4\u00a4\u00a8|\u00a4\u02d8)\u00a4\u00a6", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a8\u00a4\u00a6", 0, 8);
+        x2s("\u00a4\u02d8?|\u00a4\u00a4", "\u00a4\u02d8", 0, 2);
+        x2s("\u00a4\u02d8?|\u00a4\u00a4", "\u00a4\u00a4", 0, 0);
+        x2s("\u00a4\u02d8?|\u00a4\u00a4", "", 0, 0);
+        x2s("\u00a4\u02d8*|\u00a4\u00a4", "\u00a4\u02d8\u00a4\u02d8", 0, 4);
+        x2s("\u00a4\u02d8*|\u00a4\u00a4*", "\u00a4\u00a4\u00a4\u02d8", 0, 0);
+        x2s("\u00a4\u02d8*|\u00a4\u00a4*", "\u00a4\u02d8\u00a4\u00a4", 0, 2);
+        x2s("[a\u00a4\u02d8]*|\u00a4\u00a4*", "a\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 0, 3);
+        x2s("\u00a4\u02d8+|\u00a4\u00a4*", "", 0, 0);
+        x2s("\u00a4\u02d8+|\u00a4\u00a4*", "\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 0, 6);
+        x2s("\u00a4\u02d8+|\u00a4\u00a4*", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 0, 2);
+        x2s("\u00a4\u02d8+|\u00a4\u00a4*", "a\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 0, 0);
+        ns("\u00a4\u02d8+|\u00a4\u00a4+", "");
+        x2s("(\u00a4\u02d8|\u00a4\u00a4)?", "\u00a4\u00a4", 0, 2);
+        x2s("(\u00a4\u02d8|\u00a4\u00a4)*", "\u00a4\u00a4\u00a4\u02d8", 0, 4);
+        x2s("(\u00a4\u02d8|\u00a4\u00a4)+", "\u00a4\u00a4\u00a4\u02d8\u00a4\u00a4", 0, 6);
+        x2s("(\u00a4\u02d8\u00a4\u00a4|\u00a4\u00a6\u00a4\u02d8)+", "\u00a4\u00a6\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6\u00a4\u00a8", 0, 8);
+        x2s("(\u00a4\u02d8\u00a4\u00a4|\u00a4\u00a6\u00a4\u00a8)+", "\u00a4\u00a6\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6\u00a4\u00a8", 4, 12);
+        x2s("(\u00a4\u02d8\u00a4\u00a4|\u00a4\u00a6\u00a4\u02d8)+", "\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6\u00a4\u02d8", 2, 10);
+        x2s("(\u00a4\u02d8\u00a4\u00a4|\u00a4\u00a6\u00a4\u02d8)+", "\u00a4\u02d8\u00a4\u00a4\u00a4\u0148\u00a4\u00a6\u00a4\u02d8", 0, 4);
+        x2s("(\u00a4\u02d8\u00a4\u00a4|\u00a4\u00a6\u00a4\u02d8)+", "$$zzzz\u00a4\u02d8\u00a4\u00a4\u00a4\u0148\u00a4\u00a6\u00a4\u02d8", 6, 10);
+        x2s("(\u00a4\u02d8|\u00a4\u00a4\u00a4\u02d8\u00a4\u00a4)+", "\u00a4\u02d8\u00a4\u00a4\u00a4\u02d8\u00a4\u00a4\u00a4\u02d8", 0, 10);
+        x2s("(\u00a4\u02d8|\u00a4\u00a4\u00a4\u02d8\u00a4\u00a4)+", "\u00a4\u00a4\u00a4\u02d8", 2, 4);
+        x2s("(\u00a4\u02d8|\u00a4\u00a4\u00a4\u02d8\u00a4\u00a4)+", "\u00a4\u00a4\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u02d8", 2, 8);
+        x2s("(?:\u00a4\u02d8|\u00a4\u00a4)(?:\u00a4\u02d8|\u00a4\u00a4)", "\u00a4\u02d8\u00a4\u00a4", 0, 4);
+        x2s("(?:\u00a4\u02d8*|\u00a4\u00a4*)(?:\u00a4\u02d8*|\u00a4\u00a4*)", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 0, 6);
+        x2s("(?:\u00a4\u02d8*|\u00a4\u00a4*)(?:\u00a4\u02d8+|\u00a4\u00a4+)", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 0, 12);
+        x2s("(?:\u00a4\u02d8+|\u00a4\u00a4+){2}", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 0, 12);
+        x2s("(?:\u00a4\u02d8+|\u00a4\u00a4+){1,2}", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 0, 12);
+        x2s("(?:\u00a4\u02d8+|\\A\u00a4\u00a4*)\u00a4\u00a6\u00a4\u00a6", "\u00a4\u00a6\u00a4\u00a6", 0, 4);
+        ns("(?:\u00a4\u02d8+|\\A\u00a4\u00a4*)\u00a4\u00a6\u00a4\u00a6", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6\u00a4\u00a6");
+        x2s("(?:^\u00a4\u02d8+|\u00a4\u00a4+)*\u00a4\u00a6", "\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 12, 16);
+        x2s("(?:^\u00a4\u02d8+|\u00a4\u00a4+)*\u00a4\u00a6", "\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a6", 0, 14);
+        x2s("\u00a4\u00a6{0,}", "\u00a4\u00a6\u00a4\u00a6\u00a4\u00a6\u00a4\u00a6", 0, 8);
+        x2s("\u00a4\u02d8|(?i)c", "C", 0, 1);
+        x2s("(?i)c|\u00a4\u02d8", "C", 0, 1);
+        x2s("(?i:\u00a4\u02d8)|a", "a", 0, 1);
+        ns("(?i:\u00a4\u02d8)|a", "A");
+        x2s("[\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]?", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 0, 2);
+        x2s("[\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]*", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 0, 6);
+        x2s("[^\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]*", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 0, 0);
+        ns("[^\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]+", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6");
+        x2s("\u00a4\u02d8??", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8", 0, 0);
+        x2s("\u00a4\u00a4\u00a4\u02d8??\u00a4\u00a4", "\u00a4\u00a4\u00a4\u02d8\u00a4\u00a4", 0, 6);
+        x2s("\u00a4\u02d8*?", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8", 0, 0);
+        x2s("\u00a4\u00a4\u00a4\u02d8*?", "\u00a4\u00a4\u00a4\u02d8\u00a4\u02d8", 0, 2);
+        x2s("\u00a4\u00a4\u00a4\u02d8*?\u00a4\u00a4", "\u00a4\u00a4\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4", 0, 8);
+        x2s("\u00a4\u02d8+?", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8", 0, 2);
+        x2s("\u00a4\u00a4\u00a4\u02d8+?", "\u00a4\u00a4\u00a4\u02d8\u00a4\u02d8", 0, 4);
+        x2s("\u00a4\u00a4\u00a4\u02d8+?\u00a4\u00a4", "\u00a4\u00a4\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4", 0, 8);
+        x2s("(?:\u0139\u00b7?)??", "\u0139\u00b7", 0, 0);
+        x2s("(?:\u0139\u00b7??)?", "\u0139\u00b7", 0, 0);
+        x2s("(?:\u011a\u00b4?)+?", "\u011a\u00b4\u011a\u00b4\u011a\u00b4", 0, 2);
+        x2s("(?:\u00c9\u00f7+)??", "\u00c9\u00f7\u00c9\u00f7\u00c9\u00f7", 0, 0);
+        x2s("(?:\u0154\u0103+)??\u00c1\u00fa", "\u0154\u0103\u0154\u0103\u0154\u0103\u00c1\u00fa", 0, 8);
+        x2s("(?:\u00a4\u02d8\u00a4\u00a4)?{2}", "", 0, 0);
+        x2s("(?:\u00b5\u00b4\u013d\u00d6)?{2}", "\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4", 0, 8);
+        x2s("(?:\u00b5\u00b4\u013d\u00d6)*{0}", "\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4", 0, 0);
+        x2s("(?:\u00b5\u00b4\u013d\u00d6){3,}", "\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6", 0, 16);
+        ns("(?:\u00b5\u00b4\u013d\u00d6){3,}", "\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6");
+        x2s("(?:\u00b5\u00b4\u013d\u00d6){2,4}", "\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6", 0, 12);
+        x2s("(?:\u00b5\u00b4\u013d\u00d6){2,4}", "\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6", 0, 16);
+        x2s("(?:\u00b5\u00b4\u013d\u00d6){2,4}?", "\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6\u00b5\u00b4\u013d\u00d6", 0, 8);
+        x2s("(?:\u00b5\u00b4\u013d\u00d6){,}", "\u00b5\u00b4\u013d\u00d6{,}", 0, 7);
+        x2s("(?:\u00a4\u00ab\u00a4\u00ad\u00a4\u017b)+?{2}", "\u00a4\u00ab\u00a4\u00ad\u00a4\u017b\u00a4\u00ab\u00a4\u00ad\u00a4\u017b\u00a4\u00ab\u00a4\u00ad\u00a4\u017b", 0, 12);
+        x3s("(\u02db\u0110)", "\u02db\u0110", 0, 2, 1);
+        x3s("(\u02db\u0110\u017c\u013a)", "\u02db\u0110\u017c\u013a", 0, 4, 1);
+        x2s("((\u00bb\u0163\u00b4\u00d6))", "\u00bb\u0163\u00b4\u00d6", 0, 4);
+        x3s("((\u00c9\u00f7\u017c\u013a))", "\u00c9\u00f7\u017c\u013a", 0, 4, 1);
+        x3s("((\u015f\u0148\u0106\u00fc))", "\u015f\u0148\u0106\u00fc", 0, 4, 2);
+        x3s("((((((((((((((((((((\u00ce\u011a\u00bb\u0147))))))))))))))))))))", "\u00ce\u011a\u00bb\u0147", 0, 4, 20);
+        x3s("(\u00a4\u02d8\u00a4\u00a4)(\u00a4\u00a6\u00a4\u00a8)", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6\u00a4\u00a8", 0, 4, 1);
+        x3s("(\u00a4\u02d8\u00a4\u00a4)(\u00a4\u00a6\u00a4\u00a8)", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6\u00a4\u00a8", 4, 8, 2);
+        x3s("()(\u00a4\u02d8)\u00a4\u00a4\u00a4\u00a6(\u00a4\u00a8\u00a4\u015e\u00a4\u00ab)\u00a4\u00ad\u00a4\u017b\u00a4\u00b1\u00a4\u0142", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6\u00a4\u00a8\u00a4\u015e\u00a4\u00ab\u00a4\u00ad\u00a4\u017b\u00a4\u00b1\u00a4\u0142", 6, 12, 3);
+        x3s("(()(\u00a4\u02d8)\u00a4\u00a4\u00a4\u00a6(\u00a4\u00a8\u00a4\u015e\u00a4\u00ab)\u00a4\u00ad\u00a4\u017b\u00a4\u00b1\u00a4\u0142)", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6\u00a4\u00a8\u00a4\u015e\u00a4\u00ab\u00a4\u00ad\u00a4\u017b\u00a4\u00b1\u00a4\u0142", 6, 12, 4);
+        x3s(".*(\u0104\u0150\u0104\u00a9)\u0104\u00f3\u02c7\u00a6\u0104\u0162(\u0104\u00f3()\u0104\u00b7\u0104\u013a\u0104\u017c)\u0104\u00a4\u0104\u00f3", "\u0104\u0150\u0104\u00a9\u0104\u00f3\u02c7\u00a6\u0104\u0162\u0104\u00f3\u0104\u00b7\u0104\u013a\u0104\u017c\u0104\u00a4\u0104\u00f3", 10, 18, 2);
+        x2s("(^\u00a4\u02d8)", "\u00a4\u02d8", 0, 2);
+        x3s("(\u00a4\u02d8)|(\u00a4\u02d8)", "\u00a4\u00a4\u00a4\u02d8", 2, 4, 1);
+        x3s("(^\u00a4\u02d8)|(\u00a4\u02d8)", "\u00a4\u00a4\u00a4\u02d8", 2, 4, 2);
+        x3s("(\u00a4\u02d8?)", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8", 0, 2, 1);
+        x3s("(\u00a4\u0162*)", "\u00a4\u0162\u00a4\u0162\u00a4\u0162", 0, 6, 1);
+        x3s("(\u00a4\u010c*)", "", 0, 0, 1);
+        x3s("(\u00a4\u00eb+)", "\u00a4\u00eb\u00a4\u00eb\u00a4\u00eb\u00a4\u00eb\u00a4\u00eb\u00a4\u00eb\u00a4\u00eb", 0, 14, 1);
+        x3s("(\u00a4\u0150+|\u00a4\u0158*)", "\u00a4\u0150\u00a4\u0150\u00a4\u0150\u00a4\u0158\u00a4\u0158", 0, 6, 1);
+        x3s("(\u00a4\u02d8+|\u00a4\u00a4?)", "\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u02d8\u00a4\u02d8", 0, 2, 1);
+        x3s("(\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6)?", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 0, 6, 1);
+        x3s("(\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6)*", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 0, 6, 1);
+        x3s("(\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6)+", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 0, 6, 1);
+        x3s("(\u00a4\u00b5\u00a4\u00b7\u00a4\u0105|\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6)+", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 0, 6, 1);
+        x3s("([\u00a4\u0118\u00a4\u00cb\u00a4\u011a][\u00a4\u00ab\u00a4\u00ad\u00a4\u017b]|\u00a4\u00ab\u00a4\u00ad\u00a4\u017b)+", "\u00a4\u00ab\u00a4\u00ad\u00a4\u017b", 0, 6, 1);
+        x3s("((?i:\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6))", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6", 0, 6, 1);
+        x3s("((?m:\u00a4\u02d8.\u00a4\u00a6))", "\u00a4\u02d8\n\u00a4\u00a6", 0, 5, 1);
+        x3s("((?=\u00a4\u02d8\u00a4\u00f3)\u00a4\u02d8)", "\u00a4\u02d8\u00a4\u00f3\u00a4\u00a4", 0, 2, 1);
+        x3s("\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6|(.\u00a4\u02d8\u00a4\u00a4\u00a4\u00a8)", "\u00a4\u00f3\u00a4\u02d8\u00a4\u00a4\u00a4\u00a8", 0, 8, 1);
+        x3s("\u00a4\u02d8*(.)", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00f3", 8, 10, 1);
+        x3s("\u00a4\u02d8*?(.)", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00f3", 0, 2, 1);
+        x3s("\u00a4\u02d8*?(\u00a4\u00f3)", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00f3", 8, 10, 1);
+        x3s("[\u00a4\u00a4\u00a4\u00a6\u00a4\u00a8]\u00a4\u02d8*(.)", "\u00a4\u00a8\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00f3", 10, 12, 1);
+        x3s("(\\A\u00a4\u00a4\u00a4\u00a4)\u00a4\u00a6\u00a4\u00a6", "\u00a4\u00a4\u00a4\u00a4\u00a4\u00a6\u00a4\u00a6", 0, 4, 1);
+        ns("(\\A\u00a4\u00a4\u00a4\u00a4)\u00a4\u00a6\u00a4\u00a6", "\u00a4\u00f3\u00a4\u00a4\u00a4\u00a4\u00a4\u00a6\u00a4\u00a6");
+        x3s("(^\u00a4\u00a4\u00a4\u00a4)\u00a4\u00a6\u00a4\u00a6", "\u00a4\u00a4\u00a4\u00a4\u00a4\u00a6\u00a4\u00a6", 0, 4, 1);
+        ns("(^\u00a4\u00a4\u00a4\u00a4)\u00a4\u00a6\u00a4\u00a6", "\u00a4\u00f3\u00a4\u00a4\u00a4\u00a4\u00a4\u00a6\u00a4\u00a6");
+        x3s("\u00a4\u00ed\u00a4\u00ed(\u00a4\u00eb\u00a4\u00eb$)", "\u00a4\u00ed\u00a4\u00ed\u00a4\u00eb\u00a4\u00eb", 4, 8, 1);
+        ns("\u00a4\u00ed\u00a4\u00ed(\u00a4\u00eb\u00a4\u00eb$)", "\u00a4\u00ed\u00a4\u00ed\u00a4\u00eb\u00a4\u00eb\u00a4\u00eb");
+        x2s("(\u011a\u00b5)\\1", "\u011a\u00b5\u011a\u00b5", 0, 4);
+        ns("(\u011a\u00b5)\\1", "\u011a\u00b5\u00c9\u0111");
+        x2s("(\u00b6\u0151?)\\1", "\u00b6\u0151\u00b6\u0151", 0, 4);
+        x2s("(\u00b6\u0151??)\\1", "\u00b6\u0151\u00b6\u0151", 0, 0);
+        x2s("(\u00b6\u0151*)\\1", "\u00b6\u0151\u00b6\u0151\u00b6\u0151\u00b6\u0151\u00b6\u0151", 0, 8);
+        x3s("(\u00b6\u0151*)\\1", "\u00b6\u0151\u00b6\u0151\u00b6\u0151\u00b6\u0151\u00b6\u0151", 0, 4, 1);
+        x2s("\u00a4\u02d8(\u00a4\u00a4*)\\1", "\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 0, 10);
+        x2s("\u00a4\u02d8(\u00a4\u00a4*)\\1", "\u00a4\u02d8\u00a4\u00a4", 0, 2);
+        x2s("(\u00a4\u02d8*)(\u00a4\u00a4*)\\1\\2", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4", 0, 20);
+        x2s("(\u00a4\u02d8*)(\u00a4\u00a4*)\\2", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 0, 14);
+        x3s("(\u00a4\u02d8*)(\u00a4\u00a4*)\\2", "\u00a4\u02d8\u00a4\u02d8\u00a4\u02d8\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4", 6, 10, 2);
+        x2s("(((((((\u00a4\u00dd*)\u00a4\u00da))))))\u00a4\u00d4\\7", "\u00a4\u00dd\u00a4\u00dd\u00a4\u00dd\u00a4\u00da\u00a4\u00d4\u00a4\u00dd\u00a4\u00dd\u00a4\u00dd", 0, 16);
+        x3s("(((((((\u00a4\u00dd*)\u00a4\u00da))))))\u00a4\u00d4\\7", "\u00a4\u00dd\u00a4\u00dd\u00a4\u00dd\u00a4\u00da\u00a4\u00d4\u00a4\u00dd\u00a4\u00dd\u00a4\u00dd", 0, 6, 7);
+        x2s("(\u00a4\u010e)(\u00a4\u0147)(\u00a4\u0150)\\2\\1\\3", "\u00a4\u010e\u00a4\u0147\u00a4\u0150\u00a4\u0147\u00a4\u010e\u00a4\u0150", 0, 12);
+        x2s("([\u00a4\u00ad-\u00a4\u00b1])\\1", "\u00a4\u017b\u00a4\u017b", 0, 4);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("(\\w\\d\\s)\\1", "\u00a4\u02d85 \u00a4\u02d85 ", 0, 8);
+        ns("(\\w\\d\\s)\\1", "\u00a4\u02d85 \u00a4\u02d85");
+        x2s("(\u0102\u017b\u02c7\u00a9|[\u00a4\u02d8-\u00a4\u00a6]{3})\\1", "\u0102\u017b\u02c7\u00a9\u0102\u017b\u02c7\u00a9", 0, 8);
+        x2s("...(\u0102\u017b\u02c7\u00a9|[\u00a4\u02d8-\u00a4\u00a6]{3})\\1", "\u00a4\u02d8a\u00a4\u02d8\u0102\u017b\u02c7\u00a9\u0102\u017b\u02c7\u00a9", 0, 13);
+        x2s("(\u0102\u017b\u02c7\u00a9|[\u00a4\u02d8-\u00a4\u00a6]{3})\\1", "\u00a4\u00a6\u00a4\u00a4\u00a4\u00a6\u00a4\u00a6\u00a4\u00a4\u00a4\u00a6", 0, 12);
+        x2s("(^\u00a4\u0142)\\1", "\u00a4\u0142\u00a4\u0142", 0, 4);
+        ns("(^\u00a4\u0155)\\1", "\u00a4\u00e1\u00a4\u0155\u00a4\u0155");
+        ns("(\u00a4\u02d8$)\\1", "\u00a4\u02d8\u00a4\u02d8");
+        ns("(\u00a4\u02d8\u00a4\u00a4\\Z)\\1", "\u00a4\u02d8\u00a4\u00a4");
+        x2s("(\u00a4\u02d8*\\Z)\\1", "\u00a4\u02d8", 2, 2);
+        x2s(".(\u00a4\u02d8*\\Z)\\1", "\u00a4\u00a4\u00a4\u02d8", 2, 4);
+        x3s("(.(\u00a4\u00e4\u00a4\u00a4\u00a4\u0107)\\2)", "z\u00a4\u00e4\u00a4\u00a4\u00a4\u0107\u00a4\u00e4\u00a4\u00a4\u00a4\u0107", 0, 13, 1);
+        x3s("(.(..\\d.)\\2)", "\u00a4\u02d812341234", 0, 10, 1);
+        x2s("((?i:\u00a4\u02d8v\u00a4\u015f))\\1", "\u00a4\u02d8v\u00a4\u015f\u00a4\u02d8v\u00a4\u015f", 0, 10);
+        x2s("(?<\u00b6\u0148\u00a4\u00ab>\u0118\u0143|\\(\\g<\u00b6\u0148\u00a4\u00ab>\\))", "((((((\u0118\u0143))))))", 0, 14);
+        x2s("\\A(?:\\g<\u00b0\u00a4_1>|\\g<\u00b1\u013e_2>|\\z\u02dd\u015e\u00ce\u00bb  (?<\u00b0\u00a4_1>\u00b4\u0143|\u013d\u00ab\\g<\u00b1\u013e_2>\u013d\u00ab)(?<\u00b1\u013e_2>\u015f\u00df|\u0118\u00ee\u00bb\u00a7\\g<\u00b0\u00a4_1>\u0118\u00ee\u00bb\u00a7))$", "\u0118\u00ee\u00bb\u00a7\u013d\u00ab\u0118\u00ee\u00bb\u00a7\u013d\u00ab\u015f\u00df\u013d\u00ab\u0118\u00ee\u00bb\u00a7\u013d\u00ab\u0118\u00ee\u00bb\u00a7", 0, 26);
+        x2s("[[\u00a4\u0147\u00a4\u0150]]", "\u00a4\u0150", 0, 2);
+        x2s("[[\u00a4\u00a4\u00a4\u015e\u00a4\u00a6]\u00a4\u00ab]", "\u00a4\u00ab", 0, 2);
+        ns("[[^\u00a4\u02d8]]", "\u00a4\u02d8");
+        ns("[^[\u00a4\u02d8]]", "\u00a4\u02d8");
+        x2s("[^[^\u00a4\u02d8]]", "\u00a4\u02d8", 0, 2);
+        x2s("[[\u00a4\u00ab\u00a4\u00ad\u00a4\u017b]&&\u00a4\u00ad\u00a4\u017b]", "\u00a4\u017b", 0, 2);
+        ns("[[\u00a4\u00ab\u00a4\u00ad\u00a4\u017b]&&\u00a4\u00ad\u00a4\u017b]", "\u00a4\u00ab");
+        ns("[[\u00a4\u00ab\u00a4\u00ad\u00a4\u017b]&&\u00a4\u00ad\u00a4\u017b]", "\u00a4\u00b1");
+        x2s("[\u00a4\u02d8-\u00a4\u00f3&&\u00a4\u00a4-\u00a4\u0148&&\u00a4\u00a6-\u00a4\u0144]", "\u00a4\u0144", 0, 2);
+        ns("[^\u00a4\u02d8-\u00a4\u00f3&&\u00a4\u00a4-\u00a4\u0148&&\u00a4\u00a6-\u00a4\u0144]", "\u00a4\u0144");
+        x2s("[[^\u00a4\u02d8&&\u00a4\u02d8]&&\u00a4\u02d8-\u00a4\u00f3]", "\u00a4\u00a4", 0, 2);
+        ns("[[^\u00a4\u02d8&&\u00a4\u02d8]&&\u00a4\u02d8-\u00a4\u00f3]", "\u00a4\u02d8");
+        x2s("[[^\u00a4\u02d8-\u00a4\u00f3&&\u00a4\u00a4\u00a4\u00a6\u00a4\u00a8\u00a4\u015e]&&[^\u00a4\u00a6-\u00a4\u00ab]]", "\u00a4\u00ad", 0, 2);
+        ns("[[^\u00a4\u02d8-\u00a4\u00f3&&\u00a4\u00a4\u00a4\u00a6\u00a4\u00a8\u00a4\u015e]&&[^\u00a4\u00a6-\u00a4\u00ab]]", "\u00a4\u00a4");
+        x2s("[^[^\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]&&[^\u00a4\u00a6\u00a4\u00a8\u00a4\u015e]]", "\u00a4\u00a6", 0, 2);
+        x2s("[^[^\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]&&[^\u00a4\u00a6\u00a4\u00a8\u00a4\u015e]]", "\u00a4\u00a8", 0, 2);
+        ns("[^[^\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]&&[^\u00a4\u00a6\u00a4\u00a8\u00a4\u015e]]", "\u00a4\u00ab");
+        x2s("[\u00a4\u02d8-&&-\u00a4\u02d8]", "-", 0, 1);
+        x2s("[^[^a-z\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]&&[^bcdefg\u00a4\u00a6\u00a4\u00a8\u00a4\u015e]q-w]", "\u00a4\u00a8", 0, 2);
+        x2s("[^[^a-z\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]&&[^bcdefg\u00a4\u00a6\u00a4\u00a8\u00a4\u015e]g-w]", "f", 0, 1);
+        x2s("[^[^a-z\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]&&[^bcdefg\u00a4\u00a6\u00a4\u00a8\u00a4\u015e]g-w]", "g", 0, 1);
+        ns("[^[^a-z\u00a4\u02d8\u00a4\u00a4\u00a4\u00a6]&&[^bcdefg\u00a4\u00a6\u00a4\u00a8\u00a4\u015e]g-w]", "2");
+        x2s("a<b>\u0104\u0110\u02c7\u013d\u0104\u00b8\u0104\u00e7\u0104\u00f3\u00a4\u00ce\u0104\u0154\u0104\u00a6\u0104\u00f3\u0104\u00ed\u02c7\u013d\u0104\u00c9<\\/b>", "a<b>\u0104\u0110\u02c7\u013d\u0104\u00b8\u0104\u00e7\u0104\u00f3\u00a4\u00ce\u0104\u0154\u0104\u00a6\u0104\u00f3\u0104\u00ed\u02c7\u013d\u0104\u00c9</b>", 0, 32);
+        x2s(".<b>\u0104\u0110\u02c7\u013d\u0104\u00b8\u0104\u00e7\u0104\u00f3\u00a4\u00ce\u0104\u0154\u0104\u00a6\u0104\u00f3\u0104\u00ed\u02c7\u013d\u0104\u00c9<\\/b>", "a<b>\u0104\u0110\u02c7\u013d\u0104\u00b8\u0104\u00e7\u0104\u00f3\u00a4\u00ce\u0104\u0154\u0104\u00a6\u0104\u00f3\u0104\u00ed\u02c7\u013d\u0104\u00c9</b>", 0, 32);
+
+        super.test();
+    }
+
+}
diff --git a/test/org/joni/test/TestCornerCases.java b/test/org/joni/test/TestCornerCases.java
old mode 100644
new mode 100755
index d8099d5..94c8f3a
--- a/test/org/joni/test/TestCornerCases.java
+++ b/test/org/joni/test/TestCornerCases.java
@@ -28,23 +28,24 @@ import org.jcodings.Encoding;
 import org.jcodings.specific.ASCIIEncoding;
 
 public class TestCornerCases extends Test {
+	@Override
     public int option() {
         return Option.DEFAULT;
     }
-
+	@Override
     public Encoding encoding() {
         return ASCIIEncoding.INSTANCE;
     }
-
+	@Override
     public String testEncoding() {
         return "cp1250";
     }
-
+	@Override
     public Syntax syntax() {
         return Syntax.DEFAULT;
     }
-
-    public void test() throws InterruptedException {
+	@Override
+    public void test() throws Exception {
         byte[] reg = "l.".getBytes();
         byte[] str = "hello,lo".getBytes();
 
@@ -54,9 +55,6 @@ public class TestCornerCases extends Test {
             Config.log.println("FAIL: /l./ 'hello,lo' - with reverse, 3,0");
             nfail++;
         }
-    }
-
-    public static void main(String[] args) throws Throwable{
-        new TestCornerCases().run();
+        super.test();
     }
 }
diff --git a/test/org/joni/test/TestCrnl.java b/test/org/joni/test/TestCrnl.java
old mode 100644
new mode 100755
index de8b984..8abead7
--- a/test/org/joni/test/TestCrnl.java
+++ b/test/org/joni/test/TestCrnl.java
@@ -22,28 +22,30 @@ package org.joni.test;
 import org.joni.Config;
 import org.joni.Option;
 import org.joni.Syntax;
+import org.junit.Ignore;
 import org.jcodings.Encoding;
 import org.jcodings.specific.ASCIIEncoding;
 
+ at Ignore
 public class TestCrnl extends Test {
-
+    @Override
     public int option() {
         return Option.DEFAULT;
     }
-
+    @Override
     public Encoding encoding() {
         return ASCIIEncoding.INSTANCE;
     }
-
+    @Override
     public String testEncoding() {
         return "ascii";
     }
-
+    @Override
     public Syntax syntax() {
         return Syntax.DEFAULT;
     }
-
-    public void test() throws InterruptedException {
+    @Override
+    public void test() throws Exception {
         x2s("",        "\r\n",        0,  0);
         x2s(".",       "\r\n",        0,  1);
         ns("..",      "\r\n");
@@ -78,9 +80,7 @@ public class TestCrnl extends Test {
         x2s("(?!a\\Z)..",    "a\r",         0,  2);
 
         if (nfail > 0 || nerror > 0) Config.err.println("make sure to enable USE_CRNL_AS_LINE_TERMINATOR");
+        super.test();
     }
 
-    public static void main(String[] args) throws Throwable{
-        new TestCrnl().run();
-    }
 }
diff --git a/test/org/joni/test/TestInterrupt.java b/test/org/joni/test/TestInterrupt.java
old mode 100644
new mode 100755
index dd1547f..587aff6
--- a/test/org/joni/test/TestInterrupt.java
+++ b/test/org/joni/test/TestInterrupt.java
@@ -39,6 +39,8 @@ public class TestInterrupt extends Test {
     interface InterruptibleRunnable {
         public void run() throws InterruptedException;
     }
+
+    @org.junit.Test
     public void test() throws InterruptedException {
         interruptAfter(new InterruptibleRunnable() {
             public void run() throws InterruptedException {
@@ -81,19 +83,19 @@ public class TestInterrupt extends Test {
         System.out.println("Time taken: " + total);
         assertTrue(total < acceptableMaximumTime, "Took too long to interrupt: " + total + " > " + acceptableMaximumTime);
     }
-        
+    @Override
     public int option() {
         return Option.DEFAULT;
     }
-
+    @Override
     public Encoding encoding() {
         return ASCIIEncoding.INSTANCE;
     }
-
+    @Override
     public String testEncoding() {
         return "iso-8859-2";
     }
-
+    @Override
     public Syntax syntax() {
         return Syntax.DEFAULT;
     }
diff --git a/test/org/joni/test/TestJoni.java b/test/org/joni/test/TestJoni.java
deleted file mode 100644
index d7f4fe6..0000000
--- a/test/org/joni/test/TestJoni.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is furnished to do
- * so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-package org.joni.test;
-
-import junit.framework.TestCase;
-
-public class TestJoni extends TestCase {
-
-    private Test testa;
-    private Test testc;
-    private Test testu;
-    private Test testnsu8;
-    private Test testLookBehind;
-    private Test testu8;
-    private Test testInterrupt;
-    private Test testPerl;
-    private Test testAsciiViaUtf;
-
-    protected void setUp() {
-        testa = new TestA();
-        testc = new TestC();
-        testu = new TestU();
-        testnsu8 = new TestNSU8();
-        testu8 = new TestU8();
-        testLookBehind = new TestLookBehind();
-        testInterrupt = new TestInterrupt();
-        testPerl = new TestPerl();
-        testAsciiViaUtf = new TestAU();
-    }
-
-    protected void tearDown() {
-    }
-
-    private void testJoniTest(Test test) {
-        test.run();
-        assertEquals(test.nerror, 0);
-        assertEquals(test.nfail, 0);
-    }
-
-    public void testAscii() {
-        testJoniTest(testa);
-        testJoniTest(testAsciiViaUtf);
-    }
-
-    public void testEUCJP() {
-        testJoniTest(testc);
-    }
-
-    public void testUnicode() {
-        testJoniTest(testu);
-        testJoniTest(testnsu8);
-        testJoniTest(testu8);
-    }
-
-    public void testLookBehind() {
-    	testJoniTest(testLookBehind);
-    }
-    
-    public void testInterrupt() {
-        testJoniTest(testInterrupt);
-    }
-
-    public void testPerl() {
-        testJoniTest(testPerl);
-    }
-
-}
diff --git a/test/org/joni/test/TestLookBehind.java b/test/org/joni/test/TestLookBehind.java
deleted file mode 100644
index fa2d279..0000000
--- a/test/org/joni/test/TestLookBehind.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is furnished to do
- * so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-package org.joni.test;
-
-import org.jcodings.Encoding;
-import org.jcodings.specific.ASCIIEncoding;
-import org.joni.Option;
-import org.joni.Syntax;
-
-public class TestLookBehind extends Test {
-
-	public int option() {
-		return Option.DEFAULT;
-	}
-
-	public Encoding encoding() {
-		return ASCIIEncoding.INSTANCE;
-	}
-
-	public String testEncoding() {
-		return "iso-8859-1";
-	}
-
-	public Syntax syntax() {
-		return Syntax.DEFAULT;
-	}
-
-	@Override
-	public void test() throws InterruptedException {
-		x2s("(?<=a).*b", "aab", 1, 3);
-	}
-
-	public static void main(String[] args) throws Throwable {
-		new TestLookBehind().run();
-	}
-
-}
diff --git a/test/org/joni/test/TestNSU8.java b/test/org/joni/test/TestNSU8.java
old mode 100644
new mode 100755
index 1189776..d1f2647
--- a/test/org/joni/test/TestNSU8.java
+++ b/test/org/joni/test/TestNSU8.java
@@ -1,65 +1,63 @@
-/*
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is furnished to do
- * so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-package org.joni.test;
-
-import org.joni.Option;
-import org.joni.Syntax;
-import org.jcodings.Encoding;
-import org.jcodings.specific.NonStrictUTF8Encoding;
-
-public class TestNSU8 extends Test {
-
-    public int option() {
-        return Option.DEFAULT;
-    }
-
-    public Encoding encoding() {
-        return NonStrictUTF8Encoding.INSTANCE;
-    }
-
-    public String testEncoding() {
-        return "utf-8";
-    }
-
-    public Syntax syntax() {
-        return Syntax.DEFAULT;
-    }
-
-    public void test() throws InterruptedException {
-        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)240, (byte)32, (byte)32, (byte)32, (byte)32}, 0, 5, 1, false);
-        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)240, (byte)32, (byte)32, (byte)32}, 0, 4, 1, false);
-        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)240, (byte)32, (byte)32}, 0, 3, 1, false);
-        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)240, (byte)32}, 0, 2, 1, false);
-        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)240}, 0, 1, 1, false);
-
-        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)224, (byte)32, (byte)32, (byte)32}, 0, 4, 1, false);
-        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)224, (byte)32, (byte)32}, 0, 3, 1, false);
-        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)224, (byte)32}, 0, 2, 1, false);
-        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)224}, 0, 1, 1, false);
-
-        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)192, (byte)32, (byte)32}, 0, 3, 1, false);
-        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)192, (byte)32}, 0, 2, 1, false);
-        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)192}, 0, 1, 1, false);
-    }
-
-    public static void main(String[] args) throws Throwable {
-        new TestNSU8().run();
-    }
-}
+/*
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is furnished to do
+ * so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+package org.joni.test;
+
+import org.joni.Option;
+import org.joni.Syntax;
+import org.jcodings.Encoding;
+import org.jcodings.specific.NonStrictUTF8Encoding;
+
+public class TestNSU8 extends Test {
+    @Override
+    public int option() {
+        return Option.DEFAULT;
+    }
+    @Override
+    public Encoding encoding() {
+        return NonStrictUTF8Encoding.INSTANCE;
+    }
+    @Override
+    public String testEncoding() {
+        return "utf-8";
+    }
+    @Override
+    public Syntax syntax() {
+        return Syntax.DEFAULT;
+    }
+    @Override
+    public void test() throws Exception {
+        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)240, (byte)32, (byte)32, (byte)32, (byte)32}, 0, 5, 1, false);
+        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)240, (byte)32, (byte)32, (byte)32}, 0, 4, 1, false);
+        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)240, (byte)32, (byte)32}, 0, 3, 1, false);
+        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)240, (byte)32}, 0, 2, 1, false);
+        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)240}, 0, 1, 1, false);
+
+        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)224, (byte)32, (byte)32, (byte)32}, 0, 4, 1, false);
+        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)224, (byte)32, (byte)32}, 0, 3, 1, false);
+        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)224, (byte)32}, 0, 2, 1, false);
+        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)224}, 0, 1, 1, false);
+
+        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)192, (byte)32, (byte)32}, 0, 3, 1, false);
+        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)192, (byte)32}, 0, 2, 1, false);
+        xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)192}, 0, 1, 1, false);
+
+        super.test();
+    }
+}
diff --git a/test/org/joni/test/TestPerl.java b/test/org/joni/test/TestPerl.java
old mode 100644
new mode 100755
index 334f334..4b77fff
--- a/test/org/joni/test/TestPerl.java
+++ b/test/org/joni/test/TestPerl.java
@@ -25,28 +25,24 @@ import org.jcodings.Encoding;
 import org.jcodings.specific.ASCIIEncoding;
 
 public class TestPerl extends Test {
-
+	@Override
     public int option() {
         return Option.DEFAULT;
     }
-
+	@Override
     public Encoding encoding() {
         return ASCIIEncoding.INSTANCE;
     }
-
+	@Override
     public String testEncoding() {
         return "iso-8859-2";
     }
-
+	@Override
     public Syntax syntax() {
         return Syntax.PerlNG;
     }
-
-    public void test() throws InterruptedException {
-
-    }
-
-    public static void main(String[] args) throws Throwable{
-        new TestPerl().run();
+	@Override
+    public void test() throws Exception {
+		super.test();
     }
 }
diff --git a/test/org/joni/test/TestU.java b/test/org/joni/test/TestU.java
old mode 100644
new mode 100755
index 332de05..a578baf
--- a/test/org/joni/test/TestU.java
+++ b/test/org/joni/test/TestU.java
@@ -1,801 +1,799 @@
-/*
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is furnished to do
- * so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-package org.joni.test;
-
-import org.joni.Option;
-import org.joni.Syntax;
-import org.jcodings.Encoding;
-import org.jcodings.specific.UTF16BEEncoding;
-
-public class TestU extends Test {
-
-    public int option() {
-        return Option.DEFAULT;
-    }
-
-    public Encoding encoding() {
-        return UTF16BEEncoding.INSTANCE;
-    }
-
-    public String testEncoding() {
-        return "iso-8859-1";
-    }
-
-    public Syntax syntax() {
-        return Syntax.DEFAULT;
-    }
-
-    private int ulen(byte[]bytes) {
-        return encoding().strByteLengthNull(bytes, 0, bytes.length);
-    }
-
-    private String uconv(byte []bytes, int len) {
-        StringBuilder sb = new StringBuilder();
-
-        for (int i = 0; i < len; i += 2) {
-            int c = bytes[i] & 0xff;
-            // sb.append(String.format("\\%03o", c));
-            if (c == 0) {
-                c = bytes[i+1] & 0xff;
-                if (c < 0x20 || c >= 0x7f || c == 0x5c || c == 0x22) {
-                    sb.append(String.format("\\%03o", c));
-                } else {
-                    sb.append(new String(new byte[]{(byte)c}));
-                }
-            } else {
-                sb.append(String.format("\\%03o", c));
-                c = bytes[i+1] & 0xff;
-                sb.append(String.format("\\%03o", c));
-            }
-        }
-
-        return sb.toString();
-    }
-
-    protected String repr(byte[]bytes) {
-        return uconv(bytes, ulen(bytes));
-    }
-
-    protected int length(byte[]bytes) {
-        return ulen(bytes);
-    }
-
-    public void test() throws InterruptedException {
-        x2s("\000\000", "\000\000", 0, 0);
-        x2s("\000^\000\000", "\000\000", 0, 0);
-        x2s("\000$\000\000", "\000\000", 0, 0);
-        x2s("\000\134\000G\000\000", "\000\000", 0, 0);
-        x2s("\000\134\000A\000\000", "\000\000", 0, 0);
-        x2s("\000\134\000Z\000\000", "\000\000", 0, 0);
-        x2s("\000\134\000z\000\000", "\000\000", 0, 0);
-        x2s("\000^\000$\000\000", "\000\000", 0, 0);
-        x2s("\000\134\000c\000a\000\000", "\000\001\000\000", 0, 2);
-        x2s("\000\134\000C\000-\000b\000\000", "\000\002\000\000", 0, 2);
-        x2s("\000\134\000c\000\134\000\134\000\000", "\000\034\000\000", 0, 2);
-        x2s("\000q\000[\000\134\000c\000\134\000\134\000]\000\000", "\000q\000\034\000\000", 0, 4);
-        x2s("\000\000", "\000a\000\000", 0, 0);
-        x2s("\000a\000\000", "\000a\000\000", 0, 2);
-        x2s("\000\134\000x\0000\0000\000\134\000x\0006\0001\000\000", "\000a\000\000", 0, 2);
-        x2s("\000a\000a\000\000", "\000a\000a\000\000", 0, 4);
-        x2s("\000a\000a\000a\000\000", "\000a\000a\000a\000\000", 0, 6);
-        x2s("\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000\000", "\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000\000", 0, 70);
-        x2s("\000a\000b\000\000", "\000a\000b\000\000", 0, 4);
-        x2s("\000b\000\000", "\000a\000b\000\000", 2, 4);
-        x2s("\000b\000c\000\000", "\000a\000b\000c\000\000", 2, 6);
-        x2s("\000(\000?\000i\000:\000#\000R\000E\000T\000#\000)\000\000", "\000#\000I\000N\000S\000#\000#\000R\000E\000T\000#\000\000", 10, 20);
-        x2s("\000\134\0000\0000\0000\000\134\0001\0007\000\000", "\000\017\000\000", 0, 2);
-        x2s("\000\134\000x\0000\0000\000\134\000x\0001\000f\000\000", "\000\037\000\000", 0, 2);
-        x2s("\000a\000(\000?\000#\000.\000.\000.\000.\000\134\000\134\000J\000J\000J\000J\000)\000b\000\000", "\000a\000b\000\000", 0, 4);
-        x2s("\000(\000?\000x\000)\000 \000 \000G\000 \000(\000o\000 \000O\000(\000?\000-\000x\000)\000o\000O\000)\000 \000g\000 \000L\000\000", "\000G\000o\000O\000o\000O\000g\000L\000e\000\000", 0, 14);
-        x2s("\000.\000\000", "\000a\000\000", 0, 2);
-        ns("\000.\000\000", "\000\000");
-        x2s("\000.\000.\000\000", "\000a\000b\000\000", 0, 4);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000\134\000w\000\000", "\000e\000\000", 0, 2);
-        if (!org.joni.Config.NON_UNICODE_SDW) ns("\000\134\000W\000\000", "\000e\000\000");
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000\134\000s\000\000", "\000 \000\000", 0, 2);
-        x2s("\000\134\000S\000\000", "\000b\000\000", 0, 2);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000\134\000d\000\000", "\0004\000\000", 0, 2);
-        if (!org.joni.Config.NON_UNICODE_SDW) ns("\000\134\000D\000\000", "\0004\000\000");
-        x2s("\000\134\000b\000\000", "\000z\000 \000\000", 0, 0);
-        x2s("\000\134\000b\000\000", "\000 \000z\000\000", 2, 2);
-        x2s("\000\134\000B\000\000", "\000z\000z\000 \000\000", 2, 2);
-        x2s("\000\134\000B\000\000", "\000z\000 \000\000", 4, 4);
-        x2s("\000\134\000B\000\000", "\000 \000z\000\000", 0, 0);
-        x2s("\000[\000a\000b\000]\000\000", "\000b\000\000", 0, 2);
-        ns("\000[\000a\000b\000]\000\000", "\000c\000\000");
-        x2s("\000[\000a\000-\000z\000]\000\000", "\000t\000\000", 0, 2);
-        ns("\000[\000^\000a\000]\000\000", "\000a\000\000");
-        x2s("\000[\000^\000a\000]\000\000", "\000\012\000\000", 0, 2);
-        x2s("\000[\000]\000]\000\000", "\000]\000\000", 0, 2);
-        ns("\000[\000^\000]\000]\000\000", "\000]\000\000");
-        x2s("\000[\000\134\000^\000]\000+\000\000", "\0000\000^\000^\0001\000\000", 2, 6);
-        x2s("\000[\000b\000-\000]\000\000", "\000b\000\000", 0, 2);
-        x2s("\000[\000b\000-\000]\000\000", "\000-\000\000", 0, 2);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000[\000\134\000w\000]\000\000", "\000z\000\000", 0, 2);
-        ns("\000[\000\134\000w\000]\000\000", "\000 \000\000");
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000[\000\134\000W\000]\000\000", "\000b\000$\000\000", 2, 4);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000[\000\134\000d\000]\000\000", "\0005\000\000", 0, 2);
-        ns("\000[\000\134\000d\000]\000\000", "\000e\000\000");
-        x2s("\000[\000\134\000D\000]\000\000", "\000t\000\000", 0, 2);
-        if (!org.joni.Config.NON_UNICODE_SDW) ns("\000[\000\134\000D\000]\000\000", "\0003\000\000");
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000[\000\134\000s\000]\000\000", "\000 \000\000", 0, 2);
-        ns("\000[\000\134\000s\000]\000\000", "\000a\000\000");
-        x2s("\000[\000\134\000S\000]\000\000", "\000b\000\000", 0, 2);
-        if (!org.joni.Config.NON_UNICODE_SDW) ns("\000[\000\134\000S\000]\000\000", "\000 \000\000");
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000[\000\134\000w\000\134\000d\000]\000\000", "\0002\000\000", 0, 2);
-        ns("\000[\000\134\000w\000\134\000d\000]\000\000", "\000 \000\000");
-        x2s("\000[\000[\000:\000u\000p\000p\000e\000r\000:\000]\000]\000\000", "\000B\000\000", 0, 2);
-        x2s("\000[\000*\000[\000:\000x\000d\000i\000g\000i\000t\000:\000]\000+\000]\000\000", "\000+\000\000", 0, 2);
-        x2s("\000[\000*\000[\000:\000x\000d\000i\000g\000i\000t\000:\000]\000+\000]\000\000", "\000G\000H\000I\000K\000K\000-\0009\000+\000*\000\000", 12, 14);
-        x2s("\000[\000*\000[\000:\000x\000d\000i\000g\000i\000t\000:\000]\000+\000]\000\000", "\000-\000@\000^\000+\000\000", 6, 8);
-        ns("\000[\000[\000:\000u\000p\000p\000e\000r\000]\000]\000\000", "\000A\000\000");
-        x2s("\000[\000[\000:\000u\000p\000p\000e\000r\000]\000]\000\000", "\000:\000\000", 0, 2);
-        x2s("\000[\000\134\0000\0000\0000\000\134\0000\0004\0004\000-\000\134\0000\0000\0000\000\134\0000\0004\0007\000]\000\000", "\000&\000\000", 0, 2);
-        x2s("\000[\000\134\000x\0000\0000\000\134\000x\0005\000a\000-\000\134\000x\0000\0000\000\134\000x\0005\000c\000]\000\000", "\000[\000\000", 0, 2);
-        x2s("\000[\000\134\000x\0000\0000\000\134\000x\0006\000A\000-\000\134\000x\0000\0000\000\134\000x\0006\000D\000]\000\000", "\000l\000\000", 0, 2);
-        ns("\000[\000\134\000x\0000\0000\000\134\000x\0006\000A\000-\000\134\000x\0000\0000\000\134\000x\0006\000D\000]\000\000", "\000n\000\000");
-        ns("\000^\000[\0000\000-\0009\000A\000-\000F\000]\000+\000 \0000\000+\000 \000U\000N\000D\000E\000F\000 \000\000", "\0007\0005\000F\000 \0000\0000\0000\0000\0000\0000\0000\0000\000 \000S\000E\000C\000T\0001\0004\000A\000 \000n\000o\000t\000y\000p\000e\000 \000(\000)\000 \000 \000 \000 \000E\000x\000t\000e\000r\000n\000a\000l\000 \000 \000 \000 \000|\000 \000_\000r\000b\000_\000a\000p\000p\000l\000y\000\000");
-        x2s("\000[\000\134\000[\000]\000\000", "\000[\000\000", 0, 2);
-        x2s("\000[\000\134\000]\000]\000\000", "\000]\000\000", 0, 2);
-        x2s("\000[\000&\000]\000\000", "\000&\000\000", 0, 2);
-        x2s("\000[\000[\000a\000b\000]\000]\000\000", "\000b\000\000", 0, 2);
-        x2s("\000[\000[\000a\000b\000]\000c\000]\000\000", "\000c\000\000", 0, 2);
-        ns("\000[\000[\000^\000a\000]\000]\000\000", "\000a\000\000");
-        ns("\000[\000^\000[\000a\000]\000]\000\000", "\000a\000\000");
-        x2s("\000[\000[\000a\000b\000]\000&\000&\000b\000c\000]\000\000", "\000b\000\000", 0, 2);
-        ns("\000[\000[\000a\000b\000]\000&\000&\000b\000c\000]\000\000", "\000a\000\000");
-        ns("\000[\000[\000a\000b\000]\000&\000&\000b\000c\000]\000\000", "\000c\000\000");
-        x2s("\000[\000a\000-\000z\000&\000&\000b\000-\000y\000&\000&\000c\000-\000x\000]\000\000", "\000w\000\000", 0, 2);
-        ns("\000[\000^\000a\000-\000z\000&\000&\000b\000-\000y\000&\000&\000c\000-\000x\000]\000\000", "\000w\000\000");
-        x2s("\000[\000[\000^\000a\000&\000&\000a\000]\000&\000&\000a\000-\000z\000]\000\000", "\000b\000\000", 0, 2);
-        ns("\000[\000[\000^\000a\000&\000&\000a\000]\000&\000&\000a\000-\000z\000]\000\000", "\000a\000\000");
-        x2s("\000[\000[\000^\000a\000-\000z\000&\000&\000b\000c\000d\000e\000f\000]\000&\000&\000[\000^\000c\000-\000g\000]\000]\000\000", "\000h\000\000", 0, 2);
-        ns("\000[\000[\000^\000a\000-\000z\000&\000&\000b\000c\000d\000e\000f\000]\000&\000&\000[\000^\000c\000-\000g\000]\000]\000\000", "\000c\000\000");
-        x2s("\000[\000^\000[\000^\000a\000b\000c\000]\000&\000&\000[\000^\000c\000d\000e\000]\000]\000\000", "\000c\000\000", 0, 2);
-        x2s("\000[\000^\000[\000^\000a\000b\000c\000]\000&\000&\000[\000^\000c\000d\000e\000]\000]\000\000", "\000e\000\000", 0, 2);
-        ns("\000[\000^\000[\000^\000a\000b\000c\000]\000&\000&\000[\000^\000c\000d\000e\000]\000]\000\000", "\000f\000\000");
-        x2s("\000[\000a\000-\000&\000&\000-\000a\000]\000\000", "\000-\000\000", 0, 2);
-        ns("\000[\000a\000\134\000-\000&\000&\000\134\000-\000a\000]\000\000", "\000&\000\000");
-        ns("\000\134\000w\000a\000b\000c\000\000", "\000 \000a\000b\000c\000\000");
-        x2s("\000a\000\134\000W\000b\000c\000\000", "\000a\000 \000b\000c\000\000", 0, 8);
-        x2s("\000a\000.\000b\000.\000c\000\000", "\000a\000a\000b\000b\000c\000\000", 0, 10);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000.\000\134\000w\000b\000\134\000W\000.\000.\000c\000\000", "\000a\000b\000b\000 \000b\000c\000c\000\000", 0, 14);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000\134\000s\000\134\000w\000z\000z\000z\000\000", "\000 \000z\000z\000z\000z\000\000", 0, 10);
-        x2s("\000a\000a\000.\000b\000\000", "\000a\000a\000b\000b\000\000", 0, 8);
-        ns("\000.\000a\000\000", "\000a\000b\000\000");
-        x2s("\000.\000a\000\000", "\000a\000a\000\000", 0, 4);
-        x2s("\000^\000a\000\000", "\000a\000\000", 0, 2);
-        x2s("\000^\000a\000$\000\000", "\000a\000\000", 0, 2);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000^\000\134\000w\000$\000\000", "\000a\000\000", 0, 2);
-        ns("\000^\000\134\000w\000$\000\000", "\000 \000\000");
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000^\000\134\000w\000a\000b\000$\000\000", "\000z\000a\000b\000\000", 0, 6);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000^\000\134\000w\000a\000b\000c\000d\000e\000f\000$\000\000", "\000z\000a\000b\000c\000d\000e\000f\000\000", 0, 14);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000^\000\134\000w\000.\000.\000.\000d\000e\000f\000$\000\000", "\000z\000a\000b\000c\000d\000e\000f\000\000", 0, 14);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000\134\000w\000\134\000w\000\134\000s\000\134\000W\000a\000a\000a\000\134\000d\000\000", "\000a\000a\000 \000 \000a\000a\000a\0004\000\000", 0, 16);
-        x2s("\000\134\000A\000\134\000Z\000\000", "\000\000", 0, 0);
-        x2s("\000\134\000A\000x\000y\000z\000\000", "\000x\000y\000z\000\000", 0, 6);
-        x2s("\000x\000y\000z\000\134\000Z\000\000", "\000x\000y\000z\000\000", 0, 6);
-        x2s("\000x\000y\000z\000\134\000z\000\000", "\000x\000y\000z\000\000", 0, 6);
-        x2s("\000a\000\134\000Z\000\000", "\000a\000\000", 0, 2);
-        x2s("\000\134\000G\000a\000z\000\000", "\000a\000z\000\000", 0, 4);
-        ns("\000\134\000G\000z\000\000", "\000b\000z\000a\000\000");
-        ns("\000a\000z\000\134\000G\000\000", "\000a\000z\000\000");
-        ns("\000a\000z\000\134\000A\000\000", "\000a\000z\000\000");
-        ns("\000a\000\134\000A\000z\000\000", "\000a\000z\000\000");
-        x2s("\000\134\000^\000\134\000$\000\000", "\000^\000$\000\000", 0, 4);
-        x2s("\000^\000x\000?\000y\000\000", "\000x\000y\000\000", 0, 4);
-        x2s("\000^\000(\000x\000?\000y\000)\000\000", "\000x\000y\000\000", 0, 4);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000\134\000w\000\000", "\000_\000\000", 0, 2);
-        if (!org.joni.Config.NON_UNICODE_SDW) ns("\000\134\000W\000\000", "\000_\000\000");
-        x2s("\000(\000?\000=\000z\000)\000z\000\000", "\000z\000\000", 0, 2);
-        ns("\000(\000?\000=\000z\000)\000.\000\000", "\000a\000\000");
-        x2s("\000(\000?\000!\000z\000)\000a\000\000", "\000a\000\000", 0, 2);
-        ns("\000(\000?\000!\000z\000)\000a\000\000", "\000z\000\000");
-        x2s("\000(\000?\000i\000:\000a\000)\000\000", "\000a\000\000", 0, 2);
-        x2s("\000(\000?\000i\000:\000a\000)\000\000", "\000A\000\000", 0, 2);
-        x2s("\000(\000?\000i\000:\000A\000)\000\000", "\000a\000\000", 0, 2);
-        ns("\000(\000?\000i\000:\000A\000)\000\000", "\000b\000\000");
-        x2s("\000(\000?\000i\000:\000[\000A\000-\000Z\000]\000)\000\000", "\000a\000\000", 0, 2);
-        x2s("\000(\000?\000i\000:\000[\000f\000-\000m\000]\000)\000\000", "\000H\000\000", 0, 2);
-        x2s("\000(\000?\000i\000:\000[\000f\000-\000m\000]\000)\000\000", "\000h\000\000", 0, 2);
-        ns("\000(\000?\000i\000:\000[\000f\000-\000m\000]\000)\000\000", "\000e\000\000");
-        x2s("\000(\000?\000i\000:\000[\000A\000-\000c\000]\000)\000\000", "\000D\000\000", 0, 2);
-        ns("\000(\000?\000i\000:\000[\000^\000a\000-\000z\000]\000)\000\000", "\000A\000\000");
-        ns("\000(\000?\000i\000:\000[\000^\000a\000-\000z\000]\000)\000\000", "\000a\000\000");
-        x2s("\000(\000?\000i\000:\000[\000!\000-\000k\000]\000)\000\000", "\000Z\000\000", 0, 2);
-        x2s("\000(\000?\000i\000:\000[\000!\000-\000k\000]\000)\000\000", "\0007\000\000", 0, 2);
-        x2s("\000(\000?\000i\000:\000[\000T\000-\000}\000]\000)\000\000", "\000b\000\000", 0, 2);
-        x2s("\000(\000?\000i\000:\000[\000T\000-\000}\000]\000)\000\000", "\000{\000\000", 0, 2);
-        x2s("\000(\000?\000i\000:\000\134\000?\000a\000)\000\000", "\000?\000A\000\000", 0, 4);
-        x2s("\000(\000?\000i\000:\000\134\000*\000A\000)\000\000", "\000*\000a\000\000", 0, 4);
-        ns("\000.\000\000", "\000\012\000\000");
-        x2s("\000(\000?\000m\000:\000.\000)\000\000", "\000\012\000\000", 0, 2);
-        x2s("\000(\000?\000m\000:\000a\000.\000)\000\000", "\000a\000\012\000\000", 0, 4);
-        x2s("\000(\000?\000m\000:\000.\000b\000)\000\000", "\000a\000\012\000b\000\000", 2, 6);
-        x2s("\000.\000*\000a\000b\000c\000\000", "\000d\000d\000d\000a\000b\000d\000d\000\012\000d\000d\000a\000b\000c\000\000", 16, 26);
-        x2s("\000(\000?\000m\000:\000.\000*\000a\000b\000c\000)\000\000", "\000d\000d\000d\000a\000b\000d\000d\000a\000b\000c\000\000", 0, 20);
-        ns("\000(\000?\000i\000)\000(\000?\000-\000i\000)\000a\000\000", "\000A\000\000");
-        ns("\000(\000?\000i\000)\000(\000?\000-\000i\000:\000a\000)\000\000", "\000A\000\000");
-        x2s("\000a\000?\000\000", "\000\000", 0, 0);
-        x2s("\000a\000?\000\000", "\000b\000\000", 0, 0);
-        x2s("\000a\000?\000\000", "\000a\000\000", 0, 2);
-        x2s("\000a\000*\000\000", "\000\000", 0, 0);
-        x2s("\000a\000*\000\000", "\000a\000\000", 0, 2);
-        x2s("\000a\000*\000\000", "\000a\000a\000a\000\000", 0, 6);
-        x2s("\000a\000*\000\000", "\000b\000a\000a\000a\000a\000\000", 0, 0);
-        ns("\000a\000+\000\000", "\000\000");
-        x2s("\000a\000+\000\000", "\000a\000\000", 0, 2);
-        x2s("\000a\000+\000\000", "\000a\000a\000a\000a\000\000", 0, 8);
-        x2s("\000a\000+\000\000", "\000a\000a\000b\000b\000b\000\000", 0, 4);
-        x2s("\000a\000+\000\000", "\000b\000a\000a\000a\000a\000\000", 2, 10);
-        x2s("\000.\000?\000\000", "\000\000", 0, 0);
-        x2s("\000.\000?\000\000", "\000f\000\000", 0, 2);
-        x2s("\000.\000?\000\000", "\000\012\000\000", 0, 0);
-        x2s("\000.\000*\000\000", "\000\000", 0, 0);
-        x2s("\000.\000*\000\000", "\000a\000b\000c\000d\000e\000\000", 0, 10);
-        x2s("\000.\000+\000\000", "\000z\000\000", 0, 2);
-        x2s("\000.\000+\000\000", "\000z\000d\000s\000w\000e\000r\000\012\000\000", 0, 12);
-        x2s("\000(\000.\000*\000)\000a\000\134\0001\000f\000\000", "\000b\000a\000b\000f\000b\000a\000c\000\000", 0, 8);
-        x2s("\000(\000.\000*\000)\000a\000\134\0001\000f\000\000", "\000b\000a\000c\000b\000a\000b\000f\000\000", 6, 14);
-        x2s("\000(\000(\000.\000*\000)\000a\000\134\0002\000f\000)\000\000", "\000b\000a\000c\000b\000a\000b\000f\000\000", 6, 14);
-        x2s("\000(\000.\000*\000)\000a\000\134\0001\000f\000\000", "\000b\000a\000c\000z\000z\000z\000z\000z\000z\000\012\000b\000a\000z\000z\000\012\000z\000z\000z\000z\000b\000a\000b\000f\000\000", 38, 46);
-        x2s("\000a\000|\000b\000\000", "\000a\000\000", 0, 2);
-        x2s("\000a\000|\000b\000\000", "\000b\000\000", 0, 2);
-        x2s("\000|\000a\000\000", "\000a\000\000", 0, 0);
-        x2s("\000(\000|\000a\000)\000\000", "\000a\000\000", 0, 0);
-        x2s("\000a\000b\000|\000b\000c\000\000", "\000a\000b\000\000", 0, 4);
-        x2s("\000a\000b\000|\000b\000c\000\000", "\000b\000c\000\000", 0, 4);
-        x2s("\000z\000(\000?\000:\000a\000b\000|\000b\000c\000)\000\000", "\000z\000b\000c\000\000", 0, 6);
-        x2s("\000a\000(\000?\000:\000a\000b\000|\000b\000c\000)\000c\000\000", "\000a\000a\000b\000c\000\000", 0, 8);
-        x2s("\000a\000b\000|\000(\000?\000:\000a\000c\000|\000a\000z\000)\000\000", "\000a\000z\000\000", 0, 4);
-        x2s("\000a\000|\000b\000|\000c\000\000", "\000d\000c\000\000", 2, 4);
-        x2s("\000a\000|\000b\000|\000c\000d\000|\000e\000f\000g\000|\000h\000|\000i\000j\000k\000|\000l\000m\000n\000|\000o\000|\000p\000q\000|\000r\000s\000t\000u\000v\000w\000x\000|\000y\000z\000\000", "\000p\000q\000r\000\000", 0, 4);
-        ns("\000a\000|\000b\000|\000c\000d\000|\000e\000f\000g\000|\000h\000|\000i\000j\000k\000|\000l\000m\000n\000|\000o\000|\000p\000q\000|\000r\000s\000t\000u\000v\000w\000x\000|\000y\000z\000\000", "\000m\000n\000\000");
-        x2s("\000a\000|\000^\000z\000\000", "\000b\000a\000\000", 2, 4);
-        x2s("\000a\000|\000^\000z\000\000", "\000z\000a\000\000", 0, 2);
-        x2s("\000a\000|\000\134\000G\000z\000\000", "\000b\000z\000a\000\000", 4, 6);
-        x2s("\000a\000|\000\134\000G\000z\000\000", "\000z\000a\000\000", 0, 2);
-        x2s("\000a\000|\000\134\000A\000z\000\000", "\000b\000z\000a\000\000", 4, 6);
-        x2s("\000a\000|\000\134\000A\000z\000\000", "\000z\000a\000\000", 0, 2);
-        x2s("\000a\000|\000b\000\134\000Z\000\000", "\000b\000a\000\000", 2, 4);
-        x2s("\000a\000|\000b\000\134\000Z\000\000", "\000b\000\000", 0, 2);
-        x2s("\000a\000|\000b\000\134\000z\000\000", "\000b\000a\000\000", 2, 4);
-        x2s("\000a\000|\000b\000\134\000z\000\000", "\000b\000\000", 0, 2);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000\134\000w\000|\000\134\000s\000\000", "\000 \000\000", 0, 2);
-        ns("\000\134\000w\000|\000\134\000w\000\000", "\000 \000\000");
-        x2s("\000\134\000w\000|\000%\000\000", "\000%\000\000", 0, 2);
-        x2s("\000\134\000w\000|\000[\000&\000$\000]\000\000", "\000&\000\000", 0, 2);
-        x2s("\000[\000b\000-\000d\000]\000|\000[\000^\000e\000-\000z\000]\000\000", "\000a\000\000", 0, 2);
-        x2s("\000(\000?\000:\000a\000|\000[\000c\000-\000f\000]\000)\000|\000b\000z\000\000", "\000d\000z\000\000", 0, 2);
-        x2s("\000(\000?\000:\000a\000|\000[\000c\000-\000f\000]\000)\000|\000b\000z\000\000", "\000b\000z\000\000", 0, 4);
-        x2s("\000a\000b\000c\000|\000(\000?\000=\000z\000z\000)\000.\000.\000f\000\000", "\000z\000z\000f\000\000", 0, 6);
-        x2s("\000a\000b\000c\000|\000(\000?\000!\000z\000z\000)\000.\000.\000f\000\000", "\000a\000b\000f\000\000", 0, 6);
-        x2s("\000(\000?\000=\000z\000a\000)\000.\000.\000a\000|\000(\000?\000=\000z\000z\000)\000.\000.\000a\000\000", "\000z\000z\000a\000\000", 0, 6);
-        ns("\000(\000?\000>\000a\000|\000a\000b\000d\000)\000c\000\000", "\000a\000b\000d\000c\000\000");
-        x2s("\000(\000?\000>\000a\000b\000d\000|\000a\000)\000c\000\000", "\000a\000b\000d\000c\000\000", 0, 8);
-        x2s("\000a\000?\000|\000b\000\000", "\000a\000\000", 0, 2);
-        x2s("\000a\000?\000|\000b\000\000", "\000b\000\000", 0, 0);
-        x2s("\000a\000?\000|\000b\000\000", "\000\000", 0, 0);
-        x2s("\000a\000*\000|\000b\000\000", "\000a\000a\000\000", 0, 4);
-        x2s("\000a\000*\000|\000b\000*\000\000", "\000b\000a\000\000", 0, 0);
-        x2s("\000a\000*\000|\000b\000*\000\000", "\000a\000b\000\000", 0, 2);
-        x2s("\000a\000+\000|\000b\000*\000\000", "\000\000", 0, 0);
-        x2s("\000a\000+\000|\000b\000*\000\000", "\000b\000b\000b\000\000", 0, 6);
-        x2s("\000a\000+\000|\000b\000*\000\000", "\000a\000b\000b\000b\000\000", 0, 2);
-        ns("\000a\000+\000|\000b\000+\000\000", "\000\000");
-        x2s("\000(\000a\000|\000b\000)\000?\000\000", "\000b\000\000", 0, 2);
-        x2s("\000(\000a\000|\000b\000)\000*\000\000", "\000b\000a\000\000", 0, 4);
-        x2s("\000(\000a\000|\000b\000)\000+\000\000", "\000b\000a\000b\000\000", 0, 6);
-        x2s("\000(\000a\000b\000|\000c\000a\000)\000+\000\000", "\000c\000a\000a\000b\000b\000c\000\000", 0, 8);
-        x2s("\000(\000a\000b\000|\000c\000a\000)\000+\000\000", "\000a\000a\000b\000c\000a\000\000", 2, 10);
-        x2s("\000(\000a\000b\000|\000c\000a\000)\000+\000\000", "\000a\000b\000z\000c\000a\000\000", 0, 4);
-        x2s("\000(\000a\000|\000b\000a\000b\000)\000+\000\000", "\000a\000b\000a\000b\000a\000\000", 0, 10);
-        x2s("\000(\000a\000|\000b\000a\000b\000)\000+\000\000", "\000b\000a\000\000", 2, 4);
-        x2s("\000(\000a\000|\000b\000a\000b\000)\000+\000\000", "\000b\000a\000a\000a\000b\000a\000\000", 2, 8);
-        x2s("\000(\000?\000:\000a\000|\000b\000)\000(\000?\000:\000a\000|\000b\000)\000\000", "\000a\000b\000\000", 0, 4);
-        x2s("\000(\000?\000:\000a\000*\000|\000b\000*\000)\000(\000?\000:\000a\000*\000|\000b\000*\000)\000\000", "\000a\000a\000a\000b\000b\000b\000\000", 0, 6);
-        x2s("\000(\000?\000:\000a\000*\000|\000b\000*\000)\000(\000?\000:\000a\000+\000|\000b\000+\000)\000\000", "\000a\000a\000a\000b\000b\000b\000\000", 0, 12);
-        x2s("\000(\000?\000:\000a\000+\000|\000b\000+\000)\000{\0002\000}\000\000", "\000a\000a\000a\000b\000b\000b\000\000", 0, 12);
-        x2s("\000h\000{\0000\000,\000}\000\000", "\000h\000h\000h\000h\000\000", 0, 8);
-        x2s("\000(\000?\000:\000a\000+\000|\000b\000+\000)\000{\0001\000,\0002\000}\000\000", "\000a\000a\000a\000b\000b\000b\000\000", 0, 12);
-        ns("\000a\000x\000{\0002\000}\000*\000a\000\000", "\0000\000a\000x\000x\000x\000a\0001\000\000");
-        ns("\000a\000.\000{\0000\000,\0002\000}\000a\000\000", "\0000\000a\000X\000X\000X\000a\0000\000\000");
-        ns("\000a\000.\000{\0000\000,\0002\000}\000?\000a\000\000", "\0000\000a\000X\000X\000X\000a\0000\000\000");
-        ns("\000a\000.\000{\0000\000,\0002\000}\000?\000a\000\000", "\0000\000a\000X\000X\000X\000X\000a\0000\000\000");
-        x2s("\000^\000a\000{\0002\000,\000}\000?\000a\000$\000\000", "\000a\000a\000a\000\000", 0, 6);
-        x2s("\000^\000[\000a\000-\000z\000]\000{\0002\000,\000}\000?\000$\000\000", "\000a\000a\000a\000\000", 0, 6);
-        x2s("\000(\000?\000:\000a\000+\000|\000\134\000A\000b\000*\000)\000c\000c\000\000", "\000c\000c\000\000", 0, 4);
-        ns("\000(\000?\000:\000a\000+\000|\000\134\000A\000b\000*\000)\000c\000c\000\000", "\000a\000b\000c\000c\000\000");
-        x2s("\000(\000?\000:\000^\000a\000+\000|\000b\000+\000)\000*\000c\000\000", "\000a\000a\000b\000b\000b\000a\000b\000c\000\000", 12, 16);
-        x2s("\000(\000?\000:\000^\000a\000+\000|\000b\000+\000)\000*\000c\000\000", "\000a\000a\000b\000b\000b\000b\000c\000\000", 0, 14);
-        x2s("\000a\000|\000(\000?\000i\000)\000c\000\000", "\000C\000\000", 0, 2);
-        x2s("\000(\000?\000i\000)\000c\000|\000a\000\000", "\000C\000\000", 0, 2);
-        x2s("\000(\000?\000i\000)\000c\000|\000a\000\000", "\000A\000\000", 0, 2);
-        x2s("\000(\000?\000i\000:\000c\000)\000|\000a\000\000", "\000C\000\000", 0, 2);
-        ns("\000(\000?\000i\000:\000c\000)\000|\000a\000\000", "\000A\000\000");
-        x2s("\000[\000a\000b\000c\000]\000?\000\000", "\000a\000b\000c\000\000", 0, 2);
-        x2s("\000[\000a\000b\000c\000]\000*\000\000", "\000a\000b\000c\000\000", 0, 6);
-        x2s("\000[\000^\000a\000b\000c\000]\000*\000\000", "\000a\000b\000c\000\000", 0, 0);
-        ns("\000[\000^\000a\000b\000c\000]\000+\000\000", "\000a\000b\000c\000\000");
-        x2s("\000a\000?\000?\000\000", "\000a\000a\000a\000\000", 0, 0);
-        x2s("\000b\000a\000?\000?\000b\000\000", "\000b\000a\000b\000\000", 0, 6);
-        x2s("\000a\000*\000?\000\000", "\000a\000a\000a\000\000", 0, 0);
-        x2s("\000b\000a\000*\000?\000\000", "\000b\000a\000a\000\000", 0, 2);
-        x2s("\000b\000a\000*\000?\000b\000\000", "\000b\000a\000a\000b\000\000", 0, 8);
-        x2s("\000a\000+\000?\000\000", "\000a\000a\000a\000\000", 0, 2);
-        x2s("\000b\000a\000+\000?\000\000", "\000b\000a\000a\000\000", 0, 4);
-        x2s("\000b\000a\000+\000?\000b\000\000", "\000b\000a\000a\000b\000\000", 0, 8);
-        x2s("\000(\000?\000:\000a\000?\000)\000?\000?\000\000", "\000a\000\000", 0, 0);
-        x2s("\000(\000?\000:\000a\000?\000?\000)\000?\000\000", "\000a\000\000", 0, 0);
-        x2s("\000(\000?\000:\000a\000?\000)\000+\000?\000\000", "\000a\000a\000a\000\000", 0, 2);
-        x2s("\000(\000?\000:\000a\000+\000)\000?\000?\000\000", "\000a\000a\000a\000\000", 0, 0);
-        x2s("\000(\000?\000:\000a\000+\000)\000?\000?\000b\000\000", "\000a\000a\000a\000b\000\000", 0, 8);
-        x2s("\000(\000?\000:\000a\000b\000)\000?\000{\0002\000}\000\000", "\000\000", 0, 0);
-        x2s("\000(\000?\000:\000a\000b\000)\000?\000{\0002\000}\000\000", "\000a\000b\000a\000b\000a\000\000", 0, 8);
-        x2s("\000(\000?\000:\000a\000b\000)\000*\000{\0000\000}\000\000", "\000a\000b\000a\000b\000a\000\000", 0, 0);
-        x2s("\000(\000?\000:\000a\000b\000)\000{\0003\000,\000}\000\000", "\000a\000b\000a\000b\000a\000b\000a\000b\000\000", 0, 16);
-        ns("\000(\000?\000:\000a\000b\000)\000{\0003\000,\000}\000\000", "\000a\000b\000a\000b\000\000");
-        x2s("\000(\000?\000:\000a\000b\000)\000{\0002\000,\0004\000}\000\000", "\000a\000b\000a\000b\000a\000b\000\000", 0, 12);
-        x2s("\000(\000?\000:\000a\000b\000)\000{\0002\000,\0004\000}\000\000", "\000a\000b\000a\000b\000a\000b\000a\000b\000a\000b\000\000", 0, 16);
-        x2s("\000(\000?\000:\000a\000b\000)\000{\0002\000,\0004\000}\000?\000\000", "\000a\000b\000a\000b\000a\000b\000a\000b\000a\000b\000\000", 0, 8);
-        x2s("\000(\000?\000:\000a\000b\000)\000{\000,\000}\000\000", "\000a\000b\000{\000,\000}\000\000", 0, 10);
-        x2s("\000(\000?\000:\000a\000b\000c\000)\000+\000?\000{\0002\000}\000\000", "\000a\000b\000c\000a\000b\000c\000a\000b\000c\000\000", 0, 12);
-        x2s("\000(\000?\000:\000X\000*\000)\000(\000?\000i\000:\000x\000a\000)\000\000", "\000X\000X\000X\000a\000\000", 0, 8);
-        x2s("\000(\000d\000+\000)\000(\000[\000^\000a\000b\000c\000]\000z\000)\000\000", "\000d\000d\000d\000z\000\000", 0, 8);
-        x2s("\000(\000[\000^\000a\000b\000c\000]\000*\000)\000(\000[\000^\000a\000b\000c\000]\000z\000)\000\000", "\000d\000d\000d\000z\000\000", 0, 8);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000(\000\134\000w\000+\000)\000(\000\134\000w\000z\000)\000\000", "\000d\000d\000d\000z\000\000", 0, 8);
-        x3s("\000(\000a\000)\000\000", "\000a\000\000", 0, 2, 1);
-        x3s("\000(\000a\000b\000)\000\000", "\000a\000b\000\000", 0, 4, 1);
-        x2s("\000(\000(\000a\000b\000)\000)\000\000", "\000a\000b\000\000", 0, 4);
-        x3s("\000(\000(\000a\000b\000)\000)\000\000", "\000a\000b\000\000", 0, 4, 1);
-        x3s("\000(\000(\000a\000b\000)\000)\000\000", "\000a\000b\000\000", 0, 4, 2);
-        x3s("\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000a\000b\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000\000", "\000a\000b\000\000", 0, 4, 20);
-        x3s("\000(\000a\000b\000)\000(\000c\000d\000)\000\000", "\000a\000b\000c\000d\000\000", 0, 4, 1);
-        x3s("\000(\000a\000b\000)\000(\000c\000d\000)\000\000", "\000a\000b\000c\000d\000\000", 4, 8, 2);
-        x3s("\000(\000)\000(\000a\000)\000b\000c\000(\000d\000e\000f\000)\000g\000h\000i\000j\000k\000\000", "\000a\000b\000c\000d\000e\000f\000g\000h\000i\000j\000k\000\000", 6, 12, 3);
-        x3s("\000(\000(\000)\000(\000a\000)\000b\000c\000(\000d\000e\000f\000)\000g\000h\000i\000j\000k\000)\000\000", "\000a\000b\000c\000d\000e\000f\000g\000h\000i\000j\000k\000\000", 6, 12, 4);
-        x2s("\000(\000^\000a\000)\000\000", "\000a\000\000", 0, 2);
-        x3s("\000(\000a\000)\000|\000(\000a\000)\000\000", "\000b\000a\000\000", 2, 4, 1);
-        x3s("\000(\000^\000a\000)\000|\000(\000a\000)\000\000", "\000b\000a\000\000", 2, 4, 2);
-        x3s("\000(\000a\000?\000)\000\000", "\000a\000a\000a\000\000", 0, 2, 1);
-        x3s("\000(\000a\000*\000)\000\000", "\000a\000a\000a\000\000", 0, 6, 1);
-        x3s("\000(\000a\000*\000)\000\000", "\000\000", 0, 0, 1);
-        x3s("\000(\000a\000+\000)\000\000", "\000a\000a\000a\000a\000a\000a\000a\000\000", 0, 14, 1);
-        x3s("\000(\000a\000+\000|\000b\000*\000)\000\000", "\000b\000b\000b\000a\000a\000\000", 0, 6, 1);
-        x3s("\000(\000a\000+\000|\000b\000?\000)\000\000", "\000b\000b\000b\000a\000a\000\000", 0, 2, 1);
-        x3s("\000(\000a\000b\000c\000)\000?\000\000", "\000a\000b\000c\000\000", 0, 6, 1);
-        x3s("\000(\000a\000b\000c\000)\000*\000\000", "\000a\000b\000c\000\000", 0, 6, 1);
-        x3s("\000(\000a\000b\000c\000)\000+\000\000", "\000a\000b\000c\000\000", 0, 6, 1);
-        x3s("\000(\000x\000y\000z\000|\000a\000b\000c\000)\000+\000\000", "\000a\000b\000c\000\000", 0, 6, 1);
-        x3s("\000(\000[\000x\000y\000z\000]\000[\000a\000b\000c\000]\000|\000a\000b\000c\000)\000+\000\000", "\000a\000b\000c\000\000", 0, 6, 1);
-        x3s("\000(\000(\000?\000i\000:\000a\000b\000c\000)\000)\000\000", "\000A\000b\000C\000\000", 0, 6, 1);
-        x2s("\000(\000a\000b\000c\000)\000(\000?\000i\000:\000\134\0001\000)\000\000", "\000a\000b\000c\000A\000B\000C\000\000", 0, 12);
-        x3s("\000(\000(\000?\000m\000:\000a\000.\000c\000)\000)\000\000", "\000a\000\012\000c\000\000", 0, 6, 1);
-        x3s("\000(\000(\000?\000=\000a\000z\000)\000a\000)\000\000", "\000a\000z\000b\000\000", 0, 2, 1);
-        x3s("\000a\000b\000c\000|\000(\000.\000a\000b\000d\000)\000\000", "\000z\000a\000b\000d\000\000", 0, 8, 1);
-        x2s("\000(\000?\000:\000a\000b\000c\000)\000|\000(\000A\000B\000C\000)\000\000", "\000a\000b\000c\000\000", 0, 6);
-        x3s("\000(\000?\000i\000:\000(\000a\000b\000c\000)\000)\000|\000(\000z\000z\000z\000)\000\000", "\000A\000B\000C\000\000", 0, 6, 1);
-        x3s("\000a\000*\000(\000.\000)\000\000", "\000a\000a\000a\000a\000z\000\000", 8, 10, 1);
-        x3s("\000a\000*\000?\000(\000.\000)\000\000", "\000a\000a\000a\000a\000z\000\000", 0, 2, 1);
-        x3s("\000a\000*\000?\000(\000c\000)\000\000", "\000a\000a\000a\000a\000c\000\000", 8, 10, 1);
-        x3s("\000[\000b\000c\000d\000]\000a\000*\000(\000.\000)\000\000", "\000c\000a\000a\000a\000a\000z\000\000", 10, 12, 1);
-        x3s("\000(\000\134\000A\000b\000b\000)\000c\000c\000\000", "\000b\000b\000c\000c\000\000", 0, 4, 1);
-        ns("\000(\000\134\000A\000b\000b\000)\000c\000c\000\000", "\000z\000b\000b\000c\000c\000\000");
-        x3s("\000(\000^\000b\000b\000)\000c\000c\000\000", "\000b\000b\000c\000c\000\000", 0, 4, 1);
-        ns("\000(\000^\000b\000b\000)\000c\000c\000\000", "\000z\000b\000b\000c\000c\000\000");
-        x3s("\000c\000c\000(\000b\000b\000$\000)\000\000", "\000c\000c\000b\000b\000\000", 4, 8, 1);
-        ns("\000c\000c\000(\000b\000b\000$\000)\000\000", "\000c\000c\000b\000b\000b\000\000");
-        ns("\000(\000\134\0001\000)\000\000", "\000\000");
-        ns("\000\134\0001\000(\000a\000)\000\000", "\000a\000a\000\000");
-        ns("\000(\000a\000(\000b\000)\000\134\0001\000)\000\134\0002\000+\000\000", "\000a\000b\000a\000b\000b\000\000");
-        ns("\000(\000?\000:\000(\000?\000:\000\134\0001\000|\000z\000)\000(\000a\000)\000)\000+\000$\000\000", "\000z\000a\000a\000\000");
-        x2s("\000(\000?\000:\000(\000?\000:\000\134\0001\000|\000z\000)\000(\000a\000)\000)\000+\000$\000\000", "\000z\000a\000a\000a\000\000", 0, 8);
-        x2s("\000(\000a\000)\000(\000?\000=\000\134\0001\000)\000\000", "\000a\000a\000\000", 0, 2);
-        ns("\000(\000a\000)\000$\000|\000\134\0001\000\000", "\000a\000z\000\000");
-        x2s("\000(\000a\000)\000\134\0001\000\000", "\000a\000a\000\000", 0, 4);
-        ns("\000(\000a\000)\000\134\0001\000\000", "\000a\000b\000\000");
-        x2s("\000(\000a\000?\000)\000\134\0001\000\000", "\000a\000a\000\000", 0, 4);
-        x2s("\000(\000a\000?\000?\000)\000\134\0001\000\000", "\000a\000a\000\000", 0, 0);
-        x2s("\000(\000a\000*\000)\000\134\0001\000\000", "\000a\000a\000a\000a\000a\000\000", 0, 8);
-        x3s("\000(\000a\000*\000)\000\134\0001\000\000", "\000a\000a\000a\000a\000a\000\000", 0, 4, 1);
-        x2s("\000a\000(\000b\000*\000)\000\134\0001\000\000", "\000a\000b\000b\000b\000b\000\000", 0, 10);
-        x2s("\000a\000(\000b\000*\000)\000\134\0001\000\000", "\000a\000b\000\000", 0, 2);
-        x2s("\000(\000a\000*\000)\000(\000b\000*\000)\000\134\0001\000\134\0002\000\000", "\000a\000a\000a\000b\000b\000a\000a\000a\000b\000b\000\000", 0, 20);
-        x2s("\000(\000a\000*\000)\000(\000b\000*\000)\000\134\0002\000\000", "\000a\000a\000a\000b\000b\000b\000b\000\000", 0, 14);
-        x2s("\000(\000(\000(\000(\000(\000(\000(\000a\000*\000)\000b\000)\000)\000)\000)\000)\000)\000c\000\134\0007\000\000", "\000a\000a\000a\000b\000c\000a\000a\000a\000\000", 0, 16);
-        x3s("\000(\000(\000(\000(\000(\000(\000(\000a\000*\000)\000b\000)\000)\000)\000)\000)\000)\000c\000\134\0007\000\000", "\000a\000a\000a\000b\000c\000a\000a\000a\000\000", 0, 6, 7);
-        x2s("\000(\000a\000)\000(\000b\000)\000(\000c\000)\000\134\0002\000\134\0001\000\134\0003\000\000", "\000a\000b\000c\000b\000a\000c\000\000", 0, 12);
-        x2s("\000(\000[\000a\000-\000d\000]\000)\000\134\0001\000\000", "\000c\000c\000\000", 0, 4);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000(\000\134\000w\000\134\000d\000\134\000s\000)\000\134\0001\000\000", "\000f\0005\000 \000f\0005\000 \000\000", 0, 12);
-        ns("\000(\000\134\000w\000\134\000d\000\134\000s\000)\000\134\0001\000\000", "\000f\0005\000 \000f\0005\000\000");
-        x2s("\000(\000w\000h\000o\000|\000[\000a\000-\000c\000]\000{\0003\000}\000)\000\134\0001\000\000", "\000w\000h\000o\000w\000h\000o\000\000", 0, 12);
-        x2s("\000.\000.\000.\000(\000w\000h\000o\000|\000[\000a\000-\000c\000]\000{\0003\000}\000)\000\134\0001\000\000", "\000a\000b\000c\000w\000h\000o\000w\000h\000o\000\000", 0, 18);
-        x2s("\000(\000w\000h\000o\000|\000[\000a\000-\000c\000]\000{\0003\000}\000)\000\134\0001\000\000", "\000c\000b\000c\000c\000b\000c\000\000", 0, 12);
-        x2s("\000(\000^\000a\000)\000\134\0001\000\000", "\000a\000a\000\000", 0, 4);
-        ns("\000(\000^\000a\000)\000\134\0001\000\000", "\000b\000a\000a\000\000");
-        ns("\000(\000a\000$\000)\000\134\0001\000\000", "\000a\000a\000\000");
-        ns("\000(\000a\000b\000\134\000Z\000)\000\134\0001\000\000", "\000a\000b\000\000");
-        x2s("\000(\000a\000*\000\134\000Z\000)\000\134\0001\000\000", "\000a\000\000", 2, 2);
-        x2s("\000.\000(\000a\000*\000\134\000Z\000)\000\134\0001\000\000", "\000b\000a\000\000", 2, 4);
-        x3s("\000(\000.\000(\000a\000b\000c\000)\000\134\0002\000)\000\000", "\000z\000a\000b\000c\000a\000b\000c\000\000", 0, 14, 1);
-        if (!org.joni.Config.NON_UNICODE_SDW) x3s("\000(\000.\000(\000.\000.\000\134\000d\000.\000)\000\134\0002\000)\000\000", "\000z\0001\0002\0003\0004\0001\0002\0003\0004\000\000", 0, 18, 1);
-        x2s("\000(\000(\000?\000i\000:\000a\000z\000)\000)\000\134\0001\000\000", "\000A\000z\000A\000z\000\000", 0, 8);
-        ns("\000(\000(\000?\000i\000:\000a\000z\000)\000)\000\134\0001\000\000", "\000A\000z\000a\000z\000\000");
-        x2s("\000(\000?\000<\000=\000a\000)\000b\000\000", "\000a\000b\000\000", 2, 4);
-        ns("\000(\000?\000<\000=\000a\000)\000b\000\000", "\000b\000b\000\000");
-        x2s("\000(\000?\000<\000=\000a\000|\000b\000)\000b\000\000", "\000b\000b\000\000", 2, 4);
-        x2s("\000(\000?\000<\000=\000a\000|\000b\000c\000)\000b\000\000", "\000b\000c\000b\000\000", 4, 6);
-        x2s("\000(\000?\000<\000=\000a\000|\000b\000c\000)\000b\000\000", "\000a\000b\000\000", 2, 4);
-        x2s("\000(\000?\000<\000=\000a\000|\000b\000c\000|\000|\000d\000e\000f\000g\000h\000i\000j\000|\000k\000l\000m\000n\000o\000p\000q\000|\000r\000)\000z\000\000", "\000r\000z\000\000", 2, 4);
-        x2s("\000(\000a\000)\000\134\000g\000<\0001\000>\000\000", "\000a\000a\000\000", 0, 4);
-        x2s("\000(\000?\000<\000!\000a\000)\000b\000\000", "\000c\000b\000\000", 2, 4);
-        ns("\000(\000?\000<\000!\000a\000)\000b\000\000", "\000a\000b\000\000");
-        x2s("\000(\000?\000<\000!\000a\000|\000b\000c\000)\000b\000\000", "\000b\000b\000b\000\000", 0, 2);
-        ns("\000(\000?\000<\000!\000a\000|\000b\000c\000)\000z\000\000", "\000b\000c\000z\000\000");
-        x2s("\000(\000?\000<\000n\000a\000m\000e\0001\000>\000a\000)\000\000", "\000a\000\000", 0, 2);
-        x2s("\000(\000?\000<\000n\000a\000m\000e\000_\0002\000>\000a\000b\000)\000\134\000g\000<\000n\000a\000m\000e\000_\0002\000>\000\000", "\000a\000b\000a\000b\000\000", 0, 8);
-        x2s("\000(\000?\000<\000n\000a\000m\000e\000_\0003\000>\000.\000z\000v\000.\000)\000\134\000k\000<\000n\000a\000m\000e\000_\0003\000>\000\000", "\000a\000z\000v\000b\000a\000z\000v\000b\000\000", 0, 16);
-        x2s("\000(\000?\000<\000=\000\134\000g\000<\000a\000b\000>\000)\000|\000-\000\134\000z\000E\000N\000D\000 \000(\000?\000<\000a\000b\000>\000X\000y\000Z\000)\000\000", "\000X\000y\000Z\000\000", 6, 6);
-        x2s("\000(\000?\000<\000n\000>\000|\000a\000\134\000g\000<\000n\000>\000)\000+\000\000", "\000\000", 0, 0);
-        x2s("\000(\000?\000<\000n\000>\000|\000\134\000(\000\134\000g\000<\000n\000>\000\134\000)\000)\000+\000$\000\000", "\000(\000)\000(\000(\000)\000)\000\000", 0, 12);
-        x3s("\000\134\000g\000<\000n\000>\000(\000?\000<\000n\000>\000.\000)\000{\0000\000}\000\000", "\000X\000\000", 0, 2, 1);
-        x2s("\000\134\000g\000<\000n\000>\000(\000a\000b\000c\000|\000d\000f\000(\000?\000<\000n\000>\000.\000Y\000Z\000)\000{\0002\000,\0008\000}\000)\000{\0000\000}\000\000", "\000X\000Y\000Z\000\000", 0, 6);
-        x2s("\000\134\000A\000(\000?\000<\000n\000>\000(\000a\000\134\000g\000<\000n\000>\000)\000|\000)\000\134\000z\000\000", "\000a\000a\000a\000a\000\000", 0, 8);
-        x2s("\000(\000?\000<\000n\000>\000|\000\134\000g\000<\000m\000>\000\134\000g\000<\000n\000>\000)\000\134\000z\000|\000\134\000z\000E\000N\000D\000 \000(\000?\000<\000m\000>\000a\000|\000(\000b\000)\000\134\000g\000<\000m\000>\000)\000\000", "\000b\000b\000b\000b\000a\000b\000b\000a\000\000", 0, 16);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000(\000?\000<\000n\000a\000m\000e\0001\0002\0004\0000\000>\000\134\000w\000+\000\134\000s\000x\000)\000a\000+\000\134\000k\000<\000n\000a\000m\000e\0001\0002\0004\0000\000>\000\000", "\000 \000 \000f\000g\000 \000x\000a\000a\000a\000a\000a\000a\000a\000a\000f\000g\000 \000x\000\000", 4, 36);
-        x3s("\000(\000z\000)\000(\000)\000(\000)\000(\000?\000<\000_\0009\000>\000a\000)\000\134\000g\000<\000_\0009\000>\000\000", "\000z\000a\000a\000\000", 4, 6, 1);
-        x2s("\000(\000.\000)\000(\000(\000(\000?\000<\000_\000>\000a\000)\000)\000)\000\134\000k\000<\000_\000>\000\000", "\000z\000a\000a\000\000", 0, 6);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000(\000(\000?\000<\000n\000a\000m\000e\0001\000>\000\134\000d\000)\000|\000(\000?\000<\000n\000a\000m\000e\0002\000>\000\134\000w\000)\000)\000(\000\134\000k\000<\000n\000a\000m\000e\0001\000>\000|\000\134\000k\000<\000n\000a\000m\000e\0002\000>\000)\000\000", "\000f\000f\000\000", 0, 4);
-        x2s("\000(\000?\000:\000(\000?\000<\000x\000>\000)\000|\000(\000?\000<\000x\000>\000e\000f\000g\000)\000)\000\134\000k\000<\000x\000>\000\000", "\000\000", 0, 0);
-        x2s("\000(\000?\000:\000(\000?\000<\000x\000>\000a\000b\000c\000)\000|\000(\000?\000<\000x\000>\000e\000f\000g\000)\000)\000\134\000k\000<\000x\000>\000\000", "\000a\000b\000c\000e\000f\000g\000e\000f\000g\000\000", 6, 18);
-        ns("\000(\000?\000:\000(\000?\000<\000x\000>\000a\000b\000c\000)\000|\000(\000?\000<\000x\000>\000e\000f\000g\000)\000)\000\134\000k\000<\000x\000>\000\000", "\000a\000b\000c\000e\000f\000g\000\000");
-        x2s("\000(\000?\000:\000(\000?\000<\000n\0001\000>\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000.\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000.\000.\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000.\000.\000.\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000 [...]
-        x3s("\000(\000?\000:\000(\000?\000<\000n\0001\000>\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000.\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000.\000.\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000.\000.\000.\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000 [...]
-        x3s("\000(\000?\000<\000n\000a\000m\000e\0001\000>\000)\000(\000?\000<\000n\000a\000m\000e\0002\000>\000)\000(\000?\000<\000n\000a\000m\000e\0003\000>\000)\000(\000?\000<\000n\000a\000m\000e\0004\000>\000)\000(\000?\000<\000n\000a\000m\000e\0005\000>\000)\000(\000?\000<\000n\000a\000m\000e\0006\000>\000)\000(\000?\000<\000n\000a\000m\000e\0007\000>\000)\000(\000?\000<\000n\000a\000m\000e\0008\000>\000)\000(\000?\000<\000n\000a\000m\000e\0009\000>\000)\000(\000?\000<\000n\000a\000 [...]
-        x2s("\000(\000?\000<\000f\000o\000o\000>\000a\000|\000\134\000(\000\134\000g\000<\000f\000o\000o\000>\000\134\000)\000)\000\000", "\000a\000\000", 0, 2);
-        x2s("\000(\000?\000<\000f\000o\000o\000>\000a\000|\000\134\000(\000\134\000g\000<\000f\000o\000o\000>\000\134\000)\000)\000\000", "\000(\000(\000(\000(\000(\000(\000a\000)\000)\000)\000)\000)\000)\000\000", 0, 26);
-        x3s("\000(\000?\000<\000f\000o\000o\000>\000a\000|\000\134\000(\000\134\000g\000<\000f\000o\000o\000>\000\134\000)\000)\000\000", "\000(\000(\000(\000(\000(\000(\000(\000(\000a\000)\000)\000)\000)\000)\000)\000)\000)\000\000", 0, 34, 1);
-        x2s("\000\134\000g\000<\000b\000a\000r\000>\000|\000\134\000z\000E\000N\000D\000(\000?\000<\000b\000a\000r\000>\000.\000*\000a\000b\000c\000$\000)\000\000", "\000a\000b\000c\000x\000x\000x\000a\000b\000c\000\000", 0, 18);
-        x2s("\000\134\000g\000<\0001\000>\000|\000\134\000z\000E\000N\000D\000(\000.\000a\000.\000)\000\000", "\000b\000a\000c\000\000", 0, 6);
-        x3s("\000\134\000g\000<\000_\000A\000>\000\134\000g\000<\000_\000A\000>\000|\000\134\000z\000E\000N\000D\000(\000.\000a\000.\000)\000(\000?\000<\000_\000A\000>\000.\000b\000.\000)\000\000", "\000x\000b\000x\000y\000b\000y\000\000", 6, 12, 1);
-        x2s("\000\134\000A\000(\000?\000:\000\134\000g\000<\000p\000o\000n\000>\000|\000\134\000g\000<\000p\000a\000n\000>\000|\000\134\000z\000E\000N\000D\000 \000 \000(\000?\000<\000p\000a\000n\000>\000a\000|\000c\000\134\000g\000<\000p\000o\000n\000>\000c\000)\000(\000?\000<\000p\000o\000n\000>\000b\000|\000d\000\134\000g\000<\000p\000a\000n\000>\000d\000)\000)\000$\000\000", "\000c\000d\000c\000b\000c\000d\000c\000\000", 0, 14);
-        x2s("\000\134\000A\000(\000?\000<\000n\000>\000|\000a\000\134\000g\000<\000m\000>\000)\000\134\000z\000|\000\134\000z\000E\000N\000D\000 \000(\000?\000<\000m\000>\000\134\000g\000<\000n\000>\000)\000\000", "\000a\000a\000a\000a\000\000", 0, 8);
-        x2s("\000(\000?\000<\000n\000>\000(\000a\000|\000b\000\134\000g\000<\000n\000>\000c\000)\000{\0003\000,\0005\000}\000)\000\000", "\000b\000a\000a\000a\000a\000c\000a\000\000", 2, 10);
-        x2s("\000(\000?\000<\000n\000>\000(\000a\000|\000b\000\134\000g\000<\000n\000>\000c\000)\000{\0003\000,\0005\000}\000)\000\000", "\000b\000a\000a\000a\000a\000c\000a\000a\000a\000a\000a\000\000", 0, 20);
-        x2s("\000(\000?\000<\000p\000a\000r\000e\000>\000\134\000(\000(\000[\000^\000\134\000(\000\134\000)\000]\000+\000+\000|\000\134\000g\000<\000p\000a\000r\000e\000>\000)\000*\000+\000\134\000)\000)\000\000", "\000(\000(\000a\000)\000)\000\000", 0, 10);
-        x2s("\000(\000)\000*\000\134\0001\000\000", "\000\000", 0, 0);
-        x2s("\000(\000?\000:\000(\000)\000|\000(\000)\000)\000*\000\134\0001\000\134\0002\000\000", "\000\000", 0, 0);
-        x3s("\000(\000?\000:\000\134\0001\000a\000|\000(\000)\000)\000*\000\000", "\000a\000\000", 0, 0, 1);
-        x2s("\000x\000(\000(\000.\000)\000*\000)\000*\000x\000\000", "\0000\000x\0001\000x\0002\000x\0003\000\000", 2, 12);
-        x2s("\000x\000(\000(\000.\000)\000*\000)\000*\000x\000(\000?\000i\000:\000\134\0001\000)\000\134\000Z\000\000", "\0000\000x\0001\000x\0002\000x\0001\000X\0002\000\000", 2, 18);
-        x2s("\000(\000?\000:\000(\000)\000|\000(\000)\000|\000(\000)\000|\000(\000)\000|\000(\000)\000|\000(\000)\000)\000*\000\134\0002\000\134\0005\000\000", "\000\000", 0, 0);
-        x2s("\000(\000?\000:\000(\000)\000|\000(\000)\000|\000(\000)\000|\000(\000x\000)\000|\000(\000)\000|\000(\000)\000)\000*\000\134\0002\000b\000\134\0005\000\000", "\000b\000\000", 0, 2);
-        x2s("\217\372\000\000", "\217\372\000\000", 0, 2);
-        x2s("\000\000", "0B\000\000", 0, 0);
-        x2s("0B\000\000", "0B\000\000", 0, 2);
-        ns("0D\000\000", "0B\000\000");
-        x2s("0F0F\000\000", "0F0F\000\000", 0, 4);
-        x2s("0B0D0F\000\000", "0B0D0F\000\000", 0, 6);
-        x2s("0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S\000\000", "0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S\000\000", 0, 70);
-        x2s("0B\000\000", "0D0B\000\000", 2, 4);
-        x2s("0D0F\000\000", "0B0D0F\000\000", 2, 6);
-        x2s("e\207\000\000", "e\207\000\000", 0, 2);
-        x2s("\000.\000\000", "0B\000\000", 0, 2);
-        x2s("\000.\000.\000\000", "0K0M\000\000", 0, 4);
-        x2s("\000\134\000w\000\000", "0J\000\000", 0, 2);
-        ns("\000\134\000W\000\000", "0B\000\000");
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000[\000\134\000W\000]\000\000", "0F\000$\000\000", 2, 4);
-        x2s("\000\134\000S\000\000", "0]\000\000", 0, 2);
-        x2s("\000\134\000S\000\000", "o\042\000\000", 0, 2);
-        x2s("\000\134\000b\000\000", "l\027\000 \000\000", 0, 0);
-        x2s("\000\134\000b\000\000", "\000 0{\000\000", 2, 2);
-        x2s("\000\134\000B\000\000", "0[0]\000 \000\000", 2, 2);
-        x2s("\000\134\000B\000\000", "0F\000 \000\000", 4, 4);
-        x2s("\000\134\000B\000\000", "\000 0D\000\000", 0, 0);
-        x2s("\000[0_0a\000]\000\000", "0a\000\000", 0, 2);
-        ns("\000[0j0k\000]\000\000", "0l\000\000");
-        x2s("\000[0F\000-0J\000]\000\000", "0H\000\000", 0, 2);
-        ns("\000[\000^0Q\000]\000\000", "0Q\000\000");
-        x2s("\000[\000\134\000w\000]\000\000", "0m\000\000", 0, 2);
-        if (!org.joni.Config.NON_UNICODE_SDW) ns("\000[\000\134\000d\000]\000\000", "0u\000\000");
-        x2s("\000[\000\134\000D\000]\000\000", "0o\000\000", 0, 2);
-        ns("\000[\000\134\000s\000]\000\000", "0O\000\000");
-        x2s("\000[\000\134\000S\000]\000\000", "0x\000\000", 0, 2);
-        x2s("\000[\000\134\000w\000\134\000d\000]\000\000", "0\210\000\000", 0, 2);
-        x2s("\000[\000\134\000w\000\134\000d\000]\000\000", "\000 \000 \000 0\210\000\000", 6, 8);
-        ns("\000\134\000w\233<\216\312\000\000", "\000 \233<\216\312\000\000");
-        x2s("\233<\000\134\000W\216\312\000\000", "\233<\000 \216\312\000\000", 0, 6);
-        x2s("0B\000.0D\000.0F\000\000", "0B0B0D0D0F\000\000", 0, 10);
-        x2s("\000.\000\134\000w0F\000\134\000W\000.\000.0^\000\000", "0H0F0F\000 0F0^0^\000\000", 0, 14);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000\134\000s\000\134\000w0S0S0S\000\000", "\000 0S0S0S0S\000\000", 0, 10);
-        x2s("0B0B\000.0Q\000\000", "0B0B0Q0Q\000\000", 0, 8);
-        ns("\000.0D\000\000", "0D0H\000\000");
-        x2s("\000.0J\000\000", "0J0J\000\000", 0, 4);
-        x2s("\000^0B\000\000", "0B\000\000", 0, 2);
-        x2s("\000^0\200\000$\000\000", "0\200\000\000", 0, 2);
-        x2s("\000^\000\134\000w\000$\000\000", "0k\000\000", 0, 2);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000^\000\134\000w0K0M0O0Q0S\000$\000\000", "\000z0K0M0O0Q0S\000\000", 0, 12);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000^\000\134\000w\000.\000.\000.0F0H0J\000$\000\000", "\000z0B0D0F0F0H0J\000\000", 0, 14);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000\134\000w\000\134\000w\000\134\000s\000\134\000W0J0J0J\000\134\000d\000\000", "\000a0J\000 \000 0J0J0J\0004\000\000", 0, 16);
-        x2s("\000\134\000A0_0a0d\000\000", "0_0a0d\000\000", 0, 6);
-        x2s("0\2000\2010\202\000\134\000Z\000\000", "0\2000\2010\202\000\000", 0, 6);
-        x2s("0K0M0O\000\134\000z\000\000", "0K0M0O\000\000", 0, 6);
-        x2s("0K0M0O\000\134\000Z\000\000", "0K0M0O\000\012\000\000", 0, 6);
-        x2s("\000\134\000G0}0t\000\000", "0}0t\000\000", 0, 4);
-        ns("\000\134\000G0H\000\000", "0F0H0J\000\000");
-        ns("0h0f\000\134\000G\000\000", "0h0f\000\000");
-        ns("0~0\177\000\134\000A\000\000", "0~0\177\000\000");
-        ns("0~\000\134\000A0\177\000\000", "0~0\177\000\000");
-        x2s("\000(\000?\000=0[\000)0[\000\000", "0[\000\000", 0, 2);
-        ns("\000(\000?\000=0F\000)\000.\000\000", "0D\000\000");
-        x2s("\000(\000?\000!0F\000)0K\000\000", "0K\000\000", 0, 2);
-        ns("\000(\000?\000!0h\000)0B\000\000", "0h\000\000");
-        x2s("\000(\000?\000i\000:0B\000)\000\000", "0B\000\000", 0, 2);
-        x2s("\000(\000?\000i\000:0v0y\000)\000\000", "0v0y\000\000", 0, 4);
-        ns("\000(\000?\000i\000:0D\000)\000\000", "0F\000\000");
-        x2s("\000(\000?\000m\000:0\210\000.\000)\000\000", "0\210\000\012\000\000", 0, 4);
-        x2s("\000(\000?\000m\000:\000.0\201\000)\000\000", "0~\000\0120\201\000\000", 2, 6);
-        x2s("0B\000?\000\000", "\000\000", 0, 0);
-        x2s("Y\011\000?\000\000", "S\026\000\000", 0, 0);
-        x2s("Y\011\000?\000\000", "Y\011\000\000", 0, 2);
-        x2s("\221\317\000*\000\000", "\000\000", 0, 0);
-        x2s("\221\317\000*\000\000", "\221\317\000\000", 0, 2);
-        x2s("[P\000*\000\000", "[P[P[P\000\000", 0, 6);
-        x2s("\231\254\000*\000\000", "\236\177\231\254\231\254\231\254\231\254\000\000", 0, 0);
-        ns("\134q\000+\000\000", "\000\000");
-        x2s("l\263\000+\000\000", "l\263\000\000", 0, 2);
-        x2s("fB\000+\000\000", "fBfBfBfB\000\000", 0, 8);
-        x2s("0H\000+\000\000", "0H0H0F0F0F\000\000", 0, 4);
-        x2s("0F\000+\000\000", "0J0F0F0F0F\000\000", 2, 10);
-        x2s("\000.\000?\000\000", "0_\000\000", 0, 2);
-        x2s("\000.\000*\000\000", "0q0t0w0z\000\000", 0, 8);
-        x2s("\000.\000+\000\000", "0\215\000\000", 0, 2);
-        x2s("\000.\000+\000\000", "0D0F0H0K\000\012\000\000", 0, 8);
-        x2s("0B\000|0D\000\000", "0B\000\000", 0, 2);
-        x2s("0B\000|0D\000\000", "0D\000\000", 0, 2);
-        x2s("0B0D\000|0D0F\000\000", "0B0D\000\000", 0, 4);
-        x2s("0B0D\000|0D0F\000\000", "0D0F\000\000", 0, 4);
-        x2s("0\222\000(\000?\000:0K0M\000|0M0O\000)\000\000", "0\2220K0M\000\000", 0, 6);
-        x2s("0\222\000(\000?\000:0K0M\000|0M0O\000)0Q\000\000", "0\2220M0O0Q\000\000", 0, 8);
-        x2s("0B0D\000|\000(\000?\000:0B0F\000|0B0\222\000)\000\000", "0B0\222\000\000", 0, 4);
-        x2s("0B\000|0D\000|0F\000\000", "0H0F\000\000", 2, 4);
-        x2s("0B\000|0D\000|0F0H\000|0J0K0M\000|0O\000|0Q0S0U\000|0W0Y0[\000|0]\000|0_0a\000|0d0f0h0j0k\000|0l0m\000\000", "0W0Y0[\000\000", 0, 6);
-        ns("0B\000|0D\000|0F0H\000|0J0K0M\000|0O\000|0Q0S0U\000|0W0Y0[\000|0]\000|0_0a\000|0d0f0h0j0k\000|0l0m\000\000", "0Y0[\000\000");
-        x2s("0B\000|\000^0\217\000\000", "0v0B\000\000", 2, 4);
-        x2s("0B\000|\000^0\222\000\000", "0\2220B\000\000", 0, 2);
-        x2s("\233<\000|\000\134\000G\216\312\000\000", "0Q\216\312\233<\000\000", 4, 6);
-        x2s("\233<\000|\000\134\000G\216\312\000\000", "\216\312\233<\000\000", 0, 2);
-        x2s("\233<\000|\000\134\000A\216\312\000\000", "\000b\216\312\233<\000\000", 4, 6);
-        x2s("\233<\000|\000\134\000A\216\312\000\000", "\216\312\000\000", 0, 2);
-        x2s("\233<\000|\216\312\000\134\000Z\000\000", "\216\312\233<\000\000", 2, 4);
-        x2s("\233<\000|\216\312\000\134\000Z\000\000", "\216\312\000\000", 0, 2);
-        x2s("\233<\000|\216\312\000\134\000Z\000\000", "\216\312\000\012\000\000", 0, 2);
-        x2s("\233<\000|\216\312\000\134\000z\000\000", "\216\312\233<\000\000", 2, 4);
-        x2s("\233<\000|\216\312\000\134\000z\000\000", "\216\312\000\000", 0, 2);
-        x2s("\000\134\000w\000|\000\134\000s\000\000", "0J\000\000", 0, 2);
-        x2s("\000\134\000w\000|\000%\000\000", "\000%0J\000\000", 0, 2);
-        x2s("\000\134\000w\000|\000[\000&\000$\000]\000\000", "0F\000&\000\000", 0, 2);
-        x2s("\000[0D\000-0Q\000]\000\000", "0F\000\000", 0, 2);
-        x2s("\000[0D\000-0Q\000]\000|\000[\000^0K\000-0S\000]\000\000", "0B\000\000", 0, 2);
-        x2s("\000[0D\000-0Q\000]\000|\000[\000^0K\000-0S\000]\000\000", "0K\000\000", 0, 2);
-        x2s("\000[\000^0B\000]\000\000", "\000\012\000\000", 0, 2);
-        x2s("\000(\000?\000:0B\000|\000[0F\000-0M\000]\000)\000|0D0\222\000\000", "0F0\222\000\000", 0, 2);
-        x2s("\000(\000?\000:0B\000|\000[0F\000-0M\000]\000)\000|0D0\222\000\000", "0D0\222\000\000", 0, 4);
-        x2s("0B0D0F\000|\000(\000?\000=0Q0Q\000)\000.\000.0{\000\000", "0Q0Q0{\000\000", 0, 6);
-        x2s("0B0D0F\000|\000(\000?\000!0Q0Q\000)\000.\000.0{\000\000", "0B0D0{\000\000", 0, 6);
-        x2s("\000(\000?\000=0\2220B\000)\000.\000.0B\000|\000(\000?\000=0\2220\222\000)\000.\000.0B\000\000", "0\2220\2220B\000\000", 0, 6);
-        x2s("\000(\000?\000<\000=0B\000|0D0F\000)0D\000\000", "0D0F0D\000\000", 4, 6);
-        ns("\000(\000?\000>0B\000|0B0D0H\000)0F\000\000", "0B0D0H0F\000\000");
-        x2s("\000(\000?\000>0B0D0H\000|0B\000)0F\000\000", "0B0D0H0F\000\000", 0, 8);
-        x2s("0B\000?\000|0D\000\000", "0B\000\000", 0, 2);
-        x2s("0B\000?\000|0D\000\000", "0D\000\000", 0, 0);
-        x2s("0B\000?\000|0D\000\000", "\000\000", 0, 0);
-        x2s("0B\000*\000|0D\000\000", "0B0B\000\000", 0, 4);
-        x2s("0B\000*\000|0D\000*\000\000", "0D0B\000\000", 0, 0);
-        x2s("0B\000*\000|0D\000*\000\000", "0B0D\000\000", 0, 2);
-        x2s("\000[\000a0B\000]\000*\000|0D\000*\000\000", "\000a0B0D0D0D\000\000", 0, 4);
-        x2s("0B\000+\000|0D\000*\000\000", "\000\000", 0, 0);
-        x2s("0B\000+\000|0D\000*\000\000", "0D0D0D\000\000", 0, 6);
-        x2s("0B\000+\000|0D\000*\000\000", "0B0D0D0D\000\000", 0, 2);
-        x2s("0B\000+\000|0D\000*\000\000", "\000a0B0D0D0D\000\000", 0, 0);
-        ns("0B\000+\000|0D\000+\000\000", "\000\000");
-        x2s("\000(0B\000|0D\000)\000?\000\000", "0D\000\000", 0, 2);
-        x2s("\000(0B\000|0D\000)\000*\000\000", "0D0B\000\000", 0, 4);
-        x2s("\000(0B\000|0D\000)\000+\000\000", "0D0B0D\000\000", 0, 6);
-        x2s("\000(0B0D\000|0F0B\000)\000+\000\000", "0F0B0B0D0F0H\000\000", 0, 8);
-        x2s("\000(0B0D\000|0F0H\000)\000+\000\000", "0F0B0B0D0F0H\000\000", 4, 12);
-        x2s("\000(0B0D\000|0F0B\000)\000+\000\000", "0B0B0D0F0B\000\000", 2, 10);
-        x2s("\000(0B0D\000|0F0B\000)\000+\000\000", "0B0D0\2220F0B\000\000", 0, 4);
-        x2s("\000(0B0D\000|0F0B\000)\000+\000\000", "\000$\000$\000z\000z\000z\000z0B0D0\2220F0B\000\000", 12, 16);
-        x2s("\000(0B\000|0D0B0D\000)\000+\000\000", "0B0D0B0D0B\000\000", 0, 10);
-        x2s("\000(0B\000|0D0B0D\000)\000+\000\000", "0D0B\000\000", 2, 4);
-        x2s("\000(0B\000|0D0B0D\000)\000+\000\000", "0D0B0B0B0D0B\000\000", 2, 8);
-        x2s("\000(\000?\000:0B\000|0D\000)\000(\000?\000:0B\000|0D\000)\000\000", "0B0D\000\000", 0, 4);
-        x2s("\000(\000?\000:0B\000*\000|0D\000*\000)\000(\000?\000:0B\000*\000|0D\000*\000)\000\000", "0B0B0B0D0D0D\000\000", 0, 6);
-        x2s("\000(\000?\000:0B\000*\000|0D\000*\000)\000(\000?\000:0B\000+\000|0D\000+\000)\000\000", "0B0B0B0D0D0D\000\000", 0, 12);
-        x2s("\000(\000?\000:0B\000+\000|0D\000+\000)\000{\0002\000}\000\000", "0B0B0B0D0D0D\000\000", 0, 12);
-        x2s("\000(\000?\000:0B\000+\000|0D\000+\000)\000{\0001\000,\0002\000}\000\000", "0B0B0B0D0D0D\000\000", 0, 12);
-        x2s("\000(\000?\000:0B\000+\000|\000\134\000A0D\000*\000)0F0F\000\000", "0F0F\000\000", 0, 4);
-        ns("\000(\000?\000:0B\000+\000|\000\134\000A0D\000*\000)0F0F\000\000", "0B0D0F0F\000\000");
-        x2s("\000(\000?\000:\000^0B\000+\000|0D\000+\000)\000*0F\000\000", "0B0B0D0D0D0B0D0F\000\000", 12, 16);
-        x2s("\000(\000?\000:\000^0B\000+\000|0D\000+\000)\000*0F\000\000", "0B0B0D0D0D0D0F\000\000", 0, 14);
-        x2s("0F\000{\0000\000,\000}\000\000", "0F0F0F0F\000\000", 0, 8);
-        x2s("0B\000|\000(\000?\000i\000)\000c\000\000", "\000C\000\000", 0, 2);
-        x2s("\000(\000?\000i\000)\000c\000|0B\000\000", "\000C\000\000", 0, 2);
-        x2s("\000(\000?\000i\000:0B\000)\000|\000a\000\000", "\000a\000\000", 0, 2);
-        ns("\000(\000?\000i\000:0B\000)\000|\000a\000\000", "\000A\000\000");
-        x2s("\000[0B0D0F\000]\000?\000\000", "0B0D0F\000\000", 0, 2);
-        x2s("\000[0B0D0F\000]\000*\000\000", "0B0D0F\000\000", 0, 6);
-        x2s("\000[\000^0B0D0F\000]\000*\000\000", "0B0D0F\000\000", 0, 0);
-        ns("\000[\000^0B0D0F\000]\000+\000\000", "0B0D0F\000\000");
-        x2s("0B\000?\000?\000\000", "0B0B0B\000\000", 0, 0);
-        x2s("0D0B\000?\000?0D\000\000", "0D0B0D\000\000", 0, 6);
-        x2s("0B\000*\000?\000\000", "0B0B0B\000\000", 0, 0);
-        x2s("0D0B\000*\000?\000\000", "0D0B0B\000\000", 0, 2);
-        x2s("0D0B\000*\000?0D\000\000", "0D0B0B0D\000\000", 0, 8);
-        x2s("0B\000+\000?\000\000", "0B0B0B\000\000", 0, 2);
-        x2s("0D0B\000+\000?\000\000", "0D0B0B\000\000", 0, 4);
-        x2s("0D0B\000+\000?0D\000\000", "0D0B0B0D\000\000", 0, 8);
-        x2s("\000(\000?\000:Y)\000?\000)\000?\000?\000\000", "Y)\000\000", 0, 0);
-        x2s("\000(\000?\000:Y)\000?\000?\000)\000?\000\000", "Y)\000\000", 0, 0);
-        x2s("\000(\000?\000:Y\042\000?\000)\000+\000?\000\000", "Y\042Y\042Y\042\000\000", 0, 2);
-        x2s("\000(\000?\000:\230\250\000+\000)\000?\000?\000\000", "\230\250\230\250\230\250\000\000", 0, 0);
-        x2s("\000(\000?\000:\226\352\000+\000)\000?\000?\227\034\000\000", "\226\352\226\352\226\352\227\034\000\000", 0, 8);
-        x2s("\000(\000?\000:0B0D\000)\000?\000{\0002\000}\000\000", "\000\000", 0, 0);
-        x2s("\000(\000?\000:\233<\216\312\000)\000?\000{\0002\000}\000\000", "\233<\216\312\233<\216\312\233<\000\000", 0, 8);
-        x2s("\000(\000?\000:\233<\216\312\000)\000*\000{\0000\000}\000\000", "\233<\216\312\233<\216\312\233<\000\000", 0, 0);
-        x2s("\000(\000?\000:\233<\216\312\000)\000{\0003\000,\000}\000\000", "\233<\216\312\233<\216\312\233<\216\312\233<\216\312\000\000", 0, 16);
-        ns("\000(\000?\000:\233<\216\312\000)\000{\0003\000,\000}\000\000", "\233<\216\312\233<\216\312\000\000");
-        x2s("\000(\000?\000:\233<\216\312\000)\000{\0002\000,\0004\000}\000\000", "\233<\216\312\233<\216\312\233<\216\312\000\000", 0, 12);
-        x2s("\000(\000?\000:\233<\216\312\000)\000{\0002\000,\0004\000}\000\000", "\233<\216\312\233<\216\312\233<\216\312\233<\216\312\233<\216\312\000\000", 0, 16);
-        x2s("\000(\000?\000:\233<\216\312\000)\000{\0002\000,\0004\000}\000?\000\000", "\233<\216\312\233<\216\312\233<\216\312\233<\216\312\233<\216\312\000\000", 0, 8);
-        x2s("\000(\000?\000:\233<\216\312\000)\000{\000,\000}\000\000", "\233<\216\312\000{\000,\000}\000\000", 0, 10);
-        x2s("\000(\000?\000:0K0M0O\000)\000+\000?\000{\0002\000}\000\000", "0K0M0O0K0M0O0K0M0O\000\000", 0, 12);
-        x3s("\000(pk\000)\000\000", "pk\000\000", 0, 2, 1);
-        x3s("\000(pkl4\000)\000\000", "pkl4\000\000", 0, 4, 1);
-        x2s("\000(\000(fB\225\223\000)\000)\000\000", "fB\225\223\000\000", 0, 4);
-        x3s("\000(\000(\230\250l4\000)\000)\000\000", "\230\250l4\000\000", 0, 4, 1);
-        x3s("\000(\000(f(e\345\000)\000)\000\000", "f(e\345\000\000", 0, 4, 2);
-        x3s("\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\221\317[P\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000\000", "\221\317[P\000\000", 0, 4, 20);
-        x3s("\000(0B0D\000)\000(0F0H\000)\000\000", "0B0D0F0H\000\000", 0, 4, 1);
-        x3s("\000(0B0D\000)\000(0F0H\000)\000\000", "0B0D0F0H\000\000", 4, 8, 2);
-        x3s("\000(\000)\000(0B\000)0D0F\000(0H0J0K\000)0M0O0Q0S\000\000", "0B0D0F0H0J0K0M0O0Q0S\000\000", 6, 12, 3);
-        x3s("\000(\000(\000)\000(0B\000)0D0F\000(0H0J0K\000)0M0O0Q0S\000)\000\000", "0B0D0F0H0J0K0M0O0Q0S\000\000", 6, 12, 4);
-        x3s("\000.\000*\000(0\3250\251\000)0\3630\3730\336\000(0\363\000(\000)0\2670\3450\277\000)0\2440\363\000\000", "0\3250\2510\3630\3730\3360\3630\2670\3450\2770\2440\363\000\000", 10, 18, 2);
-        x2s("\000(\000^0B\000)\000\000", "0B\000\000", 0, 2);
-        x3s("\000(0B\000)\000|\000(0B\000)\000\000", "0D0B\000\000", 2, 4, 1);
-        x3s("\000(\000^0B\000)\000|\000(0B\000)\000\000", "0D0B\000\000", 2, 4, 2);
-        x3s("\000(0B\000?\000)\000\000", "0B0B0B\000\000", 0, 2, 1);
-        x3s("\000(0~\000*\000)\000\000", "0~0~0~\000\000", 0, 6, 1);
-        x3s("\000(0h\000*\000)\000\000", "\000\000", 0, 0, 1);
-        x3s("\000(0\213\000+\000)\000\000", "0\2130\2130\2130\2130\2130\2130\213\000\000", 0, 14, 1);
-        x3s("\000(0u\000+\000|0x\000*\000)\000\000", "0u0u0u0x0x\000\000", 0, 6, 1);
-        x3s("\000(0B\000+\000|0D\000?\000)\000\000", "0D0D0D0B0B\000\000", 0, 2, 1);
-        x3s("\000(0B0D0F\000)\000?\000\000", "0B0D0F\000\000", 0, 6, 1);
-        x3s("\000(0B0D0F\000)\000*\000\000", "0B0D0F\000\000", 0, 6, 1);
-        x3s("\000(0B0D0F\000)\000+\000\000", "0B0D0F\000\000", 0, 6, 1);
-        x3s("\000(0U0W0Y\000|0B0D0F\000)\000+\000\000", "0B0D0F\000\000", 0, 6, 1);
-        x3s("\000(\000[0j0k0l\000]\000[0K0M0O\000]\000|0K0M0O\000)\000+\000\000", "0K0M0O\000\000", 0, 6, 1);
-        x3s("\000(\000(\000?\000i\000:0B0D0F\000)\000)\000\000", "0B0D0F\000\000", 0, 6, 1);
-        x3s("\000(\000(\000?\000m\000:0B\000.0F\000)\000)\000\000", "0B\000\0120F\000\000", 0, 6, 1);
-        x3s("\000(\000(\000?\000=0B0\223\000)0B\000)\000\000", "0B0\2230D\000\000", 0, 2, 1);
-        x3s("0B0D0F\000|\000(\000.0B0D0H\000)\000\000", "0\2230B0D0H\000\000", 0, 8, 1);
-        x3s("0B\000*\000(\000.\000)\000\000", "0B0B0B0B0\223\000\000", 8, 10, 1);
-        x3s("0B\000*\000?\000(\000.\000)\000\000", "0B0B0B0B0\223\000\000", 0, 2, 1);
-        x3s("0B\000*\000?\000(0\223\000)\000\000", "0B0B0B0B0\223\000\000", 8, 10, 1);
-        x3s("\000[0D0F0H\000]0B\000*\000(\000.\000)\000\000", "0H0B0B0B0B0\223\000\000", 10, 12, 1);
-        x3s("\000(\000\134\000A0D0D\000)0F0F\000\000", "0D0D0F0F\000\000", 0, 4, 1);
-        ns("\000(\000\134\000A0D0D\000)0F0F\000\000", "0\2230D0D0F0F\000\000");
-        x3s("\000(\000^0D0D\000)0F0F\000\000", "0D0D0F0F\000\000", 0, 4, 1);
-        ns("\000(\000^0D0D\000)0F0F\000\000", "0\2230D0D0F0F\000\000");
-        x3s("0\2150\215\000(0\2130\213\000$\000)\000\000", "0\2150\2150\2130\213\000\000", 4, 8, 1);
-        ns("0\2150\215\000(0\2130\213\000$\000)\000\000", "0\2150\2150\2130\2130\213\000\000");
-        x2s("\000(q!\000)\000\134\0001\000\000", "q!q!\000\000", 0, 4);
-        ns("\000(q!\000)\000\134\0001\000\000", "q!kf\000\000");
-        x2s("\000(zz\000?\000)\000\134\0001\000\000", "zzzz\000\000", 0, 4);
-        x2s("\000(zz\000?\000?\000)\000\134\0001\000\000", "zzzz\000\000", 0, 0);
-        x2s("\000(zz\000*\000)\000\134\0001\000\000", "zzzzzzzzzz\000\000", 0, 8);
-        x3s("\000(zz\000*\000)\000\134\0001\000\000", "zzzzzzzzzz\000\000", 0, 4, 1);
-        x2s("0B\000(0D\000*\000)\000\134\0001\000\000", "0B0D0D0D0D\000\000", 0, 10);
-        x2s("0B\000(0D\000*\000)\000\134\0001\000\000", "0B0D\000\000", 0, 2);
-        x2s("\000(0B\000*\000)\000(0D\000*\000)\000\134\0001\000\134\0002\000\000", "0B0B0B0D0D0B0B0B0D0D\000\000", 0, 20);
-        x2s("\000(0B\000*\000)\000(0D\000*\000)\000\134\0002\000\000", "0B0B0B0D0D0D0D\000\000", 0, 14);
-        x3s("\000(0B\000*\000)\000(0D\000*\000)\000\134\0002\000\000", "0B0B0B0D0D0D0D\000\000", 6, 10, 2);
-        x2s("\000(\000(\000(\000(\000(\000(\000(0}\000*\000)0z\000)\000)\000)\000)\000)\000)0t\000\134\0007\000\000", "0}0}0}0z0t0}0}0}\000\000", 0, 16);
-        x3s("\000(\000(\000(\000(\000(\000(\000(0}\000*\000)0z\000)\000)\000)\000)\000)\000)0t\000\134\0007\000\000", "0}0}0}0z0t0}0}0}\000\000", 0, 6, 7);
-        x2s("\000(0o\000)\000(0r\000)\000(0u\000)\000\134\0002\000\134\0001\000\134\0003\000\000", "0o0r0u0r0o0u\000\000", 0, 12);
-        x2s("\000(\000[0M\000-0Q\000]\000)\000\134\0001\000\000", "0O0O\000\000", 0, 4);
-        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000(\000\134\000w\000\134\000d\000\134\000s\000)\000\134\0001\000\000", "0B\0005\000 0B\0005\000 \000\000", 0, 12);
-        ns("\000(\000\134\000w\000\134\000d\000\134\000s\000)\000\134\0001\000\000", "0B\0005\000 0B\0005\000\000");
-        x2s("\000(\212\260\377\037\000|\000[0B\000-0F\000]\000{\0003\000}\000)\000\134\0001\000\000", "\212\260\377\037\212\260\377\037\000\000", 0, 8);
-        x2s("\000.\000.\000.\000(\212\260\377\037\000|\000[0B\000-0F\000]\000{\0003\000}\000)\000\134\0001\000\000", "0B\000a0B\212\260\377\037\212\260\377\037\000\000", 0, 14);
-        x2s("\000(\212\260\377\037\000|\000[0B\000-0F\000]\000{\0003\000}\000)\000\134\0001\000\000", "0F0D0F0F0D0F\000\000", 0, 12);
-        x2s("\000(\000^0S\000)\000\134\0001\000\000", "0S0S\000\000", 0, 4);
-        ns("\000(\000^0\200\000)\000\134\0001\000\000", "0\2010\2000\200\000\000");
-        ns("\000(0B\000$\000)\000\134\0001\000\000", "0B0B\000\000");
-        ns("\000(0B0D\000\134\000Z\000)\000\134\0001\000\000", "0B0D\000\000");
-        x2s("\000(0B\000*\000\134\000Z\000)\000\134\0001\000\000", "0B\000\000", 2, 2);
-        x2s("\000.\000(0B\000*\000\134\000Z\000)\000\134\0001\000\000", "0D0B\000\000", 2, 4);
-        x3s("\000(\000.\000(0\2040D0\206\000)\000\134\0002\000)\000\000", "\000z0\2040D0\2060\2040D0\206\000\000", 0, 14, 1);
-        if (!org.joni.Config.NON_UNICODE_SDW) x3s("\000(\000.\000(\000.\000.\000\134\000d\000.\000)\000\134\0002\000)\000\000", "0B\0001\0002\0003\0004\0001\0002\0003\0004\000\000", 0, 18, 1);
-        x2s("\000(\000(\000?\000i\000:0B\000v0Z\000)\000)\000\134\0001\000\000", "0B\000v0Z0B\000v0Z\000\000", 0, 12);
-        x2s("\000(\000?\000<a\0320K\000>Y\011\000|\000\134\000(\000\134\000g\000<a\0320K\000>\000\134\000)\000)\000\000", "\000(\000(\000(\000(\000(\000(Y\011\000)\000)\000)\000)\000)\000)\000\000", 0, 26);
-        x2s("\000\134\000A\000(\000?\000:\000\134\000g\000<\226?\000_\0001\000>\000|\000\134\000g\000<N\221\000_\0002\000>\000|\000\134\000z}BN\206\000 \000 \000(\000?\000<\226?\000_\0001\000>\211\263\000|\201\352\000\134\000g\000<N\221\000_\0002\000>\201\352\000)\000(\000?\000<N\221\000_\0002\000>W(\000|\203\351\205\251\000\134\000g\000<\226?\000_\0001\000>\203\351\205\251\000)\000)\000$\000\000", "\203\351\205\251\201\352\203\351\205\251\201\352W(\201\352\203\351\205\251\201\352\203\35 [...]
-        x2s("\000[\000[0r0u\000]\000]\000\000", "0u\000\000", 0, 2);
-        x2s("\000[\000[0D0J0F\000]0K\000]\000\000", "0K\000\000", 0, 2);
-        ns("\000[\000[\000^0B\000]\000]\000\000", "0B\000\000");
-        ns("\000[\000^\000[0B\000]\000]\000\000", "0B\000\000");
-        x2s("\000[\000^\000[\000^0B\000]\000]\000\000", "0B\000\000", 0, 2);
-        x2s("\000[\000[0K0M0O\000]\000&\000&0M0O\000]\000\000", "0O\000\000", 0, 2);
-        ns("\000[\000[0K0M0O\000]\000&\000&0M0O\000]\000\000", "0K\000\000");
-        ns("\000[\000[0K0M0O\000]\000&\000&0M0O\000]\000\000", "0Q\000\000");
-        x2s("\000[0B\000-0\223\000&\000&0D\000-0\222\000&\000&0F\000-0\221\000]\000\000", "0\221\000\000", 0, 2);
-        ns("\000[\000^0B\000-0\223\000&\000&0D\000-0\222\000&\000&0F\000-0\221\000]\000\000", "0\221\000\000");
-        x2s("\000[\000[\000^0B\000&\000&0B\000]\000&\000&0B\000-0\223\000]\000\000", "0D\000\000", 0, 2);
-        ns("\000[\000[\000^0B\000&\000&0B\000]\000&\000&0B\000-0\223\000]\000\000", "0B\000\000");
-        x2s("\000[\000[\000^0B\000-0\223\000&\000&0D0F0H0J\000]\000&\000&\000[\000^0F\000-0K\000]\000]\000\000", "0M\000\000", 0, 2);
-        ns("\000[\000[\000^0B\000-0\223\000&\000&0D0F0H0J\000]\000&\000&\000[\000^0F\000-0K\000]\000]\000\000", "0D\000\000");
-        x2s("\000[\000^\000[\000^0B0D0F\000]\000&\000&\000[\000^0F0H0J\000]\000]\000\000", "0F\000\000", 0, 2);
-        x2s("\000[\000^\000[\000^0B0D0F\000]\000&\000&\000[\000^0F0H0J\000]\000]\000\000", "0H\000\000", 0, 2);
-        ns("\000[\000^\000[\000^0B0D0F\000]\000&\000&\000[\000^0F0H0J\000]\000]\000\000", "0K\000\000");
-        x2s("\000[0B\000-\000&\000&\000-0B\000]\000\000", "\000-\000\000", 0, 2);
-        x2s("\000[\000^\000[\000^\000a\000-\000z0B0D0F\000]\000&\000&\000[\000^\000b\000c\000d\000e\000f\000g0F0H0J\000]\000q\000-\000w\000]\000\000", "0H\000\000", 0, 2);
-        x2s("\000[\000^\000[\000^\000a\000-\000z0B0D0F\000]\000&\000&\000[\000^\000b\000c\000d\000e\000f\000g0F0H0J\000]\000g\000-\000w\000]\000\000", "\000f\000\000", 0, 2);
-        x2s("\000[\000^\000[\000^\000a\000-\000z0B0D0F\000]\000&\000&\000[\000^\000b\000c\000d\000e\000f\000g0F0H0J\000]\000g\000-\000w\000]\000\000", "\000g\000\000", 0, 2);
-        ns("\000[\000^\000[\000^\000a\000-\000z0B0D0F\000]\000&\000&\000[\000^\000b\000c\000d\000e\000f\000g0F0H0J\000]\000g\000-\000w\000]\000\000", "\0002\000\000");
-        x2s("\000a\000<\000b\000>0\3200\3740\2700\3470\3630n0\3000\2460\3630\3550\3740\311\000<\000\134\000/\000b\000>\000\000", "\000a\000<\000b\000>0\3200\3740\2700\3470\3630n0\3000\2460\3630\3550\3740\311\000<\000/\000b\000>\000\000", 0, 40);
-        x2s("\000.\000<\000b\000>0\3200\3740\2700\3470\3630n0\3000\2460\3630\3550\3740\311\000<\000\134\000/\000b\000>\000\000", "\000a\000<\000b\000>0\3200\3740\2700\3470\3630n0\3000\2460\3630\3550\3740\311\000<\000/\000b\000>\000\000", 0, 40);
-
-        // Unicode case folding tests
-        // common case folding: u+0041 and u+0061
-        x2s("\u0000\u0041\000\000", "\u0000\u0061\000\000", 0, 2, Option.IGNORECASE);
-        x2s("\u0000\u0061\000\000", "\u0000\u0041\000\000", 0, 2, Option.IGNORECASE);
-        // common case folding: u+00C0 and u+00E0
-        x2s("\u0000\u00C0\000\000", "\u0000\u00E0\000\000", 0, 2, Option.IGNORECASE);
-        x2s("\u0000\u00E0\000\000", "\u0000\u00C0\000\000", 0, 2, Option.IGNORECASE);
-        // common case folding: u+00B5 and u+03BC
-        x2s("\u0000\u00B5\000\000", "\u0003\u00BC\000\000", 0, 2, Option.IGNORECASE);
-        x2s("\u0003\u00BC\000\000", "\u0000\u00B5\000\000", 0, 2, Option.IGNORECASE);
-        // common case folding: u+0073 and u+017F
-        x2s("\u0000\u0073\000\000", "\u0001\u007F\000\000", 0, 2, Option.IGNORECASE);
-        x2s("\u0001\u007F\000\000", "\u0000\u0073\000\000", 0, 2, Option.IGNORECASE);
-        // full case folding: u+1FA0 and u+1F60 u+03B9
-        x2s("\u001F\u00A0\000\000", "\u001F\u0060\u0003\u00B9\000\000", 0, 4, Option.IGNORECASE);
-        x2s("\u001F\u0060\u0003\u00B9\000\000", "\u001F\u00A0\000\000", 0, 2, Option.IGNORECASE);
-        // full case folding: u+1FA8 and u+1F60 u+03B9
-        x2s("\u001F\u00A8\000\000", "\u001F\u0060\u0003\u00B9\000\000", 0, 4, Option.IGNORECASE);
-        x2s("\u001F\u0060\u0003\u00B9\000\000", "\u001F\u00A8\000\000", 0, 2, Option.IGNORECASE);
-        // simple case folding: u+1FA8 and u+1FA0
-        x2s("\u001F\u00A8\000\000", "\u001F\u00A0\000\000", 0, 2, Option.IGNORECASE);
-        x2s("\u001F\u00A0\000\000", "\u001F\u00A8\000\000", 0, 2, Option.IGNORECASE);
-        // FIXME: Case folding for 'LATIN CAPITAL LETTER SHARP S' not supported
-        // full case folding: u+1E9E and u+0073 u+0073
-        // x2s("\u001E\u009E\000\000", "\u0000\u0073\u0000\u0073\000\000", 0, 4, Option.IGNORECASE);
-        // simple case folding: u+1E9E and u+00DF
-        // x2s("\u001E\u009E\000\000", "\u0000\u00DF\000\000", 0, 2, Option.IGNORECASE);
-
-        // Case fold exceeding Analyser#THRESHOLD_CASE_FOLD_ALT_FOR_EXPANSION (= 8)
-        x2s("\u0000\u0041\u0000\u0041\u0000\u0041\u0000\u0041\000\000", "\u0000\u0061\u0000\u0061\u0000\u0061\u0000\u0061\000\000", 0, 8, Option.IGNORECASE);
-    }
-
-    public static void main(String[] args) throws Throwable {
-        new TestU().run();
-    }
-}
+/*
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is furnished to do
+ * so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+package org.joni.test;
+
+import org.joni.Option;
+import org.joni.Syntax;
+import org.jcodings.Encoding;
+import org.jcodings.specific.UTF16BEEncoding;
+
+public class TestU extends Test {
+    @Override
+    public int option() {
+        return Option.DEFAULT;
+    }
+    @Override
+    public Encoding encoding() {
+        return UTF16BEEncoding.INSTANCE;
+    }
+    @Override
+    public String testEncoding() {
+        return "iso-8859-1";
+    }
+    @Override
+    public Syntax syntax() {
+        return Syntax.DEFAULT;
+    }
+
+    private int ulen(byte[]bytes) {
+        return encoding().strByteLengthNull(bytes, 0, bytes.length);
+    }
+
+    private String uconv(byte []bytes, int len) {
+        StringBuilder sb = new StringBuilder();
+
+        for (int i = 0; i < len; i += 2) {
+            int c = bytes[i] & 0xff;
+            // sb.append(String.format("\\%03o", c));
+            if (c == 0) {
+                c = bytes[i+1] & 0xff;
+                if (c < 0x20 || c >= 0x7f || c == 0x5c || c == 0x22) {
+                    sb.append(String.format("\\%03o", c));
+                } else {
+                    sb.append(new String(new byte[]{(byte)c}));
+                }
+            } else {
+                sb.append(String.format("\\%03o", c));
+                c = bytes[i+1] & 0xff;
+                sb.append(String.format("\\%03o", c));
+            }
+        }
+
+        return sb.toString();
+    }
+
+    protected String repr(byte[]bytes) {
+        return uconv(bytes, ulen(bytes));
+    }
+
+    protected int length(byte[]bytes) {
+        return ulen(bytes);
+    }
+    @Override
+    public void test() throws Exception {
+        x2s("\000\000", "\000\000", 0, 0);
+        x2s("\000^\000\000", "\000\000", 0, 0);
+        x2s("\000$\000\000", "\000\000", 0, 0);
+        x2s("\000\134\000G\000\000", "\000\000", 0, 0);
+        x2s("\000\134\000A\000\000", "\000\000", 0, 0);
+        x2s("\000\134\000Z\000\000", "\000\000", 0, 0);
+        x2s("\000\134\000z\000\000", "\000\000", 0, 0);
+        x2s("\000^\000$\000\000", "\000\000", 0, 0);
+        x2s("\000\134\000c\000a\000\000", "\000\001\000\000", 0, 2);
+        x2s("\000\134\000C\000-\000b\000\000", "\000\002\000\000", 0, 2);
+        x2s("\000\134\000c\000\134\000\134\000\000", "\000\034\000\000", 0, 2);
+        x2s("\000q\000[\000\134\000c\000\134\000\134\000]\000\000", "\000q\000\034\000\000", 0, 4);
+        x2s("\000\000", "\000a\000\000", 0, 0);
+        x2s("\000a\000\000", "\000a\000\000", 0, 2);
+        x2s("\000\134\000x\0000\0000\000\134\000x\0006\0001\000\000", "\000a\000\000", 0, 2);
+        x2s("\000a\000a\000\000", "\000a\000a\000\000", 0, 4);
+        x2s("\000a\000a\000a\000\000", "\000a\000a\000a\000\000", 0, 6);
+        x2s("\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000\000", "\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000a\000\000", 0, 70);
+        x2s("\000a\000b\000\000", "\000a\000b\000\000", 0, 4);
+        x2s("\000b\000\000", "\000a\000b\000\000", 2, 4);
+        x2s("\000b\000c\000\000", "\000a\000b\000c\000\000", 2, 6);
+        x2s("\000(\000?\000i\000:\000#\000R\000E\000T\000#\000)\000\000", "\000#\000I\000N\000S\000#\000#\000R\000E\000T\000#\000\000", 10, 20);
+        x2s("\000\134\0000\0000\0000\000\134\0001\0007\000\000", "\000\017\000\000", 0, 2);
+        x2s("\000\134\000x\0000\0000\000\134\000x\0001\000f\000\000", "\000\037\000\000", 0, 2);
+        x2s("\000a\000(\000?\000#\000.\000.\000.\000.\000\134\000\134\000J\000J\000J\000J\000)\000b\000\000", "\000a\000b\000\000", 0, 4);
+        x2s("\000(\000?\000x\000)\000 \000 \000G\000 \000(\000o\000 \000O\000(\000?\000-\000x\000)\000o\000O\000)\000 \000g\000 \000L\000\000", "\000G\000o\000O\000o\000O\000g\000L\000e\000\000", 0, 14);
+        x2s("\000.\000\000", "\000a\000\000", 0, 2);
+        ns("\000.\000\000", "\000\000");
+        x2s("\000.\000.\000\000", "\000a\000b\000\000", 0, 4);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000\134\000w\000\000", "\000e\000\000", 0, 2);
+        if (!org.joni.Config.NON_UNICODE_SDW) ns("\000\134\000W\000\000", "\000e\000\000");
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000\134\000s\000\000", "\000 \000\000", 0, 2);
+        x2s("\000\134\000S\000\000", "\000b\000\000", 0, 2);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000\134\000d\000\000", "\0004\000\000", 0, 2);
+        if (!org.joni.Config.NON_UNICODE_SDW) ns("\000\134\000D\000\000", "\0004\000\000");
+        x2s("\000\134\000b\000\000", "\000z\000 \000\000", 0, 0);
+        x2s("\000\134\000b\000\000", "\000 \000z\000\000", 2, 2);
+        x2s("\000\134\000B\000\000", "\000z\000z\000 \000\000", 2, 2);
+        x2s("\000\134\000B\000\000", "\000z\000 \000\000", 4, 4);
+        x2s("\000\134\000B\000\000", "\000 \000z\000\000", 0, 0);
+        x2s("\000[\000a\000b\000]\000\000", "\000b\000\000", 0, 2);
+        ns("\000[\000a\000b\000]\000\000", "\000c\000\000");
+        x2s("\000[\000a\000-\000z\000]\000\000", "\000t\000\000", 0, 2);
+        ns("\000[\000^\000a\000]\000\000", "\000a\000\000");
+        x2s("\000[\000^\000a\000]\000\000", "\000\012\000\000", 0, 2);
+        x2s("\000[\000]\000]\000\000", "\000]\000\000", 0, 2);
+        ns("\000[\000^\000]\000]\000\000", "\000]\000\000");
+        x2s("\000[\000\134\000^\000]\000+\000\000", "\0000\000^\000^\0001\000\000", 2, 6);
+        x2s("\000[\000b\000-\000]\000\000", "\000b\000\000", 0, 2);
+        x2s("\000[\000b\000-\000]\000\000", "\000-\000\000", 0, 2);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000[\000\134\000w\000]\000\000", "\000z\000\000", 0, 2);
+        ns("\000[\000\134\000w\000]\000\000", "\000 \000\000");
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000[\000\134\000W\000]\000\000", "\000b\000$\000\000", 2, 4);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000[\000\134\000d\000]\000\000", "\0005\000\000", 0, 2);
+        ns("\000[\000\134\000d\000]\000\000", "\000e\000\000");
+        x2s("\000[\000\134\000D\000]\000\000", "\000t\000\000", 0, 2);
+        if (!org.joni.Config.NON_UNICODE_SDW) ns("\000[\000\134\000D\000]\000\000", "\0003\000\000");
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000[\000\134\000s\000]\000\000", "\000 \000\000", 0, 2);
+        ns("\000[\000\134\000s\000]\000\000", "\000a\000\000");
+        x2s("\000[\000\134\000S\000]\000\000", "\000b\000\000", 0, 2);
+        if (!org.joni.Config.NON_UNICODE_SDW) ns("\000[\000\134\000S\000]\000\000", "\000 \000\000");
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000[\000\134\000w\000\134\000d\000]\000\000", "\0002\000\000", 0, 2);
+        ns("\000[\000\134\000w\000\134\000d\000]\000\000", "\000 \000\000");
+        x2s("\000[\000[\000:\000u\000p\000p\000e\000r\000:\000]\000]\000\000", "\000B\000\000", 0, 2);
+        x2s("\000[\000*\000[\000:\000x\000d\000i\000g\000i\000t\000:\000]\000+\000]\000\000", "\000+\000\000", 0, 2);
+        x2s("\000[\000*\000[\000:\000x\000d\000i\000g\000i\000t\000:\000]\000+\000]\000\000", "\000G\000H\000I\000K\000K\000-\0009\000+\000*\000\000", 12, 14);
+        x2s("\000[\000*\000[\000:\000x\000d\000i\000g\000i\000t\000:\000]\000+\000]\000\000", "\000-\000@\000^\000+\000\000", 6, 8);
+        ns("\000[\000[\000:\000u\000p\000p\000e\000r\000]\000]\000\000", "\000A\000\000");
+        x2s("\000[\000[\000:\000u\000p\000p\000e\000r\000]\000]\000\000", "\000:\000\000", 0, 2);
+        x2s("\000[\000\134\0000\0000\0000\000\134\0000\0004\0004\000-\000\134\0000\0000\0000\000\134\0000\0004\0007\000]\000\000", "\000&\000\000", 0, 2);
+        x2s("\000[\000\134\000x\0000\0000\000\134\000x\0005\000a\000-\000\134\000x\0000\0000\000\134\000x\0005\000c\000]\000\000", "\000[\000\000", 0, 2);
+        x2s("\000[\000\134\000x\0000\0000\000\134\000x\0006\000A\000-\000\134\000x\0000\0000\000\134\000x\0006\000D\000]\000\000", "\000l\000\000", 0, 2);
+        ns("\000[\000\134\000x\0000\0000\000\134\000x\0006\000A\000-\000\134\000x\0000\0000\000\134\000x\0006\000D\000]\000\000", "\000n\000\000");
+        ns("\000^\000[\0000\000-\0009\000A\000-\000F\000]\000+\000 \0000\000+\000 \000U\000N\000D\000E\000F\000 \000\000", "\0007\0005\000F\000 \0000\0000\0000\0000\0000\0000\0000\0000\000 \000S\000E\000C\000T\0001\0004\000A\000 \000n\000o\000t\000y\000p\000e\000 \000(\000)\000 \000 \000 \000 \000E\000x\000t\000e\000r\000n\000a\000l\000 \000 \000 \000 \000|\000 \000_\000r\000b\000_\000a\000p\000p\000l\000y\000\000");
+        x2s("\000[\000\134\000[\000]\000\000", "\000[\000\000", 0, 2);
+        x2s("\000[\000\134\000]\000]\000\000", "\000]\000\000", 0, 2);
+        x2s("\000[\000&\000]\000\000", "\000&\000\000", 0, 2);
+        x2s("\000[\000[\000a\000b\000]\000]\000\000", "\000b\000\000", 0, 2);
+        x2s("\000[\000[\000a\000b\000]\000c\000]\000\000", "\000c\000\000", 0, 2);
+        ns("\000[\000[\000^\000a\000]\000]\000\000", "\000a\000\000");
+        ns("\000[\000^\000[\000a\000]\000]\000\000", "\000a\000\000");
+        x2s("\000[\000[\000a\000b\000]\000&\000&\000b\000c\000]\000\000", "\000b\000\000", 0, 2);
+        ns("\000[\000[\000a\000b\000]\000&\000&\000b\000c\000]\000\000", "\000a\000\000");
+        ns("\000[\000[\000a\000b\000]\000&\000&\000b\000c\000]\000\000", "\000c\000\000");
+        x2s("\000[\000a\000-\000z\000&\000&\000b\000-\000y\000&\000&\000c\000-\000x\000]\000\000", "\000w\000\000", 0, 2);
+        ns("\000[\000^\000a\000-\000z\000&\000&\000b\000-\000y\000&\000&\000c\000-\000x\000]\000\000", "\000w\000\000");
+        x2s("\000[\000[\000^\000a\000&\000&\000a\000]\000&\000&\000a\000-\000z\000]\000\000", "\000b\000\000", 0, 2);
+        ns("\000[\000[\000^\000a\000&\000&\000a\000]\000&\000&\000a\000-\000z\000]\000\000", "\000a\000\000");
+        x2s("\000[\000[\000^\000a\000-\000z\000&\000&\000b\000c\000d\000e\000f\000]\000&\000&\000[\000^\000c\000-\000g\000]\000]\000\000", "\000h\000\000", 0, 2);
+        ns("\000[\000[\000^\000a\000-\000z\000&\000&\000b\000c\000d\000e\000f\000]\000&\000&\000[\000^\000c\000-\000g\000]\000]\000\000", "\000c\000\000");
+        x2s("\000[\000^\000[\000^\000a\000b\000c\000]\000&\000&\000[\000^\000c\000d\000e\000]\000]\000\000", "\000c\000\000", 0, 2);
+        x2s("\000[\000^\000[\000^\000a\000b\000c\000]\000&\000&\000[\000^\000c\000d\000e\000]\000]\000\000", "\000e\000\000", 0, 2);
+        ns("\000[\000^\000[\000^\000a\000b\000c\000]\000&\000&\000[\000^\000c\000d\000e\000]\000]\000\000", "\000f\000\000");
+        x2s("\000[\000a\000-\000&\000&\000-\000a\000]\000\000", "\000-\000\000", 0, 2);
+        ns("\000[\000a\000\134\000-\000&\000&\000\134\000-\000a\000]\000\000", "\000&\000\000");
+        ns("\000\134\000w\000a\000b\000c\000\000", "\000 \000a\000b\000c\000\000");
+        x2s("\000a\000\134\000W\000b\000c\000\000", "\000a\000 \000b\000c\000\000", 0, 8);
+        x2s("\000a\000.\000b\000.\000c\000\000", "\000a\000a\000b\000b\000c\000\000", 0, 10);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000.\000\134\000w\000b\000\134\000W\000.\000.\000c\000\000", "\000a\000b\000b\000 \000b\000c\000c\000\000", 0, 14);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000\134\000s\000\134\000w\000z\000z\000z\000\000", "\000 \000z\000z\000z\000z\000\000", 0, 10);
+        x2s("\000a\000a\000.\000b\000\000", "\000a\000a\000b\000b\000\000", 0, 8);
+        ns("\000.\000a\000\000", "\000a\000b\000\000");
+        x2s("\000.\000a\000\000", "\000a\000a\000\000", 0, 4);
+        x2s("\000^\000a\000\000", "\000a\000\000", 0, 2);
+        x2s("\000^\000a\000$\000\000", "\000a\000\000", 0, 2);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000^\000\134\000w\000$\000\000", "\000a\000\000", 0, 2);
+        ns("\000^\000\134\000w\000$\000\000", "\000 \000\000");
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000^\000\134\000w\000a\000b\000$\000\000", "\000z\000a\000b\000\000", 0, 6);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000^\000\134\000w\000a\000b\000c\000d\000e\000f\000$\000\000", "\000z\000a\000b\000c\000d\000e\000f\000\000", 0, 14);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000^\000\134\000w\000.\000.\000.\000d\000e\000f\000$\000\000", "\000z\000a\000b\000c\000d\000e\000f\000\000", 0, 14);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000\134\000w\000\134\000w\000\134\000s\000\134\000W\000a\000a\000a\000\134\000d\000\000", "\000a\000a\000 \000 \000a\000a\000a\0004\000\000", 0, 16);
+        x2s("\000\134\000A\000\134\000Z\000\000", "\000\000", 0, 0);
+        x2s("\000\134\000A\000x\000y\000z\000\000", "\000x\000y\000z\000\000", 0, 6);
+        x2s("\000x\000y\000z\000\134\000Z\000\000", "\000x\000y\000z\000\000", 0, 6);
+        x2s("\000x\000y\000z\000\134\000z\000\000", "\000x\000y\000z\000\000", 0, 6);
+        x2s("\000a\000\134\000Z\000\000", "\000a\000\000", 0, 2);
+        x2s("\000\134\000G\000a\000z\000\000", "\000a\000z\000\000", 0, 4);
+        ns("\000\134\000G\000z\000\000", "\000b\000z\000a\000\000");
+        ns("\000a\000z\000\134\000G\000\000", "\000a\000z\000\000");
+        ns("\000a\000z\000\134\000A\000\000", "\000a\000z\000\000");
+        ns("\000a\000\134\000A\000z\000\000", "\000a\000z\000\000");
+        x2s("\000\134\000^\000\134\000$\000\000", "\000^\000$\000\000", 0, 4);
+        x2s("\000^\000x\000?\000y\000\000", "\000x\000y\000\000", 0, 4);
+        x2s("\000^\000(\000x\000?\000y\000)\000\000", "\000x\000y\000\000", 0, 4);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000\134\000w\000\000", "\000_\000\000", 0, 2);
+        if (!org.joni.Config.NON_UNICODE_SDW) ns("\000\134\000W\000\000", "\000_\000\000");
+        x2s("\000(\000?\000=\000z\000)\000z\000\000", "\000z\000\000", 0, 2);
+        ns("\000(\000?\000=\000z\000)\000.\000\000", "\000a\000\000");
+        x2s("\000(\000?\000!\000z\000)\000a\000\000", "\000a\000\000", 0, 2);
+        ns("\000(\000?\000!\000z\000)\000a\000\000", "\000z\000\000");
+        x2s("\000(\000?\000i\000:\000a\000)\000\000", "\000a\000\000", 0, 2);
+        x2s("\000(\000?\000i\000:\000a\000)\000\000", "\000A\000\000", 0, 2);
+        x2s("\000(\000?\000i\000:\000A\000)\000\000", "\000a\000\000", 0, 2);
+        ns("\000(\000?\000i\000:\000A\000)\000\000", "\000b\000\000");
+        x2s("\000(\000?\000i\000:\000[\000A\000-\000Z\000]\000)\000\000", "\000a\000\000", 0, 2);
+        x2s("\000(\000?\000i\000:\000[\000f\000-\000m\000]\000)\000\000", "\000H\000\000", 0, 2);
+        x2s("\000(\000?\000i\000:\000[\000f\000-\000m\000]\000)\000\000", "\000h\000\000", 0, 2);
+        ns("\000(\000?\000i\000:\000[\000f\000-\000m\000]\000)\000\000", "\000e\000\000");
+        x2s("\000(\000?\000i\000:\000[\000A\000-\000c\000]\000)\000\000", "\000D\000\000", 0, 2);
+        ns("\000(\000?\000i\000:\000[\000^\000a\000-\000z\000]\000)\000\000", "\000A\000\000");
+        ns("\000(\000?\000i\000:\000[\000^\000a\000-\000z\000]\000)\000\000", "\000a\000\000");
+        x2s("\000(\000?\000i\000:\000[\000!\000-\000k\000]\000)\000\000", "\000Z\000\000", 0, 2);
+        x2s("\000(\000?\000i\000:\000[\000!\000-\000k\000]\000)\000\000", "\0007\000\000", 0, 2);
+        x2s("\000(\000?\000i\000:\000[\000T\000-\000}\000]\000)\000\000", "\000b\000\000", 0, 2);
+        x2s("\000(\000?\000i\000:\000[\000T\000-\000}\000]\000)\000\000", "\000{\000\000", 0, 2);
+        x2s("\000(\000?\000i\000:\000\134\000?\000a\000)\000\000", "\000?\000A\000\000", 0, 4);
+        x2s("\000(\000?\000i\000:\000\134\000*\000A\000)\000\000", "\000*\000a\000\000", 0, 4);
+        ns("\000.\000\000", "\000\012\000\000");
+        x2s("\000(\000?\000m\000:\000.\000)\000\000", "\000\012\000\000", 0, 2);
+        x2s("\000(\000?\000m\000:\000a\000.\000)\000\000", "\000a\000\012\000\000", 0, 4);
+        x2s("\000(\000?\000m\000:\000.\000b\000)\000\000", "\000a\000\012\000b\000\000", 2, 6);
+        x2s("\000.\000*\000a\000b\000c\000\000", "\000d\000d\000d\000a\000b\000d\000d\000\012\000d\000d\000a\000b\000c\000\000", 16, 26);
+        x2s("\000(\000?\000m\000:\000.\000*\000a\000b\000c\000)\000\000", "\000d\000d\000d\000a\000b\000d\000d\000a\000b\000c\000\000", 0, 20);
+        ns("\000(\000?\000i\000)\000(\000?\000-\000i\000)\000a\000\000", "\000A\000\000");
+        ns("\000(\000?\000i\000)\000(\000?\000-\000i\000:\000a\000)\000\000", "\000A\000\000");
+        x2s("\000a\000?\000\000", "\000\000", 0, 0);
+        x2s("\000a\000?\000\000", "\000b\000\000", 0, 0);
+        x2s("\000a\000?\000\000", "\000a\000\000", 0, 2);
+        x2s("\000a\000*\000\000", "\000\000", 0, 0);
+        x2s("\000a\000*\000\000", "\000a\000\000", 0, 2);
+        x2s("\000a\000*\000\000", "\000a\000a\000a\000\000", 0, 6);
+        x2s("\000a\000*\000\000", "\000b\000a\000a\000a\000a\000\000", 0, 0);
+        ns("\000a\000+\000\000", "\000\000");
+        x2s("\000a\000+\000\000", "\000a\000\000", 0, 2);
+        x2s("\000a\000+\000\000", "\000a\000a\000a\000a\000\000", 0, 8);
+        x2s("\000a\000+\000\000", "\000a\000a\000b\000b\000b\000\000", 0, 4);
+        x2s("\000a\000+\000\000", "\000b\000a\000a\000a\000a\000\000", 2, 10);
+        x2s("\000.\000?\000\000", "\000\000", 0, 0);
+        x2s("\000.\000?\000\000", "\000f\000\000", 0, 2);
+        x2s("\000.\000?\000\000", "\000\012\000\000", 0, 0);
+        x2s("\000.\000*\000\000", "\000\000", 0, 0);
+        x2s("\000.\000*\000\000", "\000a\000b\000c\000d\000e\000\000", 0, 10);
+        x2s("\000.\000+\000\000", "\000z\000\000", 0, 2);
+        x2s("\000.\000+\000\000", "\000z\000d\000s\000w\000e\000r\000\012\000\000", 0, 12);
+        x2s("\000(\000.\000*\000)\000a\000\134\0001\000f\000\000", "\000b\000a\000b\000f\000b\000a\000c\000\000", 0, 8);
+        x2s("\000(\000.\000*\000)\000a\000\134\0001\000f\000\000", "\000b\000a\000c\000b\000a\000b\000f\000\000", 6, 14);
+        x2s("\000(\000(\000.\000*\000)\000a\000\134\0002\000f\000)\000\000", "\000b\000a\000c\000b\000a\000b\000f\000\000", 6, 14);
+        x2s("\000(\000.\000*\000)\000a\000\134\0001\000f\000\000", "\000b\000a\000c\000z\000z\000z\000z\000z\000z\000\012\000b\000a\000z\000z\000\012\000z\000z\000z\000z\000b\000a\000b\000f\000\000", 38, 46);
+        x2s("\000a\000|\000b\000\000", "\000a\000\000", 0, 2);
+        x2s("\000a\000|\000b\000\000", "\000b\000\000", 0, 2);
+        x2s("\000|\000a\000\000", "\000a\000\000", 0, 0);
+        x2s("\000(\000|\000a\000)\000\000", "\000a\000\000", 0, 0);
+        x2s("\000a\000b\000|\000b\000c\000\000", "\000a\000b\000\000", 0, 4);
+        x2s("\000a\000b\000|\000b\000c\000\000", "\000b\000c\000\000", 0, 4);
+        x2s("\000z\000(\000?\000:\000a\000b\000|\000b\000c\000)\000\000", "\000z\000b\000c\000\000", 0, 6);
+        x2s("\000a\000(\000?\000:\000a\000b\000|\000b\000c\000)\000c\000\000", "\000a\000a\000b\000c\000\000", 0, 8);
+        x2s("\000a\000b\000|\000(\000?\000:\000a\000c\000|\000a\000z\000)\000\000", "\000a\000z\000\000", 0, 4);
+        x2s("\000a\000|\000b\000|\000c\000\000", "\000d\000c\000\000", 2, 4);
+        x2s("\000a\000|\000b\000|\000c\000d\000|\000e\000f\000g\000|\000h\000|\000i\000j\000k\000|\000l\000m\000n\000|\000o\000|\000p\000q\000|\000r\000s\000t\000u\000v\000w\000x\000|\000y\000z\000\000", "\000p\000q\000r\000\000", 0, 4);
+        ns("\000a\000|\000b\000|\000c\000d\000|\000e\000f\000g\000|\000h\000|\000i\000j\000k\000|\000l\000m\000n\000|\000o\000|\000p\000q\000|\000r\000s\000t\000u\000v\000w\000x\000|\000y\000z\000\000", "\000m\000n\000\000");
+        x2s("\000a\000|\000^\000z\000\000", "\000b\000a\000\000", 2, 4);
+        x2s("\000a\000|\000^\000z\000\000", "\000z\000a\000\000", 0, 2);
+        x2s("\000a\000|\000\134\000G\000z\000\000", "\000b\000z\000a\000\000", 4, 6);
+        x2s("\000a\000|\000\134\000G\000z\000\000", "\000z\000a\000\000", 0, 2);
+        x2s("\000a\000|\000\134\000A\000z\000\000", "\000b\000z\000a\000\000", 4, 6);
+        x2s("\000a\000|\000\134\000A\000z\000\000", "\000z\000a\000\000", 0, 2);
+        x2s("\000a\000|\000b\000\134\000Z\000\000", "\000b\000a\000\000", 2, 4);
+        x2s("\000a\000|\000b\000\134\000Z\000\000", "\000b\000\000", 0, 2);
+        x2s("\000a\000|\000b\000\134\000z\000\000", "\000b\000a\000\000", 2, 4);
+        x2s("\000a\000|\000b\000\134\000z\000\000", "\000b\000\000", 0, 2);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000\134\000w\000|\000\134\000s\000\000", "\000 \000\000", 0, 2);
+        ns("\000\134\000w\000|\000\134\000w\000\000", "\000 \000\000");
+        x2s("\000\134\000w\000|\000%\000\000", "\000%\000\000", 0, 2);
+        x2s("\000\134\000w\000|\000[\000&\000$\000]\000\000", "\000&\000\000", 0, 2);
+        x2s("\000[\000b\000-\000d\000]\000|\000[\000^\000e\000-\000z\000]\000\000", "\000a\000\000", 0, 2);
+        x2s("\000(\000?\000:\000a\000|\000[\000c\000-\000f\000]\000)\000|\000b\000z\000\000", "\000d\000z\000\000", 0, 2);
+        x2s("\000(\000?\000:\000a\000|\000[\000c\000-\000f\000]\000)\000|\000b\000z\000\000", "\000b\000z\000\000", 0, 4);
+        x2s("\000a\000b\000c\000|\000(\000?\000=\000z\000z\000)\000.\000.\000f\000\000", "\000z\000z\000f\000\000", 0, 6);
+        x2s("\000a\000b\000c\000|\000(\000?\000!\000z\000z\000)\000.\000.\000f\000\000", "\000a\000b\000f\000\000", 0, 6);
+        x2s("\000(\000?\000=\000z\000a\000)\000.\000.\000a\000|\000(\000?\000=\000z\000z\000)\000.\000.\000a\000\000", "\000z\000z\000a\000\000", 0, 6);
+        ns("\000(\000?\000>\000a\000|\000a\000b\000d\000)\000c\000\000", "\000a\000b\000d\000c\000\000");
+        x2s("\000(\000?\000>\000a\000b\000d\000|\000a\000)\000c\000\000", "\000a\000b\000d\000c\000\000", 0, 8);
+        x2s("\000a\000?\000|\000b\000\000", "\000a\000\000", 0, 2);
+        x2s("\000a\000?\000|\000b\000\000", "\000b\000\000", 0, 0);
+        x2s("\000a\000?\000|\000b\000\000", "\000\000", 0, 0);
+        x2s("\000a\000*\000|\000b\000\000", "\000a\000a\000\000", 0, 4);
+        x2s("\000a\000*\000|\000b\000*\000\000", "\000b\000a\000\000", 0, 0);
+        x2s("\000a\000*\000|\000b\000*\000\000", "\000a\000b\000\000", 0, 2);
+        x2s("\000a\000+\000|\000b\000*\000\000", "\000\000", 0, 0);
+        x2s("\000a\000+\000|\000b\000*\000\000", "\000b\000b\000b\000\000", 0, 6);
+        x2s("\000a\000+\000|\000b\000*\000\000", "\000a\000b\000b\000b\000\000", 0, 2);
+        ns("\000a\000+\000|\000b\000+\000\000", "\000\000");
+        x2s("\000(\000a\000|\000b\000)\000?\000\000", "\000b\000\000", 0, 2);
+        x2s("\000(\000a\000|\000b\000)\000*\000\000", "\000b\000a\000\000", 0, 4);
+        x2s("\000(\000a\000|\000b\000)\000+\000\000", "\000b\000a\000b\000\000", 0, 6);
+        x2s("\000(\000a\000b\000|\000c\000a\000)\000+\000\000", "\000c\000a\000a\000b\000b\000c\000\000", 0, 8);
+        x2s("\000(\000a\000b\000|\000c\000a\000)\000+\000\000", "\000a\000a\000b\000c\000a\000\000", 2, 10);
+        x2s("\000(\000a\000b\000|\000c\000a\000)\000+\000\000", "\000a\000b\000z\000c\000a\000\000", 0, 4);
+        x2s("\000(\000a\000|\000b\000a\000b\000)\000+\000\000", "\000a\000b\000a\000b\000a\000\000", 0, 10);
+        x2s("\000(\000a\000|\000b\000a\000b\000)\000+\000\000", "\000b\000a\000\000", 2, 4);
+        x2s("\000(\000a\000|\000b\000a\000b\000)\000+\000\000", "\000b\000a\000a\000a\000b\000a\000\000", 2, 8);
+        x2s("\000(\000?\000:\000a\000|\000b\000)\000(\000?\000:\000a\000|\000b\000)\000\000", "\000a\000b\000\000", 0, 4);
+        x2s("\000(\000?\000:\000a\000*\000|\000b\000*\000)\000(\000?\000:\000a\000*\000|\000b\000*\000)\000\000", "\000a\000a\000a\000b\000b\000b\000\000", 0, 6);
+        x2s("\000(\000?\000:\000a\000*\000|\000b\000*\000)\000(\000?\000:\000a\000+\000|\000b\000+\000)\000\000", "\000a\000a\000a\000b\000b\000b\000\000", 0, 12);
+        x2s("\000(\000?\000:\000a\000+\000|\000b\000+\000)\000{\0002\000}\000\000", "\000a\000a\000a\000b\000b\000b\000\000", 0, 12);
+        x2s("\000h\000{\0000\000,\000}\000\000", "\000h\000h\000h\000h\000\000", 0, 8);
+        x2s("\000(\000?\000:\000a\000+\000|\000b\000+\000)\000{\0001\000,\0002\000}\000\000", "\000a\000a\000a\000b\000b\000b\000\000", 0, 12);
+        ns("\000a\000x\000{\0002\000}\000*\000a\000\000", "\0000\000a\000x\000x\000x\000a\0001\000\000");
+        ns("\000a\000.\000{\0000\000,\0002\000}\000a\000\000", "\0000\000a\000X\000X\000X\000a\0000\000\000");
+        ns("\000a\000.\000{\0000\000,\0002\000}\000?\000a\000\000", "\0000\000a\000X\000X\000X\000a\0000\000\000");
+        ns("\000a\000.\000{\0000\000,\0002\000}\000?\000a\000\000", "\0000\000a\000X\000X\000X\000X\000a\0000\000\000");
+        x2s("\000^\000a\000{\0002\000,\000}\000?\000a\000$\000\000", "\000a\000a\000a\000\000", 0, 6);
+        x2s("\000^\000[\000a\000-\000z\000]\000{\0002\000,\000}\000?\000$\000\000", "\000a\000a\000a\000\000", 0, 6);
+        x2s("\000(\000?\000:\000a\000+\000|\000\134\000A\000b\000*\000)\000c\000c\000\000", "\000c\000c\000\000", 0, 4);
+        ns("\000(\000?\000:\000a\000+\000|\000\134\000A\000b\000*\000)\000c\000c\000\000", "\000a\000b\000c\000c\000\000");
+        x2s("\000(\000?\000:\000^\000a\000+\000|\000b\000+\000)\000*\000c\000\000", "\000a\000a\000b\000b\000b\000a\000b\000c\000\000", 12, 16);
+        x2s("\000(\000?\000:\000^\000a\000+\000|\000b\000+\000)\000*\000c\000\000", "\000a\000a\000b\000b\000b\000b\000c\000\000", 0, 14);
+        x2s("\000a\000|\000(\000?\000i\000)\000c\000\000", "\000C\000\000", 0, 2);
+        x2s("\000(\000?\000i\000)\000c\000|\000a\000\000", "\000C\000\000", 0, 2);
+        x2s("\000(\000?\000i\000)\000c\000|\000a\000\000", "\000A\000\000", 0, 2);
+        x2s("\000(\000?\000i\000:\000c\000)\000|\000a\000\000", "\000C\000\000", 0, 2);
+        ns("\000(\000?\000i\000:\000c\000)\000|\000a\000\000", "\000A\000\000");
+        x2s("\000[\000a\000b\000c\000]\000?\000\000", "\000a\000b\000c\000\000", 0, 2);
+        x2s("\000[\000a\000b\000c\000]\000*\000\000", "\000a\000b\000c\000\000", 0, 6);
+        x2s("\000[\000^\000a\000b\000c\000]\000*\000\000", "\000a\000b\000c\000\000", 0, 0);
+        ns("\000[\000^\000a\000b\000c\000]\000+\000\000", "\000a\000b\000c\000\000");
+        x2s("\000a\000?\000?\000\000", "\000a\000a\000a\000\000", 0, 0);
+        x2s("\000b\000a\000?\000?\000b\000\000", "\000b\000a\000b\000\000", 0, 6);
+        x2s("\000a\000*\000?\000\000", "\000a\000a\000a\000\000", 0, 0);
+        x2s("\000b\000a\000*\000?\000\000", "\000b\000a\000a\000\000", 0, 2);
+        x2s("\000b\000a\000*\000?\000b\000\000", "\000b\000a\000a\000b\000\000", 0, 8);
+        x2s("\000a\000+\000?\000\000", "\000a\000a\000a\000\000", 0, 2);
+        x2s("\000b\000a\000+\000?\000\000", "\000b\000a\000a\000\000", 0, 4);
+        x2s("\000b\000a\000+\000?\000b\000\000", "\000b\000a\000a\000b\000\000", 0, 8);
+        x2s("\000(\000?\000:\000a\000?\000)\000?\000?\000\000", "\000a\000\000", 0, 0);
+        x2s("\000(\000?\000:\000a\000?\000?\000)\000?\000\000", "\000a\000\000", 0, 0);
+        x2s("\000(\000?\000:\000a\000?\000)\000+\000?\000\000", "\000a\000a\000a\000\000", 0, 2);
+        x2s("\000(\000?\000:\000a\000+\000)\000?\000?\000\000", "\000a\000a\000a\000\000", 0, 0);
+        x2s("\000(\000?\000:\000a\000+\000)\000?\000?\000b\000\000", "\000a\000a\000a\000b\000\000", 0, 8);
+        x2s("\000(\000?\000:\000a\000b\000)\000?\000{\0002\000}\000\000", "\000\000", 0, 0);
+        x2s("\000(\000?\000:\000a\000b\000)\000?\000{\0002\000}\000\000", "\000a\000b\000a\000b\000a\000\000", 0, 8);
+        x2s("\000(\000?\000:\000a\000b\000)\000*\000{\0000\000}\000\000", "\000a\000b\000a\000b\000a\000\000", 0, 0);
+        x2s("\000(\000?\000:\000a\000b\000)\000{\0003\000,\000}\000\000", "\000a\000b\000a\000b\000a\000b\000a\000b\000\000", 0, 16);
+        ns("\000(\000?\000:\000a\000b\000)\000{\0003\000,\000}\000\000", "\000a\000b\000a\000b\000\000");
+        x2s("\000(\000?\000:\000a\000b\000)\000{\0002\000,\0004\000}\000\000", "\000a\000b\000a\000b\000a\000b\000\000", 0, 12);
+        x2s("\000(\000?\000:\000a\000b\000)\000{\0002\000,\0004\000}\000\000", "\000a\000b\000a\000b\000a\000b\000a\000b\000a\000b\000\000", 0, 16);
+        x2s("\000(\000?\000:\000a\000b\000)\000{\0002\000,\0004\000}\000?\000\000", "\000a\000b\000a\000b\000a\000b\000a\000b\000a\000b\000\000", 0, 8);
+        x2s("\000(\000?\000:\000a\000b\000)\000{\000,\000}\000\000", "\000a\000b\000{\000,\000}\000\000", 0, 10);
+        x2s("\000(\000?\000:\000a\000b\000c\000)\000+\000?\000{\0002\000}\000\000", "\000a\000b\000c\000a\000b\000c\000a\000b\000c\000\000", 0, 12);
+        x2s("\000(\000?\000:\000X\000*\000)\000(\000?\000i\000:\000x\000a\000)\000\000", "\000X\000X\000X\000a\000\000", 0, 8);
+        x2s("\000(\000d\000+\000)\000(\000[\000^\000a\000b\000c\000]\000z\000)\000\000", "\000d\000d\000d\000z\000\000", 0, 8);
+        x2s("\000(\000[\000^\000a\000b\000c\000]\000*\000)\000(\000[\000^\000a\000b\000c\000]\000z\000)\000\000", "\000d\000d\000d\000z\000\000", 0, 8);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000(\000\134\000w\000+\000)\000(\000\134\000w\000z\000)\000\000", "\000d\000d\000d\000z\000\000", 0, 8);
+        x3s("\000(\000a\000)\000\000", "\000a\000\000", 0, 2, 1);
+        x3s("\000(\000a\000b\000)\000\000", "\000a\000b\000\000", 0, 4, 1);
+        x2s("\000(\000(\000a\000b\000)\000)\000\000", "\000a\000b\000\000", 0, 4);
+        x3s("\000(\000(\000a\000b\000)\000)\000\000", "\000a\000b\000\000", 0, 4, 1);
+        x3s("\000(\000(\000a\000b\000)\000)\000\000", "\000a\000b\000\000", 0, 4, 2);
+        x3s("\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000a\000b\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000\000", "\000a\000b\000\000", 0, 4, 20);
+        x3s("\000(\000a\000b\000)\000(\000c\000d\000)\000\000", "\000a\000b\000c\000d\000\000", 0, 4, 1);
+        x3s("\000(\000a\000b\000)\000(\000c\000d\000)\000\000", "\000a\000b\000c\000d\000\000", 4, 8, 2);
+        x3s("\000(\000)\000(\000a\000)\000b\000c\000(\000d\000e\000f\000)\000g\000h\000i\000j\000k\000\000", "\000a\000b\000c\000d\000e\000f\000g\000h\000i\000j\000k\000\000", 6, 12, 3);
+        x3s("\000(\000(\000)\000(\000a\000)\000b\000c\000(\000d\000e\000f\000)\000g\000h\000i\000j\000k\000)\000\000", "\000a\000b\000c\000d\000e\000f\000g\000h\000i\000j\000k\000\000", 6, 12, 4);
+        x2s("\000(\000^\000a\000)\000\000", "\000a\000\000", 0, 2);
+        x3s("\000(\000a\000)\000|\000(\000a\000)\000\000", "\000b\000a\000\000", 2, 4, 1);
+        x3s("\000(\000^\000a\000)\000|\000(\000a\000)\000\000", "\000b\000a\000\000", 2, 4, 2);
+        x3s("\000(\000a\000?\000)\000\000", "\000a\000a\000a\000\000", 0, 2, 1);
+        x3s("\000(\000a\000*\000)\000\000", "\000a\000a\000a\000\000", 0, 6, 1);
+        x3s("\000(\000a\000*\000)\000\000", "\000\000", 0, 0, 1);
+        x3s("\000(\000a\000+\000)\000\000", "\000a\000a\000a\000a\000a\000a\000a\000\000", 0, 14, 1);
+        x3s("\000(\000a\000+\000|\000b\000*\000)\000\000", "\000b\000b\000b\000a\000a\000\000", 0, 6, 1);
+        x3s("\000(\000a\000+\000|\000b\000?\000)\000\000", "\000b\000b\000b\000a\000a\000\000", 0, 2, 1);
+        x3s("\000(\000a\000b\000c\000)\000?\000\000", "\000a\000b\000c\000\000", 0, 6, 1);
+        x3s("\000(\000a\000b\000c\000)\000*\000\000", "\000a\000b\000c\000\000", 0, 6, 1);
+        x3s("\000(\000a\000b\000c\000)\000+\000\000", "\000a\000b\000c\000\000", 0, 6, 1);
+        x3s("\000(\000x\000y\000z\000|\000a\000b\000c\000)\000+\000\000", "\000a\000b\000c\000\000", 0, 6, 1);
+        x3s("\000(\000[\000x\000y\000z\000]\000[\000a\000b\000c\000]\000|\000a\000b\000c\000)\000+\000\000", "\000a\000b\000c\000\000", 0, 6, 1);
+        x3s("\000(\000(\000?\000i\000:\000a\000b\000c\000)\000)\000\000", "\000A\000b\000C\000\000", 0, 6, 1);
+        x2s("\000(\000a\000b\000c\000)\000(\000?\000i\000:\000\134\0001\000)\000\000", "\000a\000b\000c\000A\000B\000C\000\000", 0, 12);
+        x3s("\000(\000(\000?\000m\000:\000a\000.\000c\000)\000)\000\000", "\000a\000\012\000c\000\000", 0, 6, 1);
+        x3s("\000(\000(\000?\000=\000a\000z\000)\000a\000)\000\000", "\000a\000z\000b\000\000", 0, 2, 1);
+        x3s("\000a\000b\000c\000|\000(\000.\000a\000b\000d\000)\000\000", "\000z\000a\000b\000d\000\000", 0, 8, 1);
+        x2s("\000(\000?\000:\000a\000b\000c\000)\000|\000(\000A\000B\000C\000)\000\000", "\000a\000b\000c\000\000", 0, 6);
+        x3s("\000(\000?\000i\000:\000(\000a\000b\000c\000)\000)\000|\000(\000z\000z\000z\000)\000\000", "\000A\000B\000C\000\000", 0, 6, 1);
+        x3s("\000a\000*\000(\000.\000)\000\000", "\000a\000a\000a\000a\000z\000\000", 8, 10, 1);
+        x3s("\000a\000*\000?\000(\000.\000)\000\000", "\000a\000a\000a\000a\000z\000\000", 0, 2, 1);
+        x3s("\000a\000*\000?\000(\000c\000)\000\000", "\000a\000a\000a\000a\000c\000\000", 8, 10, 1);
+        x3s("\000[\000b\000c\000d\000]\000a\000*\000(\000.\000)\000\000", "\000c\000a\000a\000a\000a\000z\000\000", 10, 12, 1);
+        x3s("\000(\000\134\000A\000b\000b\000)\000c\000c\000\000", "\000b\000b\000c\000c\000\000", 0, 4, 1);
+        ns("\000(\000\134\000A\000b\000b\000)\000c\000c\000\000", "\000z\000b\000b\000c\000c\000\000");
+        x3s("\000(\000^\000b\000b\000)\000c\000c\000\000", "\000b\000b\000c\000c\000\000", 0, 4, 1);
+        ns("\000(\000^\000b\000b\000)\000c\000c\000\000", "\000z\000b\000b\000c\000c\000\000");
+        x3s("\000c\000c\000(\000b\000b\000$\000)\000\000", "\000c\000c\000b\000b\000\000", 4, 8, 1);
+        ns("\000c\000c\000(\000b\000b\000$\000)\000\000", "\000c\000c\000b\000b\000b\000\000");
+        ns("\000(\000\134\0001\000)\000\000", "\000\000");
+        ns("\000\134\0001\000(\000a\000)\000\000", "\000a\000a\000\000");
+        ns("\000(\000a\000(\000b\000)\000\134\0001\000)\000\134\0002\000+\000\000", "\000a\000b\000a\000b\000b\000\000");
+        ns("\000(\000?\000:\000(\000?\000:\000\134\0001\000|\000z\000)\000(\000a\000)\000)\000+\000$\000\000", "\000z\000a\000a\000\000");
+        x2s("\000(\000?\000:\000(\000?\000:\000\134\0001\000|\000z\000)\000(\000a\000)\000)\000+\000$\000\000", "\000z\000a\000a\000a\000\000", 0, 8);
+        x2s("\000(\000a\000)\000(\000?\000=\000\134\0001\000)\000\000", "\000a\000a\000\000", 0, 2);
+        ns("\000(\000a\000)\000$\000|\000\134\0001\000\000", "\000a\000z\000\000");
+        x2s("\000(\000a\000)\000\134\0001\000\000", "\000a\000a\000\000", 0, 4);
+        ns("\000(\000a\000)\000\134\0001\000\000", "\000a\000b\000\000");
+        x2s("\000(\000a\000?\000)\000\134\0001\000\000", "\000a\000a\000\000", 0, 4);
+        x2s("\000(\000a\000?\000?\000)\000\134\0001\000\000", "\000a\000a\000\000", 0, 0);
+        x2s("\000(\000a\000*\000)\000\134\0001\000\000", "\000a\000a\000a\000a\000a\000\000", 0, 8);
+        x3s("\000(\000a\000*\000)\000\134\0001\000\000", "\000a\000a\000a\000a\000a\000\000", 0, 4, 1);
+        x2s("\000a\000(\000b\000*\000)\000\134\0001\000\000", "\000a\000b\000b\000b\000b\000\000", 0, 10);
+        x2s("\000a\000(\000b\000*\000)\000\134\0001\000\000", "\000a\000b\000\000", 0, 2);
+        x2s("\000(\000a\000*\000)\000(\000b\000*\000)\000\134\0001\000\134\0002\000\000", "\000a\000a\000a\000b\000b\000a\000a\000a\000b\000b\000\000", 0, 20);
+        x2s("\000(\000a\000*\000)\000(\000b\000*\000)\000\134\0002\000\000", "\000a\000a\000a\000b\000b\000b\000b\000\000", 0, 14);
+        x2s("\000(\000(\000(\000(\000(\000(\000(\000a\000*\000)\000b\000)\000)\000)\000)\000)\000)\000c\000\134\0007\000\000", "\000a\000a\000a\000b\000c\000a\000a\000a\000\000", 0, 16);
+        x3s("\000(\000(\000(\000(\000(\000(\000(\000a\000*\000)\000b\000)\000)\000)\000)\000)\000)\000c\000\134\0007\000\000", "\000a\000a\000a\000b\000c\000a\000a\000a\000\000", 0, 6, 7);
+        x2s("\000(\000a\000)\000(\000b\000)\000(\000c\000)\000\134\0002\000\134\0001\000\134\0003\000\000", "\000a\000b\000c\000b\000a\000c\000\000", 0, 12);
+        x2s("\000(\000[\000a\000-\000d\000]\000)\000\134\0001\000\000", "\000c\000c\000\000", 0, 4);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000(\000\134\000w\000\134\000d\000\134\000s\000)\000\134\0001\000\000", "\000f\0005\000 \000f\0005\000 \000\000", 0, 12);
+        ns("\000(\000\134\000w\000\134\000d\000\134\000s\000)\000\134\0001\000\000", "\000f\0005\000 \000f\0005\000\000");
+        x2s("\000(\000w\000h\000o\000|\000[\000a\000-\000c\000]\000{\0003\000}\000)\000\134\0001\000\000", "\000w\000h\000o\000w\000h\000o\000\000", 0, 12);
+        x2s("\000.\000.\000.\000(\000w\000h\000o\000|\000[\000a\000-\000c\000]\000{\0003\000}\000)\000\134\0001\000\000", "\000a\000b\000c\000w\000h\000o\000w\000h\000o\000\000", 0, 18);
+        x2s("\000(\000w\000h\000o\000|\000[\000a\000-\000c\000]\000{\0003\000}\000)\000\134\0001\000\000", "\000c\000b\000c\000c\000b\000c\000\000", 0, 12);
+        x2s("\000(\000^\000a\000)\000\134\0001\000\000", "\000a\000a\000\000", 0, 4);
+        ns("\000(\000^\000a\000)\000\134\0001\000\000", "\000b\000a\000a\000\000");
+        ns("\000(\000a\000$\000)\000\134\0001\000\000", "\000a\000a\000\000");
+        ns("\000(\000a\000b\000\134\000Z\000)\000\134\0001\000\000", "\000a\000b\000\000");
+        x2s("\000(\000a\000*\000\134\000Z\000)\000\134\0001\000\000", "\000a\000\000", 2, 2);
+        x2s("\000.\000(\000a\000*\000\134\000Z\000)\000\134\0001\000\000", "\000b\000a\000\000", 2, 4);
+        x3s("\000(\000.\000(\000a\000b\000c\000)\000\134\0002\000)\000\000", "\000z\000a\000b\000c\000a\000b\000c\000\000", 0, 14, 1);
+        if (!org.joni.Config.NON_UNICODE_SDW) x3s("\000(\000.\000(\000.\000.\000\134\000d\000.\000)\000\134\0002\000)\000\000", "\000z\0001\0002\0003\0004\0001\0002\0003\0004\000\000", 0, 18, 1);
+        x2s("\000(\000(\000?\000i\000:\000a\000z\000)\000)\000\134\0001\000\000", "\000A\000z\000A\000z\000\000", 0, 8);
+        ns("\000(\000(\000?\000i\000:\000a\000z\000)\000)\000\134\0001\000\000", "\000A\000z\000a\000z\000\000");
+        x2s("\000(\000?\000<\000=\000a\000)\000b\000\000", "\000a\000b\000\000", 2, 4);
+        ns("\000(\000?\000<\000=\000a\000)\000b\000\000", "\000b\000b\000\000");
+        x2s("\000(\000?\000<\000=\000a\000|\000b\000)\000b\000\000", "\000b\000b\000\000", 2, 4);
+        x2s("\000(\000?\000<\000=\000a\000|\000b\000c\000)\000b\000\000", "\000b\000c\000b\000\000", 4, 6);
+        x2s("\000(\000?\000<\000=\000a\000|\000b\000c\000)\000b\000\000", "\000a\000b\000\000", 2, 4);
+        x2s("\000(\000?\000<\000=\000a\000|\000b\000c\000|\000|\000d\000e\000f\000g\000h\000i\000j\000|\000k\000l\000m\000n\000o\000p\000q\000|\000r\000)\000z\000\000", "\000r\000z\000\000", 2, 4);
+        x2s("\000(\000a\000)\000\134\000g\000<\0001\000>\000\000", "\000a\000a\000\000", 0, 4);
+        x2s("\000(\000?\000<\000!\000a\000)\000b\000\000", "\000c\000b\000\000", 2, 4);
+        ns("\000(\000?\000<\000!\000a\000)\000b\000\000", "\000a\000b\000\000");
+        x2s("\000(\000?\000<\000!\000a\000|\000b\000c\000)\000b\000\000", "\000b\000b\000b\000\000", 0, 2);
+        ns("\000(\000?\000<\000!\000a\000|\000b\000c\000)\000z\000\000", "\000b\000c\000z\000\000");
+        x2s("\000(\000?\000<\000n\000a\000m\000e\0001\000>\000a\000)\000\000", "\000a\000\000", 0, 2);
+        x2s("\000(\000?\000<\000n\000a\000m\000e\000_\0002\000>\000a\000b\000)\000\134\000g\000<\000n\000a\000m\000e\000_\0002\000>\000\000", "\000a\000b\000a\000b\000\000", 0, 8);
+        x2s("\000(\000?\000<\000n\000a\000m\000e\000_\0003\000>\000.\000z\000v\000.\000)\000\134\000k\000<\000n\000a\000m\000e\000_\0003\000>\000\000", "\000a\000z\000v\000b\000a\000z\000v\000b\000\000", 0, 16);
+        x2s("\000(\000?\000<\000=\000\134\000g\000<\000a\000b\000>\000)\000|\000-\000\134\000z\000E\000N\000D\000 \000(\000?\000<\000a\000b\000>\000X\000y\000Z\000)\000\000", "\000X\000y\000Z\000\000", 6, 6);
+        x2s("\000(\000?\000<\000n\000>\000|\000a\000\134\000g\000<\000n\000>\000)\000+\000\000", "\000\000", 0, 0);
+        x2s("\000(\000?\000<\000n\000>\000|\000\134\000(\000\134\000g\000<\000n\000>\000\134\000)\000)\000+\000$\000\000", "\000(\000)\000(\000(\000)\000)\000\000", 0, 12);
+        x3s("\000\134\000g\000<\000n\000>\000(\000?\000<\000n\000>\000.\000)\000{\0000\000}\000\000", "\000X\000\000", 0, 2, 1);
+        x2s("\000\134\000g\000<\000n\000>\000(\000a\000b\000c\000|\000d\000f\000(\000?\000<\000n\000>\000.\000Y\000Z\000)\000{\0002\000,\0008\000}\000)\000{\0000\000}\000\000", "\000X\000Y\000Z\000\000", 0, 6);
+        x2s("\000\134\000A\000(\000?\000<\000n\000>\000(\000a\000\134\000g\000<\000n\000>\000)\000|\000)\000\134\000z\000\000", "\000a\000a\000a\000a\000\000", 0, 8);
+        x2s("\000(\000?\000<\000n\000>\000|\000\134\000g\000<\000m\000>\000\134\000g\000<\000n\000>\000)\000\134\000z\000|\000\134\000z\000E\000N\000D\000 \000(\000?\000<\000m\000>\000a\000|\000(\000b\000)\000\134\000g\000<\000m\000>\000)\000\000", "\000b\000b\000b\000b\000a\000b\000b\000a\000\000", 0, 16);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000(\000?\000<\000n\000a\000m\000e\0001\0002\0004\0000\000>\000\134\000w\000+\000\134\000s\000x\000)\000a\000+\000\134\000k\000<\000n\000a\000m\000e\0001\0002\0004\0000\000>\000\000", "\000 \000 \000f\000g\000 \000x\000a\000a\000a\000a\000a\000a\000a\000a\000f\000g\000 \000x\000\000", 4, 36);
+        x3s("\000(\000z\000)\000(\000)\000(\000)\000(\000?\000<\000_\0009\000>\000a\000)\000\134\000g\000<\000_\0009\000>\000\000", "\000z\000a\000a\000\000", 4, 6, 1);
+        x2s("\000(\000.\000)\000(\000(\000(\000?\000<\000_\000>\000a\000)\000)\000)\000\134\000k\000<\000_\000>\000\000", "\000z\000a\000a\000\000", 0, 6);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000(\000(\000?\000<\000n\000a\000m\000e\0001\000>\000\134\000d\000)\000|\000(\000?\000<\000n\000a\000m\000e\0002\000>\000\134\000w\000)\000)\000(\000\134\000k\000<\000n\000a\000m\000e\0001\000>\000|\000\134\000k\000<\000n\000a\000m\000e\0002\000>\000)\000\000", "\000f\000f\000\000", 0, 4);
+        x2s("\000(\000?\000:\000(\000?\000<\000x\000>\000)\000|\000(\000?\000<\000x\000>\000e\000f\000g\000)\000)\000\134\000k\000<\000x\000>\000\000", "\000\000", 0, 0);
+        x2s("\000(\000?\000:\000(\000?\000<\000x\000>\000a\000b\000c\000)\000|\000(\000?\000<\000x\000>\000e\000f\000g\000)\000)\000\134\000k\000<\000x\000>\000\000", "\000a\000b\000c\000e\000f\000g\000e\000f\000g\000\000", 6, 18);
+        ns("\000(\000?\000:\000(\000?\000<\000x\000>\000a\000b\000c\000)\000|\000(\000?\000<\000x\000>\000e\000f\000g\000)\000)\000\134\000k\000<\000x\000>\000\000", "\000a\000b\000c\000e\000f\000g\000\000");
+        x2s("\000(\000?\000:\000(\000?\000<\000n\0001\000>\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000.\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000.\000.\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000.\000.\000.\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000 [...]
+        x3s("\000(\000?\000:\000(\000?\000<\000n\0001\000>\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000.\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000.\000.\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000.\000.\000.\000.\000.\000)\000|\000(\000?\000<\000n\0001\000>\000.\000.\000 [...]
+        x3s("\000(\000?\000<\000n\000a\000m\000e\0001\000>\000)\000(\000?\000<\000n\000a\000m\000e\0002\000>\000)\000(\000?\000<\000n\000a\000m\000e\0003\000>\000)\000(\000?\000<\000n\000a\000m\000e\0004\000>\000)\000(\000?\000<\000n\000a\000m\000e\0005\000>\000)\000(\000?\000<\000n\000a\000m\000e\0006\000>\000)\000(\000?\000<\000n\000a\000m\000e\0007\000>\000)\000(\000?\000<\000n\000a\000m\000e\0008\000>\000)\000(\000?\000<\000n\000a\000m\000e\0009\000>\000)\000(\000?\000<\000n\000a\000 [...]
+        x2s("\000(\000?\000<\000f\000o\000o\000>\000a\000|\000\134\000(\000\134\000g\000<\000f\000o\000o\000>\000\134\000)\000)\000\000", "\000a\000\000", 0, 2);
+        x2s("\000(\000?\000<\000f\000o\000o\000>\000a\000|\000\134\000(\000\134\000g\000<\000f\000o\000o\000>\000\134\000)\000)\000\000", "\000(\000(\000(\000(\000(\000(\000a\000)\000)\000)\000)\000)\000)\000\000", 0, 26);
+        x3s("\000(\000?\000<\000f\000o\000o\000>\000a\000|\000\134\000(\000\134\000g\000<\000f\000o\000o\000>\000\134\000)\000)\000\000", "\000(\000(\000(\000(\000(\000(\000(\000(\000a\000)\000)\000)\000)\000)\000)\000)\000)\000\000", 0, 34, 1);
+        x2s("\000\134\000g\000<\000b\000a\000r\000>\000|\000\134\000z\000E\000N\000D\000(\000?\000<\000b\000a\000r\000>\000.\000*\000a\000b\000c\000$\000)\000\000", "\000a\000b\000c\000x\000x\000x\000a\000b\000c\000\000", 0, 18);
+        x2s("\000\134\000g\000<\0001\000>\000|\000\134\000z\000E\000N\000D\000(\000.\000a\000.\000)\000\000", "\000b\000a\000c\000\000", 0, 6);
+        x3s("\000\134\000g\000<\000_\000A\000>\000\134\000g\000<\000_\000A\000>\000|\000\134\000z\000E\000N\000D\000(\000.\000a\000.\000)\000(\000?\000<\000_\000A\000>\000.\000b\000.\000)\000\000", "\000x\000b\000x\000y\000b\000y\000\000", 6, 12, 1);
+        x2s("\000\134\000A\000(\000?\000:\000\134\000g\000<\000p\000o\000n\000>\000|\000\134\000g\000<\000p\000a\000n\000>\000|\000\134\000z\000E\000N\000D\000 \000 \000(\000?\000<\000p\000a\000n\000>\000a\000|\000c\000\134\000g\000<\000p\000o\000n\000>\000c\000)\000(\000?\000<\000p\000o\000n\000>\000b\000|\000d\000\134\000g\000<\000p\000a\000n\000>\000d\000)\000)\000$\000\000", "\000c\000d\000c\000b\000c\000d\000c\000\000", 0, 14);
+        x2s("\000\134\000A\000(\000?\000<\000n\000>\000|\000a\000\134\000g\000<\000m\000>\000)\000\134\000z\000|\000\134\000z\000E\000N\000D\000 \000(\000?\000<\000m\000>\000\134\000g\000<\000n\000>\000)\000\000", "\000a\000a\000a\000a\000\000", 0, 8);
+        x2s("\000(\000?\000<\000n\000>\000(\000a\000|\000b\000\134\000g\000<\000n\000>\000c\000)\000{\0003\000,\0005\000}\000)\000\000", "\000b\000a\000a\000a\000a\000c\000a\000\000", 2, 10);
+        x2s("\000(\000?\000<\000n\000>\000(\000a\000|\000b\000\134\000g\000<\000n\000>\000c\000)\000{\0003\000,\0005\000}\000)\000\000", "\000b\000a\000a\000a\000a\000c\000a\000a\000a\000a\000a\000\000", 0, 20);
+        x2s("\000(\000?\000<\000p\000a\000r\000e\000>\000\134\000(\000(\000[\000^\000\134\000(\000\134\000)\000]\000+\000+\000|\000\134\000g\000<\000p\000a\000r\000e\000>\000)\000*\000+\000\134\000)\000)\000\000", "\000(\000(\000a\000)\000)\000\000", 0, 10);
+        x2s("\000(\000)\000*\000\134\0001\000\000", "\000\000", 0, 0);
+        x2s("\000(\000?\000:\000(\000)\000|\000(\000)\000)\000*\000\134\0001\000\134\0002\000\000", "\000\000", 0, 0);
+        x3s("\000(\000?\000:\000\134\0001\000a\000|\000(\000)\000)\000*\000\000", "\000a\000\000", 0, 0, 1);
+        x2s("\000x\000(\000(\000.\000)\000*\000)\000*\000x\000\000", "\0000\000x\0001\000x\0002\000x\0003\000\000", 2, 12);
+        x2s("\000x\000(\000(\000.\000)\000*\000)\000*\000x\000(\000?\000i\000:\000\134\0001\000)\000\134\000Z\000\000", "\0000\000x\0001\000x\0002\000x\0001\000X\0002\000\000", 2, 18);
+        x2s("\000(\000?\000:\000(\000)\000|\000(\000)\000|\000(\000)\000|\000(\000)\000|\000(\000)\000|\000(\000)\000)\000*\000\134\0002\000\134\0005\000\000", "\000\000", 0, 0);
+        x2s("\000(\000?\000:\000(\000)\000|\000(\000)\000|\000(\000)\000|\000(\000x\000)\000|\000(\000)\000|\000(\000)\000)\000*\000\134\0002\000b\000\134\0005\000\000", "\000b\000\000", 0, 2);
+        x2s("\217\372\000\000", "\217\372\000\000", 0, 2);
+        x2s("\000\000", "0B\000\000", 0, 0);
+        x2s("0B\000\000", "0B\000\000", 0, 2);
+        ns("0D\000\000", "0B\000\000");
+        x2s("0F0F\000\000", "0F0F\000\000", 0, 4);
+        x2s("0B0D0F\000\000", "0B0D0F\000\000", 0, 6);
+        x2s("0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S\000\000", "0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S\000\000", 0, 70);
+        x2s("0B\000\000", "0D0B\000\000", 2, 4);
+        x2s("0D0F\000\000", "0B0D0F\000\000", 2, 6);
+        x2s("e\207\000\000", "e\207\000\000", 0, 2);
+        x2s("\000.\000\000", "0B\000\000", 0, 2);
+        x2s("\000.\000.\000\000", "0K0M\000\000", 0, 4);
+        x2s("\000\134\000w\000\000", "0J\000\000", 0, 2);
+        ns("\000\134\000W\000\000", "0B\000\000");
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000[\000\134\000W\000]\000\000", "0F\000$\000\000", 2, 4);
+        x2s("\000\134\000S\000\000", "0]\000\000", 0, 2);
+        x2s("\000\134\000S\000\000", "o\042\000\000", 0, 2);
+        x2s("\000\134\000b\000\000", "l\027\000 \000\000", 0, 0);
+        x2s("\000\134\000b\000\000", "\000 0{\000\000", 2, 2);
+        x2s("\000\134\000B\000\000", "0[0]\000 \000\000", 2, 2);
+        x2s("\000\134\000B\000\000", "0F\000 \000\000", 4, 4);
+        x2s("\000\134\000B\000\000", "\000 0D\000\000", 0, 0);
+        x2s("\000[0_0a\000]\000\000", "0a\000\000", 0, 2);
+        ns("\000[0j0k\000]\000\000", "0l\000\000");
+        x2s("\000[0F\000-0J\000]\000\000", "0H\000\000", 0, 2);
+        ns("\000[\000^0Q\000]\000\000", "0Q\000\000");
+        x2s("\000[\000\134\000w\000]\000\000", "0m\000\000", 0, 2);
+        if (!org.joni.Config.NON_UNICODE_SDW) ns("\000[\000\134\000d\000]\000\000", "0u\000\000");
+        x2s("\000[\000\134\000D\000]\000\000", "0o\000\000", 0, 2);
+        ns("\000[\000\134\000s\000]\000\000", "0O\000\000");
+        x2s("\000[\000\134\000S\000]\000\000", "0x\000\000", 0, 2);
+        x2s("\000[\000\134\000w\000\134\000d\000]\000\000", "0\210\000\000", 0, 2);
+        x2s("\000[\000\134\000w\000\134\000d\000]\000\000", "\000 \000 \000 0\210\000\000", 6, 8);
+        ns("\000\134\000w\233<\216\312\000\000", "\000 \233<\216\312\000\000");
+        x2s("\233<\000\134\000W\216\312\000\000", "\233<\000 \216\312\000\000", 0, 6);
+        x2s("0B\000.0D\000.0F\000\000", "0B0B0D0D0F\000\000", 0, 10);
+        x2s("\000.\000\134\000w0F\000\134\000W\000.\000.0^\000\000", "0H0F0F\000 0F0^0^\000\000", 0, 14);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000\134\000s\000\134\000w0S0S0S\000\000", "\000 0S0S0S0S\000\000", 0, 10);
+        x2s("0B0B\000.0Q\000\000", "0B0B0Q0Q\000\000", 0, 8);
+        ns("\000.0D\000\000", "0D0H\000\000");
+        x2s("\000.0J\000\000", "0J0J\000\000", 0, 4);
+        x2s("\000^0B\000\000", "0B\000\000", 0, 2);
+        x2s("\000^0\200\000$\000\000", "0\200\000\000", 0, 2);
+        x2s("\000^\000\134\000w\000$\000\000", "0k\000\000", 0, 2);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000^\000\134\000w0K0M0O0Q0S\000$\000\000", "\000z0K0M0O0Q0S\000\000", 0, 12);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000^\000\134\000w\000.\000.\000.0F0H0J\000$\000\000", "\000z0B0D0F0F0H0J\000\000", 0, 14);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000\134\000w\000\134\000w\000\134\000s\000\134\000W0J0J0J\000\134\000d\000\000", "\000a0J\000 \000 0J0J0J\0004\000\000", 0, 16);
+        x2s("\000\134\000A0_0a0d\000\000", "0_0a0d\000\000", 0, 6);
+        x2s("0\2000\2010\202\000\134\000Z\000\000", "0\2000\2010\202\000\000", 0, 6);
+        x2s("0K0M0O\000\134\000z\000\000", "0K0M0O\000\000", 0, 6);
+        x2s("0K0M0O\000\134\000Z\000\000", "0K0M0O\000\012\000\000", 0, 6);
+        x2s("\000\134\000G0}0t\000\000", "0}0t\000\000", 0, 4);
+        ns("\000\134\000G0H\000\000", "0F0H0J\000\000");
+        ns("0h0f\000\134\000G\000\000", "0h0f\000\000");
+        ns("0~0\177\000\134\000A\000\000", "0~0\177\000\000");
+        ns("0~\000\134\000A0\177\000\000", "0~0\177\000\000");
+        x2s("\000(\000?\000=0[\000)0[\000\000", "0[\000\000", 0, 2);
+        ns("\000(\000?\000=0F\000)\000.\000\000", "0D\000\000");
+        x2s("\000(\000?\000!0F\000)0K\000\000", "0K\000\000", 0, 2);
+        ns("\000(\000?\000!0h\000)0B\000\000", "0h\000\000");
+        x2s("\000(\000?\000i\000:0B\000)\000\000", "0B\000\000", 0, 2);
+        x2s("\000(\000?\000i\000:0v0y\000)\000\000", "0v0y\000\000", 0, 4);
+        ns("\000(\000?\000i\000:0D\000)\000\000", "0F\000\000");
+        x2s("\000(\000?\000m\000:0\210\000.\000)\000\000", "0\210\000\012\000\000", 0, 4);
+        x2s("\000(\000?\000m\000:\000.0\201\000)\000\000", "0~\000\0120\201\000\000", 2, 6);
+        x2s("0B\000?\000\000", "\000\000", 0, 0);
+        x2s("Y\011\000?\000\000", "S\026\000\000", 0, 0);
+        x2s("Y\011\000?\000\000", "Y\011\000\000", 0, 2);
+        x2s("\221\317\000*\000\000", "\000\000", 0, 0);
+        x2s("\221\317\000*\000\000", "\221\317\000\000", 0, 2);
+        x2s("[P\000*\000\000", "[P[P[P\000\000", 0, 6);
+        x2s("\231\254\000*\000\000", "\236\177\231\254\231\254\231\254\231\254\000\000", 0, 0);
+        ns("\134q\000+\000\000", "\000\000");
+        x2s("l\263\000+\000\000", "l\263\000\000", 0, 2);
+        x2s("fB\000+\000\000", "fBfBfBfB\000\000", 0, 8);
+        x2s("0H\000+\000\000", "0H0H0F0F0F\000\000", 0, 4);
+        x2s("0F\000+\000\000", "0J0F0F0F0F\000\000", 2, 10);
+        x2s("\000.\000?\000\000", "0_\000\000", 0, 2);
+        x2s("\000.\000*\000\000", "0q0t0w0z\000\000", 0, 8);
+        x2s("\000.\000+\000\000", "0\215\000\000", 0, 2);
+        x2s("\000.\000+\000\000", "0D0F0H0K\000\012\000\000", 0, 8);
+        x2s("0B\000|0D\000\000", "0B\000\000", 0, 2);
+        x2s("0B\000|0D\000\000", "0D\000\000", 0, 2);
+        x2s("0B0D\000|0D0F\000\000", "0B0D\000\000", 0, 4);
+        x2s("0B0D\000|0D0F\000\000", "0D0F\000\000", 0, 4);
+        x2s("0\222\000(\000?\000:0K0M\000|0M0O\000)\000\000", "0\2220K0M\000\000", 0, 6);
+        x2s("0\222\000(\000?\000:0K0M\000|0M0O\000)0Q\000\000", "0\2220M0O0Q\000\000", 0, 8);
+        x2s("0B0D\000|\000(\000?\000:0B0F\000|0B0\222\000)\000\000", "0B0\222\000\000", 0, 4);
+        x2s("0B\000|0D\000|0F\000\000", "0H0F\000\000", 2, 4);
+        x2s("0B\000|0D\000|0F0H\000|0J0K0M\000|0O\000|0Q0S0U\000|0W0Y0[\000|0]\000|0_0a\000|0d0f0h0j0k\000|0l0m\000\000", "0W0Y0[\000\000", 0, 6);
+        ns("0B\000|0D\000|0F0H\000|0J0K0M\000|0O\000|0Q0S0U\000|0W0Y0[\000|0]\000|0_0a\000|0d0f0h0j0k\000|0l0m\000\000", "0Y0[\000\000");
+        x2s("0B\000|\000^0\217\000\000", "0v0B\000\000", 2, 4);
+        x2s("0B\000|\000^0\222\000\000", "0\2220B\000\000", 0, 2);
+        x2s("\233<\000|\000\134\000G\216\312\000\000", "0Q\216\312\233<\000\000", 4, 6);
+        x2s("\233<\000|\000\134\000G\216\312\000\000", "\216\312\233<\000\000", 0, 2);
+        x2s("\233<\000|\000\134\000A\216\312\000\000", "\000b\216\312\233<\000\000", 4, 6);
+        x2s("\233<\000|\000\134\000A\216\312\000\000", "\216\312\000\000", 0, 2);
+        x2s("\233<\000|\216\312\000\134\000Z\000\000", "\216\312\233<\000\000", 2, 4);
+        x2s("\233<\000|\216\312\000\134\000Z\000\000", "\216\312\000\000", 0, 2);
+        x2s("\233<\000|\216\312\000\134\000Z\000\000", "\216\312\000\012\000\000", 0, 2);
+        x2s("\233<\000|\216\312\000\134\000z\000\000", "\216\312\233<\000\000", 2, 4);
+        x2s("\233<\000|\216\312\000\134\000z\000\000", "\216\312\000\000", 0, 2);
+        x2s("\000\134\000w\000|\000\134\000s\000\000", "0J\000\000", 0, 2);
+        x2s("\000\134\000w\000|\000%\000\000", "\000%0J\000\000", 0, 2);
+        x2s("\000\134\000w\000|\000[\000&\000$\000]\000\000", "0F\000&\000\000", 0, 2);
+        x2s("\000[0D\000-0Q\000]\000\000", "0F\000\000", 0, 2);
+        x2s("\000[0D\000-0Q\000]\000|\000[\000^0K\000-0S\000]\000\000", "0B\000\000", 0, 2);
+        x2s("\000[0D\000-0Q\000]\000|\000[\000^0K\000-0S\000]\000\000", "0K\000\000", 0, 2);
+        x2s("\000[\000^0B\000]\000\000", "\000\012\000\000", 0, 2);
+        x2s("\000(\000?\000:0B\000|\000[0F\000-0M\000]\000)\000|0D0\222\000\000", "0F0\222\000\000", 0, 2);
+        x2s("\000(\000?\000:0B\000|\000[0F\000-0M\000]\000)\000|0D0\222\000\000", "0D0\222\000\000", 0, 4);
+        x2s("0B0D0F\000|\000(\000?\000=0Q0Q\000)\000.\000.0{\000\000", "0Q0Q0{\000\000", 0, 6);
+        x2s("0B0D0F\000|\000(\000?\000!0Q0Q\000)\000.\000.0{\000\000", "0B0D0{\000\000", 0, 6);
+        x2s("\000(\000?\000=0\2220B\000)\000.\000.0B\000|\000(\000?\000=0\2220\222\000)\000.\000.0B\000\000", "0\2220\2220B\000\000", 0, 6);
+        x2s("\000(\000?\000<\000=0B\000|0D0F\000)0D\000\000", "0D0F0D\000\000", 4, 6);
+        ns("\000(\000?\000>0B\000|0B0D0H\000)0F\000\000", "0B0D0H0F\000\000");
+        x2s("\000(\000?\000>0B0D0H\000|0B\000)0F\000\000", "0B0D0H0F\000\000", 0, 8);
+        x2s("0B\000?\000|0D\000\000", "0B\000\000", 0, 2);
+        x2s("0B\000?\000|0D\000\000", "0D\000\000", 0, 0);
+        x2s("0B\000?\000|0D\000\000", "\000\000", 0, 0);
+        x2s("0B\000*\000|0D\000\000", "0B0B\000\000", 0, 4);
+        x2s("0B\000*\000|0D\000*\000\000", "0D0B\000\000", 0, 0);
+        x2s("0B\000*\000|0D\000*\000\000", "0B0D\000\000", 0, 2);
+        x2s("\000[\000a0B\000]\000*\000|0D\000*\000\000", "\000a0B0D0D0D\000\000", 0, 4);
+        x2s("0B\000+\000|0D\000*\000\000", "\000\000", 0, 0);
+        x2s("0B\000+\000|0D\000*\000\000", "0D0D0D\000\000", 0, 6);
+        x2s("0B\000+\000|0D\000*\000\000", "0B0D0D0D\000\000", 0, 2);
+        x2s("0B\000+\000|0D\000*\000\000", "\000a0B0D0D0D\000\000", 0, 0);
+        ns("0B\000+\000|0D\000+\000\000", "\000\000");
+        x2s("\000(0B\000|0D\000)\000?\000\000", "0D\000\000", 0, 2);
+        x2s("\000(0B\000|0D\000)\000*\000\000", "0D0B\000\000", 0, 4);
+        x2s("\000(0B\000|0D\000)\000+\000\000", "0D0B0D\000\000", 0, 6);
+        x2s("\000(0B0D\000|0F0B\000)\000+\000\000", "0F0B0B0D0F0H\000\000", 0, 8);
+        x2s("\000(0B0D\000|0F0H\000)\000+\000\000", "0F0B0B0D0F0H\000\000", 4, 12);
+        x2s("\000(0B0D\000|0F0B\000)\000+\000\000", "0B0B0D0F0B\000\000", 2, 10);
+        x2s("\000(0B0D\000|0F0B\000)\000+\000\000", "0B0D0\2220F0B\000\000", 0, 4);
+        x2s("\000(0B0D\000|0F0B\000)\000+\000\000", "\000$\000$\000z\000z\000z\000z0B0D0\2220F0B\000\000", 12, 16);
+        x2s("\000(0B\000|0D0B0D\000)\000+\000\000", "0B0D0B0D0B\000\000", 0, 10);
+        x2s("\000(0B\000|0D0B0D\000)\000+\000\000", "0D0B\000\000", 2, 4);
+        x2s("\000(0B\000|0D0B0D\000)\000+\000\000", "0D0B0B0B0D0B\000\000", 2, 8);
+        x2s("\000(\000?\000:0B\000|0D\000)\000(\000?\000:0B\000|0D\000)\000\000", "0B0D\000\000", 0, 4);
+        x2s("\000(\000?\000:0B\000*\000|0D\000*\000)\000(\000?\000:0B\000*\000|0D\000*\000)\000\000", "0B0B0B0D0D0D\000\000", 0, 6);
+        x2s("\000(\000?\000:0B\000*\000|0D\000*\000)\000(\000?\000:0B\000+\000|0D\000+\000)\000\000", "0B0B0B0D0D0D\000\000", 0, 12);
+        x2s("\000(\000?\000:0B\000+\000|0D\000+\000)\000{\0002\000}\000\000", "0B0B0B0D0D0D\000\000", 0, 12);
+        x2s("\000(\000?\000:0B\000+\000|0D\000+\000)\000{\0001\000,\0002\000}\000\000", "0B0B0B0D0D0D\000\000", 0, 12);
+        x2s("\000(\000?\000:0B\000+\000|\000\134\000A0D\000*\000)0F0F\000\000", "0F0F\000\000", 0, 4);
+        ns("\000(\000?\000:0B\000+\000|\000\134\000A0D\000*\000)0F0F\000\000", "0B0D0F0F\000\000");
+        x2s("\000(\000?\000:\000^0B\000+\000|0D\000+\000)\000*0F\000\000", "0B0B0D0D0D0B0D0F\000\000", 12, 16);
+        x2s("\000(\000?\000:\000^0B\000+\000|0D\000+\000)\000*0F\000\000", "0B0B0D0D0D0D0F\000\000", 0, 14);
+        x2s("0F\000{\0000\000,\000}\000\000", "0F0F0F0F\000\000", 0, 8);
+        x2s("0B\000|\000(\000?\000i\000)\000c\000\000", "\000C\000\000", 0, 2);
+        x2s("\000(\000?\000i\000)\000c\000|0B\000\000", "\000C\000\000", 0, 2);
+        x2s("\000(\000?\000i\000:0B\000)\000|\000a\000\000", "\000a\000\000", 0, 2);
+        ns("\000(\000?\000i\000:0B\000)\000|\000a\000\000", "\000A\000\000");
+        x2s("\000[0B0D0F\000]\000?\000\000", "0B0D0F\000\000", 0, 2);
+        x2s("\000[0B0D0F\000]\000*\000\000", "0B0D0F\000\000", 0, 6);
+        x2s("\000[\000^0B0D0F\000]\000*\000\000", "0B0D0F\000\000", 0, 0);
+        ns("\000[\000^0B0D0F\000]\000+\000\000", "0B0D0F\000\000");
+        x2s("0B\000?\000?\000\000", "0B0B0B\000\000", 0, 0);
+        x2s("0D0B\000?\000?0D\000\000", "0D0B0D\000\000", 0, 6);
+        x2s("0B\000*\000?\000\000", "0B0B0B\000\000", 0, 0);
+        x2s("0D0B\000*\000?\000\000", "0D0B0B\000\000", 0, 2);
+        x2s("0D0B\000*\000?0D\000\000", "0D0B0B0D\000\000", 0, 8);
+        x2s("0B\000+\000?\000\000", "0B0B0B\000\000", 0, 2);
+        x2s("0D0B\000+\000?\000\000", "0D0B0B\000\000", 0, 4);
+        x2s("0D0B\000+\000?0D\000\000", "0D0B0B0D\000\000", 0, 8);
+        x2s("\000(\000?\000:Y)\000?\000)\000?\000?\000\000", "Y)\000\000", 0, 0);
+        x2s("\000(\000?\000:Y)\000?\000?\000)\000?\000\000", "Y)\000\000", 0, 0);
+        x2s("\000(\000?\000:Y\042\000?\000)\000+\000?\000\000", "Y\042Y\042Y\042\000\000", 0, 2);
+        x2s("\000(\000?\000:\230\250\000+\000)\000?\000?\000\000", "\230\250\230\250\230\250\000\000", 0, 0);
+        x2s("\000(\000?\000:\226\352\000+\000)\000?\000?\227\034\000\000", "\226\352\226\352\226\352\227\034\000\000", 0, 8);
+        x2s("\000(\000?\000:0B0D\000)\000?\000{\0002\000}\000\000", "\000\000", 0, 0);
+        x2s("\000(\000?\000:\233<\216\312\000)\000?\000{\0002\000}\000\000", "\233<\216\312\233<\216\312\233<\000\000", 0, 8);
+        x2s("\000(\000?\000:\233<\216\312\000)\000*\000{\0000\000}\000\000", "\233<\216\312\233<\216\312\233<\000\000", 0, 0);
+        x2s("\000(\000?\000:\233<\216\312\000)\000{\0003\000,\000}\000\000", "\233<\216\312\233<\216\312\233<\216\312\233<\216\312\000\000", 0, 16);
+        ns("\000(\000?\000:\233<\216\312\000)\000{\0003\000,\000}\000\000", "\233<\216\312\233<\216\312\000\000");
+        x2s("\000(\000?\000:\233<\216\312\000)\000{\0002\000,\0004\000}\000\000", "\233<\216\312\233<\216\312\233<\216\312\000\000", 0, 12);
+        x2s("\000(\000?\000:\233<\216\312\000)\000{\0002\000,\0004\000}\000\000", "\233<\216\312\233<\216\312\233<\216\312\233<\216\312\233<\216\312\000\000", 0, 16);
+        x2s("\000(\000?\000:\233<\216\312\000)\000{\0002\000,\0004\000}\000?\000\000", "\233<\216\312\233<\216\312\233<\216\312\233<\216\312\233<\216\312\000\000", 0, 8);
+        x2s("\000(\000?\000:\233<\216\312\000)\000{\000,\000}\000\000", "\233<\216\312\000{\000,\000}\000\000", 0, 10);
+        x2s("\000(\000?\000:0K0M0O\000)\000+\000?\000{\0002\000}\000\000", "0K0M0O0K0M0O0K0M0O\000\000", 0, 12);
+        x3s("\000(pk\000)\000\000", "pk\000\000", 0, 2, 1);
+        x3s("\000(pkl4\000)\000\000", "pkl4\000\000", 0, 4, 1);
+        x2s("\000(\000(fB\225\223\000)\000)\000\000", "fB\225\223\000\000", 0, 4);
+        x3s("\000(\000(\230\250l4\000)\000)\000\000", "\230\250l4\000\000", 0, 4, 1);
+        x3s("\000(\000(f(e\345\000)\000)\000\000", "f(e\345\000\000", 0, 4, 2);
+        x3s("\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\221\317[P\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000)\000\000", "\221\317[P\000\000", 0, 4, 20);
+        x3s("\000(0B0D\000)\000(0F0H\000)\000\000", "0B0D0F0H\000\000", 0, 4, 1);
+        x3s("\000(0B0D\000)\000(0F0H\000)\000\000", "0B0D0F0H\000\000", 4, 8, 2);
+        x3s("\000(\000)\000(0B\000)0D0F\000(0H0J0K\000)0M0O0Q0S\000\000", "0B0D0F0H0J0K0M0O0Q0S\000\000", 6, 12, 3);
+        x3s("\000(\000(\000)\000(0B\000)0D0F\000(0H0J0K\000)0M0O0Q0S\000)\000\000", "0B0D0F0H0J0K0M0O0Q0S\000\000", 6, 12, 4);
+        x3s("\000.\000*\000(0\3250\251\000)0\3630\3730\336\000(0\363\000(\000)0\2670\3450\277\000)0\2440\363\000\000", "0\3250\2510\3630\3730\3360\3630\2670\3450\2770\2440\363\000\000", 10, 18, 2);
+        x2s("\000(\000^0B\000)\000\000", "0B\000\000", 0, 2);
+        x3s("\000(0B\000)\000|\000(0B\000)\000\000", "0D0B\000\000", 2, 4, 1);
+        x3s("\000(\000^0B\000)\000|\000(0B\000)\000\000", "0D0B\000\000", 2, 4, 2);
+        x3s("\000(0B\000?\000)\000\000", "0B0B0B\000\000", 0, 2, 1);
+        x3s("\000(0~\000*\000)\000\000", "0~0~0~\000\000", 0, 6, 1);
+        x3s("\000(0h\000*\000)\000\000", "\000\000", 0, 0, 1);
+        x3s("\000(0\213\000+\000)\000\000", "0\2130\2130\2130\2130\2130\2130\213\000\000", 0, 14, 1);
+        x3s("\000(0u\000+\000|0x\000*\000)\000\000", "0u0u0u0x0x\000\000", 0, 6, 1);
+        x3s("\000(0B\000+\000|0D\000?\000)\000\000", "0D0D0D0B0B\000\000", 0, 2, 1);
+        x3s("\000(0B0D0F\000)\000?\000\000", "0B0D0F\000\000", 0, 6, 1);
+        x3s("\000(0B0D0F\000)\000*\000\000", "0B0D0F\000\000", 0, 6, 1);
+        x3s("\000(0B0D0F\000)\000+\000\000", "0B0D0F\000\000", 0, 6, 1);
+        x3s("\000(0U0W0Y\000|0B0D0F\000)\000+\000\000", "0B0D0F\000\000", 0, 6, 1);
+        x3s("\000(\000[0j0k0l\000]\000[0K0M0O\000]\000|0K0M0O\000)\000+\000\000", "0K0M0O\000\000", 0, 6, 1);
+        x3s("\000(\000(\000?\000i\000:0B0D0F\000)\000)\000\000", "0B0D0F\000\000", 0, 6, 1);
+        x3s("\000(\000(\000?\000m\000:0B\000.0F\000)\000)\000\000", "0B\000\0120F\000\000", 0, 6, 1);
+        x3s("\000(\000(\000?\000=0B0\223\000)0B\000)\000\000", "0B0\2230D\000\000", 0, 2, 1);
+        x3s("0B0D0F\000|\000(\000.0B0D0H\000)\000\000", "0\2230B0D0H\000\000", 0, 8, 1);
+        x3s("0B\000*\000(\000.\000)\000\000", "0B0B0B0B0\223\000\000", 8, 10, 1);
+        x3s("0B\000*\000?\000(\000.\000)\000\000", "0B0B0B0B0\223\000\000", 0, 2, 1);
+        x3s("0B\000*\000?\000(0\223\000)\000\000", "0B0B0B0B0\223\000\000", 8, 10, 1);
+        x3s("\000[0D0F0H\000]0B\000*\000(\000.\000)\000\000", "0H0B0B0B0B0\223\000\000", 10, 12, 1);
+        x3s("\000(\000\134\000A0D0D\000)0F0F\000\000", "0D0D0F0F\000\000", 0, 4, 1);
+        ns("\000(\000\134\000A0D0D\000)0F0F\000\000", "0\2230D0D0F0F\000\000");
+        x3s("\000(\000^0D0D\000)0F0F\000\000", "0D0D0F0F\000\000", 0, 4, 1);
+        ns("\000(\000^0D0D\000)0F0F\000\000", "0\2230D0D0F0F\000\000");
+        x3s("0\2150\215\000(0\2130\213\000$\000)\000\000", "0\2150\2150\2130\213\000\000", 4, 8, 1);
+        ns("0\2150\215\000(0\2130\213\000$\000)\000\000", "0\2150\2150\2130\2130\213\000\000");
+        x2s("\000(q!\000)\000\134\0001\000\000", "q!q!\000\000", 0, 4);
+        ns("\000(q!\000)\000\134\0001\000\000", "q!kf\000\000");
+        x2s("\000(zz\000?\000)\000\134\0001\000\000", "zzzz\000\000", 0, 4);
+        x2s("\000(zz\000?\000?\000)\000\134\0001\000\000", "zzzz\000\000", 0, 0);
+        x2s("\000(zz\000*\000)\000\134\0001\000\000", "zzzzzzzzzz\000\000", 0, 8);
+        x3s("\000(zz\000*\000)\000\134\0001\000\000", "zzzzzzzzzz\000\000", 0, 4, 1);
+        x2s("0B\000(0D\000*\000)\000\134\0001\000\000", "0B0D0D0D0D\000\000", 0, 10);
+        x2s("0B\000(0D\000*\000)\000\134\0001\000\000", "0B0D\000\000", 0, 2);
+        x2s("\000(0B\000*\000)\000(0D\000*\000)\000\134\0001\000\134\0002\000\000", "0B0B0B0D0D0B0B0B0D0D\000\000", 0, 20);
+        x2s("\000(0B\000*\000)\000(0D\000*\000)\000\134\0002\000\000", "0B0B0B0D0D0D0D\000\000", 0, 14);
+        x3s("\000(0B\000*\000)\000(0D\000*\000)\000\134\0002\000\000", "0B0B0B0D0D0D0D\000\000", 6, 10, 2);
+        x2s("\000(\000(\000(\000(\000(\000(\000(0}\000*\000)0z\000)\000)\000)\000)\000)\000)0t\000\134\0007\000\000", "0}0}0}0z0t0}0}0}\000\000", 0, 16);
+        x3s("\000(\000(\000(\000(\000(\000(\000(0}\000*\000)0z\000)\000)\000)\000)\000)\000)0t\000\134\0007\000\000", "0}0}0}0z0t0}0}0}\000\000", 0, 6, 7);
+        x2s("\000(0o\000)\000(0r\000)\000(0u\000)\000\134\0002\000\134\0001\000\134\0003\000\000", "0o0r0u0r0o0u\000\000", 0, 12);
+        x2s("\000(\000[0M\000-0Q\000]\000)\000\134\0001\000\000", "0O0O\000\000", 0, 4);
+        if (!org.joni.Config.NON_UNICODE_SDW) x2s("\000(\000\134\000w\000\134\000d\000\134\000s\000)\000\134\0001\000\000", "0B\0005\000 0B\0005\000 \000\000", 0, 12);
+        ns("\000(\000\134\000w\000\134\000d\000\134\000s\000)\000\134\0001\000\000", "0B\0005\000 0B\0005\000\000");
+        x2s("\000(\212\260\377\037\000|\000[0B\000-0F\000]\000{\0003\000}\000)\000\134\0001\000\000", "\212\260\377\037\212\260\377\037\000\000", 0, 8);
+        x2s("\000.\000.\000.\000(\212\260\377\037\000|\000[0B\000-0F\000]\000{\0003\000}\000)\000\134\0001\000\000", "0B\000a0B\212\260\377\037\212\260\377\037\000\000", 0, 14);
+        x2s("\000(\212\260\377\037\000|\000[0B\000-0F\000]\000{\0003\000}\000)\000\134\0001\000\000", "0F0D0F0F0D0F\000\000", 0, 12);
+        x2s("\000(\000^0S\000)\000\134\0001\000\000", "0S0S\000\000", 0, 4);
+        ns("\000(\000^0\200\000)\000\134\0001\000\000", "0\2010\2000\200\000\000");
+        ns("\000(0B\000$\000)\000\134\0001\000\000", "0B0B\000\000");
+        ns("\000(0B0D\000\134\000Z\000)\000\134\0001\000\000", "0B0D\000\000");
+        x2s("\000(0B\000*\000\134\000Z\000)\000\134\0001\000\000", "0B\000\000", 2, 2);
+        x2s("\000.\000(0B\000*\000\134\000Z\000)\000\134\0001\000\000", "0D0B\000\000", 2, 4);
+        x3s("\000(\000.\000(0\2040D0\206\000)\000\134\0002\000)\000\000", "\000z0\2040D0\2060\2040D0\206\000\000", 0, 14, 1);
+        if (!org.joni.Config.NON_UNICODE_SDW) x3s("\000(\000.\000(\000.\000.\000\134\000d\000.\000)\000\134\0002\000)\000\000", "0B\0001\0002\0003\0004\0001\0002\0003\0004\000\000", 0, 18, 1);
+        x2s("\000(\000(\000?\000i\000:0B\000v0Z\000)\000)\000\134\0001\000\000", "0B\000v0Z0B\000v0Z\000\000", 0, 12);
+        x2s("\000(\000?\000<a\0320K\000>Y\011\000|\000\134\000(\000\134\000g\000<a\0320K\000>\000\134\000)\000)\000\000", "\000(\000(\000(\000(\000(\000(Y\011\000)\000)\000)\000)\000)\000)\000\000", 0, 26);
+        x2s("\000\134\000A\000(\000?\000:\000\134\000g\000<\226?\000_\0001\000>\000|\000\134\000g\000<N\221\000_\0002\000>\000|\000\134\000z}BN\206\000 \000 \000(\000?\000<\226?\000_\0001\000>\211\263\000|\201\352\000\134\000g\000<N\221\000_\0002\000>\201\352\000)\000(\000?\000<N\221\000_\0002\000>W(\000|\203\351\205\251\000\134\000g\000<\226?\000_\0001\000>\203\351\205\251\000)\000)\000$\000\000", "\203\351\205\251\201\352\203\351\205\251\201\352W(\201\352\203\351\205\251\201\352\203\35 [...]
+        x2s("\000[\000[0r0u\000]\000]\000\000", "0u\000\000", 0, 2);
+        x2s("\000[\000[0D0J0F\000]0K\000]\000\000", "0K\000\000", 0, 2);
+        ns("\000[\000[\000^0B\000]\000]\000\000", "0B\000\000");
+        ns("\000[\000^\000[0B\000]\000]\000\000", "0B\000\000");
+        x2s("\000[\000^\000[\000^0B\000]\000]\000\000", "0B\000\000", 0, 2);
+        x2s("\000[\000[0K0M0O\000]\000&\000&0M0O\000]\000\000", "0O\000\000", 0, 2);
+        ns("\000[\000[0K0M0O\000]\000&\000&0M0O\000]\000\000", "0K\000\000");
+        ns("\000[\000[0K0M0O\000]\000&\000&0M0O\000]\000\000", "0Q\000\000");
+        x2s("\000[0B\000-0\223\000&\000&0D\000-0\222\000&\000&0F\000-0\221\000]\000\000", "0\221\000\000", 0, 2);
+        ns("\000[\000^0B\000-0\223\000&\000&0D\000-0\222\000&\000&0F\000-0\221\000]\000\000", "0\221\000\000");
+        x2s("\000[\000[\000^0B\000&\000&0B\000]\000&\000&0B\000-0\223\000]\000\000", "0D\000\000", 0, 2);
+        ns("\000[\000[\000^0B\000&\000&0B\000]\000&\000&0B\000-0\223\000]\000\000", "0B\000\000");
+        x2s("\000[\000[\000^0B\000-0\223\000&\000&0D0F0H0J\000]\000&\000&\000[\000^0F\000-0K\000]\000]\000\000", "0M\000\000", 0, 2);
+        ns("\000[\000[\000^0B\000-0\223\000&\000&0D0F0H0J\000]\000&\000&\000[\000^0F\000-0K\000]\000]\000\000", "0D\000\000");
+        x2s("\000[\000^\000[\000^0B0D0F\000]\000&\000&\000[\000^0F0H0J\000]\000]\000\000", "0F\000\000", 0, 2);
+        x2s("\000[\000^\000[\000^0B0D0F\000]\000&\000&\000[\000^0F0H0J\000]\000]\000\000", "0H\000\000", 0, 2);
+        ns("\000[\000^\000[\000^0B0D0F\000]\000&\000&\000[\000^0F0H0J\000]\000]\000\000", "0K\000\000");
+        x2s("\000[0B\000-\000&\000&\000-0B\000]\000\000", "\000-\000\000", 0, 2);
+        x2s("\000[\000^\000[\000^\000a\000-\000z0B0D0F\000]\000&\000&\000[\000^\000b\000c\000d\000e\000f\000g0F0H0J\000]\000q\000-\000w\000]\000\000", "0H\000\000", 0, 2);
+        x2s("\000[\000^\000[\000^\000a\000-\000z0B0D0F\000]\000&\000&\000[\000^\000b\000c\000d\000e\000f\000g0F0H0J\000]\000g\000-\000w\000]\000\000", "\000f\000\000", 0, 2);
+        x2s("\000[\000^\000[\000^\000a\000-\000z0B0D0F\000]\000&\000&\000[\000^\000b\000c\000d\000e\000f\000g0F0H0J\000]\000g\000-\000w\000]\000\000", "\000g\000\000", 0, 2);
+        ns("\000[\000^\000[\000^\000a\000-\000z0B0D0F\000]\000&\000&\000[\000^\000b\000c\000d\000e\000f\000g0F0H0J\000]\000g\000-\000w\000]\000\000", "\0002\000\000");
+        x2s("\000a\000<\000b\000>0\3200\3740\2700\3470\3630n0\3000\2460\3630\3550\3740\311\000<\000\134\000/\000b\000>\000\000", "\000a\000<\000b\000>0\3200\3740\2700\3470\3630n0\3000\2460\3630\3550\3740\311\000<\000/\000b\000>\000\000", 0, 40);
+        x2s("\000.\000<\000b\000>0\3200\3740\2700\3470\3630n0\3000\2460\3630\3550\3740\311\000<\000\134\000/\000b\000>\000\000", "\000a\000<\000b\000>0\3200\3740\2700\3470\3630n0\3000\2460\3630\3550\3740\311\000<\000/\000b\000>\000\000", 0, 40);
+
+        // Unicode case folding tests
+        // common case folding: u+0041 and u+0061
+        x2s("\u0000\u0041\000\000", "\u0000\u0061\000\000", 0, 2, Option.IGNORECASE);
+        x2s("\u0000\u0061\000\000", "\u0000\u0041\000\000", 0, 2, Option.IGNORECASE);
+        // common case folding: u+00C0 and u+00E0
+        x2s("\u0000\u00C0\000\000", "\u0000\u00E0\000\000", 0, 2, Option.IGNORECASE);
+        x2s("\u0000\u00E0\000\000", "\u0000\u00C0\000\000", 0, 2, Option.IGNORECASE);
+        // common case folding: u+00B5 and u+03BC
+        x2s("\u0000\u00B5\000\000", "\u0003\u00BC\000\000", 0, 2, Option.IGNORECASE);
+        x2s("\u0003\u00BC\000\000", "\u0000\u00B5\000\000", 0, 2, Option.IGNORECASE);
+        // common case folding: u+0073 and u+017F
+        x2s("\u0000\u0073\000\000", "\u0001\u007F\000\000", 0, 2, Option.IGNORECASE);
+        x2s("\u0001\u007F\000\000", "\u0000\u0073\000\000", 0, 2, Option.IGNORECASE);
+        // full case folding: u+1FA0 and u+1F60 u+03B9
+        x2s("\u001F\u00A0\000\000", "\u001F\u0060\u0003\u00B9\000\000", 0, 4, Option.IGNORECASE);
+        x2s("\u001F\u0060\u0003\u00B9\000\000", "\u001F\u00A0\000\000", 0, 2, Option.IGNORECASE);
+        // full case folding: u+1FA8 and u+1F60 u+03B9
+        x2s("\u001F\u00A8\000\000", "\u001F\u0060\u0003\u00B9\000\000", 0, 4, Option.IGNORECASE);
+        x2s("\u001F\u0060\u0003\u00B9\000\000", "\u001F\u00A8\000\000", 0, 2, Option.IGNORECASE);
+        // simple case folding: u+1FA8 and u+1FA0
+        x2s("\u001F\u00A8\000\000", "\u001F\u00A0\000\000", 0, 2, Option.IGNORECASE);
+        x2s("\u001F\u00A0\000\000", "\u001F\u00A8\000\000", 0, 2, Option.IGNORECASE);
+        // FIXME: Case folding for 'LATIN CAPITAL LETTER SHARP S' not supported
+        // full case folding: u+1E9E and u+0073 u+0073
+        // x2s("\u001E\u009E\000\000", "\u0000\u0073\u0000\u0073\000\000", 0, 4, Option.IGNORECASE);
+        // simple case folding: u+1E9E and u+00DF
+        // x2s("\u001E\u009E\000\000", "\u0000\u00DF\000\000", 0, 2, Option.IGNORECASE);
+
+        // Case fold exceeding Analyser#THRESHOLD_CASE_FOLD_ALT_FOR_EXPANSION (= 8)
+        x2s("\u0000\u0041\u0000\u0041\u0000\u0041\u0000\u0041\000\000", "\u0000\u0061\u0000\u0061\u0000\u0061\u0000\u0061\000\000", 0, 8, Option.IGNORECASE);
+
+        super.test();
+    }
+}
diff --git a/test/org/joni/test/TestU8.java b/test/org/joni/test/TestU8.java
old mode 100644
new mode 100755
index 76ea63b..1d2e7c7
--- a/test/org/joni/test/TestU8.java
+++ b/test/org/joni/test/TestU8.java
@@ -27,24 +27,24 @@ import org.joni.Option;
 import org.joni.Syntax;
 
 public class TestU8 extends Test {
-
+    @Override
     public int option() {
         return Option.DEFAULT;
     }
-
+    @Override
     public Encoding encoding() {
         return UTF8Encoding.INSTANCE;
     }
-
+    @Override
     public String testEncoding() {
         return "utf-8";
     }
-
+    @Override
     public Syntax syntax() {
         return Syntax.DEFAULT;
     }
-
-    public void test() throws InterruptedException {
+    @Override
+    public void test() throws Exception {
         xx("^\\d\\d\\d-".getBytes(), new byte []{-30, -126, -84, 48, 45}, 0, 0, 0, true);
         x2s("x{2}", "xx", 0, 2, Option.IGNORECASE);
         x2s("x{2}", "XX", 0, 2, Option.IGNORECASE);
@@ -159,9 +159,11 @@ public class TestU8 extends Test {
 
         x2s("\\A\\X\\X\\z", "\r\u0308", 0, 3);
         x2s("\\A\\X\\X\\z", "\n\u0308", 0, 3);
-    }
 
-    public static void main(String[] args) throws Throwable {
-        new TestU8().run();
+        x2s("\\p{In_Unified_Canadian_Aboriginal_Syllabics_Extended}+", "\u18B0\u18FF", 0, 6);
+        x2s("(?i)\u1ffc", "\u2126\u1fbe", 0, 6);
+
+        super.test();
     }
+
 }

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/jruby-joni.git



More information about the pkg-java-commits mailing list