diff --git a/python/pluginResources/messages/PyBundle.properties b/python/pluginResources/messages/PyBundle.properties index 2ca7f5b79992..93b0e49a5fb3 100644 --- a/python/pluginResources/messages/PyBundle.properties +++ b/python/pluginResources/messages/PyBundle.properties @@ -226,7 +226,7 @@ INTN.replace.noteq.operator=Replace not equal operator INTN.remove.leading.$0=Remove leading {0} INTN.remove.leading.prefix=Remove prefix -INTN.remove.trailing.l=Remove trailing L +INTN.remove.trailing.suffix=Remove trailing suffix INTN.replace.list.comprehensions=Convert list comprehensions to supported form @@ -636,6 +636,9 @@ INSP.NAME.coroutine.is.not.awaited=Coroutine ''{0}'' is not awaited # PyTestParametrizedInspection INSP.NAME.pytest-parametrized=Checks that functions decorated by pytest parametrize have correct arguments +# PyHighlightingAnnotator +INSP.python.trailing.suffix.not.support=Python does not support a trailing ''{0}'' + INSP.abstract.class.set.as.metaclass=Set ''{0}'' as metaclass INSP.abstract.class.add.to.superclasses=Add ''{0}'' to superclasses INSP.compatibility.this.syntax.available.only.since.py3=This syntax available only since py3 diff --git a/python/python-psi-api/src/com/jetbrains/python/psi/PyNumericLiteralExpression.java b/python/python-psi-api/src/com/jetbrains/python/psi/PyNumericLiteralExpression.java index f342526b24f3..57f4e99e1a68 100644 --- a/python/python-psi-api/src/com/jetbrains/python/psi/PyNumericLiteralExpression.java +++ b/python/python-psi-api/src/com/jetbrains/python/psi/PyNumericLiteralExpression.java @@ -43,4 +43,12 @@ public interface PyNumericLiteralExpression extends PyLiteralExpression { BigDecimal getBigDecimalValue(); boolean isIntegerLiteral(); + + /** + * Returns possible suffix of integer literal like {@code uL}. + * + * @return null if this is not integer literal or the suffix is missed; string suffix otherwise + */ + @Nullable + String getIntegerLiteralSuffix(); } diff --git a/python/python-psi-impl/gen/com/jetbrains/python/lexer/_PythonLexer.java b/python/python-psi-impl/gen/com/jetbrains/python/lexer/_PythonLexer.java index 04af6f56def6..6e2cf355c9f9 100644 --- a/python/python-psi-impl/gen/com/jetbrains/python/lexer/_PythonLexer.java +++ b/python/python-psi-impl/gen/com/jetbrains/python/lexer/_PythonLexer.java @@ -121,62 +121,62 @@ class _PythonLexer implements FlexLexerEx { /* The ZZ_CMAP_A table has 3424 entries */ static final char ZZ_CMAP_A[] = zzUnpackCMap( - "\11\0\1\36\1\37\1\113\1\46\1\14\22\0\1\34\1\35\1\27\1\13\1\0\1\102\1\103\1"+ - "\25\1\40\1\41\1\77\1\76\1\111\1\21\1\17\1\101\1\1\1\5\6\3\2\2\1\44\1\47\1"+ - "\107\1\45\1\106\1\0\1\100\1\4\1\11\1\23\1\4\1\20\1\30\3\15\1\22\1\15\1\12"+ - "\1\15\1\33\1\10\2\15\1\24\2\15\1\24\2\15\1\6\2\15\1\42\1\26\1\43\1\105\1\7"+ - "\1\112\1\50\1\57\1\61\1\52\1\54\1\66\1\73\1\75\1\64\1\22\1\60\1\62\1\72\1"+ - "\51\1\63\1\70\1\15\1\55\1\53\1\56\1\65\1\15\1\74\1\67\1\71\1\15\1\31\1\104"+ - "\1\32\1\110\6\0\1\113\24\0\1\15\12\0\1\15\4\0\1\15\5\0\27\15\1\0\12\15\4\0"+ - "\14\15\16\0\5\15\7\0\1\15\1\0\1\15\1\0\5\15\1\0\2\15\2\0\4\15\1\0\1\15\6\0"+ - "\1\15\1\0\3\15\1\0\1\15\1\0\4\15\1\0\23\15\1\0\11\15\1\0\26\15\2\0\1\15\6"+ - "\0\10\15\10\0\16\15\1\0\1\15\1\0\2\15\1\0\2\15\1\0\1\15\10\0\13\15\5\0\3\15"+ - "\15\0\12\16\4\0\6\15\1\0\10\15\2\0\12\15\1\0\6\15\12\16\3\15\2\0\14\15\2\0"+ - "\3\15\12\16\14\15\4\0\1\15\5\0\16\15\2\0\14\15\4\0\5\15\1\0\10\15\6\0\20\15"+ - "\2\0\12\16\1\15\2\0\16\15\1\0\1\15\3\0\4\15\2\0\11\15\2\0\2\15\2\0\4\15\10"+ - "\0\1\15\4\0\2\15\1\0\1\15\1\0\3\15\1\0\6\15\4\0\2\15\1\0\2\15\1\0\2\15\1\0"+ - "\2\15\2\0\1\15\1\0\5\15\4\0\2\15\2\0\3\15\3\0\1\15\7\0\4\15\1\0\1\15\7\0\12"+ - "\16\6\15\13\0\3\15\1\0\11\15\1\0\2\15\1\0\2\15\1\0\5\15\2\0\12\15\1\0\3\15"+ - "\1\0\3\15\2\0\1\15\30\0\1\15\7\0\3\15\1\0\10\15\2\0\6\15\2\0\2\15\2\0\3\15"+ - "\10\0\2\15\4\0\2\15\1\0\1\15\1\0\1\15\20\0\2\15\1\0\6\15\3\0\3\15\1\0\4\15"+ - "\3\0\2\15\1\0\1\15\1\0\2\15\3\0\2\15\3\0\3\15\3\0\14\15\4\0\5\15\3\0\3\15"+ - "\1\0\4\15\2\0\1\15\6\0\1\15\10\0\4\15\1\0\10\15\1\0\3\15\1\0\30\15\3\0\10"+ - "\15\1\0\3\15\1\0\4\15\7\0\2\15\1\0\3\15\5\0\4\15\1\0\5\15\2\0\4\15\5\0\2\15"+ - "\7\0\1\15\2\0\2\15\16\0\3\15\1\0\10\15\1\0\7\15\1\0\3\15\1\0\5\15\5\0\4\15"+ - "\7\0\1\15\12\0\6\15\2\0\2\15\1\0\22\15\3\0\10\15\1\0\11\15\1\0\1\15\2\0\7"+ - "\15\3\0\1\15\4\0\6\15\1\0\1\15\1\0\10\15\2\0\2\15\14\0\17\15\1\0\12\16\7\0"+ - "\2\15\1\0\1\15\2\0\2\15\1\0\1\15\2\0\1\15\6\0\4\15\1\0\7\15\1\0\3\15\1\0\1"+ - "\15\1\0\1\15\2\0\2\15\1\0\15\15\1\0\3\15\2\0\5\15\1\0\1\15\1\0\6\15\2\0\12"+ - "\16\2\0\4\15\10\0\2\15\13\0\1\15\1\0\1\15\1\0\1\15\4\0\12\15\1\0\24\15\3\0"+ - "\5\15\1\0\12\15\6\0\1\15\11\0\12\16\4\15\2\0\6\15\1\0\1\15\5\0\1\15\2\0\13"+ - "\15\1\0\15\15\1\0\4\15\2\0\7\15\1\0\1\15\1\0\4\15\2\0\1\15\1\0\4\15\2\0\7"+ - "\15\1\0\1\15\1\0\4\15\2\0\16\15\2\0\6\15\2\0\15\15\2\0\14\15\3\0\13\15\7\0"+ - "\15\15\1\0\7\15\13\0\4\15\14\0\1\15\1\0\2\15\14\0\4\15\3\0\1\15\4\0\2\15\15"+ - "\0\3\15\2\0\12\15\15\0\1\15\23\0\5\15\12\16\3\0\6\15\1\0\23\15\1\0\2\15\6"+ - "\0\6\15\5\0\15\15\1\0\1\15\1\0\1\15\1\0\1\15\1\0\6\15\1\0\7\15\1\0\1\15\3"+ - "\0\3\15\1\0\7\15\3\0\4\15\2\0\6\15\14\0\2\113\25\0\1\15\4\0\1\15\14\0\1\15"+ - "\15\0\1\15\2\0\1\15\4\0\1\15\2\0\12\15\1\0\1\15\3\0\5\15\6\0\1\15\1\0\1\15"+ - "\1\0\1\15\1\0\4\15\1\0\13\15\2\0\4\15\5\0\5\15\4\0\1\15\7\0\17\15\6\0\15\15"+ - "\7\0\10\15\11\0\7\15\1\0\7\15\6\0\3\15\11\0\5\15\2\0\5\15\3\0\7\15\2\0\2\15"+ - "\2\0\3\15\5\0\13\15\12\16\2\15\4\0\3\15\1\0\12\15\1\0\1\15\7\0\11\15\2\0\27"+ - "\15\2\0\15\15\3\0\1\15\1\0\1\15\2\0\1\15\16\0\1\15\12\16\5\15\3\0\5\15\12"+ - "\0\6\15\2\0\6\15\2\0\6\15\11\0\13\15\1\0\2\15\2\0\7\15\4\0\5\15\3\0\5\15\5"+ - "\0\12\15\1\0\5\15\1\0\1\15\1\0\2\15\1\0\2\15\1\0\12\15\3\0\15\15\3\0\2\15"+ - "\30\0\16\15\4\0\1\15\2\0\6\15\2\0\6\15\2\0\6\15\2\0\3\15\3\0\14\15\1\0\16"+ - "\15\1\0\2\15\1\0\1\15\15\0\1\15\2\0\4\15\4\0\10\15\1\0\5\15\12\0\6\15\2\0"+ - "\1\15\1\0\14\15\1\0\2\15\3\0\1\15\2\0\4\15\1\0\2\15\12\0\10\15\6\0\6\15\1"+ - "\0\2\15\5\0\10\15\1\0\3\15\1\0\13\15\4\0\3\15\4\0\6\15\1\0\12\16\4\15\2\0"+ - "\1\15\11\0\5\15\5\0\3\15\3\0\12\16\1\15\1\0\1\15\3\0\10\15\6\0\1\15\1\0\7"+ - "\15\1\0\1\15\1\0\4\15\1\0\2\15\6\0\1\15\5\0\7\15\2\0\7\15\3\0\6\15\1\0\1\15"+ - "\10\0\6\15\2\0\10\15\10\0\6\15\2\0\1\15\3\0\1\15\13\0\10\15\5\0\15\15\3\0"+ - "\2\15\6\0\5\15\3\0\6\15\10\0\10\15\2\0\7\15\16\0\4\15\4\0\3\15\15\0\1\15\2"+ - "\0\2\15\2\0\4\15\1\0\14\15\1\0\1\15\1\0\7\15\1\0\21\15\1\0\4\15\2\0\10\15"+ - "\1\0\7\15\1\0\14\15\1\0\4\15\1\0\5\15\1\0\1\15\3\0\11\15\1\0\10\15\2\0\22"+ - "\16\5\0\1\15\12\0\2\15\1\0\2\15\1\0\5\15\6\0\2\15\1\0\1\15\2\0\1\15\1\0\12"+ - "\15\1\0\4\15\1\0\1\15\1\0\1\15\6\0\1\15\4\0\1\15\1\0\1\15\1\0\1\15\1\0\3\15"+ - "\1\0\2\15\1\0\1\15\2\0\1\15\1\0\1\15\1\0\1\15\1\0\1\15\1\0\1\15\1\0\2\15\1"+ - "\0\1\15\2\0\4\15\1\0\7\15\1\0\4\15\1\0\4\15\1\0\1\15\1\0\12\15\1\0\5\15\1"+ - "\0\3\15\1\0\5\15\1\0\5\15"); + "\11\0\1\41\1\42\1\114\1\51\1\17\22\0\1\37\1\40\1\32\1\16\1\0\1\103\1\104\1"+ + "\30\1\43\1\44\1\100\1\77\1\112\1\24\1\22\1\102\1\1\1\5\6\3\2\2\1\47\1\52\1"+ + "\110\1\50\1\107\1\0\1\101\1\4\1\11\1\26\1\4\1\23\1\33\3\20\1\25\1\20\1\15"+ + "\1\20\1\36\1\10\2\20\1\27\2\20\1\14\2\20\1\6\2\20\1\45\1\31\1\46\1\106\1\7"+ + "\1\113\1\53\1\62\1\64\1\55\1\57\1\67\1\74\1\76\1\66\1\25\1\63\1\13\1\73\1"+ + "\54\1\65\1\71\1\20\1\60\1\56\1\61\1\12\1\20\1\75\1\70\1\72\1\20\1\34\1\105"+ + "\1\35\1\111\6\0\1\114\24\0\1\20\12\0\1\20\4\0\1\20\5\0\27\20\1\0\12\20\4\0"+ + "\14\20\16\0\5\20\7\0\1\20\1\0\1\20\1\0\5\20\1\0\2\20\2\0\4\20\1\0\1\20\6\0"+ + "\1\20\1\0\3\20\1\0\1\20\1\0\4\20\1\0\23\20\1\0\11\20\1\0\26\20\2\0\1\20\6"+ + "\0\10\20\10\0\16\20\1\0\1\20\1\0\2\20\1\0\2\20\1\0\1\20\10\0\13\20\5\0\3\20"+ + "\15\0\12\21\4\0\6\20\1\0\10\20\2\0\12\20\1\0\6\20\12\21\3\20\2\0\14\20\2\0"+ + "\3\20\12\21\14\20\4\0\1\20\5\0\16\20\2\0\14\20\4\0\5\20\1\0\10\20\6\0\20\20"+ + "\2\0\12\21\1\20\2\0\16\20\1\0\1\20\3\0\4\20\2\0\11\20\2\0\2\20\2\0\4\20\10"+ + "\0\1\20\4\0\2\20\1\0\1\20\1\0\3\20\1\0\6\20\4\0\2\20\1\0\2\20\1\0\2\20\1\0"+ + "\2\20\2\0\1\20\1\0\5\20\4\0\2\20\2\0\3\20\3\0\1\20\7\0\4\20\1\0\1\20\7\0\12"+ + "\21\6\20\13\0\3\20\1\0\11\20\1\0\2\20\1\0\2\20\1\0\5\20\2\0\12\20\1\0\3\20"+ + "\1\0\3\20\2\0\1\20\30\0\1\20\7\0\3\20\1\0\10\20\2\0\6\20\2\0\2\20\2\0\3\20"+ + "\10\0\2\20\4\0\2\20\1\0\1\20\1\0\1\20\20\0\2\20\1\0\6\20\3\0\3\20\1\0\4\20"+ + "\3\0\2\20\1\0\1\20\1\0\2\20\3\0\2\20\3\0\3\20\3\0\14\20\4\0\5\20\3\0\3\20"+ + "\1\0\4\20\2\0\1\20\6\0\1\20\10\0\4\20\1\0\10\20\1\0\3\20\1\0\30\20\3\0\10"+ + "\20\1\0\3\20\1\0\4\20\7\0\2\20\1\0\3\20\5\0\4\20\1\0\5\20\2\0\4\20\5\0\2\20"+ + "\7\0\1\20\2\0\2\20\16\0\3\20\1\0\10\20\1\0\7\20\1\0\3\20\1\0\5\20\5\0\4\20"+ + "\7\0\1\20\12\0\6\20\2\0\2\20\1\0\22\20\3\0\10\20\1\0\11\20\1\0\1\20\2\0\7"+ + "\20\3\0\1\20\4\0\6\20\1\0\1\20\1\0\10\20\2\0\2\20\14\0\17\20\1\0\12\21\7\0"+ + "\2\20\1\0\1\20\2\0\2\20\1\0\1\20\2\0\1\20\6\0\4\20\1\0\7\20\1\0\3\20\1\0\1"+ + "\20\1\0\1\20\2\0\2\20\1\0\15\20\1\0\3\20\2\0\5\20\1\0\1\20\1\0\6\20\2\0\12"+ + "\21\2\0\4\20\10\0\2\20\13\0\1\20\1\0\1\20\1\0\1\20\4\0\12\20\1\0\24\20\3\0"+ + "\5\20\1\0\12\20\6\0\1\20\11\0\12\21\4\20\2\0\6\20\1\0\1\20\5\0\1\20\2\0\13"+ + "\20\1\0\15\20\1\0\4\20\2\0\7\20\1\0\1\20\1\0\4\20\2\0\1\20\1\0\4\20\2\0\7"+ + "\20\1\0\1\20\1\0\4\20\2\0\16\20\2\0\6\20\2\0\15\20\2\0\14\20\3\0\13\20\7\0"+ + "\15\20\1\0\7\20\13\0\4\20\14\0\1\20\1\0\2\20\14\0\4\20\3\0\1\20\4\0\2\20\15"+ + "\0\3\20\2\0\12\20\15\0\1\20\23\0\5\20\12\21\3\0\6\20\1\0\23\20\1\0\2\20\6"+ + "\0\6\20\5\0\15\20\1\0\1\20\1\0\1\20\1\0\1\20\1\0\6\20\1\0\7\20\1\0\1\20\3"+ + "\0\3\20\1\0\7\20\3\0\4\20\2\0\6\20\14\0\2\114\25\0\1\20\4\0\1\20\14\0\1\20"+ + "\15\0\1\20\2\0\1\20\4\0\1\20\2\0\12\20\1\0\1\20\3\0\5\20\6\0\1\20\1\0\1\20"+ + "\1\0\1\20\1\0\4\20\1\0\13\20\2\0\4\20\5\0\5\20\4\0\1\20\7\0\17\20\6\0\15\20"+ + "\7\0\10\20\11\0\7\20\1\0\7\20\6\0\3\20\11\0\5\20\2\0\5\20\3\0\7\20\2\0\2\20"+ + "\2\0\3\20\5\0\13\20\12\21\2\20\4\0\3\20\1\0\12\20\1\0\1\20\7\0\11\20\2\0\27"+ + "\20\2\0\15\20\3\0\1\20\1\0\1\20\2\0\1\20\16\0\1\20\12\21\5\20\3\0\5\20\12"+ + "\0\6\20\2\0\6\20\2\0\6\20\11\0\13\20\1\0\2\20\2\0\7\20\4\0\5\20\3\0\5\20\5"+ + "\0\12\20\1\0\5\20\1\0\1\20\1\0\2\20\1\0\2\20\1\0\12\20\3\0\15\20\3\0\2\20"+ + "\30\0\16\20\4\0\1\20\2\0\6\20\2\0\6\20\2\0\6\20\2\0\3\20\3\0\14\20\1\0\16"+ + "\20\1\0\2\20\1\0\1\20\15\0\1\20\2\0\4\20\4\0\10\20\1\0\5\20\12\0\6\20\2\0"+ + "\1\20\1\0\14\20\1\0\2\20\3\0\1\20\2\0\4\20\1\0\2\20\12\0\10\20\6\0\6\20\1"+ + "\0\2\20\5\0\10\20\1\0\3\20\1\0\13\20\4\0\3\20\4\0\6\20\1\0\12\21\4\20\2\0"+ + "\1\20\11\0\5\20\5\0\3\20\3\0\12\21\1\20\1\0\1\20\3\0\10\20\6\0\1\20\1\0\7"+ + "\20\1\0\1\20\1\0\4\20\1\0\2\20\6\0\1\20\5\0\7\20\2\0\7\20\3\0\6\20\1\0\1\20"+ + "\10\0\6\20\2\0\10\20\10\0\6\20\2\0\1\20\3\0\1\20\13\0\10\20\5\0\15\20\3\0"+ + "\2\20\6\0\5\20\3\0\6\20\10\0\10\20\2\0\7\20\16\0\4\20\4\0\3\20\15\0\1\20\2"+ + "\0\2\20\2\0\4\20\1\0\14\20\1\0\1\20\1\0\7\20\1\0\21\20\1\0\4\20\2\0\10\20"+ + "\1\0\7\20\1\0\14\20\1\0\4\20\1\0\5\20\1\0\1\20\3\0\11\20\1\0\10\20\2\0\22"+ + "\21\5\0\1\20\12\0\2\20\1\0\2\20\1\0\5\20\6\0\2\20\1\0\1\20\2\0\1\20\1\0\12"+ + "\20\1\0\4\20\1\0\1\20\1\0\1\20\6\0\1\20\4\0\1\20\1\0\1\20\1\0\1\20\1\0\3\20"+ + "\1\0\2\20\1\0\1\20\2\0\1\20\1\0\1\20\1\0\1\20\1\0\1\20\1\0\1\20\1\0\2\20\1"+ + "\0\1\20\2\0\4\20\1\0\7\20\1\0\4\20\1\0\4\20\1\0\1\20\1\0\12\20\1\0\5\20\1"+ + "\0\3\20\1\0\5\20\1\0\5\20"); /** * Translates DFA states to action switch labels. @@ -184,38 +184,38 @@ class _PythonLexer implements FlexLexerEx { private static final int [] ZZ_ACTION = zzUnpackAction(); private static final String ZZ_ACTION_PACKED_0 = - "\6\0\1\1\2\2\2\3\1\4\1\5\1\6\1\7"+ + "\6\0\1\1\2\2\3\3\1\4\1\5\1\6\1\7"+ "\1\10\1\7\1\3\1\11\1\12\1\13\1\1\1\14"+ "\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24"+ - "\1\25\20\3\1\26\1\27\1\30\1\31\1\32\1\33"+ + "\1\25\17\3\1\26\1\27\1\30\1\31\1\32\1\33"+ "\1\34\1\35\1\36\1\37\1\40\1\41\1\42\2\43"+ "\1\44\2\45\1\46\1\3\2\47\1\22\3\3\1\50"+ "\1\51\1\50\1\51\1\52\1\53\1\3\2\54\1\3"+ "\1\55\1\56\1\57\1\60\1\61\1\62\1\63\1\64"+ - "\1\65\4\3\2\50\1\52\1\66\1\2\5\0\1\2"+ - "\1\67\1\0\1\70\1\0\1\3\1\67\1\71\1\72"+ + "\1\65\4\3\2\50\1\52\1\66\1\2\5\0\3\2"+ + "\1\67\1\0\1\70\1\0\2\3\1\67\1\71\1\72"+ "\3\7\1\73\3\7\1\3\2\74\1\75\1\76\1\77"+ - "\15\3\1\100\1\101\1\102\1\103\10\3\1\104\1\105"+ + "\14\3\1\100\1\101\1\102\1\103\10\3\1\104\1\105"+ "\1\106\1\107\1\110\1\111\1\112\1\113\1\114\1\115"+ "\1\116\1\117\1\120\1\121\1\122\1\0\3\45\1\123"+ "\3\45\1\3\6\47\2\0\1\124\1\3\2\0\1\51"+ "\1\50\1\51\1\3\6\54\1\3\2\125\1\57\1\126"+ "\2\3\1\0\1\50\1\0\1\2\1\0\1\2\1\0"+ - "\1\2\1\0\1\67\1\0\1\3\1\0\1\7\1\127"+ - "\1\130\1\0\1\127\1\3\2\0\1\131\1\3\1\132"+ - "\1\133\1\134\5\3\1\135\6\3\1\136\5\3\1\137"+ - "\1\140\1\141\1\142\1\0\1\45\1\143\1\144\1\0"+ - "\1\143\1\3\1\47\2\145\1\51\1\3\1\54\2\146"+ - "\1\3\2\0\1\50\1\0\2\147\1\0\1\3\1\74"+ - "\1\3\1\150\1\151\10\3\1\152\1\3\1\153\3\3"+ - "\1\0\2\144\11\0\1\3\1\125\4\0\2\3\1\154"+ - "\1\3\1\155\1\156\4\3\1\157\1\3\1\160\10\0"+ - "\1\127\1\161\1\162\1\163\1\3\1\164\1\165\1\3"+ - "\1\166\1\143\1\145\1\146\1\147\1\0\1\167\1\3"+ - "\1\170\1\171"; + "\1\2\1\0\4\2\1\67\1\0\2\3\1\0\1\7"+ + "\1\127\1\130\1\0\1\127\1\3\2\0\1\131\1\3"+ + "\1\132\1\133\1\134\5\3\1\135\5\3\1\136\5\3"+ + "\1\137\1\140\1\141\1\142\1\0\1\45\1\143\1\144"+ + "\1\0\1\143\1\3\1\47\2\145\1\51\1\3\1\54"+ + "\2\146\1\3\2\0\1\50\1\3\1\0\2\147\1\0"+ + "\1\3\1\74\1\3\1\150\1\151\7\3\1\152\1\3"+ + "\1\153\3\3\1\0\2\144\11\0\1\3\1\125\1\3"+ + "\4\0\2\3\1\154\1\3\1\155\1\156\3\3\1\157"+ + "\1\3\1\160\10\0\1\161\1\127\1\162\1\163\1\164"+ + "\1\3\1\165\1\3\1\166\1\143\1\145\1\146\1\147"+ + "\1\0\1\167\1\3\1\170\1\171"; private static int [] zzUnpackAction() { - int [] result = new int[354]; + int [] result = new int[360]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -240,54 +240,54 @@ class _PythonLexer implements FlexLexerEx { private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); private static final String ZZ_ROWMAP_PACKED_0 = - "\0\0\0\114\0\230\0\344\0\u0130\0\u017c\0\u01c8\0\u0214"+ - "\0\u0260\0\u02ac\0\u02f8\0\u0344\0\u0390\0\u03dc\0\u0428\0\u01c8"+ - "\0\u0474\0\u04c0\0\u01c8\0\u01c8\0\u01c8\0\u050c\0\u01c8\0\u01c8"+ - "\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u0558\0\u05a4\0\u01c8\0\u01c8"+ - "\0\u05f0\0\u063c\0\u0688\0\u06d4\0\u0720\0\u076c\0\u07b8\0\u0804"+ - "\0\u0850\0\u089c\0\u08e8\0\u0934\0\u0980\0\u09cc\0\u0a18\0\u0a64"+ - "\0\u0ab0\0\u0afc\0\u0b48\0\u0b94\0\u0be0\0\u0c2c\0\u0c78\0\u0cc4"+ - "\0\u0d10\0\u0d5c\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u0da8\0\u0df4"+ - "\0\u0e40\0\u0e8c\0\u01c8\0\u0ed8\0\u0f24\0\u0f70\0\u0fbc\0\u1008"+ - "\0\u1054\0\u10a0\0\u10ec\0\u1138\0\u1184\0\u11d0\0\u121c\0\u01c8"+ - "\0\u1268\0\u12b4\0\u1300\0\u134c\0\u01c8\0\u01c8\0\u1398\0\u01c8"+ - "\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u13e4\0\u1430\0\u147c\0\u14c8"+ - "\0\u1514\0\u1560\0\u15ac\0\u01c8\0\u01c8\0\u15f8\0\u1644\0\u1690"+ - "\0\u16dc\0\u1728\0\u1774\0\u01c8\0\u17c0\0\u180c\0\u01c8\0\u1858"+ - "\0\u18a4\0\u18f0\0\u01c8\0\u01c8\0\u193c\0\u1988\0\u19d4\0\u01c8"+ - "\0\u1a20\0\u1a6c\0\u1ab8\0\u1b04\0\u1b50\0\u1b9c\0\u01c8\0\u01c8"+ - "\0\u01c8\0\u1be8\0\u1c34\0\u1c80\0\u1ccc\0\u1d18\0\u1d64\0\u1db0"+ - "\0\u1dfc\0\u1e48\0\u1e94\0\u1ee0\0\u1f2c\0\u1f78\0\u02ac\0\u02ac"+ - "\0\u02ac\0\u02ac\0\u1fc4\0\u2010\0\u205c\0\u20a8\0\u20f4\0\u2140"+ - "\0\u218c\0\u21d8\0\u01c8\0\u01c8\0\u2224\0\u01c8\0\u01c8\0\u2270"+ - "\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u22bc\0\u01c8\0\u01c8"+ - "\0\u2308\0\u2354\0\u23a0\0\u23ec\0\u2438\0\u01c8\0\u2484\0\u24d0"+ - "\0\u251c\0\u2568\0\u25b4\0\u2600\0\u264c\0\u2698\0\u26e4\0\u2730"+ - "\0\u277c\0\u27c8\0\u01c8\0\u2814\0\u1184\0\u121c\0\u2860\0\u28ac"+ - "\0\u28f8\0\u2944\0\u2990\0\u29dc\0\u2a28\0\u2a74\0\u2ac0\0\u2b0c"+ - "\0\u2b58\0\u2ba4\0\u2bf0\0\u2c3c\0\u01c8\0\u2c88\0\u2cd4\0\u15ac"+ - "\0\u2d20\0\u2d6c\0\u2db8\0\u2e04\0\u2e50\0\u2e9c\0\u2ee8\0\u2f34"+ - "\0\u2f80\0\u2fcc\0\u3018\0\u0390\0\u3064\0\u30b0\0\u01c8\0\u3064"+ - "\0\u30fc\0\u3148\0\u3194\0\u31e0\0\u02ac\0\u322c\0\u02ac\0\u02ac"+ - "\0\u02ac\0\u3278\0\u32c4\0\u3310\0\u335c\0\u33a8\0\u02ac\0\u33f4"+ - "\0\u3440\0\u348c\0\u34d8\0\u3524\0\u3570\0\u02ac\0\u35bc\0\u3608"+ - "\0\u3654\0\u36a0\0\u36ec\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u3738"+ - "\0\u3784\0\u37d0\0\u01c8\0\u3784\0\u381c\0\u3868\0\u01c8\0\u38b4"+ - "\0\u3900\0\u01c8\0\u394c\0\u01c8\0\u3998\0\u39e4\0\u3a30\0\u3a7c"+ - "\0\u3ac8\0\u3b14\0\u3b60\0\u3bac\0\u3bf8\0\u3c44\0\u3c90\0\u01c8"+ - "\0\u3cdc\0\u02ac\0\u02ac\0\u3d28\0\u3d74\0\u3dc0\0\u3e0c\0\u3e58"+ - "\0\u3ea4\0\u3ef0\0\u3f3c\0\u02ac\0\u3f88\0\u02ac\0\u3fd4\0\u4020"+ - "\0\u406c\0\u40b8\0\u4104\0\u4150\0\u419c\0\u41e8\0\u4234\0\u4280"+ - "\0\u42cc\0\u4318\0\u4364\0\u43b0\0\u43fc\0\u4448\0\u01c8\0\u4494"+ - "\0\u3bac\0\u3bf8\0\u44e0\0\u452c\0\u4578\0\u02ac\0\u45c4\0\u02ac"+ - "\0\u02ac\0\u4610\0\u465c\0\u46a8\0\u46f4\0\u02ac\0\u4740\0\u02ac"+ - "\0\u478c\0\u4104\0\u4150\0\u47d8\0\u4824\0\u4870\0\u48bc\0\u4908"+ - "\0\u4954\0\u02ac\0\u02ac\0\u02ac\0\u49a0\0\u02ac\0\u02ac\0\u49ec"+ - "\0\u02ac\0\u3784\0\u01c8\0\u01c8\0\u01c8\0\u4954\0\u01c8\0\u4a38"+ - "\0\u02ac\0\u02ac"; + "\0\0\0\115\0\232\0\347\0\u0134\0\u0181\0\u01ce\0\u021b"+ + "\0\u0268\0\u02b5\0\u0302\0\u034f\0\u039c\0\u03e9\0\u0436\0\u0483"+ + "\0\u01ce\0\u04d0\0\u051d\0\u01ce\0\u01ce\0\u01ce\0\u056a\0\u01ce"+ + "\0\u01ce\0\u01ce\0\u01ce\0\u01ce\0\u01ce\0\u05b7\0\u0604\0\u01ce"+ + "\0\u01ce\0\u0651\0\u069e\0\u06eb\0\u0738\0\u0785\0\u07d2\0\u081f"+ + "\0\u086c\0\u08b9\0\u0906\0\u0953\0\u09a0\0\u09ed\0\u0a3a\0\u0a87"+ + "\0\u0ad4\0\u0b21\0\u0b6e\0\u0bbb\0\u0c08\0\u0c55\0\u0ca2\0\u0cef"+ + "\0\u0d3c\0\u0d89\0\u01ce\0\u01ce\0\u01ce\0\u01ce\0\u0dd6\0\u0e23"+ + "\0\u0e70\0\u0ebd\0\u01ce\0\u0f0a\0\u0f57\0\u0fa4\0\u0ff1\0\u103e"+ + "\0\u108b\0\u10d8\0\u1125\0\u1172\0\u11bf\0\u120c\0\u1259\0\u01ce"+ + "\0\u12a6\0\u12f3\0\u1340\0\u138d\0\u01ce\0\u01ce\0\u13da\0\u01ce"+ + "\0\u01ce\0\u01ce\0\u01ce\0\u01ce\0\u1427\0\u1474\0\u14c1\0\u150e"+ + "\0\u155b\0\u15a8\0\u15f5\0\u01ce\0\u01ce\0\u1642\0\u168f\0\u16dc"+ + "\0\u1729\0\u1776\0\u17c3\0\u1810\0\u185d\0\u18aa\0\u18f7\0\u1944"+ + "\0\u01ce\0\u1991\0\u19de\0\u1a2b\0\u1a78\0\u01ce\0\u01ce\0\u1ac5"+ + "\0\u1b12\0\u1b5f\0\u01ce\0\u1bac\0\u1bf9\0\u1c46\0\u1c93\0\u1ce0"+ + "\0\u1d2d\0\u01ce\0\u01ce\0\u01ce\0\u1d7a\0\u1dc7\0\u1e14\0\u1e61"+ + "\0\u1eae\0\u1efb\0\u1f48\0\u1f95\0\u1fe2\0\u202f\0\u207c\0\u20c9"+ + "\0\u02b5\0\u02b5\0\u02b5\0\u02b5\0\u2116\0\u2163\0\u21b0\0\u21fd"+ + "\0\u224a\0\u2297\0\u22e4\0\u2331\0\u01ce\0\u01ce\0\u237e\0\u01ce"+ + "\0\u01ce\0\u23cb\0\u01ce\0\u01ce\0\u01ce\0\u01ce\0\u01ce\0\u2418"+ + "\0\u01ce\0\u01ce\0\u2465\0\u24b2\0\u24ff\0\u254c\0\u2599\0\u01ce"+ + "\0\u25e6\0\u2633\0\u2680\0\u26cd\0\u271a\0\u2767\0\u27b4\0\u2801"+ + "\0\u284e\0\u289b\0\u28e8\0\u2935\0\u01ce\0\u2982\0\u11bf\0\u1259"+ + "\0\u29cf\0\u2a1c\0\u2a69\0\u2ab6\0\u2b03\0\u2b50\0\u2b9d\0\u2bea"+ + "\0\u2c37\0\u2c84\0\u2cd1\0\u2d1e\0\u2d6b\0\u2db8\0\u01ce\0\u2e05"+ + "\0\u2e52\0\u15f5\0\u2e9f\0\u2eec\0\u2f39\0\u2f86\0\u2fd3\0\u3020"+ + "\0\u306d\0\u30ba\0\u3107\0\u3154\0\u01ce\0\u31a1\0\u31ee\0\u323b"+ + "\0\u3288\0\u32d5\0\u03e9\0\u3322\0\u336f\0\u01ce\0\u3322\0\u33bc"+ + "\0\u3409\0\u3456\0\u34a3\0\u02b5\0\u34f0\0\u02b5\0\u02b5\0\u02b5"+ + "\0\u353d\0\u358a\0\u35d7\0\u3624\0\u3671\0\u02b5\0\u36be\0\u370b"+ + "\0\u3758\0\u37a5\0\u37f2\0\u02b5\0\u383f\0\u388c\0\u38d9\0\u3926"+ + "\0\u3973\0\u01ce\0\u01ce\0\u01ce\0\u01ce\0\u39c0\0\u3a0d\0\u3a5a"+ + "\0\u01ce\0\u3a0d\0\u3aa7\0\u3af4\0\u01ce\0\u3b41\0\u3b8e\0\u01ce"+ + "\0\u3bdb\0\u01ce\0\u3c28\0\u3c75\0\u3cc2\0\u3d0f\0\u3d5c\0\u3da9"+ + "\0\u3df6\0\u3e43\0\u3e90\0\u3edd\0\u3f2a\0\u3f77\0\u01ce\0\u3fc4"+ + "\0\u02b5\0\u02b5\0\u4011\0\u405e\0\u40ab\0\u40f8\0\u4145\0\u4192"+ + "\0\u41df\0\u02b5\0\u422c\0\u02b5\0\u4279\0\u42c6\0\u4313\0\u4360"+ + "\0\u43ad\0\u43fa\0\u4447\0\u4494\0\u44e1\0\u452e\0\u457b\0\u45c8"+ + "\0\u4615\0\u4662\0\u46af\0\u46fc\0\u01ce\0\u4749\0\u4796\0\u3e90"+ + "\0\u3edd\0\u47e3\0\u4830\0\u487d\0\u02b5\0\u48ca\0\u02b5\0\u02b5"+ + "\0\u4917\0\u4964\0\u49b1\0\u02b5\0\u49fe\0\u02b5\0\u4a4b\0\u43ad"+ + "\0\u43fa\0\u4a98\0\u4ae5\0\u4b32\0\u4b7f\0\u4bcc\0\u02b5\0\u4c19"+ + "\0\u02b5\0\u02b5\0\u02b5\0\u4c66\0\u02b5\0\u4cb3\0\u02b5\0\u3a0d"+ + "\0\u01ce\0\u01ce\0\u01ce\0\u4c19\0\u01ce\0\u4d00\0\u02b5\0\u02b5"; private static int [] zzUnpackRowMap() { - int [] result = new int[354]; + int [] result = new int[360]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -310,403 +310,408 @@ class _PythonLexer implements FlexLexerEx { private static final int [] ZZ_TRANS = zzUnpackTrans(); private static final String ZZ_TRANS_PACKED_0 = - "\1\7\1\10\2\11\1\12\1\11\3\12\1\13\1\12"+ - "\1\14\1\7\1\12\1\7\1\15\1\12\1\16\1\12"+ - "\2\13\1\17\1\20\1\21\1\22\1\23\1\24\1\12"+ - "\1\25\1\26\1\27\1\30\1\31\1\32\1\33\1\34"+ - "\1\35\1\36\1\37\1\40\1\41\1\42\1\43\1\12"+ - "\1\44\1\45\1\46\1\47\1\12\1\50\1\51\1\52"+ - "\1\53\1\13\1\54\1\12\1\55\1\56\1\12\1\57"+ + "\1\7\1\10\2\11\1\12\1\11\3\12\2\13\1\14"+ + "\1\13\1\12\1\15\1\7\1\12\1\7\1\16\1\12"+ + "\1\17\1\12\2\13\1\20\1\21\1\22\1\23\1\24"+ + "\1\25\1\12\1\26\1\27\1\30\1\31\1\32\1\33"+ + "\1\34\1\35\1\36\1\37\1\40\1\41\1\42\1\43"+ + "\1\44\1\12\1\45\1\46\1\47\1\50\1\12\1\51"+ + "\1\52\1\53\1\54\1\12\1\55\1\56\1\12\1\57"+ "\1\60\1\12\1\61\1\62\1\63\1\64\1\65\1\66"+ "\1\67\1\70\1\71\1\72\1\73\1\74\1\75\1\7"+ - "\11\76\1\77\1\76\1\100\1\0\6\76\2\77\1\101"+ - "\1\20\1\102\4\76\1\25\1\76\1\27\1\103\6\76"+ - "\1\37\6\76\1\77\1\76\1\77\1\76\1\77\3\76"+ - "\1\77\25\76\1\0\1\7\1\10\2\11\1\12\1\11"+ - "\3\12\1\104\1\12\1\100\1\7\1\12\1\7\1\15"+ - "\1\12\1\16\1\12\2\104\1\105\1\20\1\106\1\22"+ - "\1\23\1\24\1\12\1\25\1\26\1\27\1\103\1\31"+ - "\1\32\1\33\1\34\1\107\1\36\1\37\1\40\1\41"+ - "\1\42\1\43\1\12\1\44\1\110\1\46\1\111\1\12"+ - "\1\112\1\51\1\52\1\53\1\104\1\54\1\12\1\55"+ + "\11\76\2\77\1\76\1\77\1\76\1\100\1\0\6\76"+ + "\2\77\1\101\1\21\1\102\4\76\1\26\1\76\1\30"+ + "\1\103\6\76\1\40\6\76\1\77\1\76\1\77\1\76"+ + "\1\77\27\76\1\0\1\7\1\10\2\11\1\12\1\11"+ + "\3\12\2\104\1\14\1\104\1\12\1\100\1\7\1\12"+ + "\1\7\1\16\1\12\1\17\1\12\2\104\1\105\1\21"+ + "\1\106\1\23\1\24\1\25\1\12\1\26\1\27\1\30"+ + "\1\103\1\32\1\33\1\34\1\35\1\107\1\37\1\40"+ + "\1\41\1\42\1\43\1\44\1\12\1\45\1\110\1\47"+ + "\1\111\1\12\1\112\1\52\1\53\1\54\1\12\1\55"+ "\1\56\1\12\1\57\1\60\1\12\1\61\1\62\1\63"+ "\1\64\1\65\1\66\1\67\1\70\1\71\1\72\1\73"+ - "\1\74\1\75\1\7\14\113\1\7\10\113\1\114\1\115"+ - "\1\116\1\113\1\117\5\113\1\120\54\113\1\7\1\10"+ - "\2\11\1\12\1\11\3\12\1\121\1\12\1\100\1\7"+ - "\1\12\1\7\1\15\1\12\1\16\1\12\2\121\1\122"+ - "\1\20\1\123\1\124\1\125\1\126\1\12\1\25\1\127"+ - "\1\27\1\130\1\131\1\132\1\133\1\134\1\135\1\36"+ - "\1\37\1\40\1\41\1\42\1\43\1\12\1\44\1\136"+ - "\1\46\1\137\1\12\1\140\1\51\1\52\1\53\1\121"+ + "\1\74\1\75\1\7\17\113\1\7\10\113\1\114\1\115"+ + "\1\116\1\113\1\117\5\113\1\120\52\113\1\7\1\10"+ + "\2\11\1\12\1\11\3\12\2\121\1\14\1\121\1\12"+ + "\1\100\1\7\1\12\1\7\1\16\1\12\1\17\1\12"+ + "\2\121\1\122\1\21\1\123\1\124\1\125\1\126\1\12"+ + "\1\26\1\127\1\30\1\130\1\131\1\132\1\133\1\134"+ + "\1\135\1\37\1\40\1\41\1\42\1\43\1\44\1\12"+ + "\1\45\1\136\1\47\1\137\1\12\1\140\1\52\1\53"+ "\1\141\1\12\1\55\1\56\1\12\1\57\1\60\1\12"+ "\1\61\1\62\1\63\1\64\1\65\1\66\1\67\1\70"+ - "\1\71\1\72\1\73\1\74\1\75\1\7\14\142\1\7"+ + "\1\71\1\72\1\73\1\74\1\75\1\7\17\142\1\7"+ "\10\142\1\114\1\143\1\116\1\142\1\144\1\145\4\142"+ - "\1\120\54\142\115\0\1\146\1\147\1\146\1\0\1\146"+ - "\1\150\1\151\1\152\1\153\1\154\4\0\1\155\1\156"+ - "\1\0\1\157\31\0\1\156\2\0\1\153\2\0\1\154"+ - "\1\152\3\0\1\150\25\0\3\11\1\0\1\11\1\0"+ - "\1\160\2\0\1\154\4\0\1\155\1\156\1\0\1\157"+ - "\31\0\1\156\5\0\1\154\32\0\12\12\2\0\2\12"+ - "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ - "\14\0\26\12\17\0\10\12\1\161\1\12\2\0\2\12"+ - "\1\0\1\12\1\0\1\12\2\161\1\17\1\0\1\21"+ - "\1\22\2\0\1\12\14\0\5\12\1\161\1\12\1\161"+ - "\1\12\1\161\3\12\1\161\1\22\7\12\16\0\14\14"+ - "\1\0\22\14\1\0\54\14\1\0\3\162\1\0\1\162"+ - "\153\0\1\163\40\0\1\164\5\0\14\165\1\0\10\165"+ - "\1\166\1\167\10\165\1\170\54\165\14\171\1\0\11\171"+ - "\1\172\1\173\7\171\1\170\54\171\1\0\10\12\1\174"+ - "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\174"+ - "\1\175\1\0\1\176\1\12\2\0\1\12\14\0\5\12"+ - "\1\174\1\12\1\174\1\12\1\174\3\12\1\174\10\12"+ - "\63\0\1\177\113\0\1\200\113\0\1\201\47\0\12\12"+ - "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\2\0\1\12\14\0\1\12\1\202\1\12\1\203\22\12"+ - "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\2\0\1\12\14\0\13\12\1\204\12\12"+ - "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\2\0\1\12\14\0\4\12\1\205\21\12"+ - "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\2\0\1\12\14\0\12\12\1\206\4\12"+ - "\1\207\6\12\17\0\10\12\1\161\1\12\2\0\2\12"+ - "\1\0\1\12\1\0\1\12\2\161\1\17\1\0\1\21"+ - "\1\22\2\0\1\12\14\0\1\210\3\12\1\211\1\161"+ - "\1\12\1\161\1\12\1\161\3\12\1\161\1\22\7\12"+ - "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\2\0\1\12\14\0\5\12\1\212\20\12"+ - "\17\0\10\12\1\161\1\12\2\0\2\12\1\0\1\12"+ - "\1\0\1\12\2\161\1\17\1\0\1\21\1\22\2\0"+ - "\1\12\14\0\5\12\1\213\1\12\1\161\1\12\1\161"+ - "\3\12\1\161\1\22\7\12\17\0\10\12\1\161\1\12"+ - "\2\0\2\12\1\0\1\12\1\0\1\12\2\161\1\17"+ - "\1\0\1\21\1\22\2\0\1\12\14\0\5\12\1\161"+ - "\1\12\1\161\1\12\1\161\1\214\1\215\1\12\1\161"+ - "\1\22\7\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\216"+ - "\25\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\5\12\1\217"+ - "\20\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\1\12\1\220"+ - "\1\12\1\221\12\12\1\222\3\12\1\223\3\12\17\0"+ - "\10\12\1\174\1\12\2\0\2\12\1\0\1\12\1\0"+ - "\1\12\2\174\1\175\1\0\1\176\1\12\2\0\1\12"+ - "\14\0\5\12\1\224\1\12\1\174\1\12\1\174\1\12"+ - "\1\225\1\226\1\174\10\12\17\0\12\12\2\0\2\12"+ - "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ - "\14\0\1\227\25\12\17\0\12\12\2\0\2\12\1\0"+ + "\1\120\52\142\116\0\1\146\1\147\1\146\1\0\1\146"+ + "\1\150\1\151\1\152\1\153\1\154\1\155\1\154\1\156"+ + "\4\0\1\157\1\160\1\0\1\161\31\0\1\160\2\0"+ + "\1\153\2\0\1\152\2\0\1\150\25\0\3\11\1\0"+ + "\1\11\1\0\1\162\2\0\1\154\1\155\1\154\1\156"+ + "\4\0\1\157\1\160\1\0\1\161\31\0\1\160\36\0"+ + "\15\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ + "\1\12\2\0\1\12\14\0\24\12\17\0\10\12\2\163"+ + "\1\12\1\163\1\12\2\0\2\12\1\0\1\12\1\0"+ + "\1\12\2\163\1\20\1\0\1\22\1\23\2\0\1\12"+ + "\14\0\5\12\1\163\1\12\1\163\1\12\1\163\2\12"+ + "\1\23\7\12\17\0\15\12\2\0\2\12\1\0\1\12"+ + "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\164"+ + "\23\12\16\0\17\15\1\0\22\15\1\0\52\15\1\0"+ + "\3\165\1\0\1\165\157\0\1\166\36\0\1\167\5\0"+ + "\17\170\1\0\10\170\1\171\1\172\10\170\1\173\52\170"+ + "\17\174\1\0\11\174\1\175\1\176\7\174\1\173\52\174"+ + "\1\0\10\12\2\177\1\12\1\177\1\12\2\0\2\12"+ + "\1\0\1\12\1\0\1\12\2\177\1\200\1\0\1\201"+ + "\1\12\2\0\1\12\14\0\5\12\1\177\1\12\1\177"+ + "\1\12\1\177\12\12\66\0\1\202\114\0\1\203\114\0"+ + "\1\204\45\0\15\12\2\0\2\12\1\0\1\12\1\0"+ + "\3\12\3\0\1\12\2\0\1\12\14\0\1\12\1\205"+ + "\1\12\1\206\20\12\17\0\15\12\2\0\2\12\1\0"+ "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+ - "\14\12\1\230\11\12\17\0\12\12\2\0\2\12\1\0"+ + "\12\12\1\207\11\12\17\0\15\12\2\0\2\12\1\0"+ "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+ - "\12\12\1\231\13\12\17\0\12\12\2\0\2\12\1\0"+ + "\4\12\1\210\17\12\17\0\12\12\1\211\2\12\2\0"+ + "\2\12\1\0\1\12\1\0\3\12\3\0\1\12\2\0"+ + "\1\12\14\0\15\12\1\212\6\12\17\0\10\12\2\163"+ + "\1\12\1\163\1\12\2\0\2\12\1\0\1\12\1\0"+ + "\1\12\2\163\1\20\1\0\1\22\1\23\2\0\1\12"+ + "\14\0\1\213\3\12\1\214\1\163\1\12\1\163\1\12"+ + "\1\163\2\12\1\23\7\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\5\12\1\215\16\12\17\0\10\12\2\163\1\12"+ + "\1\163\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ + "\2\163\1\20\1\0\1\22\1\23\2\0\1\12\14\0"+ + "\5\12\1\216\1\12\1\163\1\12\1\163\2\12\1\23"+ + "\7\12\17\0\10\12\2\163\1\217\1\163\1\12\2\0"+ + "\2\12\1\0\1\12\1\0\1\12\2\163\1\20\1\0"+ + "\1\22\1\23\2\0\1\12\14\0\5\12\1\163\1\12"+ + "\1\163\1\12\1\163\1\220\1\12\1\23\7\12\17\0"+ + "\15\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ + "\1\12\2\0\1\12\14\0\5\12\1\221\16\12\17\0"+ + "\15\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ + "\1\12\2\0\1\12\14\0\1\12\1\222\1\12\1\223"+ + "\10\12\1\224\3\12\1\225\3\12\17\0\10\12\2\177"+ + "\1\12\1\177\1\12\2\0\2\12\1\0\1\12\1\0"+ + "\1\12\2\177\1\200\1\0\1\201\1\12\2\0\1\12"+ + "\14\0\5\12\1\226\1\12\1\177\1\12\1\177\1\227"+ + "\1\230\10\12\17\0\15\12\2\0\2\12\1\0\1\12"+ + "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\231"+ + "\23\12\17\0\15\12\2\0\2\12\1\0\1\12\1\0"+ + "\3\12\3\0\1\12\2\0\1\12\14\0\13\12\1\232"+ + "\10\12\17\0\12\12\1\233\2\12\2\0\2\12\1\0"+ "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+ - "\25\12\1\232\63\0\1\233\113\0\1\234\31\0\1\235"+ - "\61\0\1\236\113\0\1\237\33\0\1\240\57\0\1\241"+ - "\113\0\1\242\113\0\1\243\113\0\1\244\113\0\1\245"+ - "\40\0\1\246\52\0\1\247\40\0\1\250\1\251\15\0"+ - "\1\252\11\0\2\252\1\101\1\0\1\102\25\0\1\252"+ - "\1\0\1\252\1\0\1\252\3\0\1\252\26\0\14\100"+ - "\1\0\22\100\1\0\54\100\14\253\1\0\10\253\1\254"+ - "\1\255\10\253\1\256\54\253\14\257\1\0\11\257\1\260"+ - "\1\261\7\257\1\256\54\257\1\0\10\12\1\262\1\12"+ - "\2\0\2\12\1\0\1\12\1\0\1\12\2\262\1\105"+ - "\1\0\1\106\1\22\2\0\1\12\14\0\5\12\1\262"+ - "\1\12\1\262\1\12\1\262\3\12\1\262\1\22\7\12"+ - "\16\0\14\263\1\0\10\263\1\264\1\265\10\263\1\0"+ - "\54\263\14\266\1\0\11\266\1\267\1\270\7\266\1\0"+ - "\54\266\13\0\1\271\20\0\1\272\2\0\1\273\5\0"+ - "\1\200\47\0\10\12\1\262\1\12\2\0\2\12\1\0"+ - "\1\12\1\0\1\12\2\262\1\105\1\0\1\106\1\22"+ - "\2\0\1\12\14\0\1\210\3\12\1\211\1\262\1\12"+ - "\1\262\1\12\1\262\3\12\1\262\1\22\7\12\17\0"+ - "\10\12\1\262\1\12\2\0\2\12\1\0\1\12\1\0"+ - "\1\12\2\262\1\105\1\0\1\106\1\22\2\0\1\12"+ - "\14\0\5\12\1\274\1\12\1\262\1\12\1\262\3\12"+ - "\1\262\1\22\7\12\17\0\10\12\1\262\1\12\2\0"+ - "\2\12\1\0\1\12\1\0\1\12\2\262\1\105\1\0"+ - "\1\106\1\22\2\0\1\12\14\0\5\12\1\262\1\12"+ - "\1\262\1\12\1\262\1\214\1\215\1\12\1\262\1\22"+ - "\7\12\16\0\14\113\1\0\10\113\1\0\1\275\1\0"+ - "\1\113\1\276\5\113\1\0\54\113\25\0\1\277\66\0"+ - "\31\113\2\0\1\300\60\113\27\0\1\301\115\0\1\113"+ - "\63\0\10\12\1\302\1\12\2\0\2\12\1\0\1\12"+ - "\1\0\1\12\2\302\1\122\1\0\1\123\1\124\2\0"+ - "\1\12\14\0\5\12\1\302\1\12\1\302\1\12\1\302"+ - "\3\12\1\302\1\124\7\12\16\0\14\303\1\0\10\303"+ - "\1\304\1\305\10\303\1\0\54\303\14\306\1\0\11\306"+ - "\1\307\1\310\7\306\1\0\54\306\1\0\10\12\1\311"+ - "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\311"+ - "\1\312\1\0\1\313\1\12\2\0\1\12\14\0\5\12"+ - "\1\311\1\12\1\311\1\12\1\311\3\12\1\311\10\12"+ - "\16\0\14\314\1\0\10\314\1\0\1\314\1\0\2\314"+ - "\1\0\1\314\1\0\1\314\2\0\4\314\1\0\1\177"+ - "\46\314\45\0\1\315\47\0\10\12\1\302\1\12\2\0"+ - "\2\12\1\0\1\12\1\0\1\12\2\302\1\122\1\0"+ - "\1\123\1\124\2\0\1\12\14\0\1\210\3\12\1\211"+ - "\1\302\1\12\1\302\1\12\1\302\3\12\1\302\1\124"+ - "\7\12\17\0\10\12\1\302\1\12\2\0\2\12\1\0"+ - "\1\12\1\0\1\12\2\302\1\122\1\0\1\123\1\124"+ - "\2\0\1\12\14\0\5\12\1\316\1\12\1\302\1\12"+ - "\1\302\3\12\1\302\1\124\7\12\17\0\10\12\1\302"+ - "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\302"+ - "\1\122\1\0\1\123\1\124\2\0\1\12\14\0\5\12"+ - "\1\302\1\12\1\302\1\12\1\302\1\214\1\215\1\12"+ - "\1\302\1\124\7\12\17\0\10\12\1\311\1\12\2\0"+ - "\2\12\1\0\1\12\1\0\1\12\2\311\1\312\1\0"+ - "\1\313\1\12\2\0\1\12\14\0\5\12\1\317\1\12"+ - "\1\311\1\12\1\311\1\12\1\225\1\226\1\311\10\12"+ - "\16\0\14\142\1\0\10\142\1\0\1\320\1\0\1\142"+ - "\2\0\4\142\1\0\105\142\2\0\1\321\60\142\1\0"+ - "\1\146\1\147\1\146\1\0\1\146\1\0\1\151\2\0"+ - "\1\154\4\0\1\155\1\156\1\0\1\157\31\0\1\156"+ - "\5\0\1\154\32\0\3\147\1\0\1\147\1\0\1\322"+ - "\7\0\1\155\1\156\1\0\1\157\31\0\1\156\40\0"+ - "\5\323\1\0\1\324\1\0\1\323\6\0\1\323\2\0"+ - "\1\323\4\0\1\323\17\0\1\323\1\0\1\323\1\0"+ - "\1\323\2\0\1\323\1\0\1\323\4\0\1\323\26\0"+ - "\1\146\1\147\1\146\1\0\1\146\107\0\1\325\1\0"+ - "\1\325\1\0\1\325\1\0\1\326\105\0\1\327\3\0"+ - "\1\327\1\0\1\330\105\0\3\162\1\0\1\162\12\0"+ - "\1\156\1\0\1\157\31\0\1\156\40\0\3\331\1\0"+ - "\1\331\13\0\1\332\54\0\1\332\16\0\3\11\1\0"+ - "\1\11\107\0\10\12\1\333\1\12\2\0\2\12\1\0"+ - "\1\12\1\0\1\12\2\333\1\17\1\0\1\21\1\22"+ - "\2\0\1\12\14\0\5\12\1\333\1\12\1\333\1\12"+ - "\1\333\3\12\1\333\1\22\7\12\17\0\3\162\1\0"+ - "\1\162\1\0\1\334\10\0\1\156\1\0\1\157\31\0"+ - "\1\156\37\0\14\165\1\0\10\165\1\335\1\167\10\165"+ - "\1\170\54\165\25\0\1\336\1\337\5\0\1\340\1\0"+ - "\1\340\1\170\7\0\1\170\44\0\114\165\14\171\1\0"+ - "\11\171\1\172\1\335\7\171\1\170\170\171\26\0\1\337"+ - "\1\341\4\0\1\340\1\0\1\340\1\170\7\0\1\170"+ - "\45\0\10\12\1\342\1\12\2\0\2\12\1\0\1\12"+ - "\1\0\1\12\2\342\1\175\1\0\1\176\1\12\2\0"+ - "\1\12\14\0\5\12\1\342\1\12\1\342\1\12\1\342"+ - "\3\12\1\342\10\12\43\0\1\343\115\0\1\344\65\0"+ - "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\2\0\1\12\14\0\2\12\1\345\23\12\17\0"+ - "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\2\0\1\12\14\0\3\12\1\346\22\12\17\0"+ - "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\2\0\1\12\14\0\6\12\1\347\17\12\17\0"+ - "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\2\0\1\12\14\0\12\12\1\350\3\12\1\351"+ - "\7\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\3\12\1\352"+ - "\10\12\1\353\11\12\17\0\12\12\2\0\2\12\1\0"+ - "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+ - "\11\12\1\354\14\12\17\0\12\12\2\0\2\12\1\0"+ - "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+ - "\14\12\1\355\11\12\17\0\12\12\2\0\2\12\1\0"+ - "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+ - "\6\12\1\356\17\12\17\0\12\12\2\0\2\12\1\0"+ - "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+ - "\21\12\1\357\4\12\17\0\10\12\1\333\1\12\2\0"+ - "\2\12\1\0\1\12\1\0\1\12\2\333\1\17\1\0"+ - "\1\21\1\22\2\0\1\12\14\0\4\12\1\360\1\333"+ - "\1\12\1\333\1\12\1\333\3\12\1\333\1\22\7\12"+ - "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\2\0\1\12\14\0\1\361\25\12\17\0"+ - "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\2\0\1\12\14\0\1\12\1\362\24\12\17\0"+ - "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\2\0\1\12\14\0\22\12\1\363\3\12\17\0"+ - "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\2\0\1\12\14\0\20\12\1\364\5\12\17\0"+ - "\10\12\1\342\1\12\2\0\2\12\1\0\1\12\1\0"+ - "\1\12\2\342\1\175\1\0\1\176\1\12\2\0\1\12"+ - "\14\0\5\12\1\342\1\12\1\342\1\12\1\342\1\12"+ - "\1\365\1\12\1\342\10\12\17\0\12\12\2\0\2\12"+ - "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ - "\14\0\5\12\1\366\20\12\17\0\12\12\2\0\2\12"+ - "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ - "\14\0\1\12\1\367\24\12\17\0\12\12\2\0\2\12"+ - "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ - "\14\0\3\12\1\370\22\12\17\0\12\12\2\0\2\12"+ - "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ - "\14\0\4\12\1\371\21\12\17\0\12\12\2\0\2\12"+ - "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ - "\14\0\13\12\1\372\12\12\17\0\12\12\2\0\2\12"+ - "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ - "\14\0\14\12\1\373\11\12\63\0\1\374\113\0\1\375"+ - "\113\0\1\376\113\0\1\377\57\0\1\u0100\11\0\2\u0100"+ - "\1\101\1\0\1\102\25\0\1\u0100\1\0\1\u0100\1\0"+ - "\1\u0100\3\0\1\u0100\26\0\14\253\1\0\10\253\1\u0101"+ - "\1\255\10\253\1\256\54\253\25\0\1\u0102\1\u0103\5\0"+ - "\1\u0104\1\0\1\u0104\1\256\7\0\1\256\44\0\114\253"+ - "\14\257\1\0\11\257\1\260\1\u0101\7\257\1\256\170\257"+ - "\26\0\1\u0103\1\u0105\4\0\1\u0104\1\0\1\u0104\1\256"+ - "\7\0\1\256\45\0\10\12\1\u0106\1\12\2\0\2\12"+ - "\1\0\1\12\1\0\1\12\2\u0106\1\105\1\0\1\106"+ - "\1\22\2\0\1\12\14\0\5\12\1\u0106\1\12\1\u0106"+ - "\1\12\1\u0106\3\12\1\u0106\1\22\7\12\16\0\14\263"+ - "\1\0\10\263\1\u0107\1\265\10\263\1\0\54\263\25\0"+ - "\1\u0108\66\0\114\263\14\266\1\0\11\266\1\267\1\u0107"+ - "\7\266\1\0\170\266\27\0\1\u0109\64\0\14\271\1\0"+ - "\22\271\1\273\54\271\13\0\1\271\20\0\1\272\2\0"+ - "\1\273\55\0\10\12\1\u0106\1\12\2\0\2\12\1\0"+ - "\1\12\1\0\1\12\2\u0106\1\105\1\0\1\106\1\22"+ - "\2\0\1\12\14\0\4\12\1\360\1\u0106\1\12\1\u0106"+ - "\1\12\1\u0106\3\12\1\u0106\1\22\7\12\43\0\1\u010a"+ - "\66\0\14\113\1\0\10\113\1\0\1\275\1\0\1\113"+ - "\1\300\5\113\1\0\54\113\27\0\1\u010a\65\0\10\12"+ - "\1\u010b\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ - "\2\u010b\1\122\1\0\1\123\1\124\2\0\1\12\14\0"+ - "\5\12\1\u010b\1\12\1\u010b\1\12\1\u010b\3\12\1\u010b"+ - "\1\124\7\12\16\0\14\303\1\0\10\303\1\u010c\1\305"+ - "\10\303\1\0\54\303\25\0\1\u010d\66\0\114\303\14\306"+ - "\1\0\11\306\1\307\1\u010c\7\306\1\0\170\306\27\0"+ - "\1\u010e\65\0\10\12\1\u010f\1\12\2\0\2\12\1\0"+ - "\1\12\1\0\1\12\2\u010f\1\312\1\0\1\313\1\12"+ - "\2\0\1\12\14\0\5\12\1\u010f\1\12\1\u010f\1\12"+ - "\1\u010f\3\12\1\u010f\10\12\43\0\1\u0110\115\0\1\u0111"+ - "\64\0\14\314\1\0\10\314\1\0\1\314\1\0\2\314"+ - "\1\0\1\314\1\0\1\314\2\0\4\314\2\0\46\314"+ - "\1\0\10\12\1\u010b\1\12\2\0\2\12\1\0\1\12"+ - "\1\0\1\12\2\u010b\1\122\1\0\1\123\1\124\2\0"+ - "\1\12\14\0\4\12\1\360\1\u010b\1\12\1\u010b\1\12"+ - "\1\u010b\3\12\1\u010b\1\124\7\12\17\0\10\12\1\u010f"+ - "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\u010f"+ - "\1\312\1\0\1\313\1\12\2\0\1\12\14\0\5\12"+ - "\1\u010f\1\12\1\u010f\1\12\1\u010f\1\12\1\365\1\12"+ - "\1\u010f\10\12\16\0\14\142\1\0\10\142\1\0\1\320"+ - "\1\0\1\142\1\u0112\1\0\4\142\1\0\54\142\1\0"+ - "\3\147\1\0\1\147\107\0\5\323\1\0\1\324\1\0"+ - "\1\323\1\154\5\0\1\323\2\0\1\323\4\0\1\323"+ - "\17\0\1\323\1\0\1\323\1\0\1\323\2\0\1\323"+ - "\1\0\1\323\1\154\3\0\1\323\26\0\5\323\3\0"+ - "\1\323\6\0\1\323\2\0\1\323\4\0\1\323\17\0"+ - "\1\323\1\0\1\323\1\0\1\323\2\0\1\323\1\0"+ - "\1\323\4\0\1\323\26\0\1\325\1\0\1\325\1\0"+ - "\1\325\1\0\1\326\2\0\1\154\47\0\1\154\32\0"+ - "\1\325\1\0\1\325\1\0\1\325\107\0\1\327\3\0"+ - "\1\327\1\0\1\330\2\0\1\154\47\0\1\154\32\0"+ - "\1\327\3\0\1\327\107\0\3\331\1\0\1\331\1\0"+ - "\1\332\12\0\1\157\72\0\3\331\1\0\1\331\107\0"+ - "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\1\17"+ - "\1\0\1\21\1\22\2\0\1\12\14\0\16\12\1\22"+ - "\7\12\44\0\1\337\5\0\1\340\1\0\1\340\1\170"+ - "\7\0\1\170\44\0\25\336\1\u0113\1\u0114\65\336\26\341"+ - "\1\u0115\1\u0116\64\341\1\0\10\12\1\u0117\1\12\2\0"+ - "\2\12\1\0\1\12\1\0\1\12\2\u0117\1\175\1\0"+ - "\1\176\1\12\2\0\1\12\14\0\5\12\1\u0117\1\12"+ - "\1\u0117\1\12\1\u0117\3\12\1\u0117\10\12\43\0\1\u0118"+ - "\115\0\1\u0118\65\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\4\12"+ - "\1\u0119\21\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\4\12"+ - "\1\u011a\21\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\16\12"+ - "\1\u011b\7\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\4\12"+ - "\1\u011c\21\12\17\0\12\12\2\0\2\12\1\0\1\12"+ + "\24\12\17\0\15\12\2\0\2\12\1\0\1\12\1\0"+ + "\3\12\3\0\1\12\2\0\1\12\14\0\23\12\1\234"+ + "\66\0\1\235\114\0\1\236\27\0\1\237\64\0\1\240"+ + "\114\0\1\241\31\0\1\242\62\0\1\243\114\0\1\244"+ + "\114\0\1\245\114\0\1\246\114\0\1\247\36\0\1\250"+ + "\55\0\1\251\36\0\1\252\1\253\15\0\2\254\1\0"+ + "\1\254\11\0\2\254\1\101\1\0\1\102\25\0\1\254"+ + "\1\0\1\254\1\0\1\254\30\0\17\100\1\0\22\100"+ + "\1\0\52\100\17\255\1\0\10\255\1\256\1\257\10\255"+ + "\1\260\52\255\17\261\1\0\11\261\1\262\1\263\7\261"+ + "\1\260\52\261\1\0\10\12\2\264\1\12\1\264\1\12"+ + "\2\0\2\12\1\0\1\12\1\0\1\12\2\264\1\105"+ + "\1\0\1\106\1\23\2\0\1\12\14\0\5\12\1\264"+ + "\1\12\1\264\1\12\1\264\2\12\1\23\7\12\16\0"+ + "\17\265\1\0\10\265\1\266\1\267\10\265\1\0\52\265"+ + "\17\270\1\0\11\270\1\271\1\272\7\270\1\0\52\270"+ + "\16\0\1\273\20\0\1\274\2\0\1\275\5\0\1\203"+ + "\45\0\10\12\2\264\1\12\1\264\1\12\2\0\2\12"+ + "\1\0\1\12\1\0\1\12\2\264\1\105\1\0\1\106"+ + "\1\23\2\0\1\12\14\0\1\213\3\12\1\214\1\264"+ + "\1\12\1\264\1\12\1\264\2\12\1\23\7\12\17\0"+ + "\10\12\2\264\1\12\1\264\1\12\2\0\2\12\1\0"+ + "\1\12\1\0\1\12\2\264\1\105\1\0\1\106\1\23"+ + "\2\0\1\12\14\0\5\12\1\276\1\12\1\264\1\12"+ + "\1\264\2\12\1\23\7\12\17\0\10\12\2\264\1\217"+ + "\1\264\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ + "\2\264\1\105\1\0\1\106\1\23\2\0\1\12\14\0"+ + "\5\12\1\264\1\12\1\264\1\12\1\264\1\220\1\12"+ + "\1\23\7\12\16\0\17\113\1\0\10\113\1\0\1\277"+ + "\1\0\1\113\1\300\5\113\1\0\52\113\30\0\1\301"+ + "\64\0\34\113\2\0\1\302\56\113\32\0\1\303\116\0"+ + "\1\113\61\0\10\12\2\304\1\12\1\304\1\12\2\0"+ + "\2\12\1\0\1\12\1\0\1\12\2\304\1\122\1\0"+ + "\1\123\1\124\2\0\1\12\14\0\5\12\1\304\1\12"+ + "\1\304\1\12\1\304\2\12\1\124\7\12\16\0\17\305"+ + "\1\0\10\305\1\306\1\307\10\305\1\0\52\305\17\310"+ + "\1\0\11\310\1\311\1\312\7\310\1\0\52\310\1\0"+ + "\10\12\2\313\1\12\1\313\1\12\2\0\2\12\1\0"+ + "\1\12\1\0\1\12\2\313\1\314\1\0\1\315\1\12"+ + "\2\0\1\12\14\0\5\12\1\313\1\12\1\313\1\12"+ + "\1\313\12\12\16\0\17\316\1\0\10\316\1\0\1\316"+ + "\1\0\2\316\1\0\1\316\1\0\1\316\2\0\4\316"+ + "\1\0\1\202\44\316\50\0\1\317\45\0\10\12\2\304"+ + "\1\12\1\304\1\12\2\0\2\12\1\0\1\12\1\0"+ + "\1\12\2\304\1\122\1\0\1\123\1\124\2\0\1\12"+ + "\14\0\1\213\3\12\1\214\1\304\1\12\1\304\1\12"+ + "\1\304\2\12\1\124\7\12\17\0\10\12\2\304\1\12"+ + "\1\304\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ + "\2\304\1\122\1\0\1\123\1\124\2\0\1\12\14\0"+ + "\5\12\1\320\1\12\1\304\1\12\1\304\2\12\1\124"+ + "\7\12\17\0\10\12\2\304\1\217\1\304\1\12\2\0"+ + "\2\12\1\0\1\12\1\0\1\12\2\304\1\122\1\0"+ + "\1\123\1\124\2\0\1\12\14\0\5\12\1\304\1\12"+ + "\1\304\1\12\1\304\1\220\1\12\1\124\7\12\17\0"+ + "\10\12\2\313\1\12\1\313\1\12\2\0\2\12\1\0"+ + "\1\12\1\0\1\12\2\313\1\314\1\0\1\315\1\12"+ + "\2\0\1\12\14\0\5\12\1\321\1\12\1\313\1\12"+ + "\1\313\1\227\1\230\10\12\16\0\17\142\1\0\10\142"+ + "\1\0\1\322\1\0\1\142\2\0\4\142\1\0\106\142"+ + "\2\0\1\323\56\142\1\0\1\146\1\147\1\146\1\0"+ + "\1\146\1\0\1\151\2\0\1\154\1\155\1\154\1\156"+ + "\4\0\1\157\1\160\1\0\1\161\31\0\1\160\36\0"+ + "\3\147\1\0\1\147\1\0\1\324\12\0\1\157\1\160"+ + "\1\0\1\161\31\0\1\160\36\0\5\325\1\0\1\326"+ + "\1\0\1\325\11\0\1\325\2\0\1\325\4\0\1\325"+ + "\17\0\1\325\1\0\1\325\1\0\1\325\2\0\1\325"+ + "\1\0\1\325\2\0\1\325\26\0\1\146\1\147\1\146"+ + "\1\0\1\146\110\0\1\327\1\0\1\327\1\0\1\327"+ + "\1\0\1\330\106\0\1\331\3\0\1\331\1\0\1\332"+ + "\120\0\1\333\1\0\1\334\111\0\1\335\1\336\1\335"+ + "\112\0\1\335\1\0\1\335\1\336\100\0\3\165\1\0"+ + "\1\165\15\0\1\160\1\0\1\161\31\0\1\160\36\0"+ + "\3\337\1\0\1\337\16\0\1\340\52\0\1\340\16\0"+ + "\3\11\1\0\1\11\110\0\10\12\2\341\1\12\1\341"+ + "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\341"+ + "\1\20\1\0\1\22\1\23\2\0\1\12\14\0\5\12"+ + "\1\341\1\12\1\341\1\12\1\341\2\12\1\23\7\12"+ + "\17\0\15\12\2\0\2\12\1\0\1\12\1\0\3\12"+ + "\3\0\1\12\2\0\1\12\14\0\20\12\1\342\3\12"+ + "\17\0\3\165\1\0\1\165\1\0\1\343\13\0\1\160"+ + "\1\0\1\161\31\0\1\160\35\0\17\170\1\0\10\170"+ + "\1\344\1\172\10\170\1\173\52\170\30\0\1\345\1\346"+ + "\5\0\1\347\1\0\1\347\1\173\7\0\1\173\42\0"+ + "\115\170\17\174\1\0\11\174\1\175\1\344\7\174\1\173"+ + "\167\174\31\0\1\346\1\350\4\0\1\347\1\0\1\347"+ + "\1\173\7\0\1\173\43\0\10\12\2\351\1\12\1\351"+ + "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\351"+ + "\1\200\1\0\1\201\1\12\2\0\1\12\14\0\5\12"+ + "\1\351\1\12\1\351\1\12\1\351\12\12\46\0\1\352"+ + "\116\0\1\353\63\0\15\12\2\0\2\12\1\0\1\12"+ + "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\2\12"+ + "\1\354\21\12\17\0\15\12\2\0\2\12\1\0\1\12"+ "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\3\12"+ - "\1\u011d\22\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\15\12"+ - "\1\u011e\10\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\u011f"+ - "\25\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\3\12\1\u0120"+ - "\22\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\6\12\1\u0121"+ - "\17\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\7\12\1\u0122"+ - "\16\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\13\12\1\u0123"+ - "\12\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\22\12\1\u0124"+ - "\3\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\1\u0125\25\12"+ - "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\2\0\1\12\14\0\3\12\1\u0126\22\12"+ - "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\2\0\1\12\14\0\12\12\1\u0127\13\12"+ - "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\2\0\1\12\14\0\7\12\1\u0128\16\12"+ - "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\2\0\1\12\14\0\12\12\1\u0129\13\12"+ - "\43\0\1\101\1\0\1\102\112\0\1\u0103\5\0\1\u0104"+ - "\1\0\1\u0104\1\256\7\0\1\256\44\0\25\u0102\1\u012a"+ - "\1\u012b\65\u0102\26\u0105\1\u012c\1\u012d\64\u0105\1\0\12\12"+ - "\2\0\2\12\1\0\1\12\1\0\3\12\1\105\1\0"+ - "\1\106\1\22\2\0\1\12\14\0\16\12\1\22\7\12"+ - "\16\0\25\u0108\1\u012e\1\u012f\65\u0108\26\u0109\1\u0130\1\u0131"+ - "\64\u0109\1\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\1\122\1\0\1\123\1\124\2\0\1\12\14\0"+ - "\16\12\1\124\7\12\16\0\25\u010d\1\u0132\1\u0133\65\u010d"+ - "\26\u010e\1\u0134\1\u0135\64\u010e\1\0\10\12\1\u0136\1\12"+ - "\2\0\2\12\1\0\1\12\1\0\1\12\2\u0136\1\312"+ - "\1\0\1\313\1\12\2\0\1\12\14\0\5\12\1\u0136"+ - "\1\12\1\u0136\1\12\1\u0136\3\12\1\u0136\10\12\43\0"+ - "\1\u0137\115\0\1\u0137\64\0\1\142\12\u0112\1\142\1\0"+ - "\2\u0112\1\142\1\u0112\1\142\3\u0112\1\0\1\320\1\0"+ - "\1\u0112\1\0\1\142\2\u0112\2\142\1\0\10\142\26\u0112"+ - "\16\142\25\336\1\u0138\1\u0139\201\336\142\341\1\u013a\1\u013b"+ - "\64\341\1\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\1\175\1\0\1\176\1\12\2\0\1\12\14\0"+ - "\26\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\5\12\1\u013c"+ - "\20\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\20\12\1\u013d"+ - "\5\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\4\12\1\u013e"+ - "\21\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\5\12\1\u013f"+ - "\20\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\10\12\1\u0140"+ - "\15\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\3\12\1\u0141"+ - "\22\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\14\12\1\u0142"+ - "\11\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\2\12\1\u0143"+ - "\23\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\5\12\1\u0144"+ - "\20\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\12\12\1\u0145"+ - "\13\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\2\12\1\u0146"+ - "\23\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\1\u0147\25\12"+ - "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\2\0\1\12\14\0\4\12\1\u0148\21\12"+ - "\16\0\25\u0102\1\u0149\1\u014a\201\u0102\142\u0105\1\u014b\1\u014c"+ - "\64\u0105\25\u0108\1\u014d\1\u012f\201\u0108\142\u0109\1\u0130\1\u014e"+ - "\64\u0109\25\u010d\1\u014f\1\u0133\201\u010d\142\u010e\1\u0134\1\u0150"+ - "\64\u010e\1\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\1\312\1\0\1\313\1\12\2\0\1\12\14\0"+ - "\26\12\16\0\25\336\1\u0151\1\u0139\65\336\26\341\1\u013a"+ - "\1\u0151\64\341\1\0\12\12\2\0\2\12\1\0\1\12"+ + "\1\355\20\12\17\0\15\12\2\0\2\12\1\0\1\12"+ "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\6\12"+ - "\1\u0152\17\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\6\12"+ - "\1\u0153\17\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\12"+ - "\1\u0154\24\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\12"+ - "\1\u0155\24\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\u0156"+ - "\25\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\6\12\1\u0157"+ - "\17\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\12\12\1\u0158"+ - "\13\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\12\12\1\u0159"+ - "\13\12\16\0\25\u0102\1\u015a\1\u014a\65\u0102\26\u0105\1\u014b"+ - "\1\u015a\64\u0105\25\u0108\1\u015b\1\u012f\65\u0108\26\u0109\1\u0130"+ - "\1\u015b\64\u0109\25\u010d\1\u015c\1\u0133\65\u010d\26\u010e\1\u0134"+ - "\1\u015c\64\u010e\26\0\1\u015d\5\0\1\u015e\1\0\1\u015e"+ - "\1\u015f\7\0\1\u015f\45\0\12\12\2\0\2\12\1\0"+ + "\1\356\15\12\17\0\12\12\1\357\2\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\14\12\1\360\7\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\3\12\1\361\7\12\1\362\10\12\17\0\15\12"+ + "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ + "\2\0\1\12\14\0\11\12\1\363\12\12\17\0\15\12"+ + "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ + "\2\0\1\12\14\0\13\12\1\364\10\12\17\0\15\12"+ + "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ + "\2\0\1\12\14\0\6\12\1\365\15\12\17\0\15\12"+ + "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ + "\2\0\1\12\14\0\17\12\1\366\4\12\17\0\10\12"+ + "\2\341\1\12\1\341\1\12\2\0\2\12\1\0\1\12"+ + "\1\0\1\12\2\341\1\20\1\0\1\22\1\23\2\0"+ + "\1\12\14\0\4\12\1\367\1\341\1\12\1\341\1\12"+ + "\1\341\2\12\1\23\7\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\1\370\23\12\17\0\15\12\2\0\2\12\1\0"+ "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+ - "\15\12\1\u0160\10\12\17\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\371\22\12\17\0\15\12\2\0\2\12\1\0"+ "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+ - "\21\12\1\u0161\4\12\17\0\12\12\2\0\2\12\1\0"+ + "\16\12\1\372\5\12\17\0\10\12\2\351\1\12\1\351"+ + "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\351"+ + "\1\200\1\0\1\201\1\12\2\0\1\12\14\0\5\12"+ + "\1\351\1\12\1\351\1\12\1\351\1\373\11\12\17\0"+ + "\15\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ + "\1\12\2\0\1\12\14\0\5\12\1\374\16\12\17\0"+ + "\15\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ + "\1\12\2\0\1\12\14\0\1\12\1\375\22\12\17\0"+ + "\15\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ + "\1\12\2\0\1\12\14\0\3\12\1\376\20\12\17\0"+ + "\15\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ + "\1\12\2\0\1\12\14\0\4\12\1\377\17\12\17\0"+ + "\15\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ + "\1\12\2\0\1\12\14\0\12\12\1\u0100\11\12\17\0"+ + "\15\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ + "\1\12\2\0\1\12\14\0\13\12\1\u0101\10\12\66\0"+ + "\1\u0102\114\0\1\u0103\114\0\1\u0104\114\0\1\u0105\55\0"+ + "\2\u0106\1\0\1\u0106\11\0\2\u0106\1\101\1\0\1\102"+ + "\25\0\1\u0106\1\0\1\u0106\1\0\1\u0106\30\0\17\255"+ + "\1\0\10\255\1\u0107\1\257\10\255\1\260\52\255\30\0"+ + "\1\u0108\1\u0109\5\0\1\u010a\1\0\1\u010a\1\260\7\0"+ + "\1\260\42\0\115\255\17\261\1\0\11\261\1\262\1\u0107"+ + "\7\261\1\260\167\261\31\0\1\u0109\1\u010b\4\0\1\u010a"+ + "\1\0\1\u010a\1\260\7\0\1\260\43\0\10\12\2\u010c"+ + "\1\12\1\u010c\1\12\2\0\2\12\1\0\1\12\1\0"+ + "\1\12\2\u010c\1\105\1\0\1\106\1\23\2\0\1\12"+ + "\14\0\5\12\1\u010c\1\12\1\u010c\1\12\1\u010c\2\12"+ + "\1\23\7\12\16\0\17\265\1\0\10\265\1\u010d\1\267"+ + "\10\265\1\0\52\265\30\0\1\u010e\64\0\115\265\17\270"+ + "\1\0\11\270\1\271\1\u010d\7\270\1\0\167\270\32\0"+ + "\1\u010f\62\0\17\273\1\0\22\273\1\275\52\273\16\0"+ + "\1\273\20\0\1\274\2\0\1\275\53\0\10\12\2\u010c"+ + "\1\12\1\u010c\1\12\2\0\2\12\1\0\1\12\1\0"+ + "\1\12\2\u010c\1\105\1\0\1\106\1\23\2\0\1\12"+ + "\14\0\4\12\1\367\1\u010c\1\12\1\u010c\1\12\1\u010c"+ + "\2\12\1\23\7\12\46\0\1\u0110\64\0\17\113\1\0"+ + "\10\113\1\0\1\277\1\0\1\113\1\302\5\113\1\0"+ + "\52\113\32\0\1\u0110\63\0\10\12\2\u0111\1\12\1\u0111"+ + "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\u0111"+ + "\1\122\1\0\1\123\1\124\2\0\1\12\14\0\5\12"+ + "\1\u0111\1\12\1\u0111\1\12\1\u0111\2\12\1\124\7\12"+ + "\16\0\17\305\1\0\10\305\1\u0112\1\307\10\305\1\0"+ + "\52\305\30\0\1\u0113\64\0\115\305\17\310\1\0\11\310"+ + "\1\311\1\u0112\7\310\1\0\167\310\32\0\1\u0114\63\0"+ + "\10\12\2\u0115\1\12\1\u0115\1\12\2\0\2\12\1\0"+ + "\1\12\1\0\1\12\2\u0115\1\314\1\0\1\315\1\12"+ + "\2\0\1\12\14\0\5\12\1\u0115\1\12\1\u0115\1\12"+ + "\1\u0115\12\12\46\0\1\u0116\116\0\1\u0117\62\0\17\316"+ + "\1\0\10\316\1\0\1\316\1\0\2\316\1\0\1\316"+ + "\1\0\1\316\2\0\4\316\2\0\44\316\1\0\10\12"+ + "\2\u0111\1\12\1\u0111\1\12\2\0\2\12\1\0\1\12"+ + "\1\0\1\12\2\u0111\1\122\1\0\1\123\1\124\2\0"+ + "\1\12\14\0\4\12\1\367\1\u0111\1\12\1\u0111\1\12"+ + "\1\u0111\2\12\1\124\7\12\17\0\10\12\2\u0115\1\12"+ + "\1\u0115\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ + "\2\u0115\1\314\1\0\1\315\1\12\2\0\1\12\14\0"+ + "\5\12\1\u0115\1\12\1\u0115\1\12\1\u0115\1\373\11\12"+ + "\16\0\17\142\1\0\10\142\1\0\1\322\1\0\1\142"+ + "\1\u0118\1\0\4\142\1\0\52\142\1\0\3\147\1\0"+ + "\1\147\110\0\5\325\1\0\1\326\1\0\1\325\1\154"+ + "\1\155\1\154\1\156\5\0\1\325\2\0\1\325\4\0"+ + "\1\325\17\0\1\325\1\0\1\325\1\0\1\325\2\0"+ + "\1\325\1\0\1\325\2\0\1\325\26\0\5\325\3\0"+ + "\1\325\11\0\1\325\2\0\1\325\4\0\1\325\17\0"+ + "\1\325\1\0\1\325\1\0\1\325\2\0\1\325\1\0"+ + "\1\325\2\0\1\325\26\0\1\327\1\0\1\327\1\0"+ + "\1\327\1\0\1\330\2\0\1\154\1\155\1\154\1\156"+ + "\100\0\1\327\1\0\1\327\1\0\1\327\110\0\1\331"+ + "\3\0\1\331\1\0\1\332\2\0\1\154\1\155\1\154"+ + "\1\156\100\0\1\331\3\0\1\331\122\0\1\335\116\0"+ + "\1\335\111\0\1\335\1\0\1\335\101\0\3\337\1\0"+ + "\1\337\1\0\1\340\15\0\1\161\70\0\3\337\1\0"+ + "\1\337\110\0\15\12\2\0\2\12\1\0\1\12\1\0"+ + "\3\12\1\20\1\0\1\22\1\23\2\0\1\12\14\0"+ + "\14\12\1\23\7\12\17\0\15\12\2\0\2\12\1\0"+ "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+ - "\4\12\1\u0162\21\12\16\0"; + "\7\12\1\u0119\14\12\47\0\1\346\5\0\1\347\1\0"+ + "\1\347\1\173\7\0\1\173\42\0\30\345\1\u011a\1\u011b"+ + "\63\345\31\350\1\u011c\1\u011d\62\350\1\0\10\12\2\u011e"+ + "\1\12\1\u011e\1\12\2\0\2\12\1\0\1\12\1\0"+ + "\1\12\2\u011e\1\200\1\0\1\201\1\12\2\0\1\12"+ + "\14\0\5\12\1\u011e\1\12\1\u011e\1\12\1\u011e\12\12"+ + "\46\0\1\u011f\116\0\1\u011f\63\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\4\12\1\u0120\17\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\4\12\1\u0121\17\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\14\12\1\u0122\7\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\4\12\1\u0123\17\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\3\12\1\u0124\20\12\17\0\11\12\1\u0125\3\12"+ + "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ + "\2\0\1\12\14\0\24\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\1\u0126\23\12\17\0\15\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+ + "\3\12\1\u0127\20\12\17\0\15\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+ + "\6\12\1\u0128\15\12\17\0\15\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+ + "\12\12\1\u0129\11\12\17\0\15\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+ + "\20\12\1\u012a\3\12\17\0\15\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+ + "\1\u012b\23\12\17\0\15\12\2\0\2\12\1\0\1\12"+ + "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\3\12"+ + "\1\u012c\20\12\17\0\12\12\1\u012d\2\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\24\12\17\0\15\12\2\0\2\12\1\0\1\12"+ + "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\7\12"+ + "\1\u012e\14\12\17\0\12\12\1\u012f\2\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\24\12\46\0\1\101\1\0\1\102\113\0\1\u0109"+ + "\5\0\1\u010a\1\0\1\u010a\1\260\7\0\1\260\42\0"+ + "\30\u0108\1\u0130\1\u0131\63\u0108\31\u010b\1\u0132\1\u0133\62\u010b"+ + "\1\0\15\12\2\0\2\12\1\0\1\12\1\0\3\12"+ + "\1\105\1\0\1\106\1\23\2\0\1\12\14\0\14\12"+ + "\1\23\7\12\16\0\30\u010e\1\u0134\1\u0135\63\u010e\31\u010f"+ + "\1\u0136\1\u0137\62\u010f\1\0\15\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\1\122\1\0\1\123\1\124\2\0"+ + "\1\12\14\0\14\12\1\124\7\12\16\0\30\u0113\1\u0138"+ + "\1\u0139\63\u0113\31\u0114\1\u013a\1\u013b\62\u0114\1\0\10\12"+ + "\2\u013c\1\12\1\u013c\1\12\2\0\2\12\1\0\1\12"+ + "\1\0\1\12\2\u013c\1\314\1\0\1\315\1\12\2\0"+ + "\1\12\14\0\5\12\1\u013c\1\12\1\u013c\1\12\1\u013c"+ + "\12\12\46\0\1\u013d\116\0\1\u013d\62\0\1\142\15\u0118"+ + "\1\142\1\0\2\u0118\1\142\1\u0118\1\142\3\u0118\1\0"+ + "\1\322\1\0\1\u0118\1\0\1\142\2\u0118\2\142\1\0"+ + "\10\142\24\u0118\16\142\1\0\15\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+ + "\2\12\1\u013e\21\12\16\0\30\345\1\u013f\1\u0140\200\345"+ + "\146\350\1\u0141\1\u0142\62\350\1\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\1\200\1\0\1\201\1\12"+ + "\2\0\1\12\14\0\24\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\5\12\1\u0143\16\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\16\12\1\u0144\5\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\4\12\1\u0145\17\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\5\12\1\u0146\16\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\10\12\1\u0147\13\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\3\12\1\u0148\20\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\13\12\1\u0149\10\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\5\12\1\u014a\16\12\17\0\12\12\1\u014b\2\12"+ + "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ + "\2\0\1\12\14\0\24\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\2\12\1\u014c\21\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\1\u014d\23\12\17\0\15\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+ + "\4\12\1\u014e\17\12\16\0\30\u0108\1\u014f\1\u0150\200\u0108"+ + "\146\u010b\1\u0151\1\u0152\62\u010b\30\u010e\1\u0153\1\u0135\200\u010e"+ + "\146\u010f\1\u0136\1\u0154\62\u010f\30\u0113\1\u0155\1\u0139\200\u0113"+ + "\146\u0114\1\u013a\1\u0156\62\u0114\1\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\1\314\1\0\1\315\1\12"+ + "\2\0\1\12\14\0\24\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\1\u0157\23\12\16\0\30\345\1\u0158\1\u0140\63\345"+ + "\31\350\1\u0141\1\u0158\62\350\1\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\6\12\1\u0159\15\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\6\12\1\u015a\15\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\1\12\1\u015b\22\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\1\12\1\u015c\22\12\17\0\15\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ + "\14\0\6\12\1\u015d\15\12\17\0\12\12\1\u015e\2\12"+ + "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ + "\2\0\1\12\14\0\24\12\17\0\12\12\1\u015f\2\12"+ + "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ + "\2\0\1\12\14\0\24\12\16\0\30\u0108\1\u0160\1\u0150"+ + "\63\u0108\31\u010b\1\u0151\1\u0160\62\u010b\30\u010e\1\u0161\1\u0135"+ + "\63\u010e\31\u010f\1\u0136\1\u0161\62\u010f\30\u0113\1\u0162\1\u0139"+ + "\63\u0113\31\u0114\1\u013a\1\u0162\62\u0114\31\0\1\u0163\5\0"+ + "\1\u0164\1\0\1\u0164\1\u0165\7\0\1\u0165\43\0\11\12"+ + "\1\u0166\3\12\2\0\2\12\1\0\1\12\1\0\3\12"+ + "\3\0\1\12\2\0\1\12\14\0\24\12\17\0\15\12"+ + "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ + "\2\0\1\12\14\0\17\12\1\u0167\4\12\17\0\15\12"+ + "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ + "\2\0\1\12\14\0\4\12\1\u0168\17\12\16\0"; private static int [] zzUnpackTrans() { - int [] result = new int[19076]; + int [] result = new int[19789]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -744,23 +749,23 @@ class _PythonLexer implements FlexLexerEx { private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final String ZZ_ATTRIBUTE_PACKED_0 = - "\6\0\1\11\10\1\1\11\2\1\3\11\1\1\6\11"+ - "\2\1\2\11\32\1\4\11\4\1\1\11\14\1\1\11"+ + "\6\0\1\11\11\1\1\11\2\1\3\11\1\1\6\11"+ + "\2\1\2\11\31\1\4\11\4\1\1\11\14\1\1\11"+ "\4\1\2\11\1\1\5\11\7\1\2\11\1\1\5\0"+ - "\1\11\1\1\1\0\1\11\1\0\2\1\2\11\3\1"+ - "\1\11\6\1\3\11\31\1\2\11\1\1\2\11\1\1"+ - "\5\11\1\1\2\11\1\1\1\0\3\1\1\11\12\1"+ - "\2\0\1\11\1\1\2\0\16\1\1\11\2\1\1\0"+ - "\1\1\1\0\1\1\1\0\1\1\1\0\1\1\1\0"+ - "\1\1\1\0\1\1\1\0\2\1\1\11\1\0\2\1"+ - "\2\0\27\1\4\11\1\0\2\1\1\11\1\0\2\1"+ - "\1\11\2\1\1\11\1\1\1\11\3\1\2\0\1\1"+ - "\1\0\2\1\1\0\1\1\1\11\21\1\1\0\2\1"+ - "\11\0\1\1\1\11\4\0\15\1\10\0\12\1\3\11"+ - "\1\0\1\11\3\1"; + "\4\1\1\0\1\11\1\0\3\1\2\11\3\1\1\11"+ + "\6\1\3\11\30\1\2\11\1\1\2\11\1\1\5\11"+ + "\1\1\2\11\1\1\1\0\3\1\1\11\12\1\2\0"+ + "\1\11\1\1\2\0\16\1\1\11\2\1\1\0\1\1"+ + "\1\0\1\1\1\0\1\1\1\0\1\1\1\0\2\1"+ + "\1\11\2\1\1\0\2\1\1\0\2\1\1\11\1\0"+ + "\2\1\2\0\26\1\4\11\1\0\2\1\1\11\1\0"+ + "\2\1\1\11\2\1\1\11\1\1\1\11\3\1\2\0"+ + "\2\1\1\0\2\1\1\0\1\1\1\11\20\1\1\0"+ + "\2\1\11\0\1\1\1\11\1\1\4\0\14\1\10\0"+ + "\12\1\3\11\1\0\1\11\3\1"; private static int [] zzUnpackAttribute() { - int [] result = new int[354]; + int [] result = new int[360]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -1641,22 +1646,22 @@ return PyTokenTypes.DOCSTRING; // fall through case 233: break; case 113: - { return PyTokenTypes.ASSERT_KEYWORD; + { return PyTokenTypes.LAMBDA_KEYWORD; } // fall through case 234: break; case 114: - { return PyTokenTypes.EXCEPT_KEYWORD; + { return PyTokenTypes.ASSERT_KEYWORD; } // fall through case 235: break; case 115: - { return PyTokenTypes.RETURN_KEYWORD; + { return PyTokenTypes.EXCEPT_KEYWORD; } // fall through case 236: break; case 116: - { return PyTokenTypes.LAMBDA_KEYWORD; + { return PyTokenTypes.RETURN_KEYWORD; } // fall through case 237: break; diff --git a/python/python-psi-impl/src/com/jetbrains/python/lexer/Python.flex b/python/python-psi-impl/src/com/jetbrains/python/lexer/Python.flex index 00ec89f230cf..b16e8328e433 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/lexer/Python.flex +++ b/python/python-psi-impl/src/com/jetbrains/python/lexer/Python.flex @@ -24,7 +24,8 @@ OCTINTEGER = 0[Oo]?("_"?{OCTDIGIT})+ BININTEGER = 0[Bb]("_"?{BINDIGIT})+ DECIMALINTEGER = (({NONZERODIGIT}("_"?{DIGIT})*)|0) INTEGER = {DECIMALINTEGER}|{OCTINTEGER}|{HEXINTEGER}|{BININTEGER} -LONGINTEGER = {INTEGER}[Ll] +INTEGER_SUFFIX = u|l|ll|U|L|LL|ul|ull|lu|llu|uL|Ul|UL|uLL|Ull|ULL|lU|Lu|LU|llU|LLu|LLU +LONGINTEGER = {INTEGER}{INTEGER_SUFFIX} END_OF_LINE_COMMENT="#"[^\r\n]* diff --git a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyNumericLiteralExpressionImpl.java b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyNumericLiteralExpressionImpl.java index 4e912bf823cb..2a0f749c1160 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyNumericLiteralExpressionImpl.java +++ b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyNumericLiteralExpressionImpl.java @@ -87,6 +87,12 @@ public class PyNumericLiteralExpressionImpl extends PyElementImpl implements PyN return getNode().getElementType() == PyElementTypes.INTEGER_LITERAL_EXPRESSION; } + @Nullable + @Override + public String getIntegerLiteralSuffix() { + return isIntegerLiteral() ? StringUtil.nullize(retrieveSuffix(getText())) : null; + } + @Override @Nullable public PyType getType(@NotNull TypeEvalContext context, @NotNull TypeEvalContext.Key key) { @@ -107,7 +113,7 @@ public class PyNumericLiteralExpressionImpl extends PyElementImpl implements PyN @Nullable private static BigInteger getBigIntegerValue(@NotNull String text) { - if (text.equals("0") || text.equalsIgnoreCase("0l")) { + if (text.equalsIgnoreCase("0" + retrieveSuffix(text))) { return BigInteger.ZERO; } @@ -141,9 +147,18 @@ public class PyNumericLiteralExpressionImpl extends PyElementImpl implements PyN @NotNull private static String prepareLiteralForJava(@NotNull String text, int beginIndex) { - final int endIndex = - StringUtil.endsWithIgnoreCase(text, "l") || StringUtil.endsWithIgnoreCase(text, "j") ? text.length() - 1 : text.length(); - + int endIndex = text.length() - retrieveSuffix(text).length(); return text.substring(beginIndex, endIndex).replaceAll("_", ""); } + + @NotNull + private static String retrieveSuffix(@NotNull String text) { + int lastIndex = text.length(); + while (lastIndex > 0) { + char last = text.charAt(lastIndex - 1); + if (last != 'u' && last != 'U' && last != 'l' && last != 'L' && last != 'j' && last != 'J') break; + --lastIndex; + } + return text.substring(lastIndex); + } } diff --git a/python/src/com/jetbrains/python/inspections/quickfix/RemoveTrailingLQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/RemoveTrailingSuffixQuickFix.java similarity index 71% rename from python/src/com/jetbrains/python/inspections/quickfix/RemoveTrailingLQuickFix.java rename to python/src/com/jetbrains/python/inspections/quickfix/RemoveTrailingSuffixQuickFix.java index 17b8061cec97..38b355d3fcef 100644 --- a/python/src/com/jetbrains/python/inspections/quickfix/RemoveTrailingLQuickFix.java +++ b/python/src/com/jetbrains/python/inspections/quickfix/RemoveTrailingSuffixQuickFix.java @@ -29,21 +29,25 @@ import org.jetbrains.annotations.NotNull; * Created by IntelliJ IDEA. * Author: Alexey.Ivanov */ -public class RemoveTrailingLQuickFix implements LocalQuickFix { +public class RemoveTrailingSuffixQuickFix implements LocalQuickFix { + @NotNull @Override public String getFamilyName() { - return PyBundle.message("INTN.remove.trailing.l"); + return PyBundle.message("INTN.remove.trailing.suffix"); } @Override public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { PsiElement numericLiteralExpression = descriptor.getPsiElement(); if (numericLiteralExpression instanceof PyNumericLiteralExpression) { - PyElementGenerator elementGenerator = PyElementGenerator.getInstance(project); - String text = numericLiteralExpression.getText(); - final LanguageLevel level = LanguageLevel.forElement(numericLiteralExpression); - numericLiteralExpression.replace(elementGenerator.createExpressionFromText(level, text.substring(0, text.length() - 1))); + PyNumericLiteralExpression numeric = (PyNumericLiteralExpression)numericLiteralExpression; + String suffix = numeric.getIntegerLiteralSuffix(); + if (suffix == null) return; + String text = numeric.getText(); + String newText = text.substring(0, text.length() - suffix.length()); + numeric.replace( + PyElementGenerator.getInstance(project).createExpressionFromText(LanguageLevel.forElement(numeric), newText)); } } } diff --git a/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java b/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java index 71c8ae5e9c5e..f98d50cdbed5 100644 --- a/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java +++ b/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java @@ -216,11 +216,12 @@ public abstract class CompatibilityVisitor extends PyAnnotator { final String text = node.getText(); if (node.isIntegerLiteral()) { - if (text.endsWith("l") || text.endsWith("L")) { + String suffix = node.getIntegerLiteralSuffix(); + if ("l".equalsIgnoreCase(suffix)) { registerForAllMatchingVersions(level -> level.isPy3K() && registerForLanguageLevel(level), - " not support a trailing \'l\' or \'L\'.", + " not support a trailing '" + suffix + "'.", node, - new RemoveTrailingLQuickFix()); + new RemoveTrailingSuffixQuickFix()); } if (text.length() > 1 && text.charAt(0) == '0') { diff --git a/python/src/com/jetbrains/python/validation/PyHighlightingAnnotator.java b/python/src/com/jetbrains/python/validation/PyHighlightingAnnotator.java index 080104a111c7..1c1432841477 100644 --- a/python/src/com/jetbrains/python/validation/PyHighlightingAnnotator.java +++ b/python/src/com/jetbrains/python/validation/PyHighlightingAnnotator.java @@ -23,6 +23,7 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.tree.TokenSet; import com.jetbrains.python.PyBundle; import com.jetbrains.python.PyTokenTypes; +import com.jetbrains.python.PythonLanguage; import com.jetbrains.python.highlighting.PyHighlighter; import com.jetbrains.python.psi.*; import org.jetbrains.annotations.NotNull; @@ -49,6 +50,15 @@ public class PyHighlightingAnnotator extends PyAnnotator implements HighlightRan } } + @Override + public void visitPyNumericLiteralExpression(PyNumericLiteralExpression node) { + String suffix = node.getIntegerLiteralSuffix(); + if (suffix == null || "l".equalsIgnoreCase(suffix)) return; + if (node.getContainingFile().getLanguage() != PythonLanguage.getInstance()) return; + getHolder().newAnnotation(HighlightSeverity.ERROR, PyBundle.message("INSP.python.trailing.suffix.not.support", suffix)) + .range(node).create(); + } + @Override public void visitPyForStatement(PyForStatement node) { highlightKeyword(node, PyTokenTypes.ASYNC_KEYWORD); diff --git a/python/testData/highlighting/implicitOctLongInteger.py b/python/testData/highlighting/implicitOctLongInteger.py index e581d3f59128..5466dfd85add 100644 --- a/python/testData/highlighting/implicitOctLongInteger.py +++ b/python/testData/highlighting/implicitOctLongInteger.py @@ -1 +1 @@ -01234L \ No newline at end of file +01234L \ No newline at end of file diff --git a/python/testData/highlighting/unsupportedFeaturesInPython3.py b/python/testData/highlighting/unsupportedFeaturesInPython3.py index fb471df41212..b04973039ef7 100644 --- a/python/testData/highlighting/unsupportedFeaturesInPython3.py +++ b/python/testData/highlighting/unsupportedFeaturesInPython3.py @@ -1,8 +1,13 @@ print(a <> 3) `foo()` -a = 123l +a = 123l a = 043 a = 0X43 +a = 0X43 +a = 0x43 +a = 0O43 +a = 0o43 +a = 0B1 a = 0b1 a = 0.0 s = u"text" diff --git a/python/testData/inspections/PyCompatibilityInspection/numericLiteralExpression.py b/python/testData/inspections/PyCompatibilityInspection/numericLiteralExpression.py index 9481e754892a..1c479ce23370 100644 --- a/python/testData/inspections/PyCompatibilityInspection/numericLiteralExpression.py +++ b/python/testData/inspections/PyCompatibilityInspection/numericLiteralExpression.py @@ -1,2 +1,23 @@ -a = 12l -v = 048 \ No newline at end of file +a = 12u +b = 12l +c = 12ll +d = 12U +e = 12L +f = 12LL +g = 0x12ful +h = 0X12fuL +i = 12Ul +j = 12UL +k = 0o12ull +l = 0O12uLL +m = 0b1Ull +n = 0B1ULL +o = 12lu +p = 12lU +q = 12Lu +r = 12LU +s = 12llu +t = 12llU +u = 12LLu +v = 12LLU +w = 048 \ No newline at end of file diff --git a/python/testData/quickFixes/PyRemoveTrailingSuffixQuickFixTest/fixl.py b/python/testData/quickFixes/PyRemoveTrailingSuffixQuickFixTest/fixl.py new file mode 100644 index 000000000000..f61ec245ccb7 --- /dev/null +++ b/python/testData/quickFixes/PyRemoveTrailingSuffixQuickFixTest/fixl.py @@ -0,0 +1 @@ +1000l \ No newline at end of file diff --git a/python/testData/quickFixes/PyRemoveTrailingSuffixQuickFixTest/fixl_after.py b/python/testData/quickFixes/PyRemoveTrailingSuffixQuickFixTest/fixl_after.py new file mode 100644 index 000000000000..e37d32abba42 --- /dev/null +++ b/python/testData/quickFixes/PyRemoveTrailingSuffixQuickFixTest/fixl_after.py @@ -0,0 +1 @@ +1000 \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyNumericLiteralTest.java b/python/testSrc/com/jetbrains/python/PyNumericLiteralTest.java index e8fd29363680..7fd71f9c6691 100644 --- a/python/testSrc/com/jetbrains/python/PyNumericLiteralTest.java +++ b/python/testSrc/com/jetbrains/python/PyNumericLiteralTest.java @@ -369,6 +369,33 @@ public class PyNumericLiteralTest extends PyTestCase { doTestMoreThanLongComplexLiteral("9_22_337_2036_85477_5808J", expectedInt2, new BigDecimal("9223372036854775808")); } + // PY-14844 + public void testIntegerLiteralSuffix() { + doTestSuffix("1000", "u"); + doTestSuffix("1000", "l"); + doTestSuffix("1000", "ll"); + doTestSuffix("1000", "U"); + doTestSuffix("1000", "L"); + doTestSuffix("1000", "LL"); + doTestSuffix("1000", "ul"); + doTestSuffix("1000", "Ul"); + doTestSuffix("1000", "uL"); + doTestSuffix("1000", "UL"); + doTestSuffix("1000", "lu"); + doTestSuffix("1000", "Lu"); + doTestSuffix("1000", "lU"); + doTestSuffix("1000", "LU"); + doTestSuffix("1000", "ull"); + doTestSuffix("1000", "Ull"); + doTestSuffix("1000", "uLL"); + doTestSuffix("1000", "ULL"); + doTestSuffix("1000", "llu"); + doTestSuffix("1000", "LLu"); + doTestSuffix("1000", "llU"); + doTestSuffix("1000", "LLU"); + doTestSuffix("1000", null); + } + private void doTestIntegerLiteral(@NotNull String text, int expected) { doTestLiteral(text, true, Long.valueOf(expected), BigInteger.valueOf(expected), BigDecimal.valueOf(expected), "int"); } @@ -411,6 +438,11 @@ public class PyNumericLiteralTest extends PyTestCase { assertEquals(expectedType, type.getName()); } + private void doTestSuffix(@NotNull String text, @Nullable String suffix) { + final PyNumericLiteralExpression literal = configureByText(text + (suffix == null ? "" : suffix)); + assertEquals(suffix, literal.getIntegerLiteralSuffix()); + } + @NotNull private PyNumericLiteralExpression configureByText(@NotNull String text) { final PsiElement element = myFixture.configureByText(PythonFileType.INSTANCE, text).findElementAt(0); diff --git a/python/testSrc/com/jetbrains/python/PyQuickFixTestCase.java b/python/testSrc/com/jetbrains/python/PyQuickFixTestCase.java index e533bc0891d3..4368f3ed6ad6 100644 --- a/python/testSrc/com/jetbrains/python/PyQuickFixTestCase.java +++ b/python/testSrc/com/jetbrains/python/PyQuickFixTestCase.java @@ -37,6 +37,20 @@ public abstract class PyQuickFixTestCase extends PyTestCase { myFixture.checkResultByFile(testFileName + "_after.py", true); } + protected void doQuickFixTest(final String hint, LanguageLevel languageLevel) { + runWithLanguageLevel(languageLevel, () -> doQuickFixTest(hint)); + } + + protected void doQuickFixTest(final String hint) { + String testName = getTestName(true); + myFixture.configureByFile(testName + ".py"); + myFixture.checkHighlighting(true, false, false); + final IntentionAction intentionAction = myFixture.findSingleIntention(hint); + assertNotNull(intentionAction); + myFixture.launchAction(intentionAction); + myFixture.checkResultByFile(testName + "_after.py"); + } + protected void doInspectionTest(final Class inspectionClass) { final String testFileName = getTestName(true); myFixture.enableInspections(inspectionClass); diff --git a/python/testSrc/com/jetbrains/python/intentions/PyIntentionTest.java b/python/testSrc/com/jetbrains/python/intentions/PyIntentionTest.java index 3fed825cbb61..eb1445aca559 100644 --- a/python/testSrc/com/jetbrains/python/intentions/PyIntentionTest.java +++ b/python/testSrc/com/jetbrains/python/intentions/PyIntentionTest.java @@ -93,7 +93,7 @@ public class PyIntentionTest extends PyTestCase { // PY-18972 public void testRemoveTrailingL() { - doTest(PyBundle.message("INTN.remove.trailing.l"), LanguageLevel.PYTHON34); + doTest(PyBundle.message("INTN.remove.trailing.suffix"), LanguageLevel.PYTHON34); } public void testReplaceOctalNumericLiteral() { diff --git a/python/testSrc/com/jetbrains/python/quickFixes/PyRemoveTrailingSuffixQuickFixTest.java b/python/testSrc/com/jetbrains/python/quickFixes/PyRemoveTrailingSuffixQuickFixTest.java new file mode 100644 index 000000000000..690dd8ae858c --- /dev/null +++ b/python/testSrc/com/jetbrains/python/quickFixes/PyRemoveTrailingSuffixQuickFixTest.java @@ -0,0 +1,31 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.jetbrains.python.quickFixes; + +import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl; +import com.jetbrains.python.PyBundle; +import com.jetbrains.python.PyQuickFixTestCase; +import com.jetbrains.python.psi.LanguageLevel; + +import java.util.ListResourceBundle; + +public class PyRemoveTrailingSuffixQuickFixTest extends PyQuickFixTestCase { + + private static final ListResourceBundle MESSAGE_BUNDLE = new ListResourceBundle() { + @Override + protected Object[][] getContents() { + return new Object[][] { + new Object[] { "bad-trail", "Python version " + LanguageLevel.getLatest() + " does not support a trailing ''{0}''." } + }; + } + }; + + @Override + public void setUp() throws Exception { + super.setUp(); + ((CodeInsightTestFixtureImpl)myFixture).setMessageBundles(MESSAGE_BUNDLE); + } + + public void testFixl() { + doQuickFixTest(PyBundle.message("INTN.remove.trailing.suffix"), LanguageLevel.getLatest()); + } +}