[jruby-joni] 03/279: Move test to trunk/test

Hideki Yamane henrich at moszumanska.debian.org
Mon Nov 16 11:26:26 UTC 2015


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 3185577b89c20bfc8f4853db46b89897e3e4e64f
Author: Nick Sieger <nick at nicksieger.com>
Date:   Mon Jan 7 01:50:30 2008 +0000

    Move test to trunk/test
    
    
    git-svn-id: http://svn.codehaus.org/jruby/joni/trunk@5518 961051c9-f516-0410-bf72-c9f7e237a7b7
---
 test/org/joni/test/Test.java            | 194 ++++++++
 test/org/joni/test/TestA.java           | 479 ++++++++++++++++++++
 test/org/joni/test/TestC.java           | 735 ++++++++++++++++++++++++++++++
 test/org/joni/test/TestCornerCases.java |  62 +++
 test/org/joni/test/TestCrnl.java        |  86 ++++
 test/org/joni/test/TestJoni.java        |  37 ++
 test/org/joni/test/TestU.java           | 770 ++++++++++++++++++++++++++++++++
 7 files changed, 2363 insertions(+)

diff --git a/test/org/joni/test/Test.java b/test/org/joni/test/Test.java
new file mode 100644
index 0000000..ecc9d8a
--- /dev/null
+++ b/test/org/joni/test/Test.java
@@ -0,0 +1,194 @@
+/*
+ * 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 java.io.UnsupportedEncodingException;
+
+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.joni.encoding.Encoding;
+import org.joni.exception.JOniException;
+
+public abstract class Test {
+
+    int nsucc;
+    int nerror;
+    int nfail;
+    
+    public abstract int option();
+    public abstract Encoding encoding();
+    public abstract String testEncoding();
+    public abstract Syntax syntax();
+    
+    protected String repr(byte[]bytes) {
+        return new String(bytes);
+    }
+    
+    protected int length(byte[]bytes) {
+        return bytes.length;
+    }
+    
+    public void xx(byte[]pattern, byte[]str, int from, int to, int mem, boolean not) {
+        xx(pattern, str, from, to, mem, not, option());
+    }
+    
+    public void xx(byte[]pattern, byte[]str, int from, int to, int mem, boolean not, int option) {
+        Regex reg;
+        
+        try {
+            reg = new Regex(pattern, 0, length(pattern), option, encoding(), syntax());
+        } catch (JOniException je) {
+            Config.err.println("Pattern: " + repr(pattern));
+            je.printStackTrace(Config.err);
+            Config.err.println("ERROR: " + je.getMessage());
+            nerror++;
+            return;
+        } catch (Exception e) {
+            Config.err.println("Pattern: " + repr(pattern));
+            e.printStackTrace(Config.err);
+            Config.err.println("SEVERE ERROR: " + e.getMessage());
+            nerror++;
+            return;            
+        }
+        
+        Matcher m = reg.matcher(str, 0, length(str));
+        Region region;
+
+        int r = 0;
+        try {
+            r = m.search(0, length(str), Option.NONE);
+            region = m.getEagerRegion();
+        } catch (JOniException je) {
+            Config.err.println("Pattern: " + repr(pattern) + " Str: " + repr(str));
+            je.printStackTrace(Config.err);
+            Config.err.println("ERROR: " + je.getMessage());
+            nerror++;
+            return;
+        } catch (Exception e) {
+            Config.err.println("Pattern: " + repr(pattern) + " Str: " + repr(str));
+            e.printStackTrace(Config.err);
+            Config.err.println("SEVERE ERROR: " + e.getMessage());
+            nerror++;
+            return;            
+        }
+        
+        if (r == -1) {
+            if (not) {
+                Config.log.println("OK(N): /" + repr(pattern) + "/ '" + repr(str) + "'");
+                nsucc++;
+            } else {
+                Config.log.println("FAIL: /" + repr(pattern) + "/ '" + repr(str) + "'");
+                nfail++;
+            }
+        } else {
+            if (not) {
+                Config.log.println("FAIL(N): /" + repr(pattern) + "/ '" + repr(str) + "'");
+                nfail++;
+            } else {
+                if (region.beg[mem] == from && region.end[mem] == to) {
+                    Config.log.println("OK: /" + repr(pattern) + "/ '" +repr(str) + "'");
+                    nsucc++;
+                } else {
+                    Config.log.println("FAIL: /" + repr(pattern) + "/ '" + repr(str) + "' " +
+                            from + "-" + to + " : " + region.beg[mem] + "-" + region.end[mem]
+                            );
+                    nfail++;
+                }
+            }
+        }
+    }
+    
+    protected void x2(byte[]pattern, byte[]str, int from, int to) {
+        xx(pattern, str, from, to, 0, false);
+    }
+    
+    protected void x3(byte[]pattern, byte[]str, int from, int to, int mem) {
+        xx(pattern, str, from, to, mem, false);
+    }
+    
+    protected void n(byte[]pattern, byte[]str) {
+        xx(pattern, str, 0, 0, 0, true);
+    }
+
+    public void xxs(String pattern, String str, int from, int to, int mem, boolean not) {
+        xxs(pattern, str, from, to, mem, not, option());
+    }
+    
+    public void xxs(String pattern, String str, int from, int to, int mem, boolean not, int option) {
+        try{
+            xx(pattern.getBytes(testEncoding()), str.getBytes(testEncoding()), from, to, mem, not, option);
+        } catch (UnsupportedEncodingException uee) {
+            uee.printStackTrace();
+        }
+    }
+
+    public void x2s(String pattern, String str, int from, int to) {
+        x2s(pattern, str, from, to, option());
+    }
+    
+    public void x2s(String pattern, String str, int from, int to, int option) {
+        try{
+        xx(pattern.getBytes(testEncoding()), str.getBytes(testEncoding()), from, to, 0, false, option);
+        } catch (UnsupportedEncodingException uee) {
+            uee.printStackTrace();
+        }
+    }
+    
+    public void x3s(String pattern, String str, int from, int to, int mem) {
+        x3s(pattern, str, from, to, mem, option());
+    }
+    
+    public void x3s(String pattern, String str, int from, int to, int mem, int option) {
+        try{        
+            xx(pattern.getBytes(testEncoding()), str.getBytes(testEncoding()), from, to, mem, false, option);
+        } catch (UnsupportedEncodingException uee) {
+            uee.printStackTrace();
+        }
+    }
+    
+    public void ns(String pattern, String str) {
+        ns(pattern, str, option());
+    }
+    
+    public void ns(String pattern, String str, int option) {
+        try{        
+            xx(pattern.getBytes(testEncoding()), str.getBytes(testEncoding()), 0, 0, 0, true, option);
+        } catch (UnsupportedEncodingException uee) {
+            uee.printStackTrace();
+        }
+    }
+    
+    public void printResults() {
+        Config.log.println("\nRESULT   SUCC: " + nsucc + ",  FAIL: " + nfail + ",  ERROR: " + nerror +
+                "   (by JONI)");
+    }
+    
+    public abstract void test();
+    
+    public final void run() {
+        test();
+        printResults();
+    }
+    
+}
diff --git a/test/org/joni/test/TestA.java b/test/org/joni/test/TestA.java
new file mode 100644
index 0000000..12753e4
--- /dev/null
+++ b/test/org/joni/test/TestA.java
@@ -0,0 +1,479 @@
+/*
+ * 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.joni.encoding.Encoding;
+import org.joni.encoding.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() {
+        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);
+    }
+    
+    public static void main(String[] args) throws Throwable{
+        new TestA().run();
+    }
+}
diff --git a/test/org/joni/test/TestC.java b/test/org/joni/test/TestC.java
new file mode 100644
index 0000000..a0a02a6
--- /dev/null
+++ b/test/org/joni/test/TestC.java
@@ -0,0 +1,735 @@
+/*
+ * 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.joni.encoding.Encoding;
+import org.joni.encoding.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() {
+        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);
+        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);
+        x2s("\\xca\\xb8", "\u0118\u00b8", 0, 2);
+        x2s(".", "\u00a4\u02d8", 0, 2);
+        x2s("..", "\u00a4\u00ab\u00a4\u00ad", 0, 4);
+        x2s("\\w", "\u00a4\u015e", 0, 2);
+        ns("\\W", "\u00a4\u02d8");
+        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");
+        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);
+        x2s("[\\w\\d]", "\u00a4\u010d", 0, 2);
+        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);
+        x2s(".\\w\u00a4\u00a6\\W..\u00a4\u013e", "\u00a4\u00a8\u00a4\u00a6\u00a4\u00a6 \u00a4\u00a6\u00a4\u013e\u00a4\u013e", 0, 13);
+        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);
+        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);
+        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);
+        x2s("\\w|\\s", "\u00a4\u015e", 0, 2);
+        x2s("\\w|%", "%\u00a4\u015e", 0, 1);
+        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);
+        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);
+        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();
+    }
+}
diff --git a/test/org/joni/test/TestCornerCases.java b/test/org/joni/test/TestCornerCases.java
new file mode 100644
index 0000000..7745dc4
--- /dev/null
+++ b/test/org/joni/test/TestCornerCases.java
@@ -0,0 +1,62 @@
+/*
+ * 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.Config;
+import org.joni.Option;
+import org.joni.Regex;
+import org.joni.Region;
+import org.joni.Syntax;
+import org.joni.encoding.Encoding;
+import org.joni.encoding.specific.ASCIIEncoding;
+
+public class TestCornerCases extends Test {
+    public int option() {
+        return Option.DEFAULT;
+    }
+
+    public Encoding encoding() {
+        return ASCIIEncoding.INSTANCE;
+    }
+    
+    public String testEncoding() {
+        return "cp1250";
+    }
+
+    public Syntax syntax() {
+        return Syntax.DEFAULT;
+    }   
+
+    public void test() {
+        byte[] reg = "l.".getBytes();
+        byte[] str = "hello,lo".getBytes();
+
+        Regex p = new Regex(reg,0,reg.length,Option.DEFAULT,ASCIIEncoding.INSTANCE,Syntax.DEFAULT);
+        int result = p.matcher(str, 0, str.length).search(3, 0, Option.NONE);
+        if(result != 3) {
+            Config.log.println("FAIL: /l./ 'hello,lo' - with reverse, 3,0");
+            nfail++;
+        }
+    }
+    
+    public static void main(String[] args) throws Throwable{
+        new TestCornerCases().run();
+    }
+}
diff --git a/test/org/joni/test/TestCrnl.java b/test/org/joni/test/TestCrnl.java
new file mode 100644
index 0000000..eb70dcb
--- /dev/null
+++ b/test/org/joni/test/TestCrnl.java
@@ -0,0 +1,86 @@
+/*
+ * 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.Config;
+import org.joni.Option;
+import org.joni.Syntax;
+import org.joni.encoding.Encoding;
+import org.joni.encoding.specific.ASCIIEncoding;
+
+public class TestCrnl extends Test {
+
+    public int option() {
+        return Option.DEFAULT;
+    }
+
+    public Encoding encoding() {
+        return ASCIIEncoding.INSTANCE;
+    }
+    
+    public String testEncoding() {
+        return "ascii";
+    }
+
+    public Syntax syntax() {
+        return Syntax.DEFAULT;
+    }   
+
+    public void test() {
+        x2s("",        "\r\n",        0,  0);
+        x2s(".",       "\r\n",        0,  1);
+        ns("..",      "\r\n");
+        x2s("^",       "\r\n",        0,  0);
+        x2s("\\n^",    "\r\nf",       1,  2);
+        x2s("\\n^a",   "\r\na",       1,  3);
+        x2s("$",       "\r\n",        0,  0);
+        x2s("T$",      "T\r\n",       0,  1);
+        x2s("T$",      "T\raT\r\n",   3,  4);
+        x2s("\\z",     "\r\n",        2,  2);
+        ns("a\\z",    "a\r\n");
+        x2s("\\Z",     "\r\n",        0,  0);
+        x2s("\\Z",     "\r\na",       3,  3);
+        x2s("\\Z",     "\r\n\r\n\n",  4,  4);
+        x2s("\\Z",     "\r\n\r\nX",   5,  5);
+        x2s("a\\Z",    "a\r\n",       0,  1);
+        x2s("aaaaaaaaaaaaaaa\\Z",   "aaaaaaaaaaaaaaa\r\n",  0,  15);
+        x2s("a|$",     "b\r\n",       1,  1);
+        x2s("$|b",     "\rb",         1,  2);
+        x2s("a$|ab$",  "\r\nab\r\n",  2,  4);
+
+        x2s("a|\\Z",       "b\r\n",       1,  1);
+        x2s("\\Z|b",       "\rb",         1,  2);
+        x2s("a\\Z|ab\\Z",  "\r\nab\r\n",  2,  4);
+        x2s("(?=a$).",     "a\r\n",       0,  1);
+        ns("(?=a$).",     "a\r");
+        x2s("(?!a$)..",    "a\r",         0,  2);
+        x2s("(?<=a$).\\n", "a\r\n",       1,  3);
+        ns("(?<!a$).\\n", "a\r\n");
+        x2s("(?=a\\Z).",     "a\r\n",       0,  1);
+        ns("(?=a\\Z).",     "a\r");
+        x2s("(?!a\\Z)..",    "a\r",         0,  2);
+        
+        if (nfail > 0 || nerror > 0) Config.err.println("make sure to enable USE_CRNL_AS_LINE_TERMINATOR");
+    }
+    
+    public static void main(String[] args) throws Throwable{
+        new TestCrnl().run();
+    }
+}
diff --git a/test/org/joni/test/TestJoni.java b/test/org/joni/test/TestJoni.java
new file mode 100644
index 0000000..6fb14cc
--- /dev/null
+++ b/test/org/joni/test/TestJoni.java
@@ -0,0 +1,37 @@
+package org.joni.test;
+
+import junit.framework.TestCase;
+
+public class TestJoni extends TestCase {
+    
+    private Test testa;
+    private Test testc;
+    private Test testu;
+    
+    protected void setUp() {
+        testa = new TestA();
+        testc = new TestC();
+        testu = new TestU();
+    }
+    
+    protected void tearDown() {
+    }
+    
+    private void testJoniTest(Test test) {
+        test.run();
+        assertEquals(test.nerror, 0);
+        assertEquals(test.nfail, 0);
+    }
+    
+    public void testAscii() {
+        testJoniTest(testa);
+    }
+    
+    public void testEUCJP() {
+        testJoniTest(testc);
+    }
+
+    public void testUnicode() {
+        testJoniTest(testu);
+    }
+}
diff --git a/test/org/joni/test/TestU.java b/test/org/joni/test/TestU.java
new file mode 100644
index 0000000..c62d62d
--- /dev/null
+++ b/test/org/joni/test/TestU.java
@@ -0,0 +1,770 @@
+/*
+ * 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.joni.encoding.Encoding;
+import org.joni.encoding.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);
+    }
+    
+    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() {
+        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);
+        x2s("\000\134\000w\000\000", "\000e\000\000", 0, 2);
+        ns("\000\134\000W\000\000", "\000e\000\000");
+        x2s("\000\134\000s\000\000", "\000 \000\000", 0, 2);
+        x2s("\000\134\000S\000\000", "\000b\000\000", 0, 2);
+        x2s("\000\134\000d\000\000", "\0004\000\000", 0, 2);
+        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);
+        x2s("\000[\000\134\000w\000]\000\000", "\000z\000\000", 0, 2);
+        ns("\000[\000\134\000w\000]\000\000", "\000 \000\000");
+        x2s("\000[\000\134\000W\000]\000\000", "\000b\000$\000\000", 2, 4);
+        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);
+        ns("\000[\000\134\000D\000]\000\000", "\0003\000\000");
+        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);
+        ns("\000[\000\134\000S\000]\000\000", "\000 \000\000");
+        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);
+        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);
+        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);
+        x2s("\000^\000\134\000w\000$\000\000", "\000a\000\000", 0, 2);
+        ns("\000^\000\134\000w\000$\000\000", "\000 \000\000");
+        x2s("\000^\000\134\000w\000a\000b\000$\000\000", "\000z\000a\000b\000\000", 0, 6);
+        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);
+        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);
+        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);
+        x2s("\000\134\000w\000\000", "\000_\000\000", 0, 2);
+        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);
+        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);
+        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);
+        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);
+        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);
+        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);
+        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");
+        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);
+        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);
+        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);
+        x2s("\000^\000\134\000w0K0M0O0Q0S\000$\000\000", "\000z0K0M0O0Q0S\000\000", 0, 12);
+        x2s("\000^\000\134\000w\000.\000.\000.0F0H0J\000$\000\000", "\000z0B0D0F0F0H0J\000\000", 0, 14);
+        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);
+        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);
+        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);
+    }
+    
+    public static void main(String[] args) throws Throwable {
+        new TestU().run();
+    }
+}

-- 
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