From 14831180d27d7eb2fa5cd3fa4dfa2f023f12a427 Mon Sep 17 00:00:00 2001 From: "Christian G. Warden" Date: Thu, 2 Jan 2025 17:00:43 -0600 Subject: [PATCH] Refactor Comment Handling Update the antlr grammar so that comments are parsed with their surrounding whitespace, allowing us to more easily preserve the comment formatting. Fix lots of comment formatting edge cases. Fix parsing of class body in which it wasn't visited properly, resulting in comments outside the body to be moved inside the body. --- formatter/comments_test.go | 32 ++- formatter/format_test.go | 95 +++++++- formatter/formatter.go | 24 +- formatter/indent_test.go | 308 ++++++++++++++++++++++++++ formatter/visitor.go | 437 ++++++++++++++++++++++++++----------- formatter/visitors.go | 82 +++---- grammar/ApexLexer.g4 | 11 +- parser/ApexLexer.interp | 6 +- parser/ApexLexer.tokens | 8 +- parser/ApexParser.interp | 2 +- parser/ApexParser.tokens | 8 +- parser/apex_lexer.go | 191 ++++++++-------- parser/apex_parser.go | 12 +- 13 files changed, 926 insertions(+), 290 deletions(-) create mode 100644 formatter/indent_test.go diff --git a/formatter/comments_test.go b/formatter/comments_test.go index 45036c5..046788b 100644 --- a/formatter/comments_test.go +++ b/formatter/comments_test.go @@ -12,7 +12,6 @@ import ( func TestComments(t *testing.T) { if testing.Verbose() { log.SetLevel(log.DebugLevel) - } tests := []struct { @@ -115,27 +114,30 @@ func TestTrailingComments(t *testing.T) { { `public class MyClass { public static void noop() {} // Comment Inside Compilation Unit - // Line 2 + // Line 2 Inside Compilation Unit }`, `public class MyClass { public static void noop() {} // Comment Inside Compilation Unit - // Line 2 + // Line 2 Inside Compilation Unit }`}, { `public class MyClass { public static void noop() {}} -// Comment Outside Compilation Unit Moved Inside -// Line 2`, +// Comment Outside Compilation Unit Not Moved Inside +// Line 2 +`, `public class MyClass { public static void noop() {} - // Comment Outside Compilation Unit Moved Inside - // Line 2 -}`}, +} +// Comment Outside Compilation Unit Not Moved Inside +// Line 2 +`}, { ` /* comment with whitespace before */ private class T1Exception {}`, - `/* comment with whitespace before */ + ` +/* comment with whitespace before */ private class T1Exception {}`, }, { @@ -162,6 +164,18 @@ private class T1Exception {}`, // details about statement2 statement2(); } +}`, + }, + { + `class TestClass { + + // Blank line before comment + private Integer i; +}`, + `class TestClass { + + // Blank line before comment + private Integer i; }`, }, } diff --git a/formatter/format_test.go b/formatter/format_test.go index 792f7c2..d693a04 100644 --- a/formatter/format_test.go +++ b/formatter/format_test.go @@ -469,6 +469,98 @@ func TestCompilationUnit(t *testing.T) { } void method1(String param1, String param2) {} +}`, + }, + { + `public class MethodRecorder { + static { + reset(); + } + /** + * Doc string + * line 2 + */ + public static void m1() { + } +}`, + `public class MethodRecorder { + static { + reset(); + } + /** + * Doc string + * line 2 + */ + public static void m1() {} +}`, + }, + { + `public class MethodRecorder { + + /** + * Doc string after newline + * line 2 + */ + public static void m2() { + } +}`, + `public class MethodRecorder { + + /** + * Doc string after newline + * line 2 + */ + public static void m2() {} +}`, + }, + { + `public with sharing class Assert { +class InvalidArgumentException extends Exception {} + + + private static void checkAssertion(Assertion e) {} + +private class Assertion { +public String message; +} + }`, + `public with sharing class Assert { + class InvalidArgumentException extends Exception {} + + private static void checkAssertion(Assertion e) {} + + private class Assertion { + public String message; + } +}`, + }, + { + ` +public class Top { + public class Inner { + private String doot; + + public void doit() { + System.assert(true); + } + } + + /* comment + */ + public String it; +}`, + `public class Top { + public class Inner { + private String doot; + + public void doit() { + System.assert(true); + } + } + + /* comment + */ + public String it; }`, }, } @@ -486,8 +578,9 @@ func TestCompilationUnit(t *testing.T) { if !ok { t.Errorf("Unexpected result parsing apex") } + out = removeExtraCommentIndentation(out) if out != tt.output { - t.Errorf("unexpected format. expected:\n%s\ngot:\n%s\n", tt.output, out) + t.Errorf("unexpected format. expected:\n%q\ngot:\n%q\n", tt.output, out) } } } diff --git a/formatter/formatter.go b/formatter/formatter.go index 9afa33c..27f5ca8 100644 --- a/formatter/formatter.go +++ b/formatter/formatter.go @@ -130,15 +130,33 @@ func removeIndentationFromComment(comment string) string { modifiedComment := re.ReplaceAllString(commentBody, "\n") // Return the modified comment, reattaching any text outside the comment block if necessary - return firstLine + modifiedComment + leadingTabPattern := regexp.MustCompile("^\t*") + unindented := leadingTabPattern.ReplaceAllString(firstLine, "") + modifiedComment + // Add leading tab + firstCharPattern := regexp.MustCompile(`(?s)^(\s*)(\S)`) + unindented = firstCharPattern.ReplaceAllString(unindented, "$1"+strings.Repeat("\t", leadingTabs)+"$2") + + return unindented } // Comments are annotated in FormatVisitor.visitRule. We preserve whitespace // within multi-line comments by removing the indentation added within the // comment. func removeExtraCommentIndentation(input string) string { - commentPattern := regexp.MustCompile(`(?s)\t*` + "\uFFFA" + `.*?` + "\uFFFB") - return commentPattern.ReplaceAllStringFunc(input, removeIndentationFromComment) + // Remove extra grammar-specific newlines added unaware of newline-preserving comments injected + newlinePrefixedMultilineComment := regexp.MustCompile("\n(\t*\uFFFA)") + input = newlinePrefixedMultilineComment.ReplaceAllString(input, "$1") + + newlinePrefixedInlineComment := regexp.MustCompile("\n\t*\uFFF9\n") + input = newlinePrefixedInlineComment.ReplaceAllString(input, "\uFFF9\n") + + inlineCommentPattern := regexp.MustCompile(`(?s)` + "\uFFF9" + `(.*?)` + "\uFFFB") + input = inlineCommentPattern.ReplaceAllString(input, "$1") + + multilineCommentPattern := regexp.MustCompile(`(?s)\t*` + "\uFFFA" + `.*?` + "\uFFFB") + unindented := multilineCommentPattern.ReplaceAllStringFunc(input, removeIndentationFromComment) + + return unindented } func readFile(filename string, reader io.Reader) ([]byte, error) { diff --git a/formatter/indent_test.go b/formatter/indent_test.go new file mode 100644 index 0000000..6c31baa --- /dev/null +++ b/formatter/indent_test.go @@ -0,0 +1,308 @@ +package formatter + +import ( + "bufio" + "bytes" + "testing" +) + +func TestIndent(t *testing.T) { + tests := + []struct { + input string + output string + }{ + { + "abc", + "\tabc", + }, + { + "\uFFFA" + ` + + /** + * Doc string after newline + * line 2 + */` + "\uFFFB", + "\t\uFFFA" + ` + + /** + * Doc string after newline + * line 2 + */` + "\uFFFB", + }, + { + "public class B {\n\t\ufffa\n\t/**\n\t\t\t */\n\ufffb\tpublic X(Y client) {}\n}", + "\tpublic class B {\n\t\t\ufffa\n\t\t/**\n\t\t\t\t */\ufffb\n\t\tpublic X(Y client) {}\n\t}", + }, + } + for _, tt := range tests { + out := indent(tt.input) + if out != tt.output { + t.Errorf("unexpected indent format. expected:\n%q\ngot:\n%q\n", tt.output, out) + } + } +} + +func TestRemoveIndentation(t *testing.T) { + tests := + []struct { + input string + output string + }{ + { + "\tabc", + "\tabc", + }, + { + "\t\uFFFA" + ` + + /** + * Doc string after newline + * line 2 + */` + "\uFFFB", + ` + + /** + * Doc string after newline + * line 2 + */`, + }, + { + "\t\ufffa\n\n\t/* comment\n\t\t */\n\ufffb", + "\n\n\t/* comment\n\t */\n", + }, + } + for _, tt := range tests { + out := removeIndentationFromComment(tt.input) + if out != tt.output { + t.Errorf("unexpected indent format. expected:\n%q\ngot:\n%q\n", tt.output, out) + } + } +} + +func TestSplitLeadingFFFAOrFFFBOrNewline(t *testing.T) { + testCases := []struct { + name string + input string + expected []string + }{ + { + name: "Basic class declaration", + input: "public class B {\n}", + expected: []string{ + "public class B {", + "}", + }, + }, + { + name: "Single \ufffa delimiter at start of line", + input: "public class B {\n\t\ufffa\n}", + expected: []string{ + "public class B {", + "\t\ufffa", + "}", + }, + }, + { + name: "Multiple delimiters with comments", + input: "public class B {\n\t\ufffa\n\t/**\n\t\t */\n\ufffb\n}", + expected: []string{ + "public class B {", + "\t\ufffa", + "\t/**", + "\t\t */", + "\ufffb", + "}", + }, + }, + { + name: "Delimiter without newline at EOF", + input: "public class B {\n\t\ufffa", + expected: []string{ + "public class B {", + "\t\ufffa", + }, + }, + { + name: "Indented \ufffb delimiter at end of line", + input: "public class B {\n \ufffb\n}", + expected: []string{ + "public class B {", + " \ufffb", + "}", + }, + }, + { + name: "Delimiter with content on the same line", + input: "public class B {\n\t\ufffa some content\n}", + expected: []string{ + "public class B {", + "\t\ufffa", + " some content", + "}", + }, + }, + { + name: "Multiple newlines and delimiters", + input: "public class B {\n\n\t\ufffa\n/**\n\t\t */\n\n\ufffb\n}", + expected: []string{ + "public class B {", + "", + "\t\ufffa", + "/**", + "\t\t */", + "", + "\ufffb", + "}", + }, + }, + { + name: "Delimiter preceded by spaces and tab", + input: "public class B {\n \t\ufffa\n}", + expected: []string{ + "public class B {", + " \t\ufffa", + "}", + }, + }, + { + name: "No delimiters, multiple lines", + input: "public class B {\n\tpublic X(Y client) {}\n}", + expected: []string{ + "public class B {", + "\tpublic X(Y client) {}", + "}", + }, + }, + { + name: "Delimiter only", + input: "\ufffa", + expected: []string{ + "\ufffa", + }, + }, + { + name: "Delimiter with newline immediately after", + input: "\ufffa\n", + expected: []string{ + "\ufffa", + }, + }, + { + name: "Multiple delimiters in a row", + input: "public class B {\n\ufffa\n\ufffb\n}", + expected: []string{ + "public class B {", + "\ufffa", + "\ufffb", + "}", + }, + }, + { + name: "Delimiters with mixed indentation", + input: "public class B {\n\t\ufffa\n\t\ufffb\tpublic X(Y client) {}\n}", + expected: []string{ + "public class B {", + "\t\ufffa", + "\t\ufffb", + "\tpublic X(Y client) {}", + "}", + }, + }, + { + name: "Delimiter in the middle of the line (should split)", + input: "public class B {\n\tpublic \ufffa X(Y client) {}\n}", + expected: []string{ + "public class B {", + "\tpublic ", + "\ufffa", + " X(Y client) {}", + "}", + }, + }, + { + name: "Delimiter at the end with no newline", + input: "public class B {\n\ufffa", + expected: []string{ + "public class B {", + "\ufffa", + }, + }, + { + name: "Empty input", + input: "", + expected: []string{ + // No tokens expected + }, + }, + { + name: "Only newline", + input: "\n", + expected: []string{ + "", + }, + }, + { + name: "Only whitespace", + input: " \t ", + expected: []string{ + " \t ", + }, + }, + { + name: "Delimiter preceded by multiple whitespace characters", + input: "public class B {\n\t \ufffa\n}", + expected: []string{ + "public class B {", + "\t \ufffa", + "}", + }, + }, + { + name: "Delimiter \ufffb on the same line with content (should split)", + input: "public class B {\n\ufffb\tpublic X(Y client) {}\n}", + expected: []string{ + "public class B {", + "\ufffb", + "\tpublic X(Y client) {}", + "}", + }, + }, + { + name: "Multiple \ufffb delimiters on separate lines", + input: "public class B {\n\ufffb\n\ufffb\n}", + expected: []string{ + "public class B {", + "\ufffb", + "\ufffb", + "}", + }, + }, + } + + for _, tc := range testCases { + tc := tc // capture range variable + t.Run(tc.name, func(t *testing.T) { + scanner := bufio.NewScanner(bytes.NewReader([]byte(tc.input))) + scanner.Split(SplitLeadingFFFAOrFFFBOrNewline) + var tokens []string + for scanner.Scan() { + tokens = append(tokens, scanner.Text()) + } + if err := scanner.Err(); err != nil { + t.Fatalf("Scanner error: %v", err) + } + if len(tokens) != len(tc.expected) { + t.Errorf("Expected %d tokens, got %d", len(tc.expected), len(tokens)) + t.Errorf("Expected tokens: %v", tc.expected) + t.Errorf("Got tokens: %v", tokens) + return + } + for i, expected := range tc.expected { + if tokens[i] != expected { + t.Errorf("Token %d: expected %q, got %q", i, expected, tokens[i]) + } + } + }) + } +} diff --git a/formatter/visitor.go b/formatter/visitor.go index dfa9449..b62dbf6 100644 --- a/formatter/visitor.go +++ b/formatter/visitor.go @@ -2,11 +2,16 @@ package formatter import ( "bufio" + "bytes" "fmt" + "regexp" + "sort" "strings" + "unicode" "github.com/antlr4-go/antlr/v4" "github.com/octoberswimmer/apexfmt/parser" + log "github.com/sirupsen/logrus" ) const ( @@ -22,6 +27,22 @@ type FormatVisitor struct { wrap bool } +type HiddenTokenDirection int + +const ( + HiddenTokenDirectionBefore HiddenTokenDirection = iota + HiddenTokenDirectionAfter +) + +type CommentPosition int + +const ( + PositionBefore CommentPosition = iota + PositionAfter +) + +var manyNewlines = regexp.MustCompile(`\n{3,}`) + func NewFormatVisitor(tokens *antlr.CommonTokenStream) *FormatVisitor { return &FormatVisitor{ tokens: tokens, @@ -35,98 +56,28 @@ func (v *FormatVisitor) VisitRule(node antlr.RuleNode) interface{} { } func (v *FormatVisitor) visitRule(node antlr.RuleNode) interface{} { - start := node.(antlr.ParserRuleContext).GetStart() - var beforeWhitespace, beforeComments []antlr.Token - if start != nil && len(v.tokens.GetAllTokens()) > 0 { - beforeWhitespace = v.tokens.GetHiddenTokensToLeft(start.GetTokenIndex(), WHITESPACE_CHANNEL) - beforeComments = v.tokens.GetHiddenTokensToLeft(start.GetTokenIndex(), COMMENTS_CHANNEL) - } + start, stop := getStartStop(node) + + // Collect and interleave comments and whitespace before the node + beforeHiddenTokens := interleaveHiddenTokens( + getHiddenTokens(v.tokens, start, HiddenTokenDirectionBefore), + ) + result := node.Accept(v) if result == nil { panic(fmt.Sprintf("MISSING VISIT FUNCTION FOR %T", node)) } - commentsWithNewlines := commentsWithTrailingNewlines(beforeComments, beforeWhitespace) - hasComments := beforeComments != nil && len(beforeComments) > 0 - if beforeComments != nil { - comments := []string{} - for _, c := range beforeComments { - index := c.GetTokenIndex() - if _, seen := v.commentsOutput[index]; !seen { - // Mark the start and end of comments so we can remove indentation - // added to multi-line comments, preserving the whitespace within - // them. See removeIndentationFromComment. - if n, exists := commentsWithNewlines[index]; exists { - comments = append(comments, "\uFFFA"+c.GetText()+"\uFFFB"+strings.Repeat("\n", n)) - } else { - comments = append(comments, "\uFFFA"+c.GetText()+"\uFFFB") - } - v.commentsOutput[index] = struct{}{} - } - } - if len(comments) > 0 { - allComments := strings.Join(comments, "") - containsNewline := strings.Contains(allComments, "\n") - if !containsNewline { - result = fmt.Sprintf("%s %s", strings.TrimSuffix(strings.TrimPrefix(allComments, "\uFFFA"), "\uFFFB"), result) - } else { - result = fmt.Sprintf("%s%s", allComments, result) - } - } - } - if beforeWhitespace != nil { - injectNewline := false - for _, c := range beforeWhitespace { - if !hasComments && len(strings.Split(c.GetText(), "\n")) > 2 { - if _, seen := v.newlinesOutput[c.GetTokenIndex()]; !seen { - v.newlinesOutput[c.GetTokenIndex()] = struct{}{} - injectNewline = true - } - } - } - if injectNewline { - result = fmt.Sprintf("\n%s", result) - } - } - stop := node.(antlr.ParserRuleContext).GetStop() - var afterWhitespace, afterComments []antlr.Token - if stop == nil { - return result - } - if len(v.tokens.GetAllTokens()) > 0 { - afterWhitespace = v.tokens.GetHiddenTokensToRight(stop.GetTokenIndex(), WHITESPACE_CHANNEL) - afterComments = v.tokens.GetHiddenTokensToRight(stop.GetTokenIndex(), COMMENTS_CHANNEL) - } - if afterComments == nil { - return result - } - afterCommentsWithLeadingNewlines := commentsWithLeadingNewlines(afterComments, afterWhitespace) - comments := []string{} + result = appendHiddenTokens(v, result, beforeHiddenTokens, PositionBefore) - for _, c := range afterComments { - index := c.GetTokenIndex() - if _, seen := v.commentsOutput[index]; !seen { - // Mark the start and end of comments so we can remove indentation - // added to multi-line comments, preserving the whitespace within - // them. See removeIndentationFromComment. - if n, exists := afterCommentsWithLeadingNewlines[index]; exists { - comments = append(comments, strings.Repeat("\n", n)+"\uFFFA"+c.GetText()+"\uFFFB") - } else { - comments = append(comments, "\uFFFA"+c.GetText()+"\uFFFB") - } - v.commentsOutput[index] = struct{}{} - } - } + // Collect and interleave comments and whitespace after the node + afterHiddenTokens := interleaveHiddenTokens( + getHiddenTokens(v.tokens, stop, HiddenTokenDirectionAfter), + ) + + _ = afterHiddenTokens + result = appendHiddenTokens(v, result, afterHiddenTokens, PositionAfter) - if len(comments) > 0 { - allComments := strings.Join(comments, "") - containsNewline := strings.Contains(allComments, "\n") - if !containsNewline { - result = fmt.Sprintf("%s %s", result, strings.TrimSuffix(strings.TrimPrefix(allComments, "\uFFFA"), "\uFFFB")) - } else { - result = fmt.Sprintf("%s%s", result, allComments) - } - } return result } @@ -152,27 +103,197 @@ func (v *FormatVisitor) Modifiers(ctxs []parser.IModifierContext) string { return m.String() } -func (v *FormatVisitor) indent(text string) string { - return v.indentTo(text, 1) +func indent(text string) string { + return indentTo(text, 1) } -func (v *FormatVisitor) indentTo(text string, indents int) string { +// SplitLeadingFFFAOrFFFBOrNewline splits the input data into tokens based on the following rules: +// +// 1. If a line starts with \ufffa or \ufffb (possibly preceded by whitespace), +// and the line contains only the delimiter, return the entire line as a separate token. +// +// 2. If a line starts with \ufffa or \ufffb (possibly preceded by whitespace), +// and the line contains additional content after the delimiter, +// split the line into two tokens: +// - The delimiter (\ufffa or \ufffb) including any leading whitespace. +// - The remaining content. +// +// 3. If \ufffa or \ufffb appear anywhere else in a line, +// split the line into two tokens: +// - Content before the delimiter. +// - The delimiter and the remaining content. +// +// 4. Otherwise, split lines normally based on newline characters. +// +// 5. If \ufff9 and \ufffb appear in the same line (with \ufff9 < \ufffb), +// treat that line as a single token, preserving inline comment. +// +// 6. At EOF, return any remaining data as the final token. +// +// This function ensures that \ufffa, \ufffb, and inline \ufff9-\ufffb comments +// are handled correctly based on their positions. +func SplitLeadingFFFAOrFFFBOrNewline(data []byte, atEOF bool) (advance int, token []byte, err error) { + // Define \ufffa and \ufffb + fffa := []byte("\ufffa") + fffb := []byte("\ufffb") + inlineCommentStart := []byte("\ufff9") + + // Handle empty input + if atEOF && len(data) == 0 { + return 0, nil, nil + } + + // Find the first newline + newlineIdx := bytes.IndexByte(data, '\n') + + // ---------------------------------------------------------------- + // 1. NO NEWLINE FOUND BUT EOF => Return Last Line + // ---------------------------------------------------------------- + if newlineIdx == -1 { + if atEOF { + line := data + + // --- Inline comment check (rule #5) --- + if hasInlineComment(line, inlineCommentStart, fffb) { + // Return the entire line as a single token + return len(data), data, nil + } + // -------------------------------------- + + trimmed := bytes.TrimLeft(line, " \t") + + // If line starts with \ufffa or \ufffb and contains only that delimiter + if bytes.HasPrefix(trimmed, fffa) || bytes.HasPrefix(trimmed, fffb) { + var delimiter []byte + if bytes.HasPrefix(trimmed, fffa) { + delimiter = fffa + } else { + delimiter = fffb + } + + if bytes.Equal(trimmed, delimiter) { + // Line contains only the delimiter + return len(data), line, nil + } + + // Line starts with the delimiter and has additional content + delimiterIdx := bytes.Index(line, delimiter) + if delimiterIdx != -1 { + // Include leading whitespace in delimiter token + delimiterEnd := delimiterIdx + len(delimiter) + return delimiterEnd, line[:delimiterEnd], nil + } + } + + // Otherwise, no delimiters => return the entire line + return len(data), data, nil + } + + // No newline, not at EOF => request more data + return 0, nil, nil + } + + // ---------------------------------------------------------------- + // 2. WE FOUND A NEWLINE => Extract the line + // ---------------------------------------------------------------- + line := data[:newlineIdx] + + // --- Inline comment check (rule #5) --- + // If line has \ufff9 and \ufffb in the correct order, keep it as one token. + if hasInlineComment(line, inlineCommentStart, fffb) { + return newlineIdx + 1, line, nil + } + // -------------------------------------- + + trimmed := bytes.TrimLeft(line, " \t") + + // ---------------------------------------------------------------- + // 2a. If line starts with \ufffa or \ufffb + // ---------------------------------------------------------------- + if bytes.HasPrefix(trimmed, fffa) || bytes.HasPrefix(trimmed, fffb) { + var delimiter []byte + if bytes.HasPrefix(trimmed, fffa) { + delimiter = fffa + } else { + delimiter = fffb + } + delimiterLen := len(delimiter) + + if bytes.Equal(trimmed, delimiter) { + // Line contains only the delimiter + return newlineIdx + 1, line, nil + } + + // Line starts with delimiter but has more content + delimiterIdx := bytes.Index(line, delimiter) + if delimiterIdx != -1 { + delimiterEnd := delimiterIdx + delimiterLen + return delimiterEnd, line[:delimiterEnd], nil + } + } + + // ---------------------------------------------------------------- + // 2b. Delimiter Elsewhere in the Line + // ---------------------------------------------------------------- + fffaIdx := bytes.Index(line, fffa) + fffbIdx := bytes.Index(line, fffb) + + firstIdx := -1 + if fffaIdx != -1 && (fffbIdx == -1 || fffaIdx < fffbIdx) { + firstIdx = fffaIdx + } + if fffbIdx != -1 && (firstIdx == -1 || fffbIdx < fffaIdx) { + firstIdx = fffbIdx + } + + if firstIdx != -1 { + // Split BEFORE the delimiter + return firstIdx, line[:firstIdx], nil + } + + // ---------------------------------------------------------------- + // 2c. No Delimiters => Return Entire Line + // ---------------------------------------------------------------- + return newlineIdx + 1, line, nil +} + +// hasInlineComment checks if the line has \ufff9 and \ufffb in that order +// indicating an inline comment that should remain together. +func hasInlineComment(line, inlineCommentStart, fffb []byte) bool { + idx9 := bytes.Index(line, inlineCommentStart) + idxFB := bytes.Index(line, fffb) + return idx9 != -1 && idxFB != -1 && idx9 < idxFB +} + +func indentTo(text string, indents int) string { var indentedText strings.Builder scanner := bufio.NewScanner(strings.NewReader(text)) isFirstLine := true + scanner.Split(SplitLeadingFFFAOrFFFBOrNewline) + + log.Debug(fmt.Sprintf("INDENTING: %q\n", text)) + for scanner.Scan() { + log.Debug(fmt.Sprintf("INDENTING LINE: %q\n", scanner.Text())) + if scanner.Text() == "\uFFFB" { + indentedText.WriteString(scanner.Text()) + continue + } if isFirstLine { isFirstLine = false } else { indentedText.WriteString("\n") } - if scanner.Text() != "" { - indentedText.WriteString(strings.Repeat("\t", indents) + scanner.Text()) - } else { + if scanner.Text() == "" { indentedText.WriteString(scanner.Text()) + continue } + t := scanner.Text() + t = strings.Repeat("\t", indents) + t + indentedText.WriteString(t) } + log.Debug(fmt.Sprintf("INDENTED: %q\n\n", indentedText.String())) return indentedText.String() } @@ -194,56 +315,120 @@ func unwrap(v *FormatVisitor) (*FormatVisitor, bool) { return v, old } -// Find comments that have trailing newlines -func commentsWithTrailingNewlines(comments []antlr.Token, whitespace []antlr.Token) map[int]int { - result := make(map[int]int) +func interleaveHiddenTokens(whitespace []antlr.Token, comments []antlr.Token) []antlr.Token { + interleaved := []antlr.Token{} + allTokens := append(whitespace, comments...) - whitespaceMap := make(map[int]antlr.Token) - for _, ws := range whitespace { - whitespaceMap[ws.GetTokenIndex()] = ws - } + // Sort tokens by their position in the stream + sort.Slice(allTokens, func(i, j int) bool { + return allTokens[i].GetTokenIndex() < allTokens[j].GetTokenIndex() + }) - for _, comment := range comments { - commentIndex := comment.GetTokenIndex() + interleaved = append(interleaved, allTokens...) + return interleaved +} - // Find the immediate next token index - nextTokenIndex := commentIndex + 1 +func appendHiddenTokens(v *FormatVisitor, result interface{}, tokens []antlr.Token, position CommentPosition) interface{} { + var tokenLines []string + for _, token := range tokens { + index := token.GetTokenIndex() + if _, seen := v.commentsOutput[index]; !seen { + v.commentsOutput[index] = struct{}{} + + text := token.GetText() + if token.GetChannel() == COMMENTS_CHANNEL { + leadingWhitespace := getLeadingWhitespace(text) + trailingWhitespace := getTrailingWhitespace(text) + leading := "" + trailing := "" + if n := countNewlines(leadingWhitespace); n > 0 { + leading = strings.Repeat("\n", n) + } else if len(leadingWhitespace) > 0 && position == PositionAfter { + leading = " " + } + if n := countNewlines(trailingWhitespace); n > 0 { + trailing = strings.Repeat("\n", n) + } else if len(trailingWhitespace) > 0 { + trailing = " " + } + // Strip leading whitespace so the comment can be indented to the right location + text = strings.TrimSpace(text) + containsNewline := strings.Contains(text, "\n") - // Check if the next token is whitespace - if ws, exists := whitespaceMap[nextTokenIndex]; exists { - // Check if the whitespace contains a newline - if strings.Contains(ws.GetText(), "\n") { - result[commentIndex] = len(strings.Split(ws.GetText(), "\n")) - 1 + text = fmt.Sprintf("%s%s%s", leading, text, trailing) + log.Debug(fmt.Sprintf("NORMALIZED COMMENT: %q\n", text)) + if containsNewline { + text = "\uFFFA" + text + "\uFFFB" + } else { + text = "\uFFF9" + text + "\uFFFB" + } + log.Debug(fmt.Sprintf("WRAPPED COMMENT: %q\n\n", text)) + } else if token.GetChannel() == WHITESPACE_CHANNEL && countNewlines(text) > 1 { + text = "\n" // Replace multiple blank lines with a single blank line + } else { + // whitespace to ignore + text = "" } + + tokenLines = append(tokenLines, text) } } - return result + if len(tokenLines) > 0 { + tokenText := strings.Join(tokenLines, "") + switch position { + case PositionBefore: + result = fmt.Sprintf("%s%s", tokenText, result) + case PositionAfter: + result = fmt.Sprintf("%s%s", result, tokenText) + } + } + + return any(result) } -// Find comments that have leading newlines -func commentsWithLeadingNewlines(comments []antlr.Token, whitespace []antlr.Token) map[int]int { - result := make(map[int]int) +func countNewlines(text string) int { + return strings.Count(text, "\n") +} - whitespaceMap := make(map[int]antlr.Token) - for _, ws := range whitespace { - whitespaceMap[ws.GetTokenIndex()] = ws - } +func getStartStop(node antlr.RuleNode) (start, stop antlr.Token) { + ctx := node.(antlr.ParserRuleContext) + return ctx.GetStart(), ctx.GetStop() +} - for _, comment := range comments { - commentIndex := comment.GetTokenIndex() +func getHiddenTokens(tokens *antlr.CommonTokenStream, token antlr.Token, direction HiddenTokenDirection) ([]antlr.Token, []antlr.Token) { + if token == nil || len(tokens.GetAllTokens()) == 0 { + return nil, nil + } - // Find the immediate previous token index - prevTokenIndex := commentIndex - 1 + switch direction { + case HiddenTokenDirectionBefore: + return tokens.GetHiddenTokensToLeft(token.GetTokenIndex(), WHITESPACE_CHANNEL), + tokens.GetHiddenTokensToLeft(token.GetTokenIndex(), COMMENTS_CHANNEL) + case HiddenTokenDirectionAfter: + return tokens.GetHiddenTokensToRight(token.GetTokenIndex(), WHITESPACE_CHANNEL), + tokens.GetHiddenTokensToRight(token.GetTokenIndex(), COMMENTS_CHANNEL) + default: + return nil, nil + } +} - // Check if the next token is whitespace - if ws, exists := whitespaceMap[prevTokenIndex]; exists { - // Check if the whitespace contains a newline - if strings.Contains(ws.GetText(), "\n") { - result[commentIndex] = len(strings.Split(ws.GetText(), "\n")) - 1 - } +func getLeadingWhitespace(s string) string { + var i int + for i = 0; i < len(s); i++ { + if !unicode.IsSpace(rune(s[i])) { + break } } + return s[:i] +} - return result +func getTrailingWhitespace(s string) string { + var i int + for i = len(s) - 1; i >= 0; i-- { + if !unicode.IsSpace(rune(s[i])) { + break + } + } + return s[i+1:] } diff --git a/formatter/visitors.go b/formatter/visitors.go index 12aeadc..1fb2588 100644 --- a/formatter/visitors.go +++ b/formatter/visitors.go @@ -41,11 +41,7 @@ func (v *FormatVisitor) VisitClassDeclaration(ctx *parser.ClassDeclarationContex if ctx.IMPLEMENTS() != nil { class.WriteString(fmt.Sprintf(" implements %s", v.visitRule(ctx.TypeList()))) } - if ctx.ClassBody().GetText() == "{}" { - class.WriteString(" {}") - } else { - class.WriteString(fmt.Sprintf(" {\n%s\n}", v.indent(v.visitRule(ctx.ClassBody()).(string)))) - } + class.WriteString(fmt.Sprintf(" %s", v.visitRule(ctx.ClassBody()).(string))) return class.String() } @@ -64,7 +60,7 @@ func (v *FormatVisitor) VisitTriggerBlock(ctx *parser.TriggerBlockContext) inter for _, stmt := range ctx.AllTriggerStatement() { statements = append(statements, v.visitRule(stmt).(string)) } - return fmt.Sprintf("{\n%s\n}", v.indent(strings.Join(statements, "\n"))) + return fmt.Sprintf("{\n%s\n}", indent(strings.Join(statements, "\n"))) } func (v *FormatVisitor) VisitTriggerStatement(ctx *parser.TriggerStatementContext) interface{} { @@ -96,7 +92,7 @@ func (v *FormatVisitor) VisitInterfaceDeclaration(ctx *parser.InterfaceDeclarati if ctx.EXTENDS() != nil { extends = fmt.Sprintf(" extends %s ", v.visitRule(ctx.TypeList())) } - return fmt.Sprintf("interface %s%s {\n%s\n}", ctx.Id().GetText(), extends, v.indent(v.visitRule(ctx.InterfaceBody()).(string))) + return fmt.Sprintf("interface %s%s {\n%s\n}", ctx.Id().GetText(), extends, indent(v.visitRule(ctx.InterfaceBody()).(string))) } func (v *FormatVisitor) VisitInterfaceBody(ctx *parser.InterfaceBodyContext) interface{} { @@ -109,10 +105,14 @@ func (v *FormatVisitor) VisitInterfaceBody(ctx *parser.InterfaceBodyContext) int func (v *FormatVisitor) VisitClassBody(ctx *parser.ClassBodyContext) interface{} { var cb []string - for _, b := range ctx.AllClassBodyDeclaration() { + declarations := ctx.AllClassBodyDeclaration() + if len(declarations) == 0 { + return "{}" + } + for _, b := range declarations { cb = append(cb, v.visitRule(b).(string)) } - return strings.Join(cb, "\n") + return fmt.Sprintf("{\n%s\n}", indent(strings.Join(cb, "\n"))) } func (v *FormatVisitor) VisitClassBodyDeclaration(ctx *parser.ClassBodyDeclarationContext) interface{} { @@ -159,7 +159,7 @@ func (v *FormatVisitor) VisitPropertyDeclaration(ctx *parser.PropertyDeclaration return fmt.Sprintf("%s %s {%s}", v.visitRule(ctx.TypeRef()), ctx.Id().GetText(), strings.Join(propertyBlocks, " ")) } sep := "\n" - return fmt.Sprintf("%s %s {%s%s%s}", v.visitRule(ctx.TypeRef()), ctx.Id().GetText(), sep, v.indent(strings.Join(propertyBlocks, sep)), sep) + return fmt.Sprintf("%s %s {%s%s%s}", v.visitRule(ctx.TypeRef()), ctx.Id().GetText(), sep, indent(strings.Join(propertyBlocks, sep)), sep) } func (v *FormatVisitor) VisitPropertyBlock(ctx *parser.PropertyBlockContext) interface{} { @@ -201,7 +201,7 @@ func (v *FormatVisitor) VisitBlock(ctx *parser.BlockContext) interface{} { if len(statements) == 0 { return "{}" } - return fmt.Sprintf("{\n%s\n}", v.indent(strings.Join(statements, "\n"))) + return fmt.Sprintf("{\n%s\n}", indent(strings.Join(statements, "\n"))) } func (v *FormatVisitor) VisitStatement(ctx *parser.StatementContext) interface{} { @@ -220,7 +220,7 @@ func (v *FormatVisitor) VisitIfStatement(ctx *parser.IfStatementContext) interfa v.visitRule(ctx.Statement(0)))) } else { out.WriteString(fmt.Sprintf("if %s {\n%s\n}", v.visitRule(ctx.ParExpression()), - v.indent(v.visitRule(ctx.Statement(0)).(string)))) + indent(v.visitRule(ctx.Statement(0)).(string)))) } if ctx.ELSE() != nil { if block := ctx.Statement(1).Block(); block != nil { @@ -228,7 +228,7 @@ func (v *FormatVisitor) VisitIfStatement(ctx *parser.IfStatementContext) interfa } else if ifStatement := ctx.Statement(1).IfStatement(); ifStatement != nil { out.WriteString(fmt.Sprintf(" else %s", v.visitRule(ifStatement))) } else { - out.WriteString(fmt.Sprintf(" else {\n%s}", v.indent(v.visitRule(ctx.Statement(1)).(string)))) + out.WriteString(fmt.Sprintf(" else {\n%s}", indent(v.visitRule(ctx.Statement(1)).(string)))) } } return out.String() @@ -250,7 +250,7 @@ func (v *FormatVisitor) VisitForStatement(ctx *parser.ForStatementContext) inter if statement.Block() != nil { return fmt.Sprintf("for (%s) %s", v.visitRule(ctx.ForControl()), v.visitRule(ctx.Statement())) } else { - return fmt.Sprintf("for (%s) {\n%s\n}\n", v.visitRule(ctx.ForControl()), v.indent(v.visitRule(ctx.Statement()).(string))) + return fmt.Sprintf("for (%s) {\n%s\n}\n", v.visitRule(ctx.ForControl()), indent(v.visitRule(ctx.Statement()).(string))) } } else { return fmt.Sprintf("for (%s);", v.visitRule(ctx.ForControl())) @@ -262,7 +262,7 @@ func (v *FormatVisitor) VisitSwitchStatement(ctx *parser.SwitchStatementContext) for _, w := range ctx.AllWhenControl() { when = append(when, v.visitRule(w).(string)) } - return fmt.Sprintf("switch on %s {\n%s\n}", v.visitRule(ctx.Expression()), v.indent(strings.Join(when, "\n"))) + return fmt.Sprintf("switch on %s {\n%s\n}", v.visitRule(ctx.Expression()), indent(strings.Join(when, "\n"))) } func (v *FormatVisitor) VisitWhenControl(ctx *parser.WhenControlContext) interface{} { @@ -439,8 +439,8 @@ func (v *FormatVisitor) VisitCondExpression(ctx *parser.CondExpressionContext) i return fmt.Sprintf("%s ? %s : %s", v.visitRule(ctx.Expression(0)), v.visitRule(ctx.Expression(1)), v.visitRule(ctx.Expression(2))) } return fmt.Sprintf("%s ?\n%s :\n%s", v.visitRule(ctx.Expression(0)), - v.indent(v.visitRule(ctx.Expression(1)).(string)), - v.indent(v.visitRule(ctx.Expression(2)).(string))) + indent(v.visitRule(ctx.Expression(1)).(string)), + indent(v.visitRule(ctx.Expression(2)).(string))) } func (v *FormatVisitor) VisitLogAndExpression(ctx *parser.LogAndExpressionContext) interface{} { @@ -451,7 +451,7 @@ func (v *FormatVisitor) VisitLogAndExpression(ctx *parser.LogAndExpressionContex defer restoreWrap(wrap(v)) } if v.wrap { - return fmt.Sprintf("%s &&\n%s", v.visitRule(ctx.Expression(0)), v.indent(v.visitRule(ctx.Expression(1)).(string))) + return fmt.Sprintf("%s &&\n%s", v.visitRule(ctx.Expression(0)), indent(v.visitRule(ctx.Expression(1)).(string))) } return fmt.Sprintf("%s && %s", v.visitRule(ctx.Expression(0)), v.visitRule(ctx.Expression(1))) } @@ -464,7 +464,7 @@ func (v *FormatVisitor) VisitLogOrExpression(ctx *parser.LogOrExpressionContext) defer restoreWrap(wrap(v)) } if v.wrap { - return fmt.Sprintf("%s ||\n%s", v.visitRule(ctx.Expression(0)), v.indent(v.visitRule(ctx.Expression(1)).(string))) + return fmt.Sprintf("%s ||\n%s", v.visitRule(ctx.Expression(0)), indent(v.visitRule(ctx.Expression(1)).(string))) } return fmt.Sprintf("%s || %s", v.visitRule(ctx.Expression(0)), v.visitRule(ctx.Expression(1))) } @@ -475,7 +475,7 @@ func (v *FormatVisitor) VisitCoalExpression(ctx *parser.CoalExpressionContext) i defer restoreWrap(wrap(v)) } if v.wrap { - return fmt.Sprintf("%s ??\n%s", v.visitRule(ctx.Expression(0)), v.indent(v.visitRule(ctx.Expression(1)).(string))) + return fmt.Sprintf("%s ??\n%s", v.visitRule(ctx.Expression(0)), indent(v.visitRule(ctx.Expression(1)).(string))) } return fmt.Sprintf("%s ?? %s", v.visitRule(ctx.Expression(0)), v.visitRule(ctx.Expression(1))) } @@ -577,11 +577,11 @@ func (v *FormatVisitor) VisitDotExpression(ctx *parser.DotExpressionContext) int case *parser.DotExpressionContext: if left.DotMethodCall() != nil { log.Debug(fmt.Sprintf("%q is method call; safe to wrap before %q", expr, ctx.DotMethodCall().GetText())) - return expr.(string) + "\n" + v.indentTo(fmt.Sprintf("%s%s", dot, v.visitRule(ctx.DotMethodCall())), depth) + return expr.(string) + "\n" + indentTo(fmt.Sprintf("%s%s", dot, v.visitRule(ctx.DotMethodCall())), depth) } default: log.Debug(fmt.Sprintf("Wrapping in between %q (%T) and %q", expr, ctx.Expression(), ctx.DotMethodCall().GetText())) - return expr.(string) + "\n" + v.indentTo(fmt.Sprintf("%s%s", dot, v.visitRule(ctx.DotMethodCall())), depth) + return expr.(string) + "\n" + indentTo(fmt.Sprintf("%s%s", dot, v.visitRule(ctx.DotMethodCall())), depth) } } @@ -616,7 +616,7 @@ func (v *FormatVisitor) VisitExpressionList(ctx *parser.ExpressionListContext) i expressions = append(expressions, v.visitRule(p).(string)) default: if wrap && i > 0 && !v.wrap { - expressions = append(expressions, v.indent(v.visitRule(p).(string))) + expressions = append(expressions, indent(v.visitRule(p).(string))) } else { expressions = append(expressions, v.visitRule(p).(string)) } @@ -699,7 +699,7 @@ func (v *FormatVisitor) VisitSoqlLiteral(ctx *parser.SoqlLiteralContext) interfa n := i.visitRule(ctx.Query()).(int) if n > 3 { defer restoreWrap(wrap(v)) - return fmt.Sprintf("[\n%s\n]", v.indent(v.visitRule(ctx.Query()).(string))) + return fmt.Sprintf("[\n%s\n]", indent(v.visitRule(ctx.Query()).(string))) } return fmt.Sprintf("[%s]", v.visitRule(ctx.Query())) } @@ -719,11 +719,11 @@ func (v *FormatVisitor) VisitQuery(ctx *parser.QueryContext) interface{} { var query strings.Builder query.WriteString("SELECT") query.WriteString(sep) - query.WriteString(v.indentTo(v.visitRule(ctx.SelectList()).(string), indent)) + query.WriteString(indentTo(v.visitRule(ctx.SelectList()).(string), indent)) query.WriteString(sep) query.WriteString("FROM") query.WriteString(sep) - query.WriteString(v.indentTo(v.visitRule(ctx.FromNameList()).(string), indent)) + query.WriteString(indentTo(v.visitRule(ctx.FromNameList()).(string), indent)) if scope := ctx.UsingScope(); scope != nil { query.WriteString(sep) query.WriteString(fmt.Sprintf("%s", v.visitRule(scope).(string))) @@ -767,8 +767,8 @@ func (v *FormatVisitor) VisitQuery(ctx *parser.QueryContext) interface{} { func (v *FormatVisitor) VisitSubQuery(ctx *parser.SubQueryContext) interface{} { var query strings.Builder query.WriteString(fmt.Sprintf("SELECT\n%s\nFROM\n%s", - v.indent(v.visitRule(ctx.SubFieldList()).(string)), - v.indent(v.visitRule(ctx.FromNameList()).(string)), + indent(v.visitRule(ctx.SubFieldList()).(string)), + indent(v.visitRule(ctx.FromNameList()).(string)), )) if where := ctx.WhereClause(); where != nil { query.WriteString(fmt.Sprintf("\n%s", v.visitRule(where).(string))) @@ -924,11 +924,11 @@ func (v *FormatVisitor) VisitWhenClause(ctx *parser.WhenClauseContext) interface var clause strings.Builder clause.WriteString("WHEN") clause.WriteString(sep) - clause.WriteString(v.indentTo(v.visitRule(ctx.FieldName()).(string), indent)) + clause.WriteString(indentTo(v.visitRule(ctx.FieldName()).(string), indent)) clause.WriteString(sep) clause.WriteString("THEN") clause.WriteString(sep) - clause.WriteString(v.indentTo(v.visitRule(ctx.FieldNameList()).(string), indent)) + clause.WriteString(indentTo(v.visitRule(ctx.FieldNameList()).(string), indent)) return clause.String() } @@ -942,7 +942,7 @@ func (v *FormatVisitor) VisitWhereClause(ctx *parser.WhereClauseContext) interfa var clause strings.Builder clause.WriteString("WHERE") clause.WriteString(sep) - clause.WriteString(v.indentTo(v.visitRule(ctx.LogicalExpression()).(string), indent)) + clause.WriteString(indentTo(v.visitRule(ctx.LogicalExpression()).(string), indent)) return clause.String() } @@ -985,7 +985,7 @@ func (v *FormatVisitor) VisitLogicalExpression(ctx *parser.LogicalExpressionCont func (v *FormatVisitor) VisitConditionalExpression(ctx *parser.ConditionalExpressionContext) interface{} { switch { case ctx.LogicalExpression() != nil: - return fmt.Sprintf("(\n%s\n)", v.indent(v.visitRule(ctx.LogicalExpression()).(string))) + return fmt.Sprintf("(\n%s\n)", indent(v.visitRule(ctx.LogicalExpression()).(string))) case ctx.FieldExpression() != nil: return v.visitRule(ctx.FieldExpression()) } @@ -1077,7 +1077,7 @@ func (v *FormatVisitor) VisitCurrencyValueValue(ctx *parser.CurrencyValueValueCo } func (v *FormatVisitor) VisitSubQueryValue(ctx *parser.SubQueryValueContext) interface{} { - return fmt.Sprintf("(\n%s\n)", v.indent(v.visitRule(ctx.SubQuery()).(string))) + return fmt.Sprintf("(\n%s\n)", indent(v.visitRule(ctx.SubQuery()).(string))) } func (v *FormatVisitor) VisitValueListValue(ctx *parser.ValueListValueContext) interface{} { @@ -1144,7 +1144,7 @@ func (v *FormatVisitor) VisitOrderByClause(ctx *parser.OrderByClauseContext) int var clause strings.Builder clause.WriteString("ORDER BY") clause.WriteString(sep) - clause.WriteString(v.indentTo(v.visitRule(ctx.FieldOrderList()).(string), indent)) + clause.WriteString(indentTo(v.visitRule(ctx.FieldOrderList()).(string), indent)) return clause.String() } @@ -1233,7 +1233,7 @@ func (v *FormatVisitor) VisitMapCreatorRest(ctx *parser.MapCreatorRestContext) i pairs = append(pairs, v.visitRule(i).(string)) } if len(pairs) > 1 { - return fmt.Sprintf("{\n%s\n}", v.indent(strings.Join(pairs, ",\n"))) + return fmt.Sprintf("{\n%s\n}", indent(strings.Join(pairs, ",\n"))) } return fmt.Sprintf("{ %s }", strings.Join(pairs, ", ")) } @@ -1248,7 +1248,7 @@ func (v *FormatVisitor) VisitSetCreatorRest(ctx *parser.SetCreatorRestContext) i expressions = append(expressions, v.visitRule(i).(string)) } if len(ctx.GetText()) > 50 { - return fmt.Sprintf("{\n%s\n}", v.indent(strings.Join(expressions, ",\n"))) + return fmt.Sprintf("{\n%s\n}", indent(strings.Join(expressions, ",\n"))) } return fmt.Sprintf("{ %s }", strings.Join(expressions, ", ")) } @@ -1272,7 +1272,7 @@ func (v *FormatVisitor) VisitArguments(ctx *parser.ArgumentsContext) interface{} } if len(expressionList.GetText()) > 40 { defer restoreWrap(wrap(v)) - return fmt.Sprintf("(\n%s\n)", v.indent(v.visitRule(expressionList).(string))) + return fmt.Sprintf("(\n%s\n)", indent(v.visitRule(expressionList).(string))) } return fmt.Sprintf("(%s)", v.visitRule(expressionList)) } @@ -1316,7 +1316,7 @@ func (v *FormatVisitor) VisitFormalParameters(ctx *parser.FormalParametersContex wrap := v.wrap || (len(ctx.GetText()) > 40 && len(list.AllFormalParameter()) > 2) || len(ctx.GetText()) > 60 for _, p := range list.AllFormalParameter() { if wrap { - params = append(params, v.indent(v.visitRule(p).(string))) + params = append(params, indent(v.visitRule(p).(string))) } else { params = append(params, v.visitRule(p).(string)) } @@ -1458,7 +1458,7 @@ func (v *FormatVisitor) VisitTypeArguments(ctx *parser.TypeArgumentsContext) int func (v *FormatVisitor) VisitSoslLiteral(ctx *parser.SoslLiteralContext) interface{} { if ctx.BoundExpression() != nil { return fmt.Sprintf("[\n%s]", - v.indent(fmt.Sprintf("FIND\n%s%s", v.indent(v.visitRule(ctx.BoundExpression()).(string)), v.visitRule(ctx.SoslClauses()))), + indent(fmt.Sprintf("FIND\n%s%s", indent(v.visitRule(ctx.BoundExpression()).(string)), v.visitRule(ctx.SoslClauses()))), ) } return fmt.Sprintf("%s %s ]", ctx.GetChild(0).(antlr.TerminalNode).GetText(), v.visitRule(ctx.SoslClauses())) @@ -1531,9 +1531,9 @@ func (v *FormatVisitor) VisitFieldSpec(ctx *parser.FieldSpecContext) interface{} func (v *FormatVisitor) VisitFieldSpecClauses(ctx *parser.FieldSpecClausesContext) interface{} { var clauses strings.Builder - clauses.WriteString(fmt.Sprintf("(\n%s", v.indent(v.visitRule(ctx.FieldList()).(string)))) + clauses.WriteString(fmt.Sprintf("(\n%s", indent(v.visitRule(ctx.FieldList()).(string)))) if i := ctx.LogicalExpression(); i != nil { - clauses.WriteString(fmt.Sprintf("\nWHERE\n%s", v.indent(v.visitRule(i).(string)))) + clauses.WriteString(fmt.Sprintf("\nWHERE\n%s", indent(v.visitRule(i).(string)))) } if i := ctx.SoslId(); i != nil { clauses.WriteString(fmt.Sprintf("\nUSING LISTVIEW = %s", v.visitRule(i))) diff --git a/grammar/ApexLexer.g4 b/grammar/ApexLexer.g4 index 9f368e7..c2d7b6f 100644 --- a/grammar/ApexLexer.g4 +++ b/grammar/ApexLexer.g4 @@ -466,18 +466,17 @@ fragment Z : [zZ]; // Whitespace and comments // -WS : [ \t\r\n\u000C]+ -> channel(WHITESPACE_CHANNEL) - ; - DOC_COMMENT - : '/**' [\r\n] .*? '*/' -> channel(COMMENT_CHANNEL) + : [ \t\r\n\u000C]* '/**' [\r\n] .*? '*/' [ \t\r\n\u000C]* -> channel(COMMENT_CHANNEL) ; COMMENT - : '/*' .*? '*/' -> channel(COMMENT_CHANNEL) + : [ \t\r\n\u000C]* '/*' .*? '*/' [ \t\r\n\u000C]* -> channel(COMMENT_CHANNEL) ; LINE_COMMENT - : '//' ~[\r\n]* -> channel(COMMENT_CHANNEL) + : [ \t\r\n\u000C]* '//' ~[\r\n]* [ \t\r\n\u000C]*-> channel(COMMENT_CHANNEL) ; +WS : [ \t\r\n\u000C]+ -> channel(WHITESPACE_CHANNEL) + ; diff --git a/parser/ApexLexer.interp b/parser/ApexLexer.interp index 365edae..c66573d 100644 --- a/parser/ApexLexer.interp +++ b/parser/ApexLexer.interp @@ -497,10 +497,10 @@ RSHIFT_ASSIGN URSHIFT_ASSIGN ATSIGN Identifier -WS DOC_COMMENT COMMENT LINE_COMMENT +WS rule names: ABSTRACT @@ -786,10 +786,10 @@ W X Y Z -WS DOC_COMMENT COMMENT LINE_COMMENT +WS channel names: DEFAULT_TOKEN_CHANNEL @@ -803,4 +803,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 249, 2701, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 2, 198, 7, 198, 2, 199, 7, 199, 2, 200, 7, 200, 2, 201, 7, 201, 2, 202, 7, 202, 2, 203, 7, 203, 2, 204, 7, 204, 2, 205, 7, 205, 2, 206, 7, 206, 2, 207, 7, 207, 2, 208, 7, 208, 2, 209, 7, 209, 2, 210, 7, 210, 2, 211, 7, 211, 2, 212, 7, 212, 2, 213, 7, 213, 2, 214, 7, 214, 2, 215, 7, 215, 2, 216, 7, 216, 2, 217, 7, 217, 2, 218, 7, 218, 2, 219, 7, 219, 2, 220, 7, 220, 2, 221, 7, 221, 2, 222, 7, 222, 2, 223, 7, 223, 2, 224, 7, 224, 2, 225, 7, 225, 2, 226, 7, 226, 2, 227, 7, 227, 2, 228, 7, 228, 2, 229, 7, 229, 2, 230, 7, 230, 2, 231, 7, 231, 2, 232, 7, 232, 2, 233, 7, 233, 2, 234, 7, 234, 2, 235, 7, 235, 2, 236, 7, 236, 2, 237, 7, 237, 2, 238, 7, 238, 2, 239, 7, 239, 2, 240, 7, 240, 2, 241, 7, 241, 2, 242, 7, 242, 2, 243, 7, 243, 2, 244, 7, 244, 2, 245, 7, 245, 2, 246, 7, 246, 2, 247, 7, 247, 2, 248, 7, 248, 2, 249, 7, 249, 2, 250, 7, 250, 2, 251, 7, 251, 2, 252, 7, 252, 2, 253, 7, 253, 2, 254, 7, 254, 2, 255, 7, 255, 2, 256, 7, 256, 2, 257, 7, 257, 2, 258, 7, 258, 2, 259, 7, 259, 2, 260, 7, 260, 2, 261, 7, 261, 2, 262, 7, 262, 2, 263, 7, 263, 2, 264, 7, 264, 2, 265, 7, 265, 2, 266, 7, 266, 2, 267, 7, 267, 2, 268, 7, 268, 2, 269, 7, 269, 2, 270, 7, 270, 2, 271, 7, 271, 2, 272, 7, 272, 2, 273, 7, 273, 2, 274, 7, 274, 2, 275, 7, 275, 2, 276, 7, 276, 2, 277, 7, 277, 2, 278, 7, 278, 2, 279, 7, 279, 2, 280, 7, 280, 2, 281, 7, 281, 2, 282, 7, 282, 2, 283, 7, 283, 2, 284, 7, 284, 2, 285, 7, 285, 2, 286, 7, 286, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 4, 171, 2170, 8, 171, 11, 171, 12, 171, 2171, 3, 171, 2174, 8, 171, 1, 171, 1, 171, 1, 171, 4, 171, 2179, 8, 171, 11, 171, 12, 171, 2180, 1, 171, 1, 171, 4, 171, 2185, 8, 171, 11, 171, 12, 171, 2186, 3, 171, 2189, 8, 171, 3, 171, 2191, 8, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 4, 173, 2201, 8, 173, 11, 173, 12, 173, 2202, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 3, 188, 2323, 8, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 3, 188, 2332, 8, 188, 1, 188, 1, 188, 1, 189, 4, 189, 2337, 8, 189, 11, 189, 12, 189, 2338, 1, 190, 1, 190, 3, 190, 2343, 8, 190, 1, 191, 1, 191, 3, 191, 2347, 8, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 3, 191, 2356, 8, 191, 1, 191, 1, 191, 1, 192, 4, 192, 2361, 8, 192, 11, 192, 12, 192, 2362, 1, 193, 1, 193, 3, 193, 2367, 8, 193, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 5, 195, 2374, 8, 195, 10, 195, 12, 195, 2377, 9, 195, 1, 196, 1, 196, 5, 196, 2381, 8, 196, 10, 196, 12, 196, 2384, 9, 196, 1, 196, 1, 196, 1, 197, 5, 197, 2389, 8, 197, 10, 197, 12, 197, 2392, 9, 197, 1, 197, 1, 197, 1, 197, 5, 197, 2397, 8, 197, 10, 197, 12, 197, 2400, 9, 197, 1, 197, 3, 197, 2403, 8, 197, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 3, 198, 2412, 8, 198, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 3, 200, 2427, 8, 200, 1, 201, 1, 201, 3, 201, 2431, 8, 201, 1, 201, 1, 201, 1, 202, 4, 202, 2436, 8, 202, 11, 202, 12, 202, 2437, 1, 203, 1, 203, 3, 203, 2442, 8, 203, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 3, 204, 2454, 8, 204, 1, 205, 1, 205, 1, 206, 1, 206, 1, 207, 1, 207, 1, 208, 1, 208, 1, 209, 1, 209, 1, 210, 1, 210, 1, 211, 1, 211, 1, 212, 1, 212, 1, 213, 1, 213, 1, 214, 1, 214, 1, 215, 1, 215, 1, 216, 1, 216, 1, 217, 1, 217, 1, 218, 1, 218, 1, 219, 1, 219, 1, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 222, 1, 222, 1, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 1, 227, 1, 228, 1, 228, 1, 228, 1, 229, 1, 229, 1, 229, 1, 230, 1, 230, 1, 230, 1, 231, 1, 231, 1, 231, 1, 232, 1, 232, 1, 232, 1, 233, 1, 233, 1, 234, 1, 234, 1, 235, 1, 235, 1, 236, 1, 236, 1, 237, 1, 237, 1, 238, 1, 238, 1, 239, 1, 239, 1, 240, 1, 240, 1, 241, 1, 241, 1, 241, 1, 242, 1, 242, 1, 242, 1, 243, 1, 243, 1, 243, 1, 244, 1, 244, 1, 244, 1, 245, 1, 245, 1, 245, 1, 246, 1, 246, 1, 246, 1, 247, 1, 247, 1, 247, 1, 248, 1, 248, 1, 248, 1, 249, 1, 249, 1, 249, 1, 250, 1, 250, 1, 250, 1, 250, 1, 251, 1, 251, 1, 251, 1, 251, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 253, 1, 253, 1, 254, 1, 254, 5, 254, 2585, 8, 254, 10, 254, 12, 254, 2588, 9, 254, 1, 255, 1, 255, 1, 255, 1, 255, 3, 255, 2594, 8, 255, 1, 256, 1, 256, 1, 256, 1, 256, 3, 256, 2600, 8, 256, 1, 257, 1, 257, 1, 258, 1, 258, 1, 259, 1, 259, 1, 260, 1, 260, 1, 261, 1, 261, 1, 262, 1, 262, 1, 263, 1, 263, 1, 264, 1, 264, 1, 265, 1, 265, 1, 266, 1, 266, 1, 267, 1, 267, 1, 268, 1, 268, 1, 269, 1, 269, 1, 270, 1, 270, 1, 271, 1, 271, 1, 272, 1, 272, 1, 273, 1, 273, 1, 274, 1, 274, 1, 275, 1, 275, 1, 276, 1, 276, 1, 277, 1, 277, 1, 278, 1, 278, 1, 279, 1, 279, 1, 280, 1, 280, 1, 281, 1, 281, 1, 282, 1, 282, 1, 283, 4, 283, 2655, 8, 283, 11, 283, 12, 283, 2656, 1, 283, 1, 283, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 5, 284, 2667, 8, 284, 10, 284, 12, 284, 2670, 9, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 285, 1, 285, 1, 285, 1, 285, 5, 285, 2681, 8, 285, 10, 285, 12, 285, 2684, 9, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 286, 1, 286, 1, 286, 1, 286, 5, 286, 2695, 8, 286, 10, 286, 12, 286, 2698, 9, 286, 1, 286, 1, 286, 2, 2668, 2682, 0, 287, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 146, 293, 147, 295, 148, 297, 149, 299, 150, 301, 151, 303, 152, 305, 153, 307, 154, 309, 155, 311, 156, 313, 157, 315, 158, 317, 159, 319, 160, 321, 161, 323, 162, 325, 163, 327, 164, 329, 165, 331, 166, 333, 167, 335, 168, 337, 169, 339, 170, 341, 171, 343, 172, 345, 173, 347, 174, 349, 175, 351, 176, 353, 177, 355, 178, 357, 179, 359, 180, 361, 181, 363, 182, 365, 183, 367, 184, 369, 185, 371, 186, 373, 187, 375, 188, 377, 189, 379, 0, 381, 0, 383, 190, 385, 0, 387, 0, 389, 0, 391, 191, 393, 192, 395, 193, 397, 0, 399, 0, 401, 194, 403, 195, 405, 0, 407, 0, 409, 0, 411, 196, 413, 197, 415, 198, 417, 199, 419, 200, 421, 201, 423, 202, 425, 203, 427, 204, 429, 205, 431, 206, 433, 207, 435, 208, 437, 209, 439, 210, 441, 211, 443, 212, 445, 213, 447, 214, 449, 215, 451, 216, 453, 217, 455, 218, 457, 219, 459, 220, 461, 221, 463, 222, 465, 223, 467, 224, 469, 225, 471, 226, 473, 227, 475, 228, 477, 229, 479, 230, 481, 231, 483, 232, 485, 233, 487, 234, 489, 235, 491, 236, 493, 237, 495, 238, 497, 239, 499, 240, 501, 241, 503, 242, 505, 243, 507, 244, 509, 245, 511, 0, 513, 0, 515, 0, 517, 0, 519, 0, 521, 0, 523, 0, 525, 0, 527, 0, 529, 0, 531, 0, 533, 0, 535, 0, 537, 0, 539, 0, 541, 0, 543, 0, 545, 0, 547, 0, 549, 0, 551, 0, 553, 0, 555, 0, 557, 0, 559, 0, 561, 0, 563, 0, 565, 0, 567, 246, 569, 247, 571, 248, 573, 249, 1, 0, 40, 2, 0, 43, 43, 45, 45, 2, 0, 65, 90, 97, 122, 2, 0, 39, 39, 92, 92, 2, 0, 92, 92, 125, 125, 8, 0, 33, 34, 38, 43, 45, 45, 58, 58, 63, 63, 92, 92, 94, 94, 123, 126, 2, 0, 76, 76, 108, 108, 2, 0, 68, 68, 100, 100, 1, 0, 48, 57, 8, 0, 34, 34, 39, 39, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 4, 0, 36, 36, 65, 90, 95, 95, 97, 122, 2, 0, 0, 255, 55296, 56319, 1, 0, 55296, 56319, 1, 0, 56320, 57343, 5, 0, 36, 36, 48, 57, 65, 90, 95, 95, 97, 122, 2, 0, 65, 65, 97, 97, 2, 0, 66, 66, 98, 98, 2, 0, 67, 67, 99, 99, 2, 0, 69, 69, 101, 101, 2, 0, 70, 70, 102, 102, 2, 0, 71, 71, 103, 103, 2, 0, 72, 72, 104, 104, 2, 0, 73, 73, 105, 105, 2, 0, 74, 74, 106, 106, 2, 0, 75, 75, 107, 107, 2, 0, 77, 77, 109, 109, 2, 0, 78, 78, 110, 110, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 81, 81, 113, 113, 2, 0, 82, 82, 114, 114, 2, 0, 83, 83, 115, 115, 2, 0, 84, 84, 116, 116, 2, 0, 85, 85, 117, 117, 2, 0, 86, 86, 118, 118, 2, 0, 87, 87, 119, 119, 2, 0, 88, 88, 120, 120, 2, 0, 89, 89, 121, 121, 2, 0, 90, 90, 122, 122, 3, 0, 9, 10, 12, 13, 32, 32, 2, 0, 10, 10, 13, 13, 2702, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 287, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 0, 301, 1, 0, 0, 0, 0, 303, 1, 0, 0, 0, 0, 305, 1, 0, 0, 0, 0, 307, 1, 0, 0, 0, 0, 309, 1, 0, 0, 0, 0, 311, 1, 0, 0, 0, 0, 313, 1, 0, 0, 0, 0, 315, 1, 0, 0, 0, 0, 317, 1, 0, 0, 0, 0, 319, 1, 0, 0, 0, 0, 321, 1, 0, 0, 0, 0, 323, 1, 0, 0, 0, 0, 325, 1, 0, 0, 0, 0, 327, 1, 0, 0, 0, 0, 329, 1, 0, 0, 0, 0, 331, 1, 0, 0, 0, 0, 333, 1, 0, 0, 0, 0, 335, 1, 0, 0, 0, 0, 337, 1, 0, 0, 0, 0, 339, 1, 0, 0, 0, 0, 341, 1, 0, 0, 0, 0, 343, 1, 0, 0, 0, 0, 345, 1, 0, 0, 0, 0, 347, 1, 0, 0, 0, 0, 349, 1, 0, 0, 0, 0, 351, 1, 0, 0, 0, 0, 353, 1, 0, 0, 0, 0, 355, 1, 0, 0, 0, 0, 357, 1, 0, 0, 0, 0, 359, 1, 0, 0, 0, 0, 361, 1, 0, 0, 0, 0, 363, 1, 0, 0, 0, 0, 365, 1, 0, 0, 0, 0, 367, 1, 0, 0, 0, 0, 369, 1, 0, 0, 0, 0, 371, 1, 0, 0, 0, 0, 373, 1, 0, 0, 0, 0, 375, 1, 0, 0, 0, 0, 377, 1, 0, 0, 0, 0, 383, 1, 0, 0, 0, 0, 391, 1, 0, 0, 0, 0, 393, 1, 0, 0, 0, 0, 395, 1, 0, 0, 0, 0, 401, 1, 0, 0, 0, 0, 403, 1, 0, 0, 0, 0, 411, 1, 0, 0, 0, 0, 413, 1, 0, 0, 0, 0, 415, 1, 0, 0, 0, 0, 417, 1, 0, 0, 0, 0, 419, 1, 0, 0, 0, 0, 421, 1, 0, 0, 0, 0, 423, 1, 0, 0, 0, 0, 425, 1, 0, 0, 0, 0, 427, 1, 0, 0, 0, 0, 429, 1, 0, 0, 0, 0, 431, 1, 0, 0, 0, 0, 433, 1, 0, 0, 0, 0, 435, 1, 0, 0, 0, 0, 437, 1, 0, 0, 0, 0, 439, 1, 0, 0, 0, 0, 441, 1, 0, 0, 0, 0, 443, 1, 0, 0, 0, 0, 445, 1, 0, 0, 0, 0, 447, 1, 0, 0, 0, 0, 449, 1, 0, 0, 0, 0, 451, 1, 0, 0, 0, 0, 453, 1, 0, 0, 0, 0, 455, 1, 0, 0, 0, 0, 457, 1, 0, 0, 0, 0, 459, 1, 0, 0, 0, 0, 461, 1, 0, 0, 0, 0, 463, 1, 0, 0, 0, 0, 465, 1, 0, 0, 0, 0, 467, 1, 0, 0, 0, 0, 469, 1, 0, 0, 0, 0, 471, 1, 0, 0, 0, 0, 473, 1, 0, 0, 0, 0, 475, 1, 0, 0, 0, 0, 477, 1, 0, 0, 0, 0, 479, 1, 0, 0, 0, 0, 481, 1, 0, 0, 0, 0, 483, 1, 0, 0, 0, 0, 485, 1, 0, 0, 0, 0, 487, 1, 0, 0, 0, 0, 489, 1, 0, 0, 0, 0, 491, 1, 0, 0, 0, 0, 493, 1, 0, 0, 0, 0, 495, 1, 0, 0, 0, 0, 497, 1, 0, 0, 0, 0, 499, 1, 0, 0, 0, 0, 501, 1, 0, 0, 0, 0, 503, 1, 0, 0, 0, 0, 505, 1, 0, 0, 0, 0, 507, 1, 0, 0, 0, 0, 509, 1, 0, 0, 0, 0, 567, 1, 0, 0, 0, 0, 569, 1, 0, 0, 0, 0, 571, 1, 0, 0, 0, 0, 573, 1, 0, 0, 0, 1, 575, 1, 0, 0, 0, 3, 584, 1, 0, 0, 0, 5, 590, 1, 0, 0, 0, 7, 597, 1, 0, 0, 0, 9, 603, 1, 0, 0, 0, 11, 609, 1, 0, 0, 0, 13, 615, 1, 0, 0, 0, 15, 624, 1, 0, 0, 0, 17, 631, 1, 0, 0, 0, 19, 634, 1, 0, 0, 0, 21, 639, 1, 0, 0, 0, 23, 644, 1, 0, 0, 0, 25, 652, 1, 0, 0, 0, 27, 658, 1, 0, 0, 0, 29, 666, 1, 0, 0, 0, 31, 670, 1, 0, 0, 0, 33, 674, 1, 0, 0, 0, 35, 681, 1, 0, 0, 0, 37, 684, 1, 0, 0, 0, 39, 695, 1, 0, 0, 0, 41, 705, 1, 0, 0, 0, 43, 712, 1, 0, 0, 0, 45, 723, 1, 0, 0, 0, 47, 733, 1, 0, 0, 0, 49, 739, 1, 0, 0, 0, 51, 743, 1, 0, 0, 0, 53, 748, 1, 0, 0, 0, 55, 751, 1, 0, 0, 0, 57, 760, 1, 0, 0, 0, 59, 768, 1, 0, 0, 0, 61, 778, 1, 0, 0, 0, 63, 785, 1, 0, 0, 0, 65, 792, 1, 0, 0, 0, 67, 805, 1, 0, 0, 0, 69, 809, 1, 0, 0, 0, 71, 817, 1, 0, 0, 0, 73, 824, 1, 0, 0, 0, 75, 830, 1, 0, 0, 0, 77, 837, 1, 0, 0, 0, 79, 848, 1, 0, 0, 0, 81, 853, 1, 0, 0, 0, 83, 859, 1, 0, 0, 0, 85, 869, 1, 0, 0, 0, 87, 877, 1, 0, 0, 0, 89, 881, 1, 0, 0, 0, 91, 890, 1, 0, 0, 0, 93, 897, 1, 0, 0, 0, 95, 904, 1, 0, 0, 0, 97, 912, 1, 0, 0, 0, 99, 917, 1, 0, 0, 0, 101, 928, 1, 0, 0, 0, 103, 933, 1, 0, 0, 0, 105, 939, 1, 0, 0, 0, 107, 944, 1, 0, 0, 0, 109, 952, 1, 0, 0, 0, 111, 957, 1, 0, 0, 0, 113, 961, 1, 0, 0, 0, 115, 968, 1, 0, 0, 0, 117, 974, 1, 0, 0, 0, 119, 979, 1, 0, 0, 0, 121, 982, 1, 0, 0, 0, 123, 988, 1, 0, 0, 0, 125, 994, 1, 0, 0, 0, 127, 1000, 1, 0, 0, 0, 129, 1006, 1, 0, 0, 0, 131, 1009, 1, 0, 0, 0, 133, 1015, 1, 0, 0, 0, 135, 1019, 1, 0, 0, 0, 137, 1022, 1, 0, 0, 0, 139, 1026, 1, 0, 0, 0, 141, 1030, 1, 0, 0, 0, 143, 1045, 1, 0, 0, 0, 145, 1049, 1, 0, 0, 0, 147, 1053, 1, 0, 0, 0, 149, 1057, 1, 0, 0, 0, 151, 1064, 1, 0, 0, 0, 153, 1068, 1, 0, 0, 0, 155, 1073, 1, 0, 0, 0, 157, 1078, 1, 0, 0, 0, 159, 1081, 1, 0, 0, 0, 161, 1090, 1, 0, 0, 0, 163, 1099, 1, 0, 0, 0, 165, 1103, 1, 0, 0, 0, 167, 1108, 1, 0, 0, 0, 169, 1114, 1, 0, 0, 0, 171, 1120, 1, 0, 0, 0, 173, 1125, 1, 0, 0, 0, 175, 1131, 1, 0, 0, 0, 177, 1135, 1, 0, 0, 0, 179, 1140, 1, 0, 0, 0, 181, 1145, 1, 0, 0, 0, 183, 1152, 1, 0, 0, 0, 185, 1159, 1, 0, 0, 0, 187, 1167, 1, 0, 0, 0, 189, 1174, 1, 0, 0, 0, 191, 1179, 1, 0, 0, 0, 193, 1188, 1, 0, 0, 0, 195, 1191, 1, 0, 0, 0, 197, 1197, 1, 0, 0, 0, 199, 1203, 1, 0, 0, 0, 201, 1218, 1, 0, 0, 0, 203, 1236, 1, 0, 0, 0, 205, 1246, 1, 0, 0, 0, 207, 1251, 1, 0, 0, 0, 209, 1258, 1, 0, 0, 0, 211, 1267, 1, 0, 0, 0, 213, 1276, 1, 0, 0, 0, 215, 1283, 1, 0, 0, 0, 217, 1292, 1, 0, 0, 0, 219, 1301, 1, 0, 0, 0, 221, 1313, 1, 0, 0, 0, 223, 1322, 1, 0, 0, 0, 225, 1338, 1, 0, 0, 0, 227, 1353, 1, 0, 0, 0, 229, 1370, 1, 0, 0, 0, 231, 1384, 1, 0, 0, 0, 233, 1397, 1, 0, 0, 0, 235, 1409, 1, 0, 0, 0, 237, 1421, 1, 0, 0, 0, 239, 1430, 1, 0, 0, 0, 241, 1443, 1, 0, 0, 0, 243, 1458, 1, 0, 0, 0, 245, 1470, 1, 0, 0, 0, 247, 1482, 1, 0, 0, 0, 249, 1496, 1, 0, 0, 0, 251, 1509, 1, 0, 0, 0, 253, 1526, 1, 0, 0, 0, 255, 1536, 1, 0, 0, 0, 257, 1542, 1, 0, 0, 0, 259, 1551, 1, 0, 0, 0, 261, 1561, 1, 0, 0, 0, 263, 1571, 1, 0, 0, 0, 265, 1581, 1, 0, 0, 0, 267, 1592, 1, 0, 0, 0, 269, 1603, 1, 0, 0, 0, 271, 1614, 1, 0, 0, 0, 273, 1628, 1, 0, 0, 0, 275, 1642, 1, 0, 0, 0, 277, 1654, 1, 0, 0, 0, 279, 1666, 1, 0, 0, 0, 281, 1679, 1, 0, 0, 0, 283, 1692, 1, 0, 0, 0, 285, 1706, 1, 0, 0, 0, 287, 1720, 1, 0, 0, 0, 289, 1733, 1, 0, 0, 0, 291, 1746, 1, 0, 0, 0, 293, 1759, 1, 0, 0, 0, 295, 1775, 1, 0, 0, 0, 297, 1791, 1, 0, 0, 0, 299, 1801, 1, 0, 0, 0, 301, 1811, 1, 0, 0, 0, 303, 1821, 1, 0, 0, 0, 305, 1834, 1, 0, 0, 0, 307, 1847, 1, 0, 0, 0, 309, 1867, 1, 0, 0, 0, 311, 1887, 1, 0, 0, 0, 313, 1907, 1, 0, 0, 0, 315, 1930, 1, 0, 0, 0, 317, 1953, 1, 0, 0, 0, 319, 1970, 1, 0, 0, 0, 321, 1987, 1, 0, 0, 0, 323, 2004, 1, 0, 0, 0, 325, 2024, 1, 0, 0, 0, 327, 2044, 1, 0, 0, 0, 329, 2055, 1, 0, 0, 0, 331, 2067, 1, 0, 0, 0, 333, 2080, 1, 0, 0, 0, 335, 2095, 1, 0, 0, 0, 337, 2117, 1, 0, 0, 0, 339, 2129, 1, 0, 0, 0, 341, 2148, 1, 0, 0, 0, 343, 2159, 1, 0, 0, 0, 345, 2192, 1, 0, 0, 0, 347, 2196, 1, 0, 0, 0, 349, 2204, 1, 0, 0, 0, 351, 2209, 1, 0, 0, 0, 353, 2215, 1, 0, 0, 0, 355, 2220, 1, 0, 0, 0, 357, 2226, 1, 0, 0, 0, 359, 2234, 1, 0, 0, 0, 361, 2241, 1, 0, 0, 0, 363, 2250, 1, 0, 0, 0, 365, 2262, 1, 0, 0, 0, 367, 2270, 1, 0, 0, 0, 369, 2278, 1, 0, 0, 0, 371, 2292, 1, 0, 0, 0, 373, 2301, 1, 0, 0, 0, 375, 2311, 1, 0, 0, 0, 377, 2320, 1, 0, 0, 0, 379, 2336, 1, 0, 0, 0, 381, 2342, 1, 0, 0, 0, 383, 2344, 1, 0, 0, 0, 385, 2360, 1, 0, 0, 0, 387, 2366, 1, 0, 0, 0, 389, 2368, 1, 0, 0, 0, 391, 2371, 1, 0, 0, 0, 393, 2378, 1, 0, 0, 0, 395, 2390, 1, 0, 0, 0, 397, 2411, 1, 0, 0, 0, 399, 2413, 1, 0, 0, 0, 401, 2426, 1, 0, 0, 0, 403, 2428, 1, 0, 0, 0, 405, 2435, 1, 0, 0, 0, 407, 2441, 1, 0, 0, 0, 409, 2453, 1, 0, 0, 0, 411, 2455, 1, 0, 0, 0, 413, 2457, 1, 0, 0, 0, 415, 2459, 1, 0, 0, 0, 417, 2461, 1, 0, 0, 0, 419, 2463, 1, 0, 0, 0, 421, 2465, 1, 0, 0, 0, 423, 2467, 1, 0, 0, 0, 425, 2469, 1, 0, 0, 0, 427, 2471, 1, 0, 0, 0, 429, 2473, 1, 0, 0, 0, 431, 2475, 1, 0, 0, 0, 433, 2477, 1, 0, 0, 0, 435, 2479, 1, 0, 0, 0, 437, 2481, 1, 0, 0, 0, 439, 2483, 1, 0, 0, 0, 441, 2485, 1, 0, 0, 0, 443, 2488, 1, 0, 0, 0, 445, 2490, 1, 0, 0, 0, 447, 2492, 1, 0, 0, 0, 449, 2495, 1, 0, 0, 0, 451, 2499, 1, 0, 0, 0, 453, 2502, 1, 0, 0, 0, 455, 2505, 1, 0, 0, 0, 457, 2509, 1, 0, 0, 0, 459, 2512, 1, 0, 0, 0, 461, 2515, 1, 0, 0, 0, 463, 2518, 1, 0, 0, 0, 465, 2521, 1, 0, 0, 0, 467, 2524, 1, 0, 0, 0, 469, 2526, 1, 0, 0, 0, 471, 2528, 1, 0, 0, 0, 473, 2530, 1, 0, 0, 0, 475, 2532, 1, 0, 0, 0, 477, 2534, 1, 0, 0, 0, 479, 2536, 1, 0, 0, 0, 481, 2538, 1, 0, 0, 0, 483, 2540, 1, 0, 0, 0, 485, 2543, 1, 0, 0, 0, 487, 2546, 1, 0, 0, 0, 489, 2549, 1, 0, 0, 0, 491, 2552, 1, 0, 0, 0, 493, 2555, 1, 0, 0, 0, 495, 2558, 1, 0, 0, 0, 497, 2561, 1, 0, 0, 0, 499, 2564, 1, 0, 0, 0, 501, 2567, 1, 0, 0, 0, 503, 2571, 1, 0, 0, 0, 505, 2575, 1, 0, 0, 0, 507, 2580, 1, 0, 0, 0, 509, 2582, 1, 0, 0, 0, 511, 2593, 1, 0, 0, 0, 513, 2599, 1, 0, 0, 0, 515, 2601, 1, 0, 0, 0, 517, 2603, 1, 0, 0, 0, 519, 2605, 1, 0, 0, 0, 521, 2607, 1, 0, 0, 0, 523, 2609, 1, 0, 0, 0, 525, 2611, 1, 0, 0, 0, 527, 2613, 1, 0, 0, 0, 529, 2615, 1, 0, 0, 0, 531, 2617, 1, 0, 0, 0, 533, 2619, 1, 0, 0, 0, 535, 2621, 1, 0, 0, 0, 537, 2623, 1, 0, 0, 0, 539, 2625, 1, 0, 0, 0, 541, 2627, 1, 0, 0, 0, 543, 2629, 1, 0, 0, 0, 545, 2631, 1, 0, 0, 0, 547, 2633, 1, 0, 0, 0, 549, 2635, 1, 0, 0, 0, 551, 2637, 1, 0, 0, 0, 553, 2639, 1, 0, 0, 0, 555, 2641, 1, 0, 0, 0, 557, 2643, 1, 0, 0, 0, 559, 2645, 1, 0, 0, 0, 561, 2647, 1, 0, 0, 0, 563, 2649, 1, 0, 0, 0, 565, 2651, 1, 0, 0, 0, 567, 2654, 1, 0, 0, 0, 569, 2660, 1, 0, 0, 0, 571, 2676, 1, 0, 0, 0, 573, 2690, 1, 0, 0, 0, 575, 576, 3, 515, 257, 0, 576, 577, 3, 517, 258, 0, 577, 578, 3, 551, 275, 0, 578, 579, 3, 553, 276, 0, 579, 580, 3, 549, 274, 0, 580, 581, 3, 515, 257, 0, 581, 582, 3, 519, 259, 0, 582, 583, 3, 553, 276, 0, 583, 2, 1, 0, 0, 0, 584, 585, 3, 515, 257, 0, 585, 586, 3, 525, 262, 0, 586, 587, 3, 553, 276, 0, 587, 588, 3, 523, 261, 0, 588, 589, 3, 549, 274, 0, 589, 4, 1, 0, 0, 0, 590, 591, 3, 517, 258, 0, 591, 592, 3, 523, 261, 0, 592, 593, 3, 525, 262, 0, 593, 594, 3, 543, 271, 0, 594, 595, 3, 549, 274, 0, 595, 596, 3, 523, 261, 0, 596, 6, 1, 0, 0, 0, 597, 598, 3, 517, 258, 0, 598, 599, 3, 549, 274, 0, 599, 600, 3, 523, 261, 0, 600, 601, 3, 515, 257, 0, 601, 602, 3, 535, 267, 0, 602, 8, 1, 0, 0, 0, 603, 604, 3, 519, 259, 0, 604, 605, 3, 515, 257, 0, 605, 606, 3, 553, 276, 0, 606, 607, 3, 519, 259, 0, 607, 608, 3, 529, 264, 0, 608, 10, 1, 0, 0, 0, 609, 610, 3, 519, 259, 0, 610, 611, 3, 537, 268, 0, 611, 612, 3, 515, 257, 0, 612, 613, 3, 551, 275, 0, 613, 614, 3, 551, 275, 0, 614, 12, 1, 0, 0, 0, 615, 616, 3, 519, 259, 0, 616, 617, 3, 543, 271, 0, 617, 618, 3, 541, 270, 0, 618, 619, 3, 553, 276, 0, 619, 620, 3, 531, 265, 0, 620, 621, 3, 541, 270, 0, 621, 622, 3, 555, 277, 0, 622, 623, 3, 523, 261, 0, 623, 14, 1, 0, 0, 0, 624, 625, 3, 521, 260, 0, 625, 626, 3, 523, 261, 0, 626, 627, 3, 537, 268, 0, 627, 628, 3, 523, 261, 0, 628, 629, 3, 553, 276, 0, 629, 630, 3, 523, 261, 0, 630, 16, 1, 0, 0, 0, 631, 632, 3, 521, 260, 0, 632, 633, 3, 543, 271, 0, 633, 18, 1, 0, 0, 0, 634, 635, 3, 523, 261, 0, 635, 636, 3, 537, 268, 0, 636, 637, 3, 551, 275, 0, 637, 638, 3, 523, 261, 0, 638, 20, 1, 0, 0, 0, 639, 640, 3, 523, 261, 0, 640, 641, 3, 541, 270, 0, 641, 642, 3, 555, 277, 0, 642, 643, 3, 539, 269, 0, 643, 22, 1, 0, 0, 0, 644, 645, 3, 523, 261, 0, 645, 646, 3, 561, 280, 0, 646, 647, 3, 553, 276, 0, 647, 648, 3, 523, 261, 0, 648, 649, 3, 541, 270, 0, 649, 650, 3, 521, 260, 0, 650, 651, 3, 551, 275, 0, 651, 24, 1, 0, 0, 0, 652, 653, 3, 525, 262, 0, 653, 654, 3, 531, 265, 0, 654, 655, 3, 541, 270, 0, 655, 656, 3, 515, 257, 0, 656, 657, 3, 537, 268, 0, 657, 26, 1, 0, 0, 0, 658, 659, 3, 525, 262, 0, 659, 660, 3, 531, 265, 0, 660, 661, 3, 541, 270, 0, 661, 662, 3, 515, 257, 0, 662, 663, 3, 537, 268, 0, 663, 664, 3, 537, 268, 0, 664, 665, 3, 563, 281, 0, 665, 28, 1, 0, 0, 0, 666, 667, 3, 525, 262, 0, 667, 668, 3, 543, 271, 0, 668, 669, 3, 549, 274, 0, 669, 30, 1, 0, 0, 0, 670, 671, 3, 527, 263, 0, 671, 672, 3, 523, 261, 0, 672, 673, 3, 553, 276, 0, 673, 32, 1, 0, 0, 0, 674, 675, 3, 527, 263, 0, 675, 676, 3, 537, 268, 0, 676, 677, 3, 543, 271, 0, 677, 678, 3, 517, 258, 0, 678, 679, 3, 515, 257, 0, 679, 680, 3, 537, 268, 0, 680, 34, 1, 0, 0, 0, 681, 682, 3, 531, 265, 0, 682, 683, 3, 525, 262, 0, 683, 36, 1, 0, 0, 0, 684, 685, 3, 531, 265, 0, 685, 686, 3, 539, 269, 0, 686, 687, 3, 545, 272, 0, 687, 688, 3, 537, 268, 0, 688, 689, 3, 523, 261, 0, 689, 690, 3, 539, 269, 0, 690, 691, 3, 523, 261, 0, 691, 692, 3, 541, 270, 0, 692, 693, 3, 553, 276, 0, 693, 694, 3, 551, 275, 0, 694, 38, 1, 0, 0, 0, 695, 696, 3, 531, 265, 0, 696, 697, 3, 541, 270, 0, 697, 698, 3, 529, 264, 0, 698, 699, 3, 523, 261, 0, 699, 700, 3, 549, 274, 0, 700, 701, 3, 531, 265, 0, 701, 702, 3, 553, 276, 0, 702, 703, 3, 523, 261, 0, 703, 704, 3, 521, 260, 0, 704, 40, 1, 0, 0, 0, 705, 706, 3, 531, 265, 0, 706, 707, 3, 541, 270, 0, 707, 708, 3, 551, 275, 0, 708, 709, 3, 523, 261, 0, 709, 710, 3, 549, 274, 0, 710, 711, 3, 553, 276, 0, 711, 42, 1, 0, 0, 0, 712, 713, 3, 531, 265, 0, 713, 714, 3, 541, 270, 0, 714, 715, 3, 551, 275, 0, 715, 716, 3, 553, 276, 0, 716, 717, 3, 515, 257, 0, 717, 718, 3, 541, 270, 0, 718, 719, 3, 519, 259, 0, 719, 720, 3, 523, 261, 0, 720, 721, 3, 543, 271, 0, 721, 722, 3, 525, 262, 0, 722, 44, 1, 0, 0, 0, 723, 724, 3, 531, 265, 0, 724, 725, 3, 541, 270, 0, 725, 726, 3, 553, 276, 0, 726, 727, 3, 523, 261, 0, 727, 728, 3, 549, 274, 0, 728, 729, 3, 525, 262, 0, 729, 730, 3, 515, 257, 0, 730, 731, 3, 519, 259, 0, 731, 732, 3, 523, 261, 0, 732, 46, 1, 0, 0, 0, 733, 734, 3, 539, 269, 0, 734, 735, 3, 523, 261, 0, 735, 736, 3, 549, 274, 0, 736, 737, 3, 527, 263, 0, 737, 738, 3, 523, 261, 0, 738, 48, 1, 0, 0, 0, 739, 740, 3, 541, 270, 0, 740, 741, 3, 523, 261, 0, 741, 742, 3, 559, 279, 0, 742, 50, 1, 0, 0, 0, 743, 744, 3, 541, 270, 0, 744, 745, 3, 555, 277, 0, 745, 746, 3, 537, 268, 0, 746, 747, 3, 537, 268, 0, 747, 52, 1, 0, 0, 0, 748, 749, 3, 543, 271, 0, 749, 750, 3, 541, 270, 0, 750, 54, 1, 0, 0, 0, 751, 752, 3, 543, 271, 0, 752, 753, 3, 557, 278, 0, 753, 754, 3, 523, 261, 0, 754, 755, 3, 549, 274, 0, 755, 756, 3, 549, 274, 0, 756, 757, 3, 531, 265, 0, 757, 758, 3, 521, 260, 0, 758, 759, 3, 523, 261, 0, 759, 56, 1, 0, 0, 0, 760, 761, 3, 545, 272, 0, 761, 762, 3, 549, 274, 0, 762, 763, 3, 531, 265, 0, 763, 764, 3, 557, 278, 0, 764, 765, 3, 515, 257, 0, 765, 766, 3, 553, 276, 0, 766, 767, 3, 523, 261, 0, 767, 58, 1, 0, 0, 0, 768, 769, 3, 545, 272, 0, 769, 770, 3, 549, 274, 0, 770, 771, 3, 543, 271, 0, 771, 772, 3, 553, 276, 0, 772, 773, 3, 523, 261, 0, 773, 774, 3, 519, 259, 0, 774, 775, 3, 553, 276, 0, 775, 776, 3, 523, 261, 0, 776, 777, 3, 521, 260, 0, 777, 60, 1, 0, 0, 0, 778, 779, 3, 545, 272, 0, 779, 780, 3, 555, 277, 0, 780, 781, 3, 517, 258, 0, 781, 782, 3, 537, 268, 0, 782, 783, 3, 531, 265, 0, 783, 784, 3, 519, 259, 0, 784, 62, 1, 0, 0, 0, 785, 786, 3, 549, 274, 0, 786, 787, 3, 523, 261, 0, 787, 788, 3, 553, 276, 0, 788, 789, 3, 555, 277, 0, 789, 790, 3, 549, 274, 0, 790, 791, 3, 541, 270, 0, 791, 64, 1, 0, 0, 0, 792, 793, 3, 551, 275, 0, 793, 794, 3, 563, 281, 0, 794, 795, 3, 551, 275, 0, 795, 796, 3, 553, 276, 0, 796, 797, 3, 523, 261, 0, 797, 798, 3, 539, 269, 0, 798, 799, 5, 46, 0, 0, 799, 800, 3, 549, 274, 0, 800, 801, 3, 555, 277, 0, 801, 802, 3, 541, 270, 0, 802, 803, 3, 515, 257, 0, 803, 804, 3, 551, 275, 0, 804, 66, 1, 0, 0, 0, 805, 806, 3, 551, 275, 0, 806, 807, 3, 523, 261, 0, 807, 808, 3, 553, 276, 0, 808, 68, 1, 0, 0, 0, 809, 810, 3, 551, 275, 0, 810, 811, 3, 529, 264, 0, 811, 812, 3, 515, 257, 0, 812, 813, 3, 549, 274, 0, 813, 814, 3, 531, 265, 0, 814, 815, 3, 541, 270, 0, 815, 816, 3, 527, 263, 0, 816, 70, 1, 0, 0, 0, 817, 818, 3, 551, 275, 0, 818, 819, 3, 553, 276, 0, 819, 820, 3, 515, 257, 0, 820, 821, 3, 553, 276, 0, 821, 822, 3, 531, 265, 0, 822, 823, 3, 519, 259, 0, 823, 72, 1, 0, 0, 0, 824, 825, 3, 551, 275, 0, 825, 826, 3, 555, 277, 0, 826, 827, 3, 545, 272, 0, 827, 828, 3, 523, 261, 0, 828, 829, 3, 549, 274, 0, 829, 74, 1, 0, 0, 0, 830, 831, 3, 551, 275, 0, 831, 832, 3, 559, 279, 0, 832, 833, 3, 531, 265, 0, 833, 834, 3, 553, 276, 0, 834, 835, 3, 519, 259, 0, 835, 836, 3, 529, 264, 0, 836, 76, 1, 0, 0, 0, 837, 838, 3, 553, 276, 0, 838, 839, 3, 523, 261, 0, 839, 840, 3, 551, 275, 0, 840, 841, 3, 553, 276, 0, 841, 842, 3, 539, 269, 0, 842, 843, 3, 523, 261, 0, 843, 844, 3, 553, 276, 0, 844, 845, 3, 529, 264, 0, 845, 846, 3, 543, 271, 0, 846, 847, 3, 521, 260, 0, 847, 78, 1, 0, 0, 0, 848, 849, 3, 553, 276, 0, 849, 850, 3, 529, 264, 0, 850, 851, 3, 531, 265, 0, 851, 852, 3, 551, 275, 0, 852, 80, 1, 0, 0, 0, 853, 854, 3, 553, 276, 0, 854, 855, 3, 529, 264, 0, 855, 856, 3, 549, 274, 0, 856, 857, 3, 543, 271, 0, 857, 858, 3, 559, 279, 0, 858, 82, 1, 0, 0, 0, 859, 860, 3, 553, 276, 0, 860, 861, 3, 549, 274, 0, 861, 862, 3, 515, 257, 0, 862, 863, 3, 541, 270, 0, 863, 864, 3, 551, 275, 0, 864, 865, 3, 531, 265, 0, 865, 866, 3, 523, 261, 0, 866, 867, 3, 541, 270, 0, 867, 868, 3, 553, 276, 0, 868, 84, 1, 0, 0, 0, 869, 870, 3, 553, 276, 0, 870, 871, 3, 549, 274, 0, 871, 872, 3, 531, 265, 0, 872, 873, 3, 527, 263, 0, 873, 874, 3, 527, 263, 0, 874, 875, 3, 523, 261, 0, 875, 876, 3, 549, 274, 0, 876, 86, 1, 0, 0, 0, 877, 878, 3, 553, 276, 0, 878, 879, 3, 549, 274, 0, 879, 880, 3, 563, 281, 0, 880, 88, 1, 0, 0, 0, 881, 882, 3, 555, 277, 0, 882, 883, 3, 541, 270, 0, 883, 884, 3, 521, 260, 0, 884, 885, 3, 523, 261, 0, 885, 886, 3, 537, 268, 0, 886, 887, 3, 523, 261, 0, 887, 888, 3, 553, 276, 0, 888, 889, 3, 523, 261, 0, 889, 90, 1, 0, 0, 0, 890, 891, 3, 555, 277, 0, 891, 892, 3, 545, 272, 0, 892, 893, 3, 521, 260, 0, 893, 894, 3, 515, 257, 0, 894, 895, 3, 553, 276, 0, 895, 896, 3, 523, 261, 0, 896, 92, 1, 0, 0, 0, 897, 898, 3, 555, 277, 0, 898, 899, 3, 545, 272, 0, 899, 900, 3, 551, 275, 0, 900, 901, 3, 523, 261, 0, 901, 902, 3, 549, 274, 0, 902, 903, 3, 553, 276, 0, 903, 94, 1, 0, 0, 0, 904, 905, 3, 557, 278, 0, 905, 906, 3, 531, 265, 0, 906, 907, 3, 549, 274, 0, 907, 908, 3, 553, 276, 0, 908, 909, 3, 555, 277, 0, 909, 910, 3, 515, 257, 0, 910, 911, 3, 537, 268, 0, 911, 96, 1, 0, 0, 0, 912, 913, 3, 557, 278, 0, 913, 914, 3, 543, 271, 0, 914, 915, 3, 531, 265, 0, 915, 916, 3, 521, 260, 0, 916, 98, 1, 0, 0, 0, 917, 918, 3, 559, 279, 0, 918, 919, 3, 523, 261, 0, 919, 920, 3, 517, 258, 0, 920, 921, 3, 551, 275, 0, 921, 922, 3, 523, 261, 0, 922, 923, 3, 549, 274, 0, 923, 924, 3, 557, 278, 0, 924, 925, 3, 531, 265, 0, 925, 926, 3, 519, 259, 0, 926, 927, 3, 523, 261, 0, 927, 100, 1, 0, 0, 0, 928, 929, 3, 559, 279, 0, 929, 930, 3, 529, 264, 0, 930, 931, 3, 523, 261, 0, 931, 932, 3, 541, 270, 0, 932, 102, 1, 0, 0, 0, 933, 934, 3, 559, 279, 0, 934, 935, 3, 529, 264, 0, 935, 936, 3, 531, 265, 0, 936, 937, 3, 537, 268, 0, 937, 938, 3, 523, 261, 0, 938, 104, 1, 0, 0, 0, 939, 940, 3, 559, 279, 0, 940, 941, 3, 531, 265, 0, 941, 942, 3, 553, 276, 0, 942, 943, 3, 529, 264, 0, 943, 106, 1, 0, 0, 0, 944, 945, 3, 559, 279, 0, 945, 946, 3, 531, 265, 0, 946, 947, 3, 553, 276, 0, 947, 948, 3, 529, 264, 0, 948, 949, 3, 543, 271, 0, 949, 950, 3, 555, 277, 0, 950, 951, 3, 553, 276, 0, 951, 108, 1, 0, 0, 0, 952, 953, 3, 537, 268, 0, 953, 954, 3, 531, 265, 0, 954, 955, 3, 551, 275, 0, 955, 956, 3, 553, 276, 0, 956, 110, 1, 0, 0, 0, 957, 958, 3, 539, 269, 0, 958, 959, 3, 515, 257, 0, 959, 960, 3, 545, 272, 0, 960, 112, 1, 0, 0, 0, 961, 962, 3, 551, 275, 0, 962, 963, 3, 523, 261, 0, 963, 964, 3, 537, 268, 0, 964, 965, 3, 523, 261, 0, 965, 966, 3, 519, 259, 0, 966, 967, 3, 553, 276, 0, 967, 114, 1, 0, 0, 0, 968, 969, 3, 519, 259, 0, 969, 970, 3, 543, 271, 0, 970, 971, 3, 555, 277, 0, 971, 972, 3, 541, 270, 0, 972, 973, 3, 553, 276, 0, 973, 116, 1, 0, 0, 0, 974, 975, 3, 525, 262, 0, 975, 976, 3, 549, 274, 0, 976, 977, 3, 543, 271, 0, 977, 978, 3, 539, 269, 0, 978, 118, 1, 0, 0, 0, 979, 980, 3, 515, 257, 0, 980, 981, 3, 551, 275, 0, 981, 120, 1, 0, 0, 0, 982, 983, 3, 555, 277, 0, 983, 984, 3, 551, 275, 0, 984, 985, 3, 531, 265, 0, 985, 986, 3, 541, 270, 0, 986, 987, 3, 527, 263, 0, 987, 122, 1, 0, 0, 0, 988, 989, 3, 551, 275, 0, 989, 990, 3, 519, 259, 0, 990, 991, 3, 543, 271, 0, 991, 992, 3, 545, 272, 0, 992, 993, 3, 523, 261, 0, 993, 124, 1, 0, 0, 0, 994, 995, 3, 559, 279, 0, 995, 996, 3, 529, 264, 0, 996, 997, 3, 523, 261, 0, 997, 998, 3, 549, 274, 0, 998, 999, 3, 523, 261, 0, 999, 126, 1, 0, 0, 0, 1000, 1001, 3, 543, 271, 0, 1001, 1002, 3, 549, 274, 0, 1002, 1003, 3, 521, 260, 0, 1003, 1004, 3, 523, 261, 0, 1004, 1005, 3, 549, 274, 0, 1005, 128, 1, 0, 0, 0, 1006, 1007, 3, 517, 258, 0, 1007, 1008, 3, 563, 281, 0, 1008, 130, 1, 0, 0, 0, 1009, 1010, 3, 537, 268, 0, 1010, 1011, 3, 531, 265, 0, 1011, 1012, 3, 539, 269, 0, 1012, 1013, 3, 531, 265, 0, 1013, 1014, 3, 553, 276, 0, 1014, 132, 1, 0, 0, 0, 1015, 1016, 3, 515, 257, 0, 1016, 1017, 3, 541, 270, 0, 1017, 1018, 3, 521, 260, 0, 1018, 134, 1, 0, 0, 0, 1019, 1020, 3, 543, 271, 0, 1020, 1021, 3, 549, 274, 0, 1021, 136, 1, 0, 0, 0, 1022, 1023, 3, 541, 270, 0, 1023, 1024, 3, 543, 271, 0, 1024, 1025, 3, 553, 276, 0, 1025, 138, 1, 0, 0, 0, 1026, 1027, 3, 515, 257, 0, 1027, 1028, 3, 557, 278, 0, 1028, 1029, 3, 527, 263, 0, 1029, 140, 1, 0, 0, 0, 1030, 1031, 3, 519, 259, 0, 1031, 1032, 3, 543, 271, 0, 1032, 1033, 3, 555, 277, 0, 1033, 1034, 3, 541, 270, 0, 1034, 1035, 3, 553, 276, 0, 1035, 1036, 5, 95, 0, 0, 1036, 1037, 3, 521, 260, 0, 1037, 1038, 3, 531, 265, 0, 1038, 1039, 3, 551, 275, 0, 1039, 1040, 3, 553, 276, 0, 1040, 1041, 3, 531, 265, 0, 1041, 1042, 3, 541, 270, 0, 1042, 1043, 3, 519, 259, 0, 1043, 1044, 3, 553, 276, 0, 1044, 142, 1, 0, 0, 0, 1045, 1046, 3, 539, 269, 0, 1046, 1047, 3, 531, 265, 0, 1047, 1048, 3, 541, 270, 0, 1048, 144, 1, 0, 0, 0, 1049, 1050, 3, 539, 269, 0, 1050, 1051, 3, 515, 257, 0, 1051, 1052, 3, 561, 280, 0, 1052, 146, 1, 0, 0, 0, 1053, 1054, 3, 551, 275, 0, 1054, 1055, 3, 555, 277, 0, 1055, 1056, 3, 539, 269, 0, 1056, 148, 1, 0, 0, 0, 1057, 1058, 3, 553, 276, 0, 1058, 1059, 3, 563, 281, 0, 1059, 1060, 3, 545, 272, 0, 1060, 1061, 3, 523, 261, 0, 1061, 1062, 3, 543, 271, 0, 1062, 1063, 3, 525, 262, 0, 1063, 150, 1, 0, 0, 0, 1064, 1065, 3, 523, 261, 0, 1065, 1066, 3, 541, 270, 0, 1066, 1067, 3, 521, 260, 0, 1067, 152, 1, 0, 0, 0, 1068, 1069, 3, 553, 276, 0, 1069, 1070, 3, 529, 264, 0, 1070, 1071, 3, 523, 261, 0, 1071, 1072, 3, 541, 270, 0, 1072, 154, 1, 0, 0, 0, 1073, 1074, 3, 537, 268, 0, 1074, 1075, 3, 531, 265, 0, 1075, 1076, 3, 535, 267, 0, 1076, 1077, 3, 523, 261, 0, 1077, 156, 1, 0, 0, 0, 1078, 1079, 3, 531, 265, 0, 1079, 1080, 3, 541, 270, 0, 1080, 158, 1, 0, 0, 0, 1081, 1082, 3, 531, 265, 0, 1082, 1083, 3, 541, 270, 0, 1083, 1084, 3, 519, 259, 0, 1084, 1085, 3, 537, 268, 0, 1085, 1086, 3, 555, 277, 0, 1086, 1087, 3, 521, 260, 0, 1087, 1088, 3, 523, 261, 0, 1088, 1089, 3, 551, 275, 0, 1089, 160, 1, 0, 0, 0, 1090, 1091, 3, 523, 261, 0, 1091, 1092, 3, 561, 280, 0, 1092, 1093, 3, 519, 259, 0, 1093, 1094, 3, 537, 268, 0, 1094, 1095, 3, 555, 277, 0, 1095, 1096, 3, 521, 260, 0, 1096, 1097, 3, 523, 261, 0, 1097, 1098, 3, 551, 275, 0, 1098, 162, 1, 0, 0, 0, 1099, 1100, 3, 515, 257, 0, 1100, 1101, 3, 551, 275, 0, 1101, 1102, 3, 519, 259, 0, 1102, 164, 1, 0, 0, 0, 1103, 1104, 3, 521, 260, 0, 1104, 1105, 3, 523, 261, 0, 1105, 1106, 3, 551, 275, 0, 1106, 1107, 3, 519, 259, 0, 1107, 166, 1, 0, 0, 0, 1108, 1109, 3, 541, 270, 0, 1109, 1110, 3, 555, 277, 0, 1110, 1111, 3, 537, 268, 0, 1111, 1112, 3, 537, 268, 0, 1112, 1113, 3, 551, 275, 0, 1113, 168, 1, 0, 0, 0, 1114, 1115, 3, 525, 262, 0, 1115, 1116, 3, 531, 265, 0, 1116, 1117, 3, 549, 274, 0, 1117, 1118, 3, 551, 275, 0, 1118, 1119, 3, 553, 276, 0, 1119, 170, 1, 0, 0, 0, 1120, 1121, 3, 537, 268, 0, 1121, 1122, 3, 515, 257, 0, 1122, 1123, 3, 551, 275, 0, 1123, 1124, 3, 553, 276, 0, 1124, 172, 1, 0, 0, 0, 1125, 1126, 3, 527, 263, 0, 1126, 1127, 3, 549, 274, 0, 1127, 1128, 3, 543, 271, 0, 1128, 1129, 3, 555, 277, 0, 1129, 1130, 3, 545, 272, 0, 1130, 174, 1, 0, 0, 0, 1131, 1132, 3, 515, 257, 0, 1132, 1133, 3, 537, 268, 0, 1133, 1134, 3, 537, 268, 0, 1134, 176, 1, 0, 0, 0, 1135, 1136, 3, 549, 274, 0, 1136, 1137, 3, 543, 271, 0, 1137, 1138, 3, 559, 279, 0, 1138, 1139, 3, 551, 275, 0, 1139, 178, 1, 0, 0, 0, 1140, 1141, 3, 557, 278, 0, 1141, 1142, 3, 531, 265, 0, 1142, 1143, 3, 523, 261, 0, 1143, 1144, 3, 559, 279, 0, 1144, 180, 1, 0, 0, 0, 1145, 1146, 3, 529, 264, 0, 1146, 1147, 3, 515, 257, 0, 1147, 1148, 3, 557, 278, 0, 1148, 1149, 3, 531, 265, 0, 1149, 1150, 3, 541, 270, 0, 1150, 1151, 3, 527, 263, 0, 1151, 182, 1, 0, 0, 0, 1152, 1153, 3, 549, 274, 0, 1153, 1154, 3, 543, 271, 0, 1154, 1155, 3, 537, 268, 0, 1155, 1156, 3, 537, 268, 0, 1156, 1157, 3, 555, 277, 0, 1157, 1158, 3, 545, 272, 0, 1158, 184, 1, 0, 0, 0, 1159, 1160, 3, 553, 276, 0, 1160, 1161, 3, 543, 271, 0, 1161, 1162, 3, 537, 268, 0, 1162, 1163, 3, 515, 257, 0, 1163, 1164, 3, 517, 258, 0, 1164, 1165, 3, 523, 261, 0, 1165, 1166, 3, 537, 268, 0, 1166, 186, 1, 0, 0, 0, 1167, 1168, 3, 543, 271, 0, 1168, 1169, 3, 525, 262, 0, 1169, 1170, 3, 525, 262, 0, 1170, 1171, 3, 551, 275, 0, 1171, 1172, 3, 523, 261, 0, 1172, 1173, 3, 553, 276, 0, 1173, 188, 1, 0, 0, 0, 1174, 1175, 3, 521, 260, 0, 1175, 1176, 3, 515, 257, 0, 1176, 1177, 3, 553, 276, 0, 1177, 1178, 3, 515, 257, 0, 1178, 190, 1, 0, 0, 0, 1179, 1180, 3, 519, 259, 0, 1180, 1181, 3, 515, 257, 0, 1181, 1182, 3, 553, 276, 0, 1182, 1183, 3, 523, 261, 0, 1183, 1184, 3, 527, 263, 0, 1184, 1185, 3, 543, 271, 0, 1185, 1186, 3, 549, 274, 0, 1186, 1187, 3, 563, 281, 0, 1187, 192, 1, 0, 0, 0, 1188, 1189, 3, 515, 257, 0, 1189, 1190, 3, 553, 276, 0, 1190, 194, 1, 0, 0, 0, 1191, 1192, 3, 515, 257, 0, 1192, 1193, 3, 517, 258, 0, 1193, 1194, 3, 543, 271, 0, 1194, 1195, 3, 557, 278, 0, 1195, 1196, 3, 523, 261, 0, 1196, 196, 1, 0, 0, 0, 1197, 1198, 3, 517, 258, 0, 1198, 1199, 3, 523, 261, 0, 1199, 1200, 3, 537, 268, 0, 1200, 1201, 3, 543, 271, 0, 1201, 1202, 3, 559, 279, 0, 1202, 198, 1, 0, 0, 0, 1203, 1204, 3, 515, 257, 0, 1204, 1205, 3, 517, 258, 0, 1205, 1206, 3, 543, 271, 0, 1206, 1207, 3, 557, 278, 0, 1207, 1208, 3, 523, 261, 0, 1208, 1209, 5, 95, 0, 0, 1209, 1210, 3, 543, 271, 0, 1210, 1211, 3, 549, 274, 0, 1211, 1212, 5, 95, 0, 0, 1212, 1213, 3, 517, 258, 0, 1213, 1214, 3, 523, 261, 0, 1214, 1215, 3, 537, 268, 0, 1215, 1216, 3, 543, 271, 0, 1216, 1217, 3, 559, 279, 0, 1217, 200, 1, 0, 0, 0, 1218, 1219, 3, 551, 275, 0, 1219, 1220, 3, 523, 261, 0, 1220, 1221, 3, 519, 259, 0, 1221, 1222, 3, 555, 277, 0, 1222, 1223, 3, 549, 274, 0, 1223, 1224, 3, 531, 265, 0, 1224, 1225, 3, 553, 276, 0, 1225, 1226, 3, 563, 281, 0, 1226, 1227, 5, 95, 0, 0, 1227, 1228, 3, 523, 261, 0, 1228, 1229, 3, 541, 270, 0, 1229, 1230, 3, 525, 262, 0, 1230, 1231, 3, 543, 271, 0, 1231, 1232, 3, 549, 274, 0, 1232, 1233, 3, 519, 259, 0, 1233, 1234, 3, 523, 261, 0, 1234, 1235, 3, 521, 260, 0, 1235, 202, 1, 0, 0, 0, 1236, 1237, 3, 549, 274, 0, 1237, 1238, 3, 523, 261, 0, 1238, 1239, 3, 525, 262, 0, 1239, 1240, 3, 523, 261, 0, 1240, 1241, 3, 549, 274, 0, 1241, 1242, 3, 523, 261, 0, 1242, 1243, 3, 541, 270, 0, 1243, 1244, 3, 519, 259, 0, 1244, 1245, 3, 523, 261, 0, 1245, 204, 1, 0, 0, 0, 1246, 1247, 3, 519, 259, 0, 1247, 1248, 3, 555, 277, 0, 1248, 1249, 3, 517, 258, 0, 1249, 1250, 3, 523, 261, 0, 1250, 206, 1, 0, 0, 0, 1251, 1252, 3, 525, 262, 0, 1252, 1253, 3, 543, 271, 0, 1253, 1254, 3, 549, 274, 0, 1254, 1255, 3, 539, 269, 0, 1255, 1256, 3, 515, 257, 0, 1256, 1257, 3, 553, 276, 0, 1257, 208, 1, 0, 0, 0, 1258, 1259, 3, 553, 276, 0, 1259, 1260, 3, 549, 274, 0, 1260, 1261, 3, 515, 257, 0, 1261, 1262, 3, 519, 259, 0, 1262, 1263, 3, 535, 267, 0, 1263, 1264, 3, 531, 265, 0, 1264, 1265, 3, 541, 270, 0, 1265, 1266, 3, 527, 263, 0, 1266, 210, 1, 0, 0, 0, 1267, 1268, 3, 557, 278, 0, 1268, 1269, 3, 531, 265, 0, 1269, 1270, 3, 523, 261, 0, 1270, 1271, 3, 559, 279, 0, 1271, 1272, 3, 551, 275, 0, 1272, 1273, 3, 553, 276, 0, 1273, 1274, 3, 515, 257, 0, 1274, 1275, 3, 553, 276, 0, 1275, 212, 1, 0, 0, 0, 1276, 1277, 3, 519, 259, 0, 1277, 1278, 3, 555, 277, 0, 1278, 1279, 3, 551, 275, 0, 1279, 1280, 3, 553, 276, 0, 1280, 1281, 3, 543, 271, 0, 1281, 1282, 3, 539, 269, 0, 1282, 214, 1, 0, 0, 0, 1283, 1284, 3, 551, 275, 0, 1284, 1285, 3, 553, 276, 0, 1285, 1286, 3, 515, 257, 0, 1286, 1287, 3, 541, 270, 0, 1287, 1288, 3, 521, 260, 0, 1288, 1289, 3, 515, 257, 0, 1289, 1290, 3, 549, 274, 0, 1290, 1291, 3, 521, 260, 0, 1291, 216, 1, 0, 0, 0, 1292, 1293, 3, 521, 260, 0, 1293, 1294, 3, 531, 265, 0, 1294, 1295, 3, 551, 275, 0, 1295, 1296, 3, 553, 276, 0, 1296, 1297, 3, 515, 257, 0, 1297, 1298, 3, 541, 270, 0, 1298, 1299, 3, 519, 259, 0, 1299, 1300, 3, 523, 261, 0, 1300, 218, 1, 0, 0, 0, 1301, 1302, 3, 527, 263, 0, 1302, 1303, 3, 523, 261, 0, 1303, 1304, 3, 543, 271, 0, 1304, 1305, 3, 537, 268, 0, 1305, 1306, 3, 543, 271, 0, 1306, 1307, 3, 519, 259, 0, 1307, 1308, 3, 515, 257, 0, 1308, 1309, 3, 553, 276, 0, 1309, 1310, 3, 531, 265, 0, 1310, 1311, 3, 543, 271, 0, 1311, 1312, 3, 541, 270, 0, 1312, 220, 1, 0, 0, 0, 1313, 1314, 3, 527, 263, 0, 1314, 1315, 3, 549, 274, 0, 1315, 1316, 3, 543, 271, 0, 1316, 1317, 3, 555, 277, 0, 1317, 1318, 3, 545, 272, 0, 1318, 1319, 3, 531, 265, 0, 1319, 1320, 3, 541, 270, 0, 1320, 1321, 3, 527, 263, 0, 1321, 222, 1, 0, 0, 0, 1322, 1323, 3, 519, 259, 0, 1323, 1324, 3, 543, 271, 0, 1324, 1325, 3, 541, 270, 0, 1325, 1326, 3, 557, 278, 0, 1326, 1327, 3, 523, 261, 0, 1327, 1328, 3, 549, 274, 0, 1328, 1329, 3, 553, 276, 0, 1329, 1330, 3, 519, 259, 0, 1330, 1331, 3, 555, 277, 0, 1331, 1332, 3, 549, 274, 0, 1332, 1333, 3, 549, 274, 0, 1333, 1334, 3, 523, 261, 0, 1334, 1335, 3, 541, 270, 0, 1335, 1336, 3, 519, 259, 0, 1336, 1337, 3, 563, 281, 0, 1337, 224, 1, 0, 0, 0, 1338, 1339, 3, 519, 259, 0, 1339, 1340, 3, 515, 257, 0, 1340, 1341, 3, 537, 268, 0, 1341, 1342, 3, 523, 261, 0, 1342, 1343, 3, 541, 270, 0, 1343, 1344, 3, 521, 260, 0, 1344, 1345, 3, 515, 257, 0, 1345, 1346, 3, 549, 274, 0, 1346, 1347, 5, 95, 0, 0, 1347, 1348, 3, 539, 269, 0, 1348, 1349, 3, 543, 271, 0, 1349, 1350, 3, 541, 270, 0, 1350, 1351, 3, 553, 276, 0, 1351, 1352, 3, 529, 264, 0, 1352, 226, 1, 0, 0, 0, 1353, 1354, 3, 519, 259, 0, 1354, 1355, 3, 515, 257, 0, 1355, 1356, 3, 537, 268, 0, 1356, 1357, 3, 523, 261, 0, 1357, 1358, 3, 541, 270, 0, 1358, 1359, 3, 521, 260, 0, 1359, 1360, 3, 515, 257, 0, 1360, 1361, 3, 549, 274, 0, 1361, 1362, 5, 95, 0, 0, 1362, 1363, 3, 547, 273, 0, 1363, 1364, 3, 555, 277, 0, 1364, 1365, 3, 515, 257, 0, 1365, 1366, 3, 549, 274, 0, 1366, 1367, 3, 553, 276, 0, 1367, 1368, 3, 523, 261, 0, 1368, 1369, 3, 549, 274, 0, 1369, 228, 1, 0, 0, 0, 1370, 1371, 3, 519, 259, 0, 1371, 1372, 3, 515, 257, 0, 1372, 1373, 3, 537, 268, 0, 1373, 1374, 3, 523, 261, 0, 1374, 1375, 3, 541, 270, 0, 1375, 1376, 3, 521, 260, 0, 1376, 1377, 3, 515, 257, 0, 1377, 1378, 3, 549, 274, 0, 1378, 1379, 5, 95, 0, 0, 1379, 1380, 3, 563, 281, 0, 1380, 1381, 3, 523, 261, 0, 1381, 1382, 3, 515, 257, 0, 1382, 1383, 3, 549, 274, 0, 1383, 230, 1, 0, 0, 0, 1384, 1385, 3, 521, 260, 0, 1385, 1386, 3, 515, 257, 0, 1386, 1387, 3, 563, 281, 0, 1387, 1388, 5, 95, 0, 0, 1388, 1389, 3, 531, 265, 0, 1389, 1390, 3, 541, 270, 0, 1390, 1391, 5, 95, 0, 0, 1391, 1392, 3, 539, 269, 0, 1392, 1393, 3, 543, 271, 0, 1393, 1394, 3, 541, 270, 0, 1394, 1395, 3, 553, 276, 0, 1395, 1396, 3, 529, 264, 0, 1396, 232, 1, 0, 0, 0, 1397, 1398, 3, 521, 260, 0, 1398, 1399, 3, 515, 257, 0, 1399, 1400, 3, 563, 281, 0, 1400, 1401, 5, 95, 0, 0, 1401, 1402, 3, 531, 265, 0, 1402, 1403, 3, 541, 270, 0, 1403, 1404, 5, 95, 0, 0, 1404, 1405, 3, 559, 279, 0, 1405, 1406, 3, 523, 261, 0, 1406, 1407, 3, 523, 261, 0, 1407, 1408, 3, 535, 267, 0, 1408, 234, 1, 0, 0, 0, 1409, 1410, 3, 521, 260, 0, 1410, 1411, 3, 515, 257, 0, 1411, 1412, 3, 563, 281, 0, 1412, 1413, 5, 95, 0, 0, 1413, 1414, 3, 531, 265, 0, 1414, 1415, 3, 541, 270, 0, 1415, 1416, 5, 95, 0, 0, 1416, 1417, 3, 563, 281, 0, 1417, 1418, 3, 523, 261, 0, 1418, 1419, 3, 515, 257, 0, 1419, 1420, 3, 549, 274, 0, 1420, 236, 1, 0, 0, 0, 1421, 1422, 3, 521, 260, 0, 1422, 1423, 3, 515, 257, 0, 1423, 1424, 3, 563, 281, 0, 1424, 1425, 5, 95, 0, 0, 1425, 1426, 3, 543, 271, 0, 1426, 1427, 3, 541, 270, 0, 1427, 1428, 3, 537, 268, 0, 1428, 1429, 3, 563, 281, 0, 1429, 238, 1, 0, 0, 0, 1430, 1431, 3, 525, 262, 0, 1431, 1432, 3, 531, 265, 0, 1432, 1433, 3, 551, 275, 0, 1433, 1434, 3, 519, 259, 0, 1434, 1435, 3, 515, 257, 0, 1435, 1436, 3, 537, 268, 0, 1436, 1437, 5, 95, 0, 0, 1437, 1438, 3, 539, 269, 0, 1438, 1439, 3, 543, 271, 0, 1439, 1440, 3, 541, 270, 0, 1440, 1441, 3, 553, 276, 0, 1441, 1442, 3, 529, 264, 0, 1442, 240, 1, 0, 0, 0, 1443, 1444, 3, 525, 262, 0, 1444, 1445, 3, 531, 265, 0, 1445, 1446, 3, 551, 275, 0, 1446, 1447, 3, 519, 259, 0, 1447, 1448, 3, 515, 257, 0, 1448, 1449, 3, 537, 268, 0, 1449, 1450, 5, 95, 0, 0, 1450, 1451, 3, 547, 273, 0, 1451, 1452, 3, 555, 277, 0, 1452, 1453, 3, 515, 257, 0, 1453, 1454, 3, 549, 274, 0, 1454, 1455, 3, 553, 276, 0, 1455, 1456, 3, 523, 261, 0, 1456, 1457, 3, 549, 274, 0, 1457, 242, 1, 0, 0, 0, 1458, 1459, 3, 525, 262, 0, 1459, 1460, 3, 531, 265, 0, 1460, 1461, 3, 551, 275, 0, 1461, 1462, 3, 519, 259, 0, 1462, 1463, 3, 515, 257, 0, 1463, 1464, 3, 537, 268, 0, 1464, 1465, 5, 95, 0, 0, 1465, 1466, 3, 563, 281, 0, 1466, 1467, 3, 523, 261, 0, 1467, 1468, 3, 515, 257, 0, 1468, 1469, 3, 549, 274, 0, 1469, 244, 1, 0, 0, 0, 1470, 1471, 3, 529, 264, 0, 1471, 1472, 3, 543, 271, 0, 1472, 1473, 3, 555, 277, 0, 1473, 1474, 3, 549, 274, 0, 1474, 1475, 5, 95, 0, 0, 1475, 1476, 3, 531, 265, 0, 1476, 1477, 3, 541, 270, 0, 1477, 1478, 5, 95, 0, 0, 1478, 1479, 3, 521, 260, 0, 1479, 1480, 3, 515, 257, 0, 1480, 1481, 3, 563, 281, 0, 1481, 246, 1, 0, 0, 0, 1482, 1483, 3, 559, 279, 0, 1483, 1484, 3, 523, 261, 0, 1484, 1485, 3, 523, 261, 0, 1485, 1486, 3, 535, 267, 0, 1486, 1487, 5, 95, 0, 0, 1487, 1488, 3, 531, 265, 0, 1488, 1489, 3, 541, 270, 0, 1489, 1490, 5, 95, 0, 0, 1490, 1491, 3, 539, 269, 0, 1491, 1492, 3, 543, 271, 0, 1492, 1493, 3, 541, 270, 0, 1493, 1494, 3, 553, 276, 0, 1494, 1495, 3, 529, 264, 0, 1495, 248, 1, 0, 0, 0, 1496, 1497, 3, 559, 279, 0, 1497, 1498, 3, 523, 261, 0, 1498, 1499, 3, 523, 261, 0, 1499, 1500, 3, 535, 267, 0, 1500, 1501, 5, 95, 0, 0, 1501, 1502, 3, 531, 265, 0, 1502, 1503, 3, 541, 270, 0, 1503, 1504, 5, 95, 0, 0, 1504, 1505, 3, 563, 281, 0, 1505, 1506, 3, 523, 261, 0, 1506, 1507, 3, 515, 257, 0, 1507, 1508, 3, 549, 274, 0, 1508, 250, 1, 0, 0, 0, 1509, 1510, 3, 519, 259, 0, 1510, 1511, 3, 543, 271, 0, 1511, 1512, 3, 541, 270, 0, 1512, 1513, 3, 557, 278, 0, 1513, 1514, 3, 523, 261, 0, 1514, 1515, 3, 549, 274, 0, 1515, 1516, 3, 553, 276, 0, 1516, 1517, 5, 95, 0, 0, 1517, 1518, 3, 553, 276, 0, 1518, 1519, 3, 531, 265, 0, 1519, 1520, 3, 539, 269, 0, 1520, 1521, 3, 523, 261, 0, 1521, 1522, 3, 565, 282, 0, 1522, 1523, 3, 543, 271, 0, 1523, 1524, 3, 541, 270, 0, 1524, 1525, 3, 523, 261, 0, 1525, 252, 1, 0, 0, 0, 1526, 1527, 3, 563, 281, 0, 1527, 1528, 3, 523, 261, 0, 1528, 1529, 3, 551, 275, 0, 1529, 1530, 3, 553, 276, 0, 1530, 1531, 3, 523, 261, 0, 1531, 1532, 3, 549, 274, 0, 1532, 1533, 3, 521, 260, 0, 1533, 1534, 3, 515, 257, 0, 1534, 1535, 3, 563, 281, 0, 1535, 254, 1, 0, 0, 0, 1536, 1537, 3, 553, 276, 0, 1537, 1538, 3, 543, 271, 0, 1538, 1539, 3, 521, 260, 0, 1539, 1540, 3, 515, 257, 0, 1540, 1541, 3, 563, 281, 0, 1541, 256, 1, 0, 0, 0, 1542, 1543, 3, 553, 276, 0, 1543, 1544, 3, 543, 271, 0, 1544, 1545, 3, 539, 269, 0, 1545, 1546, 3, 543, 271, 0, 1546, 1547, 3, 549, 274, 0, 1547, 1548, 3, 549, 274, 0, 1548, 1549, 3, 543, 271, 0, 1549, 1550, 3, 559, 279, 0, 1550, 258, 1, 0, 0, 0, 1551, 1552, 3, 537, 268, 0, 1552, 1553, 3, 515, 257, 0, 1553, 1554, 3, 551, 275, 0, 1554, 1555, 3, 553, 276, 0, 1555, 1556, 5, 95, 0, 0, 1556, 1557, 3, 559, 279, 0, 1557, 1558, 3, 523, 261, 0, 1558, 1559, 3, 523, 261, 0, 1559, 1560, 3, 535, 267, 0, 1560, 260, 1, 0, 0, 0, 1561, 1562, 3, 553, 276, 0, 1562, 1563, 3, 529, 264, 0, 1563, 1564, 3, 531, 265, 0, 1564, 1565, 3, 551, 275, 0, 1565, 1566, 5, 95, 0, 0, 1566, 1567, 3, 559, 279, 0, 1567, 1568, 3, 523, 261, 0, 1568, 1569, 3, 523, 261, 0, 1569, 1570, 3, 535, 267, 0, 1570, 262, 1, 0, 0, 0, 1571, 1572, 3, 541, 270, 0, 1572, 1573, 3, 523, 261, 0, 1573, 1574, 3, 561, 280, 0, 1574, 1575, 3, 553, 276, 0, 1575, 1576, 5, 95, 0, 0, 1576, 1577, 3, 559, 279, 0, 1577, 1578, 3, 523, 261, 0, 1578, 1579, 3, 523, 261, 0, 1579, 1580, 3, 535, 267, 0, 1580, 264, 1, 0, 0, 0, 1581, 1582, 3, 537, 268, 0, 1582, 1583, 3, 515, 257, 0, 1583, 1584, 3, 551, 275, 0, 1584, 1585, 3, 553, 276, 0, 1585, 1586, 5, 95, 0, 0, 1586, 1587, 3, 539, 269, 0, 1587, 1588, 3, 543, 271, 0, 1588, 1589, 3, 541, 270, 0, 1589, 1590, 3, 553, 276, 0, 1590, 1591, 3, 529, 264, 0, 1591, 266, 1, 0, 0, 0, 1592, 1593, 3, 553, 276, 0, 1593, 1594, 3, 529, 264, 0, 1594, 1595, 3, 531, 265, 0, 1595, 1596, 3, 551, 275, 0, 1596, 1597, 5, 95, 0, 0, 1597, 1598, 3, 539, 269, 0, 1598, 1599, 3, 543, 271, 0, 1599, 1600, 3, 541, 270, 0, 1600, 1601, 3, 553, 276, 0, 1601, 1602, 3, 529, 264, 0, 1602, 268, 1, 0, 0, 0, 1603, 1604, 3, 541, 270, 0, 1604, 1605, 3, 523, 261, 0, 1605, 1606, 3, 561, 280, 0, 1606, 1607, 3, 553, 276, 0, 1607, 1608, 5, 95, 0, 0, 1608, 1609, 3, 539, 269, 0, 1609, 1610, 3, 543, 271, 0, 1610, 1611, 3, 541, 270, 0, 1611, 1612, 3, 553, 276, 0, 1612, 1613, 3, 529, 264, 0, 1613, 270, 1, 0, 0, 0, 1614, 1615, 3, 537, 268, 0, 1615, 1616, 3, 515, 257, 0, 1616, 1617, 3, 551, 275, 0, 1617, 1618, 3, 553, 276, 0, 1618, 1619, 5, 95, 0, 0, 1619, 1620, 5, 57, 0, 0, 1620, 1621, 5, 48, 0, 0, 1621, 1622, 5, 95, 0, 0, 1622, 1623, 1, 0, 0, 0, 1623, 1624, 3, 521, 260, 0, 1624, 1625, 3, 515, 257, 0, 1625, 1626, 3, 563, 281, 0, 1626, 1627, 3, 551, 275, 0, 1627, 272, 1, 0, 0, 0, 1628, 1629, 3, 541, 270, 0, 1629, 1630, 3, 523, 261, 0, 1630, 1631, 3, 561, 280, 0, 1631, 1632, 3, 553, 276, 0, 1632, 1633, 5, 95, 0, 0, 1633, 1634, 5, 57, 0, 0, 1634, 1635, 5, 48, 0, 0, 1635, 1636, 5, 95, 0, 0, 1636, 1637, 1, 0, 0, 0, 1637, 1638, 3, 521, 260, 0, 1638, 1639, 3, 515, 257, 0, 1639, 1640, 3, 563, 281, 0, 1640, 1641, 3, 551, 275, 0, 1641, 274, 1, 0, 0, 0, 1642, 1643, 3, 537, 268, 0, 1643, 1644, 3, 515, 257, 0, 1644, 1645, 3, 551, 275, 0, 1645, 1646, 3, 553, 276, 0, 1646, 1647, 5, 95, 0, 0, 1647, 1648, 3, 541, 270, 0, 1648, 1649, 5, 95, 0, 0, 1649, 1650, 3, 521, 260, 0, 1650, 1651, 3, 515, 257, 0, 1651, 1652, 3, 563, 281, 0, 1652, 1653, 3, 551, 275, 0, 1653, 276, 1, 0, 0, 0, 1654, 1655, 3, 541, 270, 0, 1655, 1656, 3, 523, 261, 0, 1656, 1657, 3, 561, 280, 0, 1657, 1658, 3, 553, 276, 0, 1658, 1659, 5, 95, 0, 0, 1659, 1660, 3, 541, 270, 0, 1660, 1661, 5, 95, 0, 0, 1661, 1662, 3, 521, 260, 0, 1662, 1663, 3, 515, 257, 0, 1663, 1664, 3, 563, 281, 0, 1664, 1665, 3, 551, 275, 0, 1665, 278, 1, 0, 0, 0, 1666, 1667, 3, 541, 270, 0, 1667, 1668, 3, 523, 261, 0, 1668, 1669, 3, 561, 280, 0, 1669, 1670, 3, 553, 276, 0, 1670, 1671, 5, 95, 0, 0, 1671, 1672, 3, 541, 270, 0, 1672, 1673, 5, 95, 0, 0, 1673, 1674, 3, 559, 279, 0, 1674, 1675, 3, 523, 261, 0, 1675, 1676, 3, 523, 261, 0, 1676, 1677, 3, 535, 267, 0, 1677, 1678, 3, 551, 275, 0, 1678, 280, 1, 0, 0, 0, 1679, 1680, 3, 537, 268, 0, 1680, 1681, 3, 515, 257, 0, 1681, 1682, 3, 551, 275, 0, 1682, 1683, 3, 553, 276, 0, 1683, 1684, 5, 95, 0, 0, 1684, 1685, 3, 541, 270, 0, 1685, 1686, 5, 95, 0, 0, 1686, 1687, 3, 559, 279, 0, 1687, 1688, 3, 523, 261, 0, 1688, 1689, 3, 523, 261, 0, 1689, 1690, 3, 535, 267, 0, 1690, 1691, 3, 551, 275, 0, 1691, 282, 1, 0, 0, 0, 1692, 1693, 3, 541, 270, 0, 1693, 1694, 3, 523, 261, 0, 1694, 1695, 3, 561, 280, 0, 1695, 1696, 3, 553, 276, 0, 1696, 1697, 5, 95, 0, 0, 1697, 1698, 3, 541, 270, 0, 1698, 1699, 5, 95, 0, 0, 1699, 1700, 3, 539, 269, 0, 1700, 1701, 3, 543, 271, 0, 1701, 1702, 3, 541, 270, 0, 1702, 1703, 3, 553, 276, 0, 1703, 1704, 3, 529, 264, 0, 1704, 1705, 3, 551, 275, 0, 1705, 284, 1, 0, 0, 0, 1706, 1707, 3, 537, 268, 0, 1707, 1708, 3, 515, 257, 0, 1708, 1709, 3, 551, 275, 0, 1709, 1710, 3, 553, 276, 0, 1710, 1711, 5, 95, 0, 0, 1711, 1712, 3, 541, 270, 0, 1712, 1713, 5, 95, 0, 0, 1713, 1714, 3, 539, 269, 0, 1714, 1715, 3, 543, 271, 0, 1715, 1716, 3, 541, 270, 0, 1716, 1717, 3, 553, 276, 0, 1717, 1718, 3, 529, 264, 0, 1718, 1719, 3, 551, 275, 0, 1719, 286, 1, 0, 0, 0, 1720, 1721, 3, 553, 276, 0, 1721, 1722, 3, 529, 264, 0, 1722, 1723, 3, 531, 265, 0, 1723, 1724, 3, 551, 275, 0, 1724, 1725, 5, 95, 0, 0, 1725, 1726, 3, 547, 273, 0, 1726, 1727, 3, 555, 277, 0, 1727, 1728, 3, 515, 257, 0, 1728, 1729, 3, 549, 274, 0, 1729, 1730, 3, 553, 276, 0, 1730, 1731, 3, 523, 261, 0, 1731, 1732, 3, 549, 274, 0, 1732, 288, 1, 0, 0, 0, 1733, 1734, 3, 537, 268, 0, 1734, 1735, 3, 515, 257, 0, 1735, 1736, 3, 551, 275, 0, 1736, 1737, 3, 553, 276, 0, 1737, 1738, 5, 95, 0, 0, 1738, 1739, 3, 547, 273, 0, 1739, 1740, 3, 555, 277, 0, 1740, 1741, 3, 515, 257, 0, 1741, 1742, 3, 549, 274, 0, 1742, 1743, 3, 553, 276, 0, 1743, 1744, 3, 523, 261, 0, 1744, 1745, 3, 549, 274, 0, 1745, 290, 1, 0, 0, 0, 1746, 1747, 3, 541, 270, 0, 1747, 1748, 3, 523, 261, 0, 1748, 1749, 3, 561, 280, 0, 1749, 1750, 3, 553, 276, 0, 1750, 1751, 5, 95, 0, 0, 1751, 1752, 3, 547, 273, 0, 1752, 1753, 3, 555, 277, 0, 1753, 1754, 3, 515, 257, 0, 1754, 1755, 3, 549, 274, 0, 1755, 1756, 3, 553, 276, 0, 1756, 1757, 3, 523, 261, 0, 1757, 1758, 3, 549, 274, 0, 1758, 292, 1, 0, 0, 0, 1759, 1760, 3, 541, 270, 0, 1760, 1761, 3, 523, 261, 0, 1761, 1762, 3, 561, 280, 0, 1762, 1763, 3, 553, 276, 0, 1763, 1764, 5, 95, 0, 0, 1764, 1765, 3, 541, 270, 0, 1765, 1766, 5, 95, 0, 0, 1766, 1767, 3, 547, 273, 0, 1767, 1768, 3, 555, 277, 0, 1768, 1769, 3, 515, 257, 0, 1769, 1770, 3, 549, 274, 0, 1770, 1771, 3, 553, 276, 0, 1771, 1772, 3, 523, 261, 0, 1772, 1773, 3, 549, 274, 0, 1773, 1774, 3, 551, 275, 0, 1774, 294, 1, 0, 0, 0, 1775, 1776, 3, 537, 268, 0, 1776, 1777, 3, 515, 257, 0, 1777, 1778, 3, 551, 275, 0, 1778, 1779, 3, 553, 276, 0, 1779, 1780, 5, 95, 0, 0, 1780, 1781, 3, 541, 270, 0, 1781, 1782, 5, 95, 0, 0, 1782, 1783, 3, 547, 273, 0, 1783, 1784, 3, 555, 277, 0, 1784, 1785, 3, 515, 257, 0, 1785, 1786, 3, 549, 274, 0, 1786, 1787, 3, 553, 276, 0, 1787, 1788, 3, 523, 261, 0, 1788, 1789, 3, 549, 274, 0, 1789, 1790, 3, 551, 275, 0, 1790, 296, 1, 0, 0, 0, 1791, 1792, 3, 553, 276, 0, 1792, 1793, 3, 529, 264, 0, 1793, 1794, 3, 531, 265, 0, 1794, 1795, 3, 551, 275, 0, 1795, 1796, 5, 95, 0, 0, 1796, 1797, 3, 563, 281, 0, 1797, 1798, 3, 523, 261, 0, 1798, 1799, 3, 515, 257, 0, 1799, 1800, 3, 549, 274, 0, 1800, 298, 1, 0, 0, 0, 1801, 1802, 3, 537, 268, 0, 1802, 1803, 3, 515, 257, 0, 1803, 1804, 3, 551, 275, 0, 1804, 1805, 3, 553, 276, 0, 1805, 1806, 5, 95, 0, 0, 1806, 1807, 3, 563, 281, 0, 1807, 1808, 3, 523, 261, 0, 1808, 1809, 3, 515, 257, 0, 1809, 1810, 3, 549, 274, 0, 1810, 300, 1, 0, 0, 0, 1811, 1812, 3, 541, 270, 0, 1812, 1813, 3, 523, 261, 0, 1813, 1814, 3, 561, 280, 0, 1814, 1815, 3, 553, 276, 0, 1815, 1816, 5, 95, 0, 0, 1816, 1817, 3, 563, 281, 0, 1817, 1818, 3, 523, 261, 0, 1818, 1819, 3, 515, 257, 0, 1819, 1820, 3, 549, 274, 0, 1820, 302, 1, 0, 0, 0, 1821, 1822, 3, 541, 270, 0, 1822, 1823, 3, 523, 261, 0, 1823, 1824, 3, 561, 280, 0, 1824, 1825, 3, 553, 276, 0, 1825, 1826, 5, 95, 0, 0, 1826, 1827, 3, 541, 270, 0, 1827, 1828, 5, 95, 0, 0, 1828, 1829, 3, 563, 281, 0, 1829, 1830, 3, 523, 261, 0, 1830, 1831, 3, 515, 257, 0, 1831, 1832, 3, 549, 274, 0, 1832, 1833, 3, 551, 275, 0, 1833, 304, 1, 0, 0, 0, 1834, 1835, 3, 537, 268, 0, 1835, 1836, 3, 515, 257, 0, 1836, 1837, 3, 551, 275, 0, 1837, 1838, 3, 553, 276, 0, 1838, 1839, 5, 95, 0, 0, 1839, 1840, 3, 541, 270, 0, 1840, 1841, 5, 95, 0, 0, 1841, 1842, 3, 563, 281, 0, 1842, 1843, 3, 523, 261, 0, 1843, 1844, 3, 515, 257, 0, 1844, 1845, 3, 549, 274, 0, 1845, 1846, 3, 551, 275, 0, 1846, 306, 1, 0, 0, 0, 1847, 1848, 3, 553, 276, 0, 1848, 1849, 3, 529, 264, 0, 1849, 1850, 3, 531, 265, 0, 1850, 1851, 3, 551, 275, 0, 1851, 1852, 5, 95, 0, 0, 1852, 1853, 3, 525, 262, 0, 1853, 1854, 3, 531, 265, 0, 1854, 1855, 3, 551, 275, 0, 1855, 1856, 3, 519, 259, 0, 1856, 1857, 3, 515, 257, 0, 1857, 1858, 3, 537, 268, 0, 1858, 1859, 5, 95, 0, 0, 1859, 1860, 3, 547, 273, 0, 1860, 1861, 3, 555, 277, 0, 1861, 1862, 3, 515, 257, 0, 1862, 1863, 3, 549, 274, 0, 1863, 1864, 3, 553, 276, 0, 1864, 1865, 3, 523, 261, 0, 1865, 1866, 3, 549, 274, 0, 1866, 308, 1, 0, 0, 0, 1867, 1868, 3, 537, 268, 0, 1868, 1869, 3, 515, 257, 0, 1869, 1870, 3, 551, 275, 0, 1870, 1871, 3, 553, 276, 0, 1871, 1872, 5, 95, 0, 0, 1872, 1873, 3, 525, 262, 0, 1873, 1874, 3, 531, 265, 0, 1874, 1875, 3, 551, 275, 0, 1875, 1876, 3, 519, 259, 0, 1876, 1877, 3, 515, 257, 0, 1877, 1878, 3, 537, 268, 0, 1878, 1879, 5, 95, 0, 0, 1879, 1880, 3, 547, 273, 0, 1880, 1881, 3, 555, 277, 0, 1881, 1882, 3, 515, 257, 0, 1882, 1883, 3, 549, 274, 0, 1883, 1884, 3, 553, 276, 0, 1884, 1885, 3, 523, 261, 0, 1885, 1886, 3, 549, 274, 0, 1886, 310, 1, 0, 0, 0, 1887, 1888, 3, 541, 270, 0, 1888, 1889, 3, 523, 261, 0, 1889, 1890, 3, 561, 280, 0, 1890, 1891, 3, 553, 276, 0, 1891, 1892, 5, 95, 0, 0, 1892, 1893, 3, 525, 262, 0, 1893, 1894, 3, 531, 265, 0, 1894, 1895, 3, 551, 275, 0, 1895, 1896, 3, 519, 259, 0, 1896, 1897, 3, 515, 257, 0, 1897, 1898, 3, 537, 268, 0, 1898, 1899, 5, 95, 0, 0, 1899, 1900, 3, 547, 273, 0, 1900, 1901, 3, 555, 277, 0, 1901, 1902, 3, 515, 257, 0, 1902, 1903, 3, 549, 274, 0, 1903, 1904, 3, 553, 276, 0, 1904, 1905, 3, 523, 261, 0, 1905, 1906, 3, 549, 274, 0, 1906, 312, 1, 0, 0, 0, 1907, 1908, 3, 541, 270, 0, 1908, 1909, 3, 523, 261, 0, 1909, 1910, 3, 561, 280, 0, 1910, 1911, 3, 553, 276, 0, 1911, 1912, 5, 95, 0, 0, 1912, 1913, 3, 541, 270, 0, 1913, 1914, 5, 95, 0, 0, 1914, 1915, 3, 525, 262, 0, 1915, 1916, 3, 531, 265, 0, 1916, 1917, 3, 551, 275, 0, 1917, 1918, 3, 519, 259, 0, 1918, 1919, 3, 515, 257, 0, 1919, 1920, 3, 537, 268, 0, 1920, 1921, 5, 95, 0, 0, 1921, 1922, 3, 547, 273, 0, 1922, 1923, 3, 555, 277, 0, 1923, 1924, 3, 515, 257, 0, 1924, 1925, 3, 549, 274, 0, 1925, 1926, 3, 553, 276, 0, 1926, 1927, 3, 523, 261, 0, 1927, 1928, 3, 549, 274, 0, 1928, 1929, 3, 551, 275, 0, 1929, 314, 1, 0, 0, 0, 1930, 1931, 3, 537, 268, 0, 1931, 1932, 3, 515, 257, 0, 1932, 1933, 3, 551, 275, 0, 1933, 1934, 3, 553, 276, 0, 1934, 1935, 5, 95, 0, 0, 1935, 1936, 3, 541, 270, 0, 1936, 1937, 5, 95, 0, 0, 1937, 1938, 3, 525, 262, 0, 1938, 1939, 3, 531, 265, 0, 1939, 1940, 3, 551, 275, 0, 1940, 1941, 3, 519, 259, 0, 1941, 1942, 3, 515, 257, 0, 1942, 1943, 3, 537, 268, 0, 1943, 1944, 5, 95, 0, 0, 1944, 1945, 3, 547, 273, 0, 1945, 1946, 3, 555, 277, 0, 1946, 1947, 3, 515, 257, 0, 1947, 1948, 3, 549, 274, 0, 1948, 1949, 3, 553, 276, 0, 1949, 1950, 3, 523, 261, 0, 1950, 1951, 3, 549, 274, 0, 1951, 1952, 3, 551, 275, 0, 1952, 316, 1, 0, 0, 0, 1953, 1954, 3, 553, 276, 0, 1954, 1955, 3, 529, 264, 0, 1955, 1956, 3, 531, 265, 0, 1956, 1957, 3, 551, 275, 0, 1957, 1958, 5, 95, 0, 0, 1958, 1959, 3, 525, 262, 0, 1959, 1960, 3, 531, 265, 0, 1960, 1961, 3, 551, 275, 0, 1961, 1962, 3, 519, 259, 0, 1962, 1963, 3, 515, 257, 0, 1963, 1964, 3, 537, 268, 0, 1964, 1965, 5, 95, 0, 0, 1965, 1966, 3, 563, 281, 0, 1966, 1967, 3, 523, 261, 0, 1967, 1968, 3, 515, 257, 0, 1968, 1969, 3, 549, 274, 0, 1969, 318, 1, 0, 0, 0, 1970, 1971, 3, 537, 268, 0, 1971, 1972, 3, 515, 257, 0, 1972, 1973, 3, 551, 275, 0, 1973, 1974, 3, 553, 276, 0, 1974, 1975, 5, 95, 0, 0, 1975, 1976, 3, 525, 262, 0, 1976, 1977, 3, 531, 265, 0, 1977, 1978, 3, 551, 275, 0, 1978, 1979, 3, 519, 259, 0, 1979, 1980, 3, 515, 257, 0, 1980, 1981, 3, 537, 268, 0, 1981, 1982, 5, 95, 0, 0, 1982, 1983, 3, 563, 281, 0, 1983, 1984, 3, 523, 261, 0, 1984, 1985, 3, 515, 257, 0, 1985, 1986, 3, 549, 274, 0, 1986, 320, 1, 0, 0, 0, 1987, 1988, 3, 541, 270, 0, 1988, 1989, 3, 523, 261, 0, 1989, 1990, 3, 561, 280, 0, 1990, 1991, 3, 553, 276, 0, 1991, 1992, 5, 95, 0, 0, 1992, 1993, 3, 525, 262, 0, 1993, 1994, 3, 531, 265, 0, 1994, 1995, 3, 551, 275, 0, 1995, 1996, 3, 519, 259, 0, 1996, 1997, 3, 515, 257, 0, 1997, 1998, 3, 537, 268, 0, 1998, 1999, 5, 95, 0, 0, 1999, 2000, 3, 563, 281, 0, 2000, 2001, 3, 523, 261, 0, 2001, 2002, 3, 515, 257, 0, 2002, 2003, 3, 549, 274, 0, 2003, 322, 1, 0, 0, 0, 2004, 2005, 3, 541, 270, 0, 2005, 2006, 3, 523, 261, 0, 2006, 2007, 3, 561, 280, 0, 2007, 2008, 3, 553, 276, 0, 2008, 2009, 5, 95, 0, 0, 2009, 2010, 3, 541, 270, 0, 2010, 2011, 5, 95, 0, 0, 2011, 2012, 3, 525, 262, 0, 2012, 2013, 3, 531, 265, 0, 2013, 2014, 3, 551, 275, 0, 2014, 2015, 3, 519, 259, 0, 2015, 2016, 3, 515, 257, 0, 2016, 2017, 3, 537, 268, 0, 2017, 2018, 5, 95, 0, 0, 2018, 2019, 3, 563, 281, 0, 2019, 2020, 3, 523, 261, 0, 2020, 2021, 3, 515, 257, 0, 2021, 2022, 3, 549, 274, 0, 2022, 2023, 3, 551, 275, 0, 2023, 324, 1, 0, 0, 0, 2024, 2025, 3, 537, 268, 0, 2025, 2026, 3, 515, 257, 0, 2026, 2027, 3, 551, 275, 0, 2027, 2028, 3, 553, 276, 0, 2028, 2029, 5, 95, 0, 0, 2029, 2030, 3, 541, 270, 0, 2030, 2031, 5, 95, 0, 0, 2031, 2032, 3, 525, 262, 0, 2032, 2033, 3, 531, 265, 0, 2033, 2034, 3, 551, 275, 0, 2034, 2035, 3, 519, 259, 0, 2035, 2036, 3, 515, 257, 0, 2036, 2037, 3, 537, 268, 0, 2037, 2038, 5, 95, 0, 0, 2038, 2039, 3, 563, 281, 0, 2039, 2040, 3, 523, 261, 0, 2040, 2041, 3, 515, 257, 0, 2041, 2042, 3, 549, 274, 0, 2042, 2043, 3, 551, 275, 0, 2043, 326, 1, 0, 0, 0, 2044, 2045, 3, 541, 270, 0, 2045, 2046, 5, 95, 0, 0, 2046, 2047, 3, 521, 260, 0, 2047, 2048, 3, 515, 257, 0, 2048, 2049, 3, 563, 281, 0, 2049, 2050, 3, 551, 275, 0, 2050, 2051, 5, 95, 0, 0, 2051, 2052, 3, 515, 257, 0, 2052, 2053, 3, 527, 263, 0, 2053, 2054, 3, 543, 271, 0, 2054, 328, 1, 0, 0, 0, 2055, 2056, 3, 541, 270, 0, 2056, 2057, 5, 95, 0, 0, 2057, 2058, 3, 559, 279, 0, 2058, 2059, 3, 523, 261, 0, 2059, 2060, 3, 523, 261, 0, 2060, 2061, 3, 535, 267, 0, 2061, 2062, 3, 551, 275, 0, 2062, 2063, 5, 95, 0, 0, 2063, 2064, 3, 515, 257, 0, 2064, 2065, 3, 527, 263, 0, 2065, 2066, 3, 543, 271, 0, 2066, 330, 1, 0, 0, 0, 2067, 2068, 3, 541, 270, 0, 2068, 2069, 5, 95, 0, 0, 2069, 2070, 3, 539, 269, 0, 2070, 2071, 3, 543, 271, 0, 2071, 2072, 3, 541, 270, 0, 2072, 2073, 3, 553, 276, 0, 2073, 2074, 3, 529, 264, 0, 2074, 2075, 3, 551, 275, 0, 2075, 2076, 5, 95, 0, 0, 2076, 2077, 3, 515, 257, 0, 2077, 2078, 3, 527, 263, 0, 2078, 2079, 3, 543, 271, 0, 2079, 332, 1, 0, 0, 0, 2080, 2081, 3, 541, 270, 0, 2081, 2082, 5, 95, 0, 0, 2082, 2083, 3, 547, 273, 0, 2083, 2084, 3, 555, 277, 0, 2084, 2085, 3, 515, 257, 0, 2085, 2086, 3, 549, 274, 0, 2086, 2087, 3, 553, 276, 0, 2087, 2088, 3, 523, 261, 0, 2088, 2089, 3, 549, 274, 0, 2089, 2090, 3, 551, 275, 0, 2090, 2091, 5, 95, 0, 0, 2091, 2092, 3, 515, 257, 0, 2092, 2093, 3, 527, 263, 0, 2093, 2094, 3, 543, 271, 0, 2094, 334, 1, 0, 0, 0, 2095, 2096, 3, 541, 270, 0, 2096, 2097, 5, 95, 0, 0, 2097, 2098, 3, 525, 262, 0, 2098, 2099, 3, 531, 265, 0, 2099, 2100, 3, 551, 275, 0, 2100, 2101, 3, 519, 259, 0, 2101, 2102, 3, 515, 257, 0, 2102, 2103, 3, 537, 268, 0, 2103, 2104, 5, 95, 0, 0, 2104, 2105, 3, 547, 273, 0, 2105, 2106, 3, 555, 277, 0, 2106, 2107, 3, 515, 257, 0, 2107, 2108, 3, 549, 274, 0, 2108, 2109, 3, 553, 276, 0, 2109, 2110, 3, 523, 261, 0, 2110, 2111, 3, 549, 274, 0, 2111, 2112, 3, 551, 275, 0, 2112, 2113, 5, 95, 0, 0, 2113, 2114, 3, 515, 257, 0, 2114, 2115, 3, 527, 263, 0, 2115, 2116, 3, 543, 271, 0, 2116, 336, 1, 0, 0, 0, 2117, 2118, 3, 541, 270, 0, 2118, 2119, 5, 95, 0, 0, 2119, 2120, 3, 563, 281, 0, 2120, 2121, 3, 523, 261, 0, 2121, 2122, 3, 515, 257, 0, 2122, 2123, 3, 549, 274, 0, 2123, 2124, 3, 551, 275, 0, 2124, 2125, 5, 95, 0, 0, 2125, 2126, 3, 515, 257, 0, 2126, 2127, 3, 527, 263, 0, 2127, 2128, 3, 543, 271, 0, 2128, 338, 1, 0, 0, 0, 2129, 2130, 3, 541, 270, 0, 2130, 2131, 5, 95, 0, 0, 2131, 2132, 3, 525, 262, 0, 2132, 2133, 3, 531, 265, 0, 2133, 2134, 3, 551, 275, 0, 2134, 2135, 3, 519, 259, 0, 2135, 2136, 3, 515, 257, 0, 2136, 2137, 3, 537, 268, 0, 2137, 2138, 5, 95, 0, 0, 2138, 2139, 3, 563, 281, 0, 2139, 2140, 3, 523, 261, 0, 2140, 2141, 3, 515, 257, 0, 2141, 2142, 3, 549, 274, 0, 2142, 2143, 3, 551, 275, 0, 2143, 2144, 5, 95, 0, 0, 2144, 2145, 3, 515, 257, 0, 2145, 2146, 3, 527, 263, 0, 2146, 2147, 3, 543, 271, 0, 2147, 340, 1, 0, 0, 0, 2148, 2149, 3, 399, 199, 0, 2149, 2150, 3, 399, 199, 0, 2150, 2151, 3, 399, 199, 0, 2151, 2152, 3, 399, 199, 0, 2152, 2153, 5, 45, 0, 0, 2153, 2154, 3, 399, 199, 0, 2154, 2155, 3, 399, 199, 0, 2155, 2156, 5, 45, 0, 0, 2156, 2157, 3, 399, 199, 0, 2157, 2158, 3, 399, 199, 0, 2158, 342, 1, 0, 0, 0, 2159, 2160, 3, 399, 199, 0, 2160, 2161, 3, 399, 199, 0, 2161, 2162, 5, 58, 0, 0, 2162, 2163, 3, 399, 199, 0, 2163, 2164, 3, 399, 199, 0, 2164, 2165, 5, 58, 0, 0, 2165, 2166, 3, 399, 199, 0, 2166, 2173, 3, 399, 199, 0, 2167, 2169, 5, 46, 0, 0, 2168, 2170, 3, 399, 199, 0, 2169, 2168, 1, 0, 0, 0, 2170, 2171, 1, 0, 0, 0, 2171, 2169, 1, 0, 0, 0, 2171, 2172, 1, 0, 0, 0, 2172, 2174, 1, 0, 0, 0, 2173, 2167, 1, 0, 0, 0, 2173, 2174, 1, 0, 0, 0, 2174, 2190, 1, 0, 0, 0, 2175, 2191, 3, 565, 282, 0, 2176, 2178, 7, 0, 0, 0, 2177, 2179, 3, 399, 199, 0, 2178, 2177, 1, 0, 0, 0, 2179, 2180, 1, 0, 0, 0, 2180, 2178, 1, 0, 0, 0, 2180, 2181, 1, 0, 0, 0, 2181, 2188, 1, 0, 0, 0, 2182, 2184, 5, 58, 0, 0, 2183, 2185, 3, 399, 199, 0, 2184, 2183, 1, 0, 0, 0, 2185, 2186, 1, 0, 0, 0, 2186, 2184, 1, 0, 0, 0, 2186, 2187, 1, 0, 0, 0, 2187, 2189, 1, 0, 0, 0, 2188, 2182, 1, 0, 0, 0, 2188, 2189, 1, 0, 0, 0, 2189, 2191, 1, 0, 0, 0, 2190, 2175, 1, 0, 0, 0, 2190, 2176, 1, 0, 0, 0, 2191, 344, 1, 0, 0, 0, 2192, 2193, 3, 341, 170, 0, 2193, 2194, 3, 553, 276, 0, 2194, 2195, 3, 343, 171, 0, 2195, 346, 1, 0, 0, 0, 2196, 2197, 7, 1, 0, 0, 2197, 2198, 7, 1, 0, 0, 2198, 2200, 7, 1, 0, 0, 2199, 2201, 3, 399, 199, 0, 2200, 2199, 1, 0, 0, 0, 2201, 2202, 1, 0, 0, 0, 2202, 2200, 1, 0, 0, 0, 2202, 2203, 1, 0, 0, 0, 2203, 348, 1, 0, 0, 0, 2204, 2205, 3, 525, 262, 0, 2205, 2206, 3, 531, 265, 0, 2206, 2207, 3, 541, 270, 0, 2207, 2208, 3, 521, 260, 0, 2208, 350, 1, 0, 0, 0, 2209, 2210, 3, 523, 261, 0, 2210, 2211, 3, 539, 269, 0, 2211, 2212, 3, 515, 257, 0, 2212, 2213, 3, 531, 265, 0, 2213, 2214, 3, 537, 268, 0, 2214, 352, 1, 0, 0, 0, 2215, 2216, 3, 541, 270, 0, 2216, 2217, 3, 515, 257, 0, 2217, 2218, 3, 539, 269, 0, 2218, 2219, 3, 523, 261, 0, 2219, 354, 1, 0, 0, 0, 2220, 2221, 3, 545, 272, 0, 2221, 2222, 3, 529, 264, 0, 2222, 2223, 3, 543, 271, 0, 2223, 2224, 3, 541, 270, 0, 2224, 2225, 3, 523, 261, 0, 2225, 356, 1, 0, 0, 0, 2226, 2227, 3, 551, 275, 0, 2227, 2228, 3, 531, 265, 0, 2228, 2229, 3, 521, 260, 0, 2229, 2230, 3, 523, 261, 0, 2230, 2231, 3, 517, 258, 0, 2231, 2232, 3, 515, 257, 0, 2232, 2233, 3, 549, 274, 0, 2233, 358, 1, 0, 0, 0, 2234, 2235, 3, 525, 262, 0, 2235, 2236, 3, 531, 265, 0, 2236, 2237, 3, 523, 261, 0, 2237, 2238, 3, 537, 268, 0, 2238, 2239, 3, 521, 260, 0, 2239, 2240, 3, 551, 275, 0, 2240, 360, 1, 0, 0, 0, 2241, 2242, 3, 539, 269, 0, 2242, 2243, 3, 523, 261, 0, 2243, 2244, 3, 553, 276, 0, 2244, 2245, 3, 515, 257, 0, 2245, 2246, 3, 521, 260, 0, 2246, 2247, 3, 515, 257, 0, 2247, 2248, 3, 553, 276, 0, 2248, 2249, 3, 515, 257, 0, 2249, 362, 1, 0, 0, 0, 2250, 2251, 3, 545, 272, 0, 2251, 2252, 3, 549, 274, 0, 2252, 2253, 3, 531, 265, 0, 2253, 2254, 3, 519, 259, 0, 2254, 2255, 3, 523, 261, 0, 2255, 2256, 3, 517, 258, 0, 2256, 2257, 3, 543, 271, 0, 2257, 2258, 3, 543, 271, 0, 2258, 2259, 3, 535, 267, 0, 2259, 2260, 3, 531, 265, 0, 2260, 2261, 3, 521, 260, 0, 2261, 364, 1, 0, 0, 0, 2262, 2263, 3, 541, 270, 0, 2263, 2264, 3, 523, 261, 0, 2264, 2265, 3, 553, 276, 0, 2265, 2266, 3, 559, 279, 0, 2266, 2267, 3, 543, 271, 0, 2267, 2268, 3, 549, 274, 0, 2268, 2269, 3, 535, 267, 0, 2269, 366, 1, 0, 0, 0, 2270, 2271, 3, 551, 275, 0, 2271, 2272, 3, 541, 270, 0, 2272, 2273, 3, 531, 265, 0, 2273, 2274, 3, 545, 272, 0, 2274, 2275, 3, 545, 272, 0, 2275, 2276, 3, 523, 261, 0, 2276, 2277, 3, 553, 276, 0, 2277, 368, 1, 0, 0, 0, 2278, 2279, 3, 553, 276, 0, 2279, 2280, 3, 515, 257, 0, 2280, 2281, 3, 549, 274, 0, 2281, 2282, 3, 527, 263, 0, 2282, 2283, 3, 523, 261, 0, 2283, 2284, 3, 553, 276, 0, 2284, 2285, 5, 95, 0, 0, 2285, 2286, 3, 537, 268, 0, 2286, 2287, 3, 523, 261, 0, 2287, 2288, 3, 541, 270, 0, 2288, 2289, 3, 527, 263, 0, 2289, 2290, 3, 553, 276, 0, 2290, 2291, 3, 529, 264, 0, 2291, 370, 1, 0, 0, 0, 2292, 2293, 3, 521, 260, 0, 2293, 2294, 3, 531, 265, 0, 2294, 2295, 3, 557, 278, 0, 2295, 2296, 3, 531, 265, 0, 2296, 2297, 3, 551, 275, 0, 2297, 2298, 3, 531, 265, 0, 2298, 2299, 3, 543, 271, 0, 2299, 2300, 3, 541, 270, 0, 2300, 372, 1, 0, 0, 0, 2301, 2302, 3, 549, 274, 0, 2302, 2303, 3, 523, 261, 0, 2303, 2304, 3, 553, 276, 0, 2304, 2305, 3, 555, 277, 0, 2305, 2306, 3, 549, 274, 0, 2306, 2307, 3, 541, 270, 0, 2307, 2308, 3, 531, 265, 0, 2308, 2309, 3, 541, 270, 0, 2309, 2310, 3, 527, 263, 0, 2310, 374, 1, 0, 0, 0, 2311, 2312, 3, 537, 268, 0, 2312, 2313, 3, 531, 265, 0, 2313, 2314, 3, 551, 275, 0, 2314, 2315, 3, 553, 276, 0, 2315, 2316, 3, 557, 278, 0, 2316, 2317, 3, 531, 265, 0, 2317, 2318, 3, 523, 261, 0, 2318, 2319, 3, 559, 279, 0, 2319, 376, 1, 0, 0, 0, 2320, 2322, 5, 91, 0, 0, 2321, 2323, 3, 567, 283, 0, 2322, 2321, 1, 0, 0, 0, 2322, 2323, 1, 0, 0, 0, 2323, 2324, 1, 0, 0, 0, 2324, 2325, 3, 525, 262, 0, 2325, 2326, 3, 531, 265, 0, 2326, 2327, 3, 541, 270, 0, 2327, 2328, 3, 521, 260, 0, 2328, 2329, 3, 567, 283, 0, 2329, 2331, 5, 39, 0, 0, 2330, 2332, 3, 379, 189, 0, 2331, 2330, 1, 0, 0, 0, 2331, 2332, 1, 0, 0, 0, 2332, 2333, 1, 0, 0, 0, 2333, 2334, 5, 39, 0, 0, 2334, 378, 1, 0, 0, 0, 2335, 2337, 3, 381, 190, 0, 2336, 2335, 1, 0, 0, 0, 2337, 2338, 1, 0, 0, 0, 2338, 2336, 1, 0, 0, 0, 2338, 2339, 1, 0, 0, 0, 2339, 380, 1, 0, 0, 0, 2340, 2343, 8, 2, 0, 0, 2341, 2343, 3, 389, 194, 0, 2342, 2340, 1, 0, 0, 0, 2342, 2341, 1, 0, 0, 0, 2343, 382, 1, 0, 0, 0, 2344, 2346, 5, 91, 0, 0, 2345, 2347, 3, 567, 283, 0, 2346, 2345, 1, 0, 0, 0, 2346, 2347, 1, 0, 0, 0, 2347, 2348, 1, 0, 0, 0, 2348, 2349, 3, 525, 262, 0, 2349, 2350, 3, 531, 265, 0, 2350, 2351, 3, 541, 270, 0, 2351, 2352, 3, 521, 260, 0, 2352, 2353, 3, 567, 283, 0, 2353, 2355, 5, 123, 0, 0, 2354, 2356, 3, 385, 192, 0, 2355, 2354, 1, 0, 0, 0, 2355, 2356, 1, 0, 0, 0, 2356, 2357, 1, 0, 0, 0, 2357, 2358, 5, 125, 0, 0, 2358, 384, 1, 0, 0, 0, 2359, 2361, 3, 387, 193, 0, 2360, 2359, 1, 0, 0, 0, 2361, 2362, 1, 0, 0, 0, 2362, 2360, 1, 0, 0, 0, 2362, 2363, 1, 0, 0, 0, 2363, 386, 1, 0, 0, 0, 2364, 2367, 8, 3, 0, 0, 2365, 2367, 3, 389, 194, 0, 2366, 2364, 1, 0, 0, 0, 2366, 2365, 1, 0, 0, 0, 2367, 388, 1, 0, 0, 0, 2368, 2369, 5, 92, 0, 0, 2369, 2370, 7, 4, 0, 0, 2370, 390, 1, 0, 0, 0, 2371, 2375, 3, 399, 199, 0, 2372, 2374, 3, 399, 199, 0, 2373, 2372, 1, 0, 0, 0, 2374, 2377, 1, 0, 0, 0, 2375, 2373, 1, 0, 0, 0, 2375, 2376, 1, 0, 0, 0, 2376, 392, 1, 0, 0, 0, 2377, 2375, 1, 0, 0, 0, 2378, 2382, 3, 399, 199, 0, 2379, 2381, 3, 399, 199, 0, 2380, 2379, 1, 0, 0, 0, 2381, 2384, 1, 0, 0, 0, 2382, 2380, 1, 0, 0, 0, 2382, 2383, 1, 0, 0, 0, 2383, 2385, 1, 0, 0, 0, 2384, 2382, 1, 0, 0, 0, 2385, 2386, 7, 5, 0, 0, 2386, 394, 1, 0, 0, 0, 2387, 2389, 3, 399, 199, 0, 2388, 2387, 1, 0, 0, 0, 2389, 2392, 1, 0, 0, 0, 2390, 2388, 1, 0, 0, 0, 2390, 2391, 1, 0, 0, 0, 2391, 2393, 1, 0, 0, 0, 2392, 2390, 1, 0, 0, 0, 2393, 2394, 5, 46, 0, 0, 2394, 2398, 3, 399, 199, 0, 2395, 2397, 3, 399, 199, 0, 2396, 2395, 1, 0, 0, 0, 2397, 2400, 1, 0, 0, 0, 2398, 2396, 1, 0, 0, 0, 2398, 2399, 1, 0, 0, 0, 2399, 2402, 1, 0, 0, 0, 2400, 2398, 1, 0, 0, 0, 2401, 2403, 7, 6, 0, 0, 2402, 2401, 1, 0, 0, 0, 2402, 2403, 1, 0, 0, 0, 2403, 396, 1, 0, 0, 0, 2404, 2412, 3, 399, 199, 0, 2405, 2412, 3, 515, 257, 0, 2406, 2412, 3, 517, 258, 0, 2407, 2412, 3, 519, 259, 0, 2408, 2412, 3, 521, 260, 0, 2409, 2412, 3, 523, 261, 0, 2410, 2412, 3, 525, 262, 0, 2411, 2404, 1, 0, 0, 0, 2411, 2405, 1, 0, 0, 0, 2411, 2406, 1, 0, 0, 0, 2411, 2407, 1, 0, 0, 0, 2411, 2408, 1, 0, 0, 0, 2411, 2409, 1, 0, 0, 0, 2411, 2410, 1, 0, 0, 0, 2412, 398, 1, 0, 0, 0, 2413, 2414, 7, 7, 0, 0, 2414, 400, 1, 0, 0, 0, 2415, 2416, 3, 553, 276, 0, 2416, 2417, 3, 549, 274, 0, 2417, 2418, 3, 555, 277, 0, 2418, 2419, 3, 523, 261, 0, 2419, 2427, 1, 0, 0, 0, 2420, 2421, 3, 525, 262, 0, 2421, 2422, 3, 515, 257, 0, 2422, 2423, 3, 537, 268, 0, 2423, 2424, 3, 551, 275, 0, 2424, 2425, 3, 523, 261, 0, 2425, 2427, 1, 0, 0, 0, 2426, 2415, 1, 0, 0, 0, 2426, 2420, 1, 0, 0, 0, 2427, 402, 1, 0, 0, 0, 2428, 2430, 5, 39, 0, 0, 2429, 2431, 3, 405, 202, 0, 2430, 2429, 1, 0, 0, 0, 2430, 2431, 1, 0, 0, 0, 2431, 2432, 1, 0, 0, 0, 2432, 2433, 5, 39, 0, 0, 2433, 404, 1, 0, 0, 0, 2434, 2436, 3, 407, 203, 0, 2435, 2434, 1, 0, 0, 0, 2436, 2437, 1, 0, 0, 0, 2437, 2435, 1, 0, 0, 0, 2437, 2438, 1, 0, 0, 0, 2438, 406, 1, 0, 0, 0, 2439, 2442, 8, 2, 0, 0, 2440, 2442, 3, 409, 204, 0, 2441, 2439, 1, 0, 0, 0, 2441, 2440, 1, 0, 0, 0, 2442, 408, 1, 0, 0, 0, 2443, 2444, 5, 92, 0, 0, 2444, 2454, 7, 8, 0, 0, 2445, 2446, 5, 92, 0, 0, 2446, 2447, 5, 117, 0, 0, 2447, 2448, 1, 0, 0, 0, 2448, 2449, 3, 397, 198, 0, 2449, 2450, 3, 397, 198, 0, 2450, 2451, 3, 397, 198, 0, 2451, 2452, 3, 397, 198, 0, 2452, 2454, 1, 0, 0, 0, 2453, 2443, 1, 0, 0, 0, 2453, 2445, 1, 0, 0, 0, 2454, 410, 1, 0, 0, 0, 2455, 2456, 3, 51, 25, 0, 2456, 412, 1, 0, 0, 0, 2457, 2458, 5, 40, 0, 0, 2458, 414, 1, 0, 0, 0, 2459, 2460, 5, 41, 0, 0, 2460, 416, 1, 0, 0, 0, 2461, 2462, 5, 123, 0, 0, 2462, 418, 1, 0, 0, 0, 2463, 2464, 5, 125, 0, 0, 2464, 420, 1, 0, 0, 0, 2465, 2466, 5, 91, 0, 0, 2466, 422, 1, 0, 0, 0, 2467, 2468, 5, 93, 0, 0, 2468, 424, 1, 0, 0, 0, 2469, 2470, 5, 59, 0, 0, 2470, 426, 1, 0, 0, 0, 2471, 2472, 5, 44, 0, 0, 2472, 428, 1, 0, 0, 0, 2473, 2474, 5, 46, 0, 0, 2474, 430, 1, 0, 0, 0, 2475, 2476, 5, 61, 0, 0, 2476, 432, 1, 0, 0, 0, 2477, 2478, 5, 62, 0, 0, 2478, 434, 1, 0, 0, 0, 2479, 2480, 5, 60, 0, 0, 2480, 436, 1, 0, 0, 0, 2481, 2482, 5, 33, 0, 0, 2482, 438, 1, 0, 0, 0, 2483, 2484, 5, 126, 0, 0, 2484, 440, 1, 0, 0, 0, 2485, 2486, 5, 63, 0, 0, 2486, 2487, 5, 46, 0, 0, 2487, 442, 1, 0, 0, 0, 2488, 2489, 5, 63, 0, 0, 2489, 444, 1, 0, 0, 0, 2490, 2491, 5, 58, 0, 0, 2491, 446, 1, 0, 0, 0, 2492, 2493, 5, 61, 0, 0, 2493, 2494, 5, 61, 0, 0, 2494, 448, 1, 0, 0, 0, 2495, 2496, 5, 61, 0, 0, 2496, 2497, 5, 61, 0, 0, 2497, 2498, 5, 61, 0, 0, 2498, 450, 1, 0, 0, 0, 2499, 2500, 5, 33, 0, 0, 2500, 2501, 5, 61, 0, 0, 2501, 452, 1, 0, 0, 0, 2502, 2503, 5, 60, 0, 0, 2503, 2504, 5, 62, 0, 0, 2504, 454, 1, 0, 0, 0, 2505, 2506, 5, 33, 0, 0, 2506, 2507, 5, 61, 0, 0, 2507, 2508, 5, 61, 0, 0, 2508, 456, 1, 0, 0, 0, 2509, 2510, 5, 38, 0, 0, 2510, 2511, 5, 38, 0, 0, 2511, 458, 1, 0, 0, 0, 2512, 2513, 5, 124, 0, 0, 2513, 2514, 5, 124, 0, 0, 2514, 460, 1, 0, 0, 0, 2515, 2516, 5, 63, 0, 0, 2516, 2517, 5, 63, 0, 0, 2517, 462, 1, 0, 0, 0, 2518, 2519, 5, 43, 0, 0, 2519, 2520, 5, 43, 0, 0, 2520, 464, 1, 0, 0, 0, 2521, 2522, 5, 45, 0, 0, 2522, 2523, 5, 45, 0, 0, 2523, 466, 1, 0, 0, 0, 2524, 2525, 5, 43, 0, 0, 2525, 468, 1, 0, 0, 0, 2526, 2527, 5, 45, 0, 0, 2527, 470, 1, 0, 0, 0, 2528, 2529, 5, 42, 0, 0, 2529, 472, 1, 0, 0, 0, 2530, 2531, 5, 47, 0, 0, 2531, 474, 1, 0, 0, 0, 2532, 2533, 5, 38, 0, 0, 2533, 476, 1, 0, 0, 0, 2534, 2535, 5, 124, 0, 0, 2535, 478, 1, 0, 0, 0, 2536, 2537, 5, 94, 0, 0, 2537, 480, 1, 0, 0, 0, 2538, 2539, 5, 37, 0, 0, 2539, 482, 1, 0, 0, 0, 2540, 2541, 5, 61, 0, 0, 2541, 2542, 5, 62, 0, 0, 2542, 484, 1, 0, 0, 0, 2543, 2544, 5, 43, 0, 0, 2544, 2545, 5, 61, 0, 0, 2545, 486, 1, 0, 0, 0, 2546, 2547, 5, 45, 0, 0, 2547, 2548, 5, 61, 0, 0, 2548, 488, 1, 0, 0, 0, 2549, 2550, 5, 42, 0, 0, 2550, 2551, 5, 61, 0, 0, 2551, 490, 1, 0, 0, 0, 2552, 2553, 5, 47, 0, 0, 2553, 2554, 5, 61, 0, 0, 2554, 492, 1, 0, 0, 0, 2555, 2556, 5, 38, 0, 0, 2556, 2557, 5, 61, 0, 0, 2557, 494, 1, 0, 0, 0, 2558, 2559, 5, 124, 0, 0, 2559, 2560, 5, 61, 0, 0, 2560, 496, 1, 0, 0, 0, 2561, 2562, 5, 94, 0, 0, 2562, 2563, 5, 61, 0, 0, 2563, 498, 1, 0, 0, 0, 2564, 2565, 5, 37, 0, 0, 2565, 2566, 5, 61, 0, 0, 2566, 500, 1, 0, 0, 0, 2567, 2568, 5, 60, 0, 0, 2568, 2569, 5, 60, 0, 0, 2569, 2570, 5, 61, 0, 0, 2570, 502, 1, 0, 0, 0, 2571, 2572, 5, 62, 0, 0, 2572, 2573, 5, 62, 0, 0, 2573, 2574, 5, 61, 0, 0, 2574, 504, 1, 0, 0, 0, 2575, 2576, 5, 62, 0, 0, 2576, 2577, 5, 62, 0, 0, 2577, 2578, 5, 62, 0, 0, 2578, 2579, 5, 61, 0, 0, 2579, 506, 1, 0, 0, 0, 2580, 2581, 5, 64, 0, 0, 2581, 508, 1, 0, 0, 0, 2582, 2586, 3, 511, 255, 0, 2583, 2585, 3, 513, 256, 0, 2584, 2583, 1, 0, 0, 0, 2585, 2588, 1, 0, 0, 0, 2586, 2584, 1, 0, 0, 0, 2586, 2587, 1, 0, 0, 0, 2587, 510, 1, 0, 0, 0, 2588, 2586, 1, 0, 0, 0, 2589, 2594, 7, 9, 0, 0, 2590, 2594, 8, 10, 0, 0, 2591, 2592, 7, 11, 0, 0, 2592, 2594, 7, 12, 0, 0, 2593, 2589, 1, 0, 0, 0, 2593, 2590, 1, 0, 0, 0, 2593, 2591, 1, 0, 0, 0, 2594, 512, 1, 0, 0, 0, 2595, 2600, 7, 13, 0, 0, 2596, 2600, 8, 10, 0, 0, 2597, 2598, 7, 11, 0, 0, 2598, 2600, 7, 12, 0, 0, 2599, 2595, 1, 0, 0, 0, 2599, 2596, 1, 0, 0, 0, 2599, 2597, 1, 0, 0, 0, 2600, 514, 1, 0, 0, 0, 2601, 2602, 7, 14, 0, 0, 2602, 516, 1, 0, 0, 0, 2603, 2604, 7, 15, 0, 0, 2604, 518, 1, 0, 0, 0, 2605, 2606, 7, 16, 0, 0, 2606, 520, 1, 0, 0, 0, 2607, 2608, 7, 6, 0, 0, 2608, 522, 1, 0, 0, 0, 2609, 2610, 7, 17, 0, 0, 2610, 524, 1, 0, 0, 0, 2611, 2612, 7, 18, 0, 0, 2612, 526, 1, 0, 0, 0, 2613, 2614, 7, 19, 0, 0, 2614, 528, 1, 0, 0, 0, 2615, 2616, 7, 20, 0, 0, 2616, 530, 1, 0, 0, 0, 2617, 2618, 7, 21, 0, 0, 2618, 532, 1, 0, 0, 0, 2619, 2620, 7, 22, 0, 0, 2620, 534, 1, 0, 0, 0, 2621, 2622, 7, 23, 0, 0, 2622, 536, 1, 0, 0, 0, 2623, 2624, 7, 5, 0, 0, 2624, 538, 1, 0, 0, 0, 2625, 2626, 7, 24, 0, 0, 2626, 540, 1, 0, 0, 0, 2627, 2628, 7, 25, 0, 0, 2628, 542, 1, 0, 0, 0, 2629, 2630, 7, 26, 0, 0, 2630, 544, 1, 0, 0, 0, 2631, 2632, 7, 27, 0, 0, 2632, 546, 1, 0, 0, 0, 2633, 2634, 7, 28, 0, 0, 2634, 548, 1, 0, 0, 0, 2635, 2636, 7, 29, 0, 0, 2636, 550, 1, 0, 0, 0, 2637, 2638, 7, 30, 0, 0, 2638, 552, 1, 0, 0, 0, 2639, 2640, 7, 31, 0, 0, 2640, 554, 1, 0, 0, 0, 2641, 2642, 7, 32, 0, 0, 2642, 556, 1, 0, 0, 0, 2643, 2644, 7, 33, 0, 0, 2644, 558, 1, 0, 0, 0, 2645, 2646, 7, 34, 0, 0, 2646, 560, 1, 0, 0, 0, 2647, 2648, 7, 35, 0, 0, 2648, 562, 1, 0, 0, 0, 2649, 2650, 7, 36, 0, 0, 2650, 564, 1, 0, 0, 0, 2651, 2652, 7, 37, 0, 0, 2652, 566, 1, 0, 0, 0, 2653, 2655, 7, 38, 0, 0, 2654, 2653, 1, 0, 0, 0, 2655, 2656, 1, 0, 0, 0, 2656, 2654, 1, 0, 0, 0, 2656, 2657, 1, 0, 0, 0, 2657, 2658, 1, 0, 0, 0, 2658, 2659, 6, 283, 0, 0, 2659, 568, 1, 0, 0, 0, 2660, 2661, 5, 47, 0, 0, 2661, 2662, 5, 42, 0, 0, 2662, 2663, 5, 42, 0, 0, 2663, 2664, 1, 0, 0, 0, 2664, 2668, 7, 39, 0, 0, 2665, 2667, 9, 0, 0, 0, 2666, 2665, 1, 0, 0, 0, 2667, 2670, 1, 0, 0, 0, 2668, 2669, 1, 0, 0, 0, 2668, 2666, 1, 0, 0, 0, 2669, 2671, 1, 0, 0, 0, 2670, 2668, 1, 0, 0, 0, 2671, 2672, 5, 42, 0, 0, 2672, 2673, 5, 47, 0, 0, 2673, 2674, 1, 0, 0, 0, 2674, 2675, 6, 284, 1, 0, 2675, 570, 1, 0, 0, 0, 2676, 2677, 5, 47, 0, 0, 2677, 2678, 5, 42, 0, 0, 2678, 2682, 1, 0, 0, 0, 2679, 2681, 9, 0, 0, 0, 2680, 2679, 1, 0, 0, 0, 2681, 2684, 1, 0, 0, 0, 2682, 2683, 1, 0, 0, 0, 2682, 2680, 1, 0, 0, 0, 2683, 2685, 1, 0, 0, 0, 2684, 2682, 1, 0, 0, 0, 2685, 2686, 5, 42, 0, 0, 2686, 2687, 5, 47, 0, 0, 2687, 2688, 1, 0, 0, 0, 2688, 2689, 6, 285, 1, 0, 2689, 572, 1, 0, 0, 0, 2690, 2691, 5, 47, 0, 0, 2691, 2692, 5, 47, 0, 0, 2692, 2696, 1, 0, 0, 0, 2693, 2695, 8, 39, 0, 0, 2694, 2693, 1, 0, 0, 0, 2695, 2698, 1, 0, 0, 0, 2696, 2694, 1, 0, 0, 0, 2696, 2697, 1, 0, 0, 0, 2697, 2699, 1, 0, 0, 0, 2698, 2696, 1, 0, 0, 0, 2699, 2700, 6, 286, 1, 0, 2700, 574, 1, 0, 0, 0, 34, 0, 2171, 2173, 2180, 2186, 2188, 2190, 2202, 2322, 2331, 2338, 2342, 2346, 2355, 2362, 2366, 2375, 2382, 2390, 2398, 2402, 2411, 2426, 2430, 2437, 2441, 2453, 2586, 2593, 2599, 2656, 2668, 2682, 2696, 2, 0, 2, 0, 0, 3, 0] \ No newline at end of file +[4, 0, 249, 2737, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 2, 198, 7, 198, 2, 199, 7, 199, 2, 200, 7, 200, 2, 201, 7, 201, 2, 202, 7, 202, 2, 203, 7, 203, 2, 204, 7, 204, 2, 205, 7, 205, 2, 206, 7, 206, 2, 207, 7, 207, 2, 208, 7, 208, 2, 209, 7, 209, 2, 210, 7, 210, 2, 211, 7, 211, 2, 212, 7, 212, 2, 213, 7, 213, 2, 214, 7, 214, 2, 215, 7, 215, 2, 216, 7, 216, 2, 217, 7, 217, 2, 218, 7, 218, 2, 219, 7, 219, 2, 220, 7, 220, 2, 221, 7, 221, 2, 222, 7, 222, 2, 223, 7, 223, 2, 224, 7, 224, 2, 225, 7, 225, 2, 226, 7, 226, 2, 227, 7, 227, 2, 228, 7, 228, 2, 229, 7, 229, 2, 230, 7, 230, 2, 231, 7, 231, 2, 232, 7, 232, 2, 233, 7, 233, 2, 234, 7, 234, 2, 235, 7, 235, 2, 236, 7, 236, 2, 237, 7, 237, 2, 238, 7, 238, 2, 239, 7, 239, 2, 240, 7, 240, 2, 241, 7, 241, 2, 242, 7, 242, 2, 243, 7, 243, 2, 244, 7, 244, 2, 245, 7, 245, 2, 246, 7, 246, 2, 247, 7, 247, 2, 248, 7, 248, 2, 249, 7, 249, 2, 250, 7, 250, 2, 251, 7, 251, 2, 252, 7, 252, 2, 253, 7, 253, 2, 254, 7, 254, 2, 255, 7, 255, 2, 256, 7, 256, 2, 257, 7, 257, 2, 258, 7, 258, 2, 259, 7, 259, 2, 260, 7, 260, 2, 261, 7, 261, 2, 262, 7, 262, 2, 263, 7, 263, 2, 264, 7, 264, 2, 265, 7, 265, 2, 266, 7, 266, 2, 267, 7, 267, 2, 268, 7, 268, 2, 269, 7, 269, 2, 270, 7, 270, 2, 271, 7, 271, 2, 272, 7, 272, 2, 273, 7, 273, 2, 274, 7, 274, 2, 275, 7, 275, 2, 276, 7, 276, 2, 277, 7, 277, 2, 278, 7, 278, 2, 279, 7, 279, 2, 280, 7, 280, 2, 281, 7, 281, 2, 282, 7, 282, 2, 283, 7, 283, 2, 284, 7, 284, 2, 285, 7, 285, 2, 286, 7, 286, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 4, 171, 2170, 8, 171, 11, 171, 12, 171, 2171, 3, 171, 2174, 8, 171, 1, 171, 1, 171, 1, 171, 4, 171, 2179, 8, 171, 11, 171, 12, 171, 2180, 1, 171, 1, 171, 4, 171, 2185, 8, 171, 11, 171, 12, 171, 2186, 3, 171, 2189, 8, 171, 3, 171, 2191, 8, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 4, 173, 2201, 8, 173, 11, 173, 12, 173, 2202, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 3, 188, 2323, 8, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 3, 188, 2332, 8, 188, 1, 188, 1, 188, 1, 189, 4, 189, 2337, 8, 189, 11, 189, 12, 189, 2338, 1, 190, 1, 190, 3, 190, 2343, 8, 190, 1, 191, 1, 191, 3, 191, 2347, 8, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 3, 191, 2356, 8, 191, 1, 191, 1, 191, 1, 192, 4, 192, 2361, 8, 192, 11, 192, 12, 192, 2362, 1, 193, 1, 193, 3, 193, 2367, 8, 193, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 5, 195, 2374, 8, 195, 10, 195, 12, 195, 2377, 9, 195, 1, 196, 1, 196, 5, 196, 2381, 8, 196, 10, 196, 12, 196, 2384, 9, 196, 1, 196, 1, 196, 1, 197, 5, 197, 2389, 8, 197, 10, 197, 12, 197, 2392, 9, 197, 1, 197, 1, 197, 1, 197, 5, 197, 2397, 8, 197, 10, 197, 12, 197, 2400, 9, 197, 1, 197, 3, 197, 2403, 8, 197, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 3, 198, 2412, 8, 198, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 3, 200, 2427, 8, 200, 1, 201, 1, 201, 3, 201, 2431, 8, 201, 1, 201, 1, 201, 1, 202, 4, 202, 2436, 8, 202, 11, 202, 12, 202, 2437, 1, 203, 1, 203, 3, 203, 2442, 8, 203, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 3, 204, 2454, 8, 204, 1, 205, 1, 205, 1, 206, 1, 206, 1, 207, 1, 207, 1, 208, 1, 208, 1, 209, 1, 209, 1, 210, 1, 210, 1, 211, 1, 211, 1, 212, 1, 212, 1, 213, 1, 213, 1, 214, 1, 214, 1, 215, 1, 215, 1, 216, 1, 216, 1, 217, 1, 217, 1, 218, 1, 218, 1, 219, 1, 219, 1, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 222, 1, 222, 1, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 1, 227, 1, 228, 1, 228, 1, 228, 1, 229, 1, 229, 1, 229, 1, 230, 1, 230, 1, 230, 1, 231, 1, 231, 1, 231, 1, 232, 1, 232, 1, 232, 1, 233, 1, 233, 1, 234, 1, 234, 1, 235, 1, 235, 1, 236, 1, 236, 1, 237, 1, 237, 1, 238, 1, 238, 1, 239, 1, 239, 1, 240, 1, 240, 1, 241, 1, 241, 1, 241, 1, 242, 1, 242, 1, 242, 1, 243, 1, 243, 1, 243, 1, 244, 1, 244, 1, 244, 1, 245, 1, 245, 1, 245, 1, 246, 1, 246, 1, 246, 1, 247, 1, 247, 1, 247, 1, 248, 1, 248, 1, 248, 1, 249, 1, 249, 1, 249, 1, 250, 1, 250, 1, 250, 1, 250, 1, 251, 1, 251, 1, 251, 1, 251, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 253, 1, 253, 1, 254, 1, 254, 5, 254, 2585, 8, 254, 10, 254, 12, 254, 2588, 9, 254, 1, 255, 1, 255, 1, 255, 1, 255, 3, 255, 2594, 8, 255, 1, 256, 1, 256, 1, 256, 1, 256, 3, 256, 2600, 8, 256, 1, 257, 1, 257, 1, 258, 1, 258, 1, 259, 1, 259, 1, 260, 1, 260, 1, 261, 1, 261, 1, 262, 1, 262, 1, 263, 1, 263, 1, 264, 1, 264, 1, 265, 1, 265, 1, 266, 1, 266, 1, 267, 1, 267, 1, 268, 1, 268, 1, 269, 1, 269, 1, 270, 1, 270, 1, 271, 1, 271, 1, 272, 1, 272, 1, 273, 1, 273, 1, 274, 1, 274, 1, 275, 1, 275, 1, 276, 1, 276, 1, 277, 1, 277, 1, 278, 1, 278, 1, 279, 1, 279, 1, 280, 1, 280, 1, 281, 1, 281, 1, 282, 1, 282, 1, 283, 5, 283, 2655, 8, 283, 10, 283, 12, 283, 2658, 9, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 5, 283, 2666, 8, 283, 10, 283, 12, 283, 2669, 9, 283, 1, 283, 1, 283, 1, 283, 1, 283, 5, 283, 2675, 8, 283, 10, 283, 12, 283, 2678, 9, 283, 1, 283, 1, 283, 1, 284, 5, 284, 2683, 8, 284, 10, 284, 12, 284, 2686, 9, 284, 1, 284, 1, 284, 1, 284, 1, 284, 5, 284, 2692, 8, 284, 10, 284, 12, 284, 2695, 9, 284, 1, 284, 1, 284, 1, 284, 1, 284, 5, 284, 2701, 8, 284, 10, 284, 12, 284, 2704, 9, 284, 1, 284, 1, 284, 1, 285, 5, 285, 2709, 8, 285, 10, 285, 12, 285, 2712, 9, 285, 1, 285, 1, 285, 1, 285, 1, 285, 5, 285, 2718, 8, 285, 10, 285, 12, 285, 2721, 9, 285, 1, 285, 5, 285, 2724, 8, 285, 10, 285, 12, 285, 2727, 9, 285, 1, 285, 1, 285, 1, 286, 4, 286, 2732, 8, 286, 11, 286, 12, 286, 2733, 1, 286, 1, 286, 2, 2667, 2693, 0, 287, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 146, 293, 147, 295, 148, 297, 149, 299, 150, 301, 151, 303, 152, 305, 153, 307, 154, 309, 155, 311, 156, 313, 157, 315, 158, 317, 159, 319, 160, 321, 161, 323, 162, 325, 163, 327, 164, 329, 165, 331, 166, 333, 167, 335, 168, 337, 169, 339, 170, 341, 171, 343, 172, 345, 173, 347, 174, 349, 175, 351, 176, 353, 177, 355, 178, 357, 179, 359, 180, 361, 181, 363, 182, 365, 183, 367, 184, 369, 185, 371, 186, 373, 187, 375, 188, 377, 189, 379, 0, 381, 0, 383, 190, 385, 0, 387, 0, 389, 0, 391, 191, 393, 192, 395, 193, 397, 0, 399, 0, 401, 194, 403, 195, 405, 0, 407, 0, 409, 0, 411, 196, 413, 197, 415, 198, 417, 199, 419, 200, 421, 201, 423, 202, 425, 203, 427, 204, 429, 205, 431, 206, 433, 207, 435, 208, 437, 209, 439, 210, 441, 211, 443, 212, 445, 213, 447, 214, 449, 215, 451, 216, 453, 217, 455, 218, 457, 219, 459, 220, 461, 221, 463, 222, 465, 223, 467, 224, 469, 225, 471, 226, 473, 227, 475, 228, 477, 229, 479, 230, 481, 231, 483, 232, 485, 233, 487, 234, 489, 235, 491, 236, 493, 237, 495, 238, 497, 239, 499, 240, 501, 241, 503, 242, 505, 243, 507, 244, 509, 245, 511, 0, 513, 0, 515, 0, 517, 0, 519, 0, 521, 0, 523, 0, 525, 0, 527, 0, 529, 0, 531, 0, 533, 0, 535, 0, 537, 0, 539, 0, 541, 0, 543, 0, 545, 0, 547, 0, 549, 0, 551, 0, 553, 0, 555, 0, 557, 0, 559, 0, 561, 0, 563, 0, 565, 0, 567, 246, 569, 247, 571, 248, 573, 249, 1, 0, 40, 2, 0, 43, 43, 45, 45, 2, 0, 65, 90, 97, 122, 2, 0, 39, 39, 92, 92, 2, 0, 92, 92, 125, 125, 8, 0, 33, 34, 38, 43, 45, 45, 58, 58, 63, 63, 92, 92, 94, 94, 123, 126, 2, 0, 76, 76, 108, 108, 2, 0, 68, 68, 100, 100, 1, 0, 48, 57, 8, 0, 34, 34, 39, 39, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 4, 0, 36, 36, 65, 90, 95, 95, 97, 122, 2, 0, 0, 255, 55296, 56319, 1, 0, 55296, 56319, 1, 0, 56320, 57343, 5, 0, 36, 36, 48, 57, 65, 90, 95, 95, 97, 122, 2, 0, 65, 65, 97, 97, 2, 0, 66, 66, 98, 98, 2, 0, 67, 67, 99, 99, 2, 0, 69, 69, 101, 101, 2, 0, 70, 70, 102, 102, 2, 0, 71, 71, 103, 103, 2, 0, 72, 72, 104, 104, 2, 0, 73, 73, 105, 105, 2, 0, 74, 74, 106, 106, 2, 0, 75, 75, 107, 107, 2, 0, 77, 77, 109, 109, 2, 0, 78, 78, 110, 110, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 81, 81, 113, 113, 2, 0, 82, 82, 114, 114, 2, 0, 83, 83, 115, 115, 2, 0, 84, 84, 116, 116, 2, 0, 85, 85, 117, 117, 2, 0, 86, 86, 118, 118, 2, 0, 87, 87, 119, 119, 2, 0, 88, 88, 120, 120, 2, 0, 89, 89, 121, 121, 2, 0, 90, 90, 122, 122, 3, 0, 9, 10, 12, 13, 32, 32, 2, 0, 10, 10, 13, 13, 2744, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 287, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 0, 301, 1, 0, 0, 0, 0, 303, 1, 0, 0, 0, 0, 305, 1, 0, 0, 0, 0, 307, 1, 0, 0, 0, 0, 309, 1, 0, 0, 0, 0, 311, 1, 0, 0, 0, 0, 313, 1, 0, 0, 0, 0, 315, 1, 0, 0, 0, 0, 317, 1, 0, 0, 0, 0, 319, 1, 0, 0, 0, 0, 321, 1, 0, 0, 0, 0, 323, 1, 0, 0, 0, 0, 325, 1, 0, 0, 0, 0, 327, 1, 0, 0, 0, 0, 329, 1, 0, 0, 0, 0, 331, 1, 0, 0, 0, 0, 333, 1, 0, 0, 0, 0, 335, 1, 0, 0, 0, 0, 337, 1, 0, 0, 0, 0, 339, 1, 0, 0, 0, 0, 341, 1, 0, 0, 0, 0, 343, 1, 0, 0, 0, 0, 345, 1, 0, 0, 0, 0, 347, 1, 0, 0, 0, 0, 349, 1, 0, 0, 0, 0, 351, 1, 0, 0, 0, 0, 353, 1, 0, 0, 0, 0, 355, 1, 0, 0, 0, 0, 357, 1, 0, 0, 0, 0, 359, 1, 0, 0, 0, 0, 361, 1, 0, 0, 0, 0, 363, 1, 0, 0, 0, 0, 365, 1, 0, 0, 0, 0, 367, 1, 0, 0, 0, 0, 369, 1, 0, 0, 0, 0, 371, 1, 0, 0, 0, 0, 373, 1, 0, 0, 0, 0, 375, 1, 0, 0, 0, 0, 377, 1, 0, 0, 0, 0, 383, 1, 0, 0, 0, 0, 391, 1, 0, 0, 0, 0, 393, 1, 0, 0, 0, 0, 395, 1, 0, 0, 0, 0, 401, 1, 0, 0, 0, 0, 403, 1, 0, 0, 0, 0, 411, 1, 0, 0, 0, 0, 413, 1, 0, 0, 0, 0, 415, 1, 0, 0, 0, 0, 417, 1, 0, 0, 0, 0, 419, 1, 0, 0, 0, 0, 421, 1, 0, 0, 0, 0, 423, 1, 0, 0, 0, 0, 425, 1, 0, 0, 0, 0, 427, 1, 0, 0, 0, 0, 429, 1, 0, 0, 0, 0, 431, 1, 0, 0, 0, 0, 433, 1, 0, 0, 0, 0, 435, 1, 0, 0, 0, 0, 437, 1, 0, 0, 0, 0, 439, 1, 0, 0, 0, 0, 441, 1, 0, 0, 0, 0, 443, 1, 0, 0, 0, 0, 445, 1, 0, 0, 0, 0, 447, 1, 0, 0, 0, 0, 449, 1, 0, 0, 0, 0, 451, 1, 0, 0, 0, 0, 453, 1, 0, 0, 0, 0, 455, 1, 0, 0, 0, 0, 457, 1, 0, 0, 0, 0, 459, 1, 0, 0, 0, 0, 461, 1, 0, 0, 0, 0, 463, 1, 0, 0, 0, 0, 465, 1, 0, 0, 0, 0, 467, 1, 0, 0, 0, 0, 469, 1, 0, 0, 0, 0, 471, 1, 0, 0, 0, 0, 473, 1, 0, 0, 0, 0, 475, 1, 0, 0, 0, 0, 477, 1, 0, 0, 0, 0, 479, 1, 0, 0, 0, 0, 481, 1, 0, 0, 0, 0, 483, 1, 0, 0, 0, 0, 485, 1, 0, 0, 0, 0, 487, 1, 0, 0, 0, 0, 489, 1, 0, 0, 0, 0, 491, 1, 0, 0, 0, 0, 493, 1, 0, 0, 0, 0, 495, 1, 0, 0, 0, 0, 497, 1, 0, 0, 0, 0, 499, 1, 0, 0, 0, 0, 501, 1, 0, 0, 0, 0, 503, 1, 0, 0, 0, 0, 505, 1, 0, 0, 0, 0, 507, 1, 0, 0, 0, 0, 509, 1, 0, 0, 0, 0, 567, 1, 0, 0, 0, 0, 569, 1, 0, 0, 0, 0, 571, 1, 0, 0, 0, 0, 573, 1, 0, 0, 0, 1, 575, 1, 0, 0, 0, 3, 584, 1, 0, 0, 0, 5, 590, 1, 0, 0, 0, 7, 597, 1, 0, 0, 0, 9, 603, 1, 0, 0, 0, 11, 609, 1, 0, 0, 0, 13, 615, 1, 0, 0, 0, 15, 624, 1, 0, 0, 0, 17, 631, 1, 0, 0, 0, 19, 634, 1, 0, 0, 0, 21, 639, 1, 0, 0, 0, 23, 644, 1, 0, 0, 0, 25, 652, 1, 0, 0, 0, 27, 658, 1, 0, 0, 0, 29, 666, 1, 0, 0, 0, 31, 670, 1, 0, 0, 0, 33, 674, 1, 0, 0, 0, 35, 681, 1, 0, 0, 0, 37, 684, 1, 0, 0, 0, 39, 695, 1, 0, 0, 0, 41, 705, 1, 0, 0, 0, 43, 712, 1, 0, 0, 0, 45, 723, 1, 0, 0, 0, 47, 733, 1, 0, 0, 0, 49, 739, 1, 0, 0, 0, 51, 743, 1, 0, 0, 0, 53, 748, 1, 0, 0, 0, 55, 751, 1, 0, 0, 0, 57, 760, 1, 0, 0, 0, 59, 768, 1, 0, 0, 0, 61, 778, 1, 0, 0, 0, 63, 785, 1, 0, 0, 0, 65, 792, 1, 0, 0, 0, 67, 805, 1, 0, 0, 0, 69, 809, 1, 0, 0, 0, 71, 817, 1, 0, 0, 0, 73, 824, 1, 0, 0, 0, 75, 830, 1, 0, 0, 0, 77, 837, 1, 0, 0, 0, 79, 848, 1, 0, 0, 0, 81, 853, 1, 0, 0, 0, 83, 859, 1, 0, 0, 0, 85, 869, 1, 0, 0, 0, 87, 877, 1, 0, 0, 0, 89, 881, 1, 0, 0, 0, 91, 890, 1, 0, 0, 0, 93, 897, 1, 0, 0, 0, 95, 904, 1, 0, 0, 0, 97, 912, 1, 0, 0, 0, 99, 917, 1, 0, 0, 0, 101, 928, 1, 0, 0, 0, 103, 933, 1, 0, 0, 0, 105, 939, 1, 0, 0, 0, 107, 944, 1, 0, 0, 0, 109, 952, 1, 0, 0, 0, 111, 957, 1, 0, 0, 0, 113, 961, 1, 0, 0, 0, 115, 968, 1, 0, 0, 0, 117, 974, 1, 0, 0, 0, 119, 979, 1, 0, 0, 0, 121, 982, 1, 0, 0, 0, 123, 988, 1, 0, 0, 0, 125, 994, 1, 0, 0, 0, 127, 1000, 1, 0, 0, 0, 129, 1006, 1, 0, 0, 0, 131, 1009, 1, 0, 0, 0, 133, 1015, 1, 0, 0, 0, 135, 1019, 1, 0, 0, 0, 137, 1022, 1, 0, 0, 0, 139, 1026, 1, 0, 0, 0, 141, 1030, 1, 0, 0, 0, 143, 1045, 1, 0, 0, 0, 145, 1049, 1, 0, 0, 0, 147, 1053, 1, 0, 0, 0, 149, 1057, 1, 0, 0, 0, 151, 1064, 1, 0, 0, 0, 153, 1068, 1, 0, 0, 0, 155, 1073, 1, 0, 0, 0, 157, 1078, 1, 0, 0, 0, 159, 1081, 1, 0, 0, 0, 161, 1090, 1, 0, 0, 0, 163, 1099, 1, 0, 0, 0, 165, 1103, 1, 0, 0, 0, 167, 1108, 1, 0, 0, 0, 169, 1114, 1, 0, 0, 0, 171, 1120, 1, 0, 0, 0, 173, 1125, 1, 0, 0, 0, 175, 1131, 1, 0, 0, 0, 177, 1135, 1, 0, 0, 0, 179, 1140, 1, 0, 0, 0, 181, 1145, 1, 0, 0, 0, 183, 1152, 1, 0, 0, 0, 185, 1159, 1, 0, 0, 0, 187, 1167, 1, 0, 0, 0, 189, 1174, 1, 0, 0, 0, 191, 1179, 1, 0, 0, 0, 193, 1188, 1, 0, 0, 0, 195, 1191, 1, 0, 0, 0, 197, 1197, 1, 0, 0, 0, 199, 1203, 1, 0, 0, 0, 201, 1218, 1, 0, 0, 0, 203, 1236, 1, 0, 0, 0, 205, 1246, 1, 0, 0, 0, 207, 1251, 1, 0, 0, 0, 209, 1258, 1, 0, 0, 0, 211, 1267, 1, 0, 0, 0, 213, 1276, 1, 0, 0, 0, 215, 1283, 1, 0, 0, 0, 217, 1292, 1, 0, 0, 0, 219, 1301, 1, 0, 0, 0, 221, 1313, 1, 0, 0, 0, 223, 1322, 1, 0, 0, 0, 225, 1338, 1, 0, 0, 0, 227, 1353, 1, 0, 0, 0, 229, 1370, 1, 0, 0, 0, 231, 1384, 1, 0, 0, 0, 233, 1397, 1, 0, 0, 0, 235, 1409, 1, 0, 0, 0, 237, 1421, 1, 0, 0, 0, 239, 1430, 1, 0, 0, 0, 241, 1443, 1, 0, 0, 0, 243, 1458, 1, 0, 0, 0, 245, 1470, 1, 0, 0, 0, 247, 1482, 1, 0, 0, 0, 249, 1496, 1, 0, 0, 0, 251, 1509, 1, 0, 0, 0, 253, 1526, 1, 0, 0, 0, 255, 1536, 1, 0, 0, 0, 257, 1542, 1, 0, 0, 0, 259, 1551, 1, 0, 0, 0, 261, 1561, 1, 0, 0, 0, 263, 1571, 1, 0, 0, 0, 265, 1581, 1, 0, 0, 0, 267, 1592, 1, 0, 0, 0, 269, 1603, 1, 0, 0, 0, 271, 1614, 1, 0, 0, 0, 273, 1628, 1, 0, 0, 0, 275, 1642, 1, 0, 0, 0, 277, 1654, 1, 0, 0, 0, 279, 1666, 1, 0, 0, 0, 281, 1679, 1, 0, 0, 0, 283, 1692, 1, 0, 0, 0, 285, 1706, 1, 0, 0, 0, 287, 1720, 1, 0, 0, 0, 289, 1733, 1, 0, 0, 0, 291, 1746, 1, 0, 0, 0, 293, 1759, 1, 0, 0, 0, 295, 1775, 1, 0, 0, 0, 297, 1791, 1, 0, 0, 0, 299, 1801, 1, 0, 0, 0, 301, 1811, 1, 0, 0, 0, 303, 1821, 1, 0, 0, 0, 305, 1834, 1, 0, 0, 0, 307, 1847, 1, 0, 0, 0, 309, 1867, 1, 0, 0, 0, 311, 1887, 1, 0, 0, 0, 313, 1907, 1, 0, 0, 0, 315, 1930, 1, 0, 0, 0, 317, 1953, 1, 0, 0, 0, 319, 1970, 1, 0, 0, 0, 321, 1987, 1, 0, 0, 0, 323, 2004, 1, 0, 0, 0, 325, 2024, 1, 0, 0, 0, 327, 2044, 1, 0, 0, 0, 329, 2055, 1, 0, 0, 0, 331, 2067, 1, 0, 0, 0, 333, 2080, 1, 0, 0, 0, 335, 2095, 1, 0, 0, 0, 337, 2117, 1, 0, 0, 0, 339, 2129, 1, 0, 0, 0, 341, 2148, 1, 0, 0, 0, 343, 2159, 1, 0, 0, 0, 345, 2192, 1, 0, 0, 0, 347, 2196, 1, 0, 0, 0, 349, 2204, 1, 0, 0, 0, 351, 2209, 1, 0, 0, 0, 353, 2215, 1, 0, 0, 0, 355, 2220, 1, 0, 0, 0, 357, 2226, 1, 0, 0, 0, 359, 2234, 1, 0, 0, 0, 361, 2241, 1, 0, 0, 0, 363, 2250, 1, 0, 0, 0, 365, 2262, 1, 0, 0, 0, 367, 2270, 1, 0, 0, 0, 369, 2278, 1, 0, 0, 0, 371, 2292, 1, 0, 0, 0, 373, 2301, 1, 0, 0, 0, 375, 2311, 1, 0, 0, 0, 377, 2320, 1, 0, 0, 0, 379, 2336, 1, 0, 0, 0, 381, 2342, 1, 0, 0, 0, 383, 2344, 1, 0, 0, 0, 385, 2360, 1, 0, 0, 0, 387, 2366, 1, 0, 0, 0, 389, 2368, 1, 0, 0, 0, 391, 2371, 1, 0, 0, 0, 393, 2378, 1, 0, 0, 0, 395, 2390, 1, 0, 0, 0, 397, 2411, 1, 0, 0, 0, 399, 2413, 1, 0, 0, 0, 401, 2426, 1, 0, 0, 0, 403, 2428, 1, 0, 0, 0, 405, 2435, 1, 0, 0, 0, 407, 2441, 1, 0, 0, 0, 409, 2453, 1, 0, 0, 0, 411, 2455, 1, 0, 0, 0, 413, 2457, 1, 0, 0, 0, 415, 2459, 1, 0, 0, 0, 417, 2461, 1, 0, 0, 0, 419, 2463, 1, 0, 0, 0, 421, 2465, 1, 0, 0, 0, 423, 2467, 1, 0, 0, 0, 425, 2469, 1, 0, 0, 0, 427, 2471, 1, 0, 0, 0, 429, 2473, 1, 0, 0, 0, 431, 2475, 1, 0, 0, 0, 433, 2477, 1, 0, 0, 0, 435, 2479, 1, 0, 0, 0, 437, 2481, 1, 0, 0, 0, 439, 2483, 1, 0, 0, 0, 441, 2485, 1, 0, 0, 0, 443, 2488, 1, 0, 0, 0, 445, 2490, 1, 0, 0, 0, 447, 2492, 1, 0, 0, 0, 449, 2495, 1, 0, 0, 0, 451, 2499, 1, 0, 0, 0, 453, 2502, 1, 0, 0, 0, 455, 2505, 1, 0, 0, 0, 457, 2509, 1, 0, 0, 0, 459, 2512, 1, 0, 0, 0, 461, 2515, 1, 0, 0, 0, 463, 2518, 1, 0, 0, 0, 465, 2521, 1, 0, 0, 0, 467, 2524, 1, 0, 0, 0, 469, 2526, 1, 0, 0, 0, 471, 2528, 1, 0, 0, 0, 473, 2530, 1, 0, 0, 0, 475, 2532, 1, 0, 0, 0, 477, 2534, 1, 0, 0, 0, 479, 2536, 1, 0, 0, 0, 481, 2538, 1, 0, 0, 0, 483, 2540, 1, 0, 0, 0, 485, 2543, 1, 0, 0, 0, 487, 2546, 1, 0, 0, 0, 489, 2549, 1, 0, 0, 0, 491, 2552, 1, 0, 0, 0, 493, 2555, 1, 0, 0, 0, 495, 2558, 1, 0, 0, 0, 497, 2561, 1, 0, 0, 0, 499, 2564, 1, 0, 0, 0, 501, 2567, 1, 0, 0, 0, 503, 2571, 1, 0, 0, 0, 505, 2575, 1, 0, 0, 0, 507, 2580, 1, 0, 0, 0, 509, 2582, 1, 0, 0, 0, 511, 2593, 1, 0, 0, 0, 513, 2599, 1, 0, 0, 0, 515, 2601, 1, 0, 0, 0, 517, 2603, 1, 0, 0, 0, 519, 2605, 1, 0, 0, 0, 521, 2607, 1, 0, 0, 0, 523, 2609, 1, 0, 0, 0, 525, 2611, 1, 0, 0, 0, 527, 2613, 1, 0, 0, 0, 529, 2615, 1, 0, 0, 0, 531, 2617, 1, 0, 0, 0, 533, 2619, 1, 0, 0, 0, 535, 2621, 1, 0, 0, 0, 537, 2623, 1, 0, 0, 0, 539, 2625, 1, 0, 0, 0, 541, 2627, 1, 0, 0, 0, 543, 2629, 1, 0, 0, 0, 545, 2631, 1, 0, 0, 0, 547, 2633, 1, 0, 0, 0, 549, 2635, 1, 0, 0, 0, 551, 2637, 1, 0, 0, 0, 553, 2639, 1, 0, 0, 0, 555, 2641, 1, 0, 0, 0, 557, 2643, 1, 0, 0, 0, 559, 2645, 1, 0, 0, 0, 561, 2647, 1, 0, 0, 0, 563, 2649, 1, 0, 0, 0, 565, 2651, 1, 0, 0, 0, 567, 2656, 1, 0, 0, 0, 569, 2684, 1, 0, 0, 0, 571, 2710, 1, 0, 0, 0, 573, 2731, 1, 0, 0, 0, 575, 576, 3, 515, 257, 0, 576, 577, 3, 517, 258, 0, 577, 578, 3, 551, 275, 0, 578, 579, 3, 553, 276, 0, 579, 580, 3, 549, 274, 0, 580, 581, 3, 515, 257, 0, 581, 582, 3, 519, 259, 0, 582, 583, 3, 553, 276, 0, 583, 2, 1, 0, 0, 0, 584, 585, 3, 515, 257, 0, 585, 586, 3, 525, 262, 0, 586, 587, 3, 553, 276, 0, 587, 588, 3, 523, 261, 0, 588, 589, 3, 549, 274, 0, 589, 4, 1, 0, 0, 0, 590, 591, 3, 517, 258, 0, 591, 592, 3, 523, 261, 0, 592, 593, 3, 525, 262, 0, 593, 594, 3, 543, 271, 0, 594, 595, 3, 549, 274, 0, 595, 596, 3, 523, 261, 0, 596, 6, 1, 0, 0, 0, 597, 598, 3, 517, 258, 0, 598, 599, 3, 549, 274, 0, 599, 600, 3, 523, 261, 0, 600, 601, 3, 515, 257, 0, 601, 602, 3, 535, 267, 0, 602, 8, 1, 0, 0, 0, 603, 604, 3, 519, 259, 0, 604, 605, 3, 515, 257, 0, 605, 606, 3, 553, 276, 0, 606, 607, 3, 519, 259, 0, 607, 608, 3, 529, 264, 0, 608, 10, 1, 0, 0, 0, 609, 610, 3, 519, 259, 0, 610, 611, 3, 537, 268, 0, 611, 612, 3, 515, 257, 0, 612, 613, 3, 551, 275, 0, 613, 614, 3, 551, 275, 0, 614, 12, 1, 0, 0, 0, 615, 616, 3, 519, 259, 0, 616, 617, 3, 543, 271, 0, 617, 618, 3, 541, 270, 0, 618, 619, 3, 553, 276, 0, 619, 620, 3, 531, 265, 0, 620, 621, 3, 541, 270, 0, 621, 622, 3, 555, 277, 0, 622, 623, 3, 523, 261, 0, 623, 14, 1, 0, 0, 0, 624, 625, 3, 521, 260, 0, 625, 626, 3, 523, 261, 0, 626, 627, 3, 537, 268, 0, 627, 628, 3, 523, 261, 0, 628, 629, 3, 553, 276, 0, 629, 630, 3, 523, 261, 0, 630, 16, 1, 0, 0, 0, 631, 632, 3, 521, 260, 0, 632, 633, 3, 543, 271, 0, 633, 18, 1, 0, 0, 0, 634, 635, 3, 523, 261, 0, 635, 636, 3, 537, 268, 0, 636, 637, 3, 551, 275, 0, 637, 638, 3, 523, 261, 0, 638, 20, 1, 0, 0, 0, 639, 640, 3, 523, 261, 0, 640, 641, 3, 541, 270, 0, 641, 642, 3, 555, 277, 0, 642, 643, 3, 539, 269, 0, 643, 22, 1, 0, 0, 0, 644, 645, 3, 523, 261, 0, 645, 646, 3, 561, 280, 0, 646, 647, 3, 553, 276, 0, 647, 648, 3, 523, 261, 0, 648, 649, 3, 541, 270, 0, 649, 650, 3, 521, 260, 0, 650, 651, 3, 551, 275, 0, 651, 24, 1, 0, 0, 0, 652, 653, 3, 525, 262, 0, 653, 654, 3, 531, 265, 0, 654, 655, 3, 541, 270, 0, 655, 656, 3, 515, 257, 0, 656, 657, 3, 537, 268, 0, 657, 26, 1, 0, 0, 0, 658, 659, 3, 525, 262, 0, 659, 660, 3, 531, 265, 0, 660, 661, 3, 541, 270, 0, 661, 662, 3, 515, 257, 0, 662, 663, 3, 537, 268, 0, 663, 664, 3, 537, 268, 0, 664, 665, 3, 563, 281, 0, 665, 28, 1, 0, 0, 0, 666, 667, 3, 525, 262, 0, 667, 668, 3, 543, 271, 0, 668, 669, 3, 549, 274, 0, 669, 30, 1, 0, 0, 0, 670, 671, 3, 527, 263, 0, 671, 672, 3, 523, 261, 0, 672, 673, 3, 553, 276, 0, 673, 32, 1, 0, 0, 0, 674, 675, 3, 527, 263, 0, 675, 676, 3, 537, 268, 0, 676, 677, 3, 543, 271, 0, 677, 678, 3, 517, 258, 0, 678, 679, 3, 515, 257, 0, 679, 680, 3, 537, 268, 0, 680, 34, 1, 0, 0, 0, 681, 682, 3, 531, 265, 0, 682, 683, 3, 525, 262, 0, 683, 36, 1, 0, 0, 0, 684, 685, 3, 531, 265, 0, 685, 686, 3, 539, 269, 0, 686, 687, 3, 545, 272, 0, 687, 688, 3, 537, 268, 0, 688, 689, 3, 523, 261, 0, 689, 690, 3, 539, 269, 0, 690, 691, 3, 523, 261, 0, 691, 692, 3, 541, 270, 0, 692, 693, 3, 553, 276, 0, 693, 694, 3, 551, 275, 0, 694, 38, 1, 0, 0, 0, 695, 696, 3, 531, 265, 0, 696, 697, 3, 541, 270, 0, 697, 698, 3, 529, 264, 0, 698, 699, 3, 523, 261, 0, 699, 700, 3, 549, 274, 0, 700, 701, 3, 531, 265, 0, 701, 702, 3, 553, 276, 0, 702, 703, 3, 523, 261, 0, 703, 704, 3, 521, 260, 0, 704, 40, 1, 0, 0, 0, 705, 706, 3, 531, 265, 0, 706, 707, 3, 541, 270, 0, 707, 708, 3, 551, 275, 0, 708, 709, 3, 523, 261, 0, 709, 710, 3, 549, 274, 0, 710, 711, 3, 553, 276, 0, 711, 42, 1, 0, 0, 0, 712, 713, 3, 531, 265, 0, 713, 714, 3, 541, 270, 0, 714, 715, 3, 551, 275, 0, 715, 716, 3, 553, 276, 0, 716, 717, 3, 515, 257, 0, 717, 718, 3, 541, 270, 0, 718, 719, 3, 519, 259, 0, 719, 720, 3, 523, 261, 0, 720, 721, 3, 543, 271, 0, 721, 722, 3, 525, 262, 0, 722, 44, 1, 0, 0, 0, 723, 724, 3, 531, 265, 0, 724, 725, 3, 541, 270, 0, 725, 726, 3, 553, 276, 0, 726, 727, 3, 523, 261, 0, 727, 728, 3, 549, 274, 0, 728, 729, 3, 525, 262, 0, 729, 730, 3, 515, 257, 0, 730, 731, 3, 519, 259, 0, 731, 732, 3, 523, 261, 0, 732, 46, 1, 0, 0, 0, 733, 734, 3, 539, 269, 0, 734, 735, 3, 523, 261, 0, 735, 736, 3, 549, 274, 0, 736, 737, 3, 527, 263, 0, 737, 738, 3, 523, 261, 0, 738, 48, 1, 0, 0, 0, 739, 740, 3, 541, 270, 0, 740, 741, 3, 523, 261, 0, 741, 742, 3, 559, 279, 0, 742, 50, 1, 0, 0, 0, 743, 744, 3, 541, 270, 0, 744, 745, 3, 555, 277, 0, 745, 746, 3, 537, 268, 0, 746, 747, 3, 537, 268, 0, 747, 52, 1, 0, 0, 0, 748, 749, 3, 543, 271, 0, 749, 750, 3, 541, 270, 0, 750, 54, 1, 0, 0, 0, 751, 752, 3, 543, 271, 0, 752, 753, 3, 557, 278, 0, 753, 754, 3, 523, 261, 0, 754, 755, 3, 549, 274, 0, 755, 756, 3, 549, 274, 0, 756, 757, 3, 531, 265, 0, 757, 758, 3, 521, 260, 0, 758, 759, 3, 523, 261, 0, 759, 56, 1, 0, 0, 0, 760, 761, 3, 545, 272, 0, 761, 762, 3, 549, 274, 0, 762, 763, 3, 531, 265, 0, 763, 764, 3, 557, 278, 0, 764, 765, 3, 515, 257, 0, 765, 766, 3, 553, 276, 0, 766, 767, 3, 523, 261, 0, 767, 58, 1, 0, 0, 0, 768, 769, 3, 545, 272, 0, 769, 770, 3, 549, 274, 0, 770, 771, 3, 543, 271, 0, 771, 772, 3, 553, 276, 0, 772, 773, 3, 523, 261, 0, 773, 774, 3, 519, 259, 0, 774, 775, 3, 553, 276, 0, 775, 776, 3, 523, 261, 0, 776, 777, 3, 521, 260, 0, 777, 60, 1, 0, 0, 0, 778, 779, 3, 545, 272, 0, 779, 780, 3, 555, 277, 0, 780, 781, 3, 517, 258, 0, 781, 782, 3, 537, 268, 0, 782, 783, 3, 531, 265, 0, 783, 784, 3, 519, 259, 0, 784, 62, 1, 0, 0, 0, 785, 786, 3, 549, 274, 0, 786, 787, 3, 523, 261, 0, 787, 788, 3, 553, 276, 0, 788, 789, 3, 555, 277, 0, 789, 790, 3, 549, 274, 0, 790, 791, 3, 541, 270, 0, 791, 64, 1, 0, 0, 0, 792, 793, 3, 551, 275, 0, 793, 794, 3, 563, 281, 0, 794, 795, 3, 551, 275, 0, 795, 796, 3, 553, 276, 0, 796, 797, 3, 523, 261, 0, 797, 798, 3, 539, 269, 0, 798, 799, 5, 46, 0, 0, 799, 800, 3, 549, 274, 0, 800, 801, 3, 555, 277, 0, 801, 802, 3, 541, 270, 0, 802, 803, 3, 515, 257, 0, 803, 804, 3, 551, 275, 0, 804, 66, 1, 0, 0, 0, 805, 806, 3, 551, 275, 0, 806, 807, 3, 523, 261, 0, 807, 808, 3, 553, 276, 0, 808, 68, 1, 0, 0, 0, 809, 810, 3, 551, 275, 0, 810, 811, 3, 529, 264, 0, 811, 812, 3, 515, 257, 0, 812, 813, 3, 549, 274, 0, 813, 814, 3, 531, 265, 0, 814, 815, 3, 541, 270, 0, 815, 816, 3, 527, 263, 0, 816, 70, 1, 0, 0, 0, 817, 818, 3, 551, 275, 0, 818, 819, 3, 553, 276, 0, 819, 820, 3, 515, 257, 0, 820, 821, 3, 553, 276, 0, 821, 822, 3, 531, 265, 0, 822, 823, 3, 519, 259, 0, 823, 72, 1, 0, 0, 0, 824, 825, 3, 551, 275, 0, 825, 826, 3, 555, 277, 0, 826, 827, 3, 545, 272, 0, 827, 828, 3, 523, 261, 0, 828, 829, 3, 549, 274, 0, 829, 74, 1, 0, 0, 0, 830, 831, 3, 551, 275, 0, 831, 832, 3, 559, 279, 0, 832, 833, 3, 531, 265, 0, 833, 834, 3, 553, 276, 0, 834, 835, 3, 519, 259, 0, 835, 836, 3, 529, 264, 0, 836, 76, 1, 0, 0, 0, 837, 838, 3, 553, 276, 0, 838, 839, 3, 523, 261, 0, 839, 840, 3, 551, 275, 0, 840, 841, 3, 553, 276, 0, 841, 842, 3, 539, 269, 0, 842, 843, 3, 523, 261, 0, 843, 844, 3, 553, 276, 0, 844, 845, 3, 529, 264, 0, 845, 846, 3, 543, 271, 0, 846, 847, 3, 521, 260, 0, 847, 78, 1, 0, 0, 0, 848, 849, 3, 553, 276, 0, 849, 850, 3, 529, 264, 0, 850, 851, 3, 531, 265, 0, 851, 852, 3, 551, 275, 0, 852, 80, 1, 0, 0, 0, 853, 854, 3, 553, 276, 0, 854, 855, 3, 529, 264, 0, 855, 856, 3, 549, 274, 0, 856, 857, 3, 543, 271, 0, 857, 858, 3, 559, 279, 0, 858, 82, 1, 0, 0, 0, 859, 860, 3, 553, 276, 0, 860, 861, 3, 549, 274, 0, 861, 862, 3, 515, 257, 0, 862, 863, 3, 541, 270, 0, 863, 864, 3, 551, 275, 0, 864, 865, 3, 531, 265, 0, 865, 866, 3, 523, 261, 0, 866, 867, 3, 541, 270, 0, 867, 868, 3, 553, 276, 0, 868, 84, 1, 0, 0, 0, 869, 870, 3, 553, 276, 0, 870, 871, 3, 549, 274, 0, 871, 872, 3, 531, 265, 0, 872, 873, 3, 527, 263, 0, 873, 874, 3, 527, 263, 0, 874, 875, 3, 523, 261, 0, 875, 876, 3, 549, 274, 0, 876, 86, 1, 0, 0, 0, 877, 878, 3, 553, 276, 0, 878, 879, 3, 549, 274, 0, 879, 880, 3, 563, 281, 0, 880, 88, 1, 0, 0, 0, 881, 882, 3, 555, 277, 0, 882, 883, 3, 541, 270, 0, 883, 884, 3, 521, 260, 0, 884, 885, 3, 523, 261, 0, 885, 886, 3, 537, 268, 0, 886, 887, 3, 523, 261, 0, 887, 888, 3, 553, 276, 0, 888, 889, 3, 523, 261, 0, 889, 90, 1, 0, 0, 0, 890, 891, 3, 555, 277, 0, 891, 892, 3, 545, 272, 0, 892, 893, 3, 521, 260, 0, 893, 894, 3, 515, 257, 0, 894, 895, 3, 553, 276, 0, 895, 896, 3, 523, 261, 0, 896, 92, 1, 0, 0, 0, 897, 898, 3, 555, 277, 0, 898, 899, 3, 545, 272, 0, 899, 900, 3, 551, 275, 0, 900, 901, 3, 523, 261, 0, 901, 902, 3, 549, 274, 0, 902, 903, 3, 553, 276, 0, 903, 94, 1, 0, 0, 0, 904, 905, 3, 557, 278, 0, 905, 906, 3, 531, 265, 0, 906, 907, 3, 549, 274, 0, 907, 908, 3, 553, 276, 0, 908, 909, 3, 555, 277, 0, 909, 910, 3, 515, 257, 0, 910, 911, 3, 537, 268, 0, 911, 96, 1, 0, 0, 0, 912, 913, 3, 557, 278, 0, 913, 914, 3, 543, 271, 0, 914, 915, 3, 531, 265, 0, 915, 916, 3, 521, 260, 0, 916, 98, 1, 0, 0, 0, 917, 918, 3, 559, 279, 0, 918, 919, 3, 523, 261, 0, 919, 920, 3, 517, 258, 0, 920, 921, 3, 551, 275, 0, 921, 922, 3, 523, 261, 0, 922, 923, 3, 549, 274, 0, 923, 924, 3, 557, 278, 0, 924, 925, 3, 531, 265, 0, 925, 926, 3, 519, 259, 0, 926, 927, 3, 523, 261, 0, 927, 100, 1, 0, 0, 0, 928, 929, 3, 559, 279, 0, 929, 930, 3, 529, 264, 0, 930, 931, 3, 523, 261, 0, 931, 932, 3, 541, 270, 0, 932, 102, 1, 0, 0, 0, 933, 934, 3, 559, 279, 0, 934, 935, 3, 529, 264, 0, 935, 936, 3, 531, 265, 0, 936, 937, 3, 537, 268, 0, 937, 938, 3, 523, 261, 0, 938, 104, 1, 0, 0, 0, 939, 940, 3, 559, 279, 0, 940, 941, 3, 531, 265, 0, 941, 942, 3, 553, 276, 0, 942, 943, 3, 529, 264, 0, 943, 106, 1, 0, 0, 0, 944, 945, 3, 559, 279, 0, 945, 946, 3, 531, 265, 0, 946, 947, 3, 553, 276, 0, 947, 948, 3, 529, 264, 0, 948, 949, 3, 543, 271, 0, 949, 950, 3, 555, 277, 0, 950, 951, 3, 553, 276, 0, 951, 108, 1, 0, 0, 0, 952, 953, 3, 537, 268, 0, 953, 954, 3, 531, 265, 0, 954, 955, 3, 551, 275, 0, 955, 956, 3, 553, 276, 0, 956, 110, 1, 0, 0, 0, 957, 958, 3, 539, 269, 0, 958, 959, 3, 515, 257, 0, 959, 960, 3, 545, 272, 0, 960, 112, 1, 0, 0, 0, 961, 962, 3, 551, 275, 0, 962, 963, 3, 523, 261, 0, 963, 964, 3, 537, 268, 0, 964, 965, 3, 523, 261, 0, 965, 966, 3, 519, 259, 0, 966, 967, 3, 553, 276, 0, 967, 114, 1, 0, 0, 0, 968, 969, 3, 519, 259, 0, 969, 970, 3, 543, 271, 0, 970, 971, 3, 555, 277, 0, 971, 972, 3, 541, 270, 0, 972, 973, 3, 553, 276, 0, 973, 116, 1, 0, 0, 0, 974, 975, 3, 525, 262, 0, 975, 976, 3, 549, 274, 0, 976, 977, 3, 543, 271, 0, 977, 978, 3, 539, 269, 0, 978, 118, 1, 0, 0, 0, 979, 980, 3, 515, 257, 0, 980, 981, 3, 551, 275, 0, 981, 120, 1, 0, 0, 0, 982, 983, 3, 555, 277, 0, 983, 984, 3, 551, 275, 0, 984, 985, 3, 531, 265, 0, 985, 986, 3, 541, 270, 0, 986, 987, 3, 527, 263, 0, 987, 122, 1, 0, 0, 0, 988, 989, 3, 551, 275, 0, 989, 990, 3, 519, 259, 0, 990, 991, 3, 543, 271, 0, 991, 992, 3, 545, 272, 0, 992, 993, 3, 523, 261, 0, 993, 124, 1, 0, 0, 0, 994, 995, 3, 559, 279, 0, 995, 996, 3, 529, 264, 0, 996, 997, 3, 523, 261, 0, 997, 998, 3, 549, 274, 0, 998, 999, 3, 523, 261, 0, 999, 126, 1, 0, 0, 0, 1000, 1001, 3, 543, 271, 0, 1001, 1002, 3, 549, 274, 0, 1002, 1003, 3, 521, 260, 0, 1003, 1004, 3, 523, 261, 0, 1004, 1005, 3, 549, 274, 0, 1005, 128, 1, 0, 0, 0, 1006, 1007, 3, 517, 258, 0, 1007, 1008, 3, 563, 281, 0, 1008, 130, 1, 0, 0, 0, 1009, 1010, 3, 537, 268, 0, 1010, 1011, 3, 531, 265, 0, 1011, 1012, 3, 539, 269, 0, 1012, 1013, 3, 531, 265, 0, 1013, 1014, 3, 553, 276, 0, 1014, 132, 1, 0, 0, 0, 1015, 1016, 3, 515, 257, 0, 1016, 1017, 3, 541, 270, 0, 1017, 1018, 3, 521, 260, 0, 1018, 134, 1, 0, 0, 0, 1019, 1020, 3, 543, 271, 0, 1020, 1021, 3, 549, 274, 0, 1021, 136, 1, 0, 0, 0, 1022, 1023, 3, 541, 270, 0, 1023, 1024, 3, 543, 271, 0, 1024, 1025, 3, 553, 276, 0, 1025, 138, 1, 0, 0, 0, 1026, 1027, 3, 515, 257, 0, 1027, 1028, 3, 557, 278, 0, 1028, 1029, 3, 527, 263, 0, 1029, 140, 1, 0, 0, 0, 1030, 1031, 3, 519, 259, 0, 1031, 1032, 3, 543, 271, 0, 1032, 1033, 3, 555, 277, 0, 1033, 1034, 3, 541, 270, 0, 1034, 1035, 3, 553, 276, 0, 1035, 1036, 5, 95, 0, 0, 1036, 1037, 3, 521, 260, 0, 1037, 1038, 3, 531, 265, 0, 1038, 1039, 3, 551, 275, 0, 1039, 1040, 3, 553, 276, 0, 1040, 1041, 3, 531, 265, 0, 1041, 1042, 3, 541, 270, 0, 1042, 1043, 3, 519, 259, 0, 1043, 1044, 3, 553, 276, 0, 1044, 142, 1, 0, 0, 0, 1045, 1046, 3, 539, 269, 0, 1046, 1047, 3, 531, 265, 0, 1047, 1048, 3, 541, 270, 0, 1048, 144, 1, 0, 0, 0, 1049, 1050, 3, 539, 269, 0, 1050, 1051, 3, 515, 257, 0, 1051, 1052, 3, 561, 280, 0, 1052, 146, 1, 0, 0, 0, 1053, 1054, 3, 551, 275, 0, 1054, 1055, 3, 555, 277, 0, 1055, 1056, 3, 539, 269, 0, 1056, 148, 1, 0, 0, 0, 1057, 1058, 3, 553, 276, 0, 1058, 1059, 3, 563, 281, 0, 1059, 1060, 3, 545, 272, 0, 1060, 1061, 3, 523, 261, 0, 1061, 1062, 3, 543, 271, 0, 1062, 1063, 3, 525, 262, 0, 1063, 150, 1, 0, 0, 0, 1064, 1065, 3, 523, 261, 0, 1065, 1066, 3, 541, 270, 0, 1066, 1067, 3, 521, 260, 0, 1067, 152, 1, 0, 0, 0, 1068, 1069, 3, 553, 276, 0, 1069, 1070, 3, 529, 264, 0, 1070, 1071, 3, 523, 261, 0, 1071, 1072, 3, 541, 270, 0, 1072, 154, 1, 0, 0, 0, 1073, 1074, 3, 537, 268, 0, 1074, 1075, 3, 531, 265, 0, 1075, 1076, 3, 535, 267, 0, 1076, 1077, 3, 523, 261, 0, 1077, 156, 1, 0, 0, 0, 1078, 1079, 3, 531, 265, 0, 1079, 1080, 3, 541, 270, 0, 1080, 158, 1, 0, 0, 0, 1081, 1082, 3, 531, 265, 0, 1082, 1083, 3, 541, 270, 0, 1083, 1084, 3, 519, 259, 0, 1084, 1085, 3, 537, 268, 0, 1085, 1086, 3, 555, 277, 0, 1086, 1087, 3, 521, 260, 0, 1087, 1088, 3, 523, 261, 0, 1088, 1089, 3, 551, 275, 0, 1089, 160, 1, 0, 0, 0, 1090, 1091, 3, 523, 261, 0, 1091, 1092, 3, 561, 280, 0, 1092, 1093, 3, 519, 259, 0, 1093, 1094, 3, 537, 268, 0, 1094, 1095, 3, 555, 277, 0, 1095, 1096, 3, 521, 260, 0, 1096, 1097, 3, 523, 261, 0, 1097, 1098, 3, 551, 275, 0, 1098, 162, 1, 0, 0, 0, 1099, 1100, 3, 515, 257, 0, 1100, 1101, 3, 551, 275, 0, 1101, 1102, 3, 519, 259, 0, 1102, 164, 1, 0, 0, 0, 1103, 1104, 3, 521, 260, 0, 1104, 1105, 3, 523, 261, 0, 1105, 1106, 3, 551, 275, 0, 1106, 1107, 3, 519, 259, 0, 1107, 166, 1, 0, 0, 0, 1108, 1109, 3, 541, 270, 0, 1109, 1110, 3, 555, 277, 0, 1110, 1111, 3, 537, 268, 0, 1111, 1112, 3, 537, 268, 0, 1112, 1113, 3, 551, 275, 0, 1113, 168, 1, 0, 0, 0, 1114, 1115, 3, 525, 262, 0, 1115, 1116, 3, 531, 265, 0, 1116, 1117, 3, 549, 274, 0, 1117, 1118, 3, 551, 275, 0, 1118, 1119, 3, 553, 276, 0, 1119, 170, 1, 0, 0, 0, 1120, 1121, 3, 537, 268, 0, 1121, 1122, 3, 515, 257, 0, 1122, 1123, 3, 551, 275, 0, 1123, 1124, 3, 553, 276, 0, 1124, 172, 1, 0, 0, 0, 1125, 1126, 3, 527, 263, 0, 1126, 1127, 3, 549, 274, 0, 1127, 1128, 3, 543, 271, 0, 1128, 1129, 3, 555, 277, 0, 1129, 1130, 3, 545, 272, 0, 1130, 174, 1, 0, 0, 0, 1131, 1132, 3, 515, 257, 0, 1132, 1133, 3, 537, 268, 0, 1133, 1134, 3, 537, 268, 0, 1134, 176, 1, 0, 0, 0, 1135, 1136, 3, 549, 274, 0, 1136, 1137, 3, 543, 271, 0, 1137, 1138, 3, 559, 279, 0, 1138, 1139, 3, 551, 275, 0, 1139, 178, 1, 0, 0, 0, 1140, 1141, 3, 557, 278, 0, 1141, 1142, 3, 531, 265, 0, 1142, 1143, 3, 523, 261, 0, 1143, 1144, 3, 559, 279, 0, 1144, 180, 1, 0, 0, 0, 1145, 1146, 3, 529, 264, 0, 1146, 1147, 3, 515, 257, 0, 1147, 1148, 3, 557, 278, 0, 1148, 1149, 3, 531, 265, 0, 1149, 1150, 3, 541, 270, 0, 1150, 1151, 3, 527, 263, 0, 1151, 182, 1, 0, 0, 0, 1152, 1153, 3, 549, 274, 0, 1153, 1154, 3, 543, 271, 0, 1154, 1155, 3, 537, 268, 0, 1155, 1156, 3, 537, 268, 0, 1156, 1157, 3, 555, 277, 0, 1157, 1158, 3, 545, 272, 0, 1158, 184, 1, 0, 0, 0, 1159, 1160, 3, 553, 276, 0, 1160, 1161, 3, 543, 271, 0, 1161, 1162, 3, 537, 268, 0, 1162, 1163, 3, 515, 257, 0, 1163, 1164, 3, 517, 258, 0, 1164, 1165, 3, 523, 261, 0, 1165, 1166, 3, 537, 268, 0, 1166, 186, 1, 0, 0, 0, 1167, 1168, 3, 543, 271, 0, 1168, 1169, 3, 525, 262, 0, 1169, 1170, 3, 525, 262, 0, 1170, 1171, 3, 551, 275, 0, 1171, 1172, 3, 523, 261, 0, 1172, 1173, 3, 553, 276, 0, 1173, 188, 1, 0, 0, 0, 1174, 1175, 3, 521, 260, 0, 1175, 1176, 3, 515, 257, 0, 1176, 1177, 3, 553, 276, 0, 1177, 1178, 3, 515, 257, 0, 1178, 190, 1, 0, 0, 0, 1179, 1180, 3, 519, 259, 0, 1180, 1181, 3, 515, 257, 0, 1181, 1182, 3, 553, 276, 0, 1182, 1183, 3, 523, 261, 0, 1183, 1184, 3, 527, 263, 0, 1184, 1185, 3, 543, 271, 0, 1185, 1186, 3, 549, 274, 0, 1186, 1187, 3, 563, 281, 0, 1187, 192, 1, 0, 0, 0, 1188, 1189, 3, 515, 257, 0, 1189, 1190, 3, 553, 276, 0, 1190, 194, 1, 0, 0, 0, 1191, 1192, 3, 515, 257, 0, 1192, 1193, 3, 517, 258, 0, 1193, 1194, 3, 543, 271, 0, 1194, 1195, 3, 557, 278, 0, 1195, 1196, 3, 523, 261, 0, 1196, 196, 1, 0, 0, 0, 1197, 1198, 3, 517, 258, 0, 1198, 1199, 3, 523, 261, 0, 1199, 1200, 3, 537, 268, 0, 1200, 1201, 3, 543, 271, 0, 1201, 1202, 3, 559, 279, 0, 1202, 198, 1, 0, 0, 0, 1203, 1204, 3, 515, 257, 0, 1204, 1205, 3, 517, 258, 0, 1205, 1206, 3, 543, 271, 0, 1206, 1207, 3, 557, 278, 0, 1207, 1208, 3, 523, 261, 0, 1208, 1209, 5, 95, 0, 0, 1209, 1210, 3, 543, 271, 0, 1210, 1211, 3, 549, 274, 0, 1211, 1212, 5, 95, 0, 0, 1212, 1213, 3, 517, 258, 0, 1213, 1214, 3, 523, 261, 0, 1214, 1215, 3, 537, 268, 0, 1215, 1216, 3, 543, 271, 0, 1216, 1217, 3, 559, 279, 0, 1217, 200, 1, 0, 0, 0, 1218, 1219, 3, 551, 275, 0, 1219, 1220, 3, 523, 261, 0, 1220, 1221, 3, 519, 259, 0, 1221, 1222, 3, 555, 277, 0, 1222, 1223, 3, 549, 274, 0, 1223, 1224, 3, 531, 265, 0, 1224, 1225, 3, 553, 276, 0, 1225, 1226, 3, 563, 281, 0, 1226, 1227, 5, 95, 0, 0, 1227, 1228, 3, 523, 261, 0, 1228, 1229, 3, 541, 270, 0, 1229, 1230, 3, 525, 262, 0, 1230, 1231, 3, 543, 271, 0, 1231, 1232, 3, 549, 274, 0, 1232, 1233, 3, 519, 259, 0, 1233, 1234, 3, 523, 261, 0, 1234, 1235, 3, 521, 260, 0, 1235, 202, 1, 0, 0, 0, 1236, 1237, 3, 549, 274, 0, 1237, 1238, 3, 523, 261, 0, 1238, 1239, 3, 525, 262, 0, 1239, 1240, 3, 523, 261, 0, 1240, 1241, 3, 549, 274, 0, 1241, 1242, 3, 523, 261, 0, 1242, 1243, 3, 541, 270, 0, 1243, 1244, 3, 519, 259, 0, 1244, 1245, 3, 523, 261, 0, 1245, 204, 1, 0, 0, 0, 1246, 1247, 3, 519, 259, 0, 1247, 1248, 3, 555, 277, 0, 1248, 1249, 3, 517, 258, 0, 1249, 1250, 3, 523, 261, 0, 1250, 206, 1, 0, 0, 0, 1251, 1252, 3, 525, 262, 0, 1252, 1253, 3, 543, 271, 0, 1253, 1254, 3, 549, 274, 0, 1254, 1255, 3, 539, 269, 0, 1255, 1256, 3, 515, 257, 0, 1256, 1257, 3, 553, 276, 0, 1257, 208, 1, 0, 0, 0, 1258, 1259, 3, 553, 276, 0, 1259, 1260, 3, 549, 274, 0, 1260, 1261, 3, 515, 257, 0, 1261, 1262, 3, 519, 259, 0, 1262, 1263, 3, 535, 267, 0, 1263, 1264, 3, 531, 265, 0, 1264, 1265, 3, 541, 270, 0, 1265, 1266, 3, 527, 263, 0, 1266, 210, 1, 0, 0, 0, 1267, 1268, 3, 557, 278, 0, 1268, 1269, 3, 531, 265, 0, 1269, 1270, 3, 523, 261, 0, 1270, 1271, 3, 559, 279, 0, 1271, 1272, 3, 551, 275, 0, 1272, 1273, 3, 553, 276, 0, 1273, 1274, 3, 515, 257, 0, 1274, 1275, 3, 553, 276, 0, 1275, 212, 1, 0, 0, 0, 1276, 1277, 3, 519, 259, 0, 1277, 1278, 3, 555, 277, 0, 1278, 1279, 3, 551, 275, 0, 1279, 1280, 3, 553, 276, 0, 1280, 1281, 3, 543, 271, 0, 1281, 1282, 3, 539, 269, 0, 1282, 214, 1, 0, 0, 0, 1283, 1284, 3, 551, 275, 0, 1284, 1285, 3, 553, 276, 0, 1285, 1286, 3, 515, 257, 0, 1286, 1287, 3, 541, 270, 0, 1287, 1288, 3, 521, 260, 0, 1288, 1289, 3, 515, 257, 0, 1289, 1290, 3, 549, 274, 0, 1290, 1291, 3, 521, 260, 0, 1291, 216, 1, 0, 0, 0, 1292, 1293, 3, 521, 260, 0, 1293, 1294, 3, 531, 265, 0, 1294, 1295, 3, 551, 275, 0, 1295, 1296, 3, 553, 276, 0, 1296, 1297, 3, 515, 257, 0, 1297, 1298, 3, 541, 270, 0, 1298, 1299, 3, 519, 259, 0, 1299, 1300, 3, 523, 261, 0, 1300, 218, 1, 0, 0, 0, 1301, 1302, 3, 527, 263, 0, 1302, 1303, 3, 523, 261, 0, 1303, 1304, 3, 543, 271, 0, 1304, 1305, 3, 537, 268, 0, 1305, 1306, 3, 543, 271, 0, 1306, 1307, 3, 519, 259, 0, 1307, 1308, 3, 515, 257, 0, 1308, 1309, 3, 553, 276, 0, 1309, 1310, 3, 531, 265, 0, 1310, 1311, 3, 543, 271, 0, 1311, 1312, 3, 541, 270, 0, 1312, 220, 1, 0, 0, 0, 1313, 1314, 3, 527, 263, 0, 1314, 1315, 3, 549, 274, 0, 1315, 1316, 3, 543, 271, 0, 1316, 1317, 3, 555, 277, 0, 1317, 1318, 3, 545, 272, 0, 1318, 1319, 3, 531, 265, 0, 1319, 1320, 3, 541, 270, 0, 1320, 1321, 3, 527, 263, 0, 1321, 222, 1, 0, 0, 0, 1322, 1323, 3, 519, 259, 0, 1323, 1324, 3, 543, 271, 0, 1324, 1325, 3, 541, 270, 0, 1325, 1326, 3, 557, 278, 0, 1326, 1327, 3, 523, 261, 0, 1327, 1328, 3, 549, 274, 0, 1328, 1329, 3, 553, 276, 0, 1329, 1330, 3, 519, 259, 0, 1330, 1331, 3, 555, 277, 0, 1331, 1332, 3, 549, 274, 0, 1332, 1333, 3, 549, 274, 0, 1333, 1334, 3, 523, 261, 0, 1334, 1335, 3, 541, 270, 0, 1335, 1336, 3, 519, 259, 0, 1336, 1337, 3, 563, 281, 0, 1337, 224, 1, 0, 0, 0, 1338, 1339, 3, 519, 259, 0, 1339, 1340, 3, 515, 257, 0, 1340, 1341, 3, 537, 268, 0, 1341, 1342, 3, 523, 261, 0, 1342, 1343, 3, 541, 270, 0, 1343, 1344, 3, 521, 260, 0, 1344, 1345, 3, 515, 257, 0, 1345, 1346, 3, 549, 274, 0, 1346, 1347, 5, 95, 0, 0, 1347, 1348, 3, 539, 269, 0, 1348, 1349, 3, 543, 271, 0, 1349, 1350, 3, 541, 270, 0, 1350, 1351, 3, 553, 276, 0, 1351, 1352, 3, 529, 264, 0, 1352, 226, 1, 0, 0, 0, 1353, 1354, 3, 519, 259, 0, 1354, 1355, 3, 515, 257, 0, 1355, 1356, 3, 537, 268, 0, 1356, 1357, 3, 523, 261, 0, 1357, 1358, 3, 541, 270, 0, 1358, 1359, 3, 521, 260, 0, 1359, 1360, 3, 515, 257, 0, 1360, 1361, 3, 549, 274, 0, 1361, 1362, 5, 95, 0, 0, 1362, 1363, 3, 547, 273, 0, 1363, 1364, 3, 555, 277, 0, 1364, 1365, 3, 515, 257, 0, 1365, 1366, 3, 549, 274, 0, 1366, 1367, 3, 553, 276, 0, 1367, 1368, 3, 523, 261, 0, 1368, 1369, 3, 549, 274, 0, 1369, 228, 1, 0, 0, 0, 1370, 1371, 3, 519, 259, 0, 1371, 1372, 3, 515, 257, 0, 1372, 1373, 3, 537, 268, 0, 1373, 1374, 3, 523, 261, 0, 1374, 1375, 3, 541, 270, 0, 1375, 1376, 3, 521, 260, 0, 1376, 1377, 3, 515, 257, 0, 1377, 1378, 3, 549, 274, 0, 1378, 1379, 5, 95, 0, 0, 1379, 1380, 3, 563, 281, 0, 1380, 1381, 3, 523, 261, 0, 1381, 1382, 3, 515, 257, 0, 1382, 1383, 3, 549, 274, 0, 1383, 230, 1, 0, 0, 0, 1384, 1385, 3, 521, 260, 0, 1385, 1386, 3, 515, 257, 0, 1386, 1387, 3, 563, 281, 0, 1387, 1388, 5, 95, 0, 0, 1388, 1389, 3, 531, 265, 0, 1389, 1390, 3, 541, 270, 0, 1390, 1391, 5, 95, 0, 0, 1391, 1392, 3, 539, 269, 0, 1392, 1393, 3, 543, 271, 0, 1393, 1394, 3, 541, 270, 0, 1394, 1395, 3, 553, 276, 0, 1395, 1396, 3, 529, 264, 0, 1396, 232, 1, 0, 0, 0, 1397, 1398, 3, 521, 260, 0, 1398, 1399, 3, 515, 257, 0, 1399, 1400, 3, 563, 281, 0, 1400, 1401, 5, 95, 0, 0, 1401, 1402, 3, 531, 265, 0, 1402, 1403, 3, 541, 270, 0, 1403, 1404, 5, 95, 0, 0, 1404, 1405, 3, 559, 279, 0, 1405, 1406, 3, 523, 261, 0, 1406, 1407, 3, 523, 261, 0, 1407, 1408, 3, 535, 267, 0, 1408, 234, 1, 0, 0, 0, 1409, 1410, 3, 521, 260, 0, 1410, 1411, 3, 515, 257, 0, 1411, 1412, 3, 563, 281, 0, 1412, 1413, 5, 95, 0, 0, 1413, 1414, 3, 531, 265, 0, 1414, 1415, 3, 541, 270, 0, 1415, 1416, 5, 95, 0, 0, 1416, 1417, 3, 563, 281, 0, 1417, 1418, 3, 523, 261, 0, 1418, 1419, 3, 515, 257, 0, 1419, 1420, 3, 549, 274, 0, 1420, 236, 1, 0, 0, 0, 1421, 1422, 3, 521, 260, 0, 1422, 1423, 3, 515, 257, 0, 1423, 1424, 3, 563, 281, 0, 1424, 1425, 5, 95, 0, 0, 1425, 1426, 3, 543, 271, 0, 1426, 1427, 3, 541, 270, 0, 1427, 1428, 3, 537, 268, 0, 1428, 1429, 3, 563, 281, 0, 1429, 238, 1, 0, 0, 0, 1430, 1431, 3, 525, 262, 0, 1431, 1432, 3, 531, 265, 0, 1432, 1433, 3, 551, 275, 0, 1433, 1434, 3, 519, 259, 0, 1434, 1435, 3, 515, 257, 0, 1435, 1436, 3, 537, 268, 0, 1436, 1437, 5, 95, 0, 0, 1437, 1438, 3, 539, 269, 0, 1438, 1439, 3, 543, 271, 0, 1439, 1440, 3, 541, 270, 0, 1440, 1441, 3, 553, 276, 0, 1441, 1442, 3, 529, 264, 0, 1442, 240, 1, 0, 0, 0, 1443, 1444, 3, 525, 262, 0, 1444, 1445, 3, 531, 265, 0, 1445, 1446, 3, 551, 275, 0, 1446, 1447, 3, 519, 259, 0, 1447, 1448, 3, 515, 257, 0, 1448, 1449, 3, 537, 268, 0, 1449, 1450, 5, 95, 0, 0, 1450, 1451, 3, 547, 273, 0, 1451, 1452, 3, 555, 277, 0, 1452, 1453, 3, 515, 257, 0, 1453, 1454, 3, 549, 274, 0, 1454, 1455, 3, 553, 276, 0, 1455, 1456, 3, 523, 261, 0, 1456, 1457, 3, 549, 274, 0, 1457, 242, 1, 0, 0, 0, 1458, 1459, 3, 525, 262, 0, 1459, 1460, 3, 531, 265, 0, 1460, 1461, 3, 551, 275, 0, 1461, 1462, 3, 519, 259, 0, 1462, 1463, 3, 515, 257, 0, 1463, 1464, 3, 537, 268, 0, 1464, 1465, 5, 95, 0, 0, 1465, 1466, 3, 563, 281, 0, 1466, 1467, 3, 523, 261, 0, 1467, 1468, 3, 515, 257, 0, 1468, 1469, 3, 549, 274, 0, 1469, 244, 1, 0, 0, 0, 1470, 1471, 3, 529, 264, 0, 1471, 1472, 3, 543, 271, 0, 1472, 1473, 3, 555, 277, 0, 1473, 1474, 3, 549, 274, 0, 1474, 1475, 5, 95, 0, 0, 1475, 1476, 3, 531, 265, 0, 1476, 1477, 3, 541, 270, 0, 1477, 1478, 5, 95, 0, 0, 1478, 1479, 3, 521, 260, 0, 1479, 1480, 3, 515, 257, 0, 1480, 1481, 3, 563, 281, 0, 1481, 246, 1, 0, 0, 0, 1482, 1483, 3, 559, 279, 0, 1483, 1484, 3, 523, 261, 0, 1484, 1485, 3, 523, 261, 0, 1485, 1486, 3, 535, 267, 0, 1486, 1487, 5, 95, 0, 0, 1487, 1488, 3, 531, 265, 0, 1488, 1489, 3, 541, 270, 0, 1489, 1490, 5, 95, 0, 0, 1490, 1491, 3, 539, 269, 0, 1491, 1492, 3, 543, 271, 0, 1492, 1493, 3, 541, 270, 0, 1493, 1494, 3, 553, 276, 0, 1494, 1495, 3, 529, 264, 0, 1495, 248, 1, 0, 0, 0, 1496, 1497, 3, 559, 279, 0, 1497, 1498, 3, 523, 261, 0, 1498, 1499, 3, 523, 261, 0, 1499, 1500, 3, 535, 267, 0, 1500, 1501, 5, 95, 0, 0, 1501, 1502, 3, 531, 265, 0, 1502, 1503, 3, 541, 270, 0, 1503, 1504, 5, 95, 0, 0, 1504, 1505, 3, 563, 281, 0, 1505, 1506, 3, 523, 261, 0, 1506, 1507, 3, 515, 257, 0, 1507, 1508, 3, 549, 274, 0, 1508, 250, 1, 0, 0, 0, 1509, 1510, 3, 519, 259, 0, 1510, 1511, 3, 543, 271, 0, 1511, 1512, 3, 541, 270, 0, 1512, 1513, 3, 557, 278, 0, 1513, 1514, 3, 523, 261, 0, 1514, 1515, 3, 549, 274, 0, 1515, 1516, 3, 553, 276, 0, 1516, 1517, 5, 95, 0, 0, 1517, 1518, 3, 553, 276, 0, 1518, 1519, 3, 531, 265, 0, 1519, 1520, 3, 539, 269, 0, 1520, 1521, 3, 523, 261, 0, 1521, 1522, 3, 565, 282, 0, 1522, 1523, 3, 543, 271, 0, 1523, 1524, 3, 541, 270, 0, 1524, 1525, 3, 523, 261, 0, 1525, 252, 1, 0, 0, 0, 1526, 1527, 3, 563, 281, 0, 1527, 1528, 3, 523, 261, 0, 1528, 1529, 3, 551, 275, 0, 1529, 1530, 3, 553, 276, 0, 1530, 1531, 3, 523, 261, 0, 1531, 1532, 3, 549, 274, 0, 1532, 1533, 3, 521, 260, 0, 1533, 1534, 3, 515, 257, 0, 1534, 1535, 3, 563, 281, 0, 1535, 254, 1, 0, 0, 0, 1536, 1537, 3, 553, 276, 0, 1537, 1538, 3, 543, 271, 0, 1538, 1539, 3, 521, 260, 0, 1539, 1540, 3, 515, 257, 0, 1540, 1541, 3, 563, 281, 0, 1541, 256, 1, 0, 0, 0, 1542, 1543, 3, 553, 276, 0, 1543, 1544, 3, 543, 271, 0, 1544, 1545, 3, 539, 269, 0, 1545, 1546, 3, 543, 271, 0, 1546, 1547, 3, 549, 274, 0, 1547, 1548, 3, 549, 274, 0, 1548, 1549, 3, 543, 271, 0, 1549, 1550, 3, 559, 279, 0, 1550, 258, 1, 0, 0, 0, 1551, 1552, 3, 537, 268, 0, 1552, 1553, 3, 515, 257, 0, 1553, 1554, 3, 551, 275, 0, 1554, 1555, 3, 553, 276, 0, 1555, 1556, 5, 95, 0, 0, 1556, 1557, 3, 559, 279, 0, 1557, 1558, 3, 523, 261, 0, 1558, 1559, 3, 523, 261, 0, 1559, 1560, 3, 535, 267, 0, 1560, 260, 1, 0, 0, 0, 1561, 1562, 3, 553, 276, 0, 1562, 1563, 3, 529, 264, 0, 1563, 1564, 3, 531, 265, 0, 1564, 1565, 3, 551, 275, 0, 1565, 1566, 5, 95, 0, 0, 1566, 1567, 3, 559, 279, 0, 1567, 1568, 3, 523, 261, 0, 1568, 1569, 3, 523, 261, 0, 1569, 1570, 3, 535, 267, 0, 1570, 262, 1, 0, 0, 0, 1571, 1572, 3, 541, 270, 0, 1572, 1573, 3, 523, 261, 0, 1573, 1574, 3, 561, 280, 0, 1574, 1575, 3, 553, 276, 0, 1575, 1576, 5, 95, 0, 0, 1576, 1577, 3, 559, 279, 0, 1577, 1578, 3, 523, 261, 0, 1578, 1579, 3, 523, 261, 0, 1579, 1580, 3, 535, 267, 0, 1580, 264, 1, 0, 0, 0, 1581, 1582, 3, 537, 268, 0, 1582, 1583, 3, 515, 257, 0, 1583, 1584, 3, 551, 275, 0, 1584, 1585, 3, 553, 276, 0, 1585, 1586, 5, 95, 0, 0, 1586, 1587, 3, 539, 269, 0, 1587, 1588, 3, 543, 271, 0, 1588, 1589, 3, 541, 270, 0, 1589, 1590, 3, 553, 276, 0, 1590, 1591, 3, 529, 264, 0, 1591, 266, 1, 0, 0, 0, 1592, 1593, 3, 553, 276, 0, 1593, 1594, 3, 529, 264, 0, 1594, 1595, 3, 531, 265, 0, 1595, 1596, 3, 551, 275, 0, 1596, 1597, 5, 95, 0, 0, 1597, 1598, 3, 539, 269, 0, 1598, 1599, 3, 543, 271, 0, 1599, 1600, 3, 541, 270, 0, 1600, 1601, 3, 553, 276, 0, 1601, 1602, 3, 529, 264, 0, 1602, 268, 1, 0, 0, 0, 1603, 1604, 3, 541, 270, 0, 1604, 1605, 3, 523, 261, 0, 1605, 1606, 3, 561, 280, 0, 1606, 1607, 3, 553, 276, 0, 1607, 1608, 5, 95, 0, 0, 1608, 1609, 3, 539, 269, 0, 1609, 1610, 3, 543, 271, 0, 1610, 1611, 3, 541, 270, 0, 1611, 1612, 3, 553, 276, 0, 1612, 1613, 3, 529, 264, 0, 1613, 270, 1, 0, 0, 0, 1614, 1615, 3, 537, 268, 0, 1615, 1616, 3, 515, 257, 0, 1616, 1617, 3, 551, 275, 0, 1617, 1618, 3, 553, 276, 0, 1618, 1619, 5, 95, 0, 0, 1619, 1620, 5, 57, 0, 0, 1620, 1621, 5, 48, 0, 0, 1621, 1622, 5, 95, 0, 0, 1622, 1623, 1, 0, 0, 0, 1623, 1624, 3, 521, 260, 0, 1624, 1625, 3, 515, 257, 0, 1625, 1626, 3, 563, 281, 0, 1626, 1627, 3, 551, 275, 0, 1627, 272, 1, 0, 0, 0, 1628, 1629, 3, 541, 270, 0, 1629, 1630, 3, 523, 261, 0, 1630, 1631, 3, 561, 280, 0, 1631, 1632, 3, 553, 276, 0, 1632, 1633, 5, 95, 0, 0, 1633, 1634, 5, 57, 0, 0, 1634, 1635, 5, 48, 0, 0, 1635, 1636, 5, 95, 0, 0, 1636, 1637, 1, 0, 0, 0, 1637, 1638, 3, 521, 260, 0, 1638, 1639, 3, 515, 257, 0, 1639, 1640, 3, 563, 281, 0, 1640, 1641, 3, 551, 275, 0, 1641, 274, 1, 0, 0, 0, 1642, 1643, 3, 537, 268, 0, 1643, 1644, 3, 515, 257, 0, 1644, 1645, 3, 551, 275, 0, 1645, 1646, 3, 553, 276, 0, 1646, 1647, 5, 95, 0, 0, 1647, 1648, 3, 541, 270, 0, 1648, 1649, 5, 95, 0, 0, 1649, 1650, 3, 521, 260, 0, 1650, 1651, 3, 515, 257, 0, 1651, 1652, 3, 563, 281, 0, 1652, 1653, 3, 551, 275, 0, 1653, 276, 1, 0, 0, 0, 1654, 1655, 3, 541, 270, 0, 1655, 1656, 3, 523, 261, 0, 1656, 1657, 3, 561, 280, 0, 1657, 1658, 3, 553, 276, 0, 1658, 1659, 5, 95, 0, 0, 1659, 1660, 3, 541, 270, 0, 1660, 1661, 5, 95, 0, 0, 1661, 1662, 3, 521, 260, 0, 1662, 1663, 3, 515, 257, 0, 1663, 1664, 3, 563, 281, 0, 1664, 1665, 3, 551, 275, 0, 1665, 278, 1, 0, 0, 0, 1666, 1667, 3, 541, 270, 0, 1667, 1668, 3, 523, 261, 0, 1668, 1669, 3, 561, 280, 0, 1669, 1670, 3, 553, 276, 0, 1670, 1671, 5, 95, 0, 0, 1671, 1672, 3, 541, 270, 0, 1672, 1673, 5, 95, 0, 0, 1673, 1674, 3, 559, 279, 0, 1674, 1675, 3, 523, 261, 0, 1675, 1676, 3, 523, 261, 0, 1676, 1677, 3, 535, 267, 0, 1677, 1678, 3, 551, 275, 0, 1678, 280, 1, 0, 0, 0, 1679, 1680, 3, 537, 268, 0, 1680, 1681, 3, 515, 257, 0, 1681, 1682, 3, 551, 275, 0, 1682, 1683, 3, 553, 276, 0, 1683, 1684, 5, 95, 0, 0, 1684, 1685, 3, 541, 270, 0, 1685, 1686, 5, 95, 0, 0, 1686, 1687, 3, 559, 279, 0, 1687, 1688, 3, 523, 261, 0, 1688, 1689, 3, 523, 261, 0, 1689, 1690, 3, 535, 267, 0, 1690, 1691, 3, 551, 275, 0, 1691, 282, 1, 0, 0, 0, 1692, 1693, 3, 541, 270, 0, 1693, 1694, 3, 523, 261, 0, 1694, 1695, 3, 561, 280, 0, 1695, 1696, 3, 553, 276, 0, 1696, 1697, 5, 95, 0, 0, 1697, 1698, 3, 541, 270, 0, 1698, 1699, 5, 95, 0, 0, 1699, 1700, 3, 539, 269, 0, 1700, 1701, 3, 543, 271, 0, 1701, 1702, 3, 541, 270, 0, 1702, 1703, 3, 553, 276, 0, 1703, 1704, 3, 529, 264, 0, 1704, 1705, 3, 551, 275, 0, 1705, 284, 1, 0, 0, 0, 1706, 1707, 3, 537, 268, 0, 1707, 1708, 3, 515, 257, 0, 1708, 1709, 3, 551, 275, 0, 1709, 1710, 3, 553, 276, 0, 1710, 1711, 5, 95, 0, 0, 1711, 1712, 3, 541, 270, 0, 1712, 1713, 5, 95, 0, 0, 1713, 1714, 3, 539, 269, 0, 1714, 1715, 3, 543, 271, 0, 1715, 1716, 3, 541, 270, 0, 1716, 1717, 3, 553, 276, 0, 1717, 1718, 3, 529, 264, 0, 1718, 1719, 3, 551, 275, 0, 1719, 286, 1, 0, 0, 0, 1720, 1721, 3, 553, 276, 0, 1721, 1722, 3, 529, 264, 0, 1722, 1723, 3, 531, 265, 0, 1723, 1724, 3, 551, 275, 0, 1724, 1725, 5, 95, 0, 0, 1725, 1726, 3, 547, 273, 0, 1726, 1727, 3, 555, 277, 0, 1727, 1728, 3, 515, 257, 0, 1728, 1729, 3, 549, 274, 0, 1729, 1730, 3, 553, 276, 0, 1730, 1731, 3, 523, 261, 0, 1731, 1732, 3, 549, 274, 0, 1732, 288, 1, 0, 0, 0, 1733, 1734, 3, 537, 268, 0, 1734, 1735, 3, 515, 257, 0, 1735, 1736, 3, 551, 275, 0, 1736, 1737, 3, 553, 276, 0, 1737, 1738, 5, 95, 0, 0, 1738, 1739, 3, 547, 273, 0, 1739, 1740, 3, 555, 277, 0, 1740, 1741, 3, 515, 257, 0, 1741, 1742, 3, 549, 274, 0, 1742, 1743, 3, 553, 276, 0, 1743, 1744, 3, 523, 261, 0, 1744, 1745, 3, 549, 274, 0, 1745, 290, 1, 0, 0, 0, 1746, 1747, 3, 541, 270, 0, 1747, 1748, 3, 523, 261, 0, 1748, 1749, 3, 561, 280, 0, 1749, 1750, 3, 553, 276, 0, 1750, 1751, 5, 95, 0, 0, 1751, 1752, 3, 547, 273, 0, 1752, 1753, 3, 555, 277, 0, 1753, 1754, 3, 515, 257, 0, 1754, 1755, 3, 549, 274, 0, 1755, 1756, 3, 553, 276, 0, 1756, 1757, 3, 523, 261, 0, 1757, 1758, 3, 549, 274, 0, 1758, 292, 1, 0, 0, 0, 1759, 1760, 3, 541, 270, 0, 1760, 1761, 3, 523, 261, 0, 1761, 1762, 3, 561, 280, 0, 1762, 1763, 3, 553, 276, 0, 1763, 1764, 5, 95, 0, 0, 1764, 1765, 3, 541, 270, 0, 1765, 1766, 5, 95, 0, 0, 1766, 1767, 3, 547, 273, 0, 1767, 1768, 3, 555, 277, 0, 1768, 1769, 3, 515, 257, 0, 1769, 1770, 3, 549, 274, 0, 1770, 1771, 3, 553, 276, 0, 1771, 1772, 3, 523, 261, 0, 1772, 1773, 3, 549, 274, 0, 1773, 1774, 3, 551, 275, 0, 1774, 294, 1, 0, 0, 0, 1775, 1776, 3, 537, 268, 0, 1776, 1777, 3, 515, 257, 0, 1777, 1778, 3, 551, 275, 0, 1778, 1779, 3, 553, 276, 0, 1779, 1780, 5, 95, 0, 0, 1780, 1781, 3, 541, 270, 0, 1781, 1782, 5, 95, 0, 0, 1782, 1783, 3, 547, 273, 0, 1783, 1784, 3, 555, 277, 0, 1784, 1785, 3, 515, 257, 0, 1785, 1786, 3, 549, 274, 0, 1786, 1787, 3, 553, 276, 0, 1787, 1788, 3, 523, 261, 0, 1788, 1789, 3, 549, 274, 0, 1789, 1790, 3, 551, 275, 0, 1790, 296, 1, 0, 0, 0, 1791, 1792, 3, 553, 276, 0, 1792, 1793, 3, 529, 264, 0, 1793, 1794, 3, 531, 265, 0, 1794, 1795, 3, 551, 275, 0, 1795, 1796, 5, 95, 0, 0, 1796, 1797, 3, 563, 281, 0, 1797, 1798, 3, 523, 261, 0, 1798, 1799, 3, 515, 257, 0, 1799, 1800, 3, 549, 274, 0, 1800, 298, 1, 0, 0, 0, 1801, 1802, 3, 537, 268, 0, 1802, 1803, 3, 515, 257, 0, 1803, 1804, 3, 551, 275, 0, 1804, 1805, 3, 553, 276, 0, 1805, 1806, 5, 95, 0, 0, 1806, 1807, 3, 563, 281, 0, 1807, 1808, 3, 523, 261, 0, 1808, 1809, 3, 515, 257, 0, 1809, 1810, 3, 549, 274, 0, 1810, 300, 1, 0, 0, 0, 1811, 1812, 3, 541, 270, 0, 1812, 1813, 3, 523, 261, 0, 1813, 1814, 3, 561, 280, 0, 1814, 1815, 3, 553, 276, 0, 1815, 1816, 5, 95, 0, 0, 1816, 1817, 3, 563, 281, 0, 1817, 1818, 3, 523, 261, 0, 1818, 1819, 3, 515, 257, 0, 1819, 1820, 3, 549, 274, 0, 1820, 302, 1, 0, 0, 0, 1821, 1822, 3, 541, 270, 0, 1822, 1823, 3, 523, 261, 0, 1823, 1824, 3, 561, 280, 0, 1824, 1825, 3, 553, 276, 0, 1825, 1826, 5, 95, 0, 0, 1826, 1827, 3, 541, 270, 0, 1827, 1828, 5, 95, 0, 0, 1828, 1829, 3, 563, 281, 0, 1829, 1830, 3, 523, 261, 0, 1830, 1831, 3, 515, 257, 0, 1831, 1832, 3, 549, 274, 0, 1832, 1833, 3, 551, 275, 0, 1833, 304, 1, 0, 0, 0, 1834, 1835, 3, 537, 268, 0, 1835, 1836, 3, 515, 257, 0, 1836, 1837, 3, 551, 275, 0, 1837, 1838, 3, 553, 276, 0, 1838, 1839, 5, 95, 0, 0, 1839, 1840, 3, 541, 270, 0, 1840, 1841, 5, 95, 0, 0, 1841, 1842, 3, 563, 281, 0, 1842, 1843, 3, 523, 261, 0, 1843, 1844, 3, 515, 257, 0, 1844, 1845, 3, 549, 274, 0, 1845, 1846, 3, 551, 275, 0, 1846, 306, 1, 0, 0, 0, 1847, 1848, 3, 553, 276, 0, 1848, 1849, 3, 529, 264, 0, 1849, 1850, 3, 531, 265, 0, 1850, 1851, 3, 551, 275, 0, 1851, 1852, 5, 95, 0, 0, 1852, 1853, 3, 525, 262, 0, 1853, 1854, 3, 531, 265, 0, 1854, 1855, 3, 551, 275, 0, 1855, 1856, 3, 519, 259, 0, 1856, 1857, 3, 515, 257, 0, 1857, 1858, 3, 537, 268, 0, 1858, 1859, 5, 95, 0, 0, 1859, 1860, 3, 547, 273, 0, 1860, 1861, 3, 555, 277, 0, 1861, 1862, 3, 515, 257, 0, 1862, 1863, 3, 549, 274, 0, 1863, 1864, 3, 553, 276, 0, 1864, 1865, 3, 523, 261, 0, 1865, 1866, 3, 549, 274, 0, 1866, 308, 1, 0, 0, 0, 1867, 1868, 3, 537, 268, 0, 1868, 1869, 3, 515, 257, 0, 1869, 1870, 3, 551, 275, 0, 1870, 1871, 3, 553, 276, 0, 1871, 1872, 5, 95, 0, 0, 1872, 1873, 3, 525, 262, 0, 1873, 1874, 3, 531, 265, 0, 1874, 1875, 3, 551, 275, 0, 1875, 1876, 3, 519, 259, 0, 1876, 1877, 3, 515, 257, 0, 1877, 1878, 3, 537, 268, 0, 1878, 1879, 5, 95, 0, 0, 1879, 1880, 3, 547, 273, 0, 1880, 1881, 3, 555, 277, 0, 1881, 1882, 3, 515, 257, 0, 1882, 1883, 3, 549, 274, 0, 1883, 1884, 3, 553, 276, 0, 1884, 1885, 3, 523, 261, 0, 1885, 1886, 3, 549, 274, 0, 1886, 310, 1, 0, 0, 0, 1887, 1888, 3, 541, 270, 0, 1888, 1889, 3, 523, 261, 0, 1889, 1890, 3, 561, 280, 0, 1890, 1891, 3, 553, 276, 0, 1891, 1892, 5, 95, 0, 0, 1892, 1893, 3, 525, 262, 0, 1893, 1894, 3, 531, 265, 0, 1894, 1895, 3, 551, 275, 0, 1895, 1896, 3, 519, 259, 0, 1896, 1897, 3, 515, 257, 0, 1897, 1898, 3, 537, 268, 0, 1898, 1899, 5, 95, 0, 0, 1899, 1900, 3, 547, 273, 0, 1900, 1901, 3, 555, 277, 0, 1901, 1902, 3, 515, 257, 0, 1902, 1903, 3, 549, 274, 0, 1903, 1904, 3, 553, 276, 0, 1904, 1905, 3, 523, 261, 0, 1905, 1906, 3, 549, 274, 0, 1906, 312, 1, 0, 0, 0, 1907, 1908, 3, 541, 270, 0, 1908, 1909, 3, 523, 261, 0, 1909, 1910, 3, 561, 280, 0, 1910, 1911, 3, 553, 276, 0, 1911, 1912, 5, 95, 0, 0, 1912, 1913, 3, 541, 270, 0, 1913, 1914, 5, 95, 0, 0, 1914, 1915, 3, 525, 262, 0, 1915, 1916, 3, 531, 265, 0, 1916, 1917, 3, 551, 275, 0, 1917, 1918, 3, 519, 259, 0, 1918, 1919, 3, 515, 257, 0, 1919, 1920, 3, 537, 268, 0, 1920, 1921, 5, 95, 0, 0, 1921, 1922, 3, 547, 273, 0, 1922, 1923, 3, 555, 277, 0, 1923, 1924, 3, 515, 257, 0, 1924, 1925, 3, 549, 274, 0, 1925, 1926, 3, 553, 276, 0, 1926, 1927, 3, 523, 261, 0, 1927, 1928, 3, 549, 274, 0, 1928, 1929, 3, 551, 275, 0, 1929, 314, 1, 0, 0, 0, 1930, 1931, 3, 537, 268, 0, 1931, 1932, 3, 515, 257, 0, 1932, 1933, 3, 551, 275, 0, 1933, 1934, 3, 553, 276, 0, 1934, 1935, 5, 95, 0, 0, 1935, 1936, 3, 541, 270, 0, 1936, 1937, 5, 95, 0, 0, 1937, 1938, 3, 525, 262, 0, 1938, 1939, 3, 531, 265, 0, 1939, 1940, 3, 551, 275, 0, 1940, 1941, 3, 519, 259, 0, 1941, 1942, 3, 515, 257, 0, 1942, 1943, 3, 537, 268, 0, 1943, 1944, 5, 95, 0, 0, 1944, 1945, 3, 547, 273, 0, 1945, 1946, 3, 555, 277, 0, 1946, 1947, 3, 515, 257, 0, 1947, 1948, 3, 549, 274, 0, 1948, 1949, 3, 553, 276, 0, 1949, 1950, 3, 523, 261, 0, 1950, 1951, 3, 549, 274, 0, 1951, 1952, 3, 551, 275, 0, 1952, 316, 1, 0, 0, 0, 1953, 1954, 3, 553, 276, 0, 1954, 1955, 3, 529, 264, 0, 1955, 1956, 3, 531, 265, 0, 1956, 1957, 3, 551, 275, 0, 1957, 1958, 5, 95, 0, 0, 1958, 1959, 3, 525, 262, 0, 1959, 1960, 3, 531, 265, 0, 1960, 1961, 3, 551, 275, 0, 1961, 1962, 3, 519, 259, 0, 1962, 1963, 3, 515, 257, 0, 1963, 1964, 3, 537, 268, 0, 1964, 1965, 5, 95, 0, 0, 1965, 1966, 3, 563, 281, 0, 1966, 1967, 3, 523, 261, 0, 1967, 1968, 3, 515, 257, 0, 1968, 1969, 3, 549, 274, 0, 1969, 318, 1, 0, 0, 0, 1970, 1971, 3, 537, 268, 0, 1971, 1972, 3, 515, 257, 0, 1972, 1973, 3, 551, 275, 0, 1973, 1974, 3, 553, 276, 0, 1974, 1975, 5, 95, 0, 0, 1975, 1976, 3, 525, 262, 0, 1976, 1977, 3, 531, 265, 0, 1977, 1978, 3, 551, 275, 0, 1978, 1979, 3, 519, 259, 0, 1979, 1980, 3, 515, 257, 0, 1980, 1981, 3, 537, 268, 0, 1981, 1982, 5, 95, 0, 0, 1982, 1983, 3, 563, 281, 0, 1983, 1984, 3, 523, 261, 0, 1984, 1985, 3, 515, 257, 0, 1985, 1986, 3, 549, 274, 0, 1986, 320, 1, 0, 0, 0, 1987, 1988, 3, 541, 270, 0, 1988, 1989, 3, 523, 261, 0, 1989, 1990, 3, 561, 280, 0, 1990, 1991, 3, 553, 276, 0, 1991, 1992, 5, 95, 0, 0, 1992, 1993, 3, 525, 262, 0, 1993, 1994, 3, 531, 265, 0, 1994, 1995, 3, 551, 275, 0, 1995, 1996, 3, 519, 259, 0, 1996, 1997, 3, 515, 257, 0, 1997, 1998, 3, 537, 268, 0, 1998, 1999, 5, 95, 0, 0, 1999, 2000, 3, 563, 281, 0, 2000, 2001, 3, 523, 261, 0, 2001, 2002, 3, 515, 257, 0, 2002, 2003, 3, 549, 274, 0, 2003, 322, 1, 0, 0, 0, 2004, 2005, 3, 541, 270, 0, 2005, 2006, 3, 523, 261, 0, 2006, 2007, 3, 561, 280, 0, 2007, 2008, 3, 553, 276, 0, 2008, 2009, 5, 95, 0, 0, 2009, 2010, 3, 541, 270, 0, 2010, 2011, 5, 95, 0, 0, 2011, 2012, 3, 525, 262, 0, 2012, 2013, 3, 531, 265, 0, 2013, 2014, 3, 551, 275, 0, 2014, 2015, 3, 519, 259, 0, 2015, 2016, 3, 515, 257, 0, 2016, 2017, 3, 537, 268, 0, 2017, 2018, 5, 95, 0, 0, 2018, 2019, 3, 563, 281, 0, 2019, 2020, 3, 523, 261, 0, 2020, 2021, 3, 515, 257, 0, 2021, 2022, 3, 549, 274, 0, 2022, 2023, 3, 551, 275, 0, 2023, 324, 1, 0, 0, 0, 2024, 2025, 3, 537, 268, 0, 2025, 2026, 3, 515, 257, 0, 2026, 2027, 3, 551, 275, 0, 2027, 2028, 3, 553, 276, 0, 2028, 2029, 5, 95, 0, 0, 2029, 2030, 3, 541, 270, 0, 2030, 2031, 5, 95, 0, 0, 2031, 2032, 3, 525, 262, 0, 2032, 2033, 3, 531, 265, 0, 2033, 2034, 3, 551, 275, 0, 2034, 2035, 3, 519, 259, 0, 2035, 2036, 3, 515, 257, 0, 2036, 2037, 3, 537, 268, 0, 2037, 2038, 5, 95, 0, 0, 2038, 2039, 3, 563, 281, 0, 2039, 2040, 3, 523, 261, 0, 2040, 2041, 3, 515, 257, 0, 2041, 2042, 3, 549, 274, 0, 2042, 2043, 3, 551, 275, 0, 2043, 326, 1, 0, 0, 0, 2044, 2045, 3, 541, 270, 0, 2045, 2046, 5, 95, 0, 0, 2046, 2047, 3, 521, 260, 0, 2047, 2048, 3, 515, 257, 0, 2048, 2049, 3, 563, 281, 0, 2049, 2050, 3, 551, 275, 0, 2050, 2051, 5, 95, 0, 0, 2051, 2052, 3, 515, 257, 0, 2052, 2053, 3, 527, 263, 0, 2053, 2054, 3, 543, 271, 0, 2054, 328, 1, 0, 0, 0, 2055, 2056, 3, 541, 270, 0, 2056, 2057, 5, 95, 0, 0, 2057, 2058, 3, 559, 279, 0, 2058, 2059, 3, 523, 261, 0, 2059, 2060, 3, 523, 261, 0, 2060, 2061, 3, 535, 267, 0, 2061, 2062, 3, 551, 275, 0, 2062, 2063, 5, 95, 0, 0, 2063, 2064, 3, 515, 257, 0, 2064, 2065, 3, 527, 263, 0, 2065, 2066, 3, 543, 271, 0, 2066, 330, 1, 0, 0, 0, 2067, 2068, 3, 541, 270, 0, 2068, 2069, 5, 95, 0, 0, 2069, 2070, 3, 539, 269, 0, 2070, 2071, 3, 543, 271, 0, 2071, 2072, 3, 541, 270, 0, 2072, 2073, 3, 553, 276, 0, 2073, 2074, 3, 529, 264, 0, 2074, 2075, 3, 551, 275, 0, 2075, 2076, 5, 95, 0, 0, 2076, 2077, 3, 515, 257, 0, 2077, 2078, 3, 527, 263, 0, 2078, 2079, 3, 543, 271, 0, 2079, 332, 1, 0, 0, 0, 2080, 2081, 3, 541, 270, 0, 2081, 2082, 5, 95, 0, 0, 2082, 2083, 3, 547, 273, 0, 2083, 2084, 3, 555, 277, 0, 2084, 2085, 3, 515, 257, 0, 2085, 2086, 3, 549, 274, 0, 2086, 2087, 3, 553, 276, 0, 2087, 2088, 3, 523, 261, 0, 2088, 2089, 3, 549, 274, 0, 2089, 2090, 3, 551, 275, 0, 2090, 2091, 5, 95, 0, 0, 2091, 2092, 3, 515, 257, 0, 2092, 2093, 3, 527, 263, 0, 2093, 2094, 3, 543, 271, 0, 2094, 334, 1, 0, 0, 0, 2095, 2096, 3, 541, 270, 0, 2096, 2097, 5, 95, 0, 0, 2097, 2098, 3, 525, 262, 0, 2098, 2099, 3, 531, 265, 0, 2099, 2100, 3, 551, 275, 0, 2100, 2101, 3, 519, 259, 0, 2101, 2102, 3, 515, 257, 0, 2102, 2103, 3, 537, 268, 0, 2103, 2104, 5, 95, 0, 0, 2104, 2105, 3, 547, 273, 0, 2105, 2106, 3, 555, 277, 0, 2106, 2107, 3, 515, 257, 0, 2107, 2108, 3, 549, 274, 0, 2108, 2109, 3, 553, 276, 0, 2109, 2110, 3, 523, 261, 0, 2110, 2111, 3, 549, 274, 0, 2111, 2112, 3, 551, 275, 0, 2112, 2113, 5, 95, 0, 0, 2113, 2114, 3, 515, 257, 0, 2114, 2115, 3, 527, 263, 0, 2115, 2116, 3, 543, 271, 0, 2116, 336, 1, 0, 0, 0, 2117, 2118, 3, 541, 270, 0, 2118, 2119, 5, 95, 0, 0, 2119, 2120, 3, 563, 281, 0, 2120, 2121, 3, 523, 261, 0, 2121, 2122, 3, 515, 257, 0, 2122, 2123, 3, 549, 274, 0, 2123, 2124, 3, 551, 275, 0, 2124, 2125, 5, 95, 0, 0, 2125, 2126, 3, 515, 257, 0, 2126, 2127, 3, 527, 263, 0, 2127, 2128, 3, 543, 271, 0, 2128, 338, 1, 0, 0, 0, 2129, 2130, 3, 541, 270, 0, 2130, 2131, 5, 95, 0, 0, 2131, 2132, 3, 525, 262, 0, 2132, 2133, 3, 531, 265, 0, 2133, 2134, 3, 551, 275, 0, 2134, 2135, 3, 519, 259, 0, 2135, 2136, 3, 515, 257, 0, 2136, 2137, 3, 537, 268, 0, 2137, 2138, 5, 95, 0, 0, 2138, 2139, 3, 563, 281, 0, 2139, 2140, 3, 523, 261, 0, 2140, 2141, 3, 515, 257, 0, 2141, 2142, 3, 549, 274, 0, 2142, 2143, 3, 551, 275, 0, 2143, 2144, 5, 95, 0, 0, 2144, 2145, 3, 515, 257, 0, 2145, 2146, 3, 527, 263, 0, 2146, 2147, 3, 543, 271, 0, 2147, 340, 1, 0, 0, 0, 2148, 2149, 3, 399, 199, 0, 2149, 2150, 3, 399, 199, 0, 2150, 2151, 3, 399, 199, 0, 2151, 2152, 3, 399, 199, 0, 2152, 2153, 5, 45, 0, 0, 2153, 2154, 3, 399, 199, 0, 2154, 2155, 3, 399, 199, 0, 2155, 2156, 5, 45, 0, 0, 2156, 2157, 3, 399, 199, 0, 2157, 2158, 3, 399, 199, 0, 2158, 342, 1, 0, 0, 0, 2159, 2160, 3, 399, 199, 0, 2160, 2161, 3, 399, 199, 0, 2161, 2162, 5, 58, 0, 0, 2162, 2163, 3, 399, 199, 0, 2163, 2164, 3, 399, 199, 0, 2164, 2165, 5, 58, 0, 0, 2165, 2166, 3, 399, 199, 0, 2166, 2173, 3, 399, 199, 0, 2167, 2169, 5, 46, 0, 0, 2168, 2170, 3, 399, 199, 0, 2169, 2168, 1, 0, 0, 0, 2170, 2171, 1, 0, 0, 0, 2171, 2169, 1, 0, 0, 0, 2171, 2172, 1, 0, 0, 0, 2172, 2174, 1, 0, 0, 0, 2173, 2167, 1, 0, 0, 0, 2173, 2174, 1, 0, 0, 0, 2174, 2190, 1, 0, 0, 0, 2175, 2191, 3, 565, 282, 0, 2176, 2178, 7, 0, 0, 0, 2177, 2179, 3, 399, 199, 0, 2178, 2177, 1, 0, 0, 0, 2179, 2180, 1, 0, 0, 0, 2180, 2178, 1, 0, 0, 0, 2180, 2181, 1, 0, 0, 0, 2181, 2188, 1, 0, 0, 0, 2182, 2184, 5, 58, 0, 0, 2183, 2185, 3, 399, 199, 0, 2184, 2183, 1, 0, 0, 0, 2185, 2186, 1, 0, 0, 0, 2186, 2184, 1, 0, 0, 0, 2186, 2187, 1, 0, 0, 0, 2187, 2189, 1, 0, 0, 0, 2188, 2182, 1, 0, 0, 0, 2188, 2189, 1, 0, 0, 0, 2189, 2191, 1, 0, 0, 0, 2190, 2175, 1, 0, 0, 0, 2190, 2176, 1, 0, 0, 0, 2191, 344, 1, 0, 0, 0, 2192, 2193, 3, 341, 170, 0, 2193, 2194, 3, 553, 276, 0, 2194, 2195, 3, 343, 171, 0, 2195, 346, 1, 0, 0, 0, 2196, 2197, 7, 1, 0, 0, 2197, 2198, 7, 1, 0, 0, 2198, 2200, 7, 1, 0, 0, 2199, 2201, 3, 399, 199, 0, 2200, 2199, 1, 0, 0, 0, 2201, 2202, 1, 0, 0, 0, 2202, 2200, 1, 0, 0, 0, 2202, 2203, 1, 0, 0, 0, 2203, 348, 1, 0, 0, 0, 2204, 2205, 3, 525, 262, 0, 2205, 2206, 3, 531, 265, 0, 2206, 2207, 3, 541, 270, 0, 2207, 2208, 3, 521, 260, 0, 2208, 350, 1, 0, 0, 0, 2209, 2210, 3, 523, 261, 0, 2210, 2211, 3, 539, 269, 0, 2211, 2212, 3, 515, 257, 0, 2212, 2213, 3, 531, 265, 0, 2213, 2214, 3, 537, 268, 0, 2214, 352, 1, 0, 0, 0, 2215, 2216, 3, 541, 270, 0, 2216, 2217, 3, 515, 257, 0, 2217, 2218, 3, 539, 269, 0, 2218, 2219, 3, 523, 261, 0, 2219, 354, 1, 0, 0, 0, 2220, 2221, 3, 545, 272, 0, 2221, 2222, 3, 529, 264, 0, 2222, 2223, 3, 543, 271, 0, 2223, 2224, 3, 541, 270, 0, 2224, 2225, 3, 523, 261, 0, 2225, 356, 1, 0, 0, 0, 2226, 2227, 3, 551, 275, 0, 2227, 2228, 3, 531, 265, 0, 2228, 2229, 3, 521, 260, 0, 2229, 2230, 3, 523, 261, 0, 2230, 2231, 3, 517, 258, 0, 2231, 2232, 3, 515, 257, 0, 2232, 2233, 3, 549, 274, 0, 2233, 358, 1, 0, 0, 0, 2234, 2235, 3, 525, 262, 0, 2235, 2236, 3, 531, 265, 0, 2236, 2237, 3, 523, 261, 0, 2237, 2238, 3, 537, 268, 0, 2238, 2239, 3, 521, 260, 0, 2239, 2240, 3, 551, 275, 0, 2240, 360, 1, 0, 0, 0, 2241, 2242, 3, 539, 269, 0, 2242, 2243, 3, 523, 261, 0, 2243, 2244, 3, 553, 276, 0, 2244, 2245, 3, 515, 257, 0, 2245, 2246, 3, 521, 260, 0, 2246, 2247, 3, 515, 257, 0, 2247, 2248, 3, 553, 276, 0, 2248, 2249, 3, 515, 257, 0, 2249, 362, 1, 0, 0, 0, 2250, 2251, 3, 545, 272, 0, 2251, 2252, 3, 549, 274, 0, 2252, 2253, 3, 531, 265, 0, 2253, 2254, 3, 519, 259, 0, 2254, 2255, 3, 523, 261, 0, 2255, 2256, 3, 517, 258, 0, 2256, 2257, 3, 543, 271, 0, 2257, 2258, 3, 543, 271, 0, 2258, 2259, 3, 535, 267, 0, 2259, 2260, 3, 531, 265, 0, 2260, 2261, 3, 521, 260, 0, 2261, 364, 1, 0, 0, 0, 2262, 2263, 3, 541, 270, 0, 2263, 2264, 3, 523, 261, 0, 2264, 2265, 3, 553, 276, 0, 2265, 2266, 3, 559, 279, 0, 2266, 2267, 3, 543, 271, 0, 2267, 2268, 3, 549, 274, 0, 2268, 2269, 3, 535, 267, 0, 2269, 366, 1, 0, 0, 0, 2270, 2271, 3, 551, 275, 0, 2271, 2272, 3, 541, 270, 0, 2272, 2273, 3, 531, 265, 0, 2273, 2274, 3, 545, 272, 0, 2274, 2275, 3, 545, 272, 0, 2275, 2276, 3, 523, 261, 0, 2276, 2277, 3, 553, 276, 0, 2277, 368, 1, 0, 0, 0, 2278, 2279, 3, 553, 276, 0, 2279, 2280, 3, 515, 257, 0, 2280, 2281, 3, 549, 274, 0, 2281, 2282, 3, 527, 263, 0, 2282, 2283, 3, 523, 261, 0, 2283, 2284, 3, 553, 276, 0, 2284, 2285, 5, 95, 0, 0, 2285, 2286, 3, 537, 268, 0, 2286, 2287, 3, 523, 261, 0, 2287, 2288, 3, 541, 270, 0, 2288, 2289, 3, 527, 263, 0, 2289, 2290, 3, 553, 276, 0, 2290, 2291, 3, 529, 264, 0, 2291, 370, 1, 0, 0, 0, 2292, 2293, 3, 521, 260, 0, 2293, 2294, 3, 531, 265, 0, 2294, 2295, 3, 557, 278, 0, 2295, 2296, 3, 531, 265, 0, 2296, 2297, 3, 551, 275, 0, 2297, 2298, 3, 531, 265, 0, 2298, 2299, 3, 543, 271, 0, 2299, 2300, 3, 541, 270, 0, 2300, 372, 1, 0, 0, 0, 2301, 2302, 3, 549, 274, 0, 2302, 2303, 3, 523, 261, 0, 2303, 2304, 3, 553, 276, 0, 2304, 2305, 3, 555, 277, 0, 2305, 2306, 3, 549, 274, 0, 2306, 2307, 3, 541, 270, 0, 2307, 2308, 3, 531, 265, 0, 2308, 2309, 3, 541, 270, 0, 2309, 2310, 3, 527, 263, 0, 2310, 374, 1, 0, 0, 0, 2311, 2312, 3, 537, 268, 0, 2312, 2313, 3, 531, 265, 0, 2313, 2314, 3, 551, 275, 0, 2314, 2315, 3, 553, 276, 0, 2315, 2316, 3, 557, 278, 0, 2316, 2317, 3, 531, 265, 0, 2317, 2318, 3, 523, 261, 0, 2318, 2319, 3, 559, 279, 0, 2319, 376, 1, 0, 0, 0, 2320, 2322, 5, 91, 0, 0, 2321, 2323, 3, 573, 286, 0, 2322, 2321, 1, 0, 0, 0, 2322, 2323, 1, 0, 0, 0, 2323, 2324, 1, 0, 0, 0, 2324, 2325, 3, 525, 262, 0, 2325, 2326, 3, 531, 265, 0, 2326, 2327, 3, 541, 270, 0, 2327, 2328, 3, 521, 260, 0, 2328, 2329, 3, 573, 286, 0, 2329, 2331, 5, 39, 0, 0, 2330, 2332, 3, 379, 189, 0, 2331, 2330, 1, 0, 0, 0, 2331, 2332, 1, 0, 0, 0, 2332, 2333, 1, 0, 0, 0, 2333, 2334, 5, 39, 0, 0, 2334, 378, 1, 0, 0, 0, 2335, 2337, 3, 381, 190, 0, 2336, 2335, 1, 0, 0, 0, 2337, 2338, 1, 0, 0, 0, 2338, 2336, 1, 0, 0, 0, 2338, 2339, 1, 0, 0, 0, 2339, 380, 1, 0, 0, 0, 2340, 2343, 8, 2, 0, 0, 2341, 2343, 3, 389, 194, 0, 2342, 2340, 1, 0, 0, 0, 2342, 2341, 1, 0, 0, 0, 2343, 382, 1, 0, 0, 0, 2344, 2346, 5, 91, 0, 0, 2345, 2347, 3, 573, 286, 0, 2346, 2345, 1, 0, 0, 0, 2346, 2347, 1, 0, 0, 0, 2347, 2348, 1, 0, 0, 0, 2348, 2349, 3, 525, 262, 0, 2349, 2350, 3, 531, 265, 0, 2350, 2351, 3, 541, 270, 0, 2351, 2352, 3, 521, 260, 0, 2352, 2353, 3, 573, 286, 0, 2353, 2355, 5, 123, 0, 0, 2354, 2356, 3, 385, 192, 0, 2355, 2354, 1, 0, 0, 0, 2355, 2356, 1, 0, 0, 0, 2356, 2357, 1, 0, 0, 0, 2357, 2358, 5, 125, 0, 0, 2358, 384, 1, 0, 0, 0, 2359, 2361, 3, 387, 193, 0, 2360, 2359, 1, 0, 0, 0, 2361, 2362, 1, 0, 0, 0, 2362, 2360, 1, 0, 0, 0, 2362, 2363, 1, 0, 0, 0, 2363, 386, 1, 0, 0, 0, 2364, 2367, 8, 3, 0, 0, 2365, 2367, 3, 389, 194, 0, 2366, 2364, 1, 0, 0, 0, 2366, 2365, 1, 0, 0, 0, 2367, 388, 1, 0, 0, 0, 2368, 2369, 5, 92, 0, 0, 2369, 2370, 7, 4, 0, 0, 2370, 390, 1, 0, 0, 0, 2371, 2375, 3, 399, 199, 0, 2372, 2374, 3, 399, 199, 0, 2373, 2372, 1, 0, 0, 0, 2374, 2377, 1, 0, 0, 0, 2375, 2373, 1, 0, 0, 0, 2375, 2376, 1, 0, 0, 0, 2376, 392, 1, 0, 0, 0, 2377, 2375, 1, 0, 0, 0, 2378, 2382, 3, 399, 199, 0, 2379, 2381, 3, 399, 199, 0, 2380, 2379, 1, 0, 0, 0, 2381, 2384, 1, 0, 0, 0, 2382, 2380, 1, 0, 0, 0, 2382, 2383, 1, 0, 0, 0, 2383, 2385, 1, 0, 0, 0, 2384, 2382, 1, 0, 0, 0, 2385, 2386, 7, 5, 0, 0, 2386, 394, 1, 0, 0, 0, 2387, 2389, 3, 399, 199, 0, 2388, 2387, 1, 0, 0, 0, 2389, 2392, 1, 0, 0, 0, 2390, 2388, 1, 0, 0, 0, 2390, 2391, 1, 0, 0, 0, 2391, 2393, 1, 0, 0, 0, 2392, 2390, 1, 0, 0, 0, 2393, 2394, 5, 46, 0, 0, 2394, 2398, 3, 399, 199, 0, 2395, 2397, 3, 399, 199, 0, 2396, 2395, 1, 0, 0, 0, 2397, 2400, 1, 0, 0, 0, 2398, 2396, 1, 0, 0, 0, 2398, 2399, 1, 0, 0, 0, 2399, 2402, 1, 0, 0, 0, 2400, 2398, 1, 0, 0, 0, 2401, 2403, 7, 6, 0, 0, 2402, 2401, 1, 0, 0, 0, 2402, 2403, 1, 0, 0, 0, 2403, 396, 1, 0, 0, 0, 2404, 2412, 3, 399, 199, 0, 2405, 2412, 3, 515, 257, 0, 2406, 2412, 3, 517, 258, 0, 2407, 2412, 3, 519, 259, 0, 2408, 2412, 3, 521, 260, 0, 2409, 2412, 3, 523, 261, 0, 2410, 2412, 3, 525, 262, 0, 2411, 2404, 1, 0, 0, 0, 2411, 2405, 1, 0, 0, 0, 2411, 2406, 1, 0, 0, 0, 2411, 2407, 1, 0, 0, 0, 2411, 2408, 1, 0, 0, 0, 2411, 2409, 1, 0, 0, 0, 2411, 2410, 1, 0, 0, 0, 2412, 398, 1, 0, 0, 0, 2413, 2414, 7, 7, 0, 0, 2414, 400, 1, 0, 0, 0, 2415, 2416, 3, 553, 276, 0, 2416, 2417, 3, 549, 274, 0, 2417, 2418, 3, 555, 277, 0, 2418, 2419, 3, 523, 261, 0, 2419, 2427, 1, 0, 0, 0, 2420, 2421, 3, 525, 262, 0, 2421, 2422, 3, 515, 257, 0, 2422, 2423, 3, 537, 268, 0, 2423, 2424, 3, 551, 275, 0, 2424, 2425, 3, 523, 261, 0, 2425, 2427, 1, 0, 0, 0, 2426, 2415, 1, 0, 0, 0, 2426, 2420, 1, 0, 0, 0, 2427, 402, 1, 0, 0, 0, 2428, 2430, 5, 39, 0, 0, 2429, 2431, 3, 405, 202, 0, 2430, 2429, 1, 0, 0, 0, 2430, 2431, 1, 0, 0, 0, 2431, 2432, 1, 0, 0, 0, 2432, 2433, 5, 39, 0, 0, 2433, 404, 1, 0, 0, 0, 2434, 2436, 3, 407, 203, 0, 2435, 2434, 1, 0, 0, 0, 2436, 2437, 1, 0, 0, 0, 2437, 2435, 1, 0, 0, 0, 2437, 2438, 1, 0, 0, 0, 2438, 406, 1, 0, 0, 0, 2439, 2442, 8, 2, 0, 0, 2440, 2442, 3, 409, 204, 0, 2441, 2439, 1, 0, 0, 0, 2441, 2440, 1, 0, 0, 0, 2442, 408, 1, 0, 0, 0, 2443, 2444, 5, 92, 0, 0, 2444, 2454, 7, 8, 0, 0, 2445, 2446, 5, 92, 0, 0, 2446, 2447, 5, 117, 0, 0, 2447, 2448, 1, 0, 0, 0, 2448, 2449, 3, 397, 198, 0, 2449, 2450, 3, 397, 198, 0, 2450, 2451, 3, 397, 198, 0, 2451, 2452, 3, 397, 198, 0, 2452, 2454, 1, 0, 0, 0, 2453, 2443, 1, 0, 0, 0, 2453, 2445, 1, 0, 0, 0, 2454, 410, 1, 0, 0, 0, 2455, 2456, 3, 51, 25, 0, 2456, 412, 1, 0, 0, 0, 2457, 2458, 5, 40, 0, 0, 2458, 414, 1, 0, 0, 0, 2459, 2460, 5, 41, 0, 0, 2460, 416, 1, 0, 0, 0, 2461, 2462, 5, 123, 0, 0, 2462, 418, 1, 0, 0, 0, 2463, 2464, 5, 125, 0, 0, 2464, 420, 1, 0, 0, 0, 2465, 2466, 5, 91, 0, 0, 2466, 422, 1, 0, 0, 0, 2467, 2468, 5, 93, 0, 0, 2468, 424, 1, 0, 0, 0, 2469, 2470, 5, 59, 0, 0, 2470, 426, 1, 0, 0, 0, 2471, 2472, 5, 44, 0, 0, 2472, 428, 1, 0, 0, 0, 2473, 2474, 5, 46, 0, 0, 2474, 430, 1, 0, 0, 0, 2475, 2476, 5, 61, 0, 0, 2476, 432, 1, 0, 0, 0, 2477, 2478, 5, 62, 0, 0, 2478, 434, 1, 0, 0, 0, 2479, 2480, 5, 60, 0, 0, 2480, 436, 1, 0, 0, 0, 2481, 2482, 5, 33, 0, 0, 2482, 438, 1, 0, 0, 0, 2483, 2484, 5, 126, 0, 0, 2484, 440, 1, 0, 0, 0, 2485, 2486, 5, 63, 0, 0, 2486, 2487, 5, 46, 0, 0, 2487, 442, 1, 0, 0, 0, 2488, 2489, 5, 63, 0, 0, 2489, 444, 1, 0, 0, 0, 2490, 2491, 5, 58, 0, 0, 2491, 446, 1, 0, 0, 0, 2492, 2493, 5, 61, 0, 0, 2493, 2494, 5, 61, 0, 0, 2494, 448, 1, 0, 0, 0, 2495, 2496, 5, 61, 0, 0, 2496, 2497, 5, 61, 0, 0, 2497, 2498, 5, 61, 0, 0, 2498, 450, 1, 0, 0, 0, 2499, 2500, 5, 33, 0, 0, 2500, 2501, 5, 61, 0, 0, 2501, 452, 1, 0, 0, 0, 2502, 2503, 5, 60, 0, 0, 2503, 2504, 5, 62, 0, 0, 2504, 454, 1, 0, 0, 0, 2505, 2506, 5, 33, 0, 0, 2506, 2507, 5, 61, 0, 0, 2507, 2508, 5, 61, 0, 0, 2508, 456, 1, 0, 0, 0, 2509, 2510, 5, 38, 0, 0, 2510, 2511, 5, 38, 0, 0, 2511, 458, 1, 0, 0, 0, 2512, 2513, 5, 124, 0, 0, 2513, 2514, 5, 124, 0, 0, 2514, 460, 1, 0, 0, 0, 2515, 2516, 5, 63, 0, 0, 2516, 2517, 5, 63, 0, 0, 2517, 462, 1, 0, 0, 0, 2518, 2519, 5, 43, 0, 0, 2519, 2520, 5, 43, 0, 0, 2520, 464, 1, 0, 0, 0, 2521, 2522, 5, 45, 0, 0, 2522, 2523, 5, 45, 0, 0, 2523, 466, 1, 0, 0, 0, 2524, 2525, 5, 43, 0, 0, 2525, 468, 1, 0, 0, 0, 2526, 2527, 5, 45, 0, 0, 2527, 470, 1, 0, 0, 0, 2528, 2529, 5, 42, 0, 0, 2529, 472, 1, 0, 0, 0, 2530, 2531, 5, 47, 0, 0, 2531, 474, 1, 0, 0, 0, 2532, 2533, 5, 38, 0, 0, 2533, 476, 1, 0, 0, 0, 2534, 2535, 5, 124, 0, 0, 2535, 478, 1, 0, 0, 0, 2536, 2537, 5, 94, 0, 0, 2537, 480, 1, 0, 0, 0, 2538, 2539, 5, 37, 0, 0, 2539, 482, 1, 0, 0, 0, 2540, 2541, 5, 61, 0, 0, 2541, 2542, 5, 62, 0, 0, 2542, 484, 1, 0, 0, 0, 2543, 2544, 5, 43, 0, 0, 2544, 2545, 5, 61, 0, 0, 2545, 486, 1, 0, 0, 0, 2546, 2547, 5, 45, 0, 0, 2547, 2548, 5, 61, 0, 0, 2548, 488, 1, 0, 0, 0, 2549, 2550, 5, 42, 0, 0, 2550, 2551, 5, 61, 0, 0, 2551, 490, 1, 0, 0, 0, 2552, 2553, 5, 47, 0, 0, 2553, 2554, 5, 61, 0, 0, 2554, 492, 1, 0, 0, 0, 2555, 2556, 5, 38, 0, 0, 2556, 2557, 5, 61, 0, 0, 2557, 494, 1, 0, 0, 0, 2558, 2559, 5, 124, 0, 0, 2559, 2560, 5, 61, 0, 0, 2560, 496, 1, 0, 0, 0, 2561, 2562, 5, 94, 0, 0, 2562, 2563, 5, 61, 0, 0, 2563, 498, 1, 0, 0, 0, 2564, 2565, 5, 37, 0, 0, 2565, 2566, 5, 61, 0, 0, 2566, 500, 1, 0, 0, 0, 2567, 2568, 5, 60, 0, 0, 2568, 2569, 5, 60, 0, 0, 2569, 2570, 5, 61, 0, 0, 2570, 502, 1, 0, 0, 0, 2571, 2572, 5, 62, 0, 0, 2572, 2573, 5, 62, 0, 0, 2573, 2574, 5, 61, 0, 0, 2574, 504, 1, 0, 0, 0, 2575, 2576, 5, 62, 0, 0, 2576, 2577, 5, 62, 0, 0, 2577, 2578, 5, 62, 0, 0, 2578, 2579, 5, 61, 0, 0, 2579, 506, 1, 0, 0, 0, 2580, 2581, 5, 64, 0, 0, 2581, 508, 1, 0, 0, 0, 2582, 2586, 3, 511, 255, 0, 2583, 2585, 3, 513, 256, 0, 2584, 2583, 1, 0, 0, 0, 2585, 2588, 1, 0, 0, 0, 2586, 2584, 1, 0, 0, 0, 2586, 2587, 1, 0, 0, 0, 2587, 510, 1, 0, 0, 0, 2588, 2586, 1, 0, 0, 0, 2589, 2594, 7, 9, 0, 0, 2590, 2594, 8, 10, 0, 0, 2591, 2592, 7, 11, 0, 0, 2592, 2594, 7, 12, 0, 0, 2593, 2589, 1, 0, 0, 0, 2593, 2590, 1, 0, 0, 0, 2593, 2591, 1, 0, 0, 0, 2594, 512, 1, 0, 0, 0, 2595, 2600, 7, 13, 0, 0, 2596, 2600, 8, 10, 0, 0, 2597, 2598, 7, 11, 0, 0, 2598, 2600, 7, 12, 0, 0, 2599, 2595, 1, 0, 0, 0, 2599, 2596, 1, 0, 0, 0, 2599, 2597, 1, 0, 0, 0, 2600, 514, 1, 0, 0, 0, 2601, 2602, 7, 14, 0, 0, 2602, 516, 1, 0, 0, 0, 2603, 2604, 7, 15, 0, 0, 2604, 518, 1, 0, 0, 0, 2605, 2606, 7, 16, 0, 0, 2606, 520, 1, 0, 0, 0, 2607, 2608, 7, 6, 0, 0, 2608, 522, 1, 0, 0, 0, 2609, 2610, 7, 17, 0, 0, 2610, 524, 1, 0, 0, 0, 2611, 2612, 7, 18, 0, 0, 2612, 526, 1, 0, 0, 0, 2613, 2614, 7, 19, 0, 0, 2614, 528, 1, 0, 0, 0, 2615, 2616, 7, 20, 0, 0, 2616, 530, 1, 0, 0, 0, 2617, 2618, 7, 21, 0, 0, 2618, 532, 1, 0, 0, 0, 2619, 2620, 7, 22, 0, 0, 2620, 534, 1, 0, 0, 0, 2621, 2622, 7, 23, 0, 0, 2622, 536, 1, 0, 0, 0, 2623, 2624, 7, 5, 0, 0, 2624, 538, 1, 0, 0, 0, 2625, 2626, 7, 24, 0, 0, 2626, 540, 1, 0, 0, 0, 2627, 2628, 7, 25, 0, 0, 2628, 542, 1, 0, 0, 0, 2629, 2630, 7, 26, 0, 0, 2630, 544, 1, 0, 0, 0, 2631, 2632, 7, 27, 0, 0, 2632, 546, 1, 0, 0, 0, 2633, 2634, 7, 28, 0, 0, 2634, 548, 1, 0, 0, 0, 2635, 2636, 7, 29, 0, 0, 2636, 550, 1, 0, 0, 0, 2637, 2638, 7, 30, 0, 0, 2638, 552, 1, 0, 0, 0, 2639, 2640, 7, 31, 0, 0, 2640, 554, 1, 0, 0, 0, 2641, 2642, 7, 32, 0, 0, 2642, 556, 1, 0, 0, 0, 2643, 2644, 7, 33, 0, 0, 2644, 558, 1, 0, 0, 0, 2645, 2646, 7, 34, 0, 0, 2646, 560, 1, 0, 0, 0, 2647, 2648, 7, 35, 0, 0, 2648, 562, 1, 0, 0, 0, 2649, 2650, 7, 36, 0, 0, 2650, 564, 1, 0, 0, 0, 2651, 2652, 7, 37, 0, 0, 2652, 566, 1, 0, 0, 0, 2653, 2655, 7, 38, 0, 0, 2654, 2653, 1, 0, 0, 0, 2655, 2658, 1, 0, 0, 0, 2656, 2654, 1, 0, 0, 0, 2656, 2657, 1, 0, 0, 0, 2657, 2659, 1, 0, 0, 0, 2658, 2656, 1, 0, 0, 0, 2659, 2660, 5, 47, 0, 0, 2660, 2661, 5, 42, 0, 0, 2661, 2662, 5, 42, 0, 0, 2662, 2663, 1, 0, 0, 0, 2663, 2667, 7, 39, 0, 0, 2664, 2666, 9, 0, 0, 0, 2665, 2664, 1, 0, 0, 0, 2666, 2669, 1, 0, 0, 0, 2667, 2668, 1, 0, 0, 0, 2667, 2665, 1, 0, 0, 0, 2668, 2670, 1, 0, 0, 0, 2669, 2667, 1, 0, 0, 0, 2670, 2671, 5, 42, 0, 0, 2671, 2672, 5, 47, 0, 0, 2672, 2676, 1, 0, 0, 0, 2673, 2675, 7, 38, 0, 0, 2674, 2673, 1, 0, 0, 0, 2675, 2678, 1, 0, 0, 0, 2676, 2674, 1, 0, 0, 0, 2676, 2677, 1, 0, 0, 0, 2677, 2679, 1, 0, 0, 0, 2678, 2676, 1, 0, 0, 0, 2679, 2680, 6, 283, 0, 0, 2680, 568, 1, 0, 0, 0, 2681, 2683, 7, 38, 0, 0, 2682, 2681, 1, 0, 0, 0, 2683, 2686, 1, 0, 0, 0, 2684, 2682, 1, 0, 0, 0, 2684, 2685, 1, 0, 0, 0, 2685, 2687, 1, 0, 0, 0, 2686, 2684, 1, 0, 0, 0, 2687, 2688, 5, 47, 0, 0, 2688, 2689, 5, 42, 0, 0, 2689, 2693, 1, 0, 0, 0, 2690, 2692, 9, 0, 0, 0, 2691, 2690, 1, 0, 0, 0, 2692, 2695, 1, 0, 0, 0, 2693, 2694, 1, 0, 0, 0, 2693, 2691, 1, 0, 0, 0, 2694, 2696, 1, 0, 0, 0, 2695, 2693, 1, 0, 0, 0, 2696, 2697, 5, 42, 0, 0, 2697, 2698, 5, 47, 0, 0, 2698, 2702, 1, 0, 0, 0, 2699, 2701, 7, 38, 0, 0, 2700, 2699, 1, 0, 0, 0, 2701, 2704, 1, 0, 0, 0, 2702, 2700, 1, 0, 0, 0, 2702, 2703, 1, 0, 0, 0, 2703, 2705, 1, 0, 0, 0, 2704, 2702, 1, 0, 0, 0, 2705, 2706, 6, 284, 0, 0, 2706, 570, 1, 0, 0, 0, 2707, 2709, 7, 38, 0, 0, 2708, 2707, 1, 0, 0, 0, 2709, 2712, 1, 0, 0, 0, 2710, 2708, 1, 0, 0, 0, 2710, 2711, 1, 0, 0, 0, 2711, 2713, 1, 0, 0, 0, 2712, 2710, 1, 0, 0, 0, 2713, 2714, 5, 47, 0, 0, 2714, 2715, 5, 47, 0, 0, 2715, 2719, 1, 0, 0, 0, 2716, 2718, 8, 39, 0, 0, 2717, 2716, 1, 0, 0, 0, 2718, 2721, 1, 0, 0, 0, 2719, 2717, 1, 0, 0, 0, 2719, 2720, 1, 0, 0, 0, 2720, 2725, 1, 0, 0, 0, 2721, 2719, 1, 0, 0, 0, 2722, 2724, 7, 38, 0, 0, 2723, 2722, 1, 0, 0, 0, 2724, 2727, 1, 0, 0, 0, 2725, 2723, 1, 0, 0, 0, 2725, 2726, 1, 0, 0, 0, 2726, 2728, 1, 0, 0, 0, 2727, 2725, 1, 0, 0, 0, 2728, 2729, 6, 285, 0, 0, 2729, 572, 1, 0, 0, 0, 2730, 2732, 7, 38, 0, 0, 2731, 2730, 1, 0, 0, 0, 2732, 2733, 1, 0, 0, 0, 2733, 2731, 1, 0, 0, 0, 2733, 2734, 1, 0, 0, 0, 2734, 2735, 1, 0, 0, 0, 2735, 2736, 6, 286, 1, 0, 2736, 574, 1, 0, 0, 0, 40, 0, 2171, 2173, 2180, 2186, 2188, 2190, 2202, 2322, 2331, 2338, 2342, 2346, 2355, 2362, 2366, 2375, 2382, 2390, 2398, 2402, 2411, 2426, 2430, 2437, 2441, 2453, 2586, 2593, 2599, 2656, 2667, 2676, 2684, 2693, 2702, 2710, 2719, 2725, 2733, 2, 0, 3, 0, 0, 2, 0] \ No newline at end of file diff --git a/parser/ApexLexer.tokens b/parser/ApexLexer.tokens index 3b027d3..dfb2ad4 100644 --- a/parser/ApexLexer.tokens +++ b/parser/ApexLexer.tokens @@ -243,10 +243,10 @@ RSHIFT_ASSIGN=242 URSHIFT_ASSIGN=243 ATSIGN=244 Identifier=245 -WS=246 -DOC_COMMENT=247 -COMMENT=248 -LINE_COMMENT=249 +DOC_COMMENT=246 +COMMENT=247 +LINE_COMMENT=248 +WS=249 '('=197 ')'=198 '{'=199 diff --git a/parser/ApexParser.interp b/parser/ApexParser.interp index 4464c9e..4039acb 100644 --- a/parser/ApexParser.interp +++ b/parser/ApexParser.interp @@ -497,10 +497,10 @@ RSHIFT_ASSIGN URSHIFT_ASSIGN ATSIGN Identifier -WS DOC_COMMENT COMMENT LINE_COMMENT +WS rule names: triggerUnit diff --git a/parser/ApexParser.tokens b/parser/ApexParser.tokens index 3b027d3..dfb2ad4 100644 --- a/parser/ApexParser.tokens +++ b/parser/ApexParser.tokens @@ -243,10 +243,10 @@ RSHIFT_ASSIGN=242 URSHIFT_ASSIGN=243 ATSIGN=244 Identifier=245 -WS=246 -DOC_COMMENT=247 -COMMENT=248 -LINE_COMMENT=249 +DOC_COMMENT=246 +COMMENT=247 +LINE_COMMENT=248 +WS=249 '('=197 ')'=198 '{'=199 diff --git a/parser/apex_lexer.go b/parser/apex_lexer.go index bd452af..dc7c973 100644 --- a/parser/apex_lexer.go +++ b/parser/apex_lexer.go @@ -102,8 +102,8 @@ func apexlexerLexerInit() { "INC", "DEC", "ADD", "SUB", "MUL", "DIV", "BITAND", "BITOR", "CARET", "MOD", "MAPTO", "ADD_ASSIGN", "SUB_ASSIGN", "MUL_ASSIGN", "DIV_ASSIGN", "AND_ASSIGN", "OR_ASSIGN", "XOR_ASSIGN", "MOD_ASSIGN", "LSHIFT_ASSIGN", - "RSHIFT_ASSIGN", "URSHIFT_ASSIGN", "ATSIGN", "Identifier", "WS", "DOC_COMMENT", - "COMMENT", "LINE_COMMENT", + "RSHIFT_ASSIGN", "URSHIFT_ASSIGN", "ATSIGN", "Identifier", "DOC_COMMENT", + "COMMENT", "LINE_COMMENT", "WS", } staticData.RuleNames = []string{ "ABSTRACT", "AFTER", "BEFORE", "BREAK", "CATCH", "CLASS", "CONTINUE", @@ -151,11 +151,11 @@ func apexlexerLexerInit() { "RSHIFT_ASSIGN", "URSHIFT_ASSIGN", "ATSIGN", "Identifier", "JavaLetter", "JavaLetterOrDigit", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", - "Y", "Z", "WS", "DOC_COMMENT", "COMMENT", "LINE_COMMENT", + "Y", "Z", "DOC_COMMENT", "COMMENT", "LINE_COMMENT", "WS", } staticData.PredictionContextCache = antlr.NewPredictionContextCache() staticData.serializedATN = []int32{ - 4, 0, 249, 2701, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, + 4, 0, 249, 2737, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, @@ -438,64 +438,69 @@ func apexlexerLexerInit() { 266, 1, 267, 1, 267, 1, 268, 1, 268, 1, 269, 1, 269, 1, 270, 1, 270, 1, 271, 1, 271, 1, 272, 1, 272, 1, 273, 1, 273, 1, 274, 1, 274, 1, 275, 1, 275, 1, 276, 1, 276, 1, 277, 1, 277, 1, 278, 1, 278, 1, 279, 1, 279, 1, - 280, 1, 280, 1, 281, 1, 281, 1, 282, 1, 282, 1, 283, 4, 283, 2655, 8, 283, - 11, 283, 12, 283, 2656, 1, 283, 1, 283, 1, 284, 1, 284, 1, 284, 1, 284, - 1, 284, 1, 284, 5, 284, 2667, 8, 284, 10, 284, 12, 284, 2670, 9, 284, 1, - 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 285, 1, 285, 1, 285, 1, 285, 5, - 285, 2681, 8, 285, 10, 285, 12, 285, 2684, 9, 285, 1, 285, 1, 285, 1, 285, - 1, 285, 1, 285, 1, 286, 1, 286, 1, 286, 1, 286, 5, 286, 2695, 8, 286, 10, - 286, 12, 286, 2698, 9, 286, 1, 286, 1, 286, 2, 2668, 2682, 0, 287, 1, 1, - 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, - 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, - 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, - 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, - 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, - 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, - 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, - 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, - 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, - 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, - 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, - 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, - 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, - 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, - 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, - 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, - 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, - 283, 142, 285, 143, 287, 144, 289, 145, 291, 146, 293, 147, 295, 148, 297, - 149, 299, 150, 301, 151, 303, 152, 305, 153, 307, 154, 309, 155, 311, 156, - 313, 157, 315, 158, 317, 159, 319, 160, 321, 161, 323, 162, 325, 163, 327, - 164, 329, 165, 331, 166, 333, 167, 335, 168, 337, 169, 339, 170, 341, 171, - 343, 172, 345, 173, 347, 174, 349, 175, 351, 176, 353, 177, 355, 178, 357, - 179, 359, 180, 361, 181, 363, 182, 365, 183, 367, 184, 369, 185, 371, 186, - 373, 187, 375, 188, 377, 189, 379, 0, 381, 0, 383, 190, 385, 0, 387, 0, - 389, 0, 391, 191, 393, 192, 395, 193, 397, 0, 399, 0, 401, 194, 403, 195, - 405, 0, 407, 0, 409, 0, 411, 196, 413, 197, 415, 198, 417, 199, 419, 200, - 421, 201, 423, 202, 425, 203, 427, 204, 429, 205, 431, 206, 433, 207, 435, - 208, 437, 209, 439, 210, 441, 211, 443, 212, 445, 213, 447, 214, 449, 215, - 451, 216, 453, 217, 455, 218, 457, 219, 459, 220, 461, 221, 463, 222, 465, - 223, 467, 224, 469, 225, 471, 226, 473, 227, 475, 228, 477, 229, 479, 230, - 481, 231, 483, 232, 485, 233, 487, 234, 489, 235, 491, 236, 493, 237, 495, - 238, 497, 239, 499, 240, 501, 241, 503, 242, 505, 243, 507, 244, 509, 245, - 511, 0, 513, 0, 515, 0, 517, 0, 519, 0, 521, 0, 523, 0, 525, 0, 527, 0, - 529, 0, 531, 0, 533, 0, 535, 0, 537, 0, 539, 0, 541, 0, 543, 0, 545, 0, - 547, 0, 549, 0, 551, 0, 553, 0, 555, 0, 557, 0, 559, 0, 561, 0, 563, 0, - 565, 0, 567, 246, 569, 247, 571, 248, 573, 249, 1, 0, 40, 2, 0, 43, 43, - 45, 45, 2, 0, 65, 90, 97, 122, 2, 0, 39, 39, 92, 92, 2, 0, 92, 92, 125, - 125, 8, 0, 33, 34, 38, 43, 45, 45, 58, 58, 63, 63, 92, 92, 94, 94, 123, - 126, 2, 0, 76, 76, 108, 108, 2, 0, 68, 68, 100, 100, 1, 0, 48, 57, 8, 0, - 34, 34, 39, 39, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, - 4, 0, 36, 36, 65, 90, 95, 95, 97, 122, 2, 0, 0, 255, 55296, 56319, 1, 0, - 55296, 56319, 1, 0, 56320, 57343, 5, 0, 36, 36, 48, 57, 65, 90, 95, 95, - 97, 122, 2, 0, 65, 65, 97, 97, 2, 0, 66, 66, 98, 98, 2, 0, 67, 67, 99, - 99, 2, 0, 69, 69, 101, 101, 2, 0, 70, 70, 102, 102, 2, 0, 71, 71, 103, + 280, 1, 280, 1, 281, 1, 281, 1, 282, 1, 282, 1, 283, 5, 283, 2655, 8, 283, + 10, 283, 12, 283, 2658, 9, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, + 1, 283, 5, 283, 2666, 8, 283, 10, 283, 12, 283, 2669, 9, 283, 1, 283, 1, + 283, 1, 283, 1, 283, 5, 283, 2675, 8, 283, 10, 283, 12, 283, 2678, 9, 283, + 1, 283, 1, 283, 1, 284, 5, 284, 2683, 8, 284, 10, 284, 12, 284, 2686, 9, + 284, 1, 284, 1, 284, 1, 284, 1, 284, 5, 284, 2692, 8, 284, 10, 284, 12, + 284, 2695, 9, 284, 1, 284, 1, 284, 1, 284, 1, 284, 5, 284, 2701, 8, 284, + 10, 284, 12, 284, 2704, 9, 284, 1, 284, 1, 284, 1, 285, 5, 285, 2709, 8, + 285, 10, 285, 12, 285, 2712, 9, 285, 1, 285, 1, 285, 1, 285, 1, 285, 5, + 285, 2718, 8, 285, 10, 285, 12, 285, 2721, 9, 285, 1, 285, 5, 285, 2724, + 8, 285, 10, 285, 12, 285, 2727, 9, 285, 1, 285, 1, 285, 1, 286, 4, 286, + 2732, 8, 286, 11, 286, 12, 286, 2733, 1, 286, 1, 286, 2, 2667, 2693, 0, + 287, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, + 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, + 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, + 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, + 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, + 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, + 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, + 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, + 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, + 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, + 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, + 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, + 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, + 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, + 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, + 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, + 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, + 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 146, 293, 147, 295, + 148, 297, 149, 299, 150, 301, 151, 303, 152, 305, 153, 307, 154, 309, 155, + 311, 156, 313, 157, 315, 158, 317, 159, 319, 160, 321, 161, 323, 162, 325, + 163, 327, 164, 329, 165, 331, 166, 333, 167, 335, 168, 337, 169, 339, 170, + 341, 171, 343, 172, 345, 173, 347, 174, 349, 175, 351, 176, 353, 177, 355, + 178, 357, 179, 359, 180, 361, 181, 363, 182, 365, 183, 367, 184, 369, 185, + 371, 186, 373, 187, 375, 188, 377, 189, 379, 0, 381, 0, 383, 190, 385, + 0, 387, 0, 389, 0, 391, 191, 393, 192, 395, 193, 397, 0, 399, 0, 401, 194, + 403, 195, 405, 0, 407, 0, 409, 0, 411, 196, 413, 197, 415, 198, 417, 199, + 419, 200, 421, 201, 423, 202, 425, 203, 427, 204, 429, 205, 431, 206, 433, + 207, 435, 208, 437, 209, 439, 210, 441, 211, 443, 212, 445, 213, 447, 214, + 449, 215, 451, 216, 453, 217, 455, 218, 457, 219, 459, 220, 461, 221, 463, + 222, 465, 223, 467, 224, 469, 225, 471, 226, 473, 227, 475, 228, 477, 229, + 479, 230, 481, 231, 483, 232, 485, 233, 487, 234, 489, 235, 491, 236, 493, + 237, 495, 238, 497, 239, 499, 240, 501, 241, 503, 242, 505, 243, 507, 244, + 509, 245, 511, 0, 513, 0, 515, 0, 517, 0, 519, 0, 521, 0, 523, 0, 525, + 0, 527, 0, 529, 0, 531, 0, 533, 0, 535, 0, 537, 0, 539, 0, 541, 0, 543, + 0, 545, 0, 547, 0, 549, 0, 551, 0, 553, 0, 555, 0, 557, 0, 559, 0, 561, + 0, 563, 0, 565, 0, 567, 246, 569, 247, 571, 248, 573, 249, 1, 0, 40, 2, + 0, 43, 43, 45, 45, 2, 0, 65, 90, 97, 122, 2, 0, 39, 39, 92, 92, 2, 0, 92, + 92, 125, 125, 8, 0, 33, 34, 38, 43, 45, 45, 58, 58, 63, 63, 92, 92, 94, + 94, 123, 126, 2, 0, 76, 76, 108, 108, 2, 0, 68, 68, 100, 100, 1, 0, 48, + 57, 8, 0, 34, 34, 39, 39, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, + 116, 116, 4, 0, 36, 36, 65, 90, 95, 95, 97, 122, 2, 0, 0, 255, 55296, 56319, + 1, 0, 55296, 56319, 1, 0, 56320, 57343, 5, 0, 36, 36, 48, 57, 65, 90, 95, + 95, 97, 122, 2, 0, 65, 65, 97, 97, 2, 0, 66, 66, 98, 98, 2, 0, 67, 67, + 99, 99, 2, 0, 69, 69, 101, 101, 2, 0, 70, 70, 102, 102, 2, 0, 71, 71, 103, 103, 2, 0, 72, 72, 104, 104, 2, 0, 73, 73, 105, 105, 2, 0, 74, 74, 106, 106, 2, 0, 75, 75, 107, 107, 2, 0, 77, 77, 109, 109, 2, 0, 78, 78, 110, 110, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 81, 81, 113, 113, 2, 0, 82, 82, 114, 114, 2, 0, 83, 83, 115, 115, 2, 0, 84, 84, 116, 116, 2, 0, 85, 85, 117, 117, 2, 0, 86, 86, 118, 118, 2, 0, 87, 87, 119, 119, 2, 0, 88, 88, 120, 120, 2, 0, 89, 89, 121, 121, 2, 0, 90, 90, 122, - 122, 3, 0, 9, 10, 12, 13, 32, 32, 2, 0, 10, 10, 13, 13, 2702, 0, 1, 1, + 122, 3, 0, 9, 10, 12, 13, 32, 32, 2, 0, 10, 10, 13, 13, 2744, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, @@ -652,8 +657,8 @@ func apexlexerLexerInit() { 0, 0, 0, 549, 2635, 1, 0, 0, 0, 551, 2637, 1, 0, 0, 0, 553, 2639, 1, 0, 0, 0, 555, 2641, 1, 0, 0, 0, 557, 2643, 1, 0, 0, 0, 559, 2645, 1, 0, 0, 0, 561, 2647, 1, 0, 0, 0, 563, 2649, 1, 0, 0, 0, 565, 2651, 1, 0, 0, 0, - 567, 2654, 1, 0, 0, 0, 569, 2660, 1, 0, 0, 0, 571, 2676, 1, 0, 0, 0, 573, - 2690, 1, 0, 0, 0, 575, 576, 3, 515, 257, 0, 576, 577, 3, 517, 258, 0, 577, + 567, 2656, 1, 0, 0, 0, 569, 2684, 1, 0, 0, 0, 571, 2710, 1, 0, 0, 0, 573, + 2731, 1, 0, 0, 0, 575, 576, 3, 515, 257, 0, 576, 577, 3, 517, 258, 0, 577, 578, 3, 551, 275, 0, 578, 579, 3, 553, 276, 0, 579, 580, 3, 549, 274, 0, 580, 581, 3, 515, 257, 0, 581, 582, 3, 519, 259, 0, 582, 583, 3, 553, 276, 0, 583, 2, 1, 0, 0, 0, 584, 585, 3, 515, 257, 0, 585, 586, 3, 525, 262, @@ -1293,19 +1298,19 @@ func apexlexerLexerInit() { 265, 0, 2313, 2314, 3, 551, 275, 0, 2314, 2315, 3, 553, 276, 0, 2315, 2316, 3, 557, 278, 0, 2316, 2317, 3, 531, 265, 0, 2317, 2318, 3, 523, 261, 0, 2318, 2319, 3, 559, 279, 0, 2319, 376, 1, 0, 0, 0, 2320, 2322, 5, 91, 0, - 0, 2321, 2323, 3, 567, 283, 0, 2322, 2321, 1, 0, 0, 0, 2322, 2323, 1, 0, + 0, 2321, 2323, 3, 573, 286, 0, 2322, 2321, 1, 0, 0, 0, 2322, 2323, 1, 0, 0, 0, 2323, 2324, 1, 0, 0, 0, 2324, 2325, 3, 525, 262, 0, 2325, 2326, 3, 531, 265, 0, 2326, 2327, 3, 541, 270, 0, 2327, 2328, 3, 521, 260, 0, 2328, - 2329, 3, 567, 283, 0, 2329, 2331, 5, 39, 0, 0, 2330, 2332, 3, 379, 189, + 2329, 3, 573, 286, 0, 2329, 2331, 5, 39, 0, 0, 2330, 2332, 3, 379, 189, 0, 2331, 2330, 1, 0, 0, 0, 2331, 2332, 1, 0, 0, 0, 2332, 2333, 1, 0, 0, 0, 2333, 2334, 5, 39, 0, 0, 2334, 378, 1, 0, 0, 0, 2335, 2337, 3, 381, 190, 0, 2336, 2335, 1, 0, 0, 0, 2337, 2338, 1, 0, 0, 0, 2338, 2336, 1, 0, 0, 0, 2338, 2339, 1, 0, 0, 0, 2339, 380, 1, 0, 0, 0, 2340, 2343, 8, 2, 0, 0, 2341, 2343, 3, 389, 194, 0, 2342, 2340, 1, 0, 0, 0, 2342, 2341, 1, 0, 0, 0, 2343, 382, 1, 0, 0, 0, 2344, 2346, 5, 91, 0, 0, 2345, 2347, - 3, 567, 283, 0, 2346, 2345, 1, 0, 0, 0, 2346, 2347, 1, 0, 0, 0, 2347, 2348, + 3, 573, 286, 0, 2346, 2345, 1, 0, 0, 0, 2346, 2347, 1, 0, 0, 0, 2347, 2348, 1, 0, 0, 0, 2348, 2349, 3, 525, 262, 0, 2349, 2350, 3, 531, 265, 0, 2350, - 2351, 3, 541, 270, 0, 2351, 2352, 3, 521, 260, 0, 2352, 2353, 3, 567, 283, + 2351, 3, 541, 270, 0, 2351, 2352, 3, 521, 260, 0, 2352, 2353, 3, 573, 286, 0, 2353, 2355, 5, 123, 0, 0, 2354, 2356, 3, 385, 192, 0, 2355, 2354, 1, 0, 0, 0, 2355, 2356, 1, 0, 0, 0, 2356, 2357, 1, 0, 0, 0, 2357, 2358, 5, 125, 0, 0, 2358, 384, 1, 0, 0, 0, 2359, 2361, 3, 387, 193, 0, 2360, 2359, @@ -1416,27 +1421,41 @@ func apexlexerLexerInit() { 1, 0, 0, 0, 2645, 2646, 7, 34, 0, 0, 2646, 560, 1, 0, 0, 0, 2647, 2648, 7, 35, 0, 0, 2648, 562, 1, 0, 0, 0, 2649, 2650, 7, 36, 0, 0, 2650, 564, 1, 0, 0, 0, 2651, 2652, 7, 37, 0, 0, 2652, 566, 1, 0, 0, 0, 2653, 2655, - 7, 38, 0, 0, 2654, 2653, 1, 0, 0, 0, 2655, 2656, 1, 0, 0, 0, 2656, 2654, - 1, 0, 0, 0, 2656, 2657, 1, 0, 0, 0, 2657, 2658, 1, 0, 0, 0, 2658, 2659, - 6, 283, 0, 0, 2659, 568, 1, 0, 0, 0, 2660, 2661, 5, 47, 0, 0, 2661, 2662, - 5, 42, 0, 0, 2662, 2663, 5, 42, 0, 0, 2663, 2664, 1, 0, 0, 0, 2664, 2668, - 7, 39, 0, 0, 2665, 2667, 9, 0, 0, 0, 2666, 2665, 1, 0, 0, 0, 2667, 2670, - 1, 0, 0, 0, 2668, 2669, 1, 0, 0, 0, 2668, 2666, 1, 0, 0, 0, 2669, 2671, - 1, 0, 0, 0, 2670, 2668, 1, 0, 0, 0, 2671, 2672, 5, 42, 0, 0, 2672, 2673, - 5, 47, 0, 0, 2673, 2674, 1, 0, 0, 0, 2674, 2675, 6, 284, 1, 0, 2675, 570, - 1, 0, 0, 0, 2676, 2677, 5, 47, 0, 0, 2677, 2678, 5, 42, 0, 0, 2678, 2682, - 1, 0, 0, 0, 2679, 2681, 9, 0, 0, 0, 2680, 2679, 1, 0, 0, 0, 2681, 2684, - 1, 0, 0, 0, 2682, 2683, 1, 0, 0, 0, 2682, 2680, 1, 0, 0, 0, 2683, 2685, - 1, 0, 0, 0, 2684, 2682, 1, 0, 0, 0, 2685, 2686, 5, 42, 0, 0, 2686, 2687, - 5, 47, 0, 0, 2687, 2688, 1, 0, 0, 0, 2688, 2689, 6, 285, 1, 0, 2689, 572, - 1, 0, 0, 0, 2690, 2691, 5, 47, 0, 0, 2691, 2692, 5, 47, 0, 0, 2692, 2696, - 1, 0, 0, 0, 2693, 2695, 8, 39, 0, 0, 2694, 2693, 1, 0, 0, 0, 2695, 2698, - 1, 0, 0, 0, 2696, 2694, 1, 0, 0, 0, 2696, 2697, 1, 0, 0, 0, 2697, 2699, - 1, 0, 0, 0, 2698, 2696, 1, 0, 0, 0, 2699, 2700, 6, 286, 1, 0, 2700, 574, - 1, 0, 0, 0, 34, 0, 2171, 2173, 2180, 2186, 2188, 2190, 2202, 2322, 2331, + 7, 38, 0, 0, 2654, 2653, 1, 0, 0, 0, 2655, 2658, 1, 0, 0, 0, 2656, 2654, + 1, 0, 0, 0, 2656, 2657, 1, 0, 0, 0, 2657, 2659, 1, 0, 0, 0, 2658, 2656, + 1, 0, 0, 0, 2659, 2660, 5, 47, 0, 0, 2660, 2661, 5, 42, 0, 0, 2661, 2662, + 5, 42, 0, 0, 2662, 2663, 1, 0, 0, 0, 2663, 2667, 7, 39, 0, 0, 2664, 2666, + 9, 0, 0, 0, 2665, 2664, 1, 0, 0, 0, 2666, 2669, 1, 0, 0, 0, 2667, 2668, + 1, 0, 0, 0, 2667, 2665, 1, 0, 0, 0, 2668, 2670, 1, 0, 0, 0, 2669, 2667, + 1, 0, 0, 0, 2670, 2671, 5, 42, 0, 0, 2671, 2672, 5, 47, 0, 0, 2672, 2676, + 1, 0, 0, 0, 2673, 2675, 7, 38, 0, 0, 2674, 2673, 1, 0, 0, 0, 2675, 2678, + 1, 0, 0, 0, 2676, 2674, 1, 0, 0, 0, 2676, 2677, 1, 0, 0, 0, 2677, 2679, + 1, 0, 0, 0, 2678, 2676, 1, 0, 0, 0, 2679, 2680, 6, 283, 0, 0, 2680, 568, + 1, 0, 0, 0, 2681, 2683, 7, 38, 0, 0, 2682, 2681, 1, 0, 0, 0, 2683, 2686, + 1, 0, 0, 0, 2684, 2682, 1, 0, 0, 0, 2684, 2685, 1, 0, 0, 0, 2685, 2687, + 1, 0, 0, 0, 2686, 2684, 1, 0, 0, 0, 2687, 2688, 5, 47, 0, 0, 2688, 2689, + 5, 42, 0, 0, 2689, 2693, 1, 0, 0, 0, 2690, 2692, 9, 0, 0, 0, 2691, 2690, + 1, 0, 0, 0, 2692, 2695, 1, 0, 0, 0, 2693, 2694, 1, 0, 0, 0, 2693, 2691, + 1, 0, 0, 0, 2694, 2696, 1, 0, 0, 0, 2695, 2693, 1, 0, 0, 0, 2696, 2697, + 5, 42, 0, 0, 2697, 2698, 5, 47, 0, 0, 2698, 2702, 1, 0, 0, 0, 2699, 2701, + 7, 38, 0, 0, 2700, 2699, 1, 0, 0, 0, 2701, 2704, 1, 0, 0, 0, 2702, 2700, + 1, 0, 0, 0, 2702, 2703, 1, 0, 0, 0, 2703, 2705, 1, 0, 0, 0, 2704, 2702, + 1, 0, 0, 0, 2705, 2706, 6, 284, 0, 0, 2706, 570, 1, 0, 0, 0, 2707, 2709, + 7, 38, 0, 0, 2708, 2707, 1, 0, 0, 0, 2709, 2712, 1, 0, 0, 0, 2710, 2708, + 1, 0, 0, 0, 2710, 2711, 1, 0, 0, 0, 2711, 2713, 1, 0, 0, 0, 2712, 2710, + 1, 0, 0, 0, 2713, 2714, 5, 47, 0, 0, 2714, 2715, 5, 47, 0, 0, 2715, 2719, + 1, 0, 0, 0, 2716, 2718, 8, 39, 0, 0, 2717, 2716, 1, 0, 0, 0, 2718, 2721, + 1, 0, 0, 0, 2719, 2717, 1, 0, 0, 0, 2719, 2720, 1, 0, 0, 0, 2720, 2725, + 1, 0, 0, 0, 2721, 2719, 1, 0, 0, 0, 2722, 2724, 7, 38, 0, 0, 2723, 2722, + 1, 0, 0, 0, 2724, 2727, 1, 0, 0, 0, 2725, 2723, 1, 0, 0, 0, 2725, 2726, + 1, 0, 0, 0, 2726, 2728, 1, 0, 0, 0, 2727, 2725, 1, 0, 0, 0, 2728, 2729, + 6, 285, 0, 0, 2729, 572, 1, 0, 0, 0, 2730, 2732, 7, 38, 0, 0, 2731, 2730, + 1, 0, 0, 0, 2732, 2733, 1, 0, 0, 0, 2733, 2731, 1, 0, 0, 0, 2733, 2734, + 1, 0, 0, 0, 2734, 2735, 1, 0, 0, 0, 2735, 2736, 6, 286, 1, 0, 2736, 574, + 1, 0, 0, 0, 40, 0, 2171, 2173, 2180, 2186, 2188, 2190, 2202, 2322, 2331, 2338, 2342, 2346, 2355, 2362, 2366, 2375, 2382, 2390, 2398, 2402, 2411, - 2426, 2430, 2437, 2441, 2453, 2586, 2593, 2599, 2656, 2668, 2682, 2696, - 2, 0, 2, 0, 0, 3, 0, + 2426, 2430, 2437, 2441, 2453, 2586, 2593, 2599, 2656, 2667, 2676, 2684, + 2693, 2702, 2710, 2719, 2725, 2733, 2, 0, 3, 0, 0, 2, 0, } deserializer := antlr.NewATNDeserializer(nil) staticData.atn = deserializer.Deserialize(staticData.serializedATN) @@ -1722,10 +1741,10 @@ const ( ApexLexerURSHIFT_ASSIGN = 243 ApexLexerATSIGN = 244 ApexLexerIdentifier = 245 - ApexLexerWS = 246 - ApexLexerDOC_COMMENT = 247 - ApexLexerCOMMENT = 248 - ApexLexerLINE_COMMENT = 249 + ApexLexerDOC_COMMENT = 246 + ApexLexerCOMMENT = 247 + ApexLexerLINE_COMMENT = 248 + ApexLexerWS = 249 ) // ApexLexer escapedChannels. diff --git a/parser/apex_parser.go b/parser/apex_parser.go index 31c8fea..16f64e5 100644 --- a/parser/apex_parser.go +++ b/parser/apex_parser.go @@ -91,8 +91,8 @@ func apexparserParserInit() { "INC", "DEC", "ADD", "SUB", "MUL", "DIV", "BITAND", "BITOR", "CARET", "MOD", "MAPTO", "ADD_ASSIGN", "SUB_ASSIGN", "MUL_ASSIGN", "DIV_ASSIGN", "AND_ASSIGN", "OR_ASSIGN", "XOR_ASSIGN", "MOD_ASSIGN", "LSHIFT_ASSIGN", - "RSHIFT_ASSIGN", "URSHIFT_ASSIGN", "ATSIGN", "Identifier", "WS", "DOC_COMMENT", - "COMMENT", "LINE_COMMENT", + "RSHIFT_ASSIGN", "URSHIFT_ASSIGN", "ATSIGN", "Identifier", "DOC_COMMENT", + "COMMENT", "LINE_COMMENT", "WS", } staticData.RuleNames = []string{ "triggerUnit", "triggerCase", "compilationUnit", "typeDeclaration", @@ -1401,10 +1401,10 @@ const ( ApexParserURSHIFT_ASSIGN = 243 ApexParserATSIGN = 244 ApexParserIdentifier = 245 - ApexParserWS = 246 - ApexParserDOC_COMMENT = 247 - ApexParserCOMMENT = 248 - ApexParserLINE_COMMENT = 249 + ApexParserDOC_COMMENT = 246 + ApexParserCOMMENT = 247 + ApexParserLINE_COMMENT = 248 + ApexParserWS = 249 ) // ApexParser rules.