From 7a208a9e558a57b4e00b3498ec2b93fcc3c9e885 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Sun, 28 Jul 2024 18:59:44 +0300 Subject: [PATCH 01/43] include php blade plugin in php cluster --- nbbuild/cluster.properties | 1 + php/php.api.editor/nbproject/project.xml | 1 + php/php.api.framework/nbproject/project.xml | 2 + php/php.api.phpmodule/nbproject/project.xml | 3 + php/php.blade/build.xml | 52 + php/php.blade/manifest.mf | 7 + php/php.blade/nbproject/project.properties | 20 + php/php.blade/nbproject/project.xml | 446 ++ .../php/blade/csl/elements/ClassElement.java | 51 + .../blade/csl/elements/DirectiveElement.java | 38 + .../php/blade/csl/elements/ElementType.java | 39 + .../php/blade/csl/elements/NamedElement.java | 112 + .../php/blade/csl/elements/PathElement.java | 38 + .../csl/elements/PhpFunctionElement.java | 69 + .../php/blade/csl/elements/TagElement.java | 88 + .../php/blade/editor/BladeBracesMatcher.java | 288 + .../php/blade/editor/BladeCommentHandler.java | 116 + .../blade/editor/BladeDeclarationFinder.java | 463 ++ .../php/blade/editor/BladeLanguage.java | 237 + .../blade/editor/BladeSemanticAnalyzer.java | 106 + .../php/blade/editor/EditorStringUtils.java | 64 + .../blade/editor/HyperlinkProviderImpl.java | 208 + .../php/blade/editor/ResourceUtilities.java | 35 + .../editor/actions/AntlrDebugAction.java | 199 + .../php/blade/editor/actions/FindUsage.java | 61 + .../ViewAntlrColoringTokensAction.java | 162 + .../ViewAntlrFormatterTokensAction.java | 193 + .../actions/ViewAntlrLexerTokensAction.java | 178 + .../php/blade/editor/cache/QueryCache.java | 111 + .../completion/BladeCompletionHandler.java | 338 + .../completion/BladeCompletionItem.java | 381 + .../completion/BladeCompletionProposal.java | 469 ++ .../completion/BladeCompletionProvider.java | 305 + .../BladePhpCompletionProvider.java | 383 + .../DirectiveCompletionBuilder.java | 66 + .../completion/DirectiveCompletionList.java | 30 + .../completion/PhpCodeCompletionContext.java | 68 + .../completion/PhpCodeCompletionService.java | 323 + .../blade/editor/completion/TooltipDoc.java | 61 + .../AttributeCompletionService.java | 53 + .../editor/components/ComponentElement.java | 34 + .../editor/components/ComponentModel.java | 51 + .../ComponentsCompletionService.java | 67 + .../components/annotation/Attribute.java | 27 + .../annotation/AttributeRegister.java | 34 + .../components/annotation/Namespace.java | 32 + .../annotation/NamespaceRegister.java | 34 + .../ComponentDeclarationService.java | 81 + .../VitePathDeclarationService.java | 38 + .../editor/directives/CustomDirectives.java | 302 + .../embedding/BladeHtmlEmbeddingProvider.java | 101 + .../embedding/BladePhpEmbeddingProvider.java | 93 + .../blade/editor/format/BladeFormatter.java | 142 + .../editor/format/BladeFormatterService.java | 278 + .../php/blade/editor/format/FormatToken.java | 50 + .../BladeHighlightsContainer.java | 65 + .../BladeHighlightsLayerFactory.java | 27 + .../editor/hints/BladeHintsProvider.java | 237 + .../editor/hints/HintsControllerFactory.java | 47 + .../blade/editor/hints/UnknownDirective.java | 87 + .../php/blade/editor/indexing/BladeIndex.java | 307 + .../blade/editor/indexing/BladeIndexer.java | 295 + .../blade/editor/indexing/IndexManager.java | 84 + .../indexing/PhpIndexFunctionResult.java | 56 + .../blade/editor/indexing/PhpIndexResult.java | 64 + .../blade/editor/indexing/PhpIndexUtils.java | 812 +++ .../php/blade/editor/indexing/QueryUtils.java | 76 + .../php/blade/editor/lexer/BladeLexer.java | 103 + .../blade/editor/lexer/BladeLexerUtils.java | 77 + .../php/blade/editor/lexer/BladeTokenId.java | 119 + .../php/blade/editor/lexer/EditorUtils.java | 71 + .../editor/navigator/BladeStructureItem.java | 218 + .../navigator/BladeStructureScanner.java | 53 + .../php/blade/editor/parser/BladeParser.java | 85 + .../editor/parser/BladeParserResult.java | 995 +++ .../php/blade/editor/parser/ParsingUtils.java | 374 + .../php/blade/editor/path/BladePathUtils.java | 318 + .../preferences/GeneralPreferencesUtils.java | 83 + .../editor/preferences/ModulePreferences.java | 42 + .../editor/refactoring/BladePathInfo.java | 73 + .../editor/refactoring/BladePathUsage.java | 203 + .../RefactoringActionsProvider.java | 175 + .../WhereBladePathUsedRefactoringUIImpl.java | 91 + .../BladeTypedTextInterceptor.java | 175 + .../editor/ui/customizer/BladeDirectives.form | 140 + .../editor/ui/customizer/BladeDirectives.java | 196 + .../BladeDirectivesCustomizerProvider.java | 67 + .../ui/customizer/BladeGeneralSettings.form | 66 + .../ui/customizer/BladeGeneralSettings.java | 98 + .../BladeOptionsCustomizerProvider.java | 65 + .../BladeSettingsCustomizerProvider.java | 105 + .../ui/customizer/BladeViewsFoldersPanel.form | 169 + .../ui/customizer/BladeViewsFoldersPanel.java | 233 + .../editor/ui/customizer/Bundle.properties | 50 + .../editor/ui/customizer/UiOptionsUtils.java | 40 + .../ui/wizard/NewFileWizardIterator.java | 137 + .../blade/project/BladeProjectProperties.java | 188 + .../blade/project/BladeProjectSupport.java | 74 + .../php/blade/project/Bundle.properties | 21 + .../php/blade/project/ComponentsSupport.java | 90 + .../php/blade/project/ProjectUtils.java | 50 + .../php/blade/resources/Bundle.properties | 18 + .../resources/FlatLafDark-FlatLafDark.xml | 34 + .../php/blade/resources/FontAndColors.xml | 34 + .../resources/NewBladeFileDescription.html | 12 + .../blade/resources/emptyBladeFile.blade.php | 0 .../resources/formattingExample.blade.php | 16 + .../blade/resources/highlightBlade.blade.php | 16 + .../modules/php/blade/resources/icon.png | Bin 0 -> 973 bytes .../modules/php/blade/resources/icons/at.png | Bin 0 -> 3228 bytes .../modules/php/blade/resources/icons/at2.png | Bin 0 -> 1212 bytes .../modules/php/blade/resources/icons/at4.png | Bin 0 -> 3264 bytes .../php/blade/resources/icons/file.png | Bin 0 -> 973 bytes .../php/blade/resources/icons/icon.png | Bin 0 -> 973 bytes .../blade/resources/icons/laravel_badge.png | Bin 0 -> 723 bytes .../php/blade/resources/icons/layout.png | Bin 0 -> 2393 bytes .../modules/php/blade/resources/layer.xml | 87 + .../php/blade/resources/mime-resolver.xml | 10 + .../php/blade/resources/preferences.xml | 29 + .../blade/syntax/BladeDirectivesUtils.java | 70 + .../modules/php/blade/syntax/BladeTags.java | 39 + .../php/blade/syntax/BladeTagsUtils.java | 34 + .../php/blade/syntax/DirectivesList.java | 122 + .../modules/php/blade/syntax/StringUtils.java | 60 + .../blade/syntax/annotation/Directive.java | 15 + .../syntax/annotation/DirectiveRegister.java | 16 + .../php/blade/syntax/annotation/Tag.java | 12 + .../blade/syntax/annotation/TagRegister.java | 16 + .../formatter/BladeAntlrFormatterLexer.g4 | 177 + .../formatter/BladeAntlrFormatterLexer.java | 1129 +++ .../formatter/BladeAntlrFormatterParser.g4 | 72 + .../formatter/BladeAntlrFormatterParser.java | 1683 +++++ ...BladeAntlrFormatterParserBaseListener.java | 282 + .../BladeAntlrFormatterParserListener.java | 212 + .../syntax/antlr4/formatter/LexerAdaptor.java | 81 + .../antlr4/v10/BladeAntlrColoringLexer.g4 | 264 + .../antlr4/v10/BladeAntlrColoringLexer.java | 1765 +++++ .../syntax/antlr4/v10/BladeAntlrLexer.g4 | 473 ++ .../syntax/antlr4/v10/BladeAntlrLexer.java | 2583 +++++++ .../syntax/antlr4/v10/BladeAntlrParser.g4 | 217 + .../syntax/antlr4/v10/BladeAntlrParser.java | 6250 +++++++++++++++++ .../v10/BladeAntlrParserBaseListener.java | 878 +++ .../antlr4/v10/BladeAntlrParserListener.java | 710 ++ .../syntax/antlr4/v10/BladeAntlrUtils.java | 303 + .../antlr4/v10/BladeColoringCommonLexer.g4 | 79 + .../syntax/antlr4/v10/BladeCommonLexer.g4 | 79 + .../antlr4/v10/ColoringLexerAdaptor.java | 138 + .../blade/syntax/antlr4/v10/LexerAdaptor.java | 144 + .../blade/ui/options/BladeOptionsPanel.form | 57 + .../blade/ui/options/BladeOptionsPanel.java | 94 + .../options/BladeOptionsPanelController.java | 93 + .../php/blade/ui/options/Bundle.properties | 3 + .../issues/issue61/issue61.blade.php | 6 + .../smoke/content_tag.blade.php | 1 + .../smoke/escaped_tag.blade.php | 3 + .../coloring_lexer/smoke/fragment.blade.php | 7 + .../coloring_lexer/smoke/raw_tag.blade.php | 1 + .../BladeAntlrColoringLexerTestBase.java | 107 + .../antlr4/BladeAntlrLexerTestBase.java | 111 + .../antlr4/BladeAntlrParserTestBase.java | 92 + .../antlr4/BladeAntrlColoringLexerTest.java | 20 + .../syntax/antlr4/BladeAntrlLexerTest.java | 16 + .../syntax/antlr4/BladeAntrlParserTest.java | 15 + .../blade/syntax/antlr4/BladeBaseTest.java | 51 + .../php/blade/syntax/antlr4/BladeUtils.java | 55 + php/php.editor/nbproject/project.xml | 2 + 166 files changed, 33323 insertions(+) create mode 100644 php/php.blade/build.xml create mode 100644 php/php.blade/manifest.mf create mode 100644 php/php.blade/nbproject/project.properties create mode 100644 php/php.blade/nbproject/project.xml create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/DirectiveElement.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ElementType.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PathElement.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeSemanticAnalyzer.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/AntlrDebugAction.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/FindUsage.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrColoringTokensAction.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrFormatterTokensAction.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrLexerTokensAction.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionBuilder.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionList.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionContext.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/TooltipDoc.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentElement.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentModel.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Attribute.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/AttributeRegister.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/NamespaceRegister.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/VitePathDeclarationService.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProvider.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatter.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterService.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/format/FormatToken.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsContainer.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsLayerFactory.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/HintsControllerFactory.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/UnknownDirective.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndex.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndexer.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/IndexManager.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexFunctionResult.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexResult.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexer.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/EditorUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureItem.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureScanner.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/GeneralPreferencesUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/ModulePreferences.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathInfo.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathUsage.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/RefactoringActionsProvider.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/WhereBladePathUsedRefactoringUIImpl.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.form create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectivesCustomizerProvider.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.form create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeOptionsCustomizerProvider.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeSettingsCustomizerProvider.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.form create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/Bundle.properties create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UiOptionsUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/wizard/NewFileWizardIterator.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectSupport.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/project/Bundle.properties create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/Bundle.properties create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/FlatLafDark-FlatLafDark.xml create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/FontAndColors.xml create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/NewBladeFileDescription.html create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/emptyBladeFile.blade.php create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/formattingExample.blade.php create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/highlightBlade.blade.php create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icon.png create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/at.png create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/at2.png create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/at4.png create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/file.png create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/icon.png create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/laravel_badge.png create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/layout.png create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/layer.xml create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/mime-resolver.xml create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/preferences.xml create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTags.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTagsUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/DirectivesList.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Directive.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/DirectiveRegister.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Tag.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/TagRegister.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.g4 create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.g4 create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserBaseListener.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserListener.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/LexerAdaptor.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserBaseListener.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserListener.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.form create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/ui/options/Bundle.properties create mode 100644 php/php.blade/test/unit/src/data/testfiles/coloring_lexer/issues/issue61/issue61.blade.php create mode 100644 php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/content_tag.blade.php create mode 100644 php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/escaped_tag.blade.php create mode 100644 php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/fragment.blade.php create mode 100644 php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/raw_tag.blade.php create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java diff --git a/nbbuild/cluster.properties b/nbbuild/cluster.properties index bbd52bc8c877..b458e00e2da9 100644 --- a/nbbuild/cluster.properties +++ b/nbbuild/cluster.properties @@ -933,6 +933,7 @@ nb.cluster.php=\ php.api.testing,\ php.apigen,\ php.atoum,\ + php.blade,\ php.code.analysis,\ php.codeception,\ php.composer,\ diff --git a/php/php.api.editor/nbproject/project.xml b/php/php.api.editor/nbproject/project.xml index bd14af04a19d..db2c8ae3d2c5 100644 --- a/php/php.api.editor/nbproject/project.xml +++ b/php/php.api.editor/nbproject/project.xml @@ -75,6 +75,7 @@ org.nbphpcouncil.modules.php.yii2 org.netbeans.modules.php.api.framework org.netbeans.modules.php.api.testing + org.netbeans.modules.php.blade org.netbeans.modules.php.atoum org.netbeans.modules.php.cake3 org.netbeans.modules.php.codeception diff --git a/php/php.api.framework/nbproject/project.xml b/php/php.api.framework/nbproject/project.xml index 8a6164e1c807..4cb2d522126e 100644 --- a/php/php.api.framework/nbproject/project.xml +++ b/php/php.api.framework/nbproject/project.xml @@ -163,9 +163,11 @@ org.nbphpcouncil.modules.php.laravel4 org.nbphpcouncil.modules.php.yii org.nbphpcouncil.modules.php.yii2 + org.netbeans.modules.php.blade org.netbeans.modules.php.cake3 org.netbeans.modules.php.doctrine2 org.netbeans.modules.php.fuel + org.netbeans.modules.php.laravel org.netbeans.modules.php.nette2 org.netbeans.modules.php.project org.netbeans.modules.php.smarty diff --git a/php/php.api.phpmodule/nbproject/project.xml b/php/php.api.phpmodule/nbproject/project.xml index 09738895b338..06e9293ecbca 100644 --- a/php/php.api.phpmodule/nbproject/project.xml +++ b/php/php.api.phpmodule/nbproject/project.xml @@ -226,6 +226,7 @@ org.cakephp.netbeans + org.netbeans.modules.php.blade org.nbphpcouncil.modules.php.ci org.nbphpcouncil.modules.php.laravel4 org.nbphpcouncil.modules.php.yii @@ -239,6 +240,7 @@ org.netbeans.modules.php.api.testing org.netbeans.modules.php.apigen org.netbeans.modules.php.atoum + org.netbeans.modules.php.blade org.netbeans.modules.php.cake3 org.netbeans.modules.php.code.analysis org.netbeans.modules.php.codeception @@ -247,6 +249,7 @@ org.netbeans.modules.php.doctrine2 org.netbeans.modules.php.editor org.netbeans.modules.php.fuel + org.netbeans.modules.php.laravel org.netbeans.modules.php.nette org.netbeans.modules.php.nette.tester org.netbeans.modules.php.nette2 diff --git a/php/php.blade/build.xml b/php/php.blade/build.xml new file mode 100644 index 000000000000..2b4b2d193870 --- /dev/null +++ b/php/php.blade/build.xml @@ -0,0 +1,52 @@ + + + + Builds, tests, and runs the project org.netbeans.modules.php.blade + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/php/php.blade/manifest.mf b/php/php.blade/manifest.mf new file mode 100644 index 000000000000..61a6406d6cd8 --- /dev/null +++ b/php/php.blade/manifest.mf @@ -0,0 +1,7 @@ +Manifest-Version: 1.0 +AutoUpdate-Show-In-Client: true +OpenIDE-Module: org.netbeans.modules.php.blade/1 +OpenIDE-Module-Layer: org/netbeans/modules/php/blade/resources/layer.xml +OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/php/blade/resources/Bundle.properties +OpenIDE-Module-Specification-Version: 1.00 + diff --git a/php/php.blade/nbproject/project.properties b/php/php.blade/nbproject/project.properties new file mode 100644 index 000000000000..a18d0ebbe0ed --- /dev/null +++ b/php/php.blade/nbproject/project.properties @@ -0,0 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +javac.source=1.8 +javac.compilerargs=-Xlint -Xlint:-serial +spec.version.base.fatal.warning=false diff --git a/php/php.blade/nbproject/project.xml b/php/php.blade/nbproject/project.xml new file mode 100644 index 000000000000..5192db4365eb --- /dev/null +++ b/php/php.blade/nbproject/project.xml @@ -0,0 +1,446 @@ + + + + org.netbeans.modules.apisupport.project + + + org.netbeans.modules.php.blade + + + org.apache.commons.lang3 + + + + 3.12.0 + + + + org.netbeans.api.annotations.common + + + + 1 + 1.48 + + + + org.netbeans.api.templates + + + + 1.28 + + + + org.netbeans.core.multiview + + + + 1 + 1.64 + + + + org.netbeans.libs.antlr4.runtime + + + + 2 + 1.21.0.1 + + + + org.netbeans.modules.csl.api + + + + 2 + 2.78.0.2.1.1.8.1 + + + + org.netbeans.modules.csl.types + + + + 1 + 1.20 + + + + org.netbeans.modules.editor + + + + 3 + 1.107.0.6.3.23.55 + + + + org.netbeans.modules.editor.bracesmatching + + + + 0 + 1.59.0.55 + + + + org.netbeans.modules.editor.codetemplates + + + + 1 + 1.64.0.1 + + + + org.netbeans.modules.editor.completion + + + + 1 + 1.65.0.2 + + + + org.netbeans.modules.editor.document + + + + 1.29.0.3 + + + + org.netbeans.modules.editor.indent + + + + 2 + 1.63 + + + + org.netbeans.modules.editor.lib + + + + 3 + 4.27.0.23.3.55 + + + + org.netbeans.modules.editor.lib2 + + + + 1 + 2.40.0.55.3 + + + + org.netbeans.modules.editor.mimelookup + + + + 1 + 1.60 + + + + org.netbeans.modules.editor.settings + + + + 1 + 1.77 + + + + org.netbeans.modules.editor.util + + + + 1 + 1.85 + + + + org.netbeans.modules.html.lexer + + + + 1 + 1.58 + + + + org.netbeans.modules.lexer + + + + 2 + 1.83.0.1 + + + + org.netbeans.modules.lexer.antlr4 + + + + 1.1.0.1 + + + + org.netbeans.modules.nbjunit + + + + 1 + 1.110 + + + + org.netbeans.modules.options.api + + + + 1 + 1.65 + + + + org.netbeans.modules.parsing.api + + + + 1 + 9.27.0.8 + + + + org.netbeans.modules.parsing.indexing + + + + 9.29.0.1.3.8 + + + + org.netbeans.modules.php.editor + + + + 2 + + + + + org.netbeans.modules.php.api.editor + + + + 0 + 0.52 + + + + org.netbeans.modules.php.api.phpmodule + + + + 2.97 + + + + org.netbeans.modules.projectapi + + + + 1 + 1.91 + + + + org.netbeans.modules.projectuiapi + + + + 1 + 1.109.0.8 + + + + org.netbeans.modules.projectuiapi.base + + + + 1 + 1.106.0.9 + + + + org.netbeans.modules.refactoring.api + + + + 1.67.0.1 + + + + org.openide.awt + + + + 7.88 + + + + org.openide.dialogs + + + + 7.66 + + + + org.openide.filesystems + + + + 9.33 + + + + org.openide.filesystems.nb + + + + 9.30 + + + + org.openide.loaders + + + + 7.90 + + + + org.openide.nodes + + + + 7.65 + + + + org.openide.text + + + + 6.88 + + + + org.openide.util + + + + 9.28 + + + + org.openide.util.lookup + + + + 8.54 + + + + org.openide.util.ui + + + + 9.28 + + + + org.openide.windows + + + + 6.97 + + + + + + unit + + org.netbeans.libs.junit4 + + + + org.netbeans.modules.nbjunit + + + + + + + org.netbeans.modules.php.blade.csl.elements + org.netbeans.modules.php.blade.editor + org.netbeans.modules.php.blade.editor.actions + org.netbeans.modules.php.blade.editor.cache + org.netbeans.modules.php.blade.editor.completion + org.netbeans.modules.php.blade.editor.components + org.netbeans.modules.php.blade.editor.components.annotation + org.netbeans.modules.php.blade.editor.declaration + org.netbeans.modules.php.blade.editor.directives + org.netbeans.modules.php.blade.editor.embedding + org.netbeans.modules.php.blade.editor.format + org.netbeans.modules.php.blade.editor.highlighting + org.netbeans.modules.php.blade.editor.hints + org.netbeans.modules.php.blade.editor.indexing + org.netbeans.modules.php.blade.editor.lexer + org.netbeans.modules.php.blade.editor.navigator + org.netbeans.modules.php.blade.editor.parser + org.netbeans.modules.php.blade.editor.path + org.netbeans.modules.php.blade.editor.preferences + org.netbeans.modules.php.blade.editor.refactoring + org.netbeans.modules.php.blade.editor.tools + org.netbeans.modules.php.blade.editor.typinghooks + org.netbeans.modules.php.blade.editor.ui.customizer + org.netbeans.modules.php.blade.editor.ui.wizard + org.netbeans.modules.php.blade.project + org.netbeans.modules.php.blade.syntax + org.netbeans.modules.php.blade.syntax.annotation + org.netbeans.modules.php.blade.syntax.antlr4.formatter + org.netbeans.modules.php.blade.syntax.antlr4.v10 + org.netbeans.modules.php.blade.syntax.antlr4.v10.compiler + + + + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java new file mode 100644 index 000000000000..3cd671705db5 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.csl.elements; + +import org.netbeans.modules.csl.api.ElementKind; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public class ClassElement extends NamedElement { + + protected final String namespace; + + public ClassElement(String name, FileObject file) { + super(name, file, ElementType.PHP_CLASS); + this.namespace = null; + } + + public ClassElement(String name, String namespace, + FileObject file) { + super(name, file, ElementType.PHP_CLASS); + this.namespace = namespace; + } + + @Override + public ElementKind getKind() { + return ElementKind.CLASS; + } + + public String getNamespace() { + return namespace; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/DirectiveElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/DirectiveElement.java new file mode 100644 index 000000000000..41f4a1db91ae --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/DirectiveElement.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.csl.elements; + +import org.netbeans.modules.csl.api.ElementKind; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public class DirectiveElement extends NamedElement { + + public DirectiveElement(String name, FileObject file) { + super(name, file, ElementType.PATH); + } + + @Override + public ElementKind getKind() { + return ElementKind.METHOD; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ElementType.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ElementType.java new file mode 100644 index 000000000000..dd7570c21636 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ElementType.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.csl.elements; + +/** + * + * @author bogdan + */ +public enum ElementType { + NA, + CUSTOM_DIRECTIVE, + PATH, + DIRECTIVE, + VARIABLE, + PHP_CLASS, + PHP_NAMESPACE, + PHP_FUNCTION, + PHP_CONSTANT, + LARAVEL_COMPONENT, + STACK_ID, + YIELD_ID, + ASSET_FILE +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java new file mode 100644 index 000000000000..486dfac11b81 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java @@ -0,0 +1,112 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.csl.elements; + +import java.util.HashSet; +import java.util.Set; +import org.netbeans.modules.csl.api.ElementHandle; +import org.netbeans.modules.csl.api.ElementKind; +import org.netbeans.modules.csl.api.Modifier; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.csl.spi.ParserResult; +import static org.netbeans.modules.php.blade.csl.elements.ElementType.CUSTOM_DIRECTIVE; +import static org.netbeans.modules.php.blade.csl.elements.ElementType.STACK_ID; +import static org.netbeans.modules.php.blade.csl.elements.ElementType.YIELD_ID; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public class NamedElement implements ElementHandle { + + protected final String name; + protected final FileObject file; + protected final ElementType type; + + public NamedElement(String name, FileObject file) { + //we can add a file object from element + this.name = name; + this.file = file; + this.type = ElementType.NA; + } + + public NamedElement(String name, FileObject file, ElementType type) { + //we can add a file object from element + this.name = name; + this.file = file; + this.type = type; + } + + @Override + public FileObject getFileObject() { + return file; + } + + @Override + public String getMimeType() { + return BladeLanguage.MIME_TYPE; + } + + @Override + public String getName() { + return this.name; + } + + @Override + public String getIn() { + return ""; + } + + @Override + public ElementKind getKind() { + switch (type) { + case YIELD_ID: + return ElementKind.PACKAGE; + case STACK_ID: + return ElementKind.PACKAGE; + case CUSTOM_DIRECTIVE: + return ElementKind.METHOD; + case PHP_CLASS: + return ElementKind.CLASS; + } + return ElementKind.FILE; + } + + @Override + public Set getModifiers() { + return new HashSet<>(); + } + + @Override + public boolean signatureEquals(ElementHandle eh) { + return false; + } + + @Override + public OffsetRange getOffsetRange(ParserResult pr) { + return OffsetRange.NONE; + } + + public ElementType getType() { + return type; + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PathElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PathElement.java new file mode 100644 index 000000000000..a6ef88a2fe83 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PathElement.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.csl.elements; + +import org.netbeans.modules.csl.api.ElementKind; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public class PathElement extends NamedElement { + + public PathElement(String name, FileObject file) { + super(name, file, ElementType.PATH); + } + + @Override + public ElementKind getKind() { + return ElementKind.PACKAGE; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java new file mode 100644 index 000000000000..23ee1ff1eaf4 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.csl.elements; + +import java.util.List; +import org.netbeans.modules.csl.api.ElementKind; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public class PhpFunctionElement extends NamedElement { + + public final List params; + public final String namespace; + + public PhpFunctionElement(String name, FileObject file, + ElementType type, + String namespace, + List params) { + super(name, file, type); + this.namespace = namespace; + this.params = params; + } + + public PhpFunctionElement(String name, FileObject file, + ElementType type, + List params) { + super(name, file, type); + this.namespace = null; + this.params = params; + } + + @Override + public ElementKind getKind() { + return ElementKind.METHOD; + } + + public String getParamsAsString() { + if (params == null || params.isEmpty()) { + return "()"; + } + return "(" + String.join(", ", params) + ")"; + } + + public List getParams() { + return params; + } + + + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java new file mode 100644 index 000000000000..1b7b2051c548 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.csl.elements; + +import java.util.HashSet; +import java.util.Set; +import org.netbeans.modules.csl.api.ElementHandle; +import org.netbeans.modules.csl.api.ElementKind; +import org.netbeans.modules.csl.api.Modifier; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public class TagElement implements ElementHandle { + + protected final String name; + protected final ElementType type; + + public TagElement(String name) { + this.name = name; + this.type = ElementType.NA; + } + + @Override + public FileObject getFileObject() { + return null; + } + + @Override + public String getMimeType() { + return BladeLanguage.MIME_TYPE; + } + + @Override + public String getName() { + return this.name; + } + + @Override + public String getIn() { + return ""; + } + + @Override + public ElementKind getKind() { + return ElementKind.TAG; + } + + @Override + public Set getModifiers() { + return new HashSet<>(); + } + + @Override + public boolean signatureEquals(ElementHandle eh) { + return false; + } + + @Override + public OffsetRange getOffsetRange(ParserResult pr) { + return OffsetRange.NONE; + } + + public ElementType getType() { + return type; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java new file mode 100644 index 000000000000..cc1db9895a4d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -0,0 +1,288 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import javax.swing.text.BadLocationException; +import org.antlr.v4.runtime.Token; +import org.netbeans.api.annotations.common.NonNull; +import org.netbeans.api.editor.mimelookup.MimeRegistration; +import org.netbeans.editor.BaseDocument; +import org.netbeans.modules.php.blade.syntax.BladeDirectivesUtils; +import org.netbeans.modules.php.blade.syntax.BladeTagsUtils; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrUtils; +import org.netbeans.spi.editor.bracesmatching.BracesMatcher; +import org.netbeans.spi.editor.bracesmatching.BracesMatcherFactory; +import org.netbeans.spi.editor.bracesmatching.MatcherContext; + +/** + * brace matcher - block directives : @if @endif .. - output echo statements {{ + * }} {!! !!} + * + * @author bogdan + */ +public class BladeBracesMatcher implements BracesMatcher { + + public enum BraceDirectionType { + END_TO_START, START_TO_END, CUSTOM_START_TO_END, CURLY_END_TO_START, CURLY_START_TO_END, STOP + } + private final MatcherContext context; + private Token originToken; + private BraceDirectionType currentDirection; + + private BladeBracesMatcher(MatcherContext context) { + this.context = context; + } + + @Override + public int[] findOrigin() throws InterruptedException, BadLocationException { + int[] result = null; + originToken = null; + BaseDocument document = (BaseDocument) context.getDocument(); + document.readLock(); + try { + Token currentToken = BladeAntlrUtils.getToken(context.getDocument(), context.getSearchOffset()); + + if (currentToken == null) { + return result; + } + + if (!shouldLookForBraceMatch(currentToken)) { + return result; + } + + originToken = currentToken; + int start = currentToken.getStartIndex(); + int end = currentToken.getStopIndex(); + + String tokenText = originToken.getText(); + + if (!tokenText.startsWith("@") + && !tokenText.startsWith("{") + && !tokenText.endsWith("}")) { + return result; + } + + currentDirection = findBraceDirectionType(tokenText, currentToken); + + if (currentDirection.equals(BraceDirectionType.STOP)) { + return result; + } + + result = new int[]{start, end + 1}; + } finally { + document.readUnlock(); + } + return result; + } + + @Override + public int[] findMatches() throws InterruptedException, BadLocationException { + int[] result = null; + if (originToken == null) { + return result; + } + String tokenText = originToken.getText(); + + switch (currentDirection) { + case CURLY_START_TO_END: + return findCloseTag(); + case CURLY_END_TO_START: + return findOpenTag(); + case START_TO_END: + return findDirectiveEnd(tokenText); + case CUSTOM_START_TO_END: + return findCustomDirectiveEnd(tokenText); + case END_TO_START: + return findOriginForDirectiveEnd(tokenText); + } + + return result; + } + + private static boolean shouldLookForBraceMatch(@NonNull Token currentToken) { + switch (currentToken.getType()) { + case HTML: + case PHP_EXPRESSION: + case AT: + case BLADE_COMMENT: + case ERROR: + return false; + } + + return true; + } + + public BraceDirectionType findBraceDirectionType(String tokenText, Token token) { + boolean isCloseTag = Arrays.asList(BladeTagsUtils.outputCloseTags()).indexOf(tokenText) >= 0; + + if (isCloseTag) { + return BraceDirectionType.CURLY_END_TO_START; + } + + boolean isStartTag = Arrays.asList(BladeTagsUtils.outputStartTags()).indexOf(tokenText) >= 0; + + if (isStartTag) { + return BraceDirectionType.CURLY_START_TO_END; + } + + if (tokenText.startsWith("@end") || tokenText.equals("@show")) { + return BraceDirectionType.END_TO_START; + } + + if (BladeDirectivesUtils.directiveStart2EndPair(tokenText) != null) { + return BraceDirectionType.START_TO_END; + } + + //TODO get more directive context + if (token.getType() == BladeAntlrLexer.D_CUSTOM + || token.getType() == BladeAntlrLexer.D_UNKNOWN) { + return BraceDirectionType.CUSTOM_START_TO_END; + } + + return BraceDirectionType.STOP; + } + + public int[] findOpenTag() { + int matchTokenType = BladeAntlrUtils.getTagPairTokenType(originToken.getType()); + List skipableTokenTypes = new ArrayList<>(); + skipableTokenTypes.add(HTML); + Token startToken = BladeAntlrUtils.findBackwardWithStop(context.getDocument(), + originToken, + matchTokenType, + skipableTokenTypes); + + if (startToken != null) { + int start = startToken.getStartIndex(); + int end = startToken.getStopIndex(); + return new int[]{start, end + 1}; + } + + return null; + } + + public int[] findCloseTag() { + int matchTokenType = BladeAntlrUtils.getTagPairTokenType(originToken.getType()); + List skipableTokenTypes = new ArrayList<>(); + skipableTokenTypes.add(HTML); + Token endToken = BladeAntlrUtils.findForwardWithStop(context.getDocument(), + originToken, + matchTokenType, + skipableTokenTypes); + + if (endToken != null) { + int start = endToken.getStartIndex(); + int end = endToken.getStopIndex(); + return new int[]{start, end + 1}; + } + + return null; + } + + public int[] findDirectiveEnd(String directive) { + String[] pair = BladeDirectivesUtils.directiveStart2EndPair(directive); + if (pair == null){ + return null; + } + List startDirectiveForBalance = new ArrayList<>(); + List stopDirectives = Arrays.asList(pair); + + for (String endDirective : pair) { + String[] startDirectives = BladeDirectivesUtils.directiveEnd2StartPair(endDirective); + + if (startDirectives != null) { + startDirectiveForBalance.addAll(Arrays.asList(startDirectives)); + } + } + + Token endToken = BladeAntlrUtils.findForward(context.getDocument(), + originToken, + stopDirectives, + startDirectiveForBalance); + + if (endToken != null) { + //String text = endToken.getText(); + int start = endToken.getStartIndex(); + int end = endToken.getStopIndex(); + return new int[]{start, end + 1}; + } + + return null; + } + + public int[] findCustomDirectiveEnd(String directive) { + String[] pair = new String[]{"@end" + directive.substring(1)}; + List stopDirectives = Arrays.asList(pair); + List startDirectiveForBalance = Arrays.asList(new String[]{directive}); + + Token endToken = BladeAntlrUtils.findForward(context.getDocument(), + originToken, + stopDirectives, + startDirectiveForBalance); + + if (endToken != null) { + int start = endToken.getStartIndex(); + int end = endToken.getStopIndex(); + return new int[]{start, end + 1}; + } + + return null; + } + + public int[] findOriginForDirectiveEnd(String directive) { + String[] pair = BladeDirectivesUtils.directiveEnd2StartPair(directive); + List endDirectivesForBalance = new ArrayList<>(); + List openDirectives = Arrays.asList(pair); + + for (String startDirective : pair) { + String[] endDirectives = BladeDirectivesUtils.directiveStart2EndPair(startDirective); + + if (endDirectives != null) { + endDirectivesForBalance.addAll(Arrays.asList(endDirectives)); + } + } + + Token startToken = BladeAntlrUtils.findBackward(context.getDocument(), + originToken, + openDirectives, + endDirectivesForBalance); + + if (startToken != null) { + int start = startToken.getStartIndex(); + int end = startToken.getStopIndex(); + return new int[]{start, end + 1}; + } + + return null; + } + + @MimeRegistration(service = BracesMatcherFactory.class, mimeType = BladeLanguage.MIME_TYPE, position = 110) + public static final class Factory implements BracesMatcherFactory { + + @Override + public BracesMatcher createMatcher(MatcherContext context) { + return new BladeBracesMatcher(context); + } + + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java new file mode 100644 index 000000000000..388f71f475d4 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java @@ -0,0 +1,116 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import org.netbeans.api.lexer.Token; +import org.netbeans.api.lexer.TokenHierarchy; +import org.netbeans.api.lexer.TokenSequence; +import org.netbeans.editor.BaseDocument; +import org.netbeans.modules.csl.spi.CommentHandler; +import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; +import org.openide.util.Exceptions; + +/** + * known issues + * currently blade tag comment not wokring inside htmtl tags
{{ $x }}
+ * + * + * @author bhaidu + */ +public class BladeCommentHandler extends CommentHandler.DefaultCommentHandler { + + private static final String COMMENT_START_DELIMITER = "{{--"; //NOI18N + private static final String COMMENT_END_DELIMITER = "--}}"; //NOI18N + + @Override + public String getCommentStartDelimiter() { + return COMMENT_START_DELIMITER; + } + + @Override + public String getCommentEndDelimiter() { + return COMMENT_END_DELIMITER; + } + + @Override + @SuppressWarnings("rawtypes") + public int[] getAdjustedBlocks(final Document doc, int from, int to) { + final int[] bounds = new int[]{from, to}; + + Runnable task = new Runnable() { + @Override + @SuppressWarnings("rawtypes") + public void run() { + TokenHierarchy th = TokenHierarchy.get(doc); + TokenSequence ts = th.tokenSequence(); + ts.move(from); + ts.moveNext(); + + Token token = ts.token(); + + if (token != null && token.id() instanceof BladeTokenId) { + //handle uncomment + switch ((BladeTokenId) token.id()) { + case BLADE_COMMENT_START: + bounds[0] = ts.offset(); + + while (ts.moveNext()) { + if (ts.token().id() == BladeTokenId.BLADE_COMMENT_END) { + bounds[1] = ts.offset() + ts.token().length(); + break; + } + } + break; + case BLADE_DIRECTIVE: + bounds[0] = ts.offset(); + + ts.moveNext(); + if (ts.token().id() == BladeTokenId.PHP_BLADE_EXPRESSION) { + bounds[1] = ts.offset() + ts.token().length(); + } + + try { + //manually inserting the delimiters + doc.insertString(bounds[0], COMMENT_START_DELIMITER, null); + doc.insertString(Math.max(bounds[1], to) + COMMENT_END_DELIMITER.length(), COMMENT_END_DELIMITER, null); + bounds[0] = 0; + bounds[1] = 0; + } catch (BadLocationException ex) { + Exceptions.printStackTrace(ex); + } + break; + + } + + } + + } + }; + + if (doc instanceof BaseDocument) { + ((BaseDocument) doc).runAtomic(task); + } else { + task.run(); + } + + return new int[]{bounds[0], bounds[1]}; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java new file mode 100644 index 000000000000..8b505f0c8336 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java @@ -0,0 +1,463 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import org.antlr.v4.runtime.CharStreams; +import org.netbeans.api.project.Project; +import org.netbeans.modules.csl.api.DeclarationFinder; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.editor.BaseDocument; +import org.netbeans.modules.csl.api.ElementHandle; +import org.netbeans.modules.csl.api.HtmlFormatter; +import org.netbeans.modules.php.blade.csl.elements.ElementType; +import org.netbeans.modules.php.blade.csl.elements.NamedElement; +import org.netbeans.modules.php.blade.csl.elements.PathElement; +import org.netbeans.modules.php.blade.csl.elements.PhpFunctionElement; +import org.netbeans.modules.php.blade.editor.declaration.ComponentDeclarationService; +import org.netbeans.modules.php.blade.editor.declaration.VitePathDeclarationService; +import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; +import org.netbeans.modules.php.blade.editor.directives.CustomDirectives.CustomDirective; +import org.netbeans.modules.php.blade.editor.indexing.BladeIndex; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexFunctionResult; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; +import org.netbeans.modules.php.blade.editor.indexing.QueryUtils; +import org.netbeans.modules.php.blade.editor.lexer.BladeLexerUtils; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.FieldAccessReference; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.Reference; +import org.netbeans.modules.php.blade.editor.path.BladePathUtils; +import org.netbeans.modules.php.blade.syntax.StringUtils; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; +import org.netbeans.spi.lexer.antlr4.AntlrTokenSequence; +import org.openide.filesystems.FileObject; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrUtils; +import org.netbeans.spi.project.ui.support.ProjectConvertors; +import org.openide.filesystems.FileUtil; + +/** + * focuses mainly on string inputs + * + * ?? TODO implement a Extension module + * + * @author bhaidu + */ +public class BladeDeclarationFinder implements DeclarationFinder { + + private int currentTokenId; + private String tokenText; + + @Override + public OffsetRange getReferenceSpan(Document document, int caretOffset) { + BaseDocument baseDoc = (BaseDocument) document; + + //baseDoc.readLock(); + AntlrTokenSequence tokens = null; + OffsetRange offsetRange = OffsetRange.NONE; + tokenText = null; + int lineOffset = caretOffset; + try { + try { + String text = baseDoc.getText(0, baseDoc.getLength()); + tokens = new AntlrTokenSequence(new BladeAntlrLexer(CharStreams.fromString(text))); + } catch (BadLocationException ex) { + //Exceptions.printStackTrace(ex); + } + } finally { + //baseDoc.readUnlock(); + } + + //inside php expression context ?? + if (tokens == null || tokens.isEmpty()) { + return offsetRange; + } + + tokens.seekTo(lineOffset); + + if (tokens.hasNext()) { + org.antlr.v4.runtime.Token nt = tokens.next().get(); + + switch (nt.getType()) { + case D_CUSTOM: + case PHP_IDENTIFIER: + case PHP_NAMESPACE_PATH: + return new OffsetRange(nt.getStartIndex(), nt.getStopIndex() + 1); + case HTML_COMPONENT_PREFIX: + //direct detection + currentTokenId = HTML_COMPONENT_PREFIX; + //remove ' 3 ? nt.getText() : null; + return new OffsetRange(nt.getStartIndex() + 1, nt.getStopIndex() + 1); + } + + if (!tokens.hasPrevious()) { + return offsetRange; + } + + if (nt.getType() == BL_PARAM_STRING || nt.getType() == EXPR_STRING) { + List tokensToMatch = BladeLexerUtils.tokensWithIdentifiableParam(); + List tokensStop = Arrays.asList(new Integer[]{HTML}); + org.antlr.v4.runtime.Token matchedToken = BladeAntlrUtils.findBackward(tokens, tokensToMatch, tokensStop); + int offsetCorrection = caretOffset - lineOffset; + if (matchedToken != null) { + offsetRange = new OffsetRange(nt.getStartIndex() + offsetCorrection, nt.getStopIndex() + offsetCorrection + 1); + } + return offsetRange; + } + } + return offsetRange; + } + + @Override + public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) { + BladeParserResult parserResult = (BladeParserResult) info; + + FileObject currentFile = parserResult.getFileObject(); + DeclarationLocation location = DeclarationLocation.NONE; + + if (tokenText != null && currentTokenId == HTML_COMPONENT_PREFIX) { + String componentId = tokenText.substring(3); + String className = StringUtils.kebabToCamel(componentId); + ComponentDeclarationService componentComplervice = new ComponentDeclarationService(); + Collection indexedReferences = componentComplervice.queryComponents(className, currentFile); + + for (PhpIndexResult indexReference : indexedReferences) { + NamedElement resultHandle = new NamedElement(className, indexReference.declarationFile, ElementType.LARAVEL_COMPONENT); + DeclarationLocation constantLocation = new DeclarationFinder.DeclarationLocation(indexReference.declarationFile, indexReference.getStartOffset(), resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = constantLocation; + } + location.addAlternative(new AlternativeLocationImpl(constantLocation)); + + if (!location.equals(DeclarationLocation.NONE)) { + FileObject resource = componentComplervice.getComponentResourceFile(componentId, indexReference.name, currentFile); + if (resource != null) { + PathElement resourceHandle = new PathElement(componentId, resource); + DeclarationLocation resourceLocation = new DeclarationFinder.DeclarationLocation(resource, indexReference.getStartOffset(), resourceHandle); + location.addAlternative(new AlternativeLocationImpl(resourceLocation)); + } + } + } + return location; + } + + FieldAccessReference fieldAccessReference = parserResult.findFieldAccessRefrence(caretOffset); + + if (fieldAccessReference != null) { + switch (fieldAccessReference.type) { + case STATIC_FIELD_ACCESS: + switch (fieldAccessReference.fieldType) { + case CONSTANT: + Collection indexConstantsResults = PhpIndexUtils.queryExactClassConstants(currentFile, fieldAccessReference.fieldName, fieldAccessReference.ownerClass.identifier); + for (PhpIndexResult indexResult : indexConstantsResults) { + NamedElement resultHandle = new NamedElement(fieldAccessReference.fieldName, indexResult.declarationFile, ElementType.PHP_CONSTANT); + DeclarationLocation constantLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = constantLocation; + } + location.addAlternative(new AlternativeLocationImpl(constantLocation)); + } + return location; + } + } + } + + Reference reference = parserResult.findOccuredRefrence(caretOffset); + + if (reference == null) { + return location; + } + + Project projectOwner = ProjectConvertors.getNonConvertorOwner(currentFile); + + if (projectOwner == null) { + return location; + } + + FileObject sourceFolder = projectOwner.getProjectDirectory(); + String referenceIdentifier = reference.identifier; + + switch (reference.type) { + case EXTENDS: + case INCLUDE: + case INCLUDE_IF: + case EACH: + case INCLUDE_COND: + String viewPath = referenceIdentifier; + List includedFiles = BladePathUtils.findFileObjectsForBladeViewPath(currentFile, viewPath); + + if (includedFiles.isEmpty()) { + return DeclarationLocation.NONE; + } + + for (FileObject includedFile : includedFiles) { + PathElement elHandle = new PathElement(referenceIdentifier, includedFile); + DeclarationLocation dln = new DeclarationFinder.DeclarationLocation(includedFile, 0, elHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = dln; + } + location.addAlternative(new AlternativeLocationImpl(dln)); + } + return location; + case SECTION: + case HAS_SECTION: + case SECTION_MISSING: + String yieldId = referenceIdentifier; + List yields = QueryUtils.findYieldReferences(yieldId, currentFile); + if (yields == null) { + return DeclarationLocation.NONE; + } + + for (BladeIndex.IndexedReference yieldReference : yields) { + String yieldReferenceId = yieldReference.getReference().identifier; + NamedElement yieldIdHandle = new NamedElement(yieldReferenceId, + yieldReference.getOriginFile(), ElementType.YIELD_ID); + int startOccurence = yieldReference.getReference().defOffset.getStart(); + DeclarationLocation dlyieldItem = new DeclarationFinder.DeclarationLocation(yieldReference.getOriginFile(), startOccurence, yieldIdHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = dlyieldItem; + } + location.addAlternative(new AlternativeLocationImpl(dlyieldItem)); + } + + return location; + case PUSH: + case PUSH_IF: + case PREPEND: + String stackId = referenceIdentifier; + List stacks = QueryUtils.queryStacksReferences(stackId, currentFile); + + if (stacks == null) { + return DeclarationLocation.NONE; + } + + for (BladeIndex.IndexedReference stackReference : stacks) { + String stackReferenceId = stackReference.getReference().identifier; + NamedElement yieldIdHandle = new NamedElement(stackReferenceId, stackReference.getOriginFile(), ElementType.STACK_ID); + int startOccurence = stackReference.getReference().defOffset.getStart(); + DeclarationLocation dlstack = new DeclarationFinder.DeclarationLocation(stackReference.getOriginFile(), startOccurence, yieldIdHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = dlstack; + } + location.addAlternative(new AlternativeLocationImpl(dlstack)); + } + + return location; + case CUSTOM_DIRECTIVE: + String directiveNameFound = reference.identifier; + DeclarationLocation dlcustomDirective = DeclarationLocation.NONE; + + CustomDirectives.getInstance(projectOwner).filterAction(new CustomDirectives.FilterCallbackDeclaration(dlcustomDirective) { + @Override + public void filterDirectiveName(CustomDirective directive, FileObject file) { + if (directive.name.equals(directiveNameFound)) { + NamedElement customDirectiveHandle = new NamedElement(directiveNameFound, file, ElementType.CUSTOM_DIRECTIVE); + DeclarationFinder.DeclarationLocation newLoc = new DeclarationFinder.DeclarationLocation(file, directive.offset, customDirectiveHandle); + this.location.addAlternative(new AlternativeLocationImpl(newLoc)); + } + } + }); + + if (!dlcustomDirective.getAlternativeLocations().isEmpty()) { + for (AlternativeLocation loc : dlcustomDirective.getAlternativeLocations()) { + dlcustomDirective = loc.getLocation(); + } + } + return dlcustomDirective; + case PHP_CLASS: + Collection indexClassResults; + String namespace = reference.namespace; + + if (namespace != null && reference.namespace.length() > 2) { + int subOffset = reference.namespace.startsWith("\\") ? 1 : 0; + indexClassResults = PhpIndexUtils.queryExactNamespaceClasses(reference.identifier, + reference.namespace.substring(subOffset, reference.namespace.length() - 1), + sourceFolder + ); + } else { + indexClassResults = PhpIndexUtils.queryExactClass(sourceFolder, reference.identifier); + } + + for (PhpIndexResult indexResult : indexClassResults) { + NamedElement resultHandle = new NamedElement(referenceIdentifier, indexResult.declarationFile, ElementType.PHP_CLASS); + DeclarationLocation classLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = classLocation; + } + location.addAlternative(new AlternativeLocationImpl(classLocation)); + } + return location; + case PHP_METHOD:{ + if (reference.ownerClass == null) { + return location; + } + String queryNamespace = reference.namespace; + if (queryNamespace != null && queryNamespace.length() > 2) { + int subOffset = queryNamespace.startsWith("\\") ? 1 : 0; + int endOffset = queryNamespace.endsWith("\\") ? queryNamespace.length() - 1 : queryNamespace.length(); + queryNamespace = queryNamespace.substring(subOffset, endOffset); + } else { + queryNamespace = null; + } + Collection indexMethodResults = PhpIndexUtils.queryExactClassMethods(sourceFolder, + referenceIdentifier, reference.ownerClass, queryNamespace); + + + for (PhpIndexFunctionResult indexResult : indexMethodResults) { + PhpFunctionElement resultHandle = new PhpFunctionElement( + referenceIdentifier, + indexResult.declarationFile, + ElementType.PHP_FUNCTION, + indexResult.getClassNamespace(), + indexResult.getParams() + ); + DeclarationLocation functionLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = functionLocation; + } + location.addAlternative(new AlternativeLocationImpl(functionLocation)); + } + return location; + } + case PHP_FUNCTION: + Collection indexResults = PhpIndexUtils.queryExactFunctions(sourceFolder, reference.identifier); + + for (PhpIndexFunctionResult indexResult : indexResults) { + PhpFunctionElement resultHandle = new PhpFunctionElement( + referenceIdentifier, + indexResult.declarationFile, + ElementType.PHP_FUNCTION, + indexResult.getParams() + ); + DeclarationLocation functionLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = functionLocation; + } + location.addAlternative(new AlternativeLocationImpl(functionLocation)); + } + return location; + case PHP_CONSTANT: + Collection indexConstantsResults = PhpIndexUtils.queryExactConstants(sourceFolder, reference.identifier); + + for (PhpIndexResult indexResult : indexConstantsResults) { + NamedElement resultHandle = new NamedElement(referenceIdentifier, indexResult.declarationFile, ElementType.PHP_CONSTANT); + DeclarationLocation constantLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = constantLocation; + } + location.addAlternative(new AlternativeLocationImpl(constantLocation)); + } + return location; + case USE: + case INJECT: + case PHP_NAMESPACE_PATH_TYPE:{ + Collection indexNamespaceResults; + if (reference.namespace != null) { + int subOffset = reference.namespace.startsWith("\\") ? 1 : 0; + String namespacePath = reference.namespace.substring(subOffset); + indexNamespaceResults = PhpIndexUtils.queryExactNamespaceClasses(reference.identifier, + namespacePath, + sourceFolder + ); + for (PhpIndexResult indexResult : indexNamespaceResults) { + NamedElement resultHandle = new NamedElement(referenceIdentifier, indexResult.declarationFile, ElementType.PHP_CLASS); + DeclarationLocation classLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = classLocation; + } + location.addAlternative(new AlternativeLocationImpl(classLocation)); + } + } else { + indexNamespaceResults = PhpIndexUtils.queryNamespace(sourceFolder, reference.identifier); + + for (PhpIndexResult indexResult : indexNamespaceResults) { + NamedElement resultHandle = new NamedElement(referenceIdentifier, indexResult.declarationFile, ElementType.PHP_NAMESPACE); + DeclarationLocation constantLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = constantLocation; + } + location.addAlternative(new AlternativeLocationImpl(constantLocation)); + } + } + return location; + } + case VITE_PATH: + VitePathDeclarationService vitePathDeclService = new VitePathDeclarationService(sourceFolder); + FileObject viteAssetFile = vitePathDeclService.findFileObject(referenceIdentifier); + if (viteAssetFile == null || !viteAssetFile.isValid()){ + return location; + } + NamedElement resultHandle = new NamedElement(referenceIdentifier, viteAssetFile, ElementType.ASSET_FILE); + DeclarationLocation constantLocation = new DeclarationFinder.DeclarationLocation(viteAssetFile, 0, resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = constantLocation; + } + location.addAlternative(new AlternativeLocationImpl(constantLocation)); + return location; + } + + return DeclarationLocation.NONE; + } + + private static class AlternativeLocationImpl implements AlternativeLocation { + + private final DeclarationLocation location; + + public AlternativeLocationImpl(DeclarationLocation location) { + this.location = location; + } + + @Override + public ElementHandle getElement() { + return getLocation().getElement(); + } + + @Override + public String getDisplayHtml(HtmlFormatter formatter) { + ElementHandle el = getLocation().getElement(); + if (el != null) { + formatter.appendText(el.getName()); + if (el.getFileObject() != null) { + formatter.appendText(" in "); + formatter.appendText(FileUtil.getFileDisplayName(el.getFileObject())); + } + return formatter.getText(); + } + return getLocation().toString(); + } + + @Override + public DeclarationFinder.DeclarationLocation getLocation() { + return location; + } + + @Override + public int compareTo(DeclarationFinder.AlternativeLocation o) { + return 0; + } + + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java new file mode 100644 index 000000000000..8a8f9bf49b49 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java @@ -0,0 +1,237 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import org.netbeans.modules.php.blade.editor.hints.BladeHintsProvider; +import org.netbeans.api.lexer.Language; +import org.netbeans.modules.parsing.spi.Parser; +import org.netbeans.modules.csl.spi.DefaultLanguageConfig; +import org.netbeans.modules.csl.spi.LanguageRegistration; +import org.netbeans.spi.lexer.Lexer; +import org.openide.util.NbBundle; +import org.netbeans.spi.lexer.LexerRestartInfo; +import org.openide.awt.ActionID; +import org.openide.awt.ActionReference; +import org.openide.awt.ActionReferences; +import org.openide.filesystems.MIMEResolver; +import org.openide.util.Lookup; +import org.openide.windows.TopComponent; +import org.netbeans.core.spi.multiview.MultiViewElement; +import org.netbeans.core.spi.multiview.text.MultiViewEditorElement; +import org.netbeans.modules.csl.api.CodeCompletionHandler; +import org.netbeans.modules.csl.api.DeclarationFinder; +import org.netbeans.modules.csl.api.Formatter; +import org.netbeans.modules.csl.api.HintsProvider; +import org.netbeans.modules.csl.api.SemanticAnalyzer; +import org.netbeans.modules.csl.api.StructureScanner; +import org.netbeans.modules.csl.spi.CommentHandler; +import static org.netbeans.modules.php.blade.editor.BladeLanguage.ACTIONS; +import org.netbeans.modules.php.blade.editor.completion.BladeCompletionHandler; +import org.netbeans.modules.php.blade.editor.format.BladeFormatter; +import org.netbeans.modules.php.blade.editor.lexer.BladeLexer; +import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; +import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId.BladeLanguageHierarchy; +import org.netbeans.modules.php.blade.editor.navigator.BladeStructureScanner; +import org.netbeans.modules.php.blade.editor.parser.BladeParser; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; + +/** + * + * @author Haidu Bogdan + */ +@MIMEResolver.Registration( + resource = "../resources/mime-resolver.xml", + displayName = "#LBL_Blade_LOADER", + position = 1 +) + +@NbBundle.Messages({ + "LBL_Blade_LOADER=Blade template files" +}) +@LanguageRegistration(mimeType = "text/x-blade", useMultiview = true) +@ActionReferences({ + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.OpenAction"), path = ACTIONS, position = 100), + @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.CutAction"), path = ACTIONS, position = 300, separatorBefore = 200), + @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.CopyAction"), path = ACTIONS, position = 400), + @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.PasteAction"), path = ACTIONS, position = 500, separatorAfter = 600), + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.NewAction"), path = ACTIONS, position = 700), + @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.DeleteAction"), path = ACTIONS, position = 800), + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.RenameAction"), path = ACTIONS, position = 900, separatorAfter = 1000), + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.SaveAsTemplateAction"), path = ACTIONS, position = 1100, separatorAfter = 1200), + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.FileSystemAction"), path = ACTIONS, position = 1300, separatorAfter = 1400), + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.ToolsAction"), path = ACTIONS, position = 1500), + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.PropertiesAction"), path = ACTIONS, position = 1600), + @ActionReference(id = @ActionID(category = "TemplateActions", id = "org.netbeans.modules.php.blade.editor.actions.FindUsage"), + path = ACTIONS, separatorBefore = 1700, position = 1800), + @ActionReference(id = @ActionID(category = "System", id = "org.netbeans.modules.php.blade.editor.actions.AntlrDebug"), path = ACTIONS, position = 1900), // @ActionReference(id = @ActionID(category = "DebugAntlrActions", id = "org.netbeans.modules.php.blade.editor.actions.ViewAntlrLexerTokens"), path = ACTIONS, position = 2000), +// @ActionReference( +// path = "Editors/" + BladeLanguage.MIME_TYPE+ "/Popup", +// id = @ActionID(category = "Refactoring", id = "org.netbeans.modules.refactoring.api.ui.WhereUsedAction"), +// position = 1600 +// ), +} +) +public class BladeLanguage extends DefaultLanguageConfig { + + public BladeLanguage() { + super(); + } + + public static final String ACTIONS = "Loaders/" + BladeLanguage.MIME_TYPE + "/Actions"; //NOI18N + public static final String MIME_TYPE = "text/x-blade"; //NOI18N + + @Override + public Language getLexerLanguage() { + return language; + } + + @Override + public String getDisplayName() { + return "Blade"; //NOI18N + } + + @Override + public String getPreferredExtension() { + return "blade.php"; // NOI18N + } + + @Override + public Parser getParser() { + return new BladeParser(); + } + + //we need this to avoid lang assertion error + @Deprecated + @Override + public boolean hasStructureScanner() { + return true; + } + + @Override + public StructureScanner getStructureScanner() { + return new BladeStructureScanner(); + } + + @Override + public CodeCompletionHandler getCompletionHandler() { + return new BladeCompletionHandler(); + } + + @Override + public CommentHandler getCommentHandler() { + return new BladeCommentHandler(); + } + + @Override + public boolean hasHintsProvider() { + return true; + } + + @Override + public HintsProvider getHintsProvider() { + return new BladeHintsProvider(); + } + + @Override + public boolean hasFormatter() { + return true; + } + + @Override + public Formatter getFormatter() { + return new BladeFormatter(); + } + + @Override + public DeclarationFinder getDeclarationFinder() { + return new BladeDeclarationFinder(); + } + + @Override + @SuppressWarnings("rawtypes") + public SemanticAnalyzer getSemanticAnalyzer() { + return new BladeSemanticAnalyzer(); + } +// +// @Override +// public boolean hasOccurrencesFinder() { +// return true; +// } +// +// @Override +// public OccurrencesFinder getOccurrencesFinder() { +// //practical just for php context +// return new BladeOcurrencesFinder(); +// } + + /** + * flag for detecting if we are in a string context enables to select the + * blade view "layout.index" string value on double click without + * interpreting the same thing for javascript objects + */ + public static volatile Boolean hasQuote = false; + + @Override + public boolean isIdentifierChar(char c) { + /** + * Includes things you'd want selected as a unit when double clicking in + * the editor + */ + //also used for completion items filtering! + if (c == '"' || c == '\'') { + hasQuote = true; + } + return Character.isJavaIdentifierPart(c) + || (c == '@') + || (hasQuote && c == '.') || (c == '_'); + } + +// @deprecated +// @Override +// public KeystrokeHandler getKeystrokeHandler() { +// return new BladeBracketCompleter(); +// } + private static final Language language + = new BladeLanguageHierarchy() { + + @Override + protected String mimeType() { + return BladeLanguage.MIME_TYPE; + } + + @Override + protected Lexer createLexer(LexerRestartInfo info) { + return new BladeLexer(info); + } + + }.language(); + + @NbBundle.Messages("Source=&Source Blade") + @MultiViewElement.Registration( + displayName = "#Source", + persistenceType = TopComponent.PERSISTENCE_ONLY_OPENED, + mimeType = BladeLanguage.MIME_TYPE, + preferredID = "blade.source", + position = 100 + ) + public static MultiViewEditorElement createMultiViewEditorElement(Lookup context) { + return new MultiViewEditorElement(context); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeSemanticAnalyzer.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeSemanticAnalyzer.java new file mode 100644 index 000000000000..30d7b88b87e8 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeSemanticAnalyzer.java @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import org.netbeans.api.project.Project; +import org.netbeans.modules.csl.api.ColoringAttributes; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.csl.api.SemanticAnalyzer; +import org.netbeans.modules.parsing.spi.Scheduler; +import org.netbeans.modules.parsing.spi.SchedulerEvent; +import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.Reference; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.openide.filesystems.FileObject; + +/** + * coloring configured in fonts and colors + * + * @author bhaidu + */ +public class BladeSemanticAnalyzer extends SemanticAnalyzer { + + private boolean cancelled; + public static final EnumSet UNDEFINED_FIELD_SET = EnumSet.of(ColoringAttributes.UNDEFINED); + public static final EnumSet CUSTOM_DIRECTIVE_SET = EnumSet.of(ColoringAttributes.DECLARATION); + private Map> semanticHighlights; + + @Override + public Map> getHighlights() { + return semanticHighlights; + } + + protected final synchronized boolean isCancelled() { + return cancelled; + } + + protected final synchronized void resume() { + cancelled = false; + } + + @Override + public void cancel() { + cancelled = true; + } + + @Override + public int getPriority() { + return 0; + } + + @Override + public Class getSchedulerClass() { + return Scheduler.EDITOR_SENSITIVE_TASK_SCHEDULER; + } + + @Override + public void run(BladeParserResult parserResult, SchedulerEvent event) { + resume(); + + if (isCancelled()) { + return; + } + + Map> highlights + = new HashMap<>(); + FileObject fo = parserResult.getFileObject(); + Project project = ProjectUtils.getMainOwner(fo); + CustomDirectives ct = CustomDirectives.getInstance(project); + for (Map.Entry entry : parserResult.customDirectivesReferences.entrySet()) { + if (entry.getValue().type == BladeParserResult.ReferenceType.POSSIBLE_DIRECTIVE && ct.customDirectiveConfigured(entry.getValue().identifier) ) { + highlights.put(entry.getKey(), CUSTOM_DIRECTIVE_SET); + continue; + } + highlights.put(entry.getKey(), UNDEFINED_FIELD_SET); + } + +// List errorList = parserResult.getDiagnostics(); +// for (org.netbeans.modules.csl.api.Error error : errorList) { +// OffsetRange range = new OffsetRange(error.getStartPosition(), error.getEndPosition()); +// highlights.put(range, UNDEFINED_FIELD_SET); +// } + this.semanticHighlights = highlights; + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java new file mode 100644 index 000000000000..dde99d415548 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import java.util.Collection; +import org.openide.util.Parameters; + +/** + * + * @author bhaidu + */ +public class EditorStringUtils { + + public static String implode(Collection items, String delimiter) { + Parameters.notNull("items", items); + Parameters.notNull("delimiter", delimiter); + + if (items.isEmpty()) { + return ""; // NOI18N + } + + StringBuilder buffer = new StringBuilder(200); + boolean first = true; + for (String s : items) { + if (!first) { + buffer.append(delimiter); + } + buffer.append(s); + first = false; + } + return buffer.toString(); + } + + public static boolean isQuotedString(String text){ + if (text.length() < 2){ + return false; + } + return (text.startsWith("'") && text.endsWith("'")) + || (text.startsWith("\"") && text.endsWith("\"")); + } + + public static String stripSurroundingQuotes(String text){ + if (!isQuotedString(text)){ + return text; + } + return text.substring(1, text.length()-1); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java new file mode 100644 index 000000000000..2622a72cd93d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java @@ -0,0 +1,208 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import java.io.IOException; +import java.util.EnumSet; +import java.util.List; +import java.util.Set; +import javax.swing.text.Document; +import javax.swing.text.JTextComponent; +import org.netbeans.api.editor.*; +import org.netbeans.api.editor.mimelookup.MimeRegistration; +import org.netbeans.lib.editor.hyperlink.spi.HyperlinkProviderExt; +import org.netbeans.lib.editor.hyperlink.spi.HyperlinkType; +import org.netbeans.api.editor.document.LineDocumentUtils; +import org.netbeans.api.lexer.Token; +import org.netbeans.api.lexer.TokenSequence; +import org.netbeans.api.project.Project; +import org.netbeans.editor.BaseDocument; +import org.netbeans.modules.php.blade.editor.lexer.EditorUtils; +import org.netbeans.modules.php.blade.editor.path.BladePathUtils; +import org.netbeans.modules.php.blade.project.BladeProjectProperties; +import org.netbeans.modules.php.editor.lexer.PHPTokenId; +import org.openide.filesystems.FileObject; +import org.openide.loaders.DataObject; +import org.openide.text.Line; +import org.openide.text.NbDocument; +import org.openide.util.Exceptions; + +/** + * Similar to a declaration finder + * + * @author bhaidu + */ +@MimeRegistration(mimeType = "text/x-php5", service = HyperlinkProviderExt.class) +public class HyperlinkProviderImpl implements HyperlinkProviderExt { + + String methodName; + String identifiableText; + String tooltipText = ""; + FileObject goToFile; + int goToOffset = 0; + int triggeredEvent = 0; + + public enum DeclarationType { + VIEW_PATH; + } + + @Override + public Set getSupportedHyperlinkTypes() { + return EnumSet.of(HyperlinkType.GO_TO_DECLARATION, HyperlinkType.ALT_HYPERLINK); + } + + @Override + public boolean isHyperlinkPoint(Document doc, int offset, HyperlinkType type) { + if (!nonLaravelDeclFinderEnabled(doc)) { + return false; + } + return getHyperlinkSpan(doc, offset, type) != null; + } + + @Override + public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { + if (!nonLaravelDeclFinderEnabled(doc)) { + return null; + } + if (!type.equals(HyperlinkType.GO_TO_DECLARATION)) { + //not handled by a LSP handler + return null; + } + + BaseDocument baseDoc = (BaseDocument) doc; + int lineStart = LineDocumentUtils.getLineStart(baseDoc, offset); + TokenSequence tokensq = EditorUtils.getTokenSequence(doc, offset); + + if (tokensq == null) { + return null; + } + + Token currentToken = tokensq.token(); + int startOffset = tokensq.offset(); + + if (currentToken == null) { + return null; + } + + String focusedText = currentToken.text().toString(); + + //2 char config are not that relevant + if (focusedText.length() < 5 || !EditorStringUtils.isQuotedString(focusedText)) { + return null; + } + + identifiableText = focusedText.substring(1, focusedText.length() - 1); + PHPTokenId prevTokenId = null; + + while (tokensq.movePrevious() && tokensq.offset() >= lineStart) { + Token token = tokensq.token(); + if (token == null) { + break; + } + String text = token.text().toString(); + PHPTokenId id = token.id(); + + if (prevTokenId != null && id.equals(PHPTokenId.PHP_STRING)) { + methodName = text; + //tooltip text + switch (methodName) { + case "view": + case "make": + case "render": + FileObject currentFile = EditorUtils.getFileObjectFromDoc(doc); + + if (currentFile == null) { + return null; + } + List includedFiles = BladePathUtils.findFileObjectsForBladeViewPath(currentFile, identifiableText); + String viewPath = BladePathUtils.toBladeToProjectFilePath(identifiableText); + + for (FileObject includedFile : includedFiles) { + goToFile = includedFile; + tooltipText = "Blade Template File : " + viewPath + + "

" + identifiableText + ""; + goToOffset = 0; + break; + } + + return new int[]{startOffset, startOffset + currentToken.length()}; + default: + return null; + } + } + + if (id.equals(PHPTokenId.PHP_TOKEN) && text.equals("(")) { + prevTokenId = id; + } + } + return null; + } + + @Override + public void performClickAction(Document doc, int offset, HyperlinkType type) { + switch (type) { + case GO_TO_DECLARATION: + switch (methodName) { + case "view": + case "make": + case "render": + if (goToFile != null) { + openDocument(goToFile, goToOffset); + triggeredEvent++; + } + break; + } + break; + case ALT_HYPERLINK: + JTextComponent focused = EditorRegistry.focusedComponent(); + if (focused != null && focused.getDocument() == doc) { + focused.setCaretPosition(offset); + //GoToImplementation.goToImplementation(focused); + } + break; + } + } + + private void openDocument(FileObject f, int offset) { + try { + DataObject dob = DataObject.find(f); + NbDocument.openDocument(dob, offset, Line.ShowOpenType.OPEN, Line.ShowVisibilityType.FOCUS); + + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + + } + + private boolean nonLaravelDeclFinderEnabled(Document doc) { + Project projectOwner = EditorUtils.getProjectOwner(doc); + if (projectOwner == null){ + return false; + } + BladeProjectProperties bladeProperties = BladeProjectProperties.getInstance(projectOwner); + + return bladeProperties.getNonLaravelDeclFinderFlag(); + } + + @Override + public String getTooltipText(Document doc, int offset, HyperlinkType type) { + return "" + tooltipText + ""; + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java new file mode 100644 index 000000000000..3849adeacd71 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import javax.swing.ImageIcon; +import org.openide.util.ImageUtilities; + +/** + * + * @author bhaidu + */ +public class ResourceUtilities { + + public static final String ICON_BASE = "org/netbeans/modules/php/blade/resources/"; //NOI18N + + public static ImageIcon loadResourceIcon(String path){ + return ImageUtilities.loadImageIcon(ICON_BASE + path, false); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/AntlrDebugAction.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/AntlrDebugAction.java new file mode 100644 index 000000000000..d17b3f7ac7ee --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/AntlrDebugAction.java @@ -0,0 +1,199 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.actions; + +import java.awt.event.ActionEvent; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.JComponent; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; +import org.openide.awt.ActionID; +import org.openide.awt.ActionRegistration; +import org.openide.awt.Actions; +import org.openide.awt.DynamicMenuContent; +import org.openide.nodes.Node; +import org.openide.util.ContextAwareAction; +import org.openide.util.HelpCtx; +import org.openide.util.Lookup; +import org.openide.util.actions.Presenter; + +/** + * + * @author bhaidu + */ +@ActionID(id = "org.netbeans.modules.php.blade.editor.actions.AntlrDebug", category = "System") +@ActionRegistration(displayName = "Antlr Debug", lazy=false) +public class AntlrDebugAction extends AbstractAction implements ContextAwareAction, Presenter.Popup { + + Node node; + + public void setNode(Node node){ + this.node = node; + } + + @Override + public Action createContextAwareInstance(Lookup lkp) { + Node folderNode = lkp.lookup(Node.class); + AntlrDebugAction act = new AntlrDebugAction(); + act.setNode(folderNode); + return act; + } + + static final long serialVersionUID = 4906417339959070129L; + + @Override + public void actionPerformed(ActionEvent ae) { + assert false; + } + + @Override + public JMenuItem getPopupPresenter() { + return new AntlrDebugAction.Popup(this); + } + + private List generate(Action gdlAction, boolean forMenu) { + List actions = getAntlrDebugActions(); + List list = new ArrayList<>(actions.size()); + + Lookup lookup; + + if (gdlAction instanceof Lookup.Provider) { + lookup = ((Lookup.Provider) gdlAction).getLookup(); + } else { + lookup = null; + } + + for (Action a : actions) { + + // Retrieve context sensitive action instance if possible. + if (lookup != null && a instanceof ContextAwareAction) { + a = ((ContextAwareAction) a).createContextAwareInstance(lookup); + } + + if (a != null && a.isEnabled()) { + JMenuItem mi; + mi = new JMenuItem(); + Actions.connect(mi, a, !forMenu); + list.add(mi); + } + } + + return list; + } + + List getAntlrDebugActions() { + + List arr = new ArrayList<>(); + if (node != null) { + arr.add(new ViewAntlrLexerTokensAction(node)); + arr.add(new ViewAntlrColoringTokensAction(node)); + arr.add(new ViewAntlrFormatterTokensAction(node)); + } +// List actions = Utilities.actionsForPath("Actions/AntlrDebugActions"); +// arr.addAll(actions); + //add the actions + return arr; + } + + private final class Popup extends JMenuItem implements DynamicMenuContent { + + private final JMenu menu = new MyMenu(); + private JPopupMenu lastPopup = null; + /** + * Associated tools action. + */ + private final Action antlrDebugAction; + + public Popup(Action antlrDebugAction) { + super(); + this.antlrDebugAction = antlrDebugAction; + HelpCtx.setHelpIDString(menu, AntlrDebugAction.class.getName()); + + } + + @Override + public JComponent[] getMenuPresenters() { + return synchMenuPresenters(new JComponent[0]); + } + + @Override + public JComponent[] synchMenuPresenters(JComponent[] jcs) { + return new JMenuItem[]{menu}; + } + + private class MyMenu extends org.openide.awt.JMenuPlus implements PopupMenuListener { + + MyMenu() { + super("Antlr Debug"); + } + + @Override + public JPopupMenu getPopupMenu() { + JPopupMenu popup = super.getPopupMenu(); + fillSubmenu(popup); + + return popup; + } + + private void fillSubmenu(JPopupMenu pop) { + if (lastPopup != null) { + return; + } + pop.addPopupMenuListener(this); + lastPopup = pop; + + removeAll(); + Iterator it = generate(antlrDebugAction, false).iterator(); + + while (it.hasNext()) { + java.awt.Component item = (java.awt.Component) it.next(); + + if (item == null) { + addSeparator(); + } else { + add(item); + } + } + } + + @Override + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + + } + + @Override + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + + } + + @Override + public void popupMenuCanceled(PopupMenuEvent e) { + + } + } + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/FindUsage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/FindUsage.java new file mode 100644 index 000000000000..b39b89ece9ec --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/FindUsage.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.actions; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import javax.swing.AbstractAction; +import javax.swing.text.JTextComponent; +import org.netbeans.modules.php.blade.editor.path.BladePathUtils; +import org.netbeans.modules.php.blade.editor.refactoring.BladePathInfo; +import org.netbeans.modules.php.blade.editor.refactoring.WhereBladePathUsedRefactoringUIImpl; +import org.netbeans.modules.refactoring.spi.ui.UI; +import org.openide.awt.ActionID; +import org.openide.awt.ActionRegistration; +import org.openide.filesystems.FileObject; +import org.openide.nodes.Node; +import org.openide.windows.TopComponent; + +/** + * + * @author bogdan + */ +@ActionID(id = "org.netbeans.modules.php.blade.editor.actions.FindUsage", category = "TemplateActions") +@ActionRegistration(displayName = "Template Usages") +public class FindUsage extends AbstractAction implements ActionListener { + + Node node; + + public FindUsage(Node node) { + this.node = node; + } + + @Override + public void actionPerformed(ActionEvent e) { + FileObject fo = node.getLookup().lookup(FileObject.class); + String bladePath = BladePathUtils.toBladeViewPath(fo); + if (bladePath == null) { + return; + } + BladePathInfo si = new BladePathInfo(fo, bladePath); + UI.openRefactoringUI(new WhereBladePathUsedRefactoringUIImpl(si), + TopComponent.getRegistry().getActivated()); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrColoringTokensAction.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrColoringTokensAction.java new file mode 100644 index 000000000000..5045b558072e --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrColoringTokensAction.java @@ -0,0 +1,162 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.actions; + +import java.awt.BorderLayout; +import java.awt.Rectangle; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import javax.swing.AbstractAction; +import javax.swing.JEditorPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import javax.swing.text.EditorKit; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.Token; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrColoringLexer; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrColoringLexer.*; +import org.openide.awt.ActionID; +import org.openide.awt.ActionRegistration; +import org.openide.filesystems.FileObject; +import org.openide.nodes.Node; +import org.openide.util.Exceptions; +import org.openide.windows.TopComponent; + +/** + * + * @author bhaidu + */ +@ActionID(id = "org.netbeans.modules.php.blade.editor.actions.ViewAntlrColoringTokens", category = "DebugAntlrActions") +@ActionRegistration(displayName = "AntlrColoring Tokens") +public class ViewAntlrColoringTokensAction extends AbstractAction implements ActionListener { + + Node node; + private transient JEditorPane viewer; + + public ViewAntlrColoringTokensAction(Node node) { + this.node = node; + putValue(NAME, "AntlrColoring Tokens"); + } + + @Override + public void actionPerformed(ActionEvent e) { + FileObject fo = node.getLookup().lookup(FileObject.class); + if (fo == null) { + return; + } + AntlrLexerPreviewComponent comp = new AntlrLexerPreviewComponent(fo); + comp.open(); + comp.setVisible(true); + } + + public final class AntlrLexerPreviewComponent extends TopComponent { + + private final FileObject fileObject; + + public AntlrLexerPreviewComponent(FileObject fo) { + this.fileObject = fo; + initComponents(); + } + + @Override + public int getPersistenceType() { + return TopComponent.PERSISTENCE_NEVER; + } + + protected void initComponents() { + setName("Antlr coloring token preview - " + fileObject.getName()); + setLayout(new BorderLayout()); + viewer = new JEditorPane(); + viewer.setContentType("text/plain"); + viewer.setEditable(false); + //viewer.addHyperlinkListener(this::linkHandler); + + JPanel panel = new JPanel(new BorderLayout()); + panel.add(new JScrollPane(viewer), BorderLayout.CENTER); + add(panel); + Rectangle vis = viewer.getVisibleRect(); + try { + CharStream cs = CharStreams.fromString(String.valueOf(fileObject.asText())); + BladeAntlrColoringLexer lexer = new BladeAntlrColoringLexer(cs); + CommonTokenStream tokens = new CommonTokenStream(lexer); + tokens.fill(); + Document doc = viewer.getDocument(); + + // Would be better to create some diff and update the changed elemets + doc.remove(0, doc.getLength()); + StringBuilder result = new StringBuilder(); + + int lastLine = 0; + for (Token token : tokens.getTokens()) { + if (lastLine != token.getLine()) { + lastLine = token.getLine(); + if (lastLine > 1) { + result.append("\n"); + } + result.append("L"); + result.append(lastLine); + result.append(": ").append(lastLine); + } + switch (token.getType()) { + case DIRECTIVE: + case D_AT: + result.append(token.getText()); + break; + case HTML_TAG: + case HTML: + result.append(" (HTML-"); + result.append(token.getType()); + result.append(" "); + result.append(token.getText()); + result.append(" ~)"); + break; + case PHP_EXPRESSION: + result.append(" (PHP_EXPRESSION)"); + result.append(token.getText()); + break; + case BLADE_PHP_ECHO_EXPR: + result.append(" (BLADE_PHP_ECHO_EXPR)"); + result.append(token.getText()); + break; + default: + result.append(token.getType()); + } + if (token.getType() > -1) { + result.append(" | "); + } + } + + EditorKit kit = viewer.getEditorKit(); + Reader reader = new StringReader(result.toString()); + //doc. + kit.read(reader, doc, 0); + viewer.scrollRectToVisible(vis); + } catch (IOException | BadLocationException ex) { + Exceptions.printStackTrace(ex); + } + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrFormatterTokensAction.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrFormatterTokensAction.java new file mode 100644 index 000000000000..8b4ee0df6a29 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrFormatterTokensAction.java @@ -0,0 +1,193 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.actions; + +import java.awt.BorderLayout; +import java.awt.Rectangle; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import javax.swing.AbstractAction; +import javax.swing.JEditorPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import javax.swing.text.EditorKit; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.Token; +import org.netbeans.modules.php.blade.syntax.antlr4.formatter.BladeAntlrFormatterLexer; +import static org.netbeans.modules.php.blade.syntax.antlr4.formatter.BladeAntlrFormatterLexer.*; +import org.openide.awt.ActionID; +import org.openide.awt.ActionRegistration; +import org.openide.filesystems.FileObject; +import org.openide.nodes.Node; +import org.openide.util.Exceptions; +import org.openide.windows.TopComponent; + +/** + * + * @author bhaidu + */ +@ActionID(id = "org.netbeans.modules.php.blade.editor.actions.ViewAntlrFormatterTokens", category = "DebugAntlrActions") +@ActionRegistration(displayName = "AntlrFormatter Tokens") +public class ViewAntlrFormatterTokensAction extends AbstractAction implements ActionListener { + + Node node; + private transient JEditorPane viewer; + + public ViewAntlrFormatterTokensAction(Node node) { + this.node = node; + putValue(NAME, "AntlrFormatter Tokens"); + } + + @Override + public void actionPerformed(ActionEvent e) { + FileObject fo = node.getLookup().lookup(FileObject.class); + if (fo == null) { + return; + } + AntlrLexerPreviewComponent comp = new AntlrLexerPreviewComponent(fo); + comp.open(); + comp.setVisible(true); + } + + public final class AntlrLexerPreviewComponent extends TopComponent { + + private final FileObject fileObject; + + public AntlrLexerPreviewComponent(FileObject fo) { + this.fileObject = fo; + initComponents(); + } + + @Override + public int getPersistenceType() { + return TopComponent.PERSISTENCE_NEVER; + } + + protected void initComponents() { + setName("Antlr formatter token preview - " + fileObject.getName()); + setLayout(new BorderLayout()); + viewer = new JEditorPane(); + viewer.setContentType("text/plain"); + viewer.setEditable(false); + //viewer.addHyperlinkListener(this::linkHandler); + + JPanel panel = new JPanel(new BorderLayout()); + panel.add(new JScrollPane(viewer), BorderLayout.CENTER); + add(panel); + Rectangle vis = viewer.getVisibleRect(); + try { + CharStream cs = CharStreams.fromString(String.valueOf(fileObject.asText())); + BladeAntlrFormatterLexer lexer = new BladeAntlrFormatterLexer(cs); + CommonTokenStream tokens = new CommonTokenStream(lexer); + tokens.fill(); + Document doc = viewer.getDocument(); + + // Would be better to create some diff and update the changed elemets + doc.remove(0, doc.getLength()); + StringBuilder result = new StringBuilder(); + + int lastLine = 0; + for (Token token : tokens.getTokens()) { + if (lastLine != token.getLine()) { + lastLine = token.getLine(); + if (lastLine > 1) { + result.append("\n"); + } + result.append("L"); + result.append(lastLine); + result.append(": "); + } + switch (token.getType()) { + case PARAM_COMMA: + result.append(" ~,"); + break; + case D_ARG_LPAREN: + result.append(" ~("); + break; + case D_ARG_RPAREN: + result.append(" ~)"); + break; + case SG_QUOTE: + result.append(" '"); + break; + case WS: + result.append(" ("); + result.append(token.getText()); + result.append(" )"); + break; + case NL: + result.append(" (n)"); + break; + case EQ: + result.append("(EQ)"); + break; + case STRING: + result.append("string"); + break; + case IDENTIFIER: + result.append("~"); + result.append(token.getText()); + break; + case COMPONENT_TAG: + result.append("COMP_TAG "); + result.append(token.getText()); + break; + case HTML_CLOSE_TAG: + result.append("CLOSE_TAG "); + result.append(token.getText()); + break; + case HTML_START_BLOCK_TAG: + result.append("START_TAG "); + result.append(token.getText()); + break; + case GT_SYMBOL: + result.append(" (>)"); + break; + case D_PHP: + result.append(" (@php)"); + break; + default: + result.append(token.getType()); + if (token.getText().startsWith("@")) { + result.append(" (DIRECTIVE)"); + } + } + if (token.getType() > -1) { + result.append(" | "); + } + } + + EditorKit kit = viewer.getEditorKit(); + Reader reader = new StringReader(result.toString()); + //doc. + kit.read(reader, doc, 0); + viewer.scrollRectToVisible(vis); + } catch (IOException | BadLocationException ex) { + Exceptions.printStackTrace(ex); + } + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrLexerTokensAction.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrLexerTokensAction.java new file mode 100644 index 000000000000..ccca610a149f --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrLexerTokensAction.java @@ -0,0 +1,178 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.actions; + +import java.awt.BorderLayout; +import java.awt.Rectangle; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import javax.swing.AbstractAction; +import javax.swing.JEditorPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import javax.swing.text.EditorKit; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.Token; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; +import org.openide.awt.ActionID; +import org.openide.awt.ActionRegistration; +import org.openide.filesystems.FileObject; +import org.openide.nodes.Node; +import org.openide.util.Exceptions; +import org.openide.windows.TopComponent; + +/** + * + * @author bhaidu + */ +@ActionID(id = "org.netbeans.modules.php.blade.editor.actions.ViewAntlrLexerTokens", category = "DebugAntlrActions") +@ActionRegistration(displayName = "AntlrLexer Tokens") +public class ViewAntlrLexerTokensAction extends AbstractAction implements ActionListener { + + Node node; + private transient JEditorPane viewer; + + public ViewAntlrLexerTokensAction(Node node) { + this.node = node; + putValue(NAME, "AntlrLexer Tokens"); + } + + @Override + public void actionPerformed(ActionEvent e) { + FileObject fo = node.getLookup().lookup(FileObject.class); + if (fo == null) { + return; + } + AntlrLexerPreviewComponent comp = new AntlrLexerPreviewComponent(fo); + comp.open(); + comp.setVisible(true); + } + + public final class AntlrLexerPreviewComponent extends TopComponent { + + private final FileObject fileObject; + + public AntlrLexerPreviewComponent(FileObject fo) { + this.fileObject = fo; + initComponents(); + } + + @Override + public int getPersistenceType() { + return TopComponent.PERSISTENCE_NEVER; + } + + protected void initComponents() { + setName("Antlr token preview - " + fileObject.getName()); + setLayout(new BorderLayout()); + viewer = new JEditorPane(); + viewer.setContentType("text/plain"); + viewer.setEditable(false); + //viewer.addHyperlinkListener(this::linkHandler); + + JPanel panel = new JPanel(new BorderLayout()); + panel.add(new JScrollPane(viewer), BorderLayout.CENTER); + add(panel); + Rectangle vis = viewer.getVisibleRect(); + try { + CharStream cs = CharStreams.fromString(String.valueOf(fileObject.asText())); + BladeAntlrLexer lexer = new BladeAntlrLexer(cs); + CommonTokenStream tokens = new CommonTokenStream(lexer); + tokens.fill(); + Document doc = viewer.getDocument(); + + // Would be better to create some diff and update the changed elemets + doc.remove(0, doc.getLength()); + StringBuilder result = new StringBuilder(); + + int lastLine = 0; + for (Token token : tokens.getTokens()) { + if (lastLine != token.getLine()) { + lastLine = token.getLine(); + if (lastLine > 1) { + result.append("\n"); + } + result.append("L"); + result.append(lastLine); + result.append(": ").append(lastLine); + } + switch (token.getType()) { + case BLADE_EXPR_LPAREN: + result.append(" '('"); + break; + case BLADE_EXPR_RPAREN: + result.append(" ')'"); + break; + case HTML: + result.append(" (HTML)"); + result.append(token.getText()); + break; + case HTML_COMPONENT_PREFIX: + result.append(" (HTML_COMPONENT_PREFIX)"); + result.append(token.getText()); + break; + case PHP_NEW: + result.append(" (\n)"); + break; + case PHP_EXPRESSION: + result.append(" (PHP_EXPRESSION)"); + result.append(token.getText()); + break; + case PHP_NAMESPACE_PATH: + result.append(" (PHP_NAMESPACE_PATH)"); + result.append(token.getText()); + break; + case PHP_IDENTIFIER: + result.append(" (PHP_IDENTIFIER)"); + result.append(token.getText()); + break; + case PHP_VARIABLE: + result.append(" (PHP_VARIABLE)"); + result.append(token.getText()); + break; + default: + result.append(token.getType()); + if (token.getText().startsWith("@")) { + result.append(" (DIRECTIVE)"); + } + } + if (token.getType() > -1) { + result.append(" | "); + } + } + + EditorKit kit = viewer.getEditorKit(); + Reader reader = new StringReader(result.toString()); + //doc. + kit.read(reader, doc, 0); + viewer.scrollRectToVisible(vis); + } catch (IOException | BadLocationException ex) { + Exceptions.printStackTrace(ex); + } + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java new file mode 100644 index 000000000000..f4fab33a8324 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java @@ -0,0 +1,111 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.cache; + +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * + * @author bogdan + */ +public class QueryCache { + + public static final Long DEFAULT_CACHE_TIMEOUT = 60000L; + + protected Map> cacheMap; + protected Long cacheTimeout; + + //private static final Map QUERY_SUPPORT_INDEX = new WeakHashMap<>(); + + public QueryCache() { + this(DEFAULT_CACHE_TIMEOUT); + } + + public QueryCache(Long cacheTimeout) { + this.cacheTimeout = cacheTimeout; + this.clear(); + } + + public void clean() { + for (K key : this.getExpiredKeys()) { + this.remove(key); + } + } + + public boolean containsKey(K key) { + return this.cacheMap.containsKey(key); + } + + protected Set getExpiredKeys() { + return this.cacheMap.keySet().parallelStream() + .filter(this::isExpired) + .collect(Collectors.toSet()); + } + + protected boolean isExpired(K key) { + LocalDateTime expirationDateTime = this.cacheMap.get(key).getCreatedAt().plus(this.cacheTimeout, ChronoUnit.MILLIS); + return LocalDateTime.now().isAfter(expirationDateTime); + } + + public void clear() { + this.cacheMap = new HashMap<>(); + } + + public Optional get(K key) { + this.clean(); + return Optional.ofNullable(this.cacheMap.get(key)).map(CacheValue::getValue); + } + + public void put(K key, V value) { + this.cacheMap.put(key, this.createCacheValue(value)); + } + + protected CacheValue createCacheValue(V value) { + LocalDateTime now = LocalDateTime.now(); + return new CacheValue() { + @Override + public V getValue() { + return value; + } + + @Override + public LocalDateTime getCreatedAt() { + return now; + } + }; + } + + public void remove(K key) { + this.cacheMap.remove(key); + } + + protected interface CacheValue { + + V getValue(); + + LocalDateTime getCreatedAt(); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java new file mode 100644 index 000000000000..474342ee41e9 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java @@ -0,0 +1,338 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.completion; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.Callable; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.netbeans.editor.BaseDocument; +import javax.swing.text.Document; +import javax.swing.text.JTextComponent; +import org.antlr.v4.runtime.Token; +import org.netbeans.api.project.Project; +import org.netbeans.modules.csl.api.CodeCompletionContext; +import org.netbeans.modules.csl.api.CodeCompletionHandler; +import org.netbeans.modules.csl.api.CodeCompletionHandler2; +import org.netbeans.modules.csl.api.CodeCompletionResult; +import org.netbeans.modules.csl.api.CompletionProposal; +import org.netbeans.modules.csl.api.Documentation; +import org.netbeans.modules.csl.api.ElementHandle; +import org.netbeans.modules.csl.api.ParameterInfo; +import org.netbeans.modules.csl.spi.DefaultCompletionResult; +import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.modules.csl.spi.support.CancelSupport; +import org.netbeans.modules.php.blade.csl.elements.DirectiveElement; +import org.netbeans.modules.php.blade.csl.elements.ElementType; +import org.netbeans.modules.php.blade.csl.elements.NamedElement; +import org.netbeans.modules.php.blade.csl.elements.PhpFunctionElement; +import org.netbeans.modules.php.blade.csl.elements.TagElement; +import org.netbeans.modules.php.blade.editor.completion.BladeCompletionProposal.CompletionRequest; +import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; +import org.netbeans.modules.php.blade.editor.preferences.ModulePreferences; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.netbeans.modules.php.blade.syntax.BladeTags; +import org.netbeans.modules.php.blade.syntax.annotation.Directive; +import org.netbeans.modules.php.blade.syntax.annotation.Tag; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrUtils; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser.CONTENT_TAG_OPEN; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class BladeCompletionHandler implements CodeCompletionHandler2 { + + private static final Logger LOGGER = Logger.getLogger(BladeCompletionHandler.class.getName()); + + @Override + public CodeCompletionResult complete(CodeCompletionContext completionContext) { + if (CancelSupport.getDefault().isCancelled()) { + return CodeCompletionResult.NONE; + } + long startTime = System.currentTimeMillis(); + BaseDocument doc = (BaseDocument) completionContext.getParserResult().getSnapshot().getSource().getDocument(false); + + if (doc == null) { + return CodeCompletionResult.NONE; + } + + int offset = completionContext.getCaretOffset(); + + if (offset < 1) { + return CodeCompletionResult.NONE; + } + + BladeParserResult parserResult = (BladeParserResult) completionContext.getParserResult(); + + final List completionProposals = new ArrayList<>(); + + Token currentToken = BladeAntlrUtils.getToken(doc, offset - 1); + + if (currentToken == null) { + return CodeCompletionResult.NONE; + } + + String prefix = currentToken.getText(); + + if (prefix == null) { + return CodeCompletionResult.NONE; + } + + String tokenText = currentToken.getText(); + FileObject fo = completionContext.getParserResult().getSnapshot().getSource().getFileObject(); + //D_UNKNOWN_ATTR_ENC hack to fix completion not triggered in html embedded text + if (tokenText.startsWith("@") && currentToken.getType() != D_UNKNOWN_ATTR_ENC) { + completeDirectives(completionProposals, completionContext, fo, currentToken); + } else { + if (prefix.length() == 1) { + return CodeCompletionResult.NONE; + } + switch (currentToken.getType()) { + case PHP_IDENTIFIER: + case PHP_NAMESPACE_PATH: + PhpCodeCompletionService.completePhpCode(completionProposals, parserResult, offset, prefix); + break; + case PHP_EXPRESSION: + completePhpSnippet(completionProposals, offset, currentToken); + break; + case PHP_VARIABLE: + completeScopedVariables(completionProposals, completionContext, parserResult, currentToken); + break; + case CONTENT_TAG_OPEN: + case RAW_TAG_OPEN: + //{{ | {!! + if (!ModulePreferences.isAutoTagCompletionEnabled()) { + completeBladeTags(completionProposals, completionContext, currentToken); + } + break; + } + } + + if (completionProposals.isEmpty()) { + return CodeCompletionResult.NONE; + } + + long time = System.currentTimeMillis() - startTime; + if (time > 2000){ + LOGGER.info(String.format("complete() with results took %d ms", time)); + } + return new DefaultCompletionResult(completionProposals, false); + } + + + /** + * proxy completion using the original php code completion service + * + * @param completionProposals + * @param offset + * @param currentToken + */ + private void completePhpSnippet(final List completionProposals, + int offset, Token currentToken) { + PhpCodeCompletionService phpCodeCompletion = new PhpCodeCompletionService(); + for (CompletionProposal proposal : phpCodeCompletion.getCompletionProposal(offset, currentToken)) { + String proposalPrefix = proposal.getInsertPrefix(); + if (proposalPrefix.startsWith(phpCodeCompletion.prefix)) { + completionProposals.add(proposal); + } + } + } + + private void completeScopedVariables(final List completionProposals, + CodeCompletionContext completionContext, BladeParserResult parserResult, Token currentToken) { + String variablePrefix = currentToken.getText(); + Set scopedVariables = parserResult.findLoopVariablesForScope(completionContext.getCaretOffset()); + FileObject fo = completionContext.getParserResult().getSnapshot().getSource().getFileObject(); + + if (scopedVariables != null && !scopedVariables.isEmpty()) { + CompletionRequest request = new CompletionRequest(); + request.anchorOffset = completionContext.getCaretOffset() - variablePrefix.length(); + request.carretOffset = completionContext.getCaretOffset(); + request.prefix = variablePrefix; + if ("$loop".startsWith(variablePrefix)) { + String variableName = "$loop"; + NamedElement variableElement = new NamedElement(variableName, fo, ElementType.VARIABLE); + completionProposals.add(new BladeCompletionProposal.BladeVariableItem(variableElement, request, variableName)); + } + for (String variableName : scopedVariables) { + if (variableName.startsWith(variablePrefix)) { + NamedElement variableElement = new NamedElement(variableName, fo, ElementType.VARIABLE); + completionProposals.add(new BladeCompletionProposal.VariableItem(variableElement, request, variableName)); + } + } + } + } + + /** + * BLADES + * + * @param completionProposals + * @param completionContext + * @param parserResult + * @param currentToken + */ + private void completeBladeTags(final List completionProposals, + CodeCompletionContext completionContext, Token currentToken) { + String tagStart = currentToken.getText(); + + CompletionRequest request = completionRequest(tagStart, completionContext.getCaretOffset()); + BladeTags tagsContainer = new BladeTags(); + Tag[] tags = tagsContainer.getTags(); + for (Tag tag : tags) { + if (tag.openTag().startsWith(tagStart)) { + TagElement tagElement = new TagElement(tag.closeTag()); + completionProposals.add(new BladeCompletionProposal.BladeTag(tagElement, request, tag)); + } + } + } + + private void completeDirectives(final List completionProposals, + CodeCompletionContext completionContext, FileObject fo, Token currentToken) { + String prefix = currentToken.getText(); + DirectiveCompletionList completionList = new DirectiveCompletionList(); + + CompletionRequest request = completionRequest(prefix, completionContext.getCaretOffset()); + + for (Directive directive : completionList.getDirectives()) { + String directiveName = directive.name(); + if (directiveName.startsWith(prefix)) { + DirectiveElement directiveEl = new DirectiveElement(directiveName, fo); + + if (directive.params()) { + completionProposals.add(new BladeCompletionProposal.DirectiveWithArg(directiveEl, request, directive)); + if (!directive.endtag().isEmpty()) { + completionProposals.add(new BladeCompletionProposal.BlockDirectiveWithArg(directiveEl, request, directive)); + } + } else { + + completionProposals.add(new BladeCompletionProposal.InlineDirective(directiveEl, request, directive)); + if (!directive.endtag().isEmpty()) { + completionProposals.add(new BladeCompletionProposal.BlockDirective(directiveEl, request, directive)); + } + } + } + } + + Project project = ProjectUtils.getMainOwner(fo); + CustomDirectives.getInstance(project).filterAction(new CustomDirectives.FilterCallback() { + @Override + public void filterDirectiveName(CustomDirectives.CustomDirective directive, FileObject file) { + DirectiveElement directiveEl = new DirectiveElement(directive.name, file); + if (directive.name.startsWith(prefix)) { + CompletionRequest request = completionRequest(prefix, completionContext.getCaretOffset()); + completionProposals.add( + new BladeCompletionProposal.CustomDirective( + directiveEl, + request, + directive.name + )); + } + } + }); + } + + @Override + public String document(ParserResult pr, ElementHandle eh) { + return null; + } + + @Override + public ElementHandle resolveLink(String string, ElementHandle eh) { + return null; + } + + @Override + public String getPrefix(ParserResult info, int offset, boolean upToOffset) { + return null; + } + + @Override + public CodeCompletionHandler.QueryType getAutoQuery(JTextComponent component, String typedText) { + if (typedText.length() == 0) { + return CodeCompletionHandler.QueryType.NONE; + } + + if (typedText.startsWith("@")) { + return CodeCompletionHandler.QueryType.ALL_COMPLETION; + } + + char lastChar = typedText.charAt(typedText.length() - 1); + + switch (lastChar) { + case '\n': + return CodeCompletionHandler.QueryType.STOP; + default: + return CodeCompletionHandler.QueryType.ALL_COMPLETION; + } + } + + @Override + @SuppressWarnings("rawtypes") + public String resolveTemplateVariable(String string, ParserResult pr, int i, String string1, Map map) { + return null; + } + + @Override + public Set getApplicableTemplates(Document dcmnt, int i, int i1) { + return Collections.emptySet(); + } + + @Override + public ParameterInfo parameters(ParserResult pr, int i, CompletionProposal cp) { + return new ParameterInfo(new ArrayList<>(), 0, 0); + } + + /** + * used also for tooltip in blade mime context + * + * @param parserResult + * @param elementHandle + * @param cancel + * @return + */ + @Override + public Documentation documentElement(ParserResult parserResult, ElementHandle elementHandle, Callable cancel) { + Documentation result = null; + if (elementHandle instanceof PhpFunctionElement) { + return TooltipDoc.generateFunctionDoc((PhpFunctionElement) elementHandle); + } else if (elementHandle instanceof DirectiveElement) { + return result; + } else if (elementHandle instanceof NamedElement) { + return TooltipDoc.generateDoc((NamedElement) elementHandle); + } + return result; + } + + public static CompletionRequest completionRequest(String prefix, int offset) { + CompletionRequest request = new CompletionRequest(); + request.anchorOffset = offset - prefix.length(); + request.carretOffset = offset; + request.prefix = prefix; + + return request; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java new file mode 100644 index 000000000000..563f0a23194c --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java @@ -0,0 +1,381 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.completion; + +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.event.KeyEvent; +import javax.swing.ImageIcon; +import javax.swing.text.BadLocationException; +import javax.swing.text.Caret; +import javax.swing.text.JTextComponent; +import org.netbeans.api.editor.completion.Completion; +import org.netbeans.editor.BaseDocument; +import org.netbeans.lib.editor.codetemplates.api.CodeTemplateManager; +import org.netbeans.modules.php.blade.editor.ResourceUtilities; +import org.netbeans.spi.editor.completion.CompletionItem; +import org.netbeans.spi.editor.completion.CompletionTask; +import org.netbeans.spi.editor.completion.support.CompletionUtilities; +import org.openide.util.ImageUtilities; + +/** + * + * @author bhaidu + */ +public class BladeCompletionItem implements CompletionItem { + + protected static final int DEFAULT_SORT_PRIORITY = 20; + protected int substitutionOffset; + protected String text; + protected boolean shift; + + //----------- Factory methods -------------- + public static BladeCompletionItem createTag(String name, int substitutionOffset) { + return new BladeTag(name, substitutionOffset); + } + + public static BladeCompletionItem createViewPath(String name, + int substitutionOffset, boolean isFolder, String path) { + return new ViewPath(name, substitutionOffset, isFolder, path); + } + + public static BladeCompletionItem createInlineDirective(String directive, + int substitutionOffset, String description) { + return new InlineDirective(directive, substitutionOffset, description); + } + + public static BladeCompletionItem createDirectiveWithArg(String directive, + int substitutionOffset, String description) { + return new DirectiveWithArg(directive, substitutionOffset, description); + } + + public static BladeCompletionItem createBlockDirective(String directive, + String endTag, int substitutionOffset, String description) { + return new BlockDirective(directive, endTag, substitutionOffset, description); + } + + public static BladeCompletionItem createBlockDirectiveWithArg(String directive, + String endTag, int substitutionOffset, String description) { + return new BlockDirectiveWithArg(directive, endTag, substitutionOffset, description); + } + + @Override + public void defaultAction(JTextComponent component) { + if (component != null) { + if (!shift) { + Completion.get().hideDocumentation(); + Completion.get().hideCompletion(); + } + int caretOffset = component.getSelectionEnd(); + int len = caretOffset - substitutionOffset; + if (len >= 0) { + substituteText(component, len); + } + } + } + + @Override + public void processKeyEvent(KeyEvent e) { + shift = (e.getKeyCode() == KeyEvent.VK_ENTER && e.getID() == KeyEvent.KEY_PRESSED && e.isShiftDown()); + } + + @Override + public int getPreferredWidth(Graphics grphcs, Font font) { + return CompletionUtilities.getPreferredWidth(getLeftHtmlText(), getRightHtmlText(), grphcs, font); + } + + protected String getLeftHtmlText() { + return text; + } + + protected String getRightHtmlText() { + return null; + } + + @Override + public void render(Graphics g, Font defaultFont, Color defaultColor, Color backgroundColor, int width, int height, boolean selected) { + CompletionUtilities.renderHtml(getIcon(), getLeftHtmlText(), getRightHtmlText(), g, defaultFont, defaultColor, width, height, selected); + } + + protected ImageIcon getIcon() { + return null; + } + + @Override + public CompletionTask createDocumentationTask() { + return null; + } + + @Override + public CompletionTask createToolTipTask() { + return null; + } + + @Override + public boolean instantSubstitution(JTextComponent component) { + if (component != null) { + try { + int caretOffset = component.getSelectionEnd(); + if (caretOffset > substitutionOffset) { + String currentText = component.getDocument().getText(substitutionOffset, caretOffset - substitutionOffset); + if (!getSubstituteText().startsWith(currentText)) { + return false; + } + } + } catch (BadLocationException ble) { + } + } + defaultAction(component); + return true; + } + + @Override + public int getSortPriority() { + return DEFAULT_SORT_PRIORITY; + } + + @Override + public CharSequence getSortText() { + return getItemText(); + } + + @Override + public CharSequence getInsertPrefix() { + return getItemText(); + } + + protected String getSubstituteText() { + return getItemText(); + } + + public String getItemText() { + return text; + } + + private boolean substituteText(JTextComponent component, int len) { + return substituteText(component, getSubstituteText(), len, 0); + } + + private boolean substituteText(JTextComponent c, final String substituteText, final int len, int moveBack) { + final BaseDocument doc = (BaseDocument) c.getDocument(); + final boolean[] result = new boolean[1]; + result[0] = true; + + doc.runAtomic(new Runnable() { + @Override + public void run() { + try { + //test whether we are trying to insert sg. what is already present in the text + String currentText = doc.getText(substitutionOffset, (doc.getLength() - substitutionOffset) < substituteText.length() ? (doc.getLength() - substitutionOffset) : substituteText.length()); + if (!substituteText.equals(currentText)) { + //remove common part + doc.remove(substitutionOffset, len); + insertString(doc, substitutionOffset, substituteText, c); + } else { + c.setCaretPosition(c.getSelectionEnd() + substituteText.length() - len); + } + } catch (BadLocationException ex) { + result[0] = false; + } + + } + }); + + //format the inserted text + reindent(c); + + if (moveBack != 0) { + Caret caret = c.getCaret(); + int dot = caret.getDot(); + caret.setDot(dot - moveBack); + } + + return result[0]; + } + + protected void insertString(BaseDocument doc, int substitutionOffset, + String substituteText, JTextComponent c) throws BadLocationException { + doc.insertString(substitutionOffset, substituteText, null); + } + + protected void reindent(JTextComponent c) { + + } + + public static class BladeTag extends BladeCompletionItem { + + public BladeTag(String name, int substitutionOffset) { + this.text = name; + this.substitutionOffset = substitutionOffset; + } + } + + public static class InlineDirective extends BladeCompletionItem { + + protected String description; + + public InlineDirective(String directive, int substitutionOffset, + String description) { + this.text = directive; + this.substitutionOffset = substitutionOffset; + this.description = description; + } + + @Override + protected String getRightHtmlText() { + return description; + } + + @Override + protected ImageIcon getIcon() { + String path = ResourceUtilities.ICON_BASE + "icons/at.png";//NOI18N + return ImageUtilities.loadImageIcon(path, false); + } + } + + public static class DirectiveWithArg extends InlineDirective { + + public DirectiveWithArg(String directive, int substitutionOffset, + String description) { + super(directive, substitutionOffset, description); + } + + @Override + protected String getSubstituteText() { + String template = getItemText() + "($$${arg})"; + switch (text){ + case "@include": + case "@extends": + template = getItemText() + "('${path}')"; + break; + } + return template; + } + + @Override + protected String getLeftHtmlText() { + return text + "()"; + } + + @Override + protected void insertString(BaseDocument doc, int substitutionOffset, + String substituteText, JTextComponent ctx) throws BadLocationException { + ctx.setCaretPosition(substitutionOffset); + CodeTemplateManager.get(doc).createTemporary(substituteText).insert(ctx); + } + } + + public static class BlockDirective extends BladeCompletionItem { + + protected String description; + protected String endTag; + + public BlockDirective(String directive, String endTag, int substitutionOffset, + String description) { + this.text = directive; + this.substitutionOffset = substitutionOffset; + this.description = description; + this.endTag = endTag; + } + + @Override + protected String getSubstituteText() { + return getItemText() + "\n${selection}${cursor}\n" + endTag; + } + + @Override + protected String getLeftHtmlText() { + return text + " ... " + endTag; + } + + @Override + protected String getRightHtmlText() { + return description; + } + + @Override + protected ImageIcon getIcon() { + String path = ResourceUtilities.ICON_BASE + "icons/at.png";//NOI18N + return ImageUtilities.loadImageIcon(path, false); + } + + @Override + protected void insertString(BaseDocument doc, int substitutionOffset, + String substituteText, JTextComponent ctx) throws BadLocationException { + ctx.setCaretPosition(substitutionOffset); + CodeTemplateManager.get(doc).createTemporary(substituteText).insert(ctx); + } + } + + public static class BlockDirectiveWithArg extends BlockDirective { + + public BlockDirectiveWithArg(String directive, String endTag, int substitutionOffset, String description) { + super(directive, endTag, substitutionOffset, description); + } + + @Override + protected String getSubstituteText() { + String template = getItemText() + "($$${arg})\n\n${selection}${cursor}\n" + endTag; + + switch (text){ + case "@foreach": + template = getItemText() + "($$${array} as $$${item})\n${selection}${cursor}\n" + endTag; + break; + } + + return template; + } + + @Override + protected String getLeftHtmlText() { + return text + "() ... " + endTag; + } + + } + + public static class ViewPath extends BladeCompletionItem { + + protected boolean isFolder; + protected String filePath; + + public ViewPath(String name, int substitutionOffset, + boolean isFolder, String filePath) { + this.text = name; + this.substitutionOffset = substitutionOffset; + this.isFolder = isFolder; + this.filePath = filePath; + } + + @Override + protected ImageIcon getIcon() { + String path = ResourceUtilities.ICON_BASE + "icons/file.png"; + if (isFolder) { + path = "org/openide/loaders/defaultFolder.gif";//NOI18N + } + return ImageUtilities.loadImageIcon(path, false); + } + + @Override + protected String getRightHtmlText() { + int viewsPos = filePath.indexOf("/views/"); + return filePath.substring(viewsPos, filePath.length()); + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java new file mode 100644 index 000000000000..138798b37af0 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java @@ -0,0 +1,469 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.completion; + +import java.util.Collections; +import java.util.Set; +import javax.swing.ImageIcon; +import org.netbeans.modules.csl.api.CompletionProposal; +import org.netbeans.modules.csl.api.ElementHandle; +import org.netbeans.modules.csl.api.ElementKind; +import org.netbeans.modules.csl.api.HtmlFormatter; +import org.netbeans.modules.csl.api.Modifier; +import org.netbeans.modules.php.blade.csl.elements.ClassElement; +import org.netbeans.modules.php.blade.editor.ResourceUtilities; +import org.netbeans.modules.php.blade.syntax.annotation.Directive; +import org.netbeans.modules.php.blade.syntax.annotation.Tag; + +import org.openide.filesystems.FileObject; +import org.openide.util.ImageUtilities; + +/** + * + * @author bogdan + */ +public class BladeCompletionProposal implements CompletionProposal { + + //@StaticResource + final CompletionRequest request; + protected final ElementHandle element; + final String previewValue; + protected Directive directive; + + public BladeCompletionProposal(ElementHandle element, CompletionRequest request, String previewValue) { + this.element = element; + this.request = request; + this.previewValue = previewValue; + } + + public BladeCompletionProposal(ElementHandle element, CompletionRequest request, Directive directive) { + this.element = element; + this.request = request; + this.previewValue = directive.name(); + this.directive = directive; + } + + @Override + public int getAnchorOffset() { + return request.anchorOffset; + } + + @Override + public ElementHandle getElement() { + return element; + } + + @Override + public String getName() { + return element.getName(); + } + + @Override + public String getSortText() { + return getName(); + } + + @Override + public int getSortPrioOverride() { + return 0; + } + + @Override + public String getLhsHtml(HtmlFormatter formatter) { + formatter.name(getKind(), true); + formatter.appendHtml(""); + formatter.appendHtml(""); + formatter.appendText(previewValue); + formatter.appendHtml(""); + formatter.appendHtml(""); + formatter.name(getKind(), false); + return formatter.getText(); + } + + @Override + public ImageIcon getIcon() { + return null; + } + + @Override + public Set getModifiers() { + return Collections.emptySet(); + } + + @Override + public String getCustomInsertTemplate() { + return null; + } + + @Override + public String getInsertPrefix() { + StringBuilder template = new StringBuilder(); + template.append(getName()); + return template.toString(); + + } + + @Override + public String getRhsHtml(HtmlFormatter formatter) { + FileObject file = null; + if (element != null) { + file = element.getFileObject(); + } + if (file != null) { + formatter.reset(); + formatter.appendText(" "); + formatter.appendText(file.getName()); + } + return formatter.getText(); + } + + @Override + public ElementKind getKind() { + return ElementKind.CONSTRUCTOR; + } + + @Override + public boolean isSmart() { + return true; + } + + public static class PhpElementItem extends BladeCompletionProposal { + + public PhpElementItem(ElementHandle element, CompletionRequest request, String previewValue) { + super(element, request, previewValue); + } + + @Override + public String getRhsHtml(HtmlFormatter formatter) { + FileObject file = null; + if (this.getElement() != null) { + file = this.getElement().getFileObject(); + } + if (file != null) { + formatter.reset(); + formatter.appendText(" "); + formatter.appendText(file.getNameExt()); + } + return formatter.getText(); + } + } + + public static class NamespaceItem extends PhpElementItem { + + public NamespaceItem(ElementHandle element, CompletionRequest request, String previewValue) { + super(element, request, previewValue); + } + + @Override + public ElementKind getKind() { + return ElementKind.PACKAGE; + } + + @Override + public int getSortPrioOverride() { + return -50;//priority + } + } + + public static class DirectiveItem extends BladeCompletionProposal { + + public DirectiveItem(ElementHandle element, CompletionRequest request, String previewValue) { + super(element, request, previewValue); + } + + } + + public static class ClassItem extends PhpElementItem { + + protected String namespace = null; + + public ClassItem(ClassElement element, CompletionRequest request, String previewValue) { + super(element, request, previewValue); + this.namespace = element.getNamespace(); + } + + @Override + public ElementKind getKind() { + return ElementKind.CLASS; + } + + @Override + public String getRhsHtml(HtmlFormatter formatter) { + if (namespace != null && namespace.length() > 0) { + return namespace; + } + return super.getRhsHtml(formatter); + } + + @Override + public int getSortPrioOverride() { + return 10;//priority + } + + @Override + public String getCustomInsertTemplate() { + if (namespace != null && namespace.length() > 0) { + return "\\" + namespace + "\\" + element.getName(); + } + return element.getName(); + } + } + + public static class FunctionItem extends PhpElementItem { + + protected final String namespace; + + public FunctionItem(ElementHandle element, CompletionRequest request, String previewValue) { + super(element, request, previewValue); + this.namespace = null; + } + + public FunctionItem(ElementHandle element, CompletionRequest request, + String namespace, + String previewValue) { + super(element, request, previewValue); + this.namespace = namespace; + } + + @Override + public ElementKind getKind() { + return ElementKind.METHOD; + } + + @Override + public int getSortPrioOverride() { + return 20;//priority + } + + @Override + public String getRhsHtml(HtmlFormatter formatter) { + if (namespace != null && namespace.length() > 0) { + return namespace; + } + return super.getRhsHtml(formatter); + } + + } + + public static class ConstantItem extends PhpElementItem { + + public ConstantItem(ElementHandle element, CompletionRequest request, String previewValue) { + super(element, request, previewValue); + } + + @Override + public ElementKind getKind() { + return ElementKind.CONSTANT; + } + + } + + public static class VariableItem extends BladeCompletionProposal { + + public VariableItem(ElementHandle element, CompletionRequest request, String previewValue) { + super(element, request, previewValue); + } + + @Override + public ElementKind getKind() { + return ElementKind.VARIABLE; + } + + } + + public static class BladeVariableItem extends BladeCompletionProposal { + + public BladeVariableItem(ElementHandle element, CompletionRequest request, String previewValue) { + super(element, request, previewValue); + } + + @Override + public ElementKind getKind() { + return ElementKind.VARIABLE; + } + + @Override + public String getRhsHtml(HtmlFormatter formatter) { + return "blade"; + } + } + + public static class CompletionRequest { + + public int anchorOffset; + public int carretOffset; + public String prefix; + } + + public static class BladeTag extends BladeCompletionProposal { + + protected Tag tag; + + public BladeTag(ElementHandle element, CompletionRequest request, Tag tag) { + super(element, request, ""); + this.tag = tag; + } + + @Override + public String getCustomInsertTemplate() { + return tag.openTag() + " ${cursor} " + tag.closeTag(); + } + + @Override + public String getLhsHtml(HtmlFormatter formatter) { + return tag.openTag() + " " + tag.closeTag(); + } + + @Override + public String getRhsHtml(HtmlFormatter formatter) { + return tag.description(); + } + + @Override + public int getSortPrioOverride() { + return 0; + } + } + + public static class DirectiveProposal extends BladeCompletionProposal { + + public DirectiveProposal(ElementHandle element, CompletionRequest request, Directive directive) { + super(element, request, directive); + } + + public DirectiveProposal(ElementHandle element, CompletionRequest request, String previewValue) { + super(element, request, previewValue); + } + + @Override + public ImageIcon getIcon() { + String path = ResourceUtilities.ICON_BASE + "icons/at.png";//NOI18N + return ImageUtilities.loadImageIcon(path, false); + } + + @Override + public String getRhsHtml(HtmlFormatter formatter) { + if (this.directive == null) { + return null; + } + + if (directive.description().isEmpty() && !this.directive.since().isEmpty()) { + return "v" + this.directive.since(); + } + return this.directive.description(); + } + + } + + public static class CustomDirective extends DirectiveProposal { + + public CustomDirective(ElementHandle element, CompletionRequest request, String preview) { + super(element, request, preview); + } + + @Override + public String getRhsHtml(HtmlFormatter formatter) { + if (this.getElement().getFileObject() != null) { + return this.getElement().getFileObject().getNameExt(); + } + return "custom directive"; + } + + } + + public static class InlineDirective extends DirectiveProposal { + + public InlineDirective(ElementHandle element, CompletionRequest request, Directive directive) { + super(element, request, directive); + } + + } + + public static class DirectiveWithArg extends InlineDirective { + + public DirectiveWithArg(ElementHandle element, CompletionRequest request, Directive directive) { + super(element, request, directive); + } + + @Override + public String getCustomInsertTemplate() { + String template = getName() + "($$${arg})"; + switch (getName()) { + case "@include": + case "@extends": + template = getName() + "('${path}')"; + break; + } + return template; + } + + @Override + public String getLhsHtml(HtmlFormatter formatter) { + return getName() + "()"; + } + } + + public static class BlockDirective extends DirectiveProposal { + + public BlockDirective(ElementHandle element, CompletionRequest request, Directive directive) { + super(element, request, directive); + } + + @Override + public String getLhsHtml(HtmlFormatter formatter) { + return getName() + " ... " + directive.endtag(); + } + + @Override + public String getCustomInsertTemplate() { + return getName() + "\n ${selection} ${cursor}\n" + directive.endtag(); + } + + } + + public static class BlockDirectiveWithArg extends DirectiveProposal { + + public BlockDirectiveWithArg(ElementHandle element, CompletionRequest request, Directive directive) { + super(element, request, directive); + } + + @Override + public String getLhsHtml(HtmlFormatter formatter) { + return getName() + "() ... " + directive.endtag(); + } + + @Override + public String getCustomInsertTemplate() { + String template = getName() + "($$${arg})\n ${cursor}\n" + directive.endtag(); + + switch (getName()) { + case "@foreach": + template = getName() + "($$${array} as $$${item})\n ${selection}${cursor}\n" + directive.endtag(); + break; + case "@section": + case "@session": + template = getName() + "('${id}')\n ${cursor}\n" + directive.endtag(); + break; + } + + return template; + } + + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java new file mode 100644 index 000000000000..89700f37392d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java @@ -0,0 +1,305 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.completion; + +import java.util.Collection; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.text.BadLocationException; +import javax.swing.text.JTextComponent; +import javax.swing.text.Document; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.Token; +import org.netbeans.api.editor.document.EditorDocumentUtils; +import org.netbeans.api.editor.mimelookup.MimeRegistration; +import org.netbeans.api.editor.mimelookup.MimeRegistrations; +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.modules.php.blade.editor.ResourceUtilities; +import org.netbeans.modules.php.blade.editor.completion.BladeCompletionItem.BladeTag; +import org.netbeans.modules.php.blade.editor.components.AttributeCompletionService; +import org.netbeans.modules.php.blade.editor.components.ComponentsCompletionService; +import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; +import org.netbeans.modules.php.blade.editor.directives.CustomDirectives.CustomDirective; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.netbeans.modules.php.blade.syntax.StringUtils; +import org.netbeans.modules.php.blade.syntax.annotation.Directive; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; +import org.netbeans.spi.editor.completion.CompletionItem; +import org.netbeans.spi.editor.completion.CompletionProvider; +import static org.netbeans.spi.editor.completion.CompletionProvider.COMPLETION_QUERY_TYPE; +import org.netbeans.spi.editor.completion.CompletionResultSet; +import org.netbeans.spi.editor.completion.CompletionTask; +import org.netbeans.spi.editor.completion.support.AsyncCompletionQuery; +import org.netbeans.spi.editor.completion.support.AsyncCompletionTask; +import org.netbeans.spi.editor.completion.support.CompletionUtilities; +import org.netbeans.spi.lexer.antlr4.AntlrTokenSequence; +import org.openide.filesystems.FileObject; +import org.openide.util.Exceptions; + +/** + * + * @author bhaidu + */ +@MimeRegistrations(value = { + @MimeRegistration(mimeType = "text/html", service = CompletionProvider.class), + @MimeRegistration(mimeType = "text/x-blade", service = CompletionProvider.class) +}) +public class BladeCompletionProvider implements CompletionProvider { + + private static final Logger LOGGER = Logger.getLogger(BladeCompletionProvider.class.getName()); + + public enum CompletionType { + BLADE_PATH, + YIELD_ID, + DIRECTIVE, + HTML_COMPONENT_TAG + } + + @Override + public CompletionTask createTask(int queryType, JTextComponent component) { + return new AsyncCompletionTask(new BladeCompletionQuery(), component); + } + + @Override + public int getAutoQueryTypes(JTextComponent component, String typedText) { + FileObject fo = EditorDocumentUtils.getFileObject(component.getDocument()); + if (fo == null || !fo.getMIMEType().equals(BladeLanguage.MIME_TYPE)) { + return 0; + } + + if (typedText.length() == 0) { + return 0; + } + + //don't autocomplete on space, \n, ) + if (typedText.trim().isEmpty()) { + //TODO this stops raw tags to autocomplete + return 0; + } + + char lastChar = typedText.charAt(typedText.length() - 1); + switch (lastChar) { + case ')': + case '\n': + case '<': + case '>': + return 0; + } + return COMPLETION_QUERY_TYPE; + } + + private class BladeCompletionQuery extends AsyncCompletionQuery { + + public BladeCompletionQuery() { + } + + @Override + protected void query(CompletionResultSet resultSet, Document doc, int caretOffset) { + long startTime = System.currentTimeMillis(); + + try { + FileObject fo = EditorDocumentUtils.getFileObject(doc); + + if (fo == null || !fo.getMIMEType().equals(BladeLanguage.MIME_TYPE)) { + return; + } + + AntlrTokenSequence tokens; + try { + String docText = doc.getText(0, doc.getLength()); + tokens = new AntlrTokenSequence(new BladeAntlrLexer(CharStreams.fromString(docText))); + } catch (BadLocationException ex) { + Exceptions.printStackTrace(ex); + return; + } finally { + } + + if (tokens.isEmpty()) { + return; + } + + if (caretOffset > 1) { + tokens.seekTo(caretOffset - 1); + } else { + tokens.seekTo(caretOffset); + } + + Token currentToken; + + if (!tokens.hasNext() && tokens.hasPrevious()) { + //the carret got too far + currentToken = tokens.previous().get(); + } else if (tokens.hasNext()) { + currentToken = tokens.next().get(); + } else { + return; + } + + if (currentToken == null) { + return; + } + + if (currentToken.getText().trim().length() == 0) { + return; + } + + switch (currentToken.getType()) { + case HTML_IDENTIFIER: + completeAttributes(currentToken.getText(), caretOffset, resultSet); + break; + case HTML: + String nText = currentToken.getText(); + if ("livewire".startsWith(nText)) { + //quick implementation + //?? + addHtmlTagCompletionItem(nText, "livewire", "livewire", caretOffset, resultSet); + } + break; + case HTML_COMPONENT_PREFIX: + String compPrefix = currentToken.getText().length() > 3 ? StringUtils.kebabToCamel(currentToken.getText().substring(3)) : ""; + completeComponents(compPrefix, fo, caretOffset, resultSet); + break; + case D_UNKNOWN_ATTR_ENC: + completeDirectives(currentToken.getText(), doc, caretOffset, resultSet); + break; + default: + break; + } + } finally { + long time = System.currentTimeMillis() - startTime; + if (time > 2000){ + LOGGER.log(Level.INFO, "Slow completion time detected. {0}ms", time); + } + resultSet.finish(); + } + } + } + + private void completeDirectives(String prefix, Document doc, int carretOffset, CompletionResultSet resultSet) { + int startOffset = carretOffset - prefix.length(); + DirectiveCompletionList completionList = new DirectiveCompletionList(); + + for (Directive directive : completionList.getDirectives()) { + String directiveName = directive.name(); + if (directiveName.startsWith(prefix)) { + if (directive.params()) { + resultSet.addItem(DirectiveCompletionBuilder.itemWithArg( + startOffset, carretOffset, prefix, directiveName, directive.description(), doc)); + if (!directive.endtag().isEmpty()) { + resultSet.addItem(DirectiveCompletionBuilder.itemWithArg( + startOffset, carretOffset, prefix, directiveName, directive.endtag(), directive.description(), doc)); + } + } else { + resultSet.addItem(DirectiveCompletionBuilder.simpleItem( + startOffset, directiveName, directive.description())); + if (!directive.endtag().isEmpty()) { + resultSet.addItem(DirectiveCompletionBuilder.simpleItem( + startOffset, carretOffset, prefix, directiveName, directive.endtag(), directive.description(), doc)); + } + } + + } + } + + FileObject fo = EditorDocumentUtils.getFileObject(doc); + Project project = ProjectUtils.getMainOwner(fo); + + CustomDirectives.getInstance(project).filterAction(new CustomDirectives.FilterCallback() { + @Override + public void filterDirectiveName(CustomDirective customDirective, FileObject file) { + if (customDirective.name.startsWith(prefix)) { + resultSet.addItem(DirectiveCompletionBuilder.itemWithArg( + startOffset, carretOffset, prefix, customDirective.name, + "custom directive", doc, file)); + } + } + }); + } + + private void completeComponents(String prefixIdentifier, FileObject fo, + int caretOffset, CompletionResultSet resultSet) { + + int insertOffset = caretOffset - prefixIdentifier.length(); + ComponentsCompletionService componentComplervice = new ComponentsCompletionService(); + Collection indexedReferences = componentComplervice.queryComponents(prefixIdentifier, fo); + + for (PhpIndexResult indexReference : indexedReferences) { + addComponentIdCompletionItem(indexReference, + insertOffset, resultSet); + } + + } + + private void completeAttributes(String prefix, int caretOffset, CompletionResultSet resultSet) { + int insertOffset = caretOffset; + AttributeCompletionService attributeCompletionService = new AttributeCompletionService(); + Collection attributes = attributeCompletionService.queryComponents(prefix); + + for (String attribute : attributes) { + addSimplAttributeItem(prefix, attribute, insertOffset, resultSet); + } + } + + //?? + private void addHtmlTagCompletionItem(String prefix, String tagName, String plugin, + int caretOffset, CompletionResultSet resultSet) { + + int insertOffset = caretOffset - prefix.length(); + BladeTag item = new BladeTag(tagName, insertOffset); + resultSet.addItem(item); + } + + private void addSimplAttributeItem(String prefix, String attributeName, int caretOffset, CompletionResultSet resultSet) { + int insertOffset = caretOffset - prefix.length(); + CompletionItem item = CompletionUtilities.newCompletionItemBuilder(attributeName) + .startOffset(insertOffset) + .leftHtmlText(attributeName) + .sortPriority(1) + .build(); + resultSet.addItem(item); + } + + private void addComponentIdCompletionItem(PhpIndexResult indexReference, + int caretOffset, CompletionResultSet resultSet) { + + String tagName = StringUtils.toKebabCase(indexReference.name); + CompletionItem item = CompletionUtilities.newCompletionItemBuilder(tagName) + .iconResource(getReferenceIcon(CompletionType.HTML_COMPONENT_TAG)) + .startOffset(caretOffset) + .leftHtmlText(tagName) + .rightHtmlText(indexReference.namespace) + .sortPriority(1) + .build(); + resultSet.addItem(item); + } + + private static String getReferenceIcon(CompletionType type) { + switch (type) { + case HTML_COMPONENT_TAG: + return "org/netbeans/modules/html/custom/resources/custom_html_element.png"; //NOI18N + case YIELD_ID: + return ResourceUtilities.ICON_BASE + "icons/layout.png"; //NOI18N + } + return ResourceUtilities.ICON_BASE + "icons/at.png"; + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java new file mode 100644 index 000000000000..23c541dc059c --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java @@ -0,0 +1,383 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.completion; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.text.BadLocationException; +import javax.swing.text.JTextComponent; +import javax.swing.text.Document; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.Token; +import org.netbeans.api.editor.document.EditorDocumentUtils; +import org.netbeans.api.editor.mimelookup.MimeRegistration; +import org.netbeans.api.editor.mimelookup.MimeRegistrations; +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.modules.php.blade.editor.EditorStringUtils; +import org.netbeans.modules.php.blade.editor.ResourceUtilities; +import org.netbeans.modules.php.blade.editor.indexing.BladeIndex; +import org.netbeans.modules.php.blade.editor.indexing.BladeIndex.IndexedReferenceId; +import org.netbeans.modules.php.blade.editor.path.BladePathUtils; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrUtils; +import org.netbeans.spi.editor.completion.CompletionItem; +import org.netbeans.spi.editor.completion.CompletionProvider; +import org.netbeans.spi.editor.completion.CompletionResultSet; +import org.netbeans.spi.editor.completion.CompletionTask; +import org.netbeans.spi.editor.completion.support.AsyncCompletionQuery; +import org.netbeans.spi.editor.completion.support.AsyncCompletionTask; +import org.netbeans.spi.editor.completion.support.CompletionUtilities; +import org.netbeans.spi.lexer.antlr4.AntlrTokenSequence; +import org.openide.filesystems.FileObject; +import org.openide.util.Exceptions; + +/** + * + * @author bhaidu + */ +@MimeRegistrations(value = { + @MimeRegistration(mimeType = "text/x-php5", service = CompletionProvider.class, position = 102), // @MimeRegistration(mimeType = "text/x-blade", service = CompletionProvider.class, position = 105), +} +) +public class BladePhpCompletionProvider implements CompletionProvider { + + private static final Logger LOGGER = Logger.getLogger(BladePhpCompletionProvider.class.getName()); + public static final String JS_ASSET_FOLDER = "resources/js"; + public static final String CSS_ASSET_FOLDER = "resources/css"; + + public enum CompletionType { + BLADE_PATH, + YIELD_ID, + DIRECTIVE, + HTML_COMPONENT_TAG, + FOLDER, + CSS_FILE, + JS_FILE + } + + @Override + public CompletionTask createTask(int queryType, JTextComponent component) { + return new AsyncCompletionTask(new BladeCompletionQuery(), component); + } + + @Override + public int getAutoQueryTypes(JTextComponent component, String typedText) { + FileObject fo = EditorDocumentUtils.getFileObject(component.getDocument()); + if (fo == null || !fo.getMIMEType().equals(BladeLanguage.MIME_TYPE)) { + return 0; + } + + if (typedText.length() == 0) { + return 0; + } + + //don't autocomplete on space, \n, ) + if (typedText.trim().isEmpty()) { + return 0; + } + + char lastChar = typedText.charAt(typedText.length() - 1); + switch (lastChar) { + case ')': + case '\n': + case '<': + case '>': + return 0; + } + + return COMPLETION_QUERY_TYPE; + } + + private class BladeCompletionQuery extends AsyncCompletionQuery { + + public BladeCompletionQuery() { + } + + @Override + protected void query(CompletionResultSet resultSet, Document doc, int caretOffset) { + long startTime = System.currentTimeMillis(); + doQuery(resultSet, doc, caretOffset); + long time = System.currentTimeMillis() - startTime; + if (time > 2000) { + LOGGER.log(Level.INFO, "Slow completion time detected. {0}ms", time); + } + resultSet.finish(); + } + } + + private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffset) { + FileObject fo = EditorDocumentUtils.getFileObject(doc); + + if (fo == null || !fo.getMIMEType().equals(BladeLanguage.MIME_TYPE)) { + return; + } + + AntlrTokenSequence tokens; + try { + String docText = doc.getText(0, doc.getLength()); + tokens = new AntlrTokenSequence(new BladeAntlrLexer(CharStreams.fromString(docText))); + } catch (BadLocationException ex) { + Exceptions.printStackTrace(ex); + return; + } + + if (tokens.isEmpty()) { + return; + } + + if (caretOffset > 1) { + tokens.seekTo(caretOffset - 1); + } else { + tokens.seekTo(caretOffset); + } + + Token currentToken; + + if (!tokens.hasNext() && tokens.hasPrevious()) { + //the carret got too far + currentToken = tokens.previous().get(); + } else if (tokens.hasNext()) { + currentToken = tokens.next().get(); + } else { + return; + } + + if (currentToken == null) { + return; + } + + if (currentToken.getText().trim().length() == 0) { + return; + } + + switch (currentToken.getType()) { + case BL_PARAM_STRING: { + String pathName = EditorStringUtils.stripSurroundingQuotes(currentToken.getText()); + List tokensMatch = Arrays.asList(new Integer[]{ + D_EXTENDS, D_INCLUDE, D_SECTION, D_HAS_SECTION, + D_INCLUDE_IF, D_INCLUDE_WHEN, D_INCLUDE_UNLESS, D_INCLUDE_FIRST, + D_EACH, D_PUSH, D_PUSH_IF, D_PREPEND + }); + + List tokensStop = Arrays.asList(new Integer[]{HTML, BL_COMMA, BL_PARAM_CONCAT_OPERATOR}); + Token directiveToken = BladeAntlrUtils.findBackward(tokens, tokensMatch, tokensStop); + if (directiveToken == null) { + break; + } + switch (directiveToken.getType()) { + case D_EXTENDS: + case D_INCLUDE: + case D_INCLUDE_IF: + case D_INCLUDE_WHEN: + case D_INCLUDE_UNLESS: + case D_EACH: + int lastDotPos; + + if (pathName.endsWith(".")) { + lastDotPos = pathName.length(); + } else { + lastDotPos = pathName.lastIndexOf("."); + } + int pathOffset; + + if (lastDotPos > 0) { + int dotFix = pathName.endsWith(".") ? 0 : 1; + pathOffset = caretOffset - pathName.length() + lastDotPos + dotFix; + } else { + pathOffset = caretOffset - pathName.length(); + } + List childrenFiles = BladePathUtils.getParentChildrenFromPrefixPath(fo, pathName); + for (FileObject file : childrenFiles) { + String pathFileName = file.getName(); + if (!file.isFolder()) { + pathFileName = pathFileName.replace(".blade", ""); + } + completeBladePath(pathFileName, file, pathOffset, resultSet); + } + return; + case D_SECTION: + case D_HAS_SECTION: + completeYieldIdFromIndex(pathName, fo, caretOffset, resultSet); + break; + case D_PUSH: + case D_PUSH_IF: + case D_PREPEND: + completeStackIdFromIndex(pathName, fo, caretOffset, resultSet); + break; + } + break; + } + case EXPR_STRING: { + String pathName = EditorStringUtils.stripSurroundingQuotes(currentToken.getText()); + + if (!pathName.contains("resources")) { + if (!"resources".startsWith(pathName)) { + break; + } + } + + int lastSlash = pathName.lastIndexOf("/"); + + FileObject projectDir = ProjectUtils.getProjectDirectory(fo); + + if (projectDir == null) { + break; + } + + int pathOffset = caretOffset - pathName.length(); + //laravel framework + if (lastSlash < 0) { + String jsDirRoot = JS_ASSET_FOLDER; + FileObject jsFolder = projectDir.getFileObject(JS_ASSET_FOLDER); + addAssetPathCompletionItem(jsDirRoot, jsFolder.getPath(), pathOffset, resultSet, CompletionType.FOLDER); + String cssDirRoot = CSS_ASSET_FOLDER; + FileObject cssFolder = projectDir.getFileObject(CSS_ASSET_FOLDER); + addAssetPathCompletionItem(cssDirRoot, cssFolder.getPath(), pathOffset, resultSet, CompletionType.FOLDER); + break; + } + + boolean isJsPath = JS_ASSET_FOLDER.startsWith(pathName) || pathName.startsWith(JS_ASSET_FOLDER); + boolean isCssPath = CSS_ASSET_FOLDER.startsWith(pathName) || pathName.startsWith(CSS_ASSET_FOLDER); + + if (isJsPath) { + FileObject jsFolder = projectDir.getFileObject(JS_ASSET_FOLDER); + if (jsFolder == null || !jsFolder.isValid()) { + break; + } + for (FileObject file : jsFolder.getChildren()) { + String jsPath = JS_ASSET_FOLDER + "/" + file.getNameExt(); + if (jsPath.startsWith(pathName)) { + addAssetPathCompletionItem(jsPath, file.getPath(), pathOffset, resultSet, CompletionType.JS_FILE); + } + } + break; + } + if (isCssPath) { + FileObject cssFolder = projectDir.getFileObject(CSS_ASSET_FOLDER); + if (cssFolder == null || !cssFolder.isValid()) { + break; + } + for (FileObject file : cssFolder.getChildren()) { + String jsPath = CSS_ASSET_FOLDER + "/" + file.getNameExt(); + if (jsPath.startsWith(pathName)) { + addAssetPathCompletionItem(jsPath, file.getPath(), pathOffset, resultSet, CompletionType.CSS_FILE); + } + } + break; + } + break; + } + default: + break; + } + } + + private void completeYieldIdFromIndex(String prefixIdentifier, FileObject fo, + int caretOffset, CompletionResultSet resultSet) { + BladeIndex bladeIndex; + Project project = ProjectUtils.getMainOwner(fo); + int insertOffset = caretOffset - prefixIdentifier.length(); + try { + bladeIndex = BladeIndex.get(project); + List indexedReferences = bladeIndex.queryYieldIds(prefixIdentifier); + for (IndexedReferenceId indexReference : indexedReferences) { + addYieldIdCompletionItem(indexReference.getIdenfiier(), indexReference.getOriginFile(), + insertOffset, resultSet); + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + } + + private void completeStackIdFromIndex(String prefixIdentifier, FileObject fo, + int caretOffset, CompletionResultSet resultSet) { + BladeIndex bladeIndex; + Project project = ProjectUtils.getMainOwner(fo); + int insertOffset = caretOffset - prefixIdentifier.length(); + try { + bladeIndex = BladeIndex.get(project); + List indexedReferences = bladeIndex.queryStacksIndexedReferences(prefixIdentifier); + for (IndexedReferenceId indexReference : indexedReferences) { + addYieldIdCompletionItem(indexReference.getIdenfiier(), indexReference.getOriginFile(), + insertOffset, resultSet); + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + } + + private void completeBladePath(String bladePath, FileObject originFile, + int caretOffset, CompletionResultSet resultSet) { + + String filePath = originFile.getPath(); + + BladeCompletionItem item = BladeCompletionItem.createViewPath( + bladePath, caretOffset, originFile.isFolder(), filePath); + resultSet.addItem(item); + } + + private void addYieldIdCompletionItem(String identifier, FileObject fo, + int caretOffset, CompletionResultSet resultSet) { + + String filePath = fo.getPath(); + int viewsPos = filePath.indexOf("/views/"); + + CompletionItem item = CompletionUtilities.newCompletionItemBuilder(identifier) + .iconResource(getReferenceIcon(CompletionType.YIELD_ID)) + .startOffset(caretOffset) + .leftHtmlText(identifier) + .rightHtmlText(filePath.substring(viewsPos, filePath.length())) + .sortPriority(1) + .build(); + resultSet.addItem(item); + } + + private void addAssetPathCompletionItem(String preview, String info, + int caretOffset, CompletionResultSet resultSet, CompletionType type) { + CompletionItem item = CompletionUtilities.newCompletionItemBuilder(preview) + .iconResource(getReferenceIcon(type)) + .startOffset(caretOffset) + .leftHtmlText(preview) + .rightHtmlText(info) + .sortPriority(1) + .build(); + resultSet.addItem(item); + } + + private static String getReferenceIcon(CompletionType type) { + + switch (type) { + case FOLDER: + return "org/openide/loaders/defaultFolder.gif"; + case CSS_FILE: + return "org/netbeans/modules/css/visual/resources/style_sheet_16.png"; + case JS_FILE: + return "org/netbeans/modules/javascript2/editor/resources/javascript.png"; + } + return ResourceUtilities.ICON_BASE + "icons/layout.png"; //NOI18N + + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionBuilder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionBuilder.java new file mode 100644 index 000000000000..c73236b032b3 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionBuilder.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.completion; + +import javax.swing.text.Document; +import org.netbeans.spi.editor.completion.CompletionItem; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class DirectiveCompletionBuilder { + + public static CompletionItem simpleItem(int startOffset, String directive, + String description) { + + return BladeCompletionItem.createInlineDirective(directive, startOffset, description); + } + + public static CompletionItem simpleItem(int startOffset, int carretOffset, + String prefix, String directive, String endtag, + String description, Document doc) { + + return BladeCompletionItem.createBlockDirective( + directive, endtag, startOffset, description); + } + + public static CompletionItem itemWithArg(int startOffset, int carretOffset, + String prefix, String directive, + String description, Document doc) { + + return BladeCompletionItem.createDirectiveWithArg(directive, startOffset, description); + } + + public static CompletionItem itemWithArg(int startOffset, int carretOffset, + String prefix, String directive, String endtag, + String description, Document doc) { + + return BladeCompletionItem.createBlockDirectiveWithArg( + directive, endtag, startOffset, description); + } + + public static CompletionItem itemWithArg(int startOffset, int carretOffset, + String prefix, String directive, + String description, Document doc, + FileObject file) { + return BladeCompletionItem.createDirectiveWithArg(directive, startOffset, description); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionList.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionList.java new file mode 100644 index 000000000000..3ac0ae5cdb8c --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionList.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.completion; + +import org.netbeans.modules.php.blade.syntax.DirectivesList; +import org.netbeans.modules.php.blade.syntax.annotation.Directive; + +public final class DirectiveCompletionList { + + public Directive[] getDirectives() { + DirectivesList listClass = new DirectivesList(); + return listClass.getDirectives(); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionContext.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionContext.java new file mode 100644 index 000000000000..2fd4d6f5ae1a --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionContext.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.completion; + +import org.netbeans.modules.csl.api.CodeCompletionContext; +import org.netbeans.modules.csl.api.CodeCompletionHandler; +import org.netbeans.modules.csl.spi.ParserResult; + +/** + * used to trigger php.editor package completion flow + * + * @author bhaidu + */ +public class PhpCodeCompletionContext { + + public static CodeCompletionContext completionContext(int carretOffset, + ParserResult phpParserResult, + String phpPrefix) { + return new CodeCompletionContext() { + @Override + public int getCaretOffset() { + //the offset should be taken from compiler + return carretOffset; + } + + @Override + public ParserResult getParserResult() { + return phpParserResult; + } + + @Override + public String getPrefix() { + return phpPrefix; + } + + @Override + public boolean isPrefixMatch() { + return true; + } + + @Override + public CodeCompletionHandler.QueryType getQueryType() { + return CodeCompletionHandler.QueryType.COMPLETION; + } + + @Override + public boolean isCaseSensitive() { + return true; + } + }; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java new file mode 100644 index 000000000000..c8458a073ba0 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java @@ -0,0 +1,323 @@ +package org.netbeans.modules.php.blade.editor.completion; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import org.antlr.v4.runtime.Token; +import org.netbeans.api.project.Project; +import org.netbeans.modules.csl.api.CodeCompletionContext; +import org.netbeans.modules.csl.api.CodeCompletionHandler; +import org.netbeans.modules.csl.api.CodeCompletionResult; +import org.netbeans.modules.csl.api.CompletionProposal; +import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.modules.parsing.spi.indexing.support.QuerySupport; +import org.netbeans.modules.php.blade.csl.elements.ClassElement; +import org.netbeans.modules.php.blade.csl.elements.ElementType; +import org.netbeans.modules.php.blade.csl.elements.NamedElement; +import static org.netbeans.modules.php.blade.editor.completion.BladeCompletionHandler.completionRequest; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexFunctionResult; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; +import static org.netbeans.modules.php.blade.editor.parser.BladeParserResult.ReferenceType.PHP_CLASS; +import static org.netbeans.modules.php.blade.editor.parser.BladeParserResult.ReferenceType.PHP_CONSTANT; +import static org.netbeans.modules.php.blade.editor.parser.BladeParserResult.ReferenceType.PHP_NAMESPACE_PATH_TYPE; +import org.netbeans.modules.php.blade.editor.parser.ParsingUtils; +import org.netbeans.modules.php.editor.csl.PHPLanguage; +import org.netbeans.spi.project.ui.support.ProjectConvertors; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class PhpCodeCompletionService { + + public String prefix = ""; + + public List getCompletionProposal(int offset, Token currentToken) { + List proposals = new ArrayList<>(); + String phpSnippet = currentToken.getText(); + String phpStart = " completionProposals, + BladeParserResult parserResult, + int offset, String prefix) { + BladeParserResult.FieldAccessReference fieldAccessReference = parserResult.findFieldAccessRefrence(offset); + + FileObject fo = parserResult.getSnapshot().getSource().getFileObject(); + + if (fieldAccessReference != null) { + completeClassConstants(prefix, fieldAccessReference.ownerClass.identifier, offset, completionProposals, fo); + completeClassMethods(prefix, fieldAccessReference, offset, completionProposals, fo); + return; + } + + //based on ParserResult implementation + //inside tag {{ }} and inside directive expression differences + BladeParserResult.Reference elementReference = parserResult.findOccuredRefrence(offset); + + if (elementReference == null) { + completeNamespace(prefix, offset, completionProposals, fo); + completePhpClasses(prefix, offset, completionProposals, fo); + completePhpFunctions(prefix, offset, completionProposals, fo); + completeConstants(prefix, offset, completionProposals, fo); + return; + } + + switch (elementReference.type) { + case PHP_CONSTANT: + case PHP_CLASS: + completeNamespace(prefix, offset, completionProposals, fo); + completePhpClasses(prefix, offset, completionProposals, fo); + completeConstants(prefix, offset, completionProposals, fo); + break; + case PHP_NAMESPACE_PATH_TYPE: + String prefixNamespace = elementReference.namespace != null ? elementReference.namespace + prefix : prefix; + completeNamespace(prefixNamespace, offset, completionProposals, fo); + + //we are after '\[a-z]' + if (elementReference.namespace != null) { + String classQuery = prefix; + String namespace = elementReference.namespace; + int substringStartOffset = namespace.startsWith("\\") ? 1 : 0; + String namespacePath = namespace.substring(substringStartOffset) + classQuery; + Collection indexedNamespaces = PhpIndexUtils.queryNamespaces( + fo, namespacePath, QuerySupport.Kind.PREFIX + ); + BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + + for (PhpIndexResult indexResult : indexedNamespaces) { + completionProposals.add(new BladeCompletionProposal.NamespaceItem( + namespaceElement(indexResult), request, indexResult.name)); + } + } else if (prefix.endsWith("\\")) { + //the identifier is the namespace + int substringOffset = elementReference.identifier.startsWith("\\") ? 1 : 0; + String namespacePath = elementReference.identifier.substring(substringOffset, elementReference.identifier.length() - 1); + Collection indexClassResults = PhpIndexUtils.queryAllNamespaceClasses(fo, namespacePath); + BladeCompletionProposal.CompletionRequest request = completionRequest(namespacePath, offset + namespacePath.length()); + for (PhpIndexResult indexResult : indexClassResults) { + completionProposals.add(new BladeCompletionProposal.ClassItem(classElement(indexResult), request, indexResult.name)); + } + //completeNamespacedPhpClasses("", namespace, offset, completionProposals, parserResult); + } + break; + } + } + + private static void completePhpClasses(String prefix, int offset, + final List completionProposals, + FileObject fo) + { + + Collection indexClassResults = PhpIndexUtils.queryClass(fo, prefix); + + if (indexClassResults.isEmpty()) { + return; + } + BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + + for (PhpIndexResult indexResult : indexClassResults) { + completionProposals.add(new BladeCompletionProposal.ClassItem( + classElement(indexResult), request, indexResult.name)); + } + } + + private static void completePhpFunctions(String prefix, int offset, + final List completionProposals, + FileObject fo) { + Collection indexedFunctions = PhpIndexUtils.queryFunctions( + fo, prefix); + if (indexedFunctions.isEmpty()) { + return; + } + BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + for (PhpIndexFunctionResult indexResult : indexedFunctions) { + //to be completed + //might add syntax completion cursor + String preview = indexResult.name + indexResult.getParamsAsString(); + completionProposals.add(new BladeCompletionProposal.FunctionItem( + functionElement(indexResult), + request, + preview) + ); + } + } + + /** + * Warning this doesn't check access permission (private, protected) + * + * @param prefix + * @param fieldAccessReference + * @param offset + * @param completionProposals + * @param fo + */ + private static void completeClassMethods(String prefix, BladeParserResult.FieldAccessReference fieldAccessReference, + int offset, + final List completionProposals, + FileObject fo) { + Collection indexedFunctions = PhpIndexUtils.queryClassMethods( + fo, prefix, fieldAccessReference.ownerClass.identifier, + fieldAccessReference.ownerClass.namespace); + if (indexedFunctions.isEmpty()) { + return; + } + + BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + + for (PhpIndexFunctionResult indexResult : indexedFunctions) { + //to be completed + //might add syntax completion cursor + String preview = indexResult.name + indexResult.getParamsAsString(); + completionProposals.add(new BladeCompletionProposal.FunctionItem( + functionElement(indexResult), + request, + indexResult.getClassNamespace(), + preview) + ); + } + } + + private static void completeNamespace(String prefix, int offset, + final List completionProposals, + FileObject fo) { + + if (!prefix.startsWith("\\") && !Character.isUpperCase(prefix.charAt(0))) { + //skip lowercase string from namespce search + return; + } + + //TODO check if this really matters + Project projectOwner = ProjectConvertors.getNonConvertorOwner(fo); + if (projectOwner == null) { + return; + } + int substringOffset = prefix.startsWith("\\") ? 1 : 0; + Collection indexClassResults = PhpIndexUtils.queryNamespace( + projectOwner.getProjectDirectory(), prefix.substring(substringOffset) + ); + if (indexClassResults.isEmpty()) { + return; + } + + BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset + substringOffset); + + for (PhpIndexResult indexResult : indexClassResults) { + completionProposals.add(new BladeCompletionProposal.NamespaceItem( + namespaceElement(indexResult), request, indexResult.name)); + } + } + + private static void completeConstants(String prefix, int offset, + final List completionProposals, + FileObject fo) + { + Collection indexClassResults = PhpIndexUtils.queryConstants(fo, prefix); + + //treat only uppercase strings + if (!Character.isUpperCase(prefix.charAt(0))){ + return; + } + + if (indexClassResults.isEmpty()) { + return; + } + + BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + + for (PhpIndexResult indexResult : indexClassResults) { + completionProposals.add(new BladeCompletionProposal.ConstantItem( + constantElement(indexResult), request, indexResult.name)); + } + } + + private static void completeClassConstants(String prefix, String ownerClass, int offset, + final List completionProposals, + FileObject fo) { + + Collection indexClassResults = PhpIndexUtils.queryClassConstants( + fo, prefix, ownerClass); + + //treat only uppercase strings + if (!Character.isUpperCase(prefix.charAt(0))){ + return; + } + + if (indexClassResults.isEmpty()) { + return; + } + + BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + + for (PhpIndexResult indexResult : indexClassResults) { + completionProposals.add(new BladeCompletionProposal.ConstantItem( + constantElement(indexResult), request, indexResult.name)); + } + } + + //TODO might move in a factory for NamedElement + + private static ClassElement classElement(PhpIndexResult indexResult) { + return new ClassElement(indexResult.name, + indexResult.namespace, + indexResult.declarationFile); + } + + private static NamedElement namespaceElement(PhpIndexResult indexResult) { + return namedElement(indexResult, ElementType.PHP_NAMESPACE); + } + + private static NamedElement functionElement(PhpIndexResult indexResult) { + String inputString = indexResult.name + "()"; + return namedElement(inputString, indexResult, ElementType.PHP_FUNCTION); + } + + private static NamedElement constantElement(PhpIndexResult indexResult) { + return namedElement(indexResult, ElementType.PHP_CONSTANT); + } + + private static NamedElement namedElement(PhpIndexResult indexResult, ElementType type) { + return new NamedElement(indexResult.name, indexResult.declarationFile, type); + } + + private static NamedElement namedElement(String preview, PhpIndexResult indexResult, ElementType type) { + return new NamedElement(preview, indexResult.declarationFile, type); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/TooltipDoc.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/TooltipDoc.java new file mode 100644 index 000000000000..e55f0b8714d8 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/TooltipDoc.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.completion; + +import org.netbeans.modules.csl.api.Documentation; +import org.netbeans.modules.php.blade.csl.elements.NamedElement; +import org.netbeans.modules.php.blade.csl.elements.PhpFunctionElement; +import org.netbeans.modules.php.blade.editor.path.BladePathUtils; + +/** + * @TODO update doc representation + * + * @author bogdan + */ +public class TooltipDoc { + + public static Documentation generateDoc(NamedElement elementHandle) { + Documentation result = null; + switch (elementHandle.getType()) { + case PATH: + String filePath = ""; + if (elementHandle.getFileObject() != null){ + filePath = BladePathUtils.getRelativeProjectPath(elementHandle.getFileObject()); + } + return Documentation.create(String.format("
%s
", "blade path") + + "
" + filePath + "
", null); + case CUSTOM_DIRECTIVE: + String docInfo = String.format("
%s
", "custom directive") + + "
" + elementHandle.getFileObject().getNameExt() + "
"; + return Documentation.create(docInfo, null); + } + + return result; + } + + public static Documentation generateFunctionDoc(PhpFunctionElement elementHandle) { + String info = "
" + elementHandle.getName() + elementHandle.getParamsAsString() + "
"; + if (elementHandle.namespace != null){ + info += "
" + elementHandle.namespace + "
"; + } + info += "
" + elementHandle.getFileObject().getNameExt() + "
"; + info += String.format("
%s
", "php function"); + return Documentation.create(info, null); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java new file mode 100644 index 000000000000..499042ed1753 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.components; + +import java.util.ArrayList; +import java.util.Collection; +import org.netbeans.modules.php.blade.editor.components.annotation.Attribute; +import org.netbeans.modules.php.blade.editor.components.annotation.AttributeRegister; + +/** + * + * @author bhaidu + */ +@AttributeRegister({ + @Attribute(name = "class"), + @Attribute(name = "id"), + @Attribute(name = "title"), +}) +public class AttributeCompletionService { + + public Collection queryComponents(String prefix) { + Collection results = new ArrayList<>(); + + for (Attribute attrName : getAttributes()) { + if (attrName.name().startsWith(prefix)){ + results.add(attrName.name()); + } + } + + return results; + } + + public Attribute[] getAttributes() { + AttributeRegister attributeRegister = this.getClass().getAnnotation(AttributeRegister.class); + return attributeRegister.value(); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentElement.java new file mode 100644 index 000000000000..fa9628c37714 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentElement.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.components; + +import java.util.HashSet; +import java.util.Set; + +/** + * TO use in implementation with ComponentModel + * + * @author bhaidu + */ +public class ComponentElement { + public String name; + public String qualifiedClassName; + + public Set properties = new HashSet<>(); +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentModel.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentModel.java new file mode 100644 index 000000000000..32aa0b7b9ec9 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentModel.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.components; + +import java.util.Map; +import java.util.WeakHashMap; +import org.netbeans.api.project.Project; +import org.netbeans.spi.project.ui.support.ProjectConvertors; +import org.openide.filesystems.FileObject; + +/** + * TO BE CONTINUED + * + * @author bhaidu + */ +public class ComponentModel { + + private static final Map MODEL_INSTANCE = new WeakHashMap<>(); + + protected static ComponentModel getModel(FileObject fo, String prefix) { + ComponentModel selfModel = new ComponentModel(); + Project projectOwner = ProjectConvertors.getNonConvertorOwner(fo); + if (projectOwner == null) { + return null; + } + int pathHash = projectOwner.getProjectDirectory().toString().hashCode(); + if (ComponentModel.MODEL_INSTANCE.containsKey(pathHash)) { + selfModel = MODEL_INSTANCE.get(pathHash); + + } else { + MODEL_INSTANCE.put(pathHash, selfModel); + } + return selfModel; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java new file mode 100644 index 000000000000..39ba9ef68b4d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.components; + +import org.netbeans.modules.php.blade.editor.components.annotation.NamespaceRegister; +import org.netbeans.modules.php.blade.editor.components.annotation.Namespace; +import java.util.ArrayList; +import java.util.Collection; +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.openide.filesystems.FileObject; + +/** + * most frequently used plugins for laravel + * + * @author bhaidu + */ +@NamespaceRegister({ + @Namespace(path = "App\\View\\Components", from_app=true, relativeFilePath="app/View/Components"), + @Namespace(path = "App\\Http\\Livewire", from_app=true, relativeFilePath="app/Http/Livewire"), + @Namespace(path = "App\\Livewire", from_app=true, relativeFilePath="app/Livewire"),//from 10 + @Namespace(path = "Illuminate\\Console\\View\\Components"), + @Namespace(path = "BladeUIKit\\Components\\Buttons", packageName="blade-ui-kit/blade-ui-kit"), + @Namespace(path = "BladeUIKit\\Components\\Layouts", packageName="blade-ui-kit/blade-ui-kit"), + @Namespace(path = "BladeUIKit\\Components\\Forms\\Inputs", packageName="blade-ui-kit/blade-ui-kit"), +}) +public class ComponentsCompletionService { + + public Collection queryComponents(String prefix, FileObject fo) { + Collection results = new ArrayList<>(); + Project project = ProjectUtils.getMainOwner(fo); + for (Namespace namespace : getNamespaces()){ + if (namespace.from_app()){ + //check if folder exists + if (project.getProjectDirectory().getFileObject(namespace.relativeFilePath()) == null){ + continue; + } + } + results.addAll(PhpIndexUtils.queryNamespaceClassesName(prefix, namespace.path(), fo)); + } + + return results; + } + + public Namespace[] getNamespaces() { + NamespaceRegister namespaceRegister = this.getClass().getAnnotation(NamespaceRegister.class); + return namespaceRegister.value(); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Attribute.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Attribute.java new file mode 100644 index 000000000000..a8cde3f03713 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Attribute.java @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.components.annotation; + +/** + * + * @author bhaidu + */ +public @interface Attribute { + String name(); +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/AttributeRegister.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/AttributeRegister.java new file mode 100644 index 000000000000..9090bb74be54 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/AttributeRegister.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.components.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * + * @author bhaidu + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(value = {ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PACKAGE}) +public @interface AttributeRegister { + public Attribute[] value(); +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java new file mode 100644 index 000000000000..dff6931bb05a --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.components.annotation; + +/** + * + * @author bhaidu + */ +public @interface Namespace { + String path(); + String relativeFilePath() default ""; + String packageName() default "blade"; + //inside App folder + boolean from_app() default false; + boolean from_vendor() default true; +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/NamespaceRegister.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/NamespaceRegister.java new file mode 100644 index 000000000000..2cc4cf16cfbc --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/NamespaceRegister.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.components.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * + * @author bhaidu + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(value = {ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PACKAGE}) +public @interface NamespaceRegister { + public Namespace[] value(); +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java new file mode 100644 index 000000000000..13c01e4e9351 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.declaration; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Map; +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.editor.components.annotation.Namespace; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; +import org.netbeans.modules.php.blade.project.ComponentsSupport; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class ComponentDeclarationService { + + public Collection queryComponents(String prefix, FileObject fo) { + Collection results = new ArrayList<>(); + Project project = ProjectUtils.getMainOwner(fo); + + if (project == null) { + return results; + } + + ComponentsSupport componentSupport = ComponentsSupport.getInstance(project); + + if (!componentSupport.isScanned()){ + componentSupport.scanForInstalledComponents(); + } + + for (Map.Entry namespace : componentSupport.getInstalledComponentNamespace().entrySet()) { + results.addAll(PhpIndexUtils.queryComponentClass(prefix, namespace.getValue().path(), fo)); + } + + return results; + } + + public FileObject getComponentResourceFile(String componentId, String classQualifiedName, FileObject sourceFo) { + if (classQualifiedName.toLowerCase().contains("livewire")){ + return getLivewireComponentResourceFile(componentId, sourceFo); + } + + return null; + } + + public FileObject getLivewireComponentResourceFile(String componentId, FileObject sourceFo) { + Project project = ProjectUtils.getMainOwner(sourceFo); + if (project == null) { + return null; + } + + FileObject componentResource = project.getProjectDirectory().getFileObject("resources/views/livewire/" + componentId + ".blade.php"); + + if (componentResource != null && componentResource.isValid()){ + return componentResource; + } + + return null; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/VitePathDeclarationService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/VitePathDeclarationService.java new file mode 100644 index 000000000000..b748f625fa08 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/VitePathDeclarationService.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.declaration; + +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class VitePathDeclarationService { + + private final FileObject sourceFolder; + + public VitePathDeclarationService(FileObject sourceFolder) { + this.sourceFolder = sourceFolder; + } + + public FileObject findFileObject(String path) { + return sourceFolder.getFileObject(path); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java new file mode 100644 index 000000000000..aef8df37b541 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java @@ -0,0 +1,302 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.directives; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.WeakHashMap; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.netbeans.api.project.Project; +import org.netbeans.modules.csl.api.DeclarationFinder; +import org.netbeans.modules.php.blade.editor.parser.ParsingUtils; +import org.netbeans.modules.php.blade.project.BladeProjectProperties; +import org.netbeans.modules.php.editor.parser.astnodes.Expression; +import org.netbeans.modules.php.editor.parser.astnodes.FunctionInvocation; +import org.netbeans.modules.php.editor.parser.astnodes.Scalar; +import org.openide.filesystems.FileChangeAdapter; +import org.openide.filesystems.FileChangeListener; +import org.openide.filesystems.FileEvent; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; + +/** + * + * @author bhaidu + */ +public final class CustomDirectives { + + private final Project project; + private static final Map INSTANCES = new WeakHashMap<>(); + private final Map> customDirectives = new LinkedHashMap<>(); + + public List customDirectiveList = new ArrayList<>(); + + private final FileChangeListener fileChangeListener = new FileChangeListenerImpl(); + + private static final Logger LOGGER = Logger.getLogger(CustomDirectives.class.getName()); + + public static CustomDirectives getInstance(Project project) { + if (project == null) { + return new CustomDirectives(); + } + synchronized (INSTANCES) { + CustomDirectives customDirective = INSTANCES.get(project); + if (customDirective == null) { + customDirective = new CustomDirectives(project); + INSTANCES.put(project, customDirective); + } + return customDirective; + } + } + + public static CustomDirectives resetInstance(Project project) { + CustomDirectives customDirective = new CustomDirectives(project); + INSTANCES.put(project, customDirective); + return customDirective; + } + + private CustomDirectives() { + this.project = null; + } + + private CustomDirectives(Project project) { + this.project = project; + extractCustomDirectives(); + LOGGER.log(Level.INFO, "Finished extracting directives. Found ({0})", customDirectives.size()); + } + + private void extractCustomDirectives() { + LOGGER.info("Extracting custom directives"); + String[] compilerPathList = BladeProjectProperties.getInstance(project).getCompilerPathList(); + FileObject defaultAppProvider = project.getProjectDirectory().getFileObject("app/Providers/AppServiceProvider.php"); + String defaultAppPath = ""; + + if (defaultAppProvider != null){ + addDirectiveNamesFromFile(defaultAppProvider); + File defaultAppFile = new File(defaultAppProvider.getPath()); + defaultAppPath = defaultAppFile.getAbsolutePath(); + FileUtil.addRecursiveListener(fileChangeListener, defaultAppFile); + } + + if (compilerPathList.length == 0) { + return; + } + for (String path : compilerPathList) { + if (path.equals("")) { + continue; + } + File file = new File(path); + if (!file.exists()) { + //remove + continue; + } + + String filePath = file.getPath(); + if (defaultAppPath.equals(filePath)){ + continue; + } + FileUtil.addRecursiveListener(fileChangeListener, file); + FileObject fileObj = FileUtil.toFileObject(file); + addDirectiveNamesFromFile(fileObj); + } + + } + + private void rescanFile(FileObject file) { + List entry = customDirectives.get(file); + if (entry.isEmpty()) { + addDirectiveNamesFromFile(file); + } + } + + public void addDirectiveNamesFromFile(FileObject file) { + ParsingUtils parsingUtils = new ParsingUtils(); + parsingUtils.parseFileObject(file); + FunctionInvocationVisitor functionInvocationVisitor = new FunctionInvocationVisitor(); + if (parsingUtils.getParserResult() != null && parsingUtils.getParserResult().getProgram() != null) { + parsingUtils.getParserResult().getProgram().accept(functionInvocationVisitor); + List directiveList = functionInvocationVisitor.getDirectives(); + + if (directiveList.isEmpty()) { + return; + } + + customDirectiveList.addAll(directiveList); + customDirectives.put(file, directiveList); + } + } + + public Map> getCustomDirectives() { + return customDirectives; + } + + public class DirectiveNames { + + private final List directiveNames; + + public DirectiveNames(List directiveNames) { + this.directiveNames = directiveNames; + } + + public List getList() { + return directiveNames; + } + } + + /** + * we are scanning the php ast nodes to search for the use of directive + * method the first parameter of the called method will be the custom + * directive name + */ + private class FunctionInvocationVisitor extends org.netbeans.modules.php.editor.parser.astnodes.visitors.DefaultVisitor { + private final String[] validFunctions = new String[]{"directive", "if"}; + private final List directives; + + public FunctionInvocationVisitor() { + this.directives = new ArrayList<>(); + } + + @Override + public void scan(org.netbeans.modules.php.editor.parser.astnodes.ASTNode node) { + if (node != null) { + super.scan(node); + } + } + + @Override + public void visit(FunctionInvocation node) { + String functionName = node.getFunctionName().toString(); + if (!Arrays.stream(validFunctions).anyMatch(functionName::equals)) { + return; + } + List parameters = node.getParameters(); + Iterator iter = parameters.iterator(); + Expression directiveName = (Expression) iter.next(); + if (directiveName != null && directiveName instanceof Scalar) { + Scalar name = (Scalar) directiveName; + String escapedDirectiveName = name.getStringValue().replaceAll("^[\"|\']|[\"|[\']]$", ""); + directives.add(new CustomDirective("@" + escapedDirectiveName, name.getStartOffset())); + //Custom If Statements + if (functionName.equals("if")){ + directives.add(new CustomDirective("@unless" + escapedDirectiveName, name.getStartOffset())); + directives.add(new CustomDirective("@else" + escapedDirectiveName, name.getStartOffset())); + directives.add(new CustomDirective("@end" + escapedDirectiveName, name.getStartOffset())); + } + } + } + + public List getDirectives() { + return directives; + } + } + + private final class FileChangeListenerImpl extends FileChangeAdapter { + + @Override + public void fileFolderCreated(FileEvent fe) { + + } + + @Override + public void fileChanged(FileEvent fe) { + processFile(fe.getFile()); + } + + @Override + public void fileDataCreated(FileEvent fe) { + + } + + private void processFile(FileObject file) { + assert file.isData() : file; + CustomDirectives.getInstance(project).rescanFile(file); + } + + } + + public void filterAction(FilterCallback callback) { + for (Map.Entry> entry : customDirectives.entrySet()) { + if (!entry.getKey().isValid()) { + continue; + } + + for (CustomDirective directive : entry.getValue()) { + callback.filterDirectiveName(directive, entry.getKey()); + } + + } + } + + public void filterAction(FilterCallbackDeclaration callback) { + for (Map.Entry> entry : customDirectives.entrySet()) { + if (!entry.getKey().isValid()) { + continue; + } + + for (CustomDirective directive : entry.getValue()) { + callback.filterDirectiveName(directive, entry.getKey()); + } + + } + } + + public boolean customDirectiveConfigured(String query){ + for (CustomDirectives.CustomDirective customDirective : customDirectiveList){ + if (customDirective.name.equals(query)){ + return true; + } + } + return false; + } + + public static interface FilterCallback { + + public void filterDirectiveName(CustomDirective directive, FileObject file); + } + + public static abstract class FilterCallbackDeclaration { + protected DeclarationFinder.DeclarationLocation location ; + + public FilterCallbackDeclaration(DeclarationFinder.DeclarationLocation location){ + this.location = location; + } + + public void filterDirectiveName(CustomDirective directive, FileObject file){} + } + + public static class CustomDirective { + public String name; + public int offset = 0; + + public CustomDirective(String name){ + this.name = name; + } + + public CustomDirective(String name, int offset){ + this.name = name; + this.offset = offset; + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProvider.java new file mode 100644 index 000000000000..f2e9da7b7c08 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProvider.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.embedding; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.netbeans.api.lexer.Token; +import org.netbeans.api.lexer.TokenHierarchy; +import org.netbeans.api.lexer.TokenId; +import org.netbeans.api.lexer.TokenSequence; +import org.netbeans.modules.parsing.api.Embedding; +import org.netbeans.modules.parsing.api.Snapshot; +import org.netbeans.modules.parsing.spi.EmbeddingProvider; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; + +/** + * this will enable braces matches of html elements + * + * @author bhaidu + */ +@EmbeddingProvider.Registration( + mimeType = BladeLanguage.MIME_TYPE, + targetMimeType = "text/html") +public class BladeHtmlEmbeddingProvider extends EmbeddingProvider { + public static final String FILLER = " "; + public static final String TARGET_MIME_TYPE = "text/html"; //NOI18N + + @Override + public List getEmbeddings(final Snapshot snapshot) { + TokenHierarchy tokenHierarchy = snapshot.getTokenHierarchy(); + TokenSequence sequence = tokenHierarchy.tokenSequence(); + + if (sequence == null || !sequence.isValid()) { + return Collections.emptyList(); + } + sequence.moveStart(); + List embeddings = new ArrayList<>(); + + int offset = 0; + int len = 0; + + String fake; + + try { + while (sequence.moveNext()) { + Token t = sequence.token(); + offset = sequence.offset(); + TokenId id = t.id(); + len += t.length(); + String tText = t.text().toString(); + if (len == 0) { + continue; + } + if (id.equals(BladeTokenId.HTML)) { + embeddings.add(snapshot.create(offset, t.length(), TARGET_MIME_TYPE)); + } else { + fake = new String(new char[tText.length()]).replace("\0", FILLER); + embeddings.add(snapshot.create(fake, TARGET_MIME_TYPE)); + } + } + } catch (Exception ex) { + //Exceptions.printStackTrace(ex); + return Collections.emptyList(); + } + + //LOGGER.log(Level.INFO, "html ebedding finished for {0}, it took " + (System.currentTimeMillis() - startTime), snapshot.getSource().getFileObject().getName()); + + if (embeddings.isEmpty()) { + return Collections.singletonList(snapshot.create("", TARGET_MIME_TYPE)); + } else { + return Collections.singletonList(Embedding.create(embeddings)); + } + } + + @Override + public int getPriority() { + return 210; + } + + @Override + public void cancel() { + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java new file mode 100644 index 000000000000..d7df7529180f --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.embedding; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.netbeans.api.lexer.Token; +import org.netbeans.api.lexer.TokenHierarchy; +import org.netbeans.api.lexer.TokenId; +import org.netbeans.api.lexer.TokenSequence; +import org.netbeans.modules.parsing.api.Embedding; +import org.netbeans.modules.parsing.api.Snapshot; +import org.netbeans.modules.parsing.spi.EmbeddingProvider; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; + +/** + * this will enable braces matches of html elements + * + * @author bhaidu + */ +@EmbeddingProvider.Registration( + mimeType = BladeLanguage.MIME_TYPE, + targetMimeType = "text/x-php5") +public class BladePhpEmbeddingProvider extends EmbeddingProvider { + public static final String TARGET_MIME_TYPE = "text/x-php5"; //NOI18N + + @Override + public List getEmbeddings(final Snapshot snapshot) { + TokenHierarchy tokenHierarchy = snapshot.getTokenHierarchy(); + TokenSequence sequence = tokenHierarchy.tokenSequence(); + if (sequence == null) { + return Collections.emptyList(); + } + sequence.moveStart(); + List embeddings = new ArrayList<>(); + + int offset = 0; + int len = 0; + + String fake; + + while (sequence.moveNext()) { + Token t = sequence.token(); + offset = sequence.offset(); + TokenId id = t.id(); + len += t.length(); + String tText = t.text().toString(); + if (len == 0) { + continue; + } + if (id.equals(BladeTokenId.PHP_INLINE)) { + embeddings.add(snapshot.create(offset, t.length(), TARGET_MIME_TYPE)); + } else { + fake = new String(new char[tText.length()]).replace("\0", "@"); + embeddings.add(snapshot.create(fake, TARGET_MIME_TYPE)); + } + } + + if (embeddings.isEmpty()) { + return Collections.singletonList(snapshot.create("", TARGET_MIME_TYPE)); + } else { + return Collections.singletonList(Embedding.create(embeddings)); + } + } + + @Override + public int getPriority() { + return 210; + } + + @Override + public void cancel() { + //TODO see html implementation + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatter.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatter.java new file mode 100644 index 000000000000..06c29099f1f7 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatter.java @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.format; + +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.prefs.Preferences; +import javax.swing.SwingUtilities; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import org.netbeans.modules.csl.api.Formatter; +import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.modules.editor.indent.spi.Context; + +import org.netbeans.api.editor.document.LineDocument; +import org.netbeans.api.editor.document.LineDocumentUtils; +import org.netbeans.api.editor.settings.SimpleValueNames; +import org.netbeans.api.project.Project; +import org.netbeans.modules.editor.NbEditorUtilities; +import org.netbeans.modules.editor.indent.spi.CodeStylePreferences; +import org.netbeans.modules.php.blade.editor.preferences.GeneralPreferencesUtils; +import org.netbeans.spi.project.ui.support.ProjectConvertors; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public class BladeFormatter implements Formatter { + private static final Logger LOGGER = Logger.getLogger(BladeFormatter.class.getName()); + + public BladeFormatter() { + } + + @Override + public void reformat(Context context, ParserResult compilationInfo) { + + LineDocument doc = LineDocumentUtils.as(context.document(), LineDocument.class); + if (doc == null) { + return; + } + if (context.isIndent() && !isBladeIndentEnabled(doc)) { + return; + } else if (!isBladeFormattingEnabled(doc)) { + return; + } + //todo + //check tab context + FileObject file = NbEditorUtilities.getFileObject(doc); + Project projectOwner = ProjectConvertors.getNonConvertorOwner(file); + if (projectOwner == null) { + return; + } + + int indentSize = getIndentSize(context.document()); + + long start = System.currentTimeMillis(); + Runnable rn = new Runnable() { + @Override + public void run() { + //the text can update between reformatting + LineDocument doc = LineDocumentUtils.as(context.document(), LineDocument.class); + if (doc == null) { + return; + } + try { + String currentText = doc.getText(0, doc.getLength()); + + if (context.isIndent()) { + int lineStart = context.lineStartOffset(context.caretOffset()); + String lineText = doc.getText(lineStart, context.caretOffset() - lineStart); + if (!lineText.isEmpty() && lineText.replaceAll(" ", "").isEmpty()) { + return; + } + } + (new BladeFormatterService()).format(context, currentText, indentSize); + + } catch (BadLocationException ex) { + } + } + + }; + + //run after html indent is finished + SwingUtilities.invokeLater(rn); + if (LOGGER.isLoggable(Level.FINE)) { + long end = System.currentTimeMillis(); + LOGGER.log(Level.FINE, "Reformat took: {0} ms", (end - start)); //NOI18N + } + } + + @Override + public void reindent(Context context) { + reformat(context, null); + } + + @Override + public boolean needsParserResult() { + return false; + } + + @Override + public int indentSize() { + return 4; + } + + @Override + public int hangingIndentSize() { + return 4; + } + + static int getIndentSize(Document doc) { + Preferences prefs = CodeStylePreferences.get(doc).getPreferences(); + return prefs.getInt(SimpleValueNames.INDENT_SHIFT_WIDTH, 4); + } + + static boolean isBladeIndentEnabled(Document doc) { + Preferences prefs = CodeStylePreferences.get(doc).getPreferences(); + return prefs.getBoolean(GeneralPreferencesUtils.ENABLE_INDENTATION, false); + } + + static boolean isBladeFormattingEnabled(Document doc) { + Preferences prefs = CodeStylePreferences.get(doc).getPreferences(); + return prefs.getBoolean(GeneralPreferencesUtils.ENABLE_FORMATTING, false); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterService.java new file mode 100644 index 000000000000..8bc9edf32a01 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterService.java @@ -0,0 +1,278 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.format; + +import java.util.Map; +import java.util.TreeMap; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.text.BadLocationException; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.ConsoleErrorListener; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.tree.ParseTreeListener; +import org.netbeans.modules.editor.indent.spi.Context; +import org.netbeans.modules.php.blade.syntax.antlr4.formatter.BladeAntlrFormatterLexer; +import org.netbeans.modules.php.blade.syntax.antlr4.formatter.BladeAntlrFormatterParser; +import org.netbeans.modules.php.blade.syntax.antlr4.formatter.BladeAntlrFormatterParserBaseListener; +import org.openide.util.Exceptions; + +/** + * + * + * @author bhaidu + */ +public class BladeFormatterService { + private static final Logger LOGGER = Logger.getLogger(BladeFormatterService.class.getName()); + public final Map formattedLineIndentList = new TreeMap<>(); + boolean debugMode = false; + public boolean isIndentation; + + public void format(Context context, String text, int indentSize) { + isIndentation = context.isIndent(); + BladeAntlrFormatterLexer lexer = new BladeAntlrFormatterLexer(CharStreams.fromString(text)); + CommonTokenStream tokens = new CommonTokenStream(lexer); + BladeAntlrFormatterParser parser = new BladeAntlrFormatterParser(tokens); + parser.removeErrorListener(ConsoleErrorListener.INSTANCE); + parser.addParseListener(createFormatterListener()); + parser.setBuildParseTree(false); + parser.file(); + + final int cstart = context.startOffset(); + final int cend = context.endOffset(); + int textDelta = 0; + LOGGER.log(Level.INFO, "Starting formatting from caret {0}:\n", cstart); + + for (Map.Entry entry : formattedLineIndentList.entrySet()) { + int tstart = entry.getValue().tokenStart; + int indent = entry.getValue().indent; + int htmlIndent = entry.getValue().htmlIndent; + if (tstart < context.document().getLength()) { + int existingLineIndent = 0; + try { + existingLineIndent = context.lineIndent(tstart); + } catch (BadLocationException ex) { + Exceptions.printStackTrace(ex); + break; + } + if (tstart > cend) { +// System.out.println("exit " + tstart + " > " + cend); +// System.out.println("line : " + entry.getKey() + " ei " + existingLineIndent); +// System.out.println("token : " + entry.getValue()); +// System.out.println("Finished formatting for caret " + cstart); + break; + } + } + + if (tstart >= cstart) { +// System.out.println("doc length : " + context.document().getLength()); +// System.out.println("delta : " + (tstart - textDelta)); + if (context.document().getLength() < (tstart - textDelta)) { + //skipping + continue; + } + +// System.out.println("line : " + entry.getKey()); +// System.out.println("token : " + entry.getValue()); +// System.out.println("indent : " + indent); +// System.out.println("htmlindent : " + htmlIndent); + try { + int lineStart_i = context.lineStartOffset(tstart - textDelta); + int originalIndent_i = context.lineIndent(lineStart_i); + int wsIndent = (indent + htmlIndent) * indentSize; +// System.out.println("linestart + offset : " + (lineStart_i + wsIndent)); + if (lineStart_i + wsIndent > context.document().getLength()) { +// System.out.println("out of range : " + (lineStart_i + wsIndent)); + break; + } + context.modifyIndent(lineStart_i, wsIndent); +// System.out.println("delta : " + (originalIndent_i - wsIndent)); +// System.out.println("===================================="); + textDelta += (originalIndent_i - wsIndent); + } catch (BadLocationException ex) { + Exceptions.printStackTrace(ex); + break; + } + } + } + } + + private ParseTreeListener createFormatterListener() { + return new BladeAntlrFormatterParserBaseListener() { + int indent = 0; + int blockBalance = 0; + int htmlBlockBalance = 0; + int lastIncrementedLine = 0; + + @Override + public void exitBlock_start(BladeAntlrFormatterParser.Block_startContext ctx) { + + Token start = ctx.getStart(); + blockBalance++; + if (ctx.getStop() != null && !formattedLineIndentList.containsKey(start.getLine())) { + Token endDefinition = ctx.getStop(); + //hack to indent after blade block + int offset = isIndentation ? 1 : 0; + formattedLineIndentList.put(endDefinition.getLine(), + new FormatToken(endDefinition.getStopIndex() + 1 + offset, indent+offset, htmlBlockBalance, null)); + } + indent++; + } + + @Override + public void exitBlock_end(BladeAntlrFormatterParser.Block_endContext ctx) { + Token start = ctx.getStart(); + int line = start.getLine(); + indent--; + //correction + if (indent < 0) { + indent = 0; + } + if (!formattedLineIndentList.containsKey(line)) { + String debugText = debugMode ? start.getText() : null; + formattedLineIndentList.put(line, new FormatToken(start.getStartIndex(), indent, htmlBlockBalance, debugText)); + } else { + formattedLineIndentList.remove(line); + } + + blockBalance--; + } + + @Override + public void exitSection_block_start(BladeAntlrFormatterParser.Section_block_startContext ctx) { + Token start = ctx.getStart(); + blockBalance++; + if (ctx.getStop() != null && !formattedLineIndentList.containsKey(start.getLine())) { + Token rArgParent = ctx.getStop(); + String debugText = debugMode ? rArgParent.getText() : null; + formattedLineIndentList.put(rArgParent.getLine(), new FormatToken(rArgParent.getStopIndex() + 1, indent, htmlBlockBalance, debugText)); + indent++; + } + } + + @Override + public void exitSection_block_end(BladeAntlrFormatterParser.Section_block_endContext ctx) { + Token start = ctx.getStart(); + int line = start.getLine(); + if (!formattedLineIndentList.containsKey(line)) { + indent--; + if (indent < 0) { + indent = 0; + } + formattedLineIndentList.put(line, new FormatToken(start.getStartIndex(), indent, htmlBlockBalance, start.getText())); + } else { + formattedLineIndentList.remove(line); + } + //correction + if (indent < 0) { + indent = 0; + } + blockBalance--; + } + + @Override + public void exitInline_identable_element(BladeAntlrFormatterParser.Inline_identable_elementContext ctx) { + Token start = ctx.getStart(); + int line = start.getLine(); + if (!formattedLineIndentList.containsKey(line)) { + if ((htmlBlockBalance > 0 || blockBalance > 0)) { + formattedLineIndentList.put(line, new FormatToken(start.getStartIndex(), indent, htmlBlockBalance, start.getText())); + } + } + } + + @Override + public void exitNl_with_space(BladeAntlrFormatterParser.Nl_with_spaceContext ctx) { + if (ctx.WS().isEmpty()) { + return; + } + + Token start = ctx.WS(0).getSymbol(); + int line = start.getLine(); + if (!formattedLineIndentList.containsKey(line)) { + formattedLineIndentList.put(line, new FormatToken(start.getStartIndex(), indent, "ws")); + } + } + + @Override + public void exitHtml_close_tag(BladeAntlrFormatterParser.Html_close_tagContext ctx) { + + Token start = ctx.getStart(); + int line = start.getLine(); + if (line > 0 && lastIncrementedLine != line){ + if (htmlBlockBalance > 0) { + htmlBlockBalance--; + } else { + htmlBlockBalance = 0; + } + lastIncrementedLine = line; + } + if (!formattedLineIndentList.containsKey(line)) { + formattedLineIndentList.put(line, new FormatToken(start.getStartIndex(), indent, htmlBlockBalance, start.getText())); + } + } + + @Override + public void exitHtml_tag(BladeAntlrFormatterParser.Html_tagContext ctx) { + Token start = ctx.getStart(); + int line = start.getLine(); + if (!formattedLineIndentList.containsKey(line)) { + if ((htmlBlockBalance > 0 || blockBalance > 0)) { + formattedLineIndentList.put(line, new FormatToken(start.getStartIndex(), indent, htmlBlockBalance, start.getText())); + } + htmlBlockBalance++; + } + } + + @Override + public void exitSelf_closed_tag(BladeAntlrFormatterParser.Self_closed_tagContext ctx) { + Token start = ctx.getStart(); + int line = start.getLine(); + if (!formattedLineIndentList.containsKey(line)) { + if ((htmlBlockBalance > 0 || blockBalance > 0)) { + formattedLineIndentList.put(line, new FormatToken(start.getStartIndex(), indent, htmlBlockBalance, start.getText())); + } + } + } + + @Override + public void exitHtml_indent(BladeAntlrFormatterParser.Html_indentContext ctx) { + Token start = ctx.getStart(); + int line = start.getLine(); + if (!formattedLineIndentList.containsKey(line)) { + String debugText = debugMode ? start.getText() : null; + formattedLineIndentList.put(line, new FormatToken(start.getStartIndex(), indent, htmlBlockBalance, debugText)); + } + htmlBlockBalance++; + } + + @Override + public void exitBlock_aligned_directive(BladeAntlrFormatterParser.Block_aligned_directiveContext ctx) { + Token start = ctx.getStart(); + int line = start.getLine(); + if (!formattedLineIndentList.containsKey(line)) { + if ((htmlBlockBalance > 0 || blockBalance > 0)) { + formattedLineIndentList.put(line, new FormatToken(start.getStartIndex(), indent - 1, htmlBlockBalance, start.getText())); + } + } + } + }; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/FormatToken.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/FormatToken.java new file mode 100644 index 000000000000..2503109a0c8a --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/FormatToken.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.format; + +/** + * + * @author bhaidu + */ +public class FormatToken { + + public int tokenStart; + public int indent; + public int htmlIndent; + //for directive + public String directive; + + public FormatToken(int tokenStart, int indent, String directive) { + this.tokenStart = tokenStart; + this.indent = indent; + this.directive = directive; + } + + public FormatToken(int tokenStart, int indent, int htmlIndent, String directive) { + this.tokenStart = tokenStart; + this.indent = indent; + this.directive = directive; + this.htmlIndent = htmlIndent; + } + + @Override + public String toString() { + return this.directive + ", " + this.indent * 4 + ", " + this.tokenStart; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsContainer.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsContainer.java new file mode 100644 index 000000000000..3f8640b1b1db --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsContainer.java @@ -0,0 +1,65 @@ +package org.netbeans.modules.php.blade.editor.highlighting; + +import javax.swing.text.AbstractDocument; +import javax.swing.text.AttributeSet; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.spi.editor.highlighting.HighlightsSequence; +import org.netbeans.spi.editor.highlighting.support.AbstractHighlightsContainer; + + +/** + * + * hack to fix the highlighting issue on javascript properties vs blade paths + * "@include('my.path') - my.path should be fully selected on double click + * window.test - should not be fully selected on double click + * + * @author bhaidu + */ +public class BladeHighlightsContainer extends AbstractHighlightsContainer { + + private final AbstractDocument doc; + AttributeSet attrs = null; + private static int offset = 0; + + public BladeHighlightsContainer(AbstractDocument doc) { + this.doc = doc; + } + + public @Override + HighlightsSequence getHighlights(final int startOffset, final int endOffset) { + return new HighlightsSequence() { + int start, end; + final int scanStart; + + { + scanStart = doc.getParagraphElement(startOffset).getStartOffset(); + if (offset != scanStart){ + offset = scanStart; + //reset the hasQuote flag from isIdentifierChar + BladeLanguage.hasQuote = false; + } + } + + public @Override + boolean moveNext() { + + return false; + } + + public @Override + int getStartOffset() { + return start; + } + + public @Override + int getEndOffset() { + return end; + } + + public @Override + AttributeSet getAttributes() { + return attrs; + } + }; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsLayerFactory.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsLayerFactory.java new file mode 100644 index 000000000000..b81d5b06d98f --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsLayerFactory.java @@ -0,0 +1,27 @@ +package org.netbeans.modules.php.blade.editor.highlighting; + +import javax.swing.text.AbstractDocument; +import org.netbeans.api.editor.mimelookup.MimeRegistration; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.spi.editor.highlighting.HighlightsLayer; + +import org.netbeans.spi.editor.highlighting.HighlightsLayerFactory; +import org.netbeans.spi.editor.highlighting.ZOrder; + + +/** + * hack to fix the highlighting issue on javascript properties vs blade paths + * "@include('my.path') - my.path should be fully selected on double click + * window.test - should not be fully selected on double click + * + * @author bhaidu + */ +@MimeRegistration(service=HighlightsLayerFactory.class, mimeType=BladeLanguage.MIME_TYPE, position=200) +public class BladeHighlightsLayerFactory implements HighlightsLayerFactory { + + public @Override HighlightsLayer[] createLayers(final Context context) { + return new HighlightsLayer[] {HighlightsLayer.create("blade", ZOrder.SYNTAX_RACK.forPosition(10), true, + new BladeHighlightsContainer((AbstractDocument) context.getDocument()))}; + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java new file mode 100644 index 000000000000..e3e1117c2e9f --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java @@ -0,0 +1,237 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.hints; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import javax.swing.text.BadLocationException; +import org.netbeans.api.editor.document.EditorDocumentUtils; +import org.netbeans.api.project.Project; +import org.netbeans.modules.csl.api.Error; +import org.netbeans.modules.csl.api.Hint; +import org.netbeans.modules.csl.api.HintSeverity; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.csl.api.Rule; +import org.netbeans.modules.csl.api.Rule.ErrorRule; +import org.netbeans.modules.csl.api.RuleContext; +import org.netbeans.modules.csl.api.HintsProvider; +import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; +import org.netbeans.modules.php.blade.editor.path.BladePathUtils; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public class BladeHintsProvider implements HintsProvider { + + /** + * Compute hints applicable to the given compilation info and add to the + * given result list. + * + * @param manager + * @param context + * @param hints + */ + @Override + public void computeHints(HintsManager manager, RuleContext context, List hints) { + if (!(context.parserResult instanceof BladeParserResult)) { + return; + } + Map> allHints = manager.getHints(false, context); + List directiveHints = allHints.get("blade.option.directive.hints"); + + BladeParserResult parserResult = (BladeParserResult) context.parserResult; + FileObject fo = EditorDocumentUtils.getFileObject(context.doc); + Project project = ProjectUtils.getMainOwner(fo); + CustomDirectives ct = CustomDirectives.getInstance(project); + + if (directiveHints != null) { + for (Rule.AstRule astRule : directiveHints) { + if (!manager.isEnabled(astRule)) { + continue; + } + if (astRule instanceof UnknownDirective) { + for (Map.Entry entry : parserResult.customDirectivesReferences.entrySet()) { + if (entry.getValue().type == BladeParserResult.ReferenceType.POSSIBLE_DIRECTIVE) { + continue; + } + + if (ct.customDirectiveConfigured(entry.getValue().identifier)) { + continue; + } + hints.add(new Hint(astRule, + "Unknown directive. Try adding the provider class file using Project -> Properties -> Custom Directives", + context.parserResult.getSnapshot().getSource().getFileObject(), + entry.getKey(), + Collections.emptyList(), + 10)); + } + } + } + } + + //validate path config + for (Map.Entry> entry : parserResult.includeBladeOccurences.entrySet()) { + FileObject realFile = BladePathUtils.findFileObjectForBladeViewPath(parserResult.getFileObject(), + entry.getKey()); + if (realFile != null) { + continue; + } + for (OffsetRange range : entry.getValue()) { + OffsetRange hintRange = new OffsetRange(range.getStart(), range.getEnd() + 1); + hints.add(new Hint(new BladeRule(HintSeverity.WARNING), + "Blade path not found.\nFor custom blade context you can try to set the root folder using:\nProject -> Properties -> Laravel Blade -> Views Folder", + context.parserResult.getSnapshot().getSource().getFileObject(), + hintRange, + Collections.emptyList(), + 10)); + } + } + + } + + /** + * Compute any suggestions applicable to the given caret offset, and add to + * the given suggestion list. + */ + @Override + public void computeSuggestions(HintsManager manager, RuleContext context, List suggestions, int caretOffset) { + } + + /** + * Compute any suggestions applicable to the given caret offset, and add to + * the given suggestion list. + */ + @Override + public void computeSelectionHints(HintsManager manager, RuleContext context, List suggestions, int start, int end) { + } + + /** + * Process the errors for the given compilation info, and add errors and + * warning descriptions into the provided hint list. Return any errors that + * were not added as error descriptions (e.g. had no applicable error rule) + */ + @Override + public void computeErrors(HintsManager manager, RuleContext context, List hints, List unhandled) { + BladeParserResult parserResult = (BladeParserResult) context.parserResult; + + unhandled.addAll(parserResult.getDiagnostics()); + } + + /** + * Cancel in-progress processing of hints. + */ + @Override + public void cancel() { + //todo implement + } + + /** + *

+ * Optional builtin Rules. Typically you don't use this; you register your + * rules in your filesystem layer in the gsf-hints/mimetype1/mimetype2 + * folder, for example gsf-hints/text/x-ruby/. Error hints should go in the + * "errors" folder, selection hints should go in the "selection" folder, and + * all other hints should go in the "hints" folder (but note that you can + * create localized folders and organize them under hints; these categories + * are shown in the hints options panel. Hints returned from this method + * will be placed in the "general" folder. + *

+ *

+ * This method is primarily intended for rules that should be added + * dynamically, for example for Rules that have a many different flavors yet + * a single implementation class (such as JavaScript's StrictWarning rule + * which wraps a number of builtin parser warnings.) + * + * @return A list of rules that are builtin, or null or an empty list when + * there are no builtins + */ + @Override + public List getBuiltinRules() { + return null; + } + + /** + * Create a RuleContext object specific to this HintsProvider. This lets + * implementations of this interface created subclasses of the RuleContext + * that can be passed around to all the executed rules. + * + * @return A new instance of a RuleContext object + */ + @Override + public RuleContext createRuleContext() { + return new BladeRuleContext(); + } + + private static final class BladeRule implements ErrorRule { + + private final HintSeverity severity; + + private BladeRule(HintSeverity severity) { + this.severity = severity; + } + + @Override + public Set getCodes() { + return Collections.emptySet(); + } + + @Override + public boolean appliesTo(RuleContext context) { + return true; + } + + @Override + public String getDisplayName() { + return "blade"; //NOI18N + } + + @Override + public boolean showInTasklist() { + return true; + } + + @Override + public HintSeverity getDefaultSeverity() { + return severity; + } + } + + public class BladeRuleContext extends RuleContext { + + private BladeParserResult bladeParserResult = null; + + public BladeParserResult getJsParserResult() { + if (bladeParserResult == null) { + bladeParserResult = (BladeParserResult) parserResult; + } + return bladeParserResult; + } + + public boolean isCancelled() { + return false; + } + + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/HintsControllerFactory.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/HintsControllerFactory.java new file mode 100644 index 000000000000..57b23a072f74 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/HintsControllerFactory.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.hints; + +import org.netbeans.modules.csl.api.HintsProvider; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.spi.options.OptionsPanelController; +import org.openide.util.NbBundle; + +/** + * + * @author bogdan + */ +public class HintsControllerFactory { + + public HintsControllerFactory() { + } + + @OptionsPanelController.SubRegistration( + id = "BladeHints", + location = "Blade/Hints", + displayName = "#HintsControllerFactory.name" + ) + @NbBundle.Messages("HintsControllerFactory.name=Blade Hints") + public static OptionsPanelController createOptions() { + HintsProvider.HintsManager manager = HintsProvider.HintsManager.getManagerForMimeType(BladeLanguage.MIME_TYPE); + assert manager != null; + + return manager.getOptionsController(); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/UnknownDirective.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/UnknownDirective.java new file mode 100644 index 000000000000..7bb522aa035d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/UnknownDirective.java @@ -0,0 +1,87 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.hints; + +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.prefs.Preferences; +import javax.swing.JComponent; +import javax.swing.text.BadLocationException; +import org.netbeans.modules.csl.api.Hint; +import org.netbeans.modules.csl.api.HintSeverity; +import org.netbeans.modules.csl.api.HintsProvider; +import org.netbeans.modules.csl.api.Rule; +import org.netbeans.modules.csl.api.RuleContext; + +/** + * + * @author bogdan + */ +public class UnknownDirective implements Rule.AstRule { + + public void computeHints(RuleContext context, List hints, int offset, HintsProvider.HintsManager manager) throws BadLocationException { + + } + + @Override + public boolean getDefaultEnabled() { + return true; + } + + @Override + public JComponent getCustomizer(Preferences node) { + return null; + } + + @Override + public boolean appliesTo(RuleContext context) { + return context instanceof BladeHintsProvider.BladeRuleContext; + } + + @Override + public boolean showInTasklist() { + return true; + } + + @Override + public HintSeverity getDefaultSeverity() { + return HintSeverity.WARNING; + } + + @Override + public Set getKinds() { + return Collections.singleton("blade.option.directive.hints"); + } + + @Override + public String getId() { + return "blade.hint.unknown_directive"; + } + + @Override + public String getDescription() { + return "Unknown Directive. The directive my not be in the base laravel blade compiler and was not found in the custom list."; + } + + @Override + public String getDisplayName() { + return "Unknown Directive"; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndex.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndex.java new file mode 100644 index 000000000000..d9db8d33a07f --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndex.java @@ -0,0 +1,307 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.indexing; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.WeakHashMap; +import java.util.concurrent.ExecutionException; +import org.netbeans.api.project.Project; +import org.netbeans.api.project.ui.OpenProjects; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.parsing.spi.indexing.support.IndexResult; +import org.netbeans.modules.parsing.spi.indexing.support.QuerySupport; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.Reference; +import org.openide.filesystems.FileObject; +import org.openide.util.Exceptions; + +/** + * + * @author bhaidu + */ +public class BladeIndex { + + private final QuerySupport querySupport; + private static final Map INDEXES = new WeakHashMap<>(); + private static boolean areProjectsOpen = false; + + private BladeIndex(QuerySupport querySupport) throws IOException { + this.querySupport = querySupport; + } + + public QuerySupport getQuerySupport() { + return querySupport; + } + + public static BladeIndex get(Project project) throws IOException { + if (project == null) { + return null; + } + synchronized (INDEXES) { + BladeIndex index = INDEXES.get(project); + if (index == null) { + if (!areProjectsOpen) { + try { + // just be sure that the projects are open + OpenProjects.getDefault().openProjects().get(); + } catch (InterruptedException | ExecutionException ex) { + Exceptions.printStackTrace(ex); + } finally { + areProjectsOpen = true; + } + } + Collection sourceRoots = QuerySupport.findRoots(project, + null /* all source roots */, + Collections.emptyList(), + Collections.emptyList()); + QuerySupport querySupport = QuerySupport.forRoots(BladeIndexer.Factory.NAME, BladeIndexer.Factory.VERSION, sourceRoots.toArray(new FileObject[]{})); + index = new BladeIndex(querySupport); + if (!sourceRoots.isEmpty()) { + INDEXES.put(project, index); + } + } + return index; + } + } + + public List queryYieldIds(String prefix) { + return queryIndexedReferenceId(prefix, BladeIndexer.YIELD_ID); + } + + public List queryStacksIndexedReferences(String prefix) { + return queryIndexedReferenceId(prefix, BladeIndexer.STACK_ID); + } + + private List queryIndexedReferenceId(String prefix, String indexKey) { + List indexedReferences = new ArrayList<>(); + + try { + Collection result = querySupport.query(indexKey, prefix, QuerySupport.Kind.PREFIX, indexKey); + + if (result == null || result.isEmpty()) { + return indexedReferences; + } + + for (IndexResult indexResult : result) { + String[] values = indexResult.getValues(indexKey); + for (String value : values) { + if (value.startsWith(prefix)) { + indexedReferences.add(new IndexedReferenceId(value, indexResult.getFile())); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + + return indexedReferences; + } + + public List queryYieldIndexedReferences(String prefix) { + return queryIndexedReferences(prefix, + BladeIndexer.YIELD_REFERENCE, + new IndexReferenceCallback() { + @Override + public Reference createIndexReference(String value) { + return BladeIndexer.extractYieldDataFromIndex(value); + } + } + ); + } + + public List queryStacksIdsReference(String prefix) { + return queryIndexedReferences(prefix, + BladeIndexer.STACK_REFERENCE, + new IndexReferenceCallback() { + @Override + public Reference createIndexReference(String value) { + return BladeIndexer.extractStackDataFromIndex(value); + } + } + ); + } + + private List queryIndexedReferences(String prefix, String indexKey, IndexReferenceCallback callback) { + List references = new ArrayList<>(); + try { + Collection result = querySupport.query(indexKey, + prefix, QuerySupport.Kind.PREFIX, indexKey); + + if (result == null || result.isEmpty()) { + return references; + } + + for (IndexResult indexResult : result) { + String[] values = indexResult.getValues(indexKey); + for (String value : values) { + if (value.startsWith(prefix)) { + references.add(new IndexedReference(callback.createIndexReference(value), indexResult.getFile())); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + + return references; + } + + public List findYieldIndexedReferences(String prefix) { + return findIndexedReferences(prefix, + BladeIndexer.YIELD_ID, + new String[]{BladeIndexer.YIELD_ID, BladeIndexer.YIELD_REFERENCE}, + BladeIndexer.YIELD_REFERENCE, + new IndexReferenceCallback() { + @Override + public Reference createIndexReference(String value) { + return BladeIndexer.extractYieldDataFromIndex(value); + } + } + ); + } + + private List findIndexedReferences(String prefix, + String indexKey, String[] valuesKeys, String valueKey, + IndexReferenceCallback callback) { + List references = new ArrayList<>(); + try { + Collection result = querySupport.query(indexKey, + prefix, QuerySupport.Kind.EXACT, valuesKeys); + + if (result == null || result.isEmpty()) { + return references; + } + + for (IndexResult indexResult : result) { + String[] values = indexResult.getValues(valueKey); + for (String value : values) { + String name = BladeIndexer.getIdFromSignature(value); + if (name != null && name.equals(prefix)) { + references.add( + new IndexedReference(callback.createIndexReference(value), + indexResult.getFile())); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + + return references; + } + + public List getIncludePaths(String prefix) { + List references = new ArrayList<>(); + Collection result; + try { + result = querySupport.query(BladeIndexer.INCLUDE_PATH, prefix, QuerySupport.Kind.PREFIX, BladeIndexer.INCLUDE_PATH); + + if (result == null || result.isEmpty()) { + return references; + } + + for (IndexResult indexResult : result) { + String[] values = indexResult.getValues(BladeIndexer.INCLUDE_PATH); + for (String value : values) { + Reference templatePathRef = BladeIndexer.extractTemplatePathDataFromIndex(value); + if (!templatePathRef.identifier.equals(prefix)) { + continue; + } + references.add(new IndexedOffsetReference(templatePathRef.identifier, indexResult.getFile(), templatePathRef.defOffset)); + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return references; + } + + public static interface IndexReferenceCallback { + + public Reference createIndexReference(String value); + } + + public static class IndexedReferenceId { + + private final String identifier; + private final FileObject originFile; + + public IndexedReferenceId(String identifier, FileObject originFile) { + this.identifier = identifier; + this.originFile = originFile; + } + + public String getIdenfiier() { + return this.identifier; + } + + public FileObject getOriginFile() { + return this.originFile; + } + } + + public static class IndexedReference { + + private final Reference reference; + private final FileObject originFile; + + public IndexedReference(Reference reference, FileObject originFile) { + this.reference = reference; + this.originFile = originFile; + } + + public Reference getReference() { + return this.reference; + } + + public FileObject getOriginFile() { + return this.originFile; + } + } + + public static class IndexedOffsetReference { + + private final String identifier; + private final FileObject originFile; + private final OffsetRange range; + + public IndexedOffsetReference(String identifier, + FileObject originFile, OffsetRange range) { + this.identifier = identifier; + this.originFile = originFile; + this.range = range; + } + + public String getReference() { + return this.identifier; + } + + public FileObject getOriginFile() { + return this.originFile; + } + + public int getStart() { + return this.range.getStart(); + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndexer.java new file mode 100644 index 000000000000..d7f9f5d5a32d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndexer.java @@ -0,0 +1,295 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.indexing; + +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.netbeans.api.editor.mimelookup.MimeRegistration; +import org.netbeans.api.project.Project; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.parsing.api.Snapshot; +import org.netbeans.modules.parsing.spi.Parser; +import org.netbeans.modules.parsing.spi.indexing.Context; +import org.netbeans.modules.parsing.spi.indexing.EmbeddingIndexer; +import org.netbeans.modules.parsing.spi.indexing.EmbeddingIndexerFactory; +import org.netbeans.modules.parsing.spi.indexing.Indexable; +import org.netbeans.modules.parsing.spi.indexing.support.IndexingSupport; +import org.netbeans.modules.parsing.spi.indexing.support.IndexDocument; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.Reference; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.ReferenceType; +import org.netbeans.modules.php.blade.editor.path.BladePathUtils; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.openide.filesystems.FileObject; +import org.openide.util.Exceptions; + +/** + * move to language EmbeddingIndexerFactory getIndexerFactory ? + * + * @author bhaidu + */ +public class BladeIndexer extends EmbeddingIndexer { + + private static final Logger LOGGER = Logger.getLogger(BladeIndexer.class.getSimpleName()); + public static final String BLADE_INDEXED = "indexed"; //NOI18N + public static final String YIELD_REFERENCE = "yield"; //NOI18N + public static final String YIELD_ID = "yieldid"; //NOI18N + public static final String STACK_REFERENCE = "stack"; //NOI18N + public static final String STACK_ID = "stackid"; //NOI18N + public static final String INCLUDE_PATH = "include"; //NOI18N + public static final String BLADE_PATH = "path"; //NOI18N + public static final String INFO_SEPARATOR = "#"; //NOI18N + + @Override + protected void index(Indexable indxbl, Parser.Result result, Context context) { + long startTime = System.currentTimeMillis(); + LOGGER.log(Level.INFO, "Indexer requested {0}", context.getIndexFolder().getName()); + BladeParserResult parserResult; + if (result instanceof BladeParserResult) { + parserResult = (BladeParserResult) result; + } else { + return; + } + + //we have errors + if (!parserResult.getDiagnostics().isEmpty()) { + return; + } + // LOGGER.log(Level.INFO, "indexing {0}", result.getSnapshot().getSource().getFileObject().getName()); + try { + IndexingSupport support = IndexingSupport.getInstance(context); + // we need to remove old documents (document per object, not file) + support.removeDocuments(indxbl); + IndexDocument document = support.createDocument(indxbl); + + if (!parserResult.getYieldReferences().isEmpty()) { + storeYieldReferences(parserResult.getYieldReferences(), document); + } + + if (!parserResult.getStackReferences().isEmpty()) { + storeStackReferences(parserResult.getStackReferences(), document); + } + + if (!parserResult.includeBladeOccurences.isEmpty()) { + storeIncludePathReferences(parserResult.includeBladeOccurences, document); + } + + storeFilePathAsBladePath(parserResult.getSnapshot().getSource().getFileObject(), document); + + document.addPair(BLADE_INDEXED, Boolean.TRUE.toString(), true, true); + + support.addDocument(document); + LOGGER.log(Level.INFO, "Indexer finished {0}", System.currentTimeMillis() - startTime); + } catch (IOException ex) { + LOGGER.log(Level.WARNING, null, ex); + Exceptions.printStackTrace(ex); + } catch (Exception ex) { + Exceptions.printStackTrace(ex); + } + } + + private void storeYieldReferences(Map yields, IndexDocument document) { + + for (Map.Entry entry : yields.entrySet()) { + StringBuilder sb = new StringBuilder(); + Reference ref = entry.getValue(); + //used for completion + document.addPair(YIELD_ID, entry.getKey(), true, true); + sb.append(entry.getKey()).append(INFO_SEPARATOR).append(ref.defOffset.getStart()).append(";").append(ref.defOffset.getEnd()); //NOI18N + //used for declaration finder + document.addPair(YIELD_REFERENCE, sb.toString(), true, true); + } + } + + private void storeStackReferences(Map stacks, IndexDocument document) { + + for (Map.Entry entry : stacks.entrySet()) { + StringBuilder sb = new StringBuilder(); + Reference ref = entry.getValue(); + //used for completion + document.addPair(STACK_ID, entry.getKey(), true, true); + //do we need end ?? + sb.append(entry.getKey()).append(INFO_SEPARATOR).append(ref.defOffset.getStart()).append(";").append(ref.defOffset.getEnd()); //NOI18N + //used for declaration finder + document.addPair(STACK_REFERENCE, sb.toString(), true, true); + } + } + + private void storeFilePathAsBladePath(FileObject fo, IndexDocument document) { + Project project = ProjectUtils.getMainOwner(fo); + if (project == null) { + return; + } + List roots = BladePathUtils.getCustomViewsRoots(project, fo); + String filePath = fo.getPath(); + + for (FileObject root : roots) { + String rootPath = root.getPath(); + if (filePath.startsWith(rootPath)) { + String bladeFormatPath = BladePathUtils.toBladeViewPath(filePath.replace(rootPath, "")); + if (bladeFormatPath.startsWith(".")) { + bladeFormatPath = bladeFormatPath.substring(1, bladeFormatPath.length()); + } + document.addPair(BLADE_PATH, bladeFormatPath, true, true); + } + } + } + + public static Reference extractYieldDataFromIndex(String index) { + String[] mainElements = index.split(INFO_SEPARATOR); + + if (mainElements.length == 0) { + return null; + } + + String name = mainElements[0]; + String offsets[] = mainElements[1].split(";"); + int start = 0; + int end = 1; + + if (offsets.length > 0) { + start = Integer.parseInt(offsets[0]); + end = Integer.parseInt(offsets[1]); + } + + return new Reference(ReferenceType.YIELD, name, new OffsetRange(start, end)); + } + + public static Reference extractStackDataFromIndex(String index) { + String[] mainElements = index.split(INFO_SEPARATOR); + + if (mainElements.length == 0) { + return null; + } + + String name = mainElements[0]; + String offsets[] = mainElements[1].split(";"); + int start = 0; + int end = 1; + + if (offsets.length > 0) { + start = Integer.parseInt(offsets[0]); + end = Integer.parseInt(offsets[1]); + } + + return new Reference(ReferenceType.STACK, name, new OffsetRange(start, end)); + } + + public static Reference extractTemplatePathDataFromIndex(String indexInfo) { + String[] mainElements = indexInfo.split(INFO_SEPARATOR); + + if (mainElements.length == 0) { + return null; + } + + String name = mainElements[0]; + String offsets[] = mainElements[1].split(";"); + int start = 0; + int end = 1; + + if (offsets.length > 0) { + start = Integer.parseInt(offsets[0]); + end = start + name.length(); + } + + return new Reference(ReferenceType.TEMPLATE_PATH, name, new OffsetRange(start, end)); + } + + public static String getIdFromSignature(String value) { + String[] mainElements = value.split(INFO_SEPARATOR); + if (mainElements.length == 0) { + return null; + } + + return mainElements[0]; + } + + private void storeIncludePathReferences(Map> includes, IndexDocument document) { + for (Map.Entry> entry : includes.entrySet()) { + StringBuilder sb = new StringBuilder(); + + sb.append(entry.getKey()).append(INFO_SEPARATOR); + for (OffsetRange range : entry.getValue()) { + sb.append(range.getStart()); //NOI18N + sb.append(";");//NOI18N + } + + document.addPair(INCLUDE_PATH, sb.toString(), true, true); + } + } + + @MimeRegistration(mimeType = BladeLanguage.MIME_TYPE, service = EmbeddingIndexerFactory.class, position = 500) //NOI18N + public static class Factory extends EmbeddingIndexerFactory { + + public static final String NAME = "blade"; //NOI18N + public static final int VERSION = 2; + + @Override + public EmbeddingIndexer createIndexer(Indexable indxbl, Snapshot snapshot) { + if (isIndexable(snapshot)) { + return new BladeIndexer(); + } else { + return null; + } + } + + @Override + public void filesDeleted(Iterable deleted, Context context) { + try { + IndexingSupport is = IndexingSupport.getInstance(context); + for (Indexable i : deleted) { + is.removeDocuments(i); + } + } catch (IOException ioe) { + LOGGER.log(Level.WARNING, null, ioe); + } + } + + @Override + public void filesDirty(Iterable dirty, org.netbeans.modules.parsing.spi.indexing.Context context) { + try { + IndexingSupport is = IndexingSupport.getInstance(context); + for (Indexable i : dirty) { + is.markDirtyDocuments(i); + } + } catch (IOException ioe) { + LOGGER.log(Level.WARNING, null, ioe); + } + } + + @Override + public String getIndexerName() { + return NAME; + } + + @Override + public int getIndexVersion() { + return VERSION; + } + + private boolean isIndexable(Snapshot snapshot) { + return BladeLanguage.MIME_TYPE.equals(snapshot.getMimeType()); + } + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/IndexManager.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/IndexManager.java new file mode 100644 index 000000000000..701b1c268db6 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/IndexManager.java @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.indexing; + +import java.io.File; +import java.util.Enumeration; +import org.netbeans.api.project.Project; +import org.netbeans.modules.parsing.api.indexing.IndexingManager; +import org.netbeans.modules.php.blade.project.BladeProjectProperties; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; + +/** + * + * @author bogdan + */ +public class IndexManager { + + public static void reindexProjectViews(Project project) { + assert project != null; + String[] views = BladeProjectProperties.getInstance(project).getViewsPathList(); + + if (views.length > 0) { + for (String view : views) { + if (view.length() == 0) { + continue; + } + File viewPath = new File(view); + if (viewPath.exists()) { + FileObject fileObj = FileUtil.toFileObject(viewPath); + Enumeration children = fileObj.getChildren(true); + while (children.hasMoreElements()) { + FileObject file = children.nextElement(); + if (file.isFolder()) { + continue; + } + IndexingManager.getDefault().refreshAllIndices(file); + } + } + } + } else { + //falback + String projectDir = project.getProjectDirectory().getPath(); + File viewPath = new File(projectDir + "/views"); + if (viewPath.exists()) { + FileObject fileObj = FileUtil.toFileObject(viewPath); + Enumeration children = fileObj.getChildren(true); + while (children.hasMoreElements()) { + FileObject file = children.nextElement(); + IndexingManager.getDefault().refreshAllIndices(file); + } + } + } + } + + public static void reindexFolder(File viewPath) { + FileObject fileObj = FileUtil.toFileObject(viewPath); + Enumeration children = fileObj.getChildren(true); + while (children.hasMoreElements()) { + FileObject file = children.nextElement(); + if (file.isFolder()) { + continue; + } + IndexingManager.getDefault().refreshAllIndices(file); + } + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexFunctionResult.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexFunctionResult.java new file mode 100644 index 000000000000..439b3bad1f33 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexFunctionResult.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.indexing; + +import java.util.List; +import org.netbeans.modules.csl.api.OffsetRange; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class PhpIndexFunctionResult extends PhpIndexResult { + + protected final List params; + protected final String classNamespace; + + public PhpIndexFunctionResult(String name, FileObject fo, + PhpIndexFunctionResult.Type type, + OffsetRange range, String classNamespace, List params) { + super(name, fo, type, range); + this.params = params; + this.classNamespace = classNamespace; + } + + public String getParamsAsString() { + if (params == null || params.isEmpty()){ + return "()"; + } + return "(" + String.join(", ", params) + ")"; + } + + public List getParams(){ + return params; + } + + public String getClassNamespace(){ + return classNamespace; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexResult.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexResult.java new file mode 100644 index 000000000000..7db56cacdf88 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexResult.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.indexing; + +import org.netbeans.modules.csl.api.OffsetRange; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class PhpIndexResult { + public static enum Type{ + CLASS, + FUNCTION, + NAMESPACE, + CONSTANT + }; + + public String name; + public String namespace; + public FileObject declarationFile; + public PhpIndexResult.Type type; + public OffsetRange range; + + public PhpIndexResult(String name, FileObject fo, + PhpIndexResult.Type type, + OffsetRange range){ + this.name = name; + this.declarationFile = fo; + this.type = type; + this.range = range; + } + + public PhpIndexResult(String name, String qualifiedName, FileObject fo, + PhpIndexResult.Type type, + OffsetRange range){ + this.name = name; + this.namespace = qualifiedName; + this.declarationFile = fo; + this.type = type; + this.range = range; + } + + public int getStartOffset(){ + return this.range.getStart(); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java new file mode 100644 index 000000000000..9513b7f7da95 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java @@ -0,0 +1,812 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.indexing; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.WeakHashMap; +import org.netbeans.api.project.Project; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.parsing.spi.indexing.support.IndexResult; +import org.netbeans.modules.parsing.spi.indexing.support.QuerySupport; +import org.netbeans.modules.php.blade.editor.cache.QueryCache; +import org.netbeans.modules.php.editor.api.QuerySupportFactory; +import org.netbeans.modules.php.editor.index.PHPIndexer; +import org.netbeans.modules.php.editor.index.Signature; +import org.netbeans.spi.project.ui.support.ProjectConvertors; +import org.openide.filesystems.FileObject; +import org.openide.util.Exceptions; + +/** + * TODO needs simplification & refactor + * + * @author bhaidu + */ +public class PhpIndexUtils { + + private final static QueryCache> cache = new QueryCache(); + private final static QueryCache> functionCache = new QueryCache(); + + private static final Map QUERY_SUPPORT_INSTANCES = new WeakHashMap<>(); + + /** + * class query without namespace + * + * @param fo + * @param prefix + * @return + */ + public static Collection queryClass(FileObject fo, String prefix) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + + QueryCache> selfCache = getCache(fo, prefix); + if (selfCache != null && selfCache.containsKey(prefix)) { + return selfCache.get(prefix).get(); + } + Collection results = new ArrayList<>(); + String queryPrefix = prefix.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_CLASS, + queryPrefix, QuerySupport.Kind.PREFIX, new String[]{ + PHPIndexer.FIELD_CLASS,}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + + String[] values = indexResult.getValues(PHPIndexer.FIELD_CLASS); + for (String value : values) { + Signature sig = Signature.get(value); + String fullName = sig.string(1); + String namespace = sig.string(4); + + if (fullName.length() > 0 && fullName.startsWith(prefix)) { + results.add(new PhpIndexResult(fullName, namespace, + indexFile, + PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + + if (selfCache != null && !results.isEmpty()) { + selfCache.put(prefix, results); + } + return results; + } + + public static Collection queryNamespaceClassesName(String prefix, + String namespace, FileObject fo) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + String queryPrefix = prefix.toLowerCase() + ".*" + namespace.replace("\\", "\\\\") + ";.*"; + + try { + Collection indexResults = phpindex.query( + PHPIndexer.FIELD_CLASS, queryPrefix, QuerySupport.Kind.REGEXP, new String[]{ + PHPIndexer.FIELD_CLASS, PHPIndexer.FIELD_FIELD}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + + String[] values = indexResult.getValues(PHPIndexer.FIELD_CLASS); + //should use this approach on methods + //String[] fields = indexResult.getValues(PHPIndexer.FIELD_FIELD); + for (String value : values) { + Signature sig = Signature.get(value); + String fullName = sig.string(1); + String classNamespace = sig.string(4); + if (fullName.length() > 0 + && classNamespace.length() > 0 + && classNamespace.startsWith(namespace)) { + results.add(new PhpIndexResult(fullName, + classNamespace + "\\" + fullName, indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + public static Collection queryExactNamespaceClasses(String identifier, + String namespace, FileObject fo) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + + try { + Collection indexResults = phpindex.query( + PHPIndexer.FIELD_TOP_LEVEL, namespace.toLowerCase(), QuerySupport.Kind.EXACT, + new String[]{ + PHPIndexer.FIELD_NAMESPACE + }); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + + if (!indexFile.getName().equals(identifier)){ + continue; + } + + String namespaceValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); + + if (namespaceValue == null){ + continue; + } + + results.add(new PhpIndexResult(namespace + "\\" + identifier, indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + public static Collection queryComponentClass(String identifier, + String namespace, FileObject fo) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + + try { + Collection indexResults = phpindex.query( + PHPIndexer.FIELD_TOP_LEVEL, namespace.toLowerCase(), QuerySupport.Kind.PREFIX, + new String[]{ + PHPIndexer.FIELD_NAMESPACE + }); + for (IndexResult indexResult : indexResults) { + String namespaceValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); + if (namespaceValue == null){ + continue; + } + Signature sig = Signature.get(namespaceValue); + String name = sig.string(1); + String domainName = sig.string(2); + FileObject indexFile = indexResult.getFile(); + if (indexFile.getName().equals(identifier)) { + results.add(new PhpIndexResult(domainName + "\\" + name + "\\" + indexFile.getName(), + indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + public static Collection queryExactClass(FileObject fo, String identifier) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + QueryCache> selfCache = getCache(fo, identifier); + if (selfCache != null && selfCache.containsKey(identifier)) { + return selfCache.get(identifier).get(); + } + Collection results = new ArrayList<>(); + String queryPrefix = identifier.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_CLASS, + queryPrefix, QuerySupport.Kind.PREFIX, new String[]{PHPIndexer.FIELD_CLASS}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + + String[] values = indexResult.getValues(PHPIndexer.FIELD_CLASS); + for (String value : values) { + Signature sig = Signature.get(value); + String name = sig.string(1); + if (name.length() > 0 && name.equals(identifier)) { + results.add(new PhpIndexResult(name, indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + if (selfCache != null && !results.isEmpty()) { + selfCache.put(identifier, results); + } + return results; + } + + public static Collection queryFunctions(FileObject fo, String prefix) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + String queryPrefix = prefix.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_BASE, queryPrefix, QuerySupport.Kind.PREFIX, new String[]{PHPIndexer.FIELD_BASE}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + //internal php index + + String[] values = indexResult.getValues(PHPIndexer.FIELD_BASE); + for (String value : values) { + Signature sig = Signature.get(value); + String name = sig.string(1); + + if (name.length() > 0 && name.startsWith(prefix)) { + Integer offset = sig.integer(2); + String params = sig.string(3); + results.add(new PhpIndexFunctionResult( + name, indexFile, + PhpIndexResult.Type.FUNCTION, + new OffsetRange(offset, offset + name.length()), + null, + parseParameters(params) + )); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + public static Collection queryExactFunctions(FileObject fo, String prefix) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + QueryCache> selfCache = getFunctionCache(fo, prefix); + if (selfCache != null && selfCache.containsKey(prefix)) { + return selfCache.get(prefix).get(); + } + String queryPrefix = prefix.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_BASE, queryPrefix, QuerySupport.Kind.PREFIX, new String[]{PHPIndexer.FIELD_BASE}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + //internal php index + + String[] values = indexResult.getValues(PHPIndexer.FIELD_BASE); + for (String value : values) { + Signature sig = Signature.get(value); + String name = sig.string(1); + + if (name.length() > 0 && name.equals(prefix)) { + Integer offset = sig.integer(2); + String params = sig.string(3); + results.add(new PhpIndexFunctionResult(name, + indexFile, PhpIndexResult.Type.FUNCTION, + new OffsetRange(offset, offset + name.length()), + null, + parseParameters(params) + )); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + if (selfCache != null && !results.isEmpty()) { + selfCache.put(prefix, results); + } + return results; + } + + //should query the class before? + public static Collection queryExactClassMethods(FileObject fo, + String method, String className, String queryNamespace) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + //for the moment a quick hack + //maybe send the classNamePath directly? + String regexQuery = className.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_CLASS, regexQuery, + QuerySupport.Kind.PREFIX, new String[]{PHPIndexer.FIELD_CLASS, PHPIndexer.FIELD_METHOD}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + //internal php index + String[] classValues = indexResult.getValues(PHPIndexer.FIELD_CLASS); + + Signature classSignature = null; + String classNamespace = null; + + for (String classValue : classValues) { + Signature sig = Signature.get(classValue); + String name = sig.string(1); + String namespace = sig.string(4); + if (name.length() > 0 && name.equals(className) + ) { + if (queryNamespace != null && !namespace.equals(queryNamespace)){ + continue; + } + classSignature = sig; + + if (namespace.length() > 0){ + classNamespace = namespace + "\\" + className; + } + } + } + + if (classSignature == null){ + continue; + } + + String[] values = indexResult.getValues(PHPIndexer.FIELD_METHOD); + for (String value : values) { + Signature sig = Signature.get(value); + String name = sig.string(1); + + if (name.length() > 0 && name.equals(method)) { + Integer offset = sig.integer(2); + String params = sig.string(3); + results.add(new PhpIndexFunctionResult(name, + indexFile, PhpIndexResult.Type.FUNCTION, + new OffsetRange(offset, offset + name.length()), + classNamespace, + parseParameters(params) + )); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + /** + * + * + * @param fo + * @param method + * @param className + * @param queryNamespace + * @return + */ + public static Collection queryClassMethods(FileObject fo, + String method, String className, String queryNamespace) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + + if (queryNamespace != null && queryNamespace.length() > 3){ + int startOffset = queryNamespace.startsWith("\\") ? 1 : 0; + int endOffset = queryNamespace.endsWith("\\") ? 1 : 0; + queryNamespace = queryNamespace.substring(startOffset, queryNamespace.length() - endOffset); + } + //should query the class befoe + //for the moment a quick hack + //maybe send the classNamePath directly? + String regexQuery = className.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_CLASS, regexQuery, + QuerySupport.Kind.PREFIX, new String[]{PHPIndexer.FIELD_CLASS, PHPIndexer.FIELD_METHOD}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + String[] classValues = indexResult.getValues(PHPIndexer.FIELD_CLASS); + + Signature classSignature = null; + String classNamespace = null; + + for (String classValue : classValues) { + Signature sig = Signature.get(classValue); + String name = sig.string(1); + if (name.length() > 0 && name.equals(className)) { + classSignature = sig; + String namespace = sig.string(4); + + if (queryNamespace != null && !namespace.equals(queryNamespace) ){ + classSignature = null; + continue; + } + + if (namespace.length() > 0){ + classNamespace = namespace + "\\" + className; + } + } + } + + if (classSignature == null){ + continue; + } + + String[] values = indexResult.getValues(PHPIndexer.FIELD_METHOD); + for (String value : values) { + Signature sig = Signature.get(value); + String name = sig.string(1); + + if (name.length() > 0 && name.startsWith(method)) { + Integer offset = sig.integer(2); + String params = sig.string(3); + results.add(new PhpIndexFunctionResult(name, + indexFile, PhpIndexResult.Type.FUNCTION, + new OffsetRange(offset, offset + name.length()), + classNamespace, + parseParameters(params) + )); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + public static Collection queryConstants(FileObject fo, String prefix) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + String queryPrefix = prefix.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_CONST, queryPrefix, QuerySupport.Kind.PREFIX, new String[]{PHPIndexer.FIELD_CONST}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + //internal php index + + String[] values = indexResult.getValues(PHPIndexer.FIELD_CONST); + for (String value : values) { + Signature sig = Signature.get(value); + String name = sig.string(1); + + if (name.length() > 0 && name.startsWith(prefix)) { + Integer offset = sig.integer(2); + results.add(new PhpIndexResult(name, indexFile, PhpIndexResult.Type.CONSTANT, new OffsetRange(offset, offset + name.length()))); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + public static Collection queryNamespace(FileObject fo, String prefix) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + Collection namespaces = new ArrayList<>(); + //subfolders with lowercase ; rootFolder + //third signature namespace + //the first el is the folder + String originalPrefix = prefix; + + if (prefix.endsWith("\\\\")) { + return results; + } + + String[] queryItems = prefix.split("\\\\"); + + if (queryItems.length == 0) { + return results; + } + + String queryPrefix = prefix.toLowerCase(); + + try { + Collection indexResults = phpindex.query( + PHPIndexer.FIELD_TOP_LEVEL, queryPrefix + "\\", QuerySupport.Kind.PREFIX, new String[]{ + PHPIndexer.FIELD_NAMESPACE, PHPIndexer.FIELD_TOP_LEVEL}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + String topFieldValue = indexResult.getValue(PHPIndexer.FIELD_TOP_LEVEL); + //internal php index + if (topFieldValue.startsWith(prefix.toLowerCase())) { + String firstValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); + if (firstValue == null || firstValue.isEmpty()) { + continue; + } + Signature sig = Signature.get(firstValue); + + String name = sig.string(1); + String namespace = sig.string(2); + + String fullNamespace = ""; + + if (!namespace.isEmpty()) { + fullNamespace = namespace + "\\"; + } + + fullNamespace += name; + + //just one namespace is enough + if (fullNamespace.startsWith(originalPrefix) && !namespaces.contains(fullNamespace)) { + namespaces.add(fullNamespace); + results.add(new PhpIndexResult(fullNamespace, indexFile, PhpIndexResult.Type.NAMESPACE, new OffsetRange(0, 1))); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + public static Collection queryNamespaces(FileObject fo, String namespace, + QuerySupport.Kind queryType) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + String queryPrefix = namespace.toLowerCase(); + + try { + Collection indexResults = phpindex.query( + PHPIndexer.FIELD_TOP_LEVEL, queryPrefix, queryType, + new String[]{ + PHPIndexer.FIELD_NAMESPACE, + PHPIndexer.FIELD_TOP_LEVEL + }); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + String namespaceValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); + //no namespace found + if (namespaceValue == null){ + continue; + } + results.add(new PhpIndexResult(namespaceValue, indexFile, PhpIndexResult.Type.NAMESPACE, new OffsetRange(0, 1))); + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + /** + * a optimized hack solution + * assuming that the name of the class is the same with the file + * + * @param fo + * @param namespace + * @return + */ + public static Collection queryAllNamespaceClasses(FileObject fo, String namespace) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + String queryPrefix = namespace.toLowerCase(); + + try { + Collection indexResults = phpindex.query( + PHPIndexer.FIELD_TOP_LEVEL, queryPrefix, QuerySupport.Kind.EXACT, + new String[]{ + PHPIndexer.FIELD_NAMESPACE, + PHPIndexer.FIELD_TOP_LEVEL + }); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + String namespaceValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); + //no namespace found + if (namespaceValue == null){ + continue; + } + results.add(new PhpIndexResult(indexFile.getName(), indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + public static Collection queryClassConstants(FileObject fo, String prefix, String ownerClass) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + String queryPrefix = prefix.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_CLASS_CONST, queryPrefix, QuerySupport.Kind.PREFIX, new String[]{ + PHPIndexer.FIELD_CLASS_CONST, PHPIndexer.FIELD_CLASS}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + //internal php index + + String classOwnerName = indexResult.getValue(PHPIndexer.FIELD_CLASS); + if (classOwnerName == null || !classOwnerName.startsWith(ownerClass.toLowerCase())) { + continue; + } + String[] values = indexResult.getValues(PHPIndexer.FIELD_CLASS_CONST); + for (String value : values) { + Signature sig = Signature.get(value); + String name = sig.string(1); + + if (name.length() > 0 && name.startsWith(prefix)) { + Integer offset = sig.integer(2); + results.add(new PhpIndexResult(name, indexFile, PhpIndexResult.Type.CONSTANT, new OffsetRange(offset, offset + name.length()))); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + /** + * @notused TO BE continued + * + * @param fo + * @param prefix + * @param ownerClass + * @return + */ + public static Collection queryClassProperties(FileObject fo, String prefix, String ownerClass){ + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + String queryPrefix = prefix.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_FIELD, queryPrefix, QuerySupport.Kind.PREFIX, new String[]{ + PHPIndexer.FIELD_FIELD, PHPIndexer.FIELD_CLASS}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + //internal php index + + String classOwnerName = indexResult.getValue(PHPIndexer.FIELD_CLASS); + if (classOwnerName == null || !classOwnerName.startsWith(ownerClass.toLowerCase() + ";")) { + continue; + } + String[] values = indexResult.getValues(PHPIndexer.FIELD_FIELD); + for (String value : values) { + Signature sig = Signature.get(value); + String name = sig.string(1); + + if (name.length() > 0 && name.equals(prefix)) { + Integer offset = sig.integer(2); + results.add(new PhpIndexResult(name, indexFile, PhpIndexResult.Type.CONSTANT, new OffsetRange(offset, offset + name.length()))); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + public static Collection queryExactClassConstants(FileObject fo, String prefix, String ownerClass) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + String queryPrefix = prefix.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_CLASS_CONST, queryPrefix, QuerySupport.Kind.PREFIX, new String[]{ + PHPIndexer.FIELD_CLASS_CONST, PHPIndexer.FIELD_CLASS}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + //internal php index + + String classOwnerName = indexResult.getValue(PHPIndexer.FIELD_CLASS); + if (!classOwnerName.startsWith(ownerClass.toLowerCase() + ";")) { + continue; + } + String[] values = indexResult.getValues(PHPIndexer.FIELD_CLASS_CONST); + for (String value : values) { + Signature sig = Signature.get(value); + String name = sig.string(1); + + if (name.length() > 0 && name.equals(prefix)) { + Integer offset = sig.integer(2); + results.add(new PhpIndexResult(name, indexFile, PhpIndexResult.Type.CONSTANT, new OffsetRange(offset, offset + name.length()))); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + public static Collection queryExactConstants(FileObject fo, String prefix) { + QuerySupport phpindex = QuerySupportFactory.get(fo); + Collection results = new ArrayList<>(); + String queryPrefix = prefix.toLowerCase(); + try { + Collection indexResults = phpindex.query(PHPIndexer.FIELD_CONST, queryPrefix, QuerySupport.Kind.PREFIX, new String[]{PHPIndexer.FIELD_CONST}); + for (IndexResult indexResult : indexResults) { + FileObject indexFile = indexResult.getFile(); + //internal php index + + String[] values = indexResult.getValues(PHPIndexer.FIELD_CONST); + for (String value : values) { + Signature sig = Signature.get(value); + String name = sig.string(1); + + if (name.length() > 0 && name.equals(prefix)) { + Integer offset = sig.integer(2); + results.add(new PhpIndexResult(name, indexFile, PhpIndexResult.Type.FUNCTION, new OffsetRange(offset, offset + name.length()))); + } + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return results; + } + + static List parseParameters(final String signature) { + List retval = new ArrayList<>(); + if (signature != null && signature.length() > 0) { + final String regexp = String.format("\\%s", ","); //NOI18N + + for (String sign : signature.split(regexp)) { + try { + final String param = parseOneParameter(sign); + if (param != null) { + retval.add(param); + } + } catch (NumberFormatException originalException) { + final String message = String.format("%s [for signature: %s]", originalException.getMessage(), signature); //NOI18N + final NumberFormatException formatException = new NumberFormatException(message); + formatException.initCause(originalException); + throw formatException; + } + } + } + return retval; + } + + /** + * TODO improve the function param parsing + * + * @param sig + * @return + */ + static String parseOneParameter(String sig) { + String retval = null; + final String regexp = String.format("\\%s", ":"); //NOI18N + String[] parts = sig.split(regexp); + if (parts.length > 0) { + String paramName = parts[0]; + boolean isRawType = Integer.parseInt(parts[2]) > 0; + boolean isMandatory = Integer.parseInt(parts[4]) > 0; + boolean isReference = Integer.parseInt(parts[5]) > 0; + boolean isVariadic = Integer.parseInt(parts[6]) > 0; + boolean isUnionType = Integer.parseInt(parts[7]) > 0; + int modifier = Integer.parseInt(parts[8]); + boolean isIntersectionType = Integer.parseInt(parts[9]) > 0; + String defValue = parts.length > 3 ? parts[3] : null; + String declaredType = parts.length > 10 ? parts[10] : null; + String phpdocType = parts.length > 11 ? parts[11] : null; + retval = paramName; + } + return retval; + } + + protected static QueryCache> getCache(FileObject fo, String prefix) { + QueryCache> selfCache = new QueryCache<>(); + Project projectOwner = ProjectConvertors.getNonConvertorOwner(fo); + if (projectOwner == null) { + return null; + } + int pathHash = projectOwner.getProjectDirectory().toString().hashCode(); + if (PhpIndexUtils.QUERY_SUPPORT_INSTANCES.containsKey(pathHash)) { + PhpIndexUtils indexUtils = QUERY_SUPPORT_INSTANCES.get(pathHash); + selfCache = indexUtils.getQueryCache(); + + } else { + QUERY_SUPPORT_INSTANCES.put(pathHash, new PhpIndexUtils()); + } + return selfCache; + } + + protected static QueryCache> getFunctionCache(FileObject fo, String prefix) { + QueryCache> selfCache = new QueryCache<>(); + Project projectOwner = ProjectConvertors.getNonConvertorOwner(fo); + if (projectOwner == null) { + return null; + } + int pathHash = projectOwner.getProjectDirectory().toString().hashCode(); + if (PhpIndexUtils.QUERY_SUPPORT_INSTANCES.containsKey(pathHash)) { + PhpIndexUtils indexUtils = QUERY_SUPPORT_INSTANCES.get(pathHash); + selfCache = indexUtils.getFunctionQueryCache(); + + } else { + QUERY_SUPPORT_INSTANCES.put(pathHash, new PhpIndexUtils()); + } + return selfCache; + } + + public QueryCache> getQueryCache() { + return cache; + } + + public QueryCache> getFunctionQueryCache() { + return functionCache; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java new file mode 100644 index 000000000000..4e7cb2972de2 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.indexing; + +import java.io.IOException; +import java.util.List; +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.openide.filesystems.FileObject; +import org.openide.util.Exceptions; + +/** + * + * @author bogdan + */ +public class QueryUtils { + + public static List queryYieldReferences(String prefix, FileObject fo) { + BladeIndex bladeIndex = getIndex(fo); + if (bladeIndex == null) { + return null; + } + return bladeIndex.queryYieldIndexedReferences(prefix); + } + + public static List findYieldReferences(String prefix, FileObject fo) { + BladeIndex bladeIndex = getIndex(fo); + if (bladeIndex == null) { + return null; + } + return bladeIndex.findYieldIndexedReferences(prefix); + } + + public static List queryStacksReferences(String prefix, FileObject fo) { + BladeIndex bladeIndex = getIndex(fo); + if (bladeIndex == null) { + return null; + } + return bladeIndex.queryStacksIdsReference(prefix); + } + + public static List getIncludePathReferences(String prefix, FileObject fo) { + BladeIndex bladeIndex = getIndex(fo); + if (bladeIndex == null) { + return null; + } + return bladeIndex.getIncludePaths(prefix); + } + + public static BladeIndex getIndex(FileObject fo) { + Project project = ProjectUtils.getMainOwner(fo); + + try { + return BladeIndex.get(project); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + return null; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexer.java new file mode 100644 index 000000000000..b91d0bc13072 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexer.java @@ -0,0 +1,103 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.lexer; + +import org.netbeans.api.lexer.Token; +import static org.netbeans.modules.php.blade.editor.lexer.BladeTokenId.*; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrColoringLexer; +import org.netbeans.spi.lexer.LexerRestartInfo; +import org.netbeans.spi.lexer.antlr4.AbstractAntlrLexerBridge; + +/** + * + * @author bogdan + */ +public class BladeLexer extends AbstractAntlrLexerBridge { + + public BladeLexer(LexerRestartInfo info) { + super(info, BladeAntlrColoringLexer::new); + } + + @Override + public Object state() { + return new State(lexer); + } + + @Override + protected Token mapToken(org.antlr.v4.runtime.Token antlrToken) { + //debug text + //String text = antlrToken.getText(); + int type = antlrToken.getType(); + //System.out.println(text + " " + type); + switch (type) { + case BladeAntlrColoringLexer.BLADE_COMMENT_START: + return token(BLADE_COMMENT_START); + case BladeAntlrColoringLexer.BLADE_COMMENT: + return token(BLADE_COMMENT); + case BladeAntlrColoringLexer.BLADE_COMMENT_END: + return token(BLADE_COMMENT_END); + case BladeAntlrColoringLexer.HTML_TAG: + case BladeAntlrColoringLexer.HTML: + return token(HTML); + case BladeAntlrColoringLexer.PHP_INLINE: + return token(PHP_INLINE); + case BladeAntlrColoringLexer.PHP_EXPRESSION: + //System.out.println(antlrToken.getText()); + return token(PHP_BLADE_EXPRESSION); + case BladeAntlrColoringLexer.BLADE_PHP_INLINE: + return token(PHP_BLADE_INLINE_CODE); + case BladeAntlrColoringLexer.DIRECTIVE: + case BladeAntlrColoringLexer.D_PHP: + case BladeAntlrColoringLexer.D_ENDPHP: + case BladeAntlrColoringLexer.D_CUSTOM: + return token(BLADE_DIRECTIVE); + case BladeAntlrColoringLexer.RAW_TAG: + case BladeAntlrColoringLexer.CONTENT_TAG: + return token(BLADE_ECHO_DELIMITOR); + case BladeAntlrColoringLexer.BLADE_PHP_ECHO_EXPR: + return token(PHP_BLADE_ECHO_EXPR); + case BladeAntlrColoringLexer.D_UNKNOWN: + case BladeAntlrColoringLexer.D_AT: + return token(BLADE_DIRECTIVE_UNKNOWN); + case BladeAntlrColoringLexer.ERROR: + case BladeAntlrColoringLexer.WS_EXPR: + return token(WS_D); + default: + return token(OTHER); + } + } + + private static class State extends AbstractAntlrLexerBridge.LexerState { + + final int currentRuleType; + + public State(BladeAntlrColoringLexer lexer) { + super(lexer); + this.currentRuleType = lexer.getCurrentRuleType(); + } + + @Override + public void restore(BladeAntlrColoringLexer lexer) { + super.restore(lexer); + lexer.setCurrentRuleType(currentRuleType); + } + + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java new file mode 100644 index 000000000000..6c9020786636 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.lexer; + +import java.util.Arrays; +import java.util.List; +import javax.swing.text.Document; +import org.netbeans.api.lexer.Language; +import org.netbeans.api.lexer.TokenHierarchy; +import org.netbeans.api.lexer.TokenSequence; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; +import org.netbeans.modules.php.editor.lexer.PHPTokenId; + +/** + * + * @author bogdan + */ +public class BladeLexerUtils { + + public static TokenSequence getPhpTokenSequence(TokenHierarchy th, final int offset) { + return getTokenSequence(th, offset, PHPTokenId.language()); + } + + public static TokenSequence getPhpTokenSequence(final Document document, final int offset) { + TokenHierarchy th = TokenHierarchy.get(document); + return getTokenSequence(th, offset, PHPTokenId.language()); + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + public static TokenSequence getTokenSequence(final TokenHierarchy th, + final int offset, final Language language) { + TokenSequence ts = th.tokenSequence(language); + if (ts == null) { + List> list = th.embeddedTokenSequences(offset, true); + for (TokenSequence t : list) { + if (t.language() == language) { + ts = t; + break; + } + } + if (ts == null) { + list = th.embeddedTokenSequences(offset, false); + for (TokenSequence t : list) { + if (t.language() == language) { + ts = t; + break; + } + } + } + } + return ts; + } + + public static List tokensWithIdentifiableParam() { + return Arrays.asList(new Integer[]{ + D_EXTENDS, D_INCLUDE, D_INCLUDE_IF, D_INCLUDE_WHEN, + D_INCLUDE_UNLESS, D_EACH, D_SECTION, D_HAS_SECTION, D_SECTION_MISSING, + D_PUSH, D_PUSH_IF, D_PREPEND, D_USE, D_INJECT, D_ASSET_BUNDLER + }); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java new file mode 100644 index 000000000000..795605937553 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java @@ -0,0 +1,119 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.lexer; + +import java.util.Collection; +import java.util.EnumSet; +import java.util.WeakHashMap; +import org.netbeans.api.lexer.InputAttributes; +import org.netbeans.api.lexer.Language; +import org.netbeans.api.lexer.LanguagePath; +import org.netbeans.api.lexer.Token; +import org.netbeans.api.lexer.TokenId; +import org.netbeans.spi.lexer.LanguageEmbedding; +import org.netbeans.spi.lexer.LanguageHierarchy; +import org.netbeans.spi.lexer.LanguageProvider; +import org.netbeans.modules.php.editor.lexer.PHPTokenId; +import org.openide.util.Lookup; + +/** + * + * @author bogdan + */ +public enum BladeTokenId implements TokenId { + BLADE_COMMENT_START("blade_comment"), + BLADE_COMMENT("blade_comment"), + BLADE_COMMENT_END("blade_comment"), + BLADE_DIRECTIVE("blade_directive"), + BLADE_ECHO_DELIMITOR("blade_echo_delimiters"), + HTML("html"), + WS_D("html"), + BLADE_DIRECTIVE_UNKNOWN("at_string"), + PHP_BLADE_EXPRESSION("blade_php"), + PHP_BLADE_ECHO_EXPR("blade_php"), + PHP_BLADE_INLINE_CODE("blade_php"), + PHP_INLINE("php"), + OTHER("error"); + private final String category; + + BladeTokenId(String category) { + this.category = category; + } + + @Override + public String primaryCategory() { + return category; + } + + public static abstract class BladeLanguageHierarchy extends LanguageHierarchy { + + private final WeakHashMap> tokenLangCache + = new WeakHashMap<>(); + + @Override + protected Collection createTokenIds() { + return EnumSet.allOf(BladeTokenId.class); + } + + @Override + protected LanguageEmbedding embedding(Token token, + LanguagePath languagePath, InputAttributes inputAttributes) { + boolean joinHtml = true; + switch (token.id()) { + case PHP_INLINE: + Language phpLanguageCode = PHPTokenId.language(); + return phpLanguageCode != null ? LanguageEmbedding.create(phpLanguageCode, 0, 0, false) : null; + case PHP_BLADE_EXPRESSION: + case PHP_BLADE_ECHO_EXPR: + case PHP_BLADE_INLINE_CODE: + /** + * troubleshooting php embedding freeze (?:, ::) + * force a return null; + */ + Language phpLanguage = PHPTokenId.languageInPHP(); + return phpLanguage != null ? LanguageEmbedding.create(phpLanguage, 0, 0, false) : null; + case HTML: + LanguageEmbedding lang; + + if (tokenLangCache.containsKey(token.id())) { + lang = tokenLangCache.get(token.id()); + } else { + Language htmlLanguage = null; + + @SuppressWarnings("unchecked") + Collection providers = (Collection) Lookup.getDefault().lookupAll(LanguageProvider.class); + for (LanguageProvider provider : providers) { + htmlLanguage = (Language) provider.findLanguage("text/html"); //NOI18N + if (htmlLanguage != null) { + break; + } + } + + lang = htmlLanguage != null ? LanguageEmbedding.create(htmlLanguage, 0, 0, joinHtml) : null; + tokenLangCache.put(token.id(), lang); + } + + return lang; + default: + return null; + } + } + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/EditorUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/EditorUtils.java new file mode 100644 index 000000000000..6e304376950d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/EditorUtils.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.lexer; + +import javax.swing.text.Document; +import org.netbeans.api.lexer.TokenHierarchy; +import org.netbeans.api.lexer.TokenSequence; +import org.netbeans.api.project.Project; +import org.netbeans.editor.BaseDocument; +import org.netbeans.modules.editor.NbEditorUtilities; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.netbeans.modules.php.editor.lexer.PHPTokenId; +import org.openide.filesystems.FileObject; +import org.openide.loaders.DataObject; + +/** + * + * @author bogdan + */ +public class EditorUtils { + + public static TokenSequence getTokenSequence(Document doc, int offset) { + BaseDocument baseDoc = (BaseDocument) doc; + TokenSequence tokenSequence = null; + baseDoc.readLock(); + try { + TokenHierarchy hierarchy = TokenHierarchy.get(baseDoc); + tokenSequence = hierarchy.tokenSequence(PHPTokenId.language()); + } finally { + baseDoc.readUnlock(); + } + if (tokenSequence != null) { + tokenSequence.move(offset); + tokenSequence.moveNext(); + } + return tokenSequence; + + } + + public static FileObject getFileObjectFromDoc(Document doc) { + DataObject dObject = NbEditorUtilities.getDataObject(doc); + if (dObject != null) { + return dObject.getPrimaryFile().getParent(); + } + return null; + } + + public static Project getProjectOwner(Document doc) { + FileObject file = getFileObjectFromDoc(doc); + if (file == null){ + return null; + } + return ProjectUtils.getMainOwner(file); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureItem.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureItem.java new file mode 100644 index 000000000000..b3975d6ccfa1 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureItem.java @@ -0,0 +1,218 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.navigator; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import javax.swing.ImageIcon; +import org.netbeans.modules.csl.api.ElementHandle; +import org.netbeans.modules.csl.api.ElementKind; +import org.netbeans.modules.csl.api.HtmlFormatter; +import org.netbeans.modules.csl.api.Modifier; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.csl.api.StructureItem; +import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.modules.php.blade.editor.ResourceUtilities; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public abstract class BladeStructureItem implements ElementHandle, StructureItem { + + final String name; + final FileObject source; + final int startOffset; + final int stopOffset; + + public BladeStructureItem(String name, FileObject source, int startOffset, int stopOffset) { + this.name = name; + this.source = source; + this.startOffset = startOffset; + this.stopOffset = stopOffset; + } + + @Override + public String getSortText() { + return String.format("[%8d]", this.startOffset).replace(' ', '0'); + } + + @Override + public String getHtml(HtmlFormatter formatter) { + formatter.appendText(name); + return formatter.getText(); + } + + @Override + public ElementHandle getElementHandle() { + return this; + } + + @Override + public long getPosition() { + return startOffset; + } + + @Override + public long getEndPosition() { + return stopOffset; + } + + @Override + public ImageIcon getCustomIcon() { + return null; + } + + @Override + public FileObject getFileObject() { + return source; + } + + @Override + public String getMimeType() { + return source.getMIMEType(); + } + + @Override + public String getName() { + return name; + } + + @Override + public String getIn() { + return null; + } + + @Override + public Set getModifiers() { + return Collections.emptySet(); + } + + @Override + public boolean signatureEquals(ElementHandle handle) { + return false; + } + + @Override + public OffsetRange getOffsetRange(ParserResult result) { + return new OffsetRange(startOffset, stopOffset); + } + + public static final class DirectiveBlockStructureItem extends BladeStructureItem { + + private String identifier; + + public final List nestedItems = new ArrayList<>(); + + public DirectiveBlockStructureItem(String name, FileObject source, int startOffset, int stopOffset) { + super(name, source, startOffset, stopOffset); + } + + public DirectiveBlockStructureItem(String name, String identifier, FileObject source, int startOffset, int stopOffset) { + super(name, source, startOffset, stopOffset); + this.identifier = identifier; + } + + @Override + public boolean isLeaf() { + return nestedItems.isEmpty(); + } + + @Override + public List getNestedItems() { + return nestedItems; + } + + @Override + public ElementKind getKind() { + return ElementKind.CLASS; + } + + @Override + public String getHtml(HtmlFormatter formatter) { + formatter.appendText(name); + if (identifier != null) { + formatter.appendText(" "); + formatter.appendHtml(""); + formatter.appendHtml(""); + formatter.appendText(identifier); + formatter.appendHtml(""); + formatter.appendHtml(""); + } + return formatter.getText(); + } + + @Override + public ImageIcon getCustomIcon() { + return ResourceUtilities.loadResourceIcon("icons/layout.png"); + } + } + + public static class DirectiveInlineStructureItem extends BladeStructureItem { + + private String identifier; + + public DirectiveInlineStructureItem(String name, FileObject source, int startOffset, int stopOffset) { + super(name, source, startOffset, stopOffset); + } + + public DirectiveInlineStructureItem(String name, String identifier, FileObject source, int startOffset, int stopOffset) { + super(name, source, startOffset, stopOffset); + this.identifier = identifier; + } + + @Override + public boolean isLeaf() { + return true; + } + + @Override + public String getHtml(HtmlFormatter formatter) { + formatter.appendText(name); + if (identifier != null) { + formatter.appendText(" "); + formatter.appendHtml(""); + formatter.appendHtml(""); + formatter.appendText(identifier); + formatter.appendHtml(""); + formatter.appendHtml(""); + } + return formatter.getText(); + } + + @Override + public List getNestedItems() { + return Collections.emptyList(); + } + + @Override + public ElementKind getKind() { + return ElementKind.CLASS; + } + + @Override + public ImageIcon getCustomIcon() { + return ResourceUtilities.loadResourceIcon("icons/layout.png"); + } + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureScanner.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureScanner.java new file mode 100644 index 000000000000..7557b8a300e0 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureScanner.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.navigator; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.csl.api.StructureItem; +import org.netbeans.modules.csl.api.StructureScanner; +import org.netbeans.modules.csl.api.StructureScanner.Configuration; +import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; + +/** + * + * @author bhaidu + */ +public class BladeStructureScanner implements StructureScanner { + + @Override + public List scan(ParserResult info) { + return ((BladeParserResult)info).structure; + } + + @Override + public Map> folds(ParserResult info) { + Map> ret = Collections.singletonMap("codeblocks", ((BladeParserResult)info).folds); //NOI18N + return ret; + } + + @Override + public Configuration getConfiguration() { + return new Configuration(true, false); + } + +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java new file mode 100644 index 000000000000..09ef2be2f32e --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.parser; + +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; +import java.util.WeakHashMap; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.event.ChangeListener; +import org.netbeans.modules.parsing.api.Snapshot; +import org.netbeans.modules.parsing.api.Task; +import org.netbeans.modules.parsing.spi.ParseException; +import org.netbeans.modules.parsing.spi.SourceModificationEvent; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public class BladeParser extends org.netbeans.modules.parsing.spi.Parser { + private static final Logger LOGGER = Logger.getLogger(BladeParser.class.getName()); + BladeParserResult lastResult; + private static final WeakHashMap> CACHE = new WeakHashMap<>(); + + @Override + public void parse(Snapshot snapshot, Task task, SourceModificationEvent event) throws ParseException { + if (snapshot == null) { + return; + } + LOGGER.info(String.format("Parsing request for for " + task.getClass().getName() + " event changed : " + event.sourceChanged())); + if (task.getClass().getName().contains("HtmlCssIndexContributor")){ + LOGGER.log(Level.INFO, "Skipped parsing for {0}", task.getClass().getName()); + return; + } + long startTime = System.currentTimeMillis(); + BladeParserResult parserResult = createParserResult(snapshot); + + BladeParserResult parsed = parserResult.get(task.getClass().getName()); + //cacheResult(snapshot.getSource().getFileObject(), parsed); + lastResult = parsed; + //LOGGER.info(String.format("Finished parsing for " + task.getClass().getName() + ". Time : %d ms", System.currentTimeMillis() - startTime)); + } + + private static void cacheResult(FileObject fo, BladeParserResult result) { + synchronized (CACHE) { + CACHE.put(fo, new WeakReference<>(result)); + } + } + + @Override + public Result getResult(Task task) throws ParseException { + assert lastResult != null; + return lastResult; + } + + @Override + public void addChangeListener(ChangeListener changeListener) { + } + + @Override + public void removeChangeListener(ChangeListener changeListener) { + } + + protected BladeParserResult createParserResult(Snapshot snapshot) { + return new BladeParserResult(snapshot); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java new file mode 100644 index 000000000000..d749f36849d0 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java @@ -0,0 +1,995 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.parser; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.antlr.v4.runtime.ANTLRErrorListener; +import org.antlr.v4.runtime.BaseErrorListener; +import org.netbeans.modules.csl.api.Error; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.modules.parsing.api.Snapshot; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.ConsoleErrorListener; +import org.antlr.v4.runtime.RecognitionException; +import org.antlr.v4.runtime.Recognizer; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.tree.ParseTreeListener; +import org.antlr.v4.runtime.tree.TerminalNode; +import org.netbeans.api.annotations.common.NonNull; +import org.netbeans.api.annotations.common.NullAllowed; +import org.netbeans.modules.csl.api.Severity; +import org.netbeans.modules.csl.spi.DefaultError; +import org.netbeans.modules.php.blade.editor.EditorStringUtils; +import org.netbeans.modules.php.blade.editor.navigator.BladeStructureItem; +import org.netbeans.modules.php.blade.editor.navigator.BladeStructureItem.DirectiveBlockStructureItem; +import org.netbeans.modules.php.blade.editor.navigator.BladeStructureItem.DirectiveInlineStructureItem; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParserBaseListener; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +public class BladeParserResult extends ParserResult { + + private static final Logger LOGGER = Logger.getLogger(BladeParserResult.class.getSimpleName()); + public final List errors = new ArrayList<>(); + private final Map yieldReferences = new TreeMap<>(); + private final Map stackReferences = new TreeMap<>(); + public final Map> includeBladeOccurences = new HashMap<>(); + public final Map occurancesForDeclaration = new TreeMap<>(); + public final Map phpClassOccurences = new TreeMap<>(); + public final Map phpFunctionOccurences = new TreeMap<>(); + public final Map phpMethodOccurences = new TreeMap<>(); + public final Map phpConstantOccurences = new TreeMap<>(); + public final Map phpNamespacePathOccurences = new TreeMap<>(); + public final Map customDirectivesReferences = new TreeMap<>(); + public final Map fieldCallType = new TreeMap<>(); + public final Map> loopScopedVariables = new TreeMap<>(); + public final List structure = new ArrayList<>(); + public final List folds = new ArrayList<>(); + volatile boolean finished = false; + volatile boolean debugMode = false; + + public enum ReferenceType { + YIELD, STACK, SECTION, PUSH, PUSH_IF, PREPEND, INCLUDE, INCLUDE_IF, + INCLUDE_COND, EXTENDS, EACH, HAS_SECTION, + SECTION_MISSING, USE, INJECT, CUSTOM_DIRECTIVE, POSSIBLE_DIRECTIVE, + PHP_FUNCTION, PHP_CLASS, PHP_METHOD, PHP_CONSTANT, PHP_NAMESPACE, PHP_NAMESPACE_PATH_TYPE, + STATIC_FIELD_ACCESS, VITE_PATH, + TEMPLATE_PATH, + } + + public BladeParserResult(Snapshot snapshot) { + super(snapshot); + } + + protected BladeAntlrParser createParser(Snapshot snapshot) { + CharStream cs = CharStreams.fromString(String.valueOf(snapshot.getText())); + BladeAntlrLexer lexer = new BladeAntlrLexer(cs); + CommonTokenStream tokens = new CommonTokenStream(lexer); + BladeAntlrParser ret = new BladeAntlrParser(tokens); + ret.removeErrorListener(ConsoleErrorListener.INSTANCE); + return ret; + } + + public BladeParserResult get(String taskClass) { + long startTime = System.currentTimeMillis(); + if (debugMode){ + LOGGER.log(Level.INFO, "PARSER TRIGGERED BY {0}", taskClass); + } + if (!finished) { + BladeAntlrParser parser = createParser(getSnapshot()); + parser.setBuildParseTree(false); + //LOGGER.info(String.format("parser created in %d ms", System.currentTimeMillis() - startTime)); + parser.addErrorListener(createErrorListener()); + parser.addParseListener(createDeclarationReferencesListener()); + parser.addParseListener(createPhpElementsOccurencesListener()); + + if (taskClass.toLowerCase().contains("completion")) { + parser.addParseListener(createVariableListener()); + } + + parser.addParseListener(createStructureListener()); + + if (taskClass.toLowerCase().contains("hints")) { + parser.addParseListener(createSemanticsListener()); + } + evaluateParser(parser); + if (debugMode){ + LOGGER.info(String.format("Parser evaluated in %d ms " + taskClass + " | " + this.getFileObject().getNameExt(), System.currentTimeMillis() - startTime)); + } + finished = true; + } + long time = System.currentTimeMillis() - startTime; + + if (debugMode){ + LOGGER.info(String.format("finished parser took %d ms " + this.getFileObject().getNameExt(), time)); + } + return this; + } + + protected void evaluateParser(BladeAntlrParser parser) { + parser.file(); + } + + protected ParseTreeListener createDeclarationReferencesListener() { + + return new BladeAntlrParserBaseListener() { + @Override + public void exitDoubleArgWrapperP(BladeAntlrParser.DoubleArgWrapperPContext ctx) { + Token directive = ctx.getParent().getStart(); + if (directive == null) { + return; + } + + Token paramString = ctx.idString; + + if (paramString == null || paramString.getText().length() < 3) { + return; + } + + addIdentifiableOccurenceForDeclaration(directive, paramString); + } + + @Override + public void exitSingleArgWrapperP(BladeAntlrParser.SingleArgWrapperPContext ctx) { + Token directive = ctx.getParent().getStart(); + if (directive == null) { + return; + } + + Token paramString = ctx.idString; + + if (paramString == null || paramString.getText().length() < 3) { + return; + } + + addIdentifiableOccurenceForDeclaration(directive, paramString); + } + + @Override + public void exitIncludeCond(BladeAntlrParser.IncludeCondContext ctx) { + Token directive = ctx.d_name; + if (directive == null) { + return; + } + + Token paramString = ctx.idString; + + if (paramString == null || paramString.getText().length() < 3) { + return; + } + + addIdentifiableOccurenceForDeclaration(directive, paramString); + } + + @Override + public void exitEach(BladeAntlrParser.EachContext ctx) { + Token directive = ctx.getStart(); + if (directive == null) { + return; + } + + Token paramString = ctx.idString; + + if (paramString == null || paramString.getText().length() < 3) { + return; + } + + addIdentifiableOccurenceForDeclaration(directive, paramString); + } + + @Override + public void exitIdentifiableType(BladeAntlrParser.IdentifiableTypeContext ctx) { + Token directive = ctx.d_name; + if (directive == null) { + return; + } + + Token paramString = ctx.idString; + + if (paramString == null || paramString.getText().length() < 3) { + return; + } + + addIdentifiableOccurenceForDeclaration(directive, paramString); + } + + @Override + public void exitCustom_directive(BladeAntlrParser.Custom_directiveContext ctx) { + String directiveName = ctx.getStart().getText(); + OffsetRange range = new OffsetRange(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex() + 1); + occurancesForDeclaration.put(range, new Reference(ReferenceType.CUSTOM_DIRECTIVE, directiveName, range)); + } + + /** + * for @stack, @yield, @each, @include() + */ + private void addIdentifiableOccurenceForDeclaration(Token directive, + Token paramString) { + + OffsetRange range = new OffsetRange(paramString.getStartIndex(), paramString.getStopIndex()); + String bladeParamText = EditorStringUtils.stripSurroundingQuotes(paramString.getText()); + + //used for indexing + switch (directive.getType()) { + case D_STACK: + addStackReference(ReferenceType.STACK, bladeParamText, range); + break; + case D_YIELD: + addYieldReference(ReferenceType.YIELD, bladeParamText, range); + break; + } + + ReferenceType type = getReferenceType(directive.getType()); + + if (type == null) { + return; + } + + Reference ref; + if (type.equals(ReferenceType.USE) || type.equals(ReferenceType.INJECT)) { + int lastSlashPos = bladeParamText.lastIndexOf("\\"); + if (lastSlashPos < 0 || lastSlashPos >= bladeParamText.length() - 1) { + return; + } + range = new OffsetRange(paramString.getStartIndex(), paramString.getStopIndex()); + //extracting the namespace and classname + ref = new Reference(type, bladeParamText.substring(lastSlashPos + 1), range, null, bladeParamText.substring(0, lastSlashPos)); + } else { + ref = new Reference(type, bladeParamText, range); + } + + occurancesForDeclaration.put(range, ref); + + switch (directive.getType()) { + case D_EACH: + case D_INCLUDE_WHEN: + case D_INCLUDE_UNLESS: + case D_INCLUDE: + case D_INCLUDE_IF: + case D_INCLUDE_FIRST: + if (bladeParamText.contains("::")) { + //don't include package resources + break; + } + markIncludeBladeOccurrence(bladeParamText, range); + break; + } + } + + @Override + public void exitAsset_bundler(BladeAntlrParser.Asset_bundlerContext ctx) { + if (ctx.id_string != null){ + Token idToken = ctx.id_string; + String path = idToken.getText(); + path = EditorStringUtils.stripSurroundingQuotes(path); + OffsetRange range = new OffsetRange(idToken.getStartIndex(), idToken.getStopIndex()); + Reference ref = new Reference(ReferenceType.VITE_PATH, path, range); + occurancesForDeclaration.put(range, ref); + return; + } + Token dirToken = ctx.dir; + String dir = ""; + if (dirToken != null){ + dir = dirToken.getText(); + } + + for (TerminalNode node : ctx.EXPR_STRING()){ + Token symbolNode = node.getSymbol(); + if (symbolNode == null){ + continue; + } + String path = node.getText(); + if (path.equals(dir)){ + //skipping last parameter + continue; + } + path = EditorStringUtils.stripSurroundingQuotes(path); + OffsetRange range = new OffsetRange(symbolNode.getStartIndex(), symbolNode.getStopIndex()); + Reference ref = new Reference(ReferenceType.VITE_PATH, path, range); + occurancesForDeclaration.put(range, ref); + } + } + + }; + + } + + private ParseTreeListener createVariableListener() { + return new BladeAntlrParserBaseListener() { + List foreachVariableList = new ArrayList<>(); + int foreachBalance = 0; + + @Override + public void exitSimple_foreach_expr(BladeAntlrParser.Simple_foreach_exprContext ctx) { + ForeachVariables foreachVariables = new ForeachVariables(); + foreachVariables.arrayVariable = ctx.loop_array.getText(); + if (ctx.item != null) { + foreachVariables.keyVariable = ctx.key.getText(); + foreachVariables.itemVariable = ctx.item.getText(); + } else { + + foreachVariables.itemVariable = ctx.key.getText(); + } + foreachVariableList.add(foreachVariables); + } + + @Override + public void enterForeach(BladeAntlrParser.ForeachContext ctx) { + foreachBalance++; + } + + @Override + public void exitForeach(BladeAntlrParser.ForeachContext ctx) { + if (!foreachVariableList.isEmpty()) { + Set varList = new LinkedHashSet<>(); + for (ForeachVariables foreachVariables : foreachVariableList) { + + varList.add(foreachVariables.arrayVariable); + if (foreachVariables.keyVariable != null) { + varList.add(foreachVariables.keyVariable); + } + varList.add(foreachVariables.itemVariable); + + } + OffsetRange range = new OffsetRange(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex() + 1); + loopScopedVariables.put(range, varList); + } + + foreachBalance--; + //reset + if (foreachBalance < 0) { + foreachVariableList.clear(); + } + } + + @Override + public void exitForelse(BladeAntlrParser.ForelseContext ctx) { + if (!foreachVariableList.isEmpty()) { + Set varList = new LinkedHashSet<>(); + for (ForeachVariables foreachVariables : foreachVariableList) { + + varList.add(foreachVariables.arrayVariable); + if (foreachVariables.keyVariable != null) { + varList.add(foreachVariables.keyVariable); + } + varList.add(foreachVariables.itemVariable); + + } + OffsetRange range = new OffsetRange(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex() + 1); + loopScopedVariables.put(range, varList); + } + + //reset + foreachVariableList.clear(); + } + + @Override + public void exitFile(BladeAntlrParser.FileContext ctx) { + foreachVariableList.clear(); + } + }; + } + + private ParseTreeListener createPhpElementsOccurencesListener() { + return new BladeAntlrParserBaseListener() { + /** + * handling isolated PHP_IDENTIFIER to reference them as possible + * constants + */ + @Override + public void exitComposed_php_expression(BladeAntlrParser.Composed_php_expressionContext ctx) { + if (ctx.PHP_IDENTIFIER() != null && ctx.PHP_IDENTIFIER().getSymbol() != null) { + String identifierString = ctx.PHP_IDENTIFIER().getSymbol().getText(); + if (identifierString != null && org.netbeans.modules.php.blade.syntax.StringUtils.isUpperCase(identifierString)) { + OffsetRange range = new OffsetRange(ctx.PHP_IDENTIFIER().getSymbol().getStartIndex(), ctx.PHP_IDENTIFIER().getSymbol().getStopIndex() + 1); + phpConstantOccurences.put(range, identifierString); + } + } + if (ctx.PHP_NAMESPACE_PATH() != null && ctx.PHP_NAMESPACE_PATH().getSymbol() != null) { + String identifierString = ctx.PHP_NAMESPACE_PATH().getSymbol().getText(); + if (identifierString != null) { + OffsetRange range = new OffsetRange(ctx.PHP_NAMESPACE_PATH().getSymbol().getStartIndex(), ctx.PHP_NAMESPACE_PATH().getSymbol().getStopIndex() + 1); + phpNamespacePathOccurences.put(range, identifierString); + } + } + } + + @Override + public void exitNamespacePath(BladeAntlrParser.NamespacePathContext ctx) { + if (ctx.PHP_IDENTIFIER() == null || ctx.PHP_NAMESPACE_PATH() == null) { + return; + } + String namespace = ctx.PHP_NAMESPACE_PATH().getSymbol().getText(); + Token classIdentifier = ctx.PHP_IDENTIFIER().getSymbol(); + String className = classIdentifier.getText(); + OffsetRange classRange = new OffsetRange(classIdentifier.getStartIndex(), classIdentifier.getStopIndex() + 1); + OffsetRange range = new OffsetRange(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex() + 1); + occurancesForDeclaration.put(range, new Reference(ReferenceType.PHP_NAMESPACE_PATH_TYPE, className, classRange, null, namespace)); + } + + @Override + public void exitStatic_direct_namespace_class_access(BladeAntlrParser.Static_direct_namespace_class_accessContext ctx) { + if (ctx.class_name == null) { + return; + } + + Token classIdentifier = ctx.class_name; + String className = classIdentifier.getText(); + OffsetRange range = new OffsetRange(classIdentifier.getStartIndex(), classIdentifier.getStopIndex() + 1); + + Reference classReference = new Reference( + ReferenceType.PHP_CLASS, + className, range, + null, + ctx.namespace.getText() + ); + occurancesForDeclaration.put(range, classReference); + + OffsetRange callRange = null; + int start = ctx.PHP_STATIC_ACCESS().getSymbol().getStartIndex(); + String fieldName = null; + FieldType fieldType = null; + + if (ctx.static_property != null) { + //constants + callRange = new OffsetRange(start, ctx.static_property.getStopIndex() + 1); + fieldName = ctx.static_property.getText(); + fieldType = FieldType.CONSTANT; + } else if (ctx.func_name != null) { + //methods + callRange = new OffsetRange(start, ctx.func_name.getStopIndex() + 1);//bad + fieldName = ctx.func_name.getText(); + fieldType = FieldType.METHOD; + OffsetRange functionRange = new OffsetRange(ctx.func_name.getStartIndex(), ctx.func_name.getStopIndex() + 1); + + phpMethodOccurences.put(functionRange, + new Reference(ReferenceType.PHP_METHOD, + fieldName, range, className, + ctx.namespace.getText()) + ); + + } + + if (callRange != null) { + FieldAccessReference fieldAccess = new FieldAccessReference( + ReferenceType.STATIC_FIELD_ACCESS, + classReference, + fieldName, + fieldType + ); + fieldCallType.put(callRange, fieldAccess); + } + } + + //this will be always static + @Override + public void exitStatic_direct_class_access(BladeAntlrParser.Static_direct_class_accessContext ctx) { + if (ctx.class_name == null) { + return; + } + + Token classIdentifier = ctx.class_name; + String className = classIdentifier.getText(); + OffsetRange range = new OffsetRange(classIdentifier.getStartIndex(), classIdentifier.getStopIndex() + 1); + + phpClassOccurences.put(range, className); + + OffsetRange callRange = null; + int start = ctx.PHP_STATIC_ACCESS().getSymbol().getStartIndex(); + String fieldName = null; + FieldType fieldType = null; + if (ctx.static_property != null) { + //constants + callRange = new OffsetRange(start, ctx.static_property.getStopIndex() + 1); + fieldName = ctx.static_property.getText(); + fieldType = FieldType.CONSTANT; + } else if (ctx.func_name != null) { + //methods + callRange = new OffsetRange(start, ctx.func_name.getStopIndex() + 1); + fieldName = ctx.func_name.getText(); + fieldType = FieldType.METHOD; + OffsetRange functionRange = new OffsetRange(ctx.func_name.getStartIndex(), ctx.func_name.getStopIndex() + 1); + phpMethodOccurences.put(functionRange, new Reference(ReferenceType.PHP_METHOD, fieldName, range, className)); + } + + if (callRange != null) { + Reference classReference = new Reference( + ReferenceType.PHP_CLASS, + className, range, + null, + null + ); + FieldAccessReference fieldAccess = new FieldAccessReference( + ReferenceType.STATIC_FIELD_ACCESS, + classReference, + fieldName, + fieldType + ); + fieldCallType.put(callRange, fieldAccess); + } + } + + @Override + public void exitFunction_call(BladeAntlrParser.Function_callContext ctx) { + if (ctx.func_name == null || ctx.func_name.getText() == null) { + return; + } + String functionName = ctx.func_name.getText(); + OffsetRange range = new OffsetRange(ctx.func_name.getStartIndex(), ctx.func_name.getStopIndex() + 1); + phpFunctionOccurences.put(range, functionName); + } + }; + } + + private ParseTreeListener createStructureListener() { + + return new BladeAntlrParserBaseListener() { + + final List lexerStructure = new ArrayList<>(); + int blockBalance = 0; + String identifier; + + @Override + public void enterInline_directive(BladeAntlrParser.Inline_directiveContext ctx) { + identifier = null; + } + + @Override + public void exitIdentifiableType(BladeAntlrParser.IdentifiableTypeContext ctx) { + Token directive = ctx.d_name; + if (directive == null) { + return; + } + + Token paramString = ctx.idString; + + if (paramString == null || paramString.getText().length() < 3) { + return; + } + + String bladeParamText = paramString.getText(); + identifier = EditorStringUtils.stripSurroundingQuotes(bladeParamText); + } + + @Override + public void exitInline_directive(BladeAntlrParser.Inline_directiveContext ctx) { + Token directiveToken = ctx.getStart(); + + if (directiveToken == null) { + return; + } + + DirectiveInlineStructureItem inlineElement; + String directiveName = directiveToken.getText(); + + inlineElement = new DirectiveInlineStructureItem(directiveName, identifier, + getFileObject(), directiveToken.getStartIndex(), directiveToken.getStopIndex() + 1); + + if (blockBalance > 0) { + lexerStructure.add(inlineElement); + } else { + structure.add(inlineElement); + } + + } + + @Override + public void enterBlock_statement(BladeAntlrParser.Block_statementContext ctx) { + identifier = null; + blockBalance++; + } + + @Override + public void exitBlock_statement(BladeAntlrParser.Block_statementContext ctx) { + blockBalance--; + Token directiveToken = ctx.getStart(); + + if (directiveToken == null) { + return; + } + + String directiveName = directiveToken.getText(); + DirectiveBlockStructureItem blockItem = new DirectiveBlockStructureItem(directiveName, identifier, + getFileObject(), ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex() + 1); + + blockItem.nestedItems.addAll(lexerStructure); + lexerStructure.clear(); + if (blockBalance > 0 && !directiveName.startsWith("@else")) { + lexerStructure.add(blockItem); + } else { + structure.add(blockItem); + } + //folds + int start = ctx.getStart().getStartIndex() + 1 + directiveName.length(); + int end = ctx.getStop().getStartIndex();//the start of the close directive + + if (start > end) { + return; + } + OffsetRange range = new OffsetRange(start, end); + if (!folds.contains(range)) { + folds.add(range); + } + } + }; + } + + private ReferenceType getReferenceType(int type) { + switch (type) { + case D_INCLUDE: + return ReferenceType.INCLUDE; + case D_INCLUDE_IF: + return ReferenceType.INCLUDE_IF; + case D_EXTENDS: + return ReferenceType.EXTENDS; + case D_USE: + return ReferenceType.USE; + case D_INJECT: + return ReferenceType.INJECT; + case D_SECTION: + return ReferenceType.SECTION; + case D_HAS_SECTION: + return ReferenceType.HAS_SECTION; + case D_SECTION_MISSING: + return ReferenceType.SECTION_MISSING; + case D_PUSH: + return ReferenceType.PUSH; + case D_PUSH_IF: + return ReferenceType.PUSH_IF; + case D_PREPEND: + return ReferenceType.PREPEND; + case D_EACH: + return ReferenceType.EACH; + default: + return null; + } + } + + /** + * might move to a model all these processing + * + * @param offset + * @return + */ + public Reference findOccuredRefrence(int offset) { + + //TODO could do a similar thing and generate the Reference class on loop + for (Map.Entry entry : occurancesForDeclaration.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return entry.getValue(); + } + } + + for (Map.Entry entry : phpFunctionOccurences.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return new Reference(ReferenceType.PHP_FUNCTION, entry.getValue(), range); + } + } + + for (Map.Entry entry : phpClassOccurences.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return new Reference(ReferenceType.PHP_CLASS, entry.getValue(), range); + } + } + + for (Map.Entry entry : phpMethodOccurences.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return entry.getValue(); + } + } + + for (Map.Entry entry : phpConstantOccurences.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return new Reference(ReferenceType.PHP_CONSTANT, entry.getValue(), range); + } + } + + for (Map.Entry entry : phpNamespacePathOccurences.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return new Reference(ReferenceType.PHP_NAMESPACE_PATH_TYPE, entry.getValue(), range); + } + } + + return null; + } + + public FieldAccessReference findFieldAccessRefrence(int offset) { + for (Map.Entry entry : fieldCallType.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return entry.getValue(); + } + } + + return null; + } + + protected final void markIncludeBladeOccurrence(String refName, OffsetRange or) { + includeBladeOccurences.computeIfAbsent(refName, s -> new ArrayList<>()).add(or); + } + + //not used so far + public Collection findIncludeOccurrence(String refName) { + ArrayList ret = new ArrayList<>(); + if (includeBladeOccurences.containsKey(refName)) { + ret.addAll(includeBladeOccurences.get(refName)); + } + return ret; + } + + public Set findLoopVariablesForScope(int offset) { + + Set variableList = new LinkedHashSet<>(); + + for (Map.Entry> entry : loopScopedVariables.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + variableList.addAll(entry.getValue()); + } + } + + if (variableList.isEmpty()) { + return null; + } + return variableList; + } + + private ParseTreeListener createSemanticsListener() { + return new BladeAntlrParserBaseListener() { + int ifBalance = 0; + int ifStart = 0; + + @Override + public void exitCustom_directive(BladeAntlrParser.Custom_directiveContext ctx) { + String directiveName = ctx.getStart().getText(); + OffsetRange range = new OffsetRange(ctx.getStart().getStartIndex(), ctx.getStart().getStartIndex() + directiveName.length()); + customDirectivesReferences.put(range, new Reference(ReferenceType.CUSTOM_DIRECTIVE, directiveName, range)); + } + + @Override + public void exitPossibleDirective(BladeAntlrParser.PossibleDirectiveContext ctx) { + String directiveName = ctx.getStart().getText(); + OffsetRange range = new OffsetRange(ctx.getStart().getStartIndex(), ctx.getStart().getStartIndex() + directiveName.length()); + customDirectivesReferences.put(range, new Reference(ReferenceType.POSSIBLE_DIRECTIVE, directiveName, range)); + } + + @Override + public void enterIf(BladeAntlrParser.IfContext ctx) { + ifBalance++; + ifStart = ctx.getStart().getStartIndex(); + } + + @Override + public void exitEndif(BladeAntlrParser.EndifContext ctx) { + ifBalance--; + } + + @Override + public void exitFile(BladeAntlrParser.FileContext ctx) { + if (ifBalance != 0) { + errors.add(new BladeError(null, "Unclosed @if", null, getFileObject(), ifStart, ctx.getStart().getStopIndex(), Severity.ERROR)); + } + } + + }; + } + + public void addYieldReference(ReferenceType type, String yieldId, OffsetRange range) { + Reference ref = new Reference(type, yieldId, range); + yieldReferences.put(ref.identifier, ref); + } + + public void addStackReference(ReferenceType type, String stackId, OffsetRange range) { + Reference ref = new Reference(type, stackId, range); + stackReferences.put(ref.identifier, ref); + } + + @Override + protected boolean processingFinished() { + return finished; + } + + @Override + public List getDiagnostics() { + return errors; + } + + @Override + protected void invalidate() { + loopScopedVariables.clear(); + } + + public Map getYieldReferences() { + return yieldReferences; + } + + public Map getStackReferences() { + return stackReferences; + } + + protected ANTLRErrorListener createErrorListener() { + return new BaseErrorListener() { + @Override + public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { + int errorPosition = 0; + if (offendingSymbol instanceof Token) { + Token offendingToken = (Token) offendingSymbol; + errorPosition = offendingToken.getStartIndex(); + } + errors.add(new BladeError(null, msg, null, getFileObject(), errorPosition, errorPosition, Severity.ERROR)); + } + + }; + } + + public final FileObject getFileObject() { + return getSnapshot().getSource().getFileObject(); + } + + public static class Reference { + + public final ReferenceType type; + public final String identifier; + public final String ownerClass; + public final String namespace; + public final OffsetRange defOffset; + + public Reference(ReferenceType type, String name, OffsetRange defOffset, String ownerClass) { + this.type = type; + this.identifier = name; + this.defOffset = defOffset; + this.ownerClass = ownerClass; + this.namespace = null; + } + + public Reference(ReferenceType type, String name, OffsetRange defOffset, String ownerClass, String namespace) { + this.type = type; + this.identifier = name; + this.defOffset = defOffset; + this.ownerClass = ownerClass; + this.namespace = namespace; + } + + public Reference(ReferenceType type, String name, OffsetRange defOffset) { + this.type = type; + this.identifier = name; + this.defOffset = defOffset; + this.ownerClass = null; + this.namespace = null; + } + } + + public enum FieldType { + PROPERTY, + CONSTANT, + METHOD; + } + + public static class FieldAccessReference { + + public final ReferenceType type; + public final Reference ownerClass; + public final String fieldName; + public final FieldType fieldType; + + public FieldAccessReference(ReferenceType type, Reference ownerClass, + String fieldName, FieldType fieldType) { + this.type = type; + this.ownerClass = ownerClass; + this.fieldName = fieldName; + this.fieldType = fieldType; + } + } + + public class ForeachVariables { + + public String arrayVariable; + public String keyVariable; + public String itemVariable; + } + + /** + * seems that java caches only this class ? BladeError is not found in some + * occasions + */ + public static class BladeError extends DefaultError implements org.netbeans.modules.csl.api.Error.Badging { + + public BladeError(@NullAllowed String key, @NonNull String displayName, @NullAllowed String description, @NonNull FileObject file, @NonNull int start, @NonNull int end, @NonNull Severity severity) { + super(key, displayName, description, file, start, end, severity); + } + + @Override + public boolean showExplorerBadge() { + return true; + } + + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java new file mode 100644 index 000000000000..6f93fd83feb4 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java @@ -0,0 +1,374 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.parser; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Collections; +import java.util.Date; +import java.util.Enumeration; +import javax.swing.text.Document; +import org.netbeans.modules.parsing.api.ParserManager; +import org.netbeans.modules.parsing.api.ResultIterator; +import org.netbeans.modules.parsing.api.Source; +import org.netbeans.modules.parsing.api.UserTask; +import org.netbeans.modules.parsing.spi.ParseException; +import org.netbeans.modules.parsing.spi.Parser; +import org.netbeans.modules.php.editor.parser.PHPParseResult; +import org.openide.filesystems.AbstractFileSystem; +import org.openide.filesystems.DefaultAttributes; +import org.openide.filesystems.FileChangeListener; +import org.openide.filesystems.FileLock; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileStateInvalidException; +import org.openide.filesystems.FileSystem; +import org.openide.util.Exceptions; +import org.openide.cookies.EditorCookie; +import org.openide.loaders.DataObject; + +/** + * + * @author bogdan + */ +public class ParsingUtils { + + private final FileObject currentFile; + + public ParsingUtils(FileObject file) { + this.currentFile = file; + } + + public ParsingUtils() { + this.currentFile = null; + } + + private PHPParseResult phpParserResult; + + public FakeFileObject createFileObject(String phpText) { + return new FakeFileObject(phpText); + } + + public void parsePhpText(String phpText) { + FakeFileObject file = new FakeFileObject(phpText); + if (currentFile != null) { + file.setParent(currentFile.getParent()); + } + parseFileObject(file); + } + + public void parseFileObject(FileObject file){ + Document doc = openDocument(file); + + try { + Source source = Source.create(doc); + + if (source == null){ + return; + } + + Document sourceDoc = source.getDocument(false); + + if (sourceDoc == null) { + return; + } + + source.createSnapshot(); + ParserManager.parse(Collections.singletonList(source), new UserTask() { + + @Override + public void run(ResultIterator resultIterator) throws Exception { + Parser.Result parserResult = resultIterator.getParserResult(); + if (parserResult instanceof PHPParseResult) { + phpParserResult = (PHPParseResult) parserResult; + } + } + }); + + } catch (ParseException ex) { + Exceptions.printStackTrace(ex); + } + } + + public PHPParseResult getParserResult() { + return phpParserResult; + } + + public Document openDocument(FileObject f) { + try { + DataObject dataObject = DataObject.find(f); + EditorCookie ec = dataObject.getLookup().lookup(EditorCookie.class); + return ec.openDocument(); + } catch (IOException ex) { + throw new IllegalStateException(ex); + } + } + + public class FakeFileObject extends FileObject { + + InputStream stream; + FileObject parent; + + public FakeFileObject(String text) { + stream = new ByteArrayInputStream(text.getBytes()); + } + + @Override + public String getName() { + return "test"; + } + + @Override + public String getExt() { + return "php"; + } + + @Override + public void rename(FileLock fl, String string, String string1) throws IOException { + // + } + + @Override + public FileSystem getFileSystem() throws FileStateInvalidException { + return new FakeFileSystem(); + } + + public void setParent(FileObject parent) { + this.parent = parent; + } + + @Override + public FileObject getParent() { + return parent; + } + + @Override + public boolean isFolder() { + return false; + } + + @Override + public Date lastModified() { + return new Date(); + } + + @Override + public boolean isRoot() { + return false; + } + + @Override + public boolean isData() { + return false; + } + + @Override + public boolean isValid() { + return true; + } + + @Override + public void delete(FileLock fl) throws IOException { + // + } + + @Override + public Object getAttribute(String string) { + return null; + } + + @Override + public void setAttribute(String string, Object o) throws IOException { + // + } + + @Override + public Enumeration getAttributes() { + return null; + } + + @Override + public void addFileChangeListener(FileChangeListener fl) { + // + } + + @Override + public void removeFileChangeListener(FileChangeListener fl) { + // + } + + @Override + public long getSize() { + return 1; + } + + @Override + public InputStream getInputStream() throws FileNotFoundException { + return stream; + } + + @Override + public OutputStream getOutputStream(FileLock fl) throws IOException { + return null; + } + + @Override + public FileLock lock() throws IOException { + return null; + } + + //deprecated + @SuppressWarnings("deprecation") + @Override + public void setImportant(boolean bln) { + // + } + + @Override + public FileObject[] getChildren() { + return new FileObject[0]; + } + + @Override + public FileObject getFileObject(String string, String string1) { + return null; + } + + @Override + public FileObject createFolder(String string) throws IOException { + return null; + } + + @Override + public FileObject createData(String string, String string1) throws IOException { + return null; + } + + //deprecated + @SuppressWarnings("deprecation") + @Override + public boolean isReadOnly() { + return true; + } + + } + + class FakeFileSystem extends AbstractFileSystem + implements AbstractFileSystem.Info, AbstractFileSystem.List, AbstractFileSystem.Change { + + String dir = "dir"; + + @SuppressWarnings(value = "LeakingThisInConstructor") + public FakeFileSystem() { + this.info = this; + this.list = this; + this.change = this; + this.attr = new DefaultAttributes(info, change, list); + } + + @Override + public String getDisplayName() { + return "Fake FS"; + } + + @Override + public boolean isReadOnly() { + return true; + } + + @Override + public Date lastModified(String name) { + return new Date(5000L); + } + + @Override + public boolean folder(String name) { + return dir.equals(name); + } + + @Override + public boolean readOnly(String name) { + return false; + } + + @Override + public String mimeType(String name) { + return "text/x-php5"; + } + + @Override + public long size(String name) { + return 0; + } + + @Override + public InputStream inputStream(String name) throws FileNotFoundException { + return new ByteArrayInputStream(new byte[0]); + } + + @Override + public OutputStream outputStream(String name) throws IOException { + return new ByteArrayOutputStream(); + } + + @Override + public void lock(String name) throws IOException { + } + + @Override + public void unlock(String name) { + } + + @Override + public void markUnimportant(String name) { + } + + @Override + public String[] children(String f) { + if ("".equals(f)) { + return new String[]{dir}; + } else { + return new String[]{"empty.txt"}; + } + } + + @Override + public void createFolder(String name) throws IOException { + throw new IOException(); + } + + @Override + public void createData(String name) throws IOException { + throw new IOException(); + } + + @Override + public void rename(String oldName, String newName) throws IOException { + } + + @Override + public void delete(String name) throws IOException { + throw new IOException(); + } + + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java new file mode 100644 index 000000000000..d3ccef8d5580 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java @@ -0,0 +1,318 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.path; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.project.BladeProjectProperties; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.netbeans.spi.project.ui.support.ProjectConvertors; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; + +/** + * + * @author bogdan + */ +public class BladePathUtils { + + public static final String LARAVEL_VIEW_PATH = "resources/views"; //NOI18N + public static final String BLADE_EXT = ".blade.php"; //NOI18N + + /** + * first we need to extract the root folder of view after we apply a generic + * path sanitize for blade paths (ex "my.path" -> "my/path.blade.php") + * + * @param contextFile + * @param viewPath + * @return List + */ + public static List findFileObjectsForBladeViewPath(FileObject contextFile, String viewPath) { + List fileViewAssociationList = new ArrayList<>(); + Project project = ProjectConvertors.getNonConvertorOwner(contextFile); + + if (project == null) { + return fileViewAssociationList; + } + + HashSet viewRoots = getDefaultRoots(project); + viewRoots.addAll(getCustomViewsRoots(project, contextFile)); + + if (viewRoots.isEmpty()) { + return fileViewAssociationList; + } + + String sanitizedBladePath = viewPathToFilePath(viewPath); //NOI18N + + for (FileObject viewRoot : viewRoots) { + FileObject includedFile = viewRoot.getFileObject(sanitizedBladePath, true); + + if (includedFile != null && includedFile.isValid()) { + fileViewAssociationList.add(includedFile); + } + } + + return fileViewAssociationList; + } + + public static FileObject findFileObjectForBladeViewPath(FileObject contextFile, String viewPath) { + FileObject res = null; + Project project = ProjectConvertors.getNonConvertorOwner(contextFile); + + if (project == null) { + return res; + } + + HashSet viewRoots = getDefaultRoots(project); + viewRoots.addAll(getCustomViewsRoots(project, contextFile)); + + if (viewRoots.isEmpty()) { + return res; + } + + String sanitizedBladePath = viewPathToFilePath(viewPath); + + for (FileObject viewRoot : viewRoots) { + FileObject includedFile = viewRoot.getFileObject(sanitizedBladePath, true); + + if (includedFile != null && includedFile.isValid()) { + return includedFile; + } + } + + return res; + } + + /** + * + * + * @param contextFile + * @param prefixViewPath + * @return List + */ + public static List getParentChildrenFromPrefixPath(FileObject contextFile, + String prefixViewPath) { + List list = new ArrayList<>(); + //this should be a fallback + Project project = ProjectConvertors.getNonConvertorOwner(contextFile); + + if (project == null) { + return list; + } + + HashSet viewRoots = getDefaultRoots(project); + viewRoots.addAll(getCustomViewsRoots(project, contextFile)); + + if (viewRoots.isEmpty()) { + return list; + } + + String unixPath = prefixViewPath.replace(".", "/"); + int relativeSlash; + + //fix issues with lastIndexOf search + relativeSlash = unixPath.lastIndexOf("/"); + + HashSet filteredViewRoots = new HashSet<>(); + + Map relativeFilePathMap = new HashMap<>(); + + if (relativeSlash > 0) { + //filter only relative folders + for (FileObject rootFolder : viewRoots) { + FileObject relativeViewRoot = rootFolder.getFileObject(unixPath.substring(0, relativeSlash)); + + if (relativeViewRoot != null && relativeViewRoot.isValid()) { + relativeFilePathMap.put(unixPath, relativeViewRoot); + } + } + } else { + //include all root folders + filteredViewRoots = viewRoots; + } + + String relativePrefixToCompare; + + if (relativeSlash > 0) { + //extract the path name prefix + relativePrefixToCompare = unixPath.substring(relativeSlash+1, unixPath.length()); + } else { + //root reference + relativePrefixToCompare = unixPath; + } + + if (unixPath.endsWith("/")) { + //add children + for (FileObject rootFolder : filteredViewRoots) { + list.addAll(Arrays.asList(rootFolder.getChildren())); + } + for (Map.Entry entry : relativeFilePathMap.entrySet()){ + list.addAll(Arrays.asList(entry.getValue().getChildren())); + } + } else { + //filter by filename in relative context + for (FileObject rootFolder : filteredViewRoots) { + for (FileObject file : rootFolder.getChildren()) { + String filePath = file.getPath().replace(rootFolder.getPath() + "/", ""); + if (filePath.startsWith(relativePrefixToCompare)) { + list.add(file); + } + } + } + + for (Map.Entry entry : relativeFilePathMap.entrySet()){ + for (FileObject file : entry.getValue().getChildren()) { + if (file.getName().startsWith(relativePrefixToCompare)){ + list.add(file); + } + } + } + } + + //empty list + viewRoots.clear(); + return list; + } + + public static List getCustomViewsRoots(Project project, FileObject contextFile) { + List list = new ArrayList<>(); + + String[] views = BladeProjectProperties.getInstance(project).getViewsPathList(); + + if (views.length > 0) { + views = Arrays.stream(views).filter(s -> !s.isEmpty()).toArray(String[]::new); + Arrays.sort(views, (String s1, String s2) -> { + //clear empty configs + if (s1 == null || s2 == null) { + return 0; + } + return s2.length() - s1.length();// comparision + }); + for (String view : views) { + if (view.length() == 0) { + continue; + } + File viewPath = new File(view); + if (!viewPath.exists()) { + continue; + } + + list.add(FileUtil.toFileObject(viewPath)); + } + } + return list; + } + + public static String toBladeViewPath(FileObject file) { + String path = null; + Project project = ProjectUtils.getMainOwner(file); + + if (project == null) { + return path; + } + + String filePath = file.getPath(); + FileObject defaultLaravelPath = project.getProjectDirectory().getFileObject(LARAVEL_VIEW_PATH); + + if (defaultLaravelPath != null) { + //belongs to the default folder + String viewFolderPath = defaultLaravelPath.getPath(); + if (filePath.startsWith(viewFolderPath)) { + String bladePath = BladePathUtils.toBladeViewPath(filePath.replace(viewFolderPath, "")); + //starting slash + if (bladePath.startsWith(".")) { + bladePath = bladePath.substring(1, bladePath.length()); + } + return bladePath; + } + } + + String[] viewFolders = BladeProjectProperties.getInstance(project).getViewsPathList(); + + for (String viewFolder : viewFolders) { + if (viewFolder.length() == 0) { + continue; + } + File viewPath = new File(viewFolder); + if (!viewPath.exists()) { + continue; + } + + //we need to keep the same format + FileObject viewFile = FileUtil.toFileObject(viewPath); + String viewFileAbsPath = viewFile.getPath(); + if (filePath.startsWith(viewFileAbsPath)) { + String relativePath = filePath.replace(viewFileAbsPath, ""); + if (!relativePath.startsWith("/")) { + //it doesn't belong to the folder + continue; + } + return BladePathUtils.toBladeViewPath(relativePath.substring(1)); + } + } + + return path; + } + + public static String getRelativeProjectPath(FileObject currentFile){ + Project projectOwner = ProjectConvertors.getNonConvertorOwner(currentFile); + if (projectOwner == null){ + return ""; + } + + String dirPath = projectOwner.getProjectDirectory().getPath(); + String relativePath = currentFile.getPath().replace(dirPath, ""); + + //only if we found the relative project path + if (currentFile.getPath().length() > relativePath.length()){ + return relativePath; + } + + return ""; + } + + public static String toBladeViewPath(String filePath){ + return filePath.replace(BLADE_EXT, "").replace("/", "."); + } + + public static String viewPathToFilePath(String viewPath){ + return viewPath.replace(".", "/") + BLADE_EXT; + } + + public static HashSet getDefaultRoots(Project project){ + HashSet defaultList = new HashSet<>(); + FileObject defaultViewsRoot = project.getProjectDirectory().getFileObject(LARAVEL_VIEW_PATH); + + if (defaultViewsRoot != null && defaultViewsRoot.isValid()){ + defaultList.add(defaultViewsRoot); + } + + return defaultList; + } + + public static String toBladeToProjectFilePath(String path){ + return LARAVEL_VIEW_PATH + "/" + viewPathToFilePath(path); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/GeneralPreferencesUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/GeneralPreferencesUtils.java new file mode 100644 index 000000000000..bffc0993746f --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/GeneralPreferencesUtils.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.preferences; + +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.prefs.PreferenceChangeEvent; +import java.util.prefs.PreferenceChangeListener; +import java.util.prefs.Preferences; +import org.netbeans.api.editor.mimelookup.MimeLookup; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.openide.util.WeakListeners; + +/** + * this will be moved to PHP Options + * + * @author bogdan + */ +public final class GeneralPreferencesUtils { + + private static final AtomicBoolean INITED = new AtomicBoolean(false); + + public static final String ENABLE_FORMATTING = "enable-blade-format"; // NOI18N + public static final String ENABLE_INDENTATION = "enable-blade-indent"; // NOI18N + public static final String ENABLE_AUTO_TAG_COMPLETION = "enable-auto-tag-completion"; // NOI18N + + private static Boolean enableFormatting = null; + private static Boolean enableIndentation = null; + private static Boolean enableAutoTagCompletion = null; + + // default values + private static Preferences PREFERENCES; + + private static final PreferenceChangeListener PREFERENCES_TRACKER = new PreferenceChangeListener() { + @Override + public void preferenceChange(PreferenceChangeEvent evt) { + enableFormatting = PREFERENCES.getBoolean(ENABLE_FORMATTING, false); + enableIndentation = PREFERENCES.getBoolean(ENABLE_INDENTATION, false); + enableAutoTagCompletion = PREFERENCES.getBoolean(ENABLE_AUTO_TAG_COMPLETION, false); + } + }; + + private GeneralPreferencesUtils() { + } + + public static boolean isFormattingEnabled(){ + lazyInit(); + return enableFormatting; + } + + public static boolean isIndentationEnabled(){ + lazyInit(); + return enableIndentation; + } + + public static boolean isAutoTagCompletionEnabled(){ + lazyInit(); + return enableAutoTagCompletion; + } + + private static void lazyInit() { + if (INITED.compareAndSet(false, true)) { + PREFERENCES = MimeLookup.getLookup(BladeLanguage.MIME_TYPE).lookup(Preferences.class); + PREFERENCES.addPreferenceChangeListener(WeakListeners.create(PreferenceChangeListener.class, PREFERENCES_TRACKER, PREFERENCES)); + PREFERENCES_TRACKER.preferenceChange(null); + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/ModulePreferences.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/ModulePreferences.java new file mode 100644 index 000000000000..98790bec04fb --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/ModulePreferences.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.preferences; + +import java.util.prefs.Preferences; +import org.netbeans.api.editor.mimelookup.MimeLookup; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import static org.netbeans.modules.php.blade.editor.preferences.GeneralPreferencesUtils.ENABLE_AUTO_TAG_COMPLETION; + +/** + * + * @author bogdan + */ +public class ModulePreferences { + public static Preferences getPreferences(){ + return MimeLookup.getLookup(BladeLanguage.MIME_TYPE).lookup(Preferences.class); + } + + public static void setPrefBoolean(String key, boolean value){ + getPreferences().putBoolean(key, value); + } + + public static boolean isAutoTagCompletionEnabled(){ + return ModulePreferences.getPreferences().getBoolean(ENABLE_AUTO_TAG_COMPLETION, true); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathInfo.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathInfo.java new file mode 100644 index 000000000000..a37be0c2dec5 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathInfo.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.refactoring; + + +import java.util.Objects; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class BladePathInfo { + + private final FileObject sourceFile; + private final String bladePath; + + public BladePathInfo(FileObject sourceFile, String bladePath) { + this.sourceFile = sourceFile; + this.bladePath = bladePath; + } + + public FileObject getSourceFile() { + return sourceFile; + } + + public String getBladePath() { + return bladePath; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 53 * hash + Objects.hashCode(this.sourceFile); + hash = 53 * hash + Objects.hashCode(this.bladePath); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final BladePathInfo other = (BladePathInfo) obj; + if (!Objects.equals(this.bladePath, other.bladePath)) { + return false; + } + return Objects.equals(this.sourceFile, other.sourceFile); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathUsage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathUsage.java new file mode 100644 index 000000000000..dc67db853139 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathUsage.java @@ -0,0 +1,203 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.refactoring; + +import java.io.IOException; +import java.util.List; +import java.util.concurrent.CancellationException; +import java.util.concurrent.atomic.AtomicBoolean; +import javax.swing.text.BadLocationException; +import javax.swing.text.Position; +import javax.swing.text.StyledDocument; +import org.netbeans.api.editor.document.LineDocument; +import org.netbeans.api.editor.document.LineDocumentUtils; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.modules.php.blade.editor.indexing.BladeIndex.IndexedOffsetReference; +import org.netbeans.modules.php.blade.editor.indexing.QueryUtils; + +import org.netbeans.modules.refactoring.api.AbstractRefactoring; +import org.netbeans.modules.refactoring.api.Problem; +import org.netbeans.modules.refactoring.api.WhereUsedQuery; +import org.netbeans.modules.refactoring.spi.RefactoringElementsBag; +import org.netbeans.modules.refactoring.spi.RefactoringPlugin; +import org.netbeans.modules.refactoring.spi.RefactoringPluginFactory; +import org.netbeans.modules.refactoring.spi.SimpleRefactoringElementImplementation; +import org.openide.cookies.EditorCookie; +import org.openide.filesystems.FileObject; +import org.openide.text.CloneableEditorSupport; +import org.openide.text.PositionBounds; +import org.openide.util.Exceptions; +import org.openide.util.Lookup; +import org.openide.util.lookup.ServiceProvider; + +/** + * + * @author bogdan + */ +public class BladePathUsage { + + private static final class WhereUsedRefactoringPlugin implements RefactoringPlugin { + + private final WhereUsedQuery query; + private final BladePathInfo bladeFileReference; + private final AtomicBoolean cancel = new AtomicBoolean(); + + public WhereUsedRefactoringPlugin(WhereUsedQuery query, BladePathInfo bladeFileReference) { + this.query = query; + this.bladeFileReference = bladeFileReference; + } + + @Override + public Problem preCheck() { + return null; + } + + @Override + public Problem checkParameters() { + return null; + } + + @Override + public Problem fastCheckParameters() { + return null; + } + + @Override + public void cancelRequest() { + cancel.set(true); + } + + @Override + public Problem prepare(RefactoringElementsBag refactoringElements) { + try { + FileObject sourceFO = this.bladeFileReference.getSourceFile(); + + if (!BladeLanguage.MIME_TYPE.equals(sourceFO.getMIMEType())) { + return null; + } + + List references = QueryUtils.getIncludePathReferences(this.bladeFileReference.getBladePath(), sourceFO); + + for (IndexedOffsetReference reference : references) { + if (cancel.get()) { + throw new CancellationException(); + } + + PositionBounds bounds; + FileObject fo = reference.getOriginFile(); + int start = reference.getStart(); + int end = start + reference.getReference().length(); + try { + CloneableEditorSupport es = fo.getLookup().lookup(CloneableEditorSupport.class); + EditorCookie ec = fo.getLookup().lookup(EditorCookie.class); + StyledDocument doc = ec.openDocument(); + LineDocument ldoc = (LineDocument) doc; + + int rowStart = LineDocumentUtils.getLineStart(ldoc, start); + int rowEnd = LineDocumentUtils.getLineEnd(ldoc, end); + + bounds = new PositionBounds( + es.createPositionRef(start, Position.Bias.Forward), + es.createPositionRef(end, Position.Bias.Forward) + ); + + String lineText = doc.getText(rowStart, rowEnd - rowStart); + //offset quote symbols + String annotatedLine + = lineText.substring(0, start - rowStart + 1) + + "" + + lineText.substring(start - rowStart + 1, end - rowStart + 2) + + "" + + lineText.substring(end - rowStart + 2); + refactoringElements.add(query, new BladeRefactoringElementImpl(annotatedLine, fo, bounds)); + } catch (BadLocationException | IOException ex) { + Exceptions.printStackTrace(ex); + } + } + + return null; + } catch (CancellationException ex) { + return new Problem(false, "Cancelled"); + } + } + + } + + @ServiceProvider(service = RefactoringPluginFactory.class) + public static class FactoryImpl implements RefactoringPluginFactory { + + @Override + public RefactoringPlugin createInstance(AbstractRefactoring refactoring) { + if (refactoring instanceof WhereUsedQuery) { + WhereUsedQuery q = (WhereUsedQuery) refactoring; + BladePathInfo symbolInformation = q.getRefactoringSource().lookup(BladePathInfo.class); + if (symbolInformation != null) { + return new WhereUsedRefactoringPlugin(q, symbolInformation); + } + } + return null; + } + + } + + public static class BladeRefactoringElementImpl extends SimpleRefactoringElementImplementation { + + private final String annotatedLine; + private final FileObject file; + private final PositionBounds bounds; + + public BladeRefactoringElementImpl(String annotatedLine, FileObject file, PositionBounds bounds) { + this.annotatedLine = annotatedLine; + this.file = file; + this.bounds = bounds; + } + + @Override + public String getText() { + return "Element usage"; + } + + @Override + public String getDisplayText() { + return annotatedLine; + } + + @Override + public void performChange() { + // Currently the BladeRefactoringElementImpl is only used for the + // WhereUsedRefactoring, which is not doing changes + throw new UnsupportedOperationException(); + } + + @Override + public Lookup getLookup() { + return Lookup.EMPTY; + } + + @Override + public FileObject getParentFile() { + return file; + } + + @Override + public PositionBounds getPosition() { + return bounds; + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/RefactoringActionsProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/RefactoringActionsProvider.java new file mode 100644 index 000000000000..4807dfda165e --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/RefactoringActionsProvider.java @@ -0,0 +1,175 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.refactoring; + +import java.io.IOException; +import javax.swing.JEditorPane; +import javax.swing.SwingUtilities; +import javax.swing.text.AbstractDocument; +import javax.swing.text.Document; +import org.netbeans.api.lexer.TokenHierarchy; +import org.netbeans.api.lexer.TokenSequence; +import org.netbeans.modules.editor.NbEditorUtilities; +import org.netbeans.modules.refactoring.api.ui.ExplorerContext; +import org.netbeans.modules.refactoring.spi.ui.ActionsImplementationProvider; +import org.netbeans.modules.refactoring.spi.ui.UI; +import org.openide.cookies.*; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; +import org.openide.loaders.DataObject; +import org.openide.nodes.Node; +import org.openide.text.CloneableEditorSupport; +import org.openide.text.NbDocument; +import org.openide.util.Exceptions; +import org.openide.util.Lookup; +import org.openide.util.NbBundle; +import org.openide.util.NbBundle.Messages; +import org.openide.windows.TopComponent; + +/** + * + * @author bogdan + */ +@NbBundle.Messages({"WARN_CannotPerformHere=Cannot perform rename here."}) +@org.openide.util.lookup.ServiceProvider(service = org.netbeans.modules.refactoring.spi.ui.ActionsImplementationProvider.class, position = 300) +public class RefactoringActionsProvider extends ActionsImplementationProvider { + + @Override + @Messages("NM_Unknown=Unknown") + public void doFindUsages(Lookup lookup) { + Runnable start = () -> { + EditorCookie ec = lookup.lookup(EditorCookie.class); + + if (isFromEditor(ec)) { + JEditorPane c = ec.getOpenedPanes()[0]; + Document doc = c.getDocument(); + AbstractDocument abstractDoc = (doc instanceof AbstractDocument) ? ((AbstractDocument) doc) : null; + FileObject file = NbEditorUtilities.getFileObject(doc); + int caretPos = c.getCaretPosition(); + + String name = "Unknown"; + + if (abstractDoc != null) { + abstractDoc.readLock(); + } + try { + TokenSequence ts = TokenHierarchy.get(doc).tokenSequence(); + if (ts != null) { + ts.move(caretPos); + if (ts.moveNext()) { + name = ts.token().text().toString(); + } + } + } finally { + if (abstractDoc != null) { + abstractDoc.readUnlock(); + } + } + + BladePathInfo si = new BladePathInfo(file, name); + UI.openRefactoringUI(new WhereBladePathUsedRefactoringUIImpl(si), + TopComponent.getRegistry().getActivated()); + } + }; + SwingUtilities.invokeLater(start); + } + + @Override + public boolean canCopy(Lookup lookup) { + boolean isBlade = isBlade(lookup); + if (!isBlade) { + return super.canCopy(lookup); + } + return true; + } + + @Override + public void doCopy(final Lookup lookup) { + + final FileObject dir = getTarget(lookup); + + //should treat multiple files + Runnable start = () -> { + Node node = lookup.lookup(Node.class); + FileObject file = node.getLookup().lookup(FileObject.class); + FileObject dirTarget = (dir!= null && dir.isFolder()) ? dir : file.getParent(); + + String name = file.getNameExt(); + String existingFileName = file.getNameExt(); + int counter = 1; + while(counter < 50 && dirTarget.getFileObject(existingFileName)!= null){ + //shouldn't be the case + existingFileName = name.substring(0, name.length() - ".blade.php".length()) + "_" + counter + ".blade.php"; + counter++; + } + + String incrementSuffix = counter > 1 ? "_" + (counter - 1) : ""; + String resultName = existingFileName.substring(0, name.length() - ".blade.php".length()) + incrementSuffix; + try { + FileUtil.copyFile(file, dirTarget, resultName, "blade.php"); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + }; + SwingUtilities.invokeLater(start); + } + + public boolean isBlade(Lookup lookup) { + boolean ret = false; + Node node = lookup.lookup(Node.class); + + //hack to identify a blade file ? + if (node != null && node.getDisplayName().endsWith(".blade.php")) { + ret = true; + } + return ret; + } + + public static FileObject getTarget(Lookup look) { + ExplorerContext drop = look.lookup(ExplorerContext.class); + if (drop == null) { + return null; + } + Node n = drop.getTargetNode(); + if (n == null) { + return null; + } + DataObject dob = n.getCookie(DataObject.class); + if (dob != null) { + return dob.getPrimaryFile(); + } + return null; + } + + @Override + public boolean canFindUsages(Lookup lookup) { + return isBlade(lookup); + } + + public static boolean isFromEditor(EditorCookie ec) { + if (ec != null && NbDocument.findRecentEditorPane(ec) != null) { + TopComponent activetc = TopComponent.getRegistry().getActivated(); + if (activetc instanceof CloneableEditorSupport.Pane) { + return true; + } + } + return false; + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/WhereBladePathUsedRefactoringUIImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/WhereBladePathUsedRefactoringUIImpl.java new file mode 100644 index 000000000000..bdd16a76b86f --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/WhereBladePathUsedRefactoringUIImpl.java @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.refactoring; + +import javax.swing.event.ChangeListener; +import org.netbeans.modules.refactoring.api.AbstractRefactoring; +import org.netbeans.modules.refactoring.api.Problem; +import org.netbeans.modules.refactoring.api.WhereUsedQuery; +import org.netbeans.modules.refactoring.spi.ui.CustomRefactoringPanel; +import org.netbeans.modules.refactoring.spi.ui.RefactoringUI; +import org.openide.util.HelpCtx; +import org.openide.util.NbBundle.Messages; +import org.openide.util.lookup.Lookups; + +/** + * + * @author bogdan + */ +public class WhereBladePathUsedRefactoringUIImpl implements RefactoringUI { + private final BladePathInfo symbolInformation; + + public WhereBladePathUsedRefactoringUIImpl(BladePathInfo symbolInformation) { + this.symbolInformation = symbolInformation; + } + + @Override + public String getName() { + return symbolInformation.getBladePath(); + } + + @Override + @Messages({ + "# {0} - identifier", + "DESC_Usages=Usages of {0}" + }) + public String getDescription() { + return Bundle.DESC_Usages(symbolInformation.getBladePath()); + } + + @Override + public boolean isQuery() { + return true; + } + + @Override + public CustomRefactoringPanel getPanel(ChangeListener parent) { + return null; + } + + @Override + public Problem setParameters() { + return null; + } + + @Override + public Problem checkParameters() { + return null; + } + + @Override + public boolean hasParameters() { + return false; + } + + @Override + public AbstractRefactoring getRefactoring() { + return new WhereUsedQuery(Lookups.fixed(symbolInformation)); + } + + @Override + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java new file mode 100644 index 000000000000..79e201d1779e --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java @@ -0,0 +1,175 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.typinghooks; + +import java.util.Map; +import java.util.WeakHashMap; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.api.editor.mimelookup.MimePath; +import org.netbeans.api.editor.mimelookup.MimeRegistration; +import org.netbeans.api.editor.mimelookup.MimeRegistrations; +import org.netbeans.api.lexer.Token; +import org.netbeans.api.lexer.TokenHierarchy; +import org.netbeans.api.lexer.TokenSequence; +import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; +import org.netbeans.modules.php.blade.editor.preferences.ModulePreferences; +import org.netbeans.spi.editor.typinghooks.TypedTextInterceptor; + +/** + * auto complete for '[', '(', '\'', '"' + * + * @author bhaidu + */ +public class BladeTypedTextInterceptor implements TypedTextInterceptor { + + static final Map CHAR_PAIR = new WeakHashMap<>(); + + public static enum TagType { + CONTENT, + RAW, + COMMENT + } + /** + * auto complete char pair + */ + static { + CHAR_PAIR.put('(', ')'); + CHAR_PAIR.put('[', ']'); + CHAR_PAIR.put('\'', '\''); + CHAR_PAIR.put('"', '"'); + } + + @Override + public boolean beforeInsert(Context cntxt) throws BadLocationException { + return false; + } + + @Override + public void insert(MutableContext context) throws BadLocationException { + if (context.getReplacedText().length() != 0) { + return; + } + + char ch = context.getText().charAt(0); + + if (CHAR_PAIR.containsKey(ch)) { + completePairChar(context, ch, CHAR_PAIR.get(ch)); + return; + } + + if (!isAutoTagCompletionEnabled()){ + return; + } + + String typedText = context.getText(); + + Map TagParts = new WeakHashMap<>(); + TagParts.put("{", TagType.CONTENT); + TagParts.put("!", TagType.RAW); + TagParts.put("-", TagType.CONTENT); + + TagType tagType = TagParts.get(typedText); + + if (tagType == null){ + return; + } + + int offset = context.getOffset(); + + if (offset < 2){ + return; + } + + Document document = context.getDocument(); + TokenHierarchy th = TokenHierarchy.get(document); + TokenSequence ts = th.tokenSequence(); + ts.move(context.getOffset() - 1); + ts.moveNext(); + + Token token = ts.token(); + + if (token == null || !(token.id() instanceof BladeTokenId)){ + return; + } + + BladeTokenId bladeToken = (BladeTokenId) token.id(); + + String tokenText = token.text().toString(); + + switch (bladeToken) { + case HTML: + if (tokenText.equals("{") && tagType == TagType.CONTENT){ + context.setText("{ }}", 1); + } else if (tokenText.equals("{!") && tagType == TagType.RAW ){ + context.setText("! !!}", 1); + } else if (tokenText.equals("{{-") && tagType == TagType.COMMENT ){ + context.setText("- --}}", 1); + } + break; + } + } + + /** + * simple char context completion + * + * @param context + * @param chopen + * @param chclose + */ + private void completePairChar(MutableContext context, char chopen, char chclose) { + StringBuilder sb = new StringBuilder(); + sb.append(chopen); + sb.append(chclose); + String text = sb.toString(); + context.setText(text, 1); + } + + @Override + public void afterInsert(Context cntxt) throws BadLocationException { + + } + + @Override + public void cancelled(Context cntxt) { + + } + + public boolean isAutoTagCompletionEnabled(){ + return ModulePreferences.isAutoTagCompletionEnabled(); + } + + /** + * register for HTML also + */ + @MimeRegistrations(value = { + @MimeRegistration(mimeType = BladeLanguage.MIME_TYPE, service = TypedTextInterceptor.Factory.class), + @MimeRegistration(mimeType = "text/html", service = TypedTextInterceptor.Factory.class) + }) + public static class Factory implements TypedTextInterceptor.Factory { + + @Override + public TypedTextInterceptor createTypedTextInterceptor(MimePath mimePath) { + return new BladeTypedTextInterceptor(); + } + + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.form b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.form new file mode 100644 index 000000000000..b92b5b851cd8 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.form @@ -0,0 +1,140 @@ + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.java new file mode 100644 index 000000000000..78f0e75981d8 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.java @@ -0,0 +1,196 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.ui.customizer; + +import java.awt.Desktop; +import java.awt.EventQueue; +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; +import org.netbeans.modules.php.blade.project.BladeProjectProperties; +import org.openide.filesystems.FileChooserBuilder; +import org.openide.filesystems.FileUtil; +import org.openide.util.Exceptions; + +/** + * + * @author bhaidu + */ +public class BladeDirectives extends javax.swing.JPanel { + + private final Project project; + BladeProjectProperties bladeProperties; + + /** + * Creates new form CustomizerIncludePath + * + * @param project + */ + public BladeDirectives(Project project) { + this.project = project; + bladeProperties = BladeProjectProperties.getInstance(project); + initComponents(); + init(); + } + + private void init() { + //the model reference is enough + customDirectivePathList.setModel(bladeProperties.getModelForDirectiveCusomizerPathList()); + } + + public void storeData() { + bladeProperties.storeDirectiveCustomizerPaths(); + CustomDirectives.resetInstance(project); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + includePathLabel = new javax.swing.JLabel(); + compilerPathFileButton = new javax.swing.JButton(); + jScrollPane1 = new javax.swing.JScrollPane(); + customDirectivePathList = new javax.swing.JList<>(); + removePathButton = new javax.swing.JButton(); + jLabel1 = new javax.swing.JLabel(); + jLabel3 = new javax.swing.JLabel(); + + org.openide.awt.Mnemonics.setLocalizedText(includePathLabel, org.openide.util.NbBundle.getMessage(BladeDirectives.class, "BladeDirectives.includePathLabel.text_1")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(compilerPathFileButton, org.openide.util.NbBundle.getMessage(BladeDirectives.class, "BladeDirectives.compilerPathFileButton.text_1")); // NOI18N + compilerPathFileButton.setToolTipText(org.openide.util.NbBundle.getMessage(BladeDirectives.class, "BladeDirectives.compilerPathFileButton.toolTipText_1")); // NOI18N + compilerPathFileButton.setActionCommand(org.openide.util.NbBundle.getMessage(BladeDirectives.class, "BladeDirectives.compilerPathFileButton.actionCommand_1")); // NOI18N + compilerPathFileButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + compilerPathFileButtonActionPerformed(evt); + } + }); + + jScrollPane1.setViewportView(customDirectivePathList); + + org.openide.awt.Mnemonics.setLocalizedText(removePathButton, org.openide.util.NbBundle.getMessage(BladeDirectives.class, "BladeDirectives.removePathButton.text_1")); // NOI18N + removePathButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + removePathButtonActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(BladeDirectives.class, "BladeDirectives.jLabel1.text")); // NOI18N + + jLabel3.setForeground(new java.awt.Color(0, 51, 255)); + org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(BladeDirectives.class, "BladeDirectives.jLabel3.text")); // NOI18N + jLabel3.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + jLabel3MouseClicked(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 486, Short.MAX_VALUE) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(compilerPathFileButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(removePathButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(includePathLabel) + .addGroup(layout.createSequentialGroup() + .addGap(10, 10, 10) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel3) + .addComponent(jLabel1)))) + .addGap(0, 306, Short.MAX_VALUE))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(20, 20, 20) + .addComponent(includePathLabel) + .addGap(15, 15, 15) + .addComponent(jLabel1) + .addGap(8, 8, 8) + .addComponent(jLabel3) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 143, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(layout.createSequentialGroup() + .addComponent(compilerPathFileButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(removePathButton))) + .addGap(0, 50, Short.MAX_VALUE)) + ); + }// //GEN-END:initComponents + + private void compilerPathFileButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_compilerPathFileButtonActionPerformed + assert EventQueue.isDispatchThread(); + File sources = new FileChooserBuilder(BladeDirectives.class) + .setFilesOnly(true) + .setTitle("Select compiler File Path") + .setDefaultWorkingDirectory(FileUtil.toFile(project.getProjectDirectory())) + .forceUseOfDefaultWorkingDirectory(true) + .showOpenDialog(); + if (sources != null) { + //TODO validate the path if it has directives + bladeProperties.addDirectiveCustomizerPath(FileUtil.normalizeFile(sources).getAbsolutePath()); + } + }//GEN-LAST:event_compilerPathFileButtonActionPerformed + + private void removePathButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removePathButtonActionPerformed + int index = customDirectivePathList.getSelectedIndex(); + if (index > -1) { + bladeProperties.removeCustomizerPath(index); + } + + }//GEN-LAST:event_removePathButtonActionPerformed + + private void jLabel3MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel3MouseClicked + try { + Desktop.getDesktop().browse(new URI("https://laravel.com/docs/10.x/blade#extending-blade")); + } catch (URISyntaxException | IOException ex) { + Exceptions.printStackTrace(ex); + } + + }//GEN-LAST:event_jLabel3MouseClicked + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton compilerPathFileButton; + private javax.swing.JList customDirectivePathList; + private javax.swing.JLabel includePathLabel; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel3; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JButton removePathButton; + // End of variables declaration//GEN-END:variables +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectivesCustomizerProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectivesCustomizerProvider.java new file mode 100644 index 000000000000..7a8dd8fe2ab1 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectivesCustomizerProvider.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.ui.customizer; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import javax.swing.JComponent; +import org.netbeans.api.project.Project; +import org.netbeans.spi.project.ui.support.ProjectCustomizer; +import org.openide.util.Lookup; +import org.openide.util.NbBundle; + +/** + * + * @author bhaidu + */ +public class BladeDirectivesCustomizerProvider implements ProjectCustomizer.CompositeCategoryProvider { + + public static final String BLADE_DIRECTIVES = "Custom Directives"; // NOI18N + + @NbBundle.Messages("BladeCompilerCustomizerProvider.name=Blade Directives") + @Override + public ProjectCustomizer.Category createCategory(Lookup lkp) { + return ProjectCustomizer.Category.create(BLADE_DIRECTIVES, BLADE_DIRECTIVES, null); + } + + @Override + public JComponent createComponent(ProjectCustomizer.Category category, Lookup context) { + Project project = context.lookup(Project.class); + assert project != null; + + BladeDirectives panel = new BladeDirectives(project); + category.setOkButtonListener(new BladeDirectivesCustomizerProvider.Listener(panel)); + return panel; + } + + private class Listener implements ActionListener { + + private final BladeDirectives panel; + + public Listener(BladeDirectives panel) { + this.panel = panel; + } + + @Override + public void actionPerformed(ActionEvent e) { + this.panel.storeData(); + } + + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.form b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.form new file mode 100644 index 000000000000..6c452fb0787d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.form @@ -0,0 +1,66 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.java new file mode 100644 index 000000000000..18ed2f2a02f2 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.ui.customizer; + +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.editor.preferences.ModulePreferences; +import org.netbeans.modules.php.blade.editor.preferences.GeneralPreferencesUtils; +/** + * + * @author bhaidu + */ +public class BladeGeneralSettings extends javax.swing.JPanel { + + /** + * Creates new form BladeGeneral + * @param project + */ + public BladeGeneralSettings(Project project) { + initComponents(); + init(); + } + + private void init() { + this.formatting_enabled.setSelected(GeneralPreferencesUtils.isFormattingEnabled()); + this.indentation_enabled.setSelected(GeneralPreferencesUtils.isIndentationEnabled()); + } + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + jLabel1 = new javax.swing.JLabel(); + formatting_enabled = new javax.swing.JCheckBox(); + indentation_enabled = new javax.swing.JCheckBox(); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(BladeGeneralSettings.class, "BladeGeneralSettings.jLabel1.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(formatting_enabled, org.openide.util.NbBundle.getMessage(BladeGeneralSettings.class, "BladeGeneralSettings.formatting_enabled.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(indentation_enabled, org.openide.util.NbBundle.getMessage(BladeGeneralSettings.class, "BladeGeneralSettings.indentation_enabled.text")); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(formatting_enabled) + .addComponent(jLabel1) + .addComponent(indentation_enabled)) + .addContainerGap(184, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(formatting_enabled) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(indentation_enabled) + .addGap(0, 229, Short.MAX_VALUE)) + ); + }// //GEN-END:initComponents + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JCheckBox formatting_enabled; + private javax.swing.JCheckBox indentation_enabled; + private javax.swing.JLabel jLabel1; + // End of variables declaration//GEN-END:variables + + public void storeData() { + ModulePreferences.setPrefBoolean(GeneralPreferencesUtils.ENABLE_FORMATTING, this.formatting_enabled.isSelected()); + ModulePreferences.setPrefBoolean(GeneralPreferencesUtils.ENABLE_INDENTATION, this.indentation_enabled.isSelected()); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeOptionsCustomizerProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeOptionsCustomizerProvider.java new file mode 100644 index 000000000000..c46e7ae390ec --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeOptionsCustomizerProvider.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.ui.customizer; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import javax.swing.JComponent; +import org.netbeans.api.project.Project; +import org.netbeans.spi.project.ui.support.ProjectCustomizer; +import org.openide.util.Lookup; +import org.openide.util.NbBundle; + +/** + * + * @author bhaidu + */ +public class BladeOptionsCustomizerProvider implements ProjectCustomizer.CompositeCategoryProvider { + + public static final String VIEWS_FOLDERS = "views_folders"; // NOI18N + + @Override + public ProjectCustomizer.Category createCategory(Lookup lkp) { + return ProjectCustomizer.Category.create(VIEWS_FOLDERS, + NbBundle.getMessage(BladeOptionsCustomizerProvider.class, + "LBL_ViewsFolders"), null); + } + + @Override + public JComponent createComponent(ProjectCustomizer.Category category, Lookup context) { + Project project = context.lookup(Project.class); + assert project != null; + + BladeViewsFoldersPanel panel = new BladeViewsFoldersPanel(project); + category.setOkButtonListener(new Listener(panel)); + return panel; + } + + private class Listener implements ActionListener { + private final BladeViewsFoldersPanel panel; + public Listener(BladeViewsFoldersPanel panel){ + this.panel = panel; + } + @Override + public void actionPerformed(ActionEvent e) { + this.panel.storeData(); + } + + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeSettingsCustomizerProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeSettingsCustomizerProvider.java new file mode 100644 index 000000000000..d0dc423b6f17 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeSettingsCustomizerProvider.java @@ -0,0 +1,105 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.ui.customizer; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.List; +import javax.swing.JComponent; +import org.netbeans.api.project.Project; +import org.netbeans.spi.project.ui.support.ProjectCustomizer; +import org.openide.util.Lookup; +import org.openide.util.NbBundle; + +/** + * Blade settings node + * + * @author bhaidu + */ +public class BladeSettingsCustomizerProvider implements ProjectCustomizer.CompositeCategoryProvider { + + public static final String CUSTOMIZER_IDENT = "Laravel Blade"; // NOI18N + + @NbBundle.Messages("BladeSettingsCustomizerProvider.name=Blade") + @Override + public ProjectCustomizer.Category createCategory(Lookup lkp) { + List subcategories = new ArrayList<>(); + BladeOptionsCustomizerProvider optionsCustomizer = new BladeOptionsCustomizerProvider(); + subcategories.add(optionsCustomizer.createCategory(lkp)); + BladeDirectivesCustomizerProvider directiveCustomizer = new BladeDirectivesCustomizerProvider(); + subcategories.add(directiveCustomizer.createCategory(lkp)); + return ProjectCustomizer.Category.create(CUSTOMIZER_IDENT, + NbBundle.getMessage(BladeSettingsCustomizerProvider.class, "LBL_LaravelBlade"), null, + subcategories.toArray(new ProjectCustomizer.Category[0])); + } + + @Override + public JComponent createComponent(ProjectCustomizer.Category category, Lookup context) { + switch (category.getName()) { + case BladeOptionsCustomizerProvider.VIEWS_FOLDERS: + BladeOptionsCustomizerProvider provider = new BladeOptionsCustomizerProvider(); + return provider.createComponent(category, context); + case BladeDirectivesCustomizerProvider.BLADE_DIRECTIVES: + BladeDirectivesCustomizerProvider directivesProvider = new BladeDirectivesCustomizerProvider(); + return directivesProvider.createComponent(category, context); + } + + return createGeneralSettingsComponent(category, context); + } + + public JComponent createGeneralSettingsComponent(ProjectCustomizer.Category category, Lookup context) { + Project project = context.lookup(Project.class); + assert project != null; + + BladeGeneralSettings panel = new BladeGeneralSettings(project); + category.setOkButtonListener(new Listener(panel)); + return panel; + } + + private class Listener implements ActionListener { + + private final BladeGeneralSettings panel; + + public Listener(BladeGeneralSettings panel) { + this.panel = panel; + } + + @Override + public void actionPerformed(ActionEvent e) { + this.panel.storeData(); + } + + } + + @ProjectCustomizer.CompositeCategoryProvider.Registration( + projectType = "org.netbeans.modules.web.clientproject", // NOI18N + position = 367) + public static BladeSettingsCustomizerProvider forHtml5Project() { + return new BladeSettingsCustomizerProvider(); + } + + @ProjectCustomizer.CompositeCategoryProvider.Registration( + projectType = "org-netbeans-modules-php-project", // NOI18N + position = 402) + public static ProjectCustomizer.CompositeCategoryProvider forPhpProject() { + return new BladeSettingsCustomizerProvider(); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.form b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.form new file mode 100644 index 000000000000..0fbe951aaca2 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.form @@ -0,0 +1,169 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.java new file mode 100644 index 000000000000..3d28314d3b43 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.java @@ -0,0 +1,233 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.ui.customizer; + +import java.awt.EventQueue; +import java.io.File; +import javax.swing.event.ChangeListener; +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.editor.indexing.BladeIndex; +import org.netbeans.modules.php.blade.editor.indexing.IndexManager; +import org.netbeans.modules.php.blade.project.BladeProjectProperties; +import org.netbeans.spi.options.OptionsPanelController; +import org.openide.filesystems.*; +import org.openide.util.ChangeSupport; +import org.openide.util.NbBundle; + +@NbBundle.Messages("BladePanel.options.keywords.tabTitle=Frameworks & Tools") +@OptionsPanelController.Keywords( + keywords = { + "php", "blade" + }, + location = "Html5", + tabTitle = "#BladePanel.options.keywords.tabTitle" +) + +public final class BladeViewsFoldersPanel extends javax.swing.JPanel { + + private final ChangeSupport changeSupport = new ChangeSupport(this); + private final Project project; + BladeProjectProperties bladeProperties; + + BladeViewsFoldersPanel(Project project) { + assert project != null; + this.project = project; + bladeProperties = BladeProjectProperties.getInstance(project); + initComponents(); + init(); + } + + private void init(){ + viewsPathList.setModel(bladeProperties.getModelViewsPathList()); + nonLaravelViewDeclFinder.setSelected(bladeProperties.getNonLaravelDeclFinderFlag()); + } + + public void storeData(){ + bladeProperties.storeViewsPaths(); + bladeProperties.storeNonLaravelDeclFinderFlag(nonLaravelViewDeclFinder.isSelected()); + } + + public void addChangeListener(ChangeListener listener) { + changeSupport.addChangeListener(listener); + } + + void fireChange() { + changeSupport.fireChange(); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + toggleCommentButtonGroup = new javax.swing.ButtonGroup(); + jLabel1 = new javax.swing.JLabel(); + jScrollPane1 = new javax.swing.JScrollPane(); + viewsPathList = new javax.swing.JList<>(); + addViewFolderButton = new javax.swing.JButton(); + removeViewFolderButton = new javax.swing.JButton(); + reindexViewsButton = new javax.swing.JButton(); + jLabel3 = new javax.swing.JLabel(); + jLabel4 = new javax.swing.JLabel(); + reindexViewFolderButton = new javax.swing.JButton(); + nonLaravelViewDeclFinder = new javax.swing.JCheckBox(); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(BladeViewsFoldersPanel.class, "BladeViewsFoldersPanel.jLabel1.text")); // NOI18N + jLabel1.setToolTipText(org.openide.util.NbBundle.getMessage(BladeViewsFoldersPanel.class, "BladeViewsFoldersPanel.jLabel1.toolTipText")); // NOI18N + + jScrollPane1.setViewportView(viewsPathList); + + org.openide.awt.Mnemonics.setLocalizedText(addViewFolderButton, org.openide.util.NbBundle.getMessage(BladeViewsFoldersPanel.class, "BladeViewsFoldersPanel.addViewFolderButton.text")); // NOI18N + addViewFolderButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + addViewFolderButtonActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(removeViewFolderButton, org.openide.util.NbBundle.getMessage(BladeViewsFoldersPanel.class, "BladeViewsFoldersPanel.removeViewFolderButton.text")); // NOI18N + removeViewFolderButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + removeViewFolderButtonActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(reindexViewsButton, org.openide.util.NbBundle.getMessage(BladeViewsFoldersPanel.class, "BladeViewsFoldersPanel.reindexViewsButton.text")); // NOI18N + reindexViewsButton.setToolTipText(org.openide.util.NbBundle.getMessage(BladeViewsFoldersPanel.class, "BladeViewsFoldersPanel.reindexViewsButton.toolTipText")); // NOI18N + reindexViewsButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + reindexViewsButtonActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(BladeViewsFoldersPanel.class, "BladeViewsFoldersPanel.jLabel3.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(BladeViewsFoldersPanel.class, "BladeViewsFoldersPanel.jLabel4.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(reindexViewFolderButton, org.openide.util.NbBundle.getMessage(BladeViewsFoldersPanel.class, "BladeViewsFoldersPanel.reindexViewFolderButton.text")); // NOI18N + reindexViewFolderButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + reindexViewFolderButtonActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(nonLaravelViewDeclFinder, org.openide.util.NbBundle.getMessage(BladeViewsFoldersPanel.class, "BladeViewsFoldersPanel.nonLaravelViewDeclFinder.text")); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addComponent(jScrollPane1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(removeViewFolderButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(addViewFolderButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(reindexViewFolderButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel1) + .addComponent(reindexViewsButton) + .addComponent(jLabel4) + .addComponent(nonLaravelViewDeclFinder)) + .addGap(0, 83, Short.MAX_VALUE))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel4) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(addViewFolderButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(removeViewFolderButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(reindexViewFolderButton)) + .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 125, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(reindexViewsButton) + .addGap(18, 18, 18) + .addComponent(nonLaravelViewDeclFinder) + .addContainerGap(144, Short.MAX_VALUE)) + ); + }// //GEN-END:initComponents + + private void addViewFolderButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addViewFolderButtonActionPerformed + assert EventQueue.isDispatchThread(); + File sources = new FileChooserBuilder(BladeDirectives.class) + .setDirectoriesOnly(true) + .setTitle("Select View Folder Path") + .setDefaultWorkingDirectory(FileUtil.toFile(project.getProjectDirectory())) + .forceUseOfDefaultWorkingDirectory(true) + .showOpenDialog(); + if (sources != null) { + //TODO validate the path if it has blade files ? + bladeProperties.addViewsPath(FileUtil.normalizeFile(sources).getAbsolutePath()); + } + }//GEN-LAST:event_addViewFolderButtonActionPerformed + + private void removeViewFolderButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeViewFolderButtonActionPerformed + int index = viewsPathList.getSelectedIndex(); + if (index > -1) { + bladeProperties.removeViewsPath(index); + } + }//GEN-LAST:event_removeViewFolderButtonActionPerformed + + private void reindexViewsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_reindexViewsButtonActionPerformed + IndexManager.reindexProjectViews(project); + }//GEN-LAST:event_reindexViewsButtonActionPerformed + + private void reindexViewFolderButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_reindexViewFolderButtonActionPerformed + String path = viewsPathList.getSelectedValue(); + if (path != null && path.length() > 0) { + File viewPath = new File(path); + if (viewPath.exists()) { + IndexManager.reindexFolder(viewPath); + } + } + }//GEN-LAST:event_reindexViewFolderButtonActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton addViewFolderButton; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel3; + private javax.swing.JLabel jLabel4; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JCheckBox nonLaravelViewDeclFinder; + private javax.swing.JButton reindexViewFolderButton; + private javax.swing.JButton reindexViewsButton; + private javax.swing.JButton removeViewFolderButton; + private javax.swing.ButtonGroup toggleCommentButtonGroup; + private javax.swing.JList viewsPathList; + // End of variables declaration//GEN-END:variables + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/Bundle.properties b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/Bundle.properties new file mode 100644 index 000000000000..a8933a024d26 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/Bundle.properties @@ -0,0 +1,50 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +BladeDirectives.removePathButton.text=Remove File +BladeDirectives.compilerPathFileButton.actionCommand=compilerPathFolderButton +BladeDirectives.compilerPathFileButton.toolTipText= +BladeDirectives.compilerPathFileButton.text=Add File + + +# include path +BladeDirectives.includePathLabel.text=Custom Directive paths : +BladeDirectives.removePathButton.text_1=Remove File +BladeDirectives.compilerPathFileButton.actionCommand_1=compilerPathFolderButton +BladeDirectives.compilerPathFileButton.toolTipText_1= +BladeDirectives.compilerPathFileButton.text_1=Add File + + +# include path +BladeDirectives.includePathLabel.text_1=Custom Directive php setup files +LBL_LaravelBlade=Laravel blade +LBL_ViewsFolders=Views Folders +BladeDirectives.jLabel1.text=Php files containing custom directive defintions as in : +BladeDirectives.jLabel3.text=https://laravel.com/docs/10.x/blade#extending-blade +BladeViewsFoldersPanel.reindexViewFolderButton.text=Reindex selected +BladeViewsFoldersPanel.jLabel4.text=*Also add root folders of custom folder and fallback configuration (ex: views/template2022/) +BladeViewsFoldersPanel.jLabel3.text=*Add the folder where the blade view files are used. (ex: {root}/views) +BladeViewsFoldersPanel.reindexViewsButton.toolTipText=Reindex blade files to rebuild index regarding view paths +BladeViewsFoldersPanel.reindexViewsButton.text=Re-index views +BladeViewsFoldersPanel.removeViewFolderButton.text=Remove Folder +BladeViewsFoldersPanel.addViewFolderButton.text=Add Folder +BladeViewsFoldersPanel.jLabel1.toolTipText=Add your folder containing your blade files. +BladeViewsFoldersPanel.jLabel1.text=Views Folders +BladeGeneralSettings.jLabel1.text=Blade General Settings +BladeGeneralSettings.formatting_enabled.text=Enable Formatting (experimental) +BladeGeneralSettings.indentation_enabled.text=Enable Indentation (experimental) +BladeViewsFoldersPanel.nonLaravelViewDeclFinder.text=Allow Go to click action for paths arugment on `view`, `render` and `make` method diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UiOptionsUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UiOptionsUtils.java new file mode 100644 index 000000000000..194a751d7fb6 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UiOptionsUtils.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.ui.customizer; + +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; + + +/** + * + * @author bhaidu + */ +public class UiOptionsUtils { + + public static String encodeToStrings(Enumeration list) { + List result = new ArrayList<>(); + while (list.hasMoreElements()) { + result.add(list.nextElement()); + } + + return String.join("|", result); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/wizard/NewFileWizardIterator.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/wizard/NewFileWizardIterator.java new file mode 100644 index 000000000000..661da7979c26 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/wizard/NewFileWizardIterator.java @@ -0,0 +1,137 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.ui.wizard; + +import java.io.IOException; +import java.util.Collections; +import java.util.Set; +import javax.swing.event.ChangeListener; +import org.netbeans.api.project.Project; +import org.netbeans.api.project.ProjectUtils; +import org.netbeans.api.project.SourceGroup; +import org.netbeans.api.project.Sources; +import org.netbeans.api.templates.TemplateRegistration; +import org.openide.WizardDescriptor; +import org.openide.filesystems.FileObject; +import org.openide.loaders.DataFolder; +import org.netbeans.spi.project.ui.templates.support.Templates; +import org.openide.loaders.DataObject; + +/** + * + * @author bhaidu + */ +public class NewFileWizardIterator implements WizardDescriptor.InstantiatingIterator { + + WizardDescriptor wizard; + private WizardDescriptor.Panel wizardPanel; + + private NewFileWizardIterator() { + } + + @TemplateRegistration(folder = "Blade", category = "PHP", + content = "../../../resources/emptyBladeFile.blade.php", + description = "../../../resources/NewBladeFileDescription.html", + position = 120, + displayName = "Blade file", + scriptEngine = "freemarker") + public static WizardDescriptor.InstantiatingIterator createBladeWizardIterator() { + return new NewFileWizardIterator(); + } + + @Override + public Set instantiate() throws IOException { + // getBottomPanel().save(); + + FileObject dir = Templates.getTargetFolder(wizard); + FileObject template = Templates.getTemplate(wizard); + + DataFolder dataFolder = DataFolder.findFolder(dir); + DataObject dataTemplate = DataObject.find(template); + DataObject createdFile = dataTemplate.createFromTemplate(dataFolder, Templates.getTargetName(wizard) + ".blade"); + return Collections.singleton(createdFile.getPrimaryFile()); + } + + @Override + public void initialize(WizardDescriptor wizard) { + this.wizard = wizard; + Templates.setTargetName(wizard, "myfile"); + wizardPanel = createWizardPanel(); + } + + @Override + public void uninitialize(WizardDescriptor wizard) { + this.wizard = null; + wizardPanel = null; + } + + @Override + public WizardDescriptor.Panel current() { + return wizardPanel; + } + + @Override + public String name() { + return "new php file wizaed"; // NOI18N + } + + @Override + public boolean hasNext() { + return false; + } + + @Override + public boolean hasPrevious() { + return false; + } + + @Override + public void nextPanel() { + } + + @Override + public void previousPanel() { + } + + @Override + public void addChangeListener(ChangeListener listener) { + } + + @Override + public void removeChangeListener(ChangeListener listener) { + } + + + private WizardDescriptor.Panel createWizardPanel() { + Project project = getProject(); + assert project != null; + return Templates.buildSimpleTargetChooser(project, getSourceGroups(project)) + .create(); + } + + private SourceGroup[] getSourceGroups(Project project) { + Sources sources = ProjectUtils.getSources(project); + return sources.getSourceGroups(Sources.TYPE_GENERIC); + } + + private Project getProject() { + return Templates.getProject(wizard); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java new file mode 100644 index 000000000000..0606a5791531 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java @@ -0,0 +1,188 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.project; + +import java.util.HashMap; +import java.util.Map; +import java.util.prefs.PreferenceChangeListener; +import java.util.prefs.Preferences; +import javax.swing.DefaultListModel; +import org.netbeans.api.project.Project; +import org.netbeans.api.project.ProjectUtils; +import org.netbeans.modules.php.blade.editor.ui.customizer.UiOptionsUtils; +//import org.netbeans.modules.php.blade.editor.actions.ToggleBlockCommentAction; +import org.openide.util.NbPreferences; + +/** + * @todo ADD NEW OPTION VALUES + * @todo use nodes for files + * + * @author Haidu Bogdan + */ +public final class BladeProjectProperties { + + private static final Map INSTANCES = new HashMap<>(); + private static final String BLADE_VERSION = "blade.version"; // NOI18N + private static final String DIRECTIVE_CUSTOMIZER_PATH_LIST = "directive_customizer.path.list"; // NOI18N + private static final String VIEW_PATH_LIST = "views.path.list"; // NOI18N + private static final String NON_LARAVEL_DECL_FINDER = "non_laravel.decl.finder"; // NOI18N + public Project project; + + DefaultListModel directiveCustomizerPathList = new DefaultListModel(); + DefaultListModel viewsPathList = new DefaultListModel(); + boolean nonLaravelDeclFinder = false; + + private BladeProjectProperties(Project project) { + this.project = project; + initModelsFromPreferences(); + } + + public static BladeProjectProperties getInstance(Project project) { + if (INSTANCES.containsKey(project)) { + return INSTANCES.get(project); + } + BladeProjectProperties instance = new BladeProjectProperties(project); + INSTANCES.put(project, instance); + return instance; + } + + public static void closeProject(Project project){ + if (INSTANCES.containsKey(project)) { + INSTANCES.remove(project); + } + } + + private Preferences getPreferences() { + if (project != null) { + return ProjectUtils.getPreferences(project, this.getClass(), false); + } + return NbPreferences.forModule(this.getClass()); + } + + private void initModelsFromPreferences() { + directiveCustomizerPathList = createModelForDirectiveCusomizerPathList(); + viewsPathList = createModelForViewsPathList(); + nonLaravelDeclFinder = getPreferences().getBoolean(NON_LARAVEL_DECL_FINDER, false); + } + + public void storeDirectiveCustomizerPaths() { + String includePath = UiOptionsUtils.encodeToStrings(directiveCustomizerPathList.elements()); + getPreferences().put(DIRECTIVE_CUSTOMIZER_PATH_LIST, includePath); + } + + + public void storeViewsPaths() { + String includePath = UiOptionsUtils.encodeToStrings(viewsPathList.elements()); + getPreferences().put(VIEW_PATH_LIST, includePath); + } + + public void storeNonLaravelDeclFinderFlag(boolean status) { + nonLaravelDeclFinder = status; + getPreferences().putBoolean(NON_LARAVEL_DECL_FINDER, status); + } + + public void addDirectiveCustomizerPath(String path) { + directiveCustomizerPathList.addElement(path); + } + + public void addViewsPath(String path) { + viewsPathList.addElement(path); + } + + public void removeCustomizerPath(int index) { + directiveCustomizerPathList.remove(index); + } + + public void removeViewsPath(int index) { + viewsPathList.remove(index); + } + + public void setViewsPathList(DefaultListModel list) { + String includePath = UiOptionsUtils.encodeToStrings(list.elements()); + getPreferences().put(VIEW_PATH_LIST, includePath); + } + + public DefaultListModel createModelForDirectiveCusomizerPathList() { + return creatModelFromPreferences(DIRECTIVE_CUSTOMIZER_PATH_LIST); + } + + public DefaultListModel createModelForViewsPathList() { + return creatModelFromPreferences(VIEW_PATH_LIST); + } + + public DefaultListModel getModelForDirectiveCusomizerPathList() { + return directiveCustomizerPathList; + } + + public DefaultListModel getModelViewsPathList() { + return viewsPathList; + } + + public boolean getNonLaravelDeclFinderFlag() { + return nonLaravelDeclFinder; + } + + private DefaultListModel creatModelFromPreferences(String pathName) { + DefaultListModel model = new DefaultListModel<>(); + String encodedCompilerPathList = getPreferences().get(pathName, null); + String[] paths; + + if (encodedCompilerPathList != null) { + paths = encodedCompilerPathList.split("\\|", -1); + } else { + return model; + } + if (paths.length == 0) { + return model; + } + + for (String path : paths) { + model.addElement(path); + } + + return model; + } + + public String[] getCompilerPathList() { + String encodedCompilerPathList = getPreferences().get(DIRECTIVE_CUSTOMIZER_PATH_LIST, null); + String[] paths = new String[]{}; + if (encodedCompilerPathList != null) { + return encodedCompilerPathList.split("\\|", -1); + } + return paths; + } + + public String[] getViewsPathList() { + String encodedCompilerPathList = getPreferences().get(VIEW_PATH_LIST, null); + String[] paths = new String[]{}; + if (encodedCompilerPathList != null) { + return encodedCompilerPathList.split("\\|", -1); + } + return paths; + } + + public void addPreferenceChangeListener(PreferenceChangeListener preferenceChangeListener) { + getPreferences().addPreferenceChangeListener(preferenceChangeListener); + } + + public void removePreferenceChangeListener(PreferenceChangeListener preferenceChangeListener) { + getPreferences().removePreferenceChangeListener(preferenceChangeListener); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectSupport.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectSupport.java new file mode 100644 index 000000000000..847131a0f082 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectSupport.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.project; + +import java.util.prefs.PreferenceChangeEvent; +import java.util.prefs.PreferenceChangeListener; +import org.netbeans.api.project.Project; +import org.netbeans.spi.project.ProjectServiceProvider; +import org.netbeans.spi.project.ui.ProjectOpenedHook; +/** + * + * @author bhaidu + */ +public class BladeProjectSupport extends ProjectOpenedHook implements PreferenceChangeListener{ + private final Project project; + + public BladeProjectSupport(Project project) { + assert project != null; + this.project = project; + } + + private static BladeProjectSupport create(Project project) { + BladeProjectSupport support = new BladeProjectSupport(project); + return support; + } + + @ProjectServiceProvider(service = ProjectOpenedHook.class, projectType = "org-netbeans-modules-php-blade-project") // NOI18N + public static BladeProjectSupport forBladeProject(Project project) { + return create(project); + } + + @ProjectServiceProvider(service = ProjectOpenedHook.class, projectType = "org-netbeans-modules-php-project") // NOI18N + public static BladeProjectSupport forPhpProject(Project project) { + return create(project); + } + + @ProjectServiceProvider(service = ProjectOpenedHook.class, projectType = "org-netbeans-modules-web-project") // NOI18N + public static BladeProjectSupport forWebProject(Project project) { + return create(project); + } + + @Override + public void preferenceChange(PreferenceChangeEvent evt) { + // + } + + @Override + protected void projectOpened() { + BladeProjectProperties.getInstance(project); + ComponentsSupport.getInstance(project); + } + + @Override + protected void projectClosed() { + BladeProjectProperties.closeProject(project); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/Bundle.properties b/php/php.blade/src/org/netbeans/modules/php/blade/project/Bundle.properties new file mode 100644 index 000000000000..0eee8c6fd7de --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/Bundle.properties @@ -0,0 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +LBL_BladeOptionsName=Blade +CodeCompletionPanel.autoCompletionEscapedEchoDelimitersCheckBox.text=Use &Smart Escaped Echo Delimiters ({!!) Completion +CodeCompletionPanel.autoCompletionEchoDelimiterCheckBox.text=&Use Smart Echo Delimiters ({{) Completion +CodeCompletionPanel.autoCompletionSmartQuotesDelimitersLabel.text=Echo Delimiters Completion: diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java new file mode 100644 index 000000000000..3c1d7e86dc07 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.project; + +import java.util.HashMap; +import java.util.Map; +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.editor.components.annotation.Namespace; +import org.netbeans.modules.php.blade.editor.components.annotation.NamespaceRegister; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +@NamespaceRegister({ + @Namespace(path = "App\\View\\Components", from_app = true, relativeFilePath = "app/View/Components"), + @Namespace(path = "App\\Http\\Livewire", from_app = true, relativeFilePath = "app/Http/Livewire"), + @Namespace(path = "App\\Livewire", from_app = true, relativeFilePath = "app/Livewire"),//from 10 + @Namespace(path = "Illuminate\\Console\\View\\Components"), + @Namespace(path = "BladeUI\\Icons\\Components", packageName = "blade-ui-kit/blade-icons"), + @Namespace(path = "BladeUIKit\\Components", packageName = "blade-ui-kit/blade-ui-kit"), + }) +public class ComponentsSupport { + + private static final Map INSTANCES = new HashMap<>(); + private final Map installedComponentNamespace = new HashMap<>(); + private boolean scanned = false; + public Project project; + + private ComponentsSupport(Project project) { + this.project = project; + } + + public static ComponentsSupport getInstance(Project project) { + if (INSTANCES.containsKey(project)) { + return INSTANCES.get(project); + } + ComponentsSupport instance = new ComponentsSupport(project); + INSTANCES.put(project, instance); + return instance; + } + + public void scanForInstalledComponents() { + for (Namespace namespace : getRegisteredNamespaces()) { + FileObject fo; + if (namespace.from_app()) { + //check if folder exists + fo = project.getProjectDirectory().getFileObject(namespace.relativeFilePath()); + } else { + fo = project.getProjectDirectory().getFileObject("vendor/" + namespace.relativeFilePath()); + + } + if (fo == null || !fo.isValid()) { + continue; + } + installedComponentNamespace.put(fo, namespace); + } + scanned = true; + } + + public boolean isScanned() { + return scanned; + } + + public Map getInstalledComponentNamespace() { + return installedComponentNamespace; + } + + public Namespace[] getRegisteredNamespaces() { + NamespaceRegister namespaceRegister = this.getClass().getAnnotation(NamespaceRegister.class); + return namespaceRegister.value(); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java new file mode 100644 index 000000000000..78b4983af70f --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.project; + +import org.netbeans.api.project.Project; +import org.netbeans.spi.project.ui.support.ProjectConvertors; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class ProjectUtils { + + public static Project getMainOwner(FileObject file) { + Project project = ProjectConvertors.getNonConvertorOwner(file); + + if (project == null) { + return null; + } + + return project; + } + + public static FileObject getProjectDirectory(FileObject file) { + Project project = getMainOwner(file); + + if (project == null){ + return null; + } + + return project.getProjectDirectory(); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/Bundle.properties b/php/php.blade/src/org/netbeans/modules/php/blade/resources/Bundle.properties new file mode 100644 index 000000000000..f00205e51804 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/Bundle.properties @@ -0,0 +1,18 @@ +OpenIDE-Module-Display-Category=PHP +OpenIDE-Module-Long-Description=\ + Support for Blade template syntax for PHP.\n\ + Still experimental.\n\ +

@author Haidu Bogdan

\n\n

Latest updates

\n\n[2.5.0.0] - fix IDE freeze on '?\ + :' short if expr, fix namespace static method completion
\n[2.4.9.9] - limited go to file + completion for vite assets, decl finder fixes + refactor for php code
\n[2.4.9.8] - fix comment highlight issue in directive php expression, improvements on php namespace completion
\n[2.4.9.7] - fix livewire component formatting, display namespace path on class method completion
\n[2.4.9.6] - detect namespace path on directives php expression\n[2.4.9.5] - fix directive completion before double quote html, add attr directive to completion list
\n[2.4.9.4] - fix issue 57 formatting with optgroup
\n[2.4.9.3] - configurable declaration finder for view paths
\n[2.4.9.1] - fix block tag completion cursor preview
\n[2.4.8.9] - auto tag completion is true by default
\n[2.4.8.8] - fix issue 61, endcan tag breaks syntax highlighting
\n[2.4.8.7] - cleaning code, refactor
\n[2.4.8.7] - cleaning code, refactor
\n[2.4.8] - change License to Apache, blade tag autocomplete
\n[2.4.7] - debug lag with completion
\n[2.4.6] - use custom BladeCompletionItem, add @lang
\n[2.4.5] - use custom BladeCompletionItem
\n[2.4.3.2] - disable unused parser caching
\n[2.3.4.3] - [code] brace matcher is using annotation
\n[2.3.4.2] - fix navigator regression hafter disabling the ParserListener
\n[2.3.4.1] - fix php parser error for empty `@php` blocks
\n[2.3.9.3] - fix comment parser error regression
\n[2.3.7.2 - 2.3.8.3] - refactor directive completion
\n[2.3.6.2] - refactored parser for optimisation +OpenIDE-Module-Name=Php Blade +OpenIDE-Module-Short-Description=Support for Blade template engine for PHP. + +UnclosedIfError="Unclosed @if" + +blade_directive=Blade directive +blade_comment=Blade comment +blade_echo_delimiters=Blade echo tags +blade_php=Php +mod-undefined=Custom Directive effect +mod-declaration=Custom Directive + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/FlatLafDark-FlatLafDark.xml b/php/php.blade/src/org/netbeans/modules/php/blade/resources/FlatLafDark-FlatLafDark.xml new file mode 100644 index 000000000000..8533ed78b169 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/FlatLafDark-FlatLafDark.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/FontAndColors.xml b/php/php.blade/src/org/netbeans/modules/php/blade/resources/FontAndColors.xml new file mode 100644 index 000000000000..18c86c64419a --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/FontAndColors.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/NewBladeFileDescription.html b/php/php.blade/src/org/netbeans/modules/php/blade/resources/NewBladeFileDescription.html new file mode 100644 index 000000000000..8bc99c49c5ae --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/NewBladeFileDescription.html @@ -0,0 +1,12 @@ + + + + + Blade wizard + + + + +
Create new file
+ + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/emptyBladeFile.blade.php b/php/php.blade/src/org/netbeans/modules/php/blade/resources/emptyBladeFile.blade.php new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/formattingExample.blade.php b/php/php.blade/src/org/netbeans/modules/php/blade/resources/formattingExample.blade.php new file mode 100644 index 000000000000..6bf35049eac4 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/formattingExample.blade.php @@ -0,0 +1,16 @@ +@extends('my.layout') + +
+ {{-- BLADE COMMENT --}} + @if ($test) + {{-- REGULAR ECHO --}} + {{ $x }} + + {{-- RAW ECHO --}} + {!! $x !!} + @endif + + @verbatim +
{{escaped}}
+ @endverbatim +
\ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/highlightBlade.blade.php b/php/php.blade/src/org/netbeans/modules/php/blade/resources/highlightBlade.blade.php new file mode 100644 index 000000000000..baf125d61fc9 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/highlightBlade.blade.php @@ -0,0 +1,16 @@ +@extends('my.layout') + +
+ {{-- BLADE COMMENT --}} + @if ($test) + {{-- REGULAR ECHO --}} + {{ $x }} + + {{-- RAW ECHO --}} + {!! $x !!} + @endif + + @verbatim +
{{escaped}}
+ @endverbatim +
diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/icon.png b/php/php.blade/src/org/netbeans/modules/php/blade/resources/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..87ced4a74a8a75f28331705a6c368f8654294233 GIT binary patch literal 973 zcmV;;12X)HP)EX>4Tx04R}tkv&MmKpe$iQ?()$2a8B?$WWauh>AK&6^me@v=v%)FuC+YXws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;qmz@Oi`@g@7;y(1mG}v_(bAarW+RVI`Pz| zrE}gV4zZG?5T6r|8gxP8N3P2*zi}=)Ebz>bkx9)Fhls^u8_R9XN`^{2NgPpBjq-)8 z%L?Z$&T6^Jn)l={4Cb}vG}mbkA&x~Pkc0>sRcxRP3sG7%QcR?1Kjz^NJN_iOWO8kQ zkz*besE`~#_#gc4)+|hnyGg+q(D`E9AHzUk7iiRM`}^3o8z+GO8Mx9~{z@H~`6Rv8 z(jrGd-!^b@-O}Ve;Bp5Te9|RDawI=Zp-=$c&*+sb!v+DNN+{ftykfE-YZh(VB zV5CUdYaZ|JZtv~iGtK^f0HlF(yVwbOAOHXW24YJ`L;xEA8vq-0Wtfow000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j&7A76>uO0pnBv00GHKL_t(I%Z<~`i;htk$MMg3 z<{6X4Fbgzl;%?G-$z94@-eQH!Mi^PxD6DAy4SP$OW`PaL!b?e!g|{)Gn`B10MHy2g zk~GH5v6%DJ-BW|JIi1sW{m!|**Y64t^Q;T|u^jJlEfnQP|FJ^Mvp)3THeO;a_TX74 z${W?-m}ea+b|e(#SE%CvMiCmKn1{VF&+dexoQ!$aicQ#zZ`dC5>@l9y@d}r)1AXZ{ zh+eeBJPYVY2hN6~{2cRa2~MH6o?aZo6)eJK!VIzT^ENER1a`+fdy4h=f}UEX#2Nfj z$*hz#jsd*G=>&QJpKAYr921WPvqE7QuQ8m2+vYn#}kJdc3~wRVki{lRJB!&L1|BcEASi}F@$w^ vi+c@l&Arw%aa}l+x^WX%Ls5R1%PfBY;t7whDaFmg00000NkvXXu0mjfnmD{Q literal 0 HcmV?d00001 diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/at.png b/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/at.png new file mode 100644 index 0000000000000000000000000000000000000000..4f74305ff1968736bdc3b2944c2818646cad7352 GIT binary patch literal 3228 zcmV;N3}f?&P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1e=(i|xc{m&`p2ndPoIIIzUgFgN|Kv31TXWAXn zmHsNTNDz|V(}KD1vSe5AknHC(^nS+3%Kp9|(r+@qeBp3s z-1!Vf(YLJQcYb(x2>Qhf@;@x#w~hPWI2Iju*8N2zDSt8Qn4^Dl_B7`>))fhGLpVmA zEzA{zi4~%FFAKOL{yd)JzA~<4i)|#f+h!}SMwuM3og~x^6`C}t|znkzo*PPA5 zM?|om)K}2UxrGBQH}d+%Gyp+^Qxnpq^2$1)#LrEvh0oWw)2zz5qq&?Sp zcg7Jaz{hjo2y8MJfF2t_2r<`*s*t3W!zF>91j8dwrT&4ONYOJZ|S{mrnr1=(FY^mi| zy6fDf`yP7ispnn>4N%Dp8GeKjM;dvQ39e0^GW`rQ&NTBZ4>d*gr|Tb}Mv9u-NUeGC zp@z{Im!K_zR-W+-Ga%-KfOuR8fY5GXW)q3Hh1|l-W{0To4odokO($Cn1wbf+oS*ct z`ylt*xEc8R?{IU!gPd8={R_xBGx!JGet}wFnXqldP82SmT1NCuJBmvMn;WinJtfS& z_gwaaKuhW33H5<#3|sfJWd;TJ>fB~%y2|_{X2c_>H)OuhX{~PXNj-~;Oxw!bGMSy- zqe#W(KKyV;QrzO2onCs`qs5NO@Z}ar+%4Diq#F`==BSV+w|-ugGy+Jme-tL&I73Ch zR3XIn0Drb#;6t&|{q!D~*r`dG*Lox`rda0THNJRB^L@wQy9j!$aZoY9wx+ zL5{6p8{*Q{B?ZyVM@Bk2l1%HZs)`9!sQKgF5wB$xwS&&=#Klf7&q?I6zebpED_l@l z6zY7Yv=%G;D=I&6_eUs{Y1Yj*Zc=+22)A*xSSC((=Lf>9q3rD~a%*zv#157z7#0pO zhi`w<$rp&ULjD5Xjww=i$zxm36W<)%q9!WrZGKxR0b*J@|RK)K%b+@|gtxdV#f zuJ$9fVcLhsX_WF9CH0u#VGS2$eVa$D^fc60Esf>>V)pKylO6r+&;`7luD@{d*dssF zZd8=i5=gJEOJqjVxD>!gtshd_7-`&ywRw7^Q~x!ucf~yq$z{Dk>*pzDYy}>#@SdoS^B)&VAGo??L@&aRY@Be0duJh@^z-7mV)R`Qv&nIN$HDz zbW8;{keTknjCMDl)anxrG>-~#&OOCi&l^0pp5=HGJ}nCU*Y$f)BJM>AeP)3m7t4I0zowf3nl()*3l@N&yhr>Yq)VG@mW0tKl*qs=%~3H2`z6WxjO zRr;xEUd&j5fBC#=5yypbWQX9ikVvY)_N4#=-_T3&T>RyUfSiwxapi-Ti>gaUDh>Cl&%{|T&Q{q?tRPPnURoN@eDriAe?yi*nQ2WS1Iz1bOH%#f1|UUWCFeJ}`sESC#AKq3GIbUry@DLs8o{By?9=-XK}4 zk+fz@RpS!cy5m}yX|EM!mAAABxpFHAaN75U=~9+*rWa&Q9f8jOX0@6x$~ z93HLC;!IwL5rwvW@&|G(}yYMgQrqSw;90>jFw zBCFBWYGK1|8NxMMyE`0L&j8M+U%iBu1ydIz)v)z{4L@|A6McU+{{;!}Z;`v9#%=%r z0fT8nLr_UWLm+T+Z)Rz1WdHzpoPCi!NW(xJ#a~mUA{B>b5b2PiI$01Eag-_+!9r;( zwCZ4T=@&FHBq=VAf@{ISkHxBki?gl{u7V)=0pjT7r060g{x2!Ci1FaKAMfrx?%n}H zv&J;5XB^OU+sq^rQogVvg_QH{!9W))K- zo+6H^nojvb-eZ;X7H6$iXYG6P7lw=aa+d2fqex;ADWoAmK^;}pU?WbePKt#L?I(Qv z!>&I~E`?lGFmlXe0~%!45B>+gyR}M_6JAm{0rb8&&c_H4+67t-$N4^XoYn~td3_TgLDZ5gTrcf#Y?`QN)1t4+@^sjoowfAxQ z0OY8vr5oVj5Ev~}_L|ST`?`Dk_e{ILA43jul-4n9=Kufz24YJ`L;xEA8vq-0Wtfow z000SaNLh0L04^f{04^f|c%?sf000ArNklD(3` zRiID`6pDqG|I3Rb@pt|5eYc+wHko-gyCl)!az{jju2zS$2?+g%V!v*rh84s3b|AGn zwXUkWj_@qdSZJ3Ixr)xe5(sn`wlwG2tE#XD16VvBwC!!S7newljA*~zzI`bZ3VnRB zr$^ZhyjWqlU2f<`w27|q?oh8)LLRnjD)8j9{ zy5NxIZs`NBKT;Jexe|Eyoa8PoW%0%!sqZdhJ=uW!^-c;}&rtC4OV}#PNk<={=?31K zYQ*J4ZQl6rSLHQT>B_IG$@A6LlKx|o^x!Wz-sr^Bd>XUILoS^rzn}mNP%{~phKKQ- zXuwrfCFBgfORTmPHWk%WBj@Fjo|wRNxB}0qSF!qhOb=Wqdg*I6<8gFNWoK)P_4^~J zxg2(Xv2@UEZ4))a2stAWG(}-0`Uq2fJyyS;jlbuZzV-w2W8(;BGdtNVn~7y82^gX* zqo@j5T@Q;nUB~A28mgj@otnl}(GGv6Ib`h{v(i9T#M?nN)lc z6+;)dbv>3@Ul)*Nq!*q?&F!FT8g{=AcY7O^Z@r1GX$Yc(HN2nVx;hNQ;K{9x=;UQ+i*(9@d$i1~TQMJ{wzLs(e_AgL-BhBi{4 z$lJQk_```$pZobnWxmC7Dtzo1`${7u=jKT*#xdJ$>Y8Tl9oV2p>5@k>3x7!TjSV#2!3Q5;L=3%;d7~ zjb;8(|Mx}!izw3R-W%D_)Gi63Nfd+-fNmHu9flo}^iAJtayp}FyUxF|d4+6054I}+ O0000EX>4Tx04R}tkv&MmKpe$iQ>7vmhh`AzkfAzR5EXHhDi*;)X)CnqU~=gfG%+M8 zE{=k0!NHHks)LKOt`4q(Aou~|=;Wm6A|?JWDYS_3;J6>}?mh0_0YbCJG^=ME&~)3( zBok7;up)(C5rlvUq7Y?f8L8|-4!+~-9s$1I#d((hxj)B%TC^AtkcelQVcNv&#M7I$ z!FiupWEEK@J|`YC>4LolWCVi75%AwfYMRn%Z3PODCeg$(T{eEh?%KTR%$Tvae~ z%wq!@WY-V=2fw?uN|O^_QaAzhzBtau2oTx@S`EkfK6aee2@re+uJn$7qY2D>lHTZO zu_It`8@RacXv!XNxdRM68L}z6Qjn%lDgp0j^i2gIatrjYdcC#xaryw{sH>$L;NTD# zEmQWI&%67&d;9lHyT2bp4sw(#%Q2Mz000JJOGiWi8vq*s8+2uukpKVy32;bRa{vG? zBLDy{BLR4&KXw2B0?kQ8K~y-)m6OeDRA&^2pZn$=@14o5om&&*#Kfjfi-Zzww0?A< zrc+!Qgr-9OfcAzA$W5Akz35fL##AVIMtVvJOl zmSyJRC7Jy3XQ}4%A|gW~f+ZqxcW=dfEg z5$f1VVf+a|2pCjAqA)#8Xj>;6yeLa|N6CG6me;=gl=wF%@ZLX!<=TX|bz*6a3OiKh z()GnB6wpuHv|GbUW=@C7!4@+x`seh1s1-q?{pim&lWZBRjs{^_efK&qz z5MwYaD_FV-?KV?dSfFs{E<7!xU6)EGi$9fOWA8ib9%vvHc`M%fZ0tU!;?umRm%`~Q zOnvqRR&xZqdk0pB%i^_RO7|ZS-uX7}8+E@(X<(!|9^ae2`Wwac9Ic5yVT2;Gp4T%hy3(BZN~?2yIx0(!BPrf)sJ#DuReSo82Df1)u-3=^yS6nuVr+7&U(r3d=8jw a4F3nS_kBWhz+Zm=0000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bxvgIZW{AU$e0z%@o91u{I9c1}wjPSX+GnJWC z<#^^AY#yRpYRPW?_2+Vb;1}2@Coz{)Q}Xypl^Plv#eaU&?&leKdH&uX*=i2Wj=;i%D~NdtE!g^dzs$he1~ zfuCoEbErYtGqLQ8R>)j=aN)ojCNqoU@Y+JpzV+EpsbJ?p7#awR5vKg><$g8bcdoV6 z10&iHlVJtBLfAaehLQJQ3VvZ%&*j(ZyDW;Ti+A-HMXUQ?AoO8)F zx57nAEUDyDN-eF1$_U9=Q_Z#1T3f@OOy4uT{vHHXHA6O$}Ej&!^ zartEpPjlW2JxkEmnYcLvV?hXv=gj~dI&97m&mv(nw>k4QASz;jk#Tb~$Tvp`6w0I! z7roqlnEP$s9I*ZsZ{c^CbDO&Vfw|x&f8*^Ztc|UN`Y?8)aAWEj(YL~Ap|sG|73{y8 z1%vOsXNe>+NvyN*)6NRjYJNV`s;8m*Da9#ul-)uW0fW!j&plH-vs=pm|4fmbu}rwR5WAL|I-5x|o}Z*iHEOSU)fVP>o9bGcjVj|Rte_O3p=1UwCq`q+P0+5R!S zbw-_uT0P?uX^H7<8{pv2PR@=T&r#HmQrpuUs-^ccRjSU|&(sW&EaL-~)@L&pXRKo) zyBI(zd&q(<0MAKhSuD!KpZ2N~sR-S(`4XRUbT(ypysb8C_`-gkQ9+l82ID=Ux2GC1 zNyXaDl_Y$o_eZw3$q1&jPIF1fo6r0@RxK%iP6q6b$2z>o0Nh3*E(6fFX^NNu;_;a$ zP>@k<`Pg#NG*55rNlxckeqw=E-z6HBpzB%4Hd<0M25VK318JHmgtLuPxlAGjJ+Ae5 zmd?)cf+--s+>-C+6HiYWqJQlGW)I6;R(+ljz?s|2Cuq8IU;NX&zZ8v}((Y29j1OR;oE@a}i zkv!3#>*n!>^Fm#P*ooIe{SKXb2Gm{s1+|t@jz9q|*H9|OVAKuRh-iN`Yc{%=&^9uf z{T*WNqn`CZ5nS1sQlkD6uH`x~4uXHC2XpGG*zoB!-&mWGt9a9d_H(zTb%_P!TnZr` z@kN-69b-mWS%)d~s8CA~eU^*x2=B1u^UiZaf81$)B`s%QBbwFDG!jju$B+2hY()(@ z(sjd0NKHW17DKzPP!D>D!Wqp?;C6_%6D
    Gg;|d{*F*bQD?ii(w!g3AU4UdqE{U z%!uJx7u4sbqrRo3`p=P~4(konzp`b+Qim+^I$mYOI)*u6mV?-xSFNa@vwiTBneE8w z!S8ZNfL+Rb@#`mO0pQ#K-Yf-uLL6BLDa}v5{0A#Dpy>AtJes8z%kH zdlM2!^SpWnh0SEop?R1>k3}X-H+fAITGgUu@-|$rScaWt%DAZnCcWVf)@G_BeUy$= z#v35@x(OnFc2lRVKi(uFwIp(~oZI(c&JViGt^}-xEsqZv6LTq+!UNT-tdDT({yKWB zW_-ly1uG>X6GY^xn;XDaEi>@ADw7+5TgYr`mx#(6`e`KgB5An`?Q=SX}aKb^5jx3s%Xs%F>XlI|$ zwl`SYE?0)}0Aa!x;W(W_y((PBJq+!vo#Lkk!)M@GAW*uchuJakMQ^wukCTb^{_rz= zCd)Z)@z-`h!*8`SP?4@+4%VQ>mfE&YMjFe#MGW$e33Dbrf^H5PvsI3&mQ?T!%SNW^ zE*nmvm0qfbXekF|R2Y7IG7QAL-vC6Oh;&7i`5e!+Ilyzh2Z&tsdy%`66(e0BniokL z^G!8~97n@I9tqGkbIAgi43-72WZ+}P^k3TctCNxxNEWq}tqQxR)t_4g@xW{-y9P7Q z-g(ATxlv)(->|EB@lAqtGynhrgK0xUP)S2WAaHVTW@&6?004NLeUUv#!$2Ix zUsI(b6^CXJ>5!p1Sr8R*lqwd%LTM|s>R@u|7c?;>DK3tJYr(;f#j1mgv#t)Vf*|+- z;^^e0=prTlFDbN$@!+^0@9sVB-T^|h#x$#E9ME*z%p?<1zOW*NUJ-WW*MpM zLJq#;>mC8V-o<&A|G7WMfLgQ|5RiyxnPJ+*>%`NWw!wLySY#DhB|aw}GwFiFk6c$g ze&bwrS>TzXnaj)(i^Nj7i)(H@N2Cnpuf1?S^e3IViXt5(;a2vR|?r6#$aJd5vJsGko zyHb#*P$~iMXY@@4AaV=zuX??;_i_3FzgPU?uj;sFFgkXHTiLCvsf)J5ioL6gwYkdTda%K8GCapjyl!3d^9T zG3`5%JWWXMAl62l%=G8uR}=El(<8&WQojQ_!VLQx4-HD4$B~_0Sh#>ljDqnC$X&?7 zfm#;G(U+;&^ArvDKi%)Ub?P0Tixcvx7m4k^uj3PC&ug+H&0!W!HX$QUhyK;Oc?qqgeGJ%D;UzXi*vP|VCw@%4cxjG0Z4oBfd01Y!=x&T z8u9Y>rc@OQru_k`dIhQ`HQo?4p%>VBU8lI1ky}Y&Zl_Va5$wS>Y@vM^S_yS!iCTXXuJB&$bspAl{z&e|2n(sqS^3xz{liI2$tHHl$4+0L!8Id_Hh)EUa^lEX>4Tx04R}tkv&MmKpe$iQ?()$2a8B?$WWauh>AK&6^me@v=v%)FuC+YXws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;qmz@Oi`@g@7;y(1mG}v_(bAarW+RVI`Pz| zrE}gV4zZG?5T6r|8gxP8N3P2*zi}=)Ebz>bkx9)Fhls^u8_R9XN`^{2NgPpBjq-)8 z%L?Z$&T6^Jn)l={4Cb}vG}mbkA&x~Pkc0>sRcxRP3sG7%QcR?1Kjz^NJN_iOWO8kQ zkz*besE`~#_#gc4)+|hnyGg+q(D`E9AHzUk7iiRM`}^3o8z+GO8Mx9~{z@H~`6Rv8 z(jrGd-!^b@-O}Ve;Bp5Te9|RDawI=Zp-=$c&*+sb!v+DNN+{ftykfE-YZh(VB zV5CUdYaZ|JZtv~iGtK^f0HlF(yVwbOAOHXW24YJ`L;xEA8vq-0Wtfow000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j&7A76>uO0pnBv00GHKL_t(I%Z<~`i;htk$MMg3 z<{6X4Fbgzl;%?G-$z94@-eQH!Mi^PxD6DAy4SP$OW`PaL!b?e!g|{)Gn`B10MHy2g zk~GH5v6%DJ-BW|JIi1sW{m!|**Y64t^Q;T|u^jJlEfnQP|FJ^Mvp)3THeO;a_TX74 z${W?-m}ea+b|e(#SE%CvMiCmKn1{VF&+dexoQ!$aicQ#zZ`dC5>@l9y@d}r)1AXZ{ zh+eeBJPYVY2hN6~{2cRa2~MH6o?aZo6)eJK!VIzT^ENER1a`+fdy4h=f}UEX#2Nfj z$*hz#jsd*G=>&QJpKAYr921WPvqE7QuQ8m2+vYn#}kJdc3~wRVki{lRJB!&L1|BcEASi}F@$w^ vi+c@l&Arw%aa}l+x^WX%Ls5R1%PfBY;t7whDaFmg00000NkvXXu0mjfnmD{Q literal 0 HcmV?d00001 diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/icon.png b/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..87ced4a74a8a75f28331705a6c368f8654294233 GIT binary patch literal 973 zcmV;;12X)HP)EX>4Tx04R}tkv&MmKpe$iQ?()$2a8B?$WWauh>AK&6^me@v=v%)FuC+YXws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;qmz@Oi`@g@7;y(1mG}v_(bAarW+RVI`Pz| zrE}gV4zZG?5T6r|8gxP8N3P2*zi}=)Ebz>bkx9)Fhls^u8_R9XN`^{2NgPpBjq-)8 z%L?Z$&T6^Jn)l={4Cb}vG}mbkA&x~Pkc0>sRcxRP3sG7%QcR?1Kjz^NJN_iOWO8kQ zkz*besE`~#_#gc4)+|hnyGg+q(D`E9AHzUk7iiRM`}^3o8z+GO8Mx9~{z@H~`6Rv8 z(jrGd-!^b@-O}Ve;Bp5Te9|RDawI=Zp-=$c&*+sb!v+DNN+{ftykfE-YZh(VB zV5CUdYaZ|JZtv~iGtK^f0HlF(yVwbOAOHXW24YJ`L;xEA8vq-0Wtfow000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j&7A76>uO0pnBv00GHKL_t(I%Z<~`i;htk$MMg3 z<{6X4Fbgzl;%?G-$z94@-eQH!Mi^PxD6DAy4SP$OW`PaL!b?e!g|{)Gn`B10MHy2g zk~GH5v6%DJ-BW|JIi1sW{m!|**Y64t^Q;T|u^jJlEfnQP|FJ^Mvp)3THeO;a_TX74 z${W?-m}ea+b|e(#SE%CvMiCmKn1{VF&+dexoQ!$aicQ#zZ`dC5>@l9y@d}r)1AXZ{ zh+eeBJPYVY2hN6~{2cRa2~MH6o?aZo6)eJK!VIzT^ENER1a`+fdy4h=f}UEX#2Nfj z$*hz#jsd*G=>&QJpKAYr921WPvqE7QuQ8m2+vYn#}kJdc3~wRVki{lRJB!&L1|BcEASi}F@$w^ vi+c@l&Arw%aa}l+x^WX%Ls5R1%PfBY;t7whDaFmg00000NkvXXu0mjfnmD{Q literal 0 HcmV?d00001 diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/laravel_badge.png b/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/laravel_badge.png new file mode 100644 index 0000000000000000000000000000000000000000..fc7b7ccb1428036113de07951cbb9b8b27e86430 GIT binary patch literal 723 zcmV;^0xbQBP)EX>4Tx04UFukxM8&YTEi`ZIrZQ)+w*0}9RzBZHR zxZ-uic52o7xu<$z-I6msrF5Asj55XqljxYNvOSI+l84}JgZ2+AMf!YTOE2Qct1daj_g z?nA={oLv?)a~sY#q4^u93o(cLR@(rYca=WRGAdvt7010qNS#tmY4#WTe4#WYKD-Ig~000JJOGiWi z8vq*s8+2uukpKVy2XskIMF-{r8WspK$N}S20002eNkl-NgPj*&Vcs}GI?)k>oxek zAq2&?&)D4$OveyUz)j4M9rJL}(1XEX>4Tx04UFukxwWDQ5?rVJ4+;Tum@=mbHIrblB1SviqcwTaWFG$m)aTI%x*4@ z%2he|bMf!s;>^{-RVn39$HFUI+k4*!+Ck2;y_z1dor0T) z$Ml)htX}s_7>yR9L=4NzPfU#_sX9Jx390p_TV?UT(Ue~FEC}hsLss4`2rmc^tQPW$ zcZ4I>l93iZ74CB7g2MMoH%t7YI2*90G9zv>F)SPr*0U9CRUs`%Ri|D?D~aV=ws zV}uoKjKGijgWuhHnZDjqQezBipM3wV1M0TmYt#2X4}JgZ2*QtW;gtO=2Qc_9`es>c z--qUPIJ+!s<~E#fKL}00$a+R9JLU zVRs;Ka&Km7Y-J#Hd2nSQWq4_3004N}typQ&94QX{&ne~z2#M`DtPy>KKK?vFP}R0) z+8xoA{wlLb5R%^0g3b8zk7@pck8|D{@iB!Qg2hL&WLNNz?B_G|e#Xek{=Og5Z!*7p z;c#c%`3y$Ux2)rLet35X`o#79Dri{Y4`we=+KqqknVuH0Ll#lBE;ndt*(c zJ=b}6#t|yO$8+EaY%&*sCE~%KC?28E;B=`_Q3@heJ>)fUL9(wGl=UxU4P{|A#euNQ68hMlnu1%gY{R}hCH1jMEHAVHO>mQ&-ikjO< zt$FdGhS3<8pe=${p79GaAm)UCcw7j8&~9O76N$Km+``Oehp6xlO8SLOCtC~!Kq!Np zpY*W%Aott28Tk6|aC5(doLSKQ3&=S$_y^p6fm&agux-Rn6fU1yM)XZPic1BX8?JUe zCCt6|T=s)NOX=bX^?_*&TlceN1_k%(+-7LH%KRi|#3QFSWWLa8t#0s1J&TJ>+sfQB znVsFENX6zp{BTE7+~S&@UV7Q1#g5AGMwo9a zTu@gO>U^fO7AyQKDnD`eM<|qO*3CC=QhOT+w{f&sCQf$e2g0nO?CmXbYjWts4wfkx z77j7v$#-1)5gNFm96m89rAi{VFmL6#RJa7?rb#ox8RPmuW;mPIYG=kkx!(5NrtTWK z1B&6U_9L}n+K0z!l=2uQ^_bvc4Hsp7n@6nlG}KoujphGh_U@jO9sTUk1-zWDzi{%{ zBR|t_RFu>bNUyF-WJc4t6u?KVA5z*FY21jld3vN%|2407#XS$nWxYY`=P70730 zND3Elgb}^C&V&6WIb6p15zlj0S27#O7yY#eBb`6KywPAcSv4Y&7C_dKR321K-BomK z%Mm0ngO4-wh)AvKpfrod*;qMQ`n=m<)0-#lM8PmsNgEjfbEysTb*7@0g6K|D0`tg8 z>5G1JOa(TOneM`jb~m5Y>Jtq#j|y?lJ;hqj8$7n2<#-c4%?N6~Np{wkd9h#nnBFuS ztnsMhaQ0~J;a-77K>0#lQ(}Y8pTH!T={~l|sN)kyGhRT`w5bIR8q?vm_Ngw?`;F4@ za?g&vOU0cI@{M2OQCffx%t}iVyNl|zJe>q}h@gz8su?a}5{+~M1*t!y%{WyF^)C+- z-HGy5`l)GN%vgbc`MhZn$AxiZhv2l3NUFg0r2qrp&`a=K{N;&&oR5xi<%5@ts!K;I z4hzuJZUP#FGp%qQN0)%p!tko3izV#MJ`iaYFrK2k7P$L zfyql?J92CM@H5++`hns2ii3PZgjc>RT}yi*jbU{+4&T}`p)a9)tFlr6Ox})1K0=RM zUdhb!WtHG=c}2JRSc?v(XpWH8$d!}EyaAHY=Zkdq+PHzi{qon{6fCYQ259BfsV$}L zJA*YZ4Xwyn2~zvUjIdB;E6!=@QkHV27i3KxfzJPCwVE&F^2#WxfQ%V#yS zDbc+g9<9#eOkRf(g|>b227*G%@GfV=g%6(;n&l%L3XakRX5Fm+zwS6{oN^JO*V4NJ z!^){5tI^eJVZ&`1!ZljEI~-Tf0M4ghy@ZwpQx_xEu=RfpKXjfGeSbFp1qttOk-MSB zZU6uP24YJ`L;xEA8vq-0Wtfow002cvL_t(IPh)&5qw=4D5&$xQTmaI`1T}|j0QQ2= z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/mime-resolver.xml b/php/php.blade/src/org/netbeans/modules/php/blade/resources/mime-resolver.xml new file mode 100644 index 000000000000..d0e7152241f8 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/mime-resolver.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/preferences.xml b/php/php.blade/src/org/netbeans/modules/php/blade/resources/preferences.xml new file mode 100644 index 000000000000..5eb201132c4d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/preferences.xml @@ -0,0 +1,29 @@ + + + + + + true + true + true + 4 + \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java new file mode 100644 index 000000000000..7886b57b7f4b --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax; + +import org.netbeans.modules.php.blade.syntax.annotation.Directive; + +/** + * + * + * @author bhaidu + */ +public class BladeDirectivesUtils { + + public static String[] directiveStart2EndPair(String directive){ + if (directive.equals("@section")){ + return new String[]{"@endsection", "@show", "@stop", "@append"}; + } + DirectivesList listClass = new DirectivesList(); + for (Directive directiveEl : listClass.getDirectives()){ + if (!directiveEl.name().equals(directive)){ + continue; + } + if (directiveEl.endtag().isEmpty()){ + return null; + } + return new String[]{directiveEl.endtag()}; + } + return null; + } + + public static String[] directiveEnd2StartPair(String directive){ + //still easier with switch + switch (directive) { + case "@endif": + return new String[]{"@if", "@hasSection", "@sectionMissing"}; + case "@endsection": + case "@stop": + case "@append": + case "@show": + return new String[]{"@section"}; + } + DirectivesList listClass = new DirectivesList(); + for (Directive directiveEl : listClass.getDirectives()){ + if (directiveEl.endtag().isEmpty()){ + continue; + } + if (directiveEl.endtag().equals(directive)){ + return new String[]{directiveEl.name()}; + } + } + + return null; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTags.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTags.java new file mode 100644 index 000000000000..3b24488e4023 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTags.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax; + +import org.netbeans.modules.php.blade.syntax.annotation.Tag; +import org.netbeans.modules.php.blade.syntax.annotation.TagRegister; + +/** + * + * @author bhaidu + */ +@TagRegister({ + @Tag(openTag = "{{", closeTag = "}}", description = "regular echo", position=0), + @Tag(openTag = "{!!", closeTag = "!!}", description = "raw echo", position=1), + @Tag(openTag = "{{--", closeTag = "--}}", description = "comment", position=2) +}) +public class BladeTags { + + public Tag[] getTags() { + TagRegister tagRegister = this.getClass().getAnnotation(TagRegister.class); + return tagRegister.value(); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTagsUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTagsUtils.java new file mode 100644 index 000000000000..197f2f8cce1a --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTagsUtils.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax; + +/** + * + * @author bhaidu + */ +public class BladeTagsUtils { + + public static String[] outputCloseTags() { + return new String[]{"}}", "!!}"}; //NOI18N + } + + public static String[] outputStartTags() { + return new String[]{"{{", "{!!"}; //NOI18N + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/DirectivesList.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/DirectivesList.java new file mode 100644 index 000000000000..9cf06abac872 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/DirectivesList.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax; + +import org.netbeans.modules.php.blade.syntax.annotation.Directive; +import org.netbeans.modules.php.blade.syntax.annotation.DirectiveRegister; + +/** + * + * the since values are taken from + * https://github.com/onecentlin/laravel-blade-snippets-vscode + * + * + * @author bhaidu + */ +@DirectiveRegister({ + //conditionals + @Directive(name = "@if", params = true, endtag = "@endif"), + @Directive(name = "@elseif", params = true), + @Directive(name = "@else"), + @Directive(name = "@endif"), + @Directive(name = "@empty", since = "5.4"), + @Directive(name = "@empty", params = true, endtag = "@endempty", since = "5.4"), + @Directive(name = "@isset", params = true, endtag = "@endisset"), + @Directive(name = "@unless", params = true, endtag = "@endunless"), + //loops + @Directive(name = "@for", params = true, endtag = "@endfor"), + @Directive(name = "@foreach", params = true, endtag = "@endforeach"), + @Directive(name = "@forelse", params = true, endtag = "@endforelse"), + @Directive(name = "@break"), + @Directive(name = "@continue"), + @Directive(name = "@endfor"), + @Directive(name = "@endforeach"), + @Directive(name = "@endforelse"), + //layout + @Directive(name = "@extends", params = true), + @Directive(name = "@section", params = true, endtag = "@endsection", endTags = {"@endsection", "@show", "@stop", "@append"}), + @Directive(name = "@endsection"), + @Directive(name = "@stop"), + @Directive(name = "@append"), + @Directive(name = "@once"), + @Directive(name = "@endonce"), + @Directive(name = "@overwrite"), + @Directive(name = "@yield", params = true), + @Directive(name = "@hasSection", params = true, endtag = "@endif"), + @Directive(name = "@sectionMissing", params = true, endtag = "@endif"), + @Directive(name = "@include", params = true), + @Directive(name = "@includeFirst", params = true), + @Directive(name = "@includeIf", params = true), + @Directive(name = "@includeWhen", params = true), + @Directive(name = "@includeUnless", params = true), + @Directive(name = "@each", params = true), + //statement + @Directive(name = "@switch", params = true, endtag = "@endswitch"), + @Directive(name = "@case", params = true), + @Directive(name = "@default"), + //stack + @Directive(name = "@stack", params = true), + @Directive(name = "@push", params = true, endtag = "@endpush"), + @Directive(name = "@endpush"), + @Directive(name = "@prepend", params = true, endtag = "@endprepend"), + @Directive(name = "@endprepend"), + @Directive(name = "@pushIf", params = true, endtag = "@endPushIf"), + @Directive(name = "@endPushIf"), + // + @Directive(name = "@fragment", params = true, endtag = "@endfragment"), + @Directive(name = "@endfragment"), + //form + @Directive(name = "@csrf"), + @Directive(name = "@method", params = true), + @Directive(name = "@error", params = true, endtag = "@enderror"), + //env + @Directive(name = "@env", params = true, endtag = "@endenv"), + //auth + @Directive(name = "@auth", params = true, endtag = "@endauth"), + @Directive(name = "@guest", params = true, endtag = "@endguest"), + @Directive(name = "@can", params = true, endtag = "@endcan", since = "5.1"), + @Directive(name = "@canany", params = true, endtag = "@endcanany", since = "5.8"), + @Directive(name = "@cannot", params = true, endtag = "@endcannot", since = "5.3"), + //php + @Directive(name = "@php", endtag = "@endphp"), + @Directive(name = "@use", params = true), + @Directive(name = "@inject", params = true), + //utils + @Directive(name = "@lang", params = true), + @Directive(name = "@session", params = true, endtag = "@endsession", since = "10"), + @Directive(name = "@dump", params = true), + @Directive(name = "@dd", params = true), + @Directive(name = "@json", params = true), + @Directive(name = "@vite", params = true, since = "11"), + //styles + @Directive(name = "@class", params = true, since = "8"), + @Directive(name = "@style", params = true, since = "9"), + @Directive(name = "@checked", params = true, since = "9"), + @Directive(name = "@disabled", params = true, since = "9"), + @Directive(name = "@readony", params = true, since = "9"), + @Directive(name = "@required", params = true, since = "9"), + } +) +public class DirectivesList { + + public Directive[] getDirectives() { + DirectiveRegister directiveRegister = this.getClass().getAnnotation(DirectiveRegister.class); + return directiveRegister.value(); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java new file mode 100644 index 000000000000..6a7206ff08df --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax; + +/** + * + * @author bhaidu + */ +public class StringUtils { + + public static boolean isUpperCase(String s) { + for (char c : s.toCharArray()) { + if (!Character.isLetter(c)) { + continue; + } + if (!Character.isUpperCase(c)) { + return false; + } + } + + return true; + } + + public static String capitalize(String str) { + if (str == null || str.length() <= 1) { + return str; + } + return str.substring(0, 1).toUpperCase() + str.substring(1); + } + + public static String toKebabCase(String str) { + return str.replaceAll("([A-Z])", "-$1").toLowerCase().substring(1); + } + + public static String kebabToCamel(String str) { + str = str.toLowerCase(); + String[] words = str.split("-"); + String camelCase = words[0]; + for (int i = 1; i < words.length; i++) { + camelCase += words[i].substring(0, 1).toUpperCase() + words[i].substring(1); + } + return capitalize(camelCase); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Directive.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Directive.java new file mode 100644 index 000000000000..7fe99d909f14 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Directive.java @@ -0,0 +1,15 @@ +package org.netbeans.modules.php.blade.syntax.annotation; + +/** + * + * @author bhaidu + */ +public @interface Directive { + String name(); + boolean params() default false; + String endtag() default ""; + String[] endTags() default {}; + String description() default ""; + String category() default ""; + String since() default ""; +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/DirectiveRegister.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/DirectiveRegister.java new file mode 100644 index 000000000000..d1e6d45744aa --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/DirectiveRegister.java @@ -0,0 +1,16 @@ +package org.netbeans.modules.php.blade.syntax.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * + * @author bhaidu + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(value = {ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PACKAGE}) +public @interface DirectiveRegister { + public Directive[] value(); +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Tag.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Tag.java new file mode 100644 index 000000000000..4756e2c31e5c --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Tag.java @@ -0,0 +1,12 @@ +package org.netbeans.modules.php.blade.syntax.annotation; + +/** + * + * @author bhaidu + */ +public @interface Tag { + String openTag(); + String closeTag() default ""; + String description() default ""; + int position() default 0; +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/TagRegister.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/TagRegister.java new file mode 100644 index 000000000000..7b3d28fbd777 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/TagRegister.java @@ -0,0 +1,16 @@ +package org.netbeans.modules.php.blade.syntax.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * + * @author bhaidu + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(value = {ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PACKAGE}) +public @interface TagRegister { + public Tag[] value(); +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.g4 new file mode 100644 index 000000000000..b2950e97c9e6 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.g4 @@ -0,0 +1,177 @@ +lexer grammar BladeAntlrFormatterLexer; + +@header{ + package org.netbeans.modules.php.blade.syntax.antlr4.formatter; +} + +options { + superClass = LexerAdaptor; + caseInsensitive = true; +} + +//we will hide html in the end +tokens {HTML, PHP_CODE, PARAM_COMMA} + + channels { COMMENT } + + fragment DirectiveLabel + : [a-z\u0080-\ufffe][a-z0-9_\u0080-\ufffe]*; + +fragment Identifier + : [a-z\u0080-\ufffe][a-z0-9_\u0080-\ufffe]*; + +fragment CompomentIdentifier + : [a-z\u0080-\ufffe][a-z0-9_.:\u0080-\ufffe]*; + +fragment DirectiveArgLookup + : (' ')* {this._input.LA(1) == '('}?; + +fragment DOUBLE_QUOTED_STRING_FRAGMENT + : '"' ([\\"] | . )*? '"'; + +fragment SINGLE_QUOTED_STRING_FRAGMENT + : '\'' (~('\'' | '\\') | '\\' . )* '\''; + +fragment BlockDirectiveName + : 'auth' | 'guest' + | 'if' | 'can' ('any' | 'not')? | 'for' ('each' | 'else')? + | 'while' | 'hasSection' | 'sectionMissing' | 'fragment' | 'verbatim' + | 'isset' | 'unless' | 'empty' + | 'session' + | 'env' | 'once' | 'error' + | 'push' ('if' | 'once')? | 'prepend' | 'switch'; + +PHP_INLINE : '' | ''; +// +D_ESCAPES + : ( + '{{{' + | '@@' '@'? + | '@{' '{'? + | '@media' [ ]* + | '@charset' + | '@import' + | '@namespace' + | '@document' + | '@font-face' + | '@page' + | '@supports' + | '@layer' + | '@tailwind' + | '@apply' + | '@-webkit-keyframes' + | '@keyframes' + )->type(HTML); + +D_BLOCK_DIRECTIVE_START : ('@' BlockDirectiveName DirectiveArgLookup)->pushMode(DIRECTIVE_ARG); +D_BLOCK_DIRECTIVE_START_NO_ARG : '@' ('auth' | 'production')->type(D_BLOCK_DIRECTIVE_START); +D_BLOCK_DIRECTIVE_END : '@end' BlockDirectiveName | '@endphp'; + +D_SECTION : ('@section' DirectiveArgLookup)->pushMode(DIRECTIVE_ARG_WITH_PARAM); +D_ENDSECTION : '@endsection' | '@show' | '@append' | '@stop'; +D_BLOCK_ALIGNED_DIRECTIVE : '@else' | '@elseif' | '@empty'; +NON_PARAM_DIRECTIVE : '@continue' | '@break'; + +D_INLINE_DIRECTIVE : '@' DirectiveLabel DirectiveArgLookup | '@csrf'; + +STRING : DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT; + +CONTENT_TAG_OPEN : '{{' ->pushMode(INSIDE_REGULAR_ECHO); +RAW_TAG_OPEN : '{!!' ->pushMode(INSIDE_RAW_ECHO); + +SG_QUOTE : '\''; +DB_QUOTE : '"'; + +HTML_CLOSE_TAG : ('<' (' ')* '/' (' ')* [a-z\u0080-\ufffe][a-z0-9_.\u0080-\ufffe]* (' ')* '>') +| ('') +; +HTML_COMMENT: ''; +HTML_START_BLOCK_TAG : '<' ('div' + | 'section' | 'main' | 'article' + | 'html' | 'title' | 'head' | 'style' | 'script' | 'footer' + | 'pre' | 'code' | 'blockquote' + | 'dt' | 'dl' | 'video' + | 'template' + | 'span' | 'strong' | 'em' | 'small' | 'sub' | 'sup' + | 'figure' | 'canvas' | 'svg' | 'use' | 'path' | 'polygon' | 'picture' + | 'header' | 'h' [1-9] | 'nav' + | 'dialog' + | 'summary' | 'details' | 'slot' + | 'label' | 'select' | 'optgroup' | 'option' | 'fieldset' | 'textarea' | 'button' | 'form' | 'search' + | 'ul' | 'ol' | 'li' + | 'table' | 'tr' | 'td' | 'th' | 'tbody' | 'thead' | 'tfoot' | 'caption' | + | 'time' | + | 'var' | 'q' | 'p' | 'a' | 'b' | 'i') {this._input.LA(1) == '>' || this._input.LA(1) == '@' || this._input.LA(1) == ' ' || this._input.LA(1) == '\n'}?; + + +HTML_SELF_CLOSE_TAG : '<' ('img' | 'input' | 'br' | 'hr' | 'link' | 'meta'); + +COMPONENT_TAG : ''; +GT_SYMBOL : '>'; + +D_PHP : '@php' {this._input.LA(1) == ' ' || this._input.LA(1) == '\n'}?->pushMode(BLADE_INLINE_PHP); + +AT : '@' ->skip; + +WS : ((' ') | [\t])+; +NL : [\r\n]; + + + +OTHER : . ->skip; + +mode DIRECTIVE_ARG; + +D_ARG_LPAREN : '(' {this.consumeDirectiveArgLParen();}; +D_ARG_RPAREN : ')' {this.consumeDirectiveArgRParen();}; + +D_ARG_NL : [\r\n]->type(NL); + +PHP_EXPR : . ->skip; + +EXIT_EOF : EOF->popMode; + +mode DIRECTIVE_ARG_WITH_PARAM; + +D_ARG_PARAM_LPAREN : '(' {this.consumeDirectiveArgLParen();}; +D_ARG_PARAM_RPAREN : ')' {this.consumeDirectiveArgRParen();}; + +BL_SQ_LPAREN : '[' {this.squareParenBalance++;}->skip; +BL_SQ_RPAREN : ']' {this.squareParenBalance--;}->skip; + +BL_CURLY_LPAREN : '{' {this.curlyParenBalance++;}->skip; +BL_CURLY_RPAREN : '}' {this.curlyParenBalance--;}->skip; + +D_ARG_COMMA_EL : ',' {this.consumeBladeParamComma();}; +D_ARG_PARAM_NL : [\r\n]->type(NL); + +BL_PHP_EXPR : . ->skip; + +BL_EXIT_EOF : EOF->popMode; + +mode BLADE_INLINE_PHP; + +D_ENDPHP : '@endphp'->popMode; + +PHP_CODE_GREEDY : ~[@]+->type(PHP_CODE); + +PHP_CODE_COMPLETION : . ->type(PHP_CODE); + +// {{ }} +mode INSIDE_REGULAR_ECHO; + +CONTENT_TAG_CLOSE : ('}}')->popMode; +CONTENT_OTHER : . ->skip; +EXIT_REGULAR_ECHO_EOF : EOF->popMode; + +// {!! !!} +mode INSIDE_RAW_ECHO; + +RAW_TAG_CLOSE : ('!!}')->popMode; +RAW_CONTENT_OTHER : . ->skip; +EXIT_RAW_ECHO_EOF : EOF->popMode; \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.java new file mode 100644 index 000000000000..9a8a2d31d81e --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.java @@ -0,0 +1,1129 @@ +// Generated from java-escape by ANTLR 4.11.1 + + package org.netbeans.modules.php.blade.syntax.antlr4.formatter; + +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +public class BladeAntlrFormatterLexer extends LexerAdaptor { + static { RuntimeMetaData.checkVersion("4.11.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + HTML=1, PHP_CODE=2, PARAM_COMMA=3, PHP_INLINE=4, D_BLOCK_DIRECTIVE_START=5, + D_BLOCK_DIRECTIVE_END=6, D_SECTION=7, D_ENDSECTION=8, D_BLOCK_ALIGNED_DIRECTIVE=9, + NON_PARAM_DIRECTIVE=10, D_INLINE_DIRECTIVE=11, STRING=12, CONTENT_TAG_OPEN=13, + RAW_TAG_OPEN=14, SG_QUOTE=15, DB_QUOTE=16, HTML_CLOSE_TAG=17, HTML_COMMENT=18, + HTML_START_BLOCK_TAG=19, HTML_SELF_CLOSE_TAG=20, COMPONENT_TAG=21, EQ=22, + IDENTIFIER=23, INLINE_GT_SYMBOL=24, GT_SYMBOL=25, D_PHP=26, AT=27, WS=28, + NL=29, OTHER=30, D_ARG_LPAREN=31, D_ARG_RPAREN=32, PHP_EXPR=33, EXIT_EOF=34, + D_ARG_PARAM_LPAREN=35, D_ARG_PARAM_RPAREN=36, BL_SQ_LPAREN=37, BL_SQ_RPAREN=38, + BL_CURLY_LPAREN=39, BL_CURLY_RPAREN=40, D_ARG_COMMA_EL=41, BL_PHP_EXPR=42, + BL_EXIT_EOF=43, D_ENDPHP=44, CONTENT_TAG_CLOSE=45, CONTENT_OTHER=46, EXIT_REGULAR_ECHO_EOF=47, + RAW_TAG_CLOSE=48, RAW_CONTENT_OTHER=49, EXIT_RAW_ECHO_EOF=50; + public static final int + COMMENT=2; + public static final int + DIRECTIVE_ARG=1, DIRECTIVE_ARG_WITH_PARAM=2, BLADE_INLINE_PHP=3, INSIDE_REGULAR_ECHO=4, + INSIDE_RAW_ECHO=5; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN", "COMMENT" + }; + + public static String[] modeNames = { + "DEFAULT_MODE", "DIRECTIVE_ARG", "DIRECTIVE_ARG_WITH_PARAM", "BLADE_INLINE_PHP", + "INSIDE_REGULAR_ECHO", "INSIDE_RAW_ECHO" + }; + + private static String[] makeRuleNames() { + return new String[] { + "DirectiveLabel", "Identifier", "CompomentIdentifier", "DirectiveArgLookup", + "DOUBLE_QUOTED_STRING_FRAGMENT", "SINGLE_QUOTED_STRING_FRAGMENT", "BlockDirectiveName", + "PHP_INLINE", "D_ESCAPES", "D_BLOCK_DIRECTIVE_START", "D_BLOCK_DIRECTIVE_START_NO_ARG", + "D_BLOCK_DIRECTIVE_END", "D_SECTION", "D_ENDSECTION", "D_BLOCK_ALIGNED_DIRECTIVE", + "NON_PARAM_DIRECTIVE", "D_INLINE_DIRECTIVE", "STRING", "CONTENT_TAG_OPEN", + "RAW_TAG_OPEN", "SG_QUOTE", "DB_QUOTE", "HTML_CLOSE_TAG", "HTML_COMMENT", + "HTML_START_BLOCK_TAG", "HTML_SELF_CLOSE_TAG", "COMPONENT_TAG", "EQ", + "IDENTIFIER", "INLINE_GT_SYMBOL", "GT_SYMBOL", "D_PHP", "AT", "WS", "NL", + "OTHER", "D_ARG_LPAREN", "D_ARG_RPAREN", "D_ARG_NL", "PHP_EXPR", "EXIT_EOF", + "D_ARG_PARAM_LPAREN", "D_ARG_PARAM_RPAREN", "BL_SQ_LPAREN", "BL_SQ_RPAREN", + "BL_CURLY_LPAREN", "BL_CURLY_RPAREN", "D_ARG_COMMA_EL", "D_ARG_PARAM_NL", + "BL_PHP_EXPR", "BL_EXIT_EOF", "D_ENDPHP", "PHP_CODE_GREEDY", "PHP_CODE_COMPLETION", + "CONTENT_TAG_CLOSE", "CONTENT_OTHER", "EXIT_REGULAR_ECHO_EOF", "RAW_TAG_CLOSE", + "RAW_CONTENT_OTHER", "EXIT_RAW_ECHO_EOF" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, null, null, null, null, null, null, null, null, + null, "'{{'", "'{!!'", "'''", "'\"'", null, null, null, null, null, "'='", + null, "'/>'", "'>'", null, "'@'", null, null, null, null, null, null, + null, null, null, null, null, null, null, "','", null, null, "'@endphp'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "HTML", "PHP_CODE", "PARAM_COMMA", "PHP_INLINE", "D_BLOCK_DIRECTIVE_START", + "D_BLOCK_DIRECTIVE_END", "D_SECTION", "D_ENDSECTION", "D_BLOCK_ALIGNED_DIRECTIVE", + "NON_PARAM_DIRECTIVE", "D_INLINE_DIRECTIVE", "STRING", "CONTENT_TAG_OPEN", + "RAW_TAG_OPEN", "SG_QUOTE", "DB_QUOTE", "HTML_CLOSE_TAG", "HTML_COMMENT", + "HTML_START_BLOCK_TAG", "HTML_SELF_CLOSE_TAG", "COMPONENT_TAG", "EQ", + "IDENTIFIER", "INLINE_GT_SYMBOL", "GT_SYMBOL", "D_PHP", "AT", "WS", "NL", + "OTHER", "D_ARG_LPAREN", "D_ARG_RPAREN", "PHP_EXPR", "EXIT_EOF", "D_ARG_PARAM_LPAREN", + "D_ARG_PARAM_RPAREN", "BL_SQ_LPAREN", "BL_SQ_RPAREN", "BL_CURLY_LPAREN", + "BL_CURLY_RPAREN", "D_ARG_COMMA_EL", "BL_PHP_EXPR", "BL_EXIT_EOF", "D_ENDPHP", + "CONTENT_TAG_CLOSE", "CONTENT_OTHER", "EXIT_REGULAR_ECHO_EOF", "RAW_TAG_CLOSE", + "RAW_CONTENT_OTHER", "EXIT_RAW_ECHO_EOF" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + + public BladeAntlrFormatterLexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "BladeAntlrFormatterLexer.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public String[] getChannelNames() { return channelNames; } + + @Override + public String[] getModeNames() { return modeNames; } + + @Override + public ATN getATN() { return _ATN; } + + @Override + public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { + switch (ruleIndex) { + case 36: + D_ARG_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 37: + D_ARG_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 41: + D_ARG_PARAM_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 42: + D_ARG_PARAM_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 43: + BL_SQ_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 44: + BL_SQ_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 45: + BL_CURLY_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 46: + BL_CURLY_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 47: + D_ARG_COMMA_EL_action((RuleContext)_localctx, actionIndex); + break; + } + } + private void D_ARG_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 0: + this.consumeDirectiveArgLParen(); + break; + } + } + private void D_ARG_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 1: + this.consumeDirectiveArgRParen(); + break; + } + } + private void D_ARG_PARAM_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 2: + this.consumeDirectiveArgLParen(); + break; + } + } + private void D_ARG_PARAM_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 3: + this.consumeDirectiveArgRParen(); + break; + } + } + private void BL_SQ_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 4: + this.squareParenBalance++; + break; + } + } + private void BL_SQ_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 5: + this.squareParenBalance--; + break; + } + } + private void BL_CURLY_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 6: + this.curlyParenBalance++; + break; + } + } + private void BL_CURLY_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 7: + this.curlyParenBalance--; + break; + } + } + private void D_ARG_COMMA_EL_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 8: + this.consumeBladeParamComma(); + break; + } + } + @Override + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { + switch (ruleIndex) { + case 3: + return DirectiveArgLookup_sempred((RuleContext)_localctx, predIndex); + case 24: + return HTML_START_BLOCK_TAG_sempred((RuleContext)_localctx, predIndex); + case 31: + return D_PHP_sempred((RuleContext)_localctx, predIndex); + } + return true; + } + private boolean DirectiveArgLookup_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 0: + return this._input.LA(1) == '('; + } + return true; + } + private boolean HTML_START_BLOCK_TAG_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 1: + return this._input.LA(1) == '>' || this._input.LA(1) == '@' || this._input.LA(1) == ' ' || this._input.LA(1) == '\n'; + } + return true; + } + private boolean D_PHP_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 2: + return this._input.LA(1) == ' ' || this._input.LA(1) == '\n'; + } + return true; + } + + public static final String _serializedATN = + "\u0004\u00002\u04bf\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ + "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000\u0007"+ + "\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007"+ + "\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007"+ + "\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n"+ + "\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002"+ + "\u000e\u0007\u000e\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002"+ + "\u0011\u0007\u0011\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002"+ + "\u0014\u0007\u0014\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002"+ + "\u0017\u0007\u0017\u0002\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002"+ + "\u001a\u0007\u001a\u0002\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002"+ + "\u001d\u0007\u001d\u0002\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002"+ + " \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002"+ + "%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002"+ + "*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002"+ + "/\u0007/\u00020\u00070\u00021\u00071\u00022\u00072\u00023\u00073\u0002"+ + "4\u00074\u00025\u00075\u00026\u00076\u00027\u00077\u00028\u00078\u0002"+ + "9\u00079\u0002:\u0007:\u0002;\u0007;\u0001\u0000\u0001\u0000\u0005\u0000"+ + "\u0081\b\u0000\n\u0000\f\u0000\u0084\t\u0000\u0001\u0001\u0001\u0001\u0005"+ + "\u0001\u0088\b\u0001\n\u0001\f\u0001\u008b\t\u0001\u0001\u0002\u0001\u0002"+ + "\u0005\u0002\u008f\b\u0002\n\u0002\f\u0002\u0092\t\u0002\u0001\u0003\u0005"+ + "\u0003\u0095\b\u0003\n\u0003\f\u0003\u0098\t\u0003\u0001\u0003\u0001\u0003"+ + "\u0001\u0004\u0001\u0004\u0001\u0004\u0005\u0004\u009f\b\u0004\n\u0004"+ + "\f\u0004\u00a2\t\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005"+ + "\u0001\u0005\u0001\u0005\u0005\u0005\u00aa\b\u0005\n\u0005\f\u0005\u00ad"+ + "\t\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003"+ + "\u0006\u00c6\b\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0003\u0006\u00d4\b\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003\u0006\u0131"+ + "\b\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0003\u0006\u0140\b\u0006\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0005\u0007\u0147\b\u0007\n\u0007\f\u0007"+ + "\u014a\t\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0005\u0007\u0155\b\u0007"+ + "\n\u0007\f\u0007\u0158\t\u0007\u0001\u0007\u0001\u0007\u0003\u0007\u015c"+ + "\b\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0003"+ + "\b\u0165\b\b\u0001\b\u0001\b\u0001\b\u0001\b\u0003\b\u016b\b\b\u0001\b"+ + "\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0005\b\u0175"+ + "\b\b\n\b\f\b\u0178\t\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b"+ + "\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0003\b\u01e5\b\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0003\n\u01fe\b\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b\u020f\b\u000b"+ + "\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0003\r\u023a\b\r\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0003\u000e"+ + "\u024e\b\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0003\u000f\u025f\b\u000f"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u026a\b\u0010\u0001\u0011"+ + "\u0001\u0011\u0003\u0011\u026e\b\u0011\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ + "\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015"+ + "\u0001\u0016\u0001\u0016\u0005\u0016\u0281\b\u0016\n\u0016\f\u0016\u0284"+ + "\t\u0016\u0001\u0016\u0001\u0016\u0005\u0016\u0288\b\u0016\n\u0016\f\u0016"+ + "\u028b\t\u0016\u0001\u0016\u0001\u0016\u0005\u0016\u028f\b\u0016\n\u0016"+ + "\f\u0016\u0292\t\u0016\u0001\u0016\u0005\u0016\u0295\b\u0016\n\u0016\f"+ + "\u0016\u0298\t\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ + "\u0016\u0005\u0016\u029f\b\u0016\n\u0016\f\u0016\u02a2\t\u0016\u0001\u0016"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+ + "\u0001\u0016\u0001\u0016\u0004\u0016\u02ad\b\u0016\u000b\u0016\f\u0016"+ + "\u02ae\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ + "\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ + "\u0016\u0001\u0016\u0005\u0016\u02be\b\u0016\n\u0016\f\u0016\u02c1\t\u0016"+ + "\u0003\u0016\u02c3\b\u0016\u0001\u0016\u0005\u0016\u02c6\b\u0016\n\u0016"+ + "\f\u0016\u02c9\t\u0016\u0001\u0016\u0001\u0016\u0003\u0016\u02cd\b\u0016"+ + "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ + "\u0005\u0017\u02d5\b\u0017\n\u0017\f\u0017\u02d8\t\u0017\u0001\u0017\u0001"+ + "\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0003\u0018\u03fc\b\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0001\u0019\u0003\u0019\u0415\b\u0019\u0001\u001a\u0001\u001a\u0001"+ + "\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001"+ + "\u001a\u0001\u001a\u0001\u001a\u0004\u001a\u0422\b\u001a\u000b\u001a\f"+ + "\u001a\u0423\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001a\u0003\u001a\u0432\b\u001a\u0001\u001b\u0001\u001b\u0001\u001c"+ + "\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001"+ + "!\u0004!\u044b\b!\u000b!\f!\u044c\u0001\"\u0001\"\u0001#\u0001#\u0001"+ + "#\u0001#\u0001$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001&\u0001&\u0001"+ + "&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001"+ + ")\u0001)\u0001)\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001"+ + "+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u00010\u0001"+ + "0\u00010\u00010\u00011\u00011\u00011\u00011\u00012\u00012\u00012\u0001"+ + "2\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u0001"+ + "3\u00014\u00044\u049b\b4\u000b4\f4\u049c\u00014\u00014\u00015\u00015\u0001"+ + "5\u00015\u00016\u00016\u00016\u00016\u00016\u00017\u00017\u00017\u0001"+ + "7\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u00019\u00019\u0001"+ + "9\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0004\u00a0"+ + "\u0148\u0156\u02d6\u0000<\u0006\u0000\b\u0000\n\u0000\f\u0000\u000e\u0000"+ + "\u0010\u0000\u0012\u0000\u0014\u0004\u0016\u0000\u0018\u0005\u001a\u0000"+ + "\u001c\u0006\u001e\u0007 \b\"\t$\n&\u000b(\f*\r,\u000e.\u000f0\u00102"+ + "\u00114\u00126\u00138\u0014:\u0015<\u0016>\u0017@\u0018B\u0019D\u001a"+ + "F\u001bH\u001cJ\u001dL\u001eN\u001fP R\u0000T!V\"X#Z$\\%^&`\'b(d)f\u0000"+ + "h*j+l,n\u0000p\u0000r-t.v/x0z1|2\u0006\u0000\u0001\u0002\u0003\u0004\u0005"+ + "$\u0003\u0000AZaz\u0080\u8000\ufffe\u0005\u000009AZ__az\u0080\u8000\ufffe"+ + "\u0006\u0000..0:AZ__az\u0080\u8000\ufffe\u0002\u0000\"\"\\\\\u0002\u0000"+ + "\'\'\\\\\u0002\u0000AAaa\u0002\u0000UUuu\u0002\u0000TTtt\u0002\u0000H"+ + "Hhh\u0002\u0000GGgg\u0002\u0000EEee\u0002\u0000SSss\u0002\u0000IIii\u0002"+ + "\u0000FFff\u0002\u0000CCcc\u0002\u0000NNnn\u0002\u0000YYyy\u0002\u0000"+ + "OOoo\u0002\u0000RRrr\u0002\u0000LLll\u0002\u0000WWww\u0002\u0000MMmm\u0002"+ + "\u0000VVvv\u0002\u0000BBbb\u0002\u0000PPpp\u0002\u0000DDdd\u0001\u0000"+ + " \u0002\u0000KKkk\u0006\u0000..09AZ__az\u0080\u8000\ufffe\u0002\u0000"+ + "XXxx\u0002\u0000QQqq\u0001\u000019\u0006\u0000ABIIPQabiipq\u0002\u0000"+ + "\t\t \u0002\u0000\n\n\r\r\u0001\u0000@@\u0545\u0000\u0014\u0001\u0000"+ + "\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000"+ + "\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000"+ + "\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000"+ + "\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000"+ + "\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*"+ + "\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000"+ + "\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000"+ + "\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008"+ + "\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000"+ + "\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000"+ + "\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F"+ + "\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000\u0000\u0000J\u0001\u0000"+ + "\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0001N\u0001\u0000\u0000\u0000"+ + "\u0001P\u0001\u0000\u0000\u0000\u0001R\u0001\u0000\u0000\u0000\u0001T"+ + "\u0001\u0000\u0000\u0000\u0001V\u0001\u0000\u0000\u0000\u0002X\u0001\u0000"+ + "\u0000\u0000\u0002Z\u0001\u0000\u0000\u0000\u0002\\\u0001\u0000\u0000"+ + "\u0000\u0002^\u0001\u0000\u0000\u0000\u0002`\u0001\u0000\u0000\u0000\u0002"+ + "b\u0001\u0000\u0000\u0000\u0002d\u0001\u0000\u0000\u0000\u0002f\u0001"+ + "\u0000\u0000\u0000\u0002h\u0001\u0000\u0000\u0000\u0002j\u0001\u0000\u0000"+ + "\u0000\u0003l\u0001\u0000\u0000\u0000\u0003n\u0001\u0000\u0000\u0000\u0003"+ + "p\u0001\u0000\u0000\u0000\u0004r\u0001\u0000\u0000\u0000\u0004t\u0001"+ + "\u0000\u0000\u0000\u0004v\u0001\u0000\u0000\u0000\u0005x\u0001\u0000\u0000"+ + "\u0000\u0005z\u0001\u0000\u0000\u0000\u0005|\u0001\u0000\u0000\u0000\u0006"+ + "~\u0001\u0000\u0000\u0000\b\u0085\u0001\u0000\u0000\u0000\n\u008c\u0001"+ + "\u0000\u0000\u0000\f\u0096\u0001\u0000\u0000\u0000\u000e\u009b\u0001\u0000"+ + "\u0000\u0000\u0010\u00a5\u0001\u0000\u0000\u0000\u0012\u013f\u0001\u0000"+ + "\u0000\u0000\u0014\u015b\u0001\u0000\u0000\u0000\u0016\u01e4\u0001\u0000"+ + "\u0000\u0000\u0018\u01e8\u0001\u0000\u0000\u0000\u001a\u01ee\u0001\u0000"+ + "\u0000\u0000\u001c\u020e\u0001\u0000\u0000\u0000\u001e\u0210\u0001\u0000"+ + "\u0000\u0000 \u0239\u0001\u0000\u0000\u0000\"\u024d\u0001\u0000\u0000"+ + "\u0000$\u025e\u0001\u0000\u0000\u0000&\u0269\u0001\u0000\u0000\u0000("+ + "\u026d\u0001\u0000\u0000\u0000*\u026f\u0001\u0000\u0000\u0000,\u0274\u0001"+ + "\u0000\u0000\u0000.\u027a\u0001\u0000\u0000\u00000\u027c\u0001\u0000\u0000"+ + "\u00002\u02cc\u0001\u0000\u0000\u00004\u02ce\u0001\u0000\u0000\u00006"+ + "\u02dd\u0001\u0000\u0000\u00008\u03ff\u0001\u0000\u0000\u0000:\u0431\u0001"+ + "\u0000\u0000\u0000<\u0433\u0001\u0000\u0000\u0000>\u0435\u0001\u0000\u0000"+ + "\u0000@\u0437\u0001\u0000\u0000\u0000B\u043a\u0001\u0000\u0000\u0000D"+ + "\u043c\u0001\u0000\u0000\u0000F\u0445\u0001\u0000\u0000\u0000H\u044a\u0001"+ + "\u0000\u0000\u0000J\u044e\u0001\u0000\u0000\u0000L\u0450\u0001\u0000\u0000"+ + "\u0000N\u0454\u0001\u0000\u0000\u0000P\u0457\u0001\u0000\u0000\u0000R"+ + "\u045a\u0001\u0000\u0000\u0000T\u045e\u0001\u0000\u0000\u0000V\u0462\u0001"+ + "\u0000\u0000\u0000X\u0466\u0001\u0000\u0000\u0000Z\u0469\u0001\u0000\u0000"+ + "\u0000\\\u046c\u0001\u0000\u0000\u0000^\u0471\u0001\u0000\u0000\u0000"+ + "`\u0476\u0001\u0000\u0000\u0000b\u047b\u0001\u0000\u0000\u0000d\u0480"+ + "\u0001\u0000\u0000\u0000f\u0483\u0001\u0000\u0000\u0000h\u0487\u0001\u0000"+ + "\u0000\u0000j\u048b\u0001\u0000\u0000\u0000l\u048f\u0001\u0000\u0000\u0000"+ + "n\u049a\u0001\u0000\u0000\u0000p\u04a0\u0001\u0000\u0000\u0000r\u04a4"+ + "\u0001\u0000\u0000\u0000t\u04a9\u0001\u0000\u0000\u0000v\u04ad\u0001\u0000"+ + "\u0000\u0000x\u04b1\u0001\u0000\u0000\u0000z\u04b7\u0001\u0000\u0000\u0000"+ + "|\u04bb\u0001\u0000\u0000\u0000~\u0082\u0007\u0000\u0000\u0000\u007f\u0081"+ + "\u0007\u0001\u0000\u0000\u0080\u007f\u0001\u0000\u0000\u0000\u0081\u0084"+ + "\u0001\u0000\u0000\u0000\u0082\u0080\u0001\u0000\u0000\u0000\u0082\u0083"+ + "\u0001\u0000\u0000\u0000\u0083\u0007\u0001\u0000\u0000\u0000\u0084\u0082"+ + "\u0001\u0000\u0000\u0000\u0085\u0089\u0007\u0000\u0000\u0000\u0086\u0088"+ + "\u0007\u0001\u0000\u0000\u0087\u0086\u0001\u0000\u0000\u0000\u0088\u008b"+ + "\u0001\u0000\u0000\u0000\u0089\u0087\u0001\u0000\u0000\u0000\u0089\u008a"+ + "\u0001\u0000\u0000\u0000\u008a\t\u0001\u0000\u0000\u0000\u008b\u0089\u0001"+ + "\u0000\u0000\u0000\u008c\u0090\u0007\u0000\u0000\u0000\u008d\u008f\u0007"+ + "\u0002\u0000\u0000\u008e\u008d\u0001\u0000\u0000\u0000\u008f\u0092\u0001"+ + "\u0000\u0000\u0000\u0090\u008e\u0001\u0000\u0000\u0000\u0090\u0091\u0001"+ + "\u0000\u0000\u0000\u0091\u000b\u0001\u0000\u0000\u0000\u0092\u0090\u0001"+ + "\u0000\u0000\u0000\u0093\u0095\u0005 \u0000\u0000\u0094\u0093\u0001\u0000"+ + "\u0000\u0000\u0095\u0098\u0001\u0000\u0000\u0000\u0096\u0094\u0001\u0000"+ + "\u0000\u0000\u0096\u0097\u0001\u0000\u0000\u0000\u0097\u0099\u0001\u0000"+ + "\u0000\u0000\u0098\u0096\u0001\u0000\u0000\u0000\u0099\u009a\u0004\u0003"+ + "\u0000\u0000\u009a\r\u0001\u0000\u0000\u0000\u009b\u00a0\u0005\"\u0000"+ + "\u0000\u009c\u009f\u0007\u0003\u0000\u0000\u009d\u009f\t\u0000\u0000\u0000"+ + "\u009e\u009c\u0001\u0000\u0000\u0000\u009e\u009d\u0001\u0000\u0000\u0000"+ + "\u009f\u00a2\u0001\u0000\u0000\u0000\u00a0\u00a1\u0001\u0000\u0000\u0000"+ + "\u00a0\u009e\u0001\u0000\u0000\u0000\u00a1\u00a3\u0001\u0000\u0000\u0000"+ + "\u00a2\u00a0\u0001\u0000\u0000\u0000\u00a3\u00a4\u0005\"\u0000\u0000\u00a4"+ + "\u000f\u0001\u0000\u0000\u0000\u00a5\u00ab\u0005\'\u0000\u0000\u00a6\u00aa"+ + "\b\u0004\u0000\u0000\u00a7\u00a8\u0005\\\u0000\u0000\u00a8\u00aa\t\u0000"+ + "\u0000\u0000\u00a9\u00a6\u0001\u0000\u0000\u0000\u00a9\u00a7\u0001\u0000"+ + "\u0000\u0000\u00aa\u00ad\u0001\u0000\u0000\u0000\u00ab\u00a9\u0001\u0000"+ + "\u0000\u0000\u00ab\u00ac\u0001\u0000\u0000\u0000\u00ac\u00ae\u0001\u0000"+ + "\u0000\u0000\u00ad\u00ab\u0001\u0000\u0000\u0000\u00ae\u00af\u0005\'\u0000"+ + "\u0000\u00af\u0011\u0001\u0000\u0000\u0000\u00b0\u00b1\u0007\u0005\u0000"+ + "\u0000\u00b1\u00b2\u0007\u0006\u0000\u0000\u00b2\u00b3\u0007\u0007\u0000"+ + "\u0000\u00b3\u0140\u0007\b\u0000\u0000\u00b4\u00b5\u0007\t\u0000\u0000"+ + "\u00b5\u00b6\u0007\u0006\u0000\u0000\u00b6\u00b7\u0007\n\u0000\u0000\u00b7"+ + "\u00b8\u0007\u000b\u0000\u0000\u00b8\u0140\u0007\u0007\u0000\u0000\u00b9"+ + "\u00ba\u0007\f\u0000\u0000\u00ba\u0140\u0007\r\u0000\u0000\u00bb\u00bc"+ + "\u0007\u000e\u0000\u0000\u00bc\u00bd\u0007\u0005\u0000\u0000\u00bd\u00be"+ + "\u0007\u000f\u0000\u0000\u00be\u00c5\u0001\u0000\u0000\u0000\u00bf\u00c0"+ + "\u0007\u0005\u0000\u0000\u00c0\u00c1\u0007\u000f\u0000\u0000\u00c1\u00c6"+ + "\u0007\u0010\u0000\u0000\u00c2\u00c3\u0007\u000f\u0000\u0000\u00c3\u00c4"+ + "\u0007\u0011\u0000\u0000\u00c4\u00c6\u0007\u0007\u0000\u0000\u00c5\u00bf"+ + "\u0001\u0000\u0000\u0000\u00c5\u00c2\u0001\u0000\u0000\u0000\u00c5\u00c6"+ + "\u0001\u0000\u0000\u0000\u00c6\u0140\u0001\u0000\u0000\u0000\u00c7\u00c8"+ + "\u0007\r\u0000\u0000\u00c8\u00c9\u0007\u0011\u0000\u0000\u00c9\u00ca\u0007"+ + "\u0012\u0000\u0000\u00ca\u00d3\u0001\u0000\u0000\u0000\u00cb\u00cc\u0007"+ + "\n\u0000\u0000\u00cc\u00cd\u0007\u0005\u0000\u0000\u00cd\u00ce\u0007\u000e"+ + "\u0000\u0000\u00ce\u00d4\u0007\b\u0000\u0000\u00cf\u00d0\u0007\n\u0000"+ + "\u0000\u00d0\u00d1\u0007\u0013\u0000\u0000\u00d1\u00d2\u0007\u000b\u0000"+ + "\u0000\u00d2\u00d4\u0007\n\u0000\u0000\u00d3\u00cb\u0001\u0000\u0000\u0000"+ + "\u00d3\u00cf\u0001\u0000\u0000\u0000\u00d3\u00d4\u0001\u0000\u0000\u0000"+ + "\u00d4\u0140\u0001\u0000\u0000\u0000\u00d5\u00d6\u0007\u0014\u0000\u0000"+ + "\u00d6\u00d7\u0007\b\u0000\u0000\u00d7\u00d8\u0007\f\u0000\u0000\u00d8"+ + "\u00d9\u0007\u0013\u0000\u0000\u00d9\u0140\u0007\n\u0000\u0000\u00da\u00db"+ + "\u0007\b\u0000\u0000\u00db\u00dc\u0007\u0005\u0000\u0000\u00dc\u00dd\u0007"+ + "\u000b\u0000\u0000\u00dd\u00de\u0007\u000b\u0000\u0000\u00de\u00df\u0007"+ + "\n\u0000\u0000\u00df\u00e0\u0007\u000e\u0000\u0000\u00e0\u00e1\u0007\u0007"+ + "\u0000\u0000\u00e1\u00e2\u0007\f\u0000\u0000\u00e2\u00e3\u0007\u0011\u0000"+ + "\u0000\u00e3\u0140\u0007\u000f\u0000\u0000\u00e4\u00e5\u0007\u000b\u0000"+ + "\u0000\u00e5\u00e6\u0007\n\u0000\u0000\u00e6\u00e7\u0007\u000e\u0000\u0000"+ + "\u00e7\u00e8\u0007\u0007\u0000\u0000\u00e8\u00e9\u0007\f\u0000\u0000\u00e9"+ + "\u00ea\u0007\u0011\u0000\u0000\u00ea\u00eb\u0007\u000f\u0000\u0000\u00eb"+ + "\u00ec\u0007\u0015\u0000\u0000\u00ec\u00ed\u0007\f\u0000\u0000\u00ed\u00ee"+ + "\u0007\u000b\u0000\u0000\u00ee\u00ef\u0007\u000b\u0000\u0000\u00ef\u00f0"+ + "\u0007\f\u0000\u0000\u00f0\u00f1\u0007\u000f\u0000\u0000\u00f1\u0140\u0007"+ + "\t\u0000\u0000\u00f2\u00f3\u0007\r\u0000\u0000\u00f3\u00f4\u0007\u0012"+ + "\u0000\u0000\u00f4\u00f5\u0007\u0005\u0000\u0000\u00f5\u00f6\u0007\t\u0000"+ + "\u0000\u00f6\u00f7\u0007\u0015\u0000\u0000\u00f7\u00f8\u0007\n\u0000\u0000"+ + "\u00f8\u00f9\u0007\u000f\u0000\u0000\u00f9\u0140\u0007\u0007\u0000\u0000"+ + "\u00fa\u00fb\u0007\u0016\u0000\u0000\u00fb\u00fc\u0007\n\u0000\u0000\u00fc"+ + "\u00fd\u0007\u0012\u0000\u0000\u00fd\u00fe\u0007\u0017\u0000\u0000\u00fe"+ + "\u00ff\u0007\u0005\u0000\u0000\u00ff\u0100\u0007\u0007\u0000\u0000\u0100"+ + "\u0101\u0007\f\u0000\u0000\u0101\u0140\u0007\u0015\u0000\u0000\u0102\u0103"+ + "\u0007\f\u0000\u0000\u0103\u0104\u0007\u000b\u0000\u0000\u0104\u0105\u0007"+ + "\u000b\u0000\u0000\u0105\u0106\u0007\n\u0000\u0000\u0106\u0140\u0007\u0007"+ + "\u0000\u0000\u0107\u0108\u0007\u0006\u0000\u0000\u0108\u0109\u0007\u000f"+ + "\u0000\u0000\u0109\u010a\u0007\u0013\u0000\u0000\u010a\u010b\u0007\n\u0000"+ + "\u0000\u010b\u010c\u0007\u000b\u0000\u0000\u010c\u0140\u0007\u000b\u0000"+ + "\u0000\u010d\u010e\u0007\n\u0000\u0000\u010e\u010f\u0007\u0015\u0000\u0000"+ + "\u010f\u0110\u0007\u0018\u0000\u0000\u0110\u0111\u0007\u0007\u0000\u0000"+ + "\u0111\u0140\u0007\u0010\u0000\u0000\u0112\u0113\u0007\u000b\u0000\u0000"+ + "\u0113\u0114\u0007\n\u0000\u0000\u0114\u0115\u0007\u000b\u0000\u0000\u0115"+ + "\u0116\u0007\u000b\u0000\u0000\u0116\u0117\u0007\f\u0000\u0000\u0117\u0118"+ + "\u0007\u0011\u0000\u0000\u0118\u0140\u0007\u000f\u0000\u0000\u0119\u011a"+ + "\u0007\n\u0000\u0000\u011a\u011b\u0007\u000f\u0000\u0000\u011b\u0140\u0007"+ + "\u0016\u0000\u0000\u011c\u011d\u0007\u0011\u0000\u0000\u011d\u011e\u0007"+ + "\u000f\u0000\u0000\u011e\u011f\u0007\u000e\u0000\u0000\u011f\u0140\u0007"+ + "\n\u0000\u0000\u0120\u0121\u0007\n\u0000\u0000\u0121\u0122\u0007\u0012"+ + "\u0000\u0000\u0122\u0123\u0007\u0012\u0000\u0000\u0123\u0124\u0007\u0011"+ + "\u0000\u0000\u0124\u0140\u0007\u0012\u0000\u0000\u0125\u0126\u0007\u0018"+ + "\u0000\u0000\u0126\u0127\u0007\u0006\u0000\u0000\u0127\u0128\u0007\u000b"+ + "\u0000\u0000\u0128\u0129\u0007\b\u0000\u0000\u0129\u0130\u0001\u0000\u0000"+ + "\u0000\u012a\u012b\u0007\f\u0000\u0000\u012b\u0131\u0007\r\u0000\u0000"+ + "\u012c\u012d\u0007\u0011\u0000\u0000\u012d\u012e\u0007\u000f\u0000\u0000"+ + "\u012e\u012f\u0007\u000e\u0000\u0000\u012f\u0131\u0007\n\u0000\u0000\u0130"+ + "\u012a\u0001\u0000\u0000\u0000\u0130\u012c\u0001\u0000\u0000\u0000\u0130"+ + "\u0131\u0001\u0000\u0000\u0000\u0131\u0140\u0001\u0000\u0000\u0000\u0132"+ + "\u0133\u0007\u0018\u0000\u0000\u0133\u0134\u0007\u0012\u0000\u0000\u0134"+ + "\u0135\u0007\n\u0000\u0000\u0135\u0136\u0007\u0018\u0000\u0000\u0136\u0137"+ + "\u0007\n\u0000\u0000\u0137\u0138\u0007\u000f\u0000\u0000\u0138\u0140\u0007"+ + "\u0019\u0000\u0000\u0139\u013a\u0007\u000b\u0000\u0000\u013a\u013b\u0007"+ + "\u0014\u0000\u0000\u013b\u013c\u0007\f\u0000\u0000\u013c\u013d\u0007\u0007"+ + "\u0000\u0000\u013d\u013e\u0007\u000e\u0000\u0000\u013e\u0140\u0007\b\u0000"+ + "\u0000\u013f\u00b0\u0001\u0000\u0000\u0000\u013f\u00b4\u0001\u0000\u0000"+ + "\u0000\u013f\u00b9\u0001\u0000\u0000\u0000\u013f\u00bb\u0001\u0000\u0000"+ + "\u0000\u013f\u00c7\u0001\u0000\u0000\u0000\u013f\u00d5\u0001\u0000\u0000"+ + "\u0000\u013f\u00da\u0001\u0000\u0000\u0000\u013f\u00e4\u0001\u0000\u0000"+ + "\u0000\u013f\u00f2\u0001\u0000\u0000\u0000\u013f\u00fa\u0001\u0000\u0000"+ + "\u0000\u013f\u0102\u0001\u0000\u0000\u0000\u013f\u0107\u0001\u0000\u0000"+ + "\u0000\u013f\u010d\u0001\u0000\u0000\u0000\u013f\u0112\u0001\u0000\u0000"+ + "\u0000\u013f\u0119\u0001\u0000\u0000\u0000\u013f\u011c\u0001\u0000\u0000"+ + "\u0000\u013f\u0120\u0001\u0000\u0000\u0000\u013f\u0125\u0001\u0000\u0000"+ + "\u0000\u013f\u0132\u0001\u0000\u0000\u0000\u013f\u0139\u0001\u0000\u0000"+ + "\u0000\u0140\u0013\u0001\u0000\u0000\u0000\u0141\u0142\u0005<\u0000\u0000"+ + "\u0142\u0143\u0005?\u0000\u0000\u0143\u0144\u0005=\u0000\u0000\u0144\u0148"+ + "\u0001\u0000\u0000\u0000\u0145\u0147\t\u0000\u0000\u0000\u0146\u0145\u0001"+ + "\u0000\u0000\u0000\u0147\u014a\u0001\u0000\u0000\u0000\u0148\u0149\u0001"+ + "\u0000\u0000\u0000\u0148\u0146\u0001\u0000\u0000\u0000\u0149\u014b\u0001"+ + "\u0000\u0000\u0000\u014a\u0148\u0001\u0000\u0000\u0000\u014b\u014c\u0005"+ + "?\u0000\u0000\u014c\u015c\u0005>\u0000\u0000\u014d\u014e\u0005<\u0000"+ + "\u0000\u014e\u014f\u0005?\u0000\u0000\u014f\u0150\u0007\u0018\u0000\u0000"+ + "\u0150\u0151\u0007\b\u0000\u0000\u0151\u0152\u0007\u0018\u0000\u0000\u0152"+ + "\u0156\u0001\u0000\u0000\u0000\u0153\u0155\t\u0000\u0000\u0000\u0154\u0153"+ + "\u0001\u0000\u0000\u0000\u0155\u0158\u0001\u0000\u0000\u0000\u0156\u0157"+ + "\u0001\u0000\u0000\u0000\u0156\u0154\u0001\u0000\u0000\u0000\u0157\u0159"+ + "\u0001\u0000\u0000\u0000\u0158\u0156\u0001\u0000\u0000\u0000\u0159\u015a"+ + "\u0005?\u0000\u0000\u015a\u015c\u0005>\u0000\u0000\u015b\u0141\u0001\u0000"+ + "\u0000\u0000\u015b\u014d\u0001\u0000\u0000\u0000\u015c\u0015\u0001\u0000"+ + "\u0000\u0000\u015d\u015e\u0005{\u0000\u0000\u015e\u015f\u0005{\u0000\u0000"+ + "\u015f\u01e5\u0005{\u0000\u0000\u0160\u0161\u0005@\u0000\u0000\u0161\u0162"+ + "\u0005@\u0000\u0000\u0162\u0164\u0001\u0000\u0000\u0000\u0163\u0165\u0005"+ + "@\u0000\u0000\u0164\u0163\u0001\u0000\u0000\u0000\u0164\u0165\u0001\u0000"+ + "\u0000\u0000\u0165\u01e5\u0001\u0000\u0000\u0000\u0166\u0167\u0005@\u0000"+ + "\u0000\u0167\u0168\u0005{\u0000\u0000\u0168\u016a\u0001\u0000\u0000\u0000"+ + "\u0169\u016b\u0005{\u0000\u0000\u016a\u0169\u0001\u0000\u0000\u0000\u016a"+ + "\u016b\u0001\u0000\u0000\u0000\u016b\u01e5\u0001\u0000\u0000\u0000\u016c"+ + "\u016d\u0005@\u0000\u0000\u016d\u016e\u0007\u0015\u0000\u0000\u016e\u016f"+ + "\u0007\n\u0000\u0000\u016f\u0170\u0007\u0019\u0000\u0000\u0170\u0171\u0007"+ + "\f\u0000\u0000\u0171\u0172\u0007\u0005\u0000\u0000\u0172\u0176\u0001\u0000"+ + "\u0000\u0000\u0173\u0175\u0007\u001a\u0000\u0000\u0174\u0173\u0001\u0000"+ + "\u0000\u0000\u0175\u0178\u0001\u0000\u0000\u0000\u0176\u0174\u0001\u0000"+ + "\u0000\u0000\u0176\u0177\u0001\u0000\u0000\u0000\u0177\u01e5\u0001\u0000"+ + "\u0000\u0000\u0178\u0176\u0001\u0000\u0000\u0000\u0179\u017a\u0005@\u0000"+ + "\u0000\u017a\u017b\u0007\u000e\u0000\u0000\u017b\u017c\u0007\b\u0000\u0000"+ + "\u017c\u017d\u0007\u0005\u0000\u0000\u017d\u017e\u0007\u0012\u0000\u0000"+ + "\u017e\u017f\u0007\u000b\u0000\u0000\u017f\u0180\u0007\n\u0000\u0000\u0180"+ + "\u01e5\u0007\u0007\u0000\u0000\u0181\u0182\u0005@\u0000\u0000\u0182\u0183"+ + "\u0007\f\u0000\u0000\u0183\u0184\u0007\u0015\u0000\u0000\u0184\u0185\u0007"+ + "\u0018\u0000\u0000\u0185\u0186\u0007\u0011\u0000\u0000\u0186\u0187\u0007"+ + "\u0012\u0000\u0000\u0187\u01e5\u0007\u0007\u0000\u0000\u0188\u0189\u0005"+ + "@\u0000\u0000\u0189\u018a\u0007\u000f\u0000\u0000\u018a\u018b\u0007\u0005"+ + "\u0000\u0000\u018b\u018c\u0007\u0015\u0000\u0000\u018c\u018d\u0007\n\u0000"+ + "\u0000\u018d\u018e\u0007\u000b\u0000\u0000\u018e\u018f\u0007\u0018\u0000"+ + "\u0000\u018f\u0190\u0007\u0005\u0000\u0000\u0190\u0191\u0007\u000e\u0000"+ + "\u0000\u0191\u01e5\u0007\n\u0000\u0000\u0192\u0193\u0005@\u0000\u0000"+ + "\u0193\u0194\u0007\u0019\u0000\u0000\u0194\u0195\u0007\u0011\u0000\u0000"+ + "\u0195\u0196\u0007\u000e\u0000\u0000\u0196\u0197\u0007\u0006\u0000\u0000"+ + "\u0197\u0198\u0007\u0015\u0000\u0000\u0198\u0199\u0007\n\u0000\u0000\u0199"+ + "\u019a\u0007\u000f\u0000\u0000\u019a\u01e5\u0007\u0007\u0000\u0000\u019b"+ + "\u019c\u0005@\u0000\u0000\u019c\u019d\u0007\r\u0000\u0000\u019d\u019e"+ + "\u0007\u0011\u0000\u0000\u019e\u019f\u0007\u000f\u0000\u0000\u019f\u01a0"+ + "\u0007\u0007\u0000\u0000\u01a0\u01a1\u0005-\u0000\u0000\u01a1\u01a2\u0007"+ + "\r\u0000\u0000\u01a2\u01a3\u0007\u0005\u0000\u0000\u01a3\u01a4\u0007\u000e"+ + "\u0000\u0000\u01a4\u01e5\u0007\n\u0000\u0000\u01a5\u01a6\u0005@\u0000"+ + "\u0000\u01a6\u01a7\u0007\u0018\u0000\u0000\u01a7\u01a8\u0007\u0005\u0000"+ + "\u0000\u01a8\u01a9\u0007\t\u0000\u0000\u01a9\u01e5\u0007\n\u0000\u0000"+ + "\u01aa\u01ab\u0005@\u0000\u0000\u01ab\u01ac\u0007\u000b\u0000\u0000\u01ac"+ + "\u01ad\u0007\u0006\u0000\u0000\u01ad\u01ae\u0007\u0018\u0000\u0000\u01ae"+ + "\u01af\u0007\u0018\u0000\u0000\u01af\u01b0\u0007\u0011\u0000\u0000\u01b0"+ + "\u01b1\u0007\u0012\u0000\u0000\u01b1\u01b2\u0007\u0007\u0000\u0000\u01b2"+ + "\u01e5\u0007\u000b\u0000\u0000\u01b3\u01b4\u0005@\u0000\u0000\u01b4\u01b5"+ + "\u0007\u0013\u0000\u0000\u01b5\u01b6\u0007\u0005\u0000\u0000\u01b6\u01b7"+ + "\u0007\u0010\u0000\u0000\u01b7\u01b8\u0007\n\u0000\u0000\u01b8\u01e5\u0007"+ + "\u0012\u0000\u0000\u01b9\u01ba\u0005@\u0000\u0000\u01ba\u01bb\u0007\u0007"+ + "\u0000\u0000\u01bb\u01bc\u0007\u0005\u0000\u0000\u01bc\u01bd\u0007\f\u0000"+ + "\u0000\u01bd\u01be\u0007\u0013\u0000\u0000\u01be\u01bf\u0007\u0014\u0000"+ + "\u0000\u01bf\u01c0\u0007\f\u0000\u0000\u01c0\u01c1\u0007\u000f\u0000\u0000"+ + "\u01c1\u01e5\u0007\u0019\u0000\u0000\u01c2\u01c3\u0005@\u0000\u0000\u01c3"+ + "\u01c4\u0007\u0005\u0000\u0000\u01c4\u01c5\u0007\u0018\u0000\u0000\u01c5"+ + "\u01c6\u0007\u0018\u0000\u0000\u01c6\u01c7\u0007\u0013\u0000\u0000\u01c7"+ + "\u01e5\u0007\u0010\u0000\u0000\u01c8\u01c9\u0005@\u0000\u0000\u01c9\u01ca"+ + "\u0005-\u0000\u0000\u01ca\u01cb\u0007\u0014\u0000\u0000\u01cb\u01cc\u0007"+ + "\n\u0000\u0000\u01cc\u01cd\u0007\u0017\u0000\u0000\u01cd\u01ce\u0007\u001b"+ + "\u0000\u0000\u01ce\u01cf\u0007\f\u0000\u0000\u01cf\u01d0\u0007\u0007\u0000"+ + "\u0000\u01d0\u01d1\u0005-\u0000\u0000\u01d1\u01d2\u0007\u001b\u0000\u0000"+ + "\u01d2\u01d3\u0007\n\u0000\u0000\u01d3\u01d4\u0007\u0010\u0000\u0000\u01d4"+ + "\u01d5\u0007\r\u0000\u0000\u01d5\u01d6\u0007\u0012\u0000\u0000\u01d6\u01d7"+ + "\u0007\u0005\u0000\u0000\u01d7\u01d8\u0007\u0015\u0000\u0000\u01d8\u01d9"+ + "\u0007\n\u0000\u0000\u01d9\u01e5\u0007\u000b\u0000\u0000\u01da\u01db\u0005"+ + "@\u0000\u0000\u01db\u01dc\u0007\u001b\u0000\u0000\u01dc\u01dd\u0007\n"+ + "\u0000\u0000\u01dd\u01de\u0007\u0010\u0000\u0000\u01de\u01df\u0007\r\u0000"+ + "\u0000\u01df\u01e0\u0007\u0012\u0000\u0000\u01e0\u01e1\u0007\u0005\u0000"+ + "\u0000\u01e1\u01e2\u0007\u0015\u0000\u0000\u01e2\u01e3\u0007\n\u0000\u0000"+ + "\u01e3\u01e5\u0007\u000b\u0000\u0000\u01e4\u015d\u0001\u0000\u0000\u0000"+ + "\u01e4\u0160\u0001\u0000\u0000\u0000\u01e4\u0166\u0001\u0000\u0000\u0000"+ + "\u01e4\u016c\u0001\u0000\u0000\u0000\u01e4\u0179\u0001\u0000\u0000\u0000"+ + "\u01e4\u0181\u0001\u0000\u0000\u0000\u01e4\u0188\u0001\u0000\u0000\u0000"+ + "\u01e4\u0192\u0001\u0000\u0000\u0000\u01e4\u019b\u0001\u0000\u0000\u0000"+ + "\u01e4\u01a5\u0001\u0000\u0000\u0000\u01e4\u01aa\u0001\u0000\u0000\u0000"+ + "\u01e4\u01b3\u0001\u0000\u0000\u0000\u01e4\u01b9\u0001\u0000\u0000\u0000"+ + "\u01e4\u01c2\u0001\u0000\u0000\u0000\u01e4\u01c8\u0001\u0000\u0000\u0000"+ + "\u01e4\u01da\u0001\u0000\u0000\u0000\u01e5\u01e6\u0001\u0000\u0000\u0000"+ + "\u01e6\u01e7\u0006\b\u0000\u0000\u01e7\u0017\u0001\u0000\u0000\u0000\u01e8"+ + "\u01e9\u0005@\u0000\u0000\u01e9\u01ea\u0003\u0012\u0006\u0000\u01ea\u01eb"+ + "\u0003\f\u0003\u0000\u01eb\u01ec\u0001\u0000\u0000\u0000\u01ec\u01ed\u0006"+ + "\t\u0001\u0000\u01ed\u0019\u0001\u0000\u0000\u0000\u01ee\u01fd\u0005@"+ + "\u0000\u0000\u01ef\u01f0\u0007\u0005\u0000\u0000\u01f0\u01f1\u0007\u0006"+ + "\u0000\u0000\u01f1\u01f2\u0007\u0007\u0000\u0000\u01f2\u01fe\u0007\b\u0000"+ + "\u0000\u01f3\u01f4\u0007\u0018\u0000\u0000\u01f4\u01f5\u0007\u0012\u0000"+ + "\u0000\u01f5\u01f6\u0007\u0011\u0000\u0000\u01f6\u01f7\u0007\u0019\u0000"+ + "\u0000\u01f7\u01f8\u0007\u0006\u0000\u0000\u01f8\u01f9\u0007\u000e\u0000"+ + "\u0000\u01f9\u01fa\u0007\u0007\u0000\u0000\u01fa\u01fb\u0007\f\u0000\u0000"+ + "\u01fb\u01fc\u0007\u0011\u0000\u0000\u01fc\u01fe\u0007\u000f\u0000\u0000"+ + "\u01fd\u01ef\u0001\u0000\u0000\u0000\u01fd\u01f3\u0001\u0000\u0000\u0000"+ + "\u01fe\u01ff\u0001\u0000\u0000\u0000\u01ff\u0200\u0006\n\u0002\u0000\u0200"+ + "\u001b\u0001\u0000\u0000\u0000\u0201\u0202\u0005@\u0000\u0000\u0202\u0203"+ + "\u0007\n\u0000\u0000\u0203\u0204\u0007\u000f\u0000\u0000\u0204\u0205\u0007"+ + "\u0019\u0000\u0000\u0205\u0206\u0001\u0000\u0000\u0000\u0206\u020f\u0003"+ + "\u0012\u0006\u0000\u0207\u0208\u0005@\u0000\u0000\u0208\u0209\u0007\n"+ + "\u0000\u0000\u0209\u020a\u0007\u000f\u0000\u0000\u020a\u020b\u0007\u0019"+ + "\u0000\u0000\u020b\u020c\u0007\u0018\u0000\u0000\u020c\u020d\u0007\b\u0000"+ + "\u0000\u020d\u020f\u0007\u0018\u0000\u0000\u020e\u0201\u0001\u0000\u0000"+ + "\u0000\u020e\u0207\u0001\u0000\u0000\u0000\u020f\u001d\u0001\u0000\u0000"+ + "\u0000\u0210\u0211\u0005@\u0000\u0000\u0211\u0212\u0007\u000b\u0000\u0000"+ + "\u0212\u0213\u0007\n\u0000\u0000\u0213\u0214\u0007\u000e\u0000\u0000\u0214"+ + "\u0215\u0007\u0007\u0000\u0000\u0215\u0216\u0007\f\u0000\u0000\u0216\u0217"+ + "\u0007\u0011\u0000\u0000\u0217\u0218\u0007\u000f\u0000\u0000\u0218\u0219"+ + "\u0001\u0000\u0000\u0000\u0219\u021a\u0003\f\u0003\u0000\u021a\u021b\u0001"+ + "\u0000\u0000\u0000\u021b\u021c\u0006\f\u0003\u0000\u021c\u001f\u0001\u0000"+ + "\u0000\u0000\u021d\u021e\u0005@\u0000\u0000\u021e\u021f\u0007\n\u0000"+ + "\u0000\u021f\u0220\u0007\u000f\u0000\u0000\u0220\u0221\u0007\u0019\u0000"+ + "\u0000\u0221\u0222\u0007\u000b\u0000\u0000\u0222\u0223\u0007\n\u0000\u0000"+ + "\u0223\u0224\u0007\u000e\u0000\u0000\u0224\u0225\u0007\u0007\u0000\u0000"+ + "\u0225\u0226\u0007\f\u0000\u0000\u0226\u0227\u0007\u0011\u0000\u0000\u0227"+ + "\u023a\u0007\u000f\u0000\u0000\u0228\u0229\u0005@\u0000\u0000\u0229\u022a"+ + "\u0007\u000b\u0000\u0000\u022a\u022b\u0007\b\u0000\u0000\u022b\u022c\u0007"+ + "\u0011\u0000\u0000\u022c\u023a\u0007\u0014\u0000\u0000\u022d\u022e\u0005"+ + "@\u0000\u0000\u022e\u022f\u0007\u0005\u0000\u0000\u022f\u0230\u0007\u0018"+ + "\u0000\u0000\u0230\u0231\u0007\u0018\u0000\u0000\u0231\u0232\u0007\n\u0000"+ + "\u0000\u0232\u0233\u0007\u000f\u0000\u0000\u0233\u023a\u0007\u0019\u0000"+ + "\u0000\u0234\u0235\u0005@\u0000\u0000\u0235\u0236\u0007\u000b\u0000\u0000"+ + "\u0236\u0237\u0007\u0007\u0000\u0000\u0237\u0238\u0007\u0011\u0000\u0000"+ + "\u0238\u023a\u0007\u0018\u0000\u0000\u0239\u021d\u0001\u0000\u0000\u0000"+ + "\u0239\u0228\u0001\u0000\u0000\u0000\u0239\u022d\u0001\u0000\u0000\u0000"+ + "\u0239\u0234\u0001\u0000\u0000\u0000\u023a!\u0001\u0000\u0000\u0000\u023b"+ + "\u023c\u0005@\u0000\u0000\u023c\u023d\u0007\n\u0000\u0000\u023d\u023e"+ + "\u0007\u0013\u0000\u0000\u023e\u023f\u0007\u000b\u0000\u0000\u023f\u024e"+ + "\u0007\n\u0000\u0000\u0240\u0241\u0005@\u0000\u0000\u0241\u0242\u0007"+ + "\n\u0000\u0000\u0242\u0243\u0007\u0013\u0000\u0000\u0243\u0244\u0007\u000b"+ + "\u0000\u0000\u0244\u0245\u0007\n\u0000\u0000\u0245\u0246\u0007\f\u0000"+ + "\u0000\u0246\u024e\u0007\r\u0000\u0000\u0247\u0248\u0005@\u0000\u0000"+ + "\u0248\u0249\u0007\n\u0000\u0000\u0249\u024a\u0007\u0015\u0000\u0000\u024a"+ + "\u024b\u0007\u0018\u0000\u0000\u024b\u024c\u0007\u0007\u0000\u0000\u024c"+ + "\u024e\u0007\u0010\u0000\u0000\u024d\u023b\u0001\u0000\u0000\u0000\u024d"+ + "\u0240\u0001\u0000\u0000\u0000\u024d\u0247\u0001\u0000\u0000\u0000\u024e"+ + "#\u0001\u0000\u0000\u0000\u024f\u0250\u0005@\u0000\u0000\u0250\u0251\u0007"+ + "\u000e\u0000\u0000\u0251\u0252\u0007\u0011\u0000\u0000\u0252\u0253\u0007"+ + "\u000f\u0000\u0000\u0253\u0254\u0007\u0007\u0000\u0000\u0254\u0255\u0007"+ + "\f\u0000\u0000\u0255\u0256\u0007\u000f\u0000\u0000\u0256\u0257\u0007\u0006"+ + "\u0000\u0000\u0257\u025f\u0007\n\u0000\u0000\u0258\u0259\u0005@\u0000"+ + "\u0000\u0259\u025a\u0007\u0017\u0000\u0000\u025a\u025b\u0007\u0012\u0000"+ + "\u0000\u025b\u025c\u0007\n\u0000\u0000\u025c\u025d\u0007\u0005\u0000\u0000"+ + "\u025d\u025f\u0007\u001b\u0000\u0000\u025e\u024f\u0001\u0000\u0000\u0000"+ + "\u025e\u0258\u0001\u0000\u0000\u0000\u025f%\u0001\u0000\u0000\u0000\u0260"+ + "\u0261\u0005@\u0000\u0000\u0261\u0262\u0003\u0006\u0000\u0000\u0262\u0263"+ + "\u0003\f\u0003\u0000\u0263\u026a\u0001\u0000\u0000\u0000\u0264\u0265\u0005"+ + "@\u0000\u0000\u0265\u0266\u0007\u000e\u0000\u0000\u0266\u0267\u0007\u000b"+ + "\u0000\u0000\u0267\u0268\u0007\u0012\u0000\u0000\u0268\u026a\u0007\r\u0000"+ + "\u0000\u0269\u0260\u0001\u0000\u0000\u0000\u0269\u0264\u0001\u0000\u0000"+ + "\u0000\u026a\'\u0001\u0000\u0000\u0000\u026b\u026e\u0003\u000e\u0004\u0000"+ + "\u026c\u026e\u0003\u0010\u0005\u0000\u026d\u026b\u0001\u0000\u0000\u0000"+ + "\u026d\u026c\u0001\u0000\u0000\u0000\u026e)\u0001\u0000\u0000\u0000\u026f"+ + "\u0270\u0005{\u0000\u0000\u0270\u0271\u0005{\u0000\u0000\u0271\u0272\u0001"+ + "\u0000\u0000\u0000\u0272\u0273\u0006\u0012\u0004\u0000\u0273+\u0001\u0000"+ + "\u0000\u0000\u0274\u0275\u0005{\u0000\u0000\u0275\u0276\u0005!\u0000\u0000"+ + "\u0276\u0277\u0005!\u0000\u0000\u0277\u0278\u0001\u0000\u0000\u0000\u0278"+ + "\u0279\u0006\u0013\u0005\u0000\u0279-\u0001\u0000\u0000\u0000\u027a\u027b"+ + "\u0005\'\u0000\u0000\u027b/\u0001\u0000\u0000\u0000\u027c\u027d\u0005"+ + "\"\u0000\u0000\u027d1\u0001\u0000\u0000\u0000\u027e\u0282\u0005<\u0000"+ + "\u0000\u027f\u0281\u0005 \u0000\u0000\u0280\u027f\u0001\u0000\u0000\u0000"+ + "\u0281\u0284\u0001\u0000\u0000\u0000\u0282\u0280\u0001\u0000\u0000\u0000"+ + "\u0282\u0283\u0001\u0000\u0000\u0000\u0283\u0285\u0001\u0000\u0000\u0000"+ + "\u0284\u0282\u0001\u0000\u0000\u0000\u0285\u0289\u0005/\u0000\u0000\u0286"+ + "\u0288\u0005 \u0000\u0000\u0287\u0286\u0001\u0000\u0000\u0000\u0288\u028b"+ + "\u0001\u0000\u0000\u0000\u0289\u0287\u0001\u0000\u0000\u0000\u0289\u028a"+ + "\u0001\u0000\u0000\u0000\u028a\u028c\u0001\u0000\u0000\u0000\u028b\u0289"+ + "\u0001\u0000\u0000\u0000\u028c\u0290\u0007\u0000\u0000\u0000\u028d\u028f"+ + "\u0007\u001c\u0000\u0000\u028e\u028d\u0001\u0000\u0000\u0000\u028f\u0292"+ + "\u0001\u0000\u0000\u0000\u0290\u028e\u0001\u0000\u0000\u0000\u0290\u0291"+ + "\u0001\u0000\u0000\u0000\u0291\u0296\u0001\u0000\u0000\u0000\u0292\u0290"+ + "\u0001\u0000\u0000\u0000\u0293\u0295\u0005 \u0000\u0000\u0294\u0293\u0001"+ + "\u0000\u0000\u0000\u0295\u0298\u0001\u0000\u0000\u0000\u0296\u0294\u0001"+ + "\u0000\u0000\u0000\u0296\u0297\u0001\u0000\u0000\u0000\u0297\u0299\u0001"+ + "\u0000\u0000\u0000\u0298\u0296\u0001\u0000\u0000\u0000\u0299\u02cd\u0005"+ + ">\u0000\u0000\u029a\u029b\u0005<\u0000\u0000\u029b\u029c\u0005/\u0000"+ + "\u0000\u029c\u02a0\u0001\u0000\u0000\u0000\u029d\u029f\u0005 \u0000\u0000"+ + "\u029e\u029d\u0001\u0000\u0000\u0000\u029f\u02a2\u0001\u0000\u0000\u0000"+ + "\u02a0\u029e\u0001\u0000\u0000\u0000\u02a0\u02a1\u0001\u0000\u0000\u0000"+ + "\u02a1\u02c2\u0001\u0000\u0000\u0000\u02a2\u02a0\u0001\u0000\u0000\u0000"+ + "\u02a3\u02a4\u0007\u001d\u0000\u0000\u02a4\u02a5\u0005-\u0000\u0000\u02a5"+ + "\u02a6\u0001\u0000\u0000\u0000\u02a6\u02c3\u0003\n\u0002\u0000\u02a7\u02ac"+ + "\u0003\n\u0002\u0000\u02a8\u02a9\u0005:\u0000\u0000\u02a9\u02aa\u0005"+ + ":\u0000\u0000\u02aa\u02ab\u0001\u0000\u0000\u0000\u02ab\u02ad\u0003\n"+ + "\u0002\u0000\u02ac\u02a8\u0001\u0000\u0000\u0000\u02ad\u02ae\u0001\u0000"+ + "\u0000\u0000\u02ae\u02ac\u0001\u0000\u0000\u0000\u02ae\u02af\u0001\u0000"+ + "\u0000\u0000\u02af\u02c3\u0001\u0000\u0000\u0000\u02b0\u02b1\u0007\u0013"+ + "\u0000\u0000\u02b1\u02b2\u0007\f\u0000\u0000\u02b2\u02b3\u0007\u0016\u0000"+ + "\u0000\u02b3\u02b4\u0007\n\u0000\u0000\u02b4\u02b5\u0007\u0014\u0000\u0000"+ + "\u02b5\u02b6\u0007\f\u0000\u0000\u02b6\u02b7\u0007\u0012\u0000\u0000\u02b7"+ + "\u02b8\u0007\n\u0000\u0000\u02b8\u02b9\u0005:\u0000\u0000\u02b9\u02ba"+ + "\u0001\u0000\u0000\u0000\u02ba\u02bf\u0003\n\u0002\u0000\u02bb\u02bc\u0005"+ + "-\u0000\u0000\u02bc\u02be\u0003\n\u0002\u0000\u02bd\u02bb\u0001\u0000"+ + "\u0000\u0000\u02be\u02c1\u0001\u0000\u0000\u0000\u02bf\u02bd\u0001\u0000"+ + "\u0000\u0000\u02bf\u02c0\u0001\u0000\u0000\u0000\u02c0\u02c3\u0001\u0000"+ + "\u0000\u0000\u02c1\u02bf\u0001\u0000\u0000\u0000\u02c2\u02a3\u0001\u0000"+ + "\u0000\u0000\u02c2\u02a7\u0001\u0000\u0000\u0000\u02c2\u02b0\u0001\u0000"+ + "\u0000\u0000\u02c3\u02c7\u0001\u0000\u0000\u0000\u02c4\u02c6\u0005 \u0000"+ + "\u0000\u02c5\u02c4\u0001\u0000\u0000\u0000\u02c6\u02c9\u0001\u0000\u0000"+ + "\u0000\u02c7\u02c5\u0001\u0000\u0000\u0000\u02c7\u02c8\u0001\u0000\u0000"+ + "\u0000\u02c8\u02ca\u0001\u0000\u0000\u0000\u02c9\u02c7\u0001\u0000\u0000"+ + "\u0000\u02ca\u02cb\u0005>\u0000\u0000\u02cb\u02cd\u0001\u0000\u0000\u0000"+ + "\u02cc\u027e\u0001\u0000\u0000\u0000\u02cc\u029a\u0001\u0000\u0000\u0000"+ + "\u02cd3\u0001\u0000\u0000\u0000\u02ce\u02cf\u0005<\u0000\u0000\u02cf\u02d0"+ + "\u0005!\u0000\u0000\u02d0\u02d1\u0005-\u0000\u0000\u02d1\u02d2\u0005-"+ + "\u0000\u0000\u02d2\u02d6\u0001\u0000\u0000\u0000\u02d3\u02d5\t\u0000\u0000"+ + "\u0000\u02d4\u02d3\u0001\u0000\u0000\u0000\u02d5\u02d8\u0001\u0000\u0000"+ + "\u0000\u02d6\u02d7\u0001\u0000\u0000\u0000\u02d6\u02d4\u0001\u0000\u0000"+ + "\u0000\u02d7\u02d9\u0001\u0000\u0000\u0000\u02d8\u02d6\u0001\u0000\u0000"+ + "\u0000\u02d9\u02da\u0005-\u0000\u0000\u02da\u02db\u0005-\u0000\u0000\u02db"+ + "\u02dc\u0005>\u0000\u0000\u02dc5\u0001\u0000\u0000\u0000\u02dd\u03fb\u0005"+ + "<\u0000\u0000\u02de\u02df\u0007\u0019\u0000\u0000\u02df\u02e0\u0007\f"+ + "\u0000\u0000\u02e0\u03fc\u0007\u0016\u0000\u0000\u02e1\u02e2\u0007\u000b"+ + "\u0000\u0000\u02e2\u02e3\u0007\n\u0000\u0000\u02e3\u02e4\u0007\u000e\u0000"+ + "\u0000\u02e4\u02e5\u0007\u0007\u0000\u0000\u02e5\u02e6\u0007\f\u0000\u0000"+ + "\u02e6\u02e7\u0007\u0011\u0000\u0000\u02e7\u03fc\u0007\u000f\u0000\u0000"+ + "\u02e8\u02e9\u0007\u0015\u0000\u0000\u02e9\u02ea\u0007\u0005\u0000\u0000"+ + "\u02ea\u02eb\u0007\f\u0000\u0000\u02eb\u03fc\u0007\u000f\u0000\u0000\u02ec"+ + "\u02ed\u0007\u0005\u0000\u0000\u02ed\u02ee\u0007\u0012\u0000\u0000\u02ee"+ + "\u02ef\u0007\u0007\u0000\u0000\u02ef\u02f0\u0007\f\u0000\u0000\u02f0\u02f1"+ + "\u0007\u000e\u0000\u0000\u02f1\u02f2\u0007\u0013\u0000\u0000\u02f2\u03fc"+ + "\u0007\n\u0000\u0000\u02f3\u02f4\u0007\b\u0000\u0000\u02f4\u02f5\u0007"+ + "\u0007\u0000\u0000\u02f5\u02f6\u0007\u0015\u0000\u0000\u02f6\u03fc\u0007"+ + "\u0013\u0000\u0000\u02f7\u02f8\u0007\u0007\u0000\u0000\u02f8\u02f9\u0007"+ + "\f\u0000\u0000\u02f9\u02fa\u0007\u0007\u0000\u0000\u02fa\u02fb\u0007\u0013"+ + "\u0000\u0000\u02fb\u03fc\u0007\n\u0000\u0000\u02fc\u02fd\u0007\b\u0000"+ + "\u0000\u02fd\u02fe\u0007\n\u0000\u0000\u02fe\u02ff\u0007\u0005\u0000\u0000"+ + "\u02ff\u03fc\u0007\u0019\u0000\u0000\u0300\u0301\u0007\u000b\u0000\u0000"+ + "\u0301\u0302\u0007\u0007\u0000\u0000\u0302\u0303\u0007\u0010\u0000\u0000"+ + "\u0303\u0304\u0007\u0013\u0000\u0000\u0304\u03fc\u0007\n\u0000\u0000\u0305"+ + "\u0306\u0007\u000b\u0000\u0000\u0306\u0307\u0007\u000e\u0000\u0000\u0307"+ + "\u0308\u0007\u0012\u0000\u0000\u0308\u0309\u0007\f\u0000\u0000\u0309\u030a"+ + "\u0007\u0018\u0000\u0000\u030a\u03fc\u0007\u0007\u0000\u0000\u030b\u030c"+ + "\u0007\r\u0000\u0000\u030c\u030d\u0007\u0011\u0000\u0000\u030d\u030e\u0007"+ + "\u0011\u0000\u0000\u030e\u030f\u0007\u0007\u0000\u0000\u030f\u0310\u0007"+ + "\n\u0000\u0000\u0310\u03fc\u0007\u0012\u0000\u0000\u0311\u0312\u0007\u0018"+ + "\u0000\u0000\u0312\u0313\u0007\u0012\u0000\u0000\u0313\u03fc\u0007\n\u0000"+ + "\u0000\u0314\u0315\u0007\u000e\u0000\u0000\u0315\u0316\u0007\u0011\u0000"+ + "\u0000\u0316\u0317\u0007\u0019\u0000\u0000\u0317\u03fc\u0007\n\u0000\u0000"+ + "\u0318\u0319\u0007\u0017\u0000\u0000\u0319\u031a\u0007\u0013\u0000\u0000"+ + "\u031a\u031b\u0007\u0011\u0000\u0000\u031b\u031c\u0007\u000e\u0000\u0000"+ + "\u031c\u031d\u0007\u001b\u0000\u0000\u031d\u031e\u0007\u001e\u0000\u0000"+ + "\u031e\u031f\u0007\u0006\u0000\u0000\u031f\u0320\u0007\u0011\u0000\u0000"+ + "\u0320\u0321\u0007\u0007\u0000\u0000\u0321\u03fc\u0007\n\u0000\u0000\u0322"+ + "\u0323\u0007\u0019\u0000\u0000\u0323\u03fc\u0007\u0007\u0000\u0000\u0324"+ + "\u0325\u0007\u0019\u0000\u0000\u0325\u03fc\u0007\u0013\u0000\u0000\u0326"+ + "\u0327\u0007\u0016\u0000\u0000\u0327\u0328\u0007\f\u0000\u0000\u0328\u0329"+ + "\u0007\u0019\u0000\u0000\u0329\u032a\u0007\n\u0000\u0000\u032a\u03fc\u0007"+ + "\u0011\u0000\u0000\u032b\u032c\u0007\u0007\u0000\u0000\u032c\u032d\u0007"+ + "\n\u0000\u0000\u032d\u032e\u0007\u0015\u0000\u0000\u032e\u032f\u0007\u0018"+ + "\u0000\u0000\u032f\u0330\u0007\u0013\u0000\u0000\u0330\u0331\u0007\u0005"+ + "\u0000\u0000\u0331\u0332\u0007\u0007\u0000\u0000\u0332\u03fc\u0007\n\u0000"+ + "\u0000\u0333\u0334\u0007\u000b\u0000\u0000\u0334\u0335\u0007\u0018\u0000"+ + "\u0000\u0335\u0336\u0007\u0005\u0000\u0000\u0336\u03fc\u0007\u000f\u0000"+ + "\u0000\u0337\u0338\u0007\u000b\u0000\u0000\u0338\u0339\u0007\u0007\u0000"+ + "\u0000\u0339\u033a\u0007\u0012\u0000\u0000\u033a\u033b\u0007\u0011\u0000"+ + "\u0000\u033b\u033c\u0007\u000f\u0000\u0000\u033c\u03fc\u0007\t\u0000\u0000"+ + "\u033d\u033e\u0007\n\u0000\u0000\u033e\u03fc\u0007\u0015\u0000\u0000\u033f"+ + "\u0340\u0007\u000b\u0000\u0000\u0340\u0341\u0007\u0015\u0000\u0000\u0341"+ + "\u0342\u0007\u0005\u0000\u0000\u0342\u0343\u0007\u0013\u0000\u0000\u0343"+ + "\u03fc\u0007\u0013\u0000\u0000\u0344\u0345\u0007\u000b\u0000\u0000\u0345"+ + "\u0346\u0007\u0006\u0000\u0000\u0346\u03fc\u0007\u0017\u0000\u0000\u0347"+ + "\u0348\u0007\u000b\u0000\u0000\u0348\u0349\u0007\u0006\u0000\u0000\u0349"+ + "\u03fc\u0007\u0018\u0000\u0000\u034a\u034b\u0007\r\u0000\u0000\u034b\u034c"+ + "\u0007\f\u0000\u0000\u034c\u034d\u0007\t\u0000\u0000\u034d\u034e\u0007"+ + "\u0006\u0000\u0000\u034e\u034f\u0007\u0012\u0000\u0000\u034f\u03fc\u0007"+ + "\n\u0000\u0000\u0350\u0351\u0007\u000e\u0000\u0000\u0351\u0352\u0007\u0005"+ + "\u0000\u0000\u0352\u0353\u0007\u000f\u0000\u0000\u0353\u0354\u0007\u0016"+ + "\u0000\u0000\u0354\u0355\u0007\u0005\u0000\u0000\u0355\u03fc\u0007\u000b"+ + "\u0000\u0000\u0356\u0357\u0007\u000b\u0000\u0000\u0357\u0358\u0007\u0016"+ + "\u0000\u0000\u0358\u03fc\u0007\t\u0000\u0000\u0359\u035a\u0007\u0006\u0000"+ + "\u0000\u035a\u035b\u0007\u000b\u0000\u0000\u035b\u03fc\u0007\n\u0000\u0000"+ + "\u035c\u035d\u0007\u0018\u0000\u0000\u035d\u035e\u0007\u0005\u0000\u0000"+ + "\u035e\u035f\u0007\u0007\u0000\u0000\u035f\u03fc\u0007\b\u0000\u0000\u0360"+ + "\u0361\u0007\u0018\u0000\u0000\u0361\u0362\u0007\u0011\u0000\u0000\u0362"+ + "\u0363\u0007\u0013\u0000\u0000\u0363\u0364\u0007\u0010\u0000\u0000\u0364"+ + "\u0365\u0007\t\u0000\u0000\u0365\u0366\u0007\u0011\u0000\u0000\u0366\u03fc"+ + "\u0007\u000f\u0000\u0000\u0367\u0368\u0007\u0018\u0000\u0000\u0368\u0369"+ + "\u0007\f\u0000\u0000\u0369\u036a\u0007\u000e\u0000\u0000\u036a\u036b\u0007"+ + "\u0007\u0000\u0000\u036b\u036c\u0007\u0006\u0000\u0000\u036c\u036d\u0007"+ + "\u0012\u0000\u0000\u036d\u03fc\u0007\n\u0000\u0000\u036e\u036f\u0007\b"+ + "\u0000\u0000\u036f\u0370\u0007\n\u0000\u0000\u0370\u0371\u0007\u0005\u0000"+ + "\u0000\u0371\u0372\u0007\u0019\u0000\u0000\u0372\u0373\u0007\n\u0000\u0000"+ + "\u0373\u03fc\u0007\u0012\u0000\u0000\u0374\u0375\u0007\b\u0000\u0000\u0375"+ + "\u03fc\u0007\u001f\u0000\u0000\u0376\u0377\u0007\u000f\u0000\u0000\u0377"+ + "\u0378\u0007\u0005\u0000\u0000\u0378\u03fc\u0007\u0016\u0000\u0000\u0379"+ + "\u037a\u0007\u0019\u0000\u0000\u037a\u037b\u0007\f\u0000\u0000\u037b\u037c"+ + "\u0007\u0005\u0000\u0000\u037c\u037d\u0007\u0013\u0000\u0000\u037d\u037e"+ + "\u0007\u0011\u0000\u0000\u037e\u03fc\u0007\t\u0000\u0000\u037f\u0380\u0007"+ + "\u000b\u0000\u0000\u0380\u0381\u0007\u0006\u0000\u0000\u0381\u0382\u0007"+ + "\u0015\u0000\u0000\u0382\u0383\u0007\u0015\u0000\u0000\u0383\u0384\u0007"+ + "\u0005\u0000\u0000\u0384\u0385\u0007\u0012\u0000\u0000\u0385\u03fc\u0007"+ + "\u0010\u0000\u0000\u0386\u0387\u0007\u0019\u0000\u0000\u0387\u0388\u0007"+ + "\n\u0000\u0000\u0388\u0389\u0007\u0007\u0000\u0000\u0389\u038a\u0007\u0005"+ + "\u0000\u0000\u038a\u038b\u0007\f\u0000\u0000\u038b\u038c\u0007\u0013\u0000"+ + "\u0000\u038c\u03fc\u0007\u000b\u0000\u0000\u038d\u038e\u0007\u000b\u0000"+ + "\u0000\u038e\u038f\u0007\u0013\u0000\u0000\u038f\u0390\u0007\u0011\u0000"+ + "\u0000\u0390\u03fc\u0007\u0007\u0000\u0000\u0391\u0392\u0007\u0013\u0000"+ + "\u0000\u0392\u0393\u0007\u0005\u0000\u0000\u0393\u0394\u0007\u0017\u0000"+ + "\u0000\u0394\u0395\u0007\n\u0000\u0000\u0395\u03fc\u0007\u0013\u0000\u0000"+ + "\u0396\u0397\u0007\u000b\u0000\u0000\u0397\u0398\u0007\n\u0000\u0000\u0398"+ + "\u0399\u0007\u0013\u0000\u0000\u0399\u039a\u0007\n\u0000\u0000\u039a\u039b"+ + "\u0007\u000e\u0000\u0000\u039b\u03fc\u0007\u0007\u0000\u0000\u039c\u039d"+ + "\u0007\u0011\u0000\u0000\u039d\u039e\u0007\u0018\u0000\u0000\u039e\u039f"+ + "\u0007\u0007\u0000\u0000\u039f\u03a0\u0007\t\u0000\u0000\u03a0\u03a1\u0007"+ + "\u0012\u0000\u0000\u03a1\u03a2\u0007\u0011\u0000\u0000\u03a2\u03a3\u0007"+ + "\u0006\u0000\u0000\u03a3\u03fc\u0007\u0018\u0000\u0000\u03a4\u03a5\u0007"+ + "\u0011\u0000\u0000\u03a5\u03a6\u0007\u0018\u0000\u0000\u03a6\u03a7\u0007"+ + "\u0007\u0000\u0000\u03a7\u03a8\u0007\f\u0000\u0000\u03a8\u03a9\u0007\u0011"+ + "\u0000\u0000\u03a9\u03fc\u0007\u000f\u0000\u0000\u03aa\u03ab\u0007\r\u0000"+ + "\u0000\u03ab\u03ac\u0007\f\u0000\u0000\u03ac\u03ad\u0007\n\u0000\u0000"+ + "\u03ad\u03ae\u0007\u0013\u0000\u0000\u03ae\u03af\u0007\u0019\u0000\u0000"+ + "\u03af\u03b0\u0007\u000b\u0000\u0000\u03b0\u03b1\u0007\n\u0000\u0000\u03b1"+ + "\u03fc\u0007\u0007\u0000\u0000\u03b2\u03b3\u0007\u0007\u0000\u0000\u03b3"+ + "\u03b4\u0007\n\u0000\u0000\u03b4\u03b5\u0007\u001d\u0000\u0000\u03b5\u03b6"+ + "\u0007\u0007\u0000\u0000\u03b6\u03b7\u0007\u0005\u0000\u0000\u03b7\u03b8"+ + "\u0007\u0012\u0000\u0000\u03b8\u03b9\u0007\n\u0000\u0000\u03b9\u03fc\u0007"+ + "\u0005\u0000\u0000\u03ba\u03bb\u0007\u0017\u0000\u0000\u03bb\u03bc\u0007"+ + "\u0006\u0000\u0000\u03bc\u03bd\u0007\u0007\u0000\u0000\u03bd\u03be\u0007"+ + "\u0007\u0000\u0000\u03be\u03bf\u0007\u0011\u0000\u0000\u03bf\u03fc\u0007"+ + "\u000f\u0000\u0000\u03c0\u03c1\u0007\r\u0000\u0000\u03c1\u03c2\u0007\u0011"+ + "\u0000\u0000\u03c2\u03c3\u0007\u0012\u0000\u0000\u03c3\u03fc\u0007\u0015"+ + "\u0000\u0000\u03c4\u03c5\u0007\u000b\u0000\u0000\u03c5\u03c6\u0007\n\u0000"+ + "\u0000\u03c6\u03c7\u0007\u0005\u0000\u0000\u03c7\u03c8\u0007\u0012\u0000"+ + "\u0000\u03c8\u03c9\u0007\u000e\u0000\u0000\u03c9\u03fc\u0007\b\u0000\u0000"+ + "\u03ca\u03cb\u0007\u0006\u0000\u0000\u03cb\u03fc\u0007\u0013\u0000\u0000"+ + "\u03cc\u03cd\u0007\u0011\u0000\u0000\u03cd\u03fc\u0007\u0013\u0000\u0000"+ + "\u03ce\u03cf\u0007\u0013\u0000\u0000\u03cf\u03fc\u0007\f\u0000\u0000\u03d0"+ + "\u03d1\u0007\u0007\u0000\u0000\u03d1\u03d2\u0007\u0005\u0000\u0000\u03d2"+ + "\u03d3\u0007\u0017\u0000\u0000\u03d3\u03d4\u0007\u0013\u0000\u0000\u03d4"+ + "\u03fc\u0007\n\u0000\u0000\u03d5\u03d6\u0007\u0007\u0000\u0000\u03d6\u03fc"+ + "\u0007\u0012\u0000\u0000\u03d7\u03d8\u0007\u0007\u0000\u0000\u03d8\u03fc"+ + "\u0007\u0019\u0000\u0000\u03d9\u03da\u0007\u0007\u0000\u0000\u03da\u03fc"+ + "\u0007\b\u0000\u0000\u03db\u03dc\u0007\u0007\u0000\u0000\u03dc\u03dd\u0007"+ + "\u0017\u0000\u0000\u03dd\u03de\u0007\u0011\u0000\u0000\u03de\u03df\u0007"+ + "\u0019\u0000\u0000\u03df\u03fc\u0007\u0010\u0000\u0000\u03e0\u03e1\u0007"+ + "\u0007\u0000\u0000\u03e1\u03e2\u0007\b\u0000\u0000\u03e2\u03e3\u0007\n"+ + "\u0000\u0000\u03e3\u03e4\u0007\u0005\u0000\u0000\u03e4\u03fc\u0007\u0019"+ + "\u0000\u0000\u03e5\u03e6\u0007\u0007\u0000\u0000\u03e6\u03e7\u0007\r\u0000"+ + "\u0000\u03e7\u03e8\u0007\u0011\u0000\u0000\u03e8\u03e9\u0007\u0011\u0000"+ + "\u0000\u03e9\u03fc\u0007\u0007\u0000\u0000\u03ea\u03eb\u0007\u000e\u0000"+ + "\u0000\u03eb\u03ec\u0007\u0005\u0000\u0000\u03ec\u03ed\u0007\u0018\u0000"+ + "\u0000\u03ed\u03ee\u0007\u0007\u0000\u0000\u03ee\u03ef\u0007\f\u0000\u0000"+ + "\u03ef\u03f0\u0007\u0011\u0000\u0000\u03f0\u03fc\u0007\u000f\u0000\u0000"+ + "\u03f1\u03fc\u0001\u0000\u0000\u0000\u03f2\u03f3\u0007\u0007\u0000\u0000"+ + "\u03f3\u03f4\u0007\f\u0000\u0000\u03f4\u03f5\u0007\u0015\u0000\u0000\u03f5"+ + "\u03fc\u0007\n\u0000\u0000\u03f6\u03fc\u0001\u0000\u0000\u0000\u03f7\u03f8"+ + "\u0007\u0016\u0000\u0000\u03f8\u03f9\u0007\u0005\u0000\u0000\u03f9\u03fc"+ + "\u0007\u0012\u0000\u0000\u03fa\u03fc\u0007 \u0000\u0000\u03fb\u02de\u0001"+ + "\u0000\u0000\u0000\u03fb\u02e1\u0001\u0000\u0000\u0000\u03fb\u02e8\u0001"+ + "\u0000\u0000\u0000\u03fb\u02ec\u0001\u0000\u0000\u0000\u03fb\u02f3\u0001"+ + "\u0000\u0000\u0000\u03fb\u02f7\u0001\u0000\u0000\u0000\u03fb\u02fc\u0001"+ + "\u0000\u0000\u0000\u03fb\u0300\u0001\u0000\u0000\u0000\u03fb\u0305\u0001"+ + "\u0000\u0000\u0000\u03fb\u030b\u0001\u0000\u0000\u0000\u03fb\u0311\u0001"+ + "\u0000\u0000\u0000\u03fb\u0314\u0001\u0000\u0000\u0000\u03fb\u0318\u0001"+ + "\u0000\u0000\u0000\u03fb\u0322\u0001\u0000\u0000\u0000\u03fb\u0324\u0001"+ + "\u0000\u0000\u0000\u03fb\u0326\u0001\u0000\u0000\u0000\u03fb\u032b\u0001"+ + "\u0000\u0000\u0000\u03fb\u0333\u0001\u0000\u0000\u0000\u03fb\u0337\u0001"+ + "\u0000\u0000\u0000\u03fb\u033d\u0001\u0000\u0000\u0000\u03fb\u033f\u0001"+ + "\u0000\u0000\u0000\u03fb\u0344\u0001\u0000\u0000\u0000\u03fb\u0347\u0001"+ + "\u0000\u0000\u0000\u03fb\u034a\u0001\u0000\u0000\u0000\u03fb\u0350\u0001"+ + "\u0000\u0000\u0000\u03fb\u0356\u0001\u0000\u0000\u0000\u03fb\u0359\u0001"+ + "\u0000\u0000\u0000\u03fb\u035c\u0001\u0000\u0000\u0000\u03fb\u0360\u0001"+ + "\u0000\u0000\u0000\u03fb\u0367\u0001\u0000\u0000\u0000\u03fb\u036e\u0001"+ + "\u0000\u0000\u0000\u03fb\u0374\u0001\u0000\u0000\u0000\u03fb\u0376\u0001"+ + "\u0000\u0000\u0000\u03fb\u0379\u0001\u0000\u0000\u0000\u03fb\u037f\u0001"+ + "\u0000\u0000\u0000\u03fb\u0386\u0001\u0000\u0000\u0000\u03fb\u038d\u0001"+ + "\u0000\u0000\u0000\u03fb\u0391\u0001\u0000\u0000\u0000\u03fb\u0396\u0001"+ + "\u0000\u0000\u0000\u03fb\u039c\u0001\u0000\u0000\u0000\u03fb\u03a4\u0001"+ + "\u0000\u0000\u0000\u03fb\u03aa\u0001\u0000\u0000\u0000\u03fb\u03b2\u0001"+ + "\u0000\u0000\u0000\u03fb\u03ba\u0001\u0000\u0000\u0000\u03fb\u03c0\u0001"+ + "\u0000\u0000\u0000\u03fb\u03c4\u0001\u0000\u0000\u0000\u03fb\u03ca\u0001"+ + "\u0000\u0000\u0000\u03fb\u03cc\u0001\u0000\u0000\u0000\u03fb\u03ce\u0001"+ + "\u0000\u0000\u0000\u03fb\u03d0\u0001\u0000\u0000\u0000\u03fb\u03d5\u0001"+ + "\u0000\u0000\u0000\u03fb\u03d7\u0001\u0000\u0000\u0000\u03fb\u03d9\u0001"+ + "\u0000\u0000\u0000\u03fb\u03db\u0001\u0000\u0000\u0000\u03fb\u03e0\u0001"+ + "\u0000\u0000\u0000\u03fb\u03e5\u0001\u0000\u0000\u0000\u03fb\u03ea\u0001"+ + "\u0000\u0000\u0000\u03fb\u03f1\u0001\u0000\u0000\u0000\u03fb\u03f2\u0001"+ + "\u0000\u0000\u0000\u03fb\u03f6\u0001\u0000\u0000\u0000\u03fb\u03f7\u0001"+ + "\u0000\u0000\u0000\u03fb\u03fa\u0001\u0000\u0000\u0000\u03fc\u03fd\u0001"+ + "\u0000\u0000\u0000\u03fd\u03fe\u0004\u0018\u0001\u0000\u03fe7\u0001\u0000"+ + "\u0000\u0000\u03ff\u0414\u0005<\u0000\u0000\u0400\u0401\u0007\f\u0000"+ + "\u0000\u0401\u0402\u0007\u0015\u0000\u0000\u0402\u0415\u0007\t\u0000\u0000"+ + "\u0403\u0404\u0007\f\u0000\u0000\u0404\u0405\u0007\u000f\u0000\u0000\u0405"+ + "\u0406\u0007\u0018\u0000\u0000\u0406\u0407\u0007\u0006\u0000\u0000\u0407"+ + "\u0415\u0007\u0007\u0000\u0000\u0408\u0409\u0007\u0017\u0000\u0000\u0409"+ + "\u0415\u0007\u0012\u0000\u0000\u040a\u040b\u0007\b\u0000\u0000\u040b\u0415"+ + "\u0007\u0012\u0000\u0000\u040c\u040d\u0007\u0013\u0000\u0000\u040d\u040e"+ + "\u0007\f\u0000\u0000\u040e\u040f\u0007\u000f\u0000\u0000\u040f\u0415\u0007"+ + "\u001b\u0000\u0000\u0410\u0411\u0007\u0015\u0000\u0000\u0411\u0412\u0007"+ + "\n\u0000\u0000\u0412\u0413\u0007\u0007\u0000\u0000\u0413\u0415\u0007\u0005"+ + "\u0000\u0000\u0414\u0400\u0001\u0000\u0000\u0000\u0414\u0403\u0001\u0000"+ + "\u0000\u0000\u0414\u0408\u0001\u0000\u0000\u0000\u0414\u040a\u0001\u0000"+ + "\u0000\u0000\u0414\u040c\u0001\u0000\u0000\u0000\u0414\u0410\u0001\u0000"+ + "\u0000\u0000\u04159\u0001\u0000\u0000\u0000\u0416\u0417\u0005<\u0000\u0000"+ + "\u0417\u0418\u0007\u001d\u0000\u0000\u0418\u0419\u0005-\u0000\u0000\u0419"+ + "\u041a\u0001\u0000\u0000\u0000\u041a\u0432\u0003\n\u0002\u0000\u041b\u041c"+ + "\u0005<\u0000\u0000\u041c\u0421\u0003\n\u0002\u0000\u041d\u041e\u0005"+ + ":\u0000\u0000\u041e\u041f\u0005:\u0000\u0000\u041f\u0420\u0001\u0000\u0000"+ + "\u0000\u0420\u0422\u0003\n\u0002\u0000\u0421\u041d\u0001\u0000\u0000\u0000"+ + "\u0422\u0423\u0001\u0000\u0000\u0000\u0423\u0421\u0001\u0000\u0000\u0000"+ + "\u0423\u0424\u0001\u0000\u0000\u0000\u0424\u0432\u0001\u0000\u0000\u0000"+ + "\u0425\u0426\u0005<\u0000\u0000\u0426\u0427\u0007\u0013\u0000\u0000\u0427"+ + "\u0428\u0007\f\u0000\u0000\u0428\u0429\u0007\u0016\u0000\u0000\u0429\u042a"+ + "\u0007\n\u0000\u0000\u042a\u042b\u0007\u0014\u0000\u0000\u042b\u042c\u0007"+ + "\f\u0000\u0000\u042c\u042d\u0007\u0012\u0000\u0000\u042d\u042e\u0007\n"+ + "\u0000\u0000\u042e\u042f\u0005:\u0000\u0000\u042f\u0430\u0001\u0000\u0000"+ + "\u0000\u0430\u0432\u0003\n\u0002\u0000\u0431\u0416\u0001\u0000\u0000\u0000"+ + "\u0431\u041b\u0001\u0000\u0000\u0000\u0431\u0425\u0001\u0000\u0000\u0000"+ + "\u0432;\u0001\u0000\u0000\u0000\u0433\u0434\u0005=\u0000\u0000\u0434="+ + "\u0001\u0000\u0000\u0000\u0435\u0436\u0003\b\u0001\u0000\u0436?\u0001"+ + "\u0000\u0000\u0000\u0437\u0438\u0005/\u0000\u0000\u0438\u0439\u0005>\u0000"+ + "\u0000\u0439A\u0001\u0000\u0000\u0000\u043a\u043b\u0005>\u0000\u0000\u043b"+ + "C\u0001\u0000\u0000\u0000\u043c\u043d\u0005@\u0000\u0000\u043d\u043e\u0007"+ + "\u0018\u0000\u0000\u043e\u043f\u0007\b\u0000\u0000\u043f\u0440\u0007\u0018"+ + "\u0000\u0000\u0440\u0441\u0001\u0000\u0000\u0000\u0441\u0442\u0004\u001f"+ + "\u0002\u0000\u0442\u0443\u0001\u0000\u0000\u0000\u0443\u0444\u0006\u001f"+ + "\u0006\u0000\u0444E\u0001\u0000\u0000\u0000\u0445\u0446\u0005@\u0000\u0000"+ + "\u0446\u0447\u0001\u0000\u0000\u0000\u0447\u0448\u0006 \u0007\u0000\u0448"+ + "G\u0001\u0000\u0000\u0000\u0449\u044b\u0007!\u0000\u0000\u044a\u0449\u0001"+ + "\u0000\u0000\u0000\u044b\u044c\u0001\u0000\u0000\u0000\u044c\u044a\u0001"+ + "\u0000\u0000\u0000\u044c\u044d\u0001\u0000\u0000\u0000\u044dI\u0001\u0000"+ + "\u0000\u0000\u044e\u044f\u0007\"\u0000\u0000\u044fK\u0001\u0000\u0000"+ + "\u0000\u0450\u0451\t\u0000\u0000\u0000\u0451\u0452\u0001\u0000\u0000\u0000"+ + "\u0452\u0453\u0006#\u0007\u0000\u0453M\u0001\u0000\u0000\u0000\u0454\u0455"+ + "\u0005(\u0000\u0000\u0455\u0456\u0006$\b\u0000\u0456O\u0001\u0000\u0000"+ + "\u0000\u0457\u0458\u0005)\u0000\u0000\u0458\u0459\u0006%\t\u0000\u0459"+ + "Q\u0001\u0000\u0000\u0000\u045a\u045b\u0007\"\u0000\u0000\u045b\u045c"+ + "\u0001\u0000\u0000\u0000\u045c\u045d\u0006&\n\u0000\u045dS\u0001\u0000"+ + "\u0000\u0000\u045e\u045f\t\u0000\u0000\u0000\u045f\u0460\u0001\u0000\u0000"+ + "\u0000\u0460\u0461\u0006\'\u0007\u0000\u0461U\u0001\u0000\u0000\u0000"+ + "\u0462\u0463\u0005\u0000\u0000\u0001\u0463\u0464\u0001\u0000\u0000\u0000"+ + "\u0464\u0465\u0006(\u000b\u0000\u0465W\u0001\u0000\u0000\u0000\u0466\u0467"+ + "\u0005(\u0000\u0000\u0467\u0468\u0006)\f\u0000\u0468Y\u0001\u0000\u0000"+ + "\u0000\u0469\u046a\u0005)\u0000\u0000\u046a\u046b\u0006*\r\u0000\u046b"+ + "[\u0001\u0000\u0000\u0000\u046c\u046d\u0005[\u0000\u0000\u046d\u046e\u0006"+ + "+\u000e\u0000\u046e\u046f\u0001\u0000\u0000\u0000\u046f\u0470\u0006+\u0007"+ + "\u0000\u0470]\u0001\u0000\u0000\u0000\u0471\u0472\u0005]\u0000\u0000\u0472"+ + "\u0473\u0006,\u000f\u0000\u0473\u0474\u0001\u0000\u0000\u0000\u0474\u0475"+ + "\u0006,\u0007\u0000\u0475_\u0001\u0000\u0000\u0000\u0476\u0477\u0005{"+ + "\u0000\u0000\u0477\u0478\u0006-\u0010\u0000\u0478\u0479\u0001\u0000\u0000"+ + "\u0000\u0479\u047a\u0006-\u0007\u0000\u047aa\u0001\u0000\u0000\u0000\u047b"+ + "\u047c\u0005}\u0000\u0000\u047c\u047d\u0006.\u0011\u0000\u047d\u047e\u0001"+ + "\u0000\u0000\u0000\u047e\u047f\u0006.\u0007\u0000\u047fc\u0001\u0000\u0000"+ + "\u0000\u0480\u0481\u0005,\u0000\u0000\u0481\u0482\u0006/\u0012\u0000\u0482"+ + "e\u0001\u0000\u0000\u0000\u0483\u0484\u0007\"\u0000\u0000\u0484\u0485"+ + "\u0001\u0000\u0000\u0000\u0485\u0486\u00060\n\u0000\u0486g\u0001\u0000"+ + "\u0000\u0000\u0487\u0488\t\u0000\u0000\u0000\u0488\u0489\u0001\u0000\u0000"+ + "\u0000\u0489\u048a\u00061\u0007\u0000\u048ai\u0001\u0000\u0000\u0000\u048b"+ + "\u048c\u0005\u0000\u0000\u0001\u048c\u048d\u0001\u0000\u0000\u0000\u048d"+ + "\u048e\u00062\u000b\u0000\u048ek\u0001\u0000\u0000\u0000\u048f\u0490\u0005"+ + "@\u0000\u0000\u0490\u0491\u0007\n\u0000\u0000\u0491\u0492\u0007\u000f"+ + "\u0000\u0000\u0492\u0493\u0007\u0019\u0000\u0000\u0493\u0494\u0007\u0018"+ + "\u0000\u0000\u0494\u0495\u0007\b\u0000\u0000\u0495\u0496\u0007\u0018\u0000"+ + "\u0000\u0496\u0497\u0001\u0000\u0000\u0000\u0497\u0498\u00063\u000b\u0000"+ + "\u0498m\u0001\u0000\u0000\u0000\u0499\u049b\b#\u0000\u0000\u049a\u0499"+ + "\u0001\u0000\u0000\u0000\u049b\u049c\u0001\u0000\u0000\u0000\u049c\u049a"+ + "\u0001\u0000\u0000\u0000\u049c\u049d\u0001\u0000\u0000\u0000\u049d\u049e"+ + "\u0001\u0000\u0000\u0000\u049e\u049f\u00064\u0013\u0000\u049fo\u0001\u0000"+ + "\u0000\u0000\u04a0\u04a1\t\u0000\u0000\u0000\u04a1\u04a2\u0001\u0000\u0000"+ + "\u0000\u04a2\u04a3\u00065\u0013\u0000\u04a3q\u0001\u0000\u0000\u0000\u04a4"+ + "\u04a5\u0005}\u0000\u0000\u04a5\u04a6\u0005}\u0000\u0000\u04a6\u04a7\u0001"+ + "\u0000\u0000\u0000\u04a7\u04a8\u00066\u000b\u0000\u04a8s\u0001\u0000\u0000"+ + "\u0000\u04a9\u04aa\t\u0000\u0000\u0000\u04aa\u04ab\u0001\u0000\u0000\u0000"+ + "\u04ab\u04ac\u00067\u0007\u0000\u04acu\u0001\u0000\u0000\u0000\u04ad\u04ae"+ + "\u0005\u0000\u0000\u0001\u04ae\u04af\u0001\u0000\u0000\u0000\u04af\u04b0"+ + "\u00068\u000b\u0000\u04b0w\u0001\u0000\u0000\u0000\u04b1\u04b2\u0005!"+ + "\u0000\u0000\u04b2\u04b3\u0005!\u0000\u0000\u04b3\u04b4\u0005}\u0000\u0000"+ + "\u04b4\u04b5\u0001\u0000\u0000\u0000\u04b5\u04b6\u00069\u000b\u0000\u04b6"+ + "y\u0001\u0000\u0000\u0000\u04b7\u04b8\t\u0000\u0000\u0000\u04b8\u04b9"+ + "\u0001\u0000\u0000\u0000\u04b9\u04ba\u0006:\u0007\u0000\u04ba{\u0001\u0000"+ + "\u0000\u0000\u04bb\u04bc\u0005\u0000\u0000\u0001\u04bc\u04bd\u0001\u0000"+ + "\u0000\u0000\u04bd\u04be\u0006;\u000b\u0000\u04be}\u0001\u0000\u0000\u0000"+ + "2\u0000\u0001\u0002\u0003\u0004\u0005\u0082\u0089\u0090\u0096\u009e\u00a0"+ + "\u00a9\u00ab\u00c5\u00d3\u0130\u013f\u0148\u0156\u015b\u0164\u016a\u0176"+ + "\u01e4\u01fd\u020e\u0239\u024d\u025e\u0269\u026d\u0282\u0289\u0290\u0296"+ + "\u02a0\u02ae\u02bf\u02c2\u02c7\u02cc\u02d6\u03fb\u0414\u0423\u0431\u044a"+ + "\u044c\u049c\u0014\u0007\u0001\u0000\u0005\u0001\u0000\u0007\u0005\u0000"+ + "\u0005\u0002\u0000\u0005\u0004\u0000\u0005\u0005\u0000\u0005\u0003\u0000"+ + "\u0006\u0000\u0000\u0001$\u0000\u0001%\u0001\u0007\u001d\u0000\u0004\u0000"+ + "\u0000\u0001)\u0002\u0001*\u0003\u0001+\u0004\u0001,\u0005\u0001-\u0006"+ + "\u0001.\u0007\u0001/\b\u0007\u0002\u0000"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.g4 new file mode 100644 index 000000000000..7de7b9840ded --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.g4 @@ -0,0 +1,72 @@ +parser grammar BladeAntlrFormatterParser; + +@header{ + package org.netbeans.modules.php.blade.syntax.antlr4.formatter; +} + +options { tokenVocab = BladeAntlrFormatterLexer; } + +file : statement* EOF; + +statement: + html_indent + | block_start + | block_end + | html_tag + | self_closed_tag + | section_block + | inline_identable_element + | block_aligned_directive + | static_element + | nl_with_space_before + | blade_echo + | block_end + | html_close_tag + | (SG_QUOTE | DB_QUOTE) + | INLINE_GT_SYMBOL + | GT_SYMBOL + | (NL | WS) + ; + +inline_tag_statement : + IDENTIFIER EQ IDENTIFIER + | block_start + | block_end + | blade_echo + | D_INLINE_DIRECTIVE + | NON_PARAM_DIRECTIVE + | D_BLOCK_ALIGNED_DIRECTIVE + | IDENTIFIER EQ STRING + | IDENTIFIER + | STRING + | EQ + | WS + | NL + ; + +html_close_tag : HTML_CLOSE_TAG; + +html_indent : (HTML_START_BLOCK_TAG | COMPONENT_TAG) inline_tag_statement* GT_SYMBOL NL WS*; +html_tag : (HTML_START_BLOCK_TAG | COMPONENT_TAG) inline_tag_statement* GT_SYMBOL; +self_closed_tag : HTML_SELF_CLOSE_TAG | ((HTML_START_BLOCK_TAG | COMPONENT_TAG) inline_tag_statement* INLINE_GT_SYMBOL); +block_start : ws_before=nl_with_space_before? block_directive_name D_ARG_LPAREN D_ARG_RPAREN; +block_directive_name : D_BLOCK_DIRECTIVE_START; +block_end : D_BLOCK_DIRECTIVE_END; +block_aligned_directive : D_BLOCK_ALIGNED_DIRECTIVE; +inline_identable_element : D_INLINE_DIRECTIVE | NON_PARAM_DIRECTIVE | section_inline + | blade_echo | D_PHP PHP_CODE+ D_ENDPHP + ; + +section_inline : D_SECTION D_ARG_LPAREN PARAM_COMMA D_ARG_RPAREN; +section_block : section_block_start (statement)+ section_block_end; +section_block_end : D_ENDSECTION; +section_block_start : D_SECTION D_ARG_LPAREN D_ARG_RPAREN; +nl_with_space_before : NL WS*; +nl_with_space : NL WS*; + +static_element : HTML_COMMENT + | HTML + | OTHER; + +blade_echo : (CONTENT_TAG_OPEN CONTENT_TAG_CLOSE) + | (RAW_TAG_OPEN RAW_TAG_CLOSE); \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.java new file mode 100644 index 000000000000..1d08041f2826 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.java @@ -0,0 +1,1683 @@ +// Generated from java-escape by ANTLR 4.11.1 + + package org.netbeans.modules.php.blade.syntax.antlr4.formatter; + +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.misc.*; +import org.antlr.v4.runtime.tree.*; +import java.util.List; +import java.util.Iterator; +import java.util.ArrayList; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +public class BladeAntlrFormatterParser extends Parser { + static { RuntimeMetaData.checkVersion("4.11.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + HTML=1, PHP_CODE=2, PARAM_COMMA=3, PHP_INLINE=4, D_BLOCK_DIRECTIVE_START=5, + D_BLOCK_DIRECTIVE_END=6, D_SECTION=7, D_ENDSECTION=8, D_BLOCK_ALIGNED_DIRECTIVE=9, + NON_PARAM_DIRECTIVE=10, D_INLINE_DIRECTIVE=11, STRING=12, CONTENT_TAG_OPEN=13, + RAW_TAG_OPEN=14, SG_QUOTE=15, DB_QUOTE=16, HTML_CLOSE_TAG=17, HTML_COMMENT=18, + HTML_START_BLOCK_TAG=19, HTML_SELF_CLOSE_TAG=20, COMPONENT_TAG=21, EQ=22, + IDENTIFIER=23, INLINE_GT_SYMBOL=24, GT_SYMBOL=25, D_PHP=26, AT=27, WS=28, + NL=29, OTHER=30, D_ARG_LPAREN=31, D_ARG_RPAREN=32, PHP_EXPR=33, EXIT_EOF=34, + D_ARG_PARAM_LPAREN=35, D_ARG_PARAM_RPAREN=36, BL_SQ_LPAREN=37, BL_SQ_RPAREN=38, + BL_CURLY_LPAREN=39, BL_CURLY_RPAREN=40, D_ARG_COMMA_EL=41, BL_PHP_EXPR=42, + BL_EXIT_EOF=43, D_ENDPHP=44, CONTENT_TAG_CLOSE=45, CONTENT_OTHER=46, EXIT_REGULAR_ECHO_EOF=47, + RAW_TAG_CLOSE=48, RAW_CONTENT_OTHER=49, EXIT_RAW_ECHO_EOF=50; + public static final int + RULE_file = 0, RULE_statement = 1, RULE_inline_tag_statement = 2, RULE_html_close_tag = 3, + RULE_html_indent = 4, RULE_html_tag = 5, RULE_self_closed_tag = 6, RULE_block_start = 7, + RULE_block_directive_name = 8, RULE_block_end = 9, RULE_block_aligned_directive = 10, + RULE_inline_identable_element = 11, RULE_section_inline = 12, RULE_section_block = 13, + RULE_section_block_end = 14, RULE_section_block_start = 15, RULE_nl_with_space_before = 16, + RULE_nl_with_space = 17, RULE_static_element = 18, RULE_blade_echo = 19; + private static String[] makeRuleNames() { + return new String[] { + "file", "statement", "inline_tag_statement", "html_close_tag", "html_indent", + "html_tag", "self_closed_tag", "block_start", "block_directive_name", + "block_end", "block_aligned_directive", "inline_identable_element", "section_inline", + "section_block", "section_block_end", "section_block_start", "nl_with_space_before", + "nl_with_space", "static_element", "blade_echo" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, null, null, null, null, null, null, null, null, + null, "'{{'", "'{!!'", "'''", "'\"'", null, null, null, null, null, "'='", + null, "'/>'", "'>'", null, "'@'", null, null, null, null, null, null, + null, null, null, null, null, null, null, "','", null, null, "'@endphp'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "HTML", "PHP_CODE", "PARAM_COMMA", "PHP_INLINE", "D_BLOCK_DIRECTIVE_START", + "D_BLOCK_DIRECTIVE_END", "D_SECTION", "D_ENDSECTION", "D_BLOCK_ALIGNED_DIRECTIVE", + "NON_PARAM_DIRECTIVE", "D_INLINE_DIRECTIVE", "STRING", "CONTENT_TAG_OPEN", + "RAW_TAG_OPEN", "SG_QUOTE", "DB_QUOTE", "HTML_CLOSE_TAG", "HTML_COMMENT", + "HTML_START_BLOCK_TAG", "HTML_SELF_CLOSE_TAG", "COMPONENT_TAG", "EQ", + "IDENTIFIER", "INLINE_GT_SYMBOL", "GT_SYMBOL", "D_PHP", "AT", "WS", "NL", + "OTHER", "D_ARG_LPAREN", "D_ARG_RPAREN", "PHP_EXPR", "EXIT_EOF", "D_ARG_PARAM_LPAREN", + "D_ARG_PARAM_RPAREN", "BL_SQ_LPAREN", "BL_SQ_RPAREN", "BL_CURLY_LPAREN", + "BL_CURLY_RPAREN", "D_ARG_COMMA_EL", "BL_PHP_EXPR", "BL_EXIT_EOF", "D_ENDPHP", + "CONTENT_TAG_CLOSE", "CONTENT_OTHER", "EXIT_REGULAR_ECHO_EOF", "RAW_TAG_CLOSE", + "RAW_CONTENT_OTHER", "EXIT_RAW_ECHO_EOF" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + @Override + public String getGrammarFileName() { return "java-escape"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public ATN getATN() { return _ATN; } + + public BladeAntlrFormatterParser(TokenStream input) { + super(input); + _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @SuppressWarnings("CheckReturnValue") + public static class FileContext extends ParserRuleContext { + public TerminalNode EOF() { return getToken(BladeAntlrFormatterParser.EOF, 0); } + public List statement() { + return getRuleContexts(StatementContext.class); + } + public StatementContext statement(int i) { + return getRuleContext(StatementContext.class,i); + } + public FileContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_file; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterFile(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitFile(this); + } + } + + public final FileContext file() throws RecognitionException { + FileContext _localctx = new FileContext(_ctx, getState()); + enterRule(_localctx, 0, RULE_file); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(43); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2000678626L) != 0) { + { + { + setState(40); + statement(); + } + } + setState(45); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(46); + match(EOF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StatementContext extends ParserRuleContext { + public Html_indentContext html_indent() { + return getRuleContext(Html_indentContext.class,0); + } + public Block_startContext block_start() { + return getRuleContext(Block_startContext.class,0); + } + public Block_endContext block_end() { + return getRuleContext(Block_endContext.class,0); + } + public Html_tagContext html_tag() { + return getRuleContext(Html_tagContext.class,0); + } + public Self_closed_tagContext self_closed_tag() { + return getRuleContext(Self_closed_tagContext.class,0); + } + public Section_blockContext section_block() { + return getRuleContext(Section_blockContext.class,0); + } + public Inline_identable_elementContext inline_identable_element() { + return getRuleContext(Inline_identable_elementContext.class,0); + } + public Block_aligned_directiveContext block_aligned_directive() { + return getRuleContext(Block_aligned_directiveContext.class,0); + } + public Static_elementContext static_element() { + return getRuleContext(Static_elementContext.class,0); + } + public Nl_with_space_beforeContext nl_with_space_before() { + return getRuleContext(Nl_with_space_beforeContext.class,0); + } + public Blade_echoContext blade_echo() { + return getRuleContext(Blade_echoContext.class,0); + } + public Html_close_tagContext html_close_tag() { + return getRuleContext(Html_close_tagContext.class,0); + } + public TerminalNode SG_QUOTE() { return getToken(BladeAntlrFormatterParser.SG_QUOTE, 0); } + public TerminalNode DB_QUOTE() { return getToken(BladeAntlrFormatterParser.DB_QUOTE, 0); } + public TerminalNode INLINE_GT_SYMBOL() { return getToken(BladeAntlrFormatterParser.INLINE_GT_SYMBOL, 0); } + public TerminalNode GT_SYMBOL() { return getToken(BladeAntlrFormatterParser.GT_SYMBOL, 0); } + public TerminalNode NL() { return getToken(BladeAntlrFormatterParser.NL, 0); } + public TerminalNode WS() { return getToken(BladeAntlrFormatterParser.WS, 0); } + public StatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_statement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitStatement(this); + } + } + + public final StatementContext statement() throws RecognitionException { + StatementContext _localctx = new StatementContext(_ctx, getState()); + enterRule(_localctx, 2, RULE_statement); + int _la; + try { + setState(65); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(48); + html_indent(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(49); + block_start(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(50); + block_end(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(51); + html_tag(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(52); + self_closed_tag(); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(53); + section_block(); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(54); + inline_identable_element(); + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(55); + block_aligned_directive(); + } + break; + case 9: + enterOuterAlt(_localctx, 9); + { + setState(56); + static_element(); + } + break; + case 10: + enterOuterAlt(_localctx, 10); + { + setState(57); + nl_with_space_before(); + } + break; + case 11: + enterOuterAlt(_localctx, 11); + { + setState(58); + blade_echo(); + } + break; + case 12: + enterOuterAlt(_localctx, 12); + { + setState(59); + block_end(); + } + break; + case 13: + enterOuterAlt(_localctx, 13); + { + setState(60); + html_close_tag(); + } + break; + case 14: + enterOuterAlt(_localctx, 14); + { + setState(61); + _la = _input.LA(1); + if ( !(_la==SG_QUOTE || _la==DB_QUOTE) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + case 15: + enterOuterAlt(_localctx, 15); + { + setState(62); + match(INLINE_GT_SYMBOL); + } + break; + case 16: + enterOuterAlt(_localctx, 16); + { + setState(63); + match(GT_SYMBOL); + } + break; + case 17: + enterOuterAlt(_localctx, 17); + { + setState(64); + _la = _input.LA(1); + if ( !(_la==WS || _la==NL) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Inline_tag_statementContext extends ParserRuleContext { + public List IDENTIFIER() { return getTokens(BladeAntlrFormatterParser.IDENTIFIER); } + public TerminalNode IDENTIFIER(int i) { + return getToken(BladeAntlrFormatterParser.IDENTIFIER, i); + } + public TerminalNode EQ() { return getToken(BladeAntlrFormatterParser.EQ, 0); } + public Block_startContext block_start() { + return getRuleContext(Block_startContext.class,0); + } + public Block_endContext block_end() { + return getRuleContext(Block_endContext.class,0); + } + public Blade_echoContext blade_echo() { + return getRuleContext(Blade_echoContext.class,0); + } + public TerminalNode D_INLINE_DIRECTIVE() { return getToken(BladeAntlrFormatterParser.D_INLINE_DIRECTIVE, 0); } + public TerminalNode NON_PARAM_DIRECTIVE() { return getToken(BladeAntlrFormatterParser.NON_PARAM_DIRECTIVE, 0); } + public TerminalNode D_BLOCK_ALIGNED_DIRECTIVE() { return getToken(BladeAntlrFormatterParser.D_BLOCK_ALIGNED_DIRECTIVE, 0); } + public TerminalNode STRING() { return getToken(BladeAntlrFormatterParser.STRING, 0); } + public TerminalNode WS() { return getToken(BladeAntlrFormatterParser.WS, 0); } + public TerminalNode NL() { return getToken(BladeAntlrFormatterParser.NL, 0); } + public Inline_tag_statementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_inline_tag_statement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterInline_tag_statement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitInline_tag_statement(this); + } + } + + public final Inline_tag_statementContext inline_tag_statement() throws RecognitionException { + Inline_tag_statementContext _localctx = new Inline_tag_statementContext(_ctx, getState()); + enterRule(_localctx, 4, RULE_inline_tag_statement); + try { + setState(84); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(67); + match(IDENTIFIER); + setState(68); + match(EQ); + setState(69); + match(IDENTIFIER); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(70); + block_start(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(71); + block_end(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(72); + blade_echo(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(73); + match(D_INLINE_DIRECTIVE); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(74); + match(NON_PARAM_DIRECTIVE); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(75); + match(D_BLOCK_ALIGNED_DIRECTIVE); + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(76); + match(IDENTIFIER); + setState(77); + match(EQ); + setState(78); + match(STRING); + } + break; + case 9: + enterOuterAlt(_localctx, 9); + { + setState(79); + match(IDENTIFIER); + } + break; + case 10: + enterOuterAlt(_localctx, 10); + { + setState(80); + match(STRING); + } + break; + case 11: + enterOuterAlt(_localctx, 11); + { + setState(81); + match(EQ); + } + break; + case 12: + enterOuterAlt(_localctx, 12); + { + setState(82); + match(WS); + } + break; + case 13: + enterOuterAlt(_localctx, 13); + { + setState(83); + match(NL); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Html_close_tagContext extends ParserRuleContext { + public TerminalNode HTML_CLOSE_TAG() { return getToken(BladeAntlrFormatterParser.HTML_CLOSE_TAG, 0); } + public Html_close_tagContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_html_close_tag; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterHtml_close_tag(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitHtml_close_tag(this); + } + } + + public final Html_close_tagContext html_close_tag() throws RecognitionException { + Html_close_tagContext _localctx = new Html_close_tagContext(_ctx, getState()); + enterRule(_localctx, 6, RULE_html_close_tag); + try { + enterOuterAlt(_localctx, 1); + { + setState(86); + match(HTML_CLOSE_TAG); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Html_indentContext extends ParserRuleContext { + public TerminalNode GT_SYMBOL() { return getToken(BladeAntlrFormatterParser.GT_SYMBOL, 0); } + public TerminalNode NL() { return getToken(BladeAntlrFormatterParser.NL, 0); } + public TerminalNode HTML_START_BLOCK_TAG() { return getToken(BladeAntlrFormatterParser.HTML_START_BLOCK_TAG, 0); } + public TerminalNode COMPONENT_TAG() { return getToken(BladeAntlrFormatterParser.COMPONENT_TAG, 0); } + public List inline_tag_statement() { + return getRuleContexts(Inline_tag_statementContext.class); + } + public Inline_tag_statementContext inline_tag_statement(int i) { + return getRuleContext(Inline_tag_statementContext.class,i); + } + public List WS() { return getTokens(BladeAntlrFormatterParser.WS); } + public TerminalNode WS(int i) { + return getToken(BladeAntlrFormatterParser.WS, i); + } + public Html_indentContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_html_indent; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterHtml_indent(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitHtml_indent(this); + } + } + + public final Html_indentContext html_indent() throws RecognitionException { + Html_indentContext _localctx = new Html_indentContext(_ctx, getState()); + enterRule(_localctx, 8, RULE_html_indent); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(88); + _la = _input.LA(1); + if ( !(_la==HTML_START_BLOCK_TAG || _la==COMPONENT_TAG) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(92); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 817921632L) != 0) { + { + { + setState(89); + inline_tag_statement(); + } + } + setState(94); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(95); + match(GT_SYMBOL); + setState(96); + match(NL); + setState(100); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,4,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(97); + match(WS); + } + } + } + setState(102); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,4,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Html_tagContext extends ParserRuleContext { + public TerminalNode GT_SYMBOL() { return getToken(BladeAntlrFormatterParser.GT_SYMBOL, 0); } + public TerminalNode HTML_START_BLOCK_TAG() { return getToken(BladeAntlrFormatterParser.HTML_START_BLOCK_TAG, 0); } + public TerminalNode COMPONENT_TAG() { return getToken(BladeAntlrFormatterParser.COMPONENT_TAG, 0); } + public List inline_tag_statement() { + return getRuleContexts(Inline_tag_statementContext.class); + } + public Inline_tag_statementContext inline_tag_statement(int i) { + return getRuleContext(Inline_tag_statementContext.class,i); + } + public Html_tagContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_html_tag; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterHtml_tag(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitHtml_tag(this); + } + } + + public final Html_tagContext html_tag() throws RecognitionException { + Html_tagContext _localctx = new Html_tagContext(_ctx, getState()); + enterRule(_localctx, 10, RULE_html_tag); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(103); + _la = _input.LA(1); + if ( !(_la==HTML_START_BLOCK_TAG || _la==COMPONENT_TAG) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(107); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 817921632L) != 0) { + { + { + setState(104); + inline_tag_statement(); + } + } + setState(109); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(110); + match(GT_SYMBOL); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Self_closed_tagContext extends ParserRuleContext { + public TerminalNode HTML_SELF_CLOSE_TAG() { return getToken(BladeAntlrFormatterParser.HTML_SELF_CLOSE_TAG, 0); } + public TerminalNode INLINE_GT_SYMBOL() { return getToken(BladeAntlrFormatterParser.INLINE_GT_SYMBOL, 0); } + public TerminalNode HTML_START_BLOCK_TAG() { return getToken(BladeAntlrFormatterParser.HTML_START_BLOCK_TAG, 0); } + public TerminalNode COMPONENT_TAG() { return getToken(BladeAntlrFormatterParser.COMPONENT_TAG, 0); } + public List inline_tag_statement() { + return getRuleContexts(Inline_tag_statementContext.class); + } + public Inline_tag_statementContext inline_tag_statement(int i) { + return getRuleContext(Inline_tag_statementContext.class,i); + } + public Self_closed_tagContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_self_closed_tag; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterSelf_closed_tag(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitSelf_closed_tag(this); + } + } + + public final Self_closed_tagContext self_closed_tag() throws RecognitionException { + Self_closed_tagContext _localctx = new Self_closed_tagContext(_ctx, getState()); + enterRule(_localctx, 12, RULE_self_closed_tag); + int _la; + try { + setState(121); + _errHandler.sync(this); + switch (_input.LA(1)) { + case HTML_SELF_CLOSE_TAG: + enterOuterAlt(_localctx, 1); + { + setState(112); + match(HTML_SELF_CLOSE_TAG); + } + break; + case HTML_START_BLOCK_TAG: + case COMPONENT_TAG: + enterOuterAlt(_localctx, 2); + { + { + setState(113); + _la = _input.LA(1); + if ( !(_la==HTML_START_BLOCK_TAG || _la==COMPONENT_TAG) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(117); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 817921632L) != 0) { + { + { + setState(114); + inline_tag_statement(); + } + } + setState(119); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(120); + match(INLINE_GT_SYMBOL); + } + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Block_startContext extends ParserRuleContext { + public Nl_with_space_beforeContext ws_before; + public Block_directive_nameContext block_directive_name() { + return getRuleContext(Block_directive_nameContext.class,0); + } + public TerminalNode D_ARG_LPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_LPAREN, 0); } + public TerminalNode D_ARG_RPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_RPAREN, 0); } + public Nl_with_space_beforeContext nl_with_space_before() { + return getRuleContext(Nl_with_space_beforeContext.class,0); + } + public Block_startContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_block_start; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterBlock_start(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitBlock_start(this); + } + } + + public final Block_startContext block_start() throws RecognitionException { + Block_startContext _localctx = new Block_startContext(_ctx, getState()); + enterRule(_localctx, 14, RULE_block_start); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(124); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NL) { + { + setState(123); + ((Block_startContext)_localctx).ws_before = nl_with_space_before(); + } + } + + setState(126); + block_directive_name(); + setState(127); + match(D_ARG_LPAREN); + setState(128); + match(D_ARG_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Block_directive_nameContext extends ParserRuleContext { + public TerminalNode D_BLOCK_DIRECTIVE_START() { return getToken(BladeAntlrFormatterParser.D_BLOCK_DIRECTIVE_START, 0); } + public Block_directive_nameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_block_directive_name; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterBlock_directive_name(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitBlock_directive_name(this); + } + } + + public final Block_directive_nameContext block_directive_name() throws RecognitionException { + Block_directive_nameContext _localctx = new Block_directive_nameContext(_ctx, getState()); + enterRule(_localctx, 16, RULE_block_directive_name); + try { + enterOuterAlt(_localctx, 1); + { + setState(130); + match(D_BLOCK_DIRECTIVE_START); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Block_endContext extends ParserRuleContext { + public TerminalNode D_BLOCK_DIRECTIVE_END() { return getToken(BladeAntlrFormatterParser.D_BLOCK_DIRECTIVE_END, 0); } + public Block_endContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_block_end; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterBlock_end(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitBlock_end(this); + } + } + + public final Block_endContext block_end() throws RecognitionException { + Block_endContext _localctx = new Block_endContext(_ctx, getState()); + enterRule(_localctx, 18, RULE_block_end); + try { + enterOuterAlt(_localctx, 1); + { + setState(132); + match(D_BLOCK_DIRECTIVE_END); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Block_aligned_directiveContext extends ParserRuleContext { + public TerminalNode D_BLOCK_ALIGNED_DIRECTIVE() { return getToken(BladeAntlrFormatterParser.D_BLOCK_ALIGNED_DIRECTIVE, 0); } + public Block_aligned_directiveContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_block_aligned_directive; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterBlock_aligned_directive(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitBlock_aligned_directive(this); + } + } + + public final Block_aligned_directiveContext block_aligned_directive() throws RecognitionException { + Block_aligned_directiveContext _localctx = new Block_aligned_directiveContext(_ctx, getState()); + enterRule(_localctx, 20, RULE_block_aligned_directive); + try { + enterOuterAlt(_localctx, 1); + { + setState(134); + match(D_BLOCK_ALIGNED_DIRECTIVE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Inline_identable_elementContext extends ParserRuleContext { + public TerminalNode D_INLINE_DIRECTIVE() { return getToken(BladeAntlrFormatterParser.D_INLINE_DIRECTIVE, 0); } + public TerminalNode NON_PARAM_DIRECTIVE() { return getToken(BladeAntlrFormatterParser.NON_PARAM_DIRECTIVE, 0); } + public Section_inlineContext section_inline() { + return getRuleContext(Section_inlineContext.class,0); + } + public Blade_echoContext blade_echo() { + return getRuleContext(Blade_echoContext.class,0); + } + public TerminalNode D_PHP() { return getToken(BladeAntlrFormatterParser.D_PHP, 0); } + public TerminalNode D_ENDPHP() { return getToken(BladeAntlrFormatterParser.D_ENDPHP, 0); } + public List PHP_CODE() { return getTokens(BladeAntlrFormatterParser.PHP_CODE); } + public TerminalNode PHP_CODE(int i) { + return getToken(BladeAntlrFormatterParser.PHP_CODE, i); + } + public Inline_identable_elementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_inline_identable_element; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterInline_identable_element(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitInline_identable_element(this); + } + } + + public final Inline_identable_elementContext inline_identable_element() throws RecognitionException { + Inline_identable_elementContext _localctx = new Inline_identable_elementContext(_ctx, getState()); + enterRule(_localctx, 22, RULE_inline_identable_element); + int _la; + try { + setState(147); + _errHandler.sync(this); + switch (_input.LA(1)) { + case D_INLINE_DIRECTIVE: + enterOuterAlt(_localctx, 1); + { + setState(136); + match(D_INLINE_DIRECTIVE); + } + break; + case NON_PARAM_DIRECTIVE: + enterOuterAlt(_localctx, 2); + { + setState(137); + match(NON_PARAM_DIRECTIVE); + } + break; + case D_SECTION: + enterOuterAlt(_localctx, 3); + { + setState(138); + section_inline(); + } + break; + case CONTENT_TAG_OPEN: + case RAW_TAG_OPEN: + enterOuterAlt(_localctx, 4); + { + setState(139); + blade_echo(); + } + break; + case D_PHP: + enterOuterAlt(_localctx, 5); + { + setState(140); + match(D_PHP); + setState(142); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(141); + match(PHP_CODE); + } + } + setState(144); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==PHP_CODE ); + setState(146); + match(D_ENDPHP); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Section_inlineContext extends ParserRuleContext { + public TerminalNode D_SECTION() { return getToken(BladeAntlrFormatterParser.D_SECTION, 0); } + public TerminalNode D_ARG_LPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_LPAREN, 0); } + public TerminalNode PARAM_COMMA() { return getToken(BladeAntlrFormatterParser.PARAM_COMMA, 0); } + public TerminalNode D_ARG_RPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_RPAREN, 0); } + public Section_inlineContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_section_inline; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterSection_inline(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitSection_inline(this); + } + } + + public final Section_inlineContext section_inline() throws RecognitionException { + Section_inlineContext _localctx = new Section_inlineContext(_ctx, getState()); + enterRule(_localctx, 24, RULE_section_inline); + try { + enterOuterAlt(_localctx, 1); + { + setState(149); + match(D_SECTION); + setState(150); + match(D_ARG_LPAREN); + setState(151); + match(PARAM_COMMA); + setState(152); + match(D_ARG_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Section_blockContext extends ParserRuleContext { + public Section_block_startContext section_block_start() { + return getRuleContext(Section_block_startContext.class,0); + } + public Section_block_endContext section_block_end() { + return getRuleContext(Section_block_endContext.class,0); + } + public List statement() { + return getRuleContexts(StatementContext.class); + } + public StatementContext statement(int i) { + return getRuleContext(StatementContext.class,i); + } + public Section_blockContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_section_block; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterSection_block(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitSection_block(this); + } + } + + public final Section_blockContext section_block() throws RecognitionException { + Section_blockContext _localctx = new Section_blockContext(_ctx, getState()); + enterRule(_localctx, 26, RULE_section_block); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(154); + section_block_start(); + setState(156); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(155); + statement(); + } + } + setState(158); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( ((_la) & ~0x3f) == 0 && ((1L << _la) & 2000678626L) != 0 ); + setState(160); + section_block_end(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Section_block_endContext extends ParserRuleContext { + public TerminalNode D_ENDSECTION() { return getToken(BladeAntlrFormatterParser.D_ENDSECTION, 0); } + public Section_block_endContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_section_block_end; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterSection_block_end(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitSection_block_end(this); + } + } + + public final Section_block_endContext section_block_end() throws RecognitionException { + Section_block_endContext _localctx = new Section_block_endContext(_ctx, getState()); + enterRule(_localctx, 28, RULE_section_block_end); + try { + enterOuterAlt(_localctx, 1); + { + setState(162); + match(D_ENDSECTION); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Section_block_startContext extends ParserRuleContext { + public TerminalNode D_SECTION() { return getToken(BladeAntlrFormatterParser.D_SECTION, 0); } + public TerminalNode D_ARG_LPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_LPAREN, 0); } + public TerminalNode D_ARG_RPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_RPAREN, 0); } + public Section_block_startContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_section_block_start; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterSection_block_start(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitSection_block_start(this); + } + } + + public final Section_block_startContext section_block_start() throws RecognitionException { + Section_block_startContext _localctx = new Section_block_startContext(_ctx, getState()); + enterRule(_localctx, 30, RULE_section_block_start); + try { + enterOuterAlt(_localctx, 1); + { + setState(164); + match(D_SECTION); + setState(165); + match(D_ARG_LPAREN); + setState(166); + match(D_ARG_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Nl_with_space_beforeContext extends ParserRuleContext { + public TerminalNode NL() { return getToken(BladeAntlrFormatterParser.NL, 0); } + public List WS() { return getTokens(BladeAntlrFormatterParser.WS); } + public TerminalNode WS(int i) { + return getToken(BladeAntlrFormatterParser.WS, i); + } + public Nl_with_space_beforeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_nl_with_space_before; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterNl_with_space_before(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitNl_with_space_before(this); + } + } + + public final Nl_with_space_beforeContext nl_with_space_before() throws RecognitionException { + Nl_with_space_beforeContext _localctx = new Nl_with_space_beforeContext(_ctx, getState()); + enterRule(_localctx, 32, RULE_nl_with_space_before); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(168); + match(NL); + setState(172); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,12,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(169); + match(WS); + } + } + } + setState(174); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,12,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Nl_with_spaceContext extends ParserRuleContext { + public TerminalNode NL() { return getToken(BladeAntlrFormatterParser.NL, 0); } + public List WS() { return getTokens(BladeAntlrFormatterParser.WS); } + public TerminalNode WS(int i) { + return getToken(BladeAntlrFormatterParser.WS, i); + } + public Nl_with_spaceContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_nl_with_space; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterNl_with_space(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitNl_with_space(this); + } + } + + public final Nl_with_spaceContext nl_with_space() throws RecognitionException { + Nl_with_spaceContext _localctx = new Nl_with_spaceContext(_ctx, getState()); + enterRule(_localctx, 34, RULE_nl_with_space); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(175); + match(NL); + setState(179); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==WS) { + { + { + setState(176); + match(WS); + } + } + setState(181); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Static_elementContext extends ParserRuleContext { + public TerminalNode HTML_COMMENT() { return getToken(BladeAntlrFormatterParser.HTML_COMMENT, 0); } + public TerminalNode HTML() { return getToken(BladeAntlrFormatterParser.HTML, 0); } + public TerminalNode OTHER() { return getToken(BladeAntlrFormatterParser.OTHER, 0); } + public Static_elementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_static_element; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterStatic_element(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitStatic_element(this); + } + } + + public final Static_elementContext static_element() throws RecognitionException { + Static_elementContext _localctx = new Static_elementContext(_ctx, getState()); + enterRule(_localctx, 36, RULE_static_element); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(182); + _la = _input.LA(1); + if ( !(((_la) & ~0x3f) == 0 && ((1L << _la) & 1074003970L) != 0) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Blade_echoContext extends ParserRuleContext { + public TerminalNode CONTENT_TAG_OPEN() { return getToken(BladeAntlrFormatterParser.CONTENT_TAG_OPEN, 0); } + public TerminalNode CONTENT_TAG_CLOSE() { return getToken(BladeAntlrFormatterParser.CONTENT_TAG_CLOSE, 0); } + public TerminalNode RAW_TAG_OPEN() { return getToken(BladeAntlrFormatterParser.RAW_TAG_OPEN, 0); } + public TerminalNode RAW_TAG_CLOSE() { return getToken(BladeAntlrFormatterParser.RAW_TAG_CLOSE, 0); } + public Blade_echoContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_blade_echo; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterBlade_echo(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitBlade_echo(this); + } + } + + public final Blade_echoContext blade_echo() throws RecognitionException { + Blade_echoContext _localctx = new Blade_echoContext(_ctx, getState()); + enterRule(_localctx, 38, RULE_blade_echo); + try { + setState(188); + _errHandler.sync(this); + switch (_input.LA(1)) { + case CONTENT_TAG_OPEN: + enterOuterAlt(_localctx, 1); + { + { + setState(184); + match(CONTENT_TAG_OPEN); + setState(185); + match(CONTENT_TAG_CLOSE); + } + } + break; + case RAW_TAG_OPEN: + enterOuterAlt(_localctx, 2); + { + { + setState(186); + match(RAW_TAG_OPEN); + setState(187); + match(RAW_TAG_CLOSE); + } + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static final String _serializedATN = + "\u0004\u00012\u00bf\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ + "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ + "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ + "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"+ + "\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012"+ + "\u0002\u0013\u0007\u0013\u0001\u0000\u0005\u0000*\b\u0000\n\u0000\f\u0000"+ + "-\t\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0003\u0001B\b\u0001\u0001\u0002\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0003\u0002U\b\u0002\u0001\u0003"+ + "\u0001\u0003\u0001\u0004\u0001\u0004\u0005\u0004[\b\u0004\n\u0004\f\u0004"+ + "^\t\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0005\u0004c\b\u0004\n\u0004"+ + "\f\u0004f\t\u0004\u0001\u0005\u0001\u0005\u0005\u0005j\b\u0005\n\u0005"+ + "\f\u0005m\t\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0005\u0006t\b\u0006\n\u0006\f\u0006w\t\u0006\u0001\u0006\u0003"+ + "\u0006z\b\u0006\u0001\u0007\u0003\u0007}\b\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\t\u0001\t\u0001\n\u0001"+ + "\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0004\u000b\u008f\b\u000b\u000b\u000b\f\u000b\u0090\u0001\u000b\u0003"+ + "\u000b\u0094\b\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001"+ + "\r\u0004\r\u009d\b\r\u000b\r\f\r\u009e\u0001\r\u0001\r\u0001\u000e\u0001"+ + "\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001"+ + "\u0010\u0005\u0010\u00ab\b\u0010\n\u0010\f\u0010\u00ae\t\u0010\u0001\u0011"+ + "\u0001\u0011\u0005\u0011\u00b2\b\u0011\n\u0011\f\u0011\u00b5\t\u0011\u0001"+ + "\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0003"+ + "\u0013\u00bd\b\u0013\u0001\u0013\u0000\u0000\u0014\u0000\u0002\u0004\u0006"+ + "\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&\u0000"+ + "\u0004\u0001\u0000\u000f\u0010\u0001\u0000\u001c\u001d\u0002\u0000\u0013"+ + "\u0013\u0015\u0015\u0003\u0000\u0001\u0001\u0012\u0012\u001e\u001e\u00d6"+ + "\u0000+\u0001\u0000\u0000\u0000\u0002A\u0001\u0000\u0000\u0000\u0004T"+ + "\u0001\u0000\u0000\u0000\u0006V\u0001\u0000\u0000\u0000\bX\u0001\u0000"+ + "\u0000\u0000\ng\u0001\u0000\u0000\u0000\fy\u0001\u0000\u0000\u0000\u000e"+ + "|\u0001\u0000\u0000\u0000\u0010\u0082\u0001\u0000\u0000\u0000\u0012\u0084"+ + "\u0001\u0000\u0000\u0000\u0014\u0086\u0001\u0000\u0000\u0000\u0016\u0093"+ + "\u0001\u0000\u0000\u0000\u0018\u0095\u0001\u0000\u0000\u0000\u001a\u009a"+ + "\u0001\u0000\u0000\u0000\u001c\u00a2\u0001\u0000\u0000\u0000\u001e\u00a4"+ + "\u0001\u0000\u0000\u0000 \u00a8\u0001\u0000\u0000\u0000\"\u00af\u0001"+ + "\u0000\u0000\u0000$\u00b6\u0001\u0000\u0000\u0000&\u00bc\u0001\u0000\u0000"+ + "\u0000(*\u0003\u0002\u0001\u0000)(\u0001\u0000\u0000\u0000*-\u0001\u0000"+ + "\u0000\u0000+)\u0001\u0000\u0000\u0000+,\u0001\u0000\u0000\u0000,.\u0001"+ + "\u0000\u0000\u0000-+\u0001\u0000\u0000\u0000./\u0005\u0000\u0000\u0001"+ + "/\u0001\u0001\u0000\u0000\u00000B\u0003\b\u0004\u00001B\u0003\u000e\u0007"+ + "\u00002B\u0003\u0012\t\u00003B\u0003\n\u0005\u00004B\u0003\f\u0006\u0000"+ + "5B\u0003\u001a\r\u00006B\u0003\u0016\u000b\u00007B\u0003\u0014\n\u0000"+ + "8B\u0003$\u0012\u00009B\u0003 \u0010\u0000:B\u0003&\u0013\u0000;B\u0003"+ + "\u0012\t\u0000B\u0005"+ + "\u0018\u0000\u0000?B\u0005\u0019\u0000\u0000@B\u0007\u0001\u0000\u0000"+ + "A0\u0001\u0000\u0000\u0000A1\u0001\u0000\u0000\u0000A2\u0001\u0000\u0000"+ + "\u0000A3\u0001\u0000\u0000\u0000A4\u0001\u0000\u0000\u0000A5\u0001\u0000"+ + "\u0000\u0000A6\u0001\u0000\u0000\u0000A7\u0001\u0000\u0000\u0000A8\u0001"+ + "\u0000\u0000\u0000A9\u0001\u0000\u0000\u0000A:\u0001\u0000\u0000\u0000"+ + "A;\u0001\u0000\u0000\u0000A<\u0001\u0000\u0000\u0000A=\u0001\u0000\u0000"+ + "\u0000A>\u0001\u0000\u0000\u0000A?\u0001\u0000\u0000\u0000A@\u0001\u0000"+ + "\u0000\u0000B\u0003\u0001\u0000\u0000\u0000CD\u0005\u0017\u0000\u0000"+ + "DE\u0005\u0016\u0000\u0000EU\u0005\u0017\u0000\u0000FU\u0003\u000e\u0007"+ + "\u0000GU\u0003\u0012\t\u0000HU\u0003&\u0013\u0000IU\u0005\u000b\u0000"+ + "\u0000JU\u0005\n\u0000\u0000KU\u0005\t\u0000\u0000LM\u0005\u0017\u0000"+ + "\u0000MN\u0005\u0016\u0000\u0000NU\u0005\f\u0000\u0000OU\u0005\u0017\u0000"+ + "\u0000PU\u0005\f\u0000\u0000QU\u0005\u0016\u0000\u0000RU\u0005\u001c\u0000"+ + "\u0000SU\u0005\u001d\u0000\u0000TC\u0001\u0000\u0000\u0000TF\u0001\u0000"+ + "\u0000\u0000TG\u0001\u0000\u0000\u0000TH\u0001\u0000\u0000\u0000TI\u0001"+ + "\u0000\u0000\u0000TJ\u0001\u0000\u0000\u0000TK\u0001\u0000\u0000\u0000"+ + "TL\u0001\u0000\u0000\u0000TO\u0001\u0000\u0000\u0000TP\u0001\u0000\u0000"+ + "\u0000TQ\u0001\u0000\u0000\u0000TR\u0001\u0000\u0000\u0000TS\u0001\u0000"+ + "\u0000\u0000U\u0005\u0001\u0000\u0000\u0000VW\u0005\u0011\u0000\u0000"+ + "W\u0007\u0001\u0000\u0000\u0000X\\\u0007\u0002\u0000\u0000Y[\u0003\u0004"+ + "\u0002\u0000ZY\u0001\u0000\u0000\u0000[^\u0001\u0000\u0000\u0000\\Z\u0001"+ + "\u0000\u0000\u0000\\]\u0001\u0000\u0000\u0000]_\u0001\u0000\u0000\u0000"+ + "^\\\u0001\u0000\u0000\u0000_`\u0005\u0019\u0000\u0000`d\u0005\u001d\u0000"+ + "\u0000ac\u0005\u001c\u0000\u0000ba\u0001\u0000\u0000\u0000cf\u0001\u0000"+ + "\u0000\u0000db\u0001\u0000\u0000\u0000de\u0001\u0000\u0000\u0000e\t\u0001"+ + "\u0000\u0000\u0000fd\u0001\u0000\u0000\u0000gk\u0007\u0002\u0000\u0000"+ + "hj\u0003\u0004\u0002\u0000ih\u0001\u0000\u0000\u0000jm\u0001\u0000\u0000"+ + "\u0000ki\u0001\u0000\u0000\u0000kl\u0001\u0000\u0000\u0000ln\u0001\u0000"+ + "\u0000\u0000mk\u0001\u0000\u0000\u0000no\u0005\u0019\u0000\u0000o\u000b"+ + "\u0001\u0000\u0000\u0000pz\u0005\u0014\u0000\u0000qu\u0007\u0002\u0000"+ + "\u0000rt\u0003\u0004\u0002\u0000sr\u0001\u0000\u0000\u0000tw\u0001\u0000"+ + "\u0000\u0000us\u0001\u0000\u0000\u0000uv\u0001\u0000\u0000\u0000vx\u0001"+ + "\u0000\u0000\u0000wu\u0001\u0000\u0000\u0000xz\u0005\u0018\u0000\u0000"+ + "yp\u0001\u0000\u0000\u0000yq\u0001\u0000\u0000\u0000z\r\u0001\u0000\u0000"+ + "\u0000{}\u0003 \u0010\u0000|{\u0001\u0000\u0000\u0000|}\u0001\u0000\u0000"+ + "\u0000}~\u0001\u0000\u0000\u0000~\u007f\u0003\u0010\b\u0000\u007f\u0080"+ + "\u0005\u001f\u0000\u0000\u0080\u0081\u0005 \u0000\u0000\u0081\u000f\u0001"+ + "\u0000\u0000\u0000\u0082\u0083\u0005\u0005\u0000\u0000\u0083\u0011\u0001"+ + "\u0000\u0000\u0000\u0084\u0085\u0005\u0006\u0000\u0000\u0085\u0013\u0001"+ + "\u0000\u0000\u0000\u0086\u0087\u0005\t\u0000\u0000\u0087\u0015\u0001\u0000"+ + "\u0000\u0000\u0088\u0094\u0005\u000b\u0000\u0000\u0089\u0094\u0005\n\u0000"+ + "\u0000\u008a\u0094\u0003\u0018\f\u0000\u008b\u0094\u0003&\u0013\u0000"+ + "\u008c\u008e\u0005\u001a\u0000\u0000\u008d\u008f\u0005\u0002\u0000\u0000"+ + "\u008e\u008d\u0001\u0000\u0000\u0000\u008f\u0090\u0001\u0000\u0000\u0000"+ + "\u0090\u008e\u0001\u0000\u0000\u0000\u0090\u0091\u0001\u0000\u0000\u0000"+ + "\u0091\u0092\u0001\u0000\u0000\u0000\u0092\u0094\u0005,\u0000\u0000\u0093"+ + "\u0088\u0001\u0000\u0000\u0000\u0093\u0089\u0001\u0000\u0000\u0000\u0093"+ + "\u008a\u0001\u0000\u0000\u0000\u0093\u008b\u0001\u0000\u0000\u0000\u0093"+ + "\u008c\u0001\u0000\u0000\u0000\u0094\u0017\u0001\u0000\u0000\u0000\u0095"+ + "\u0096\u0005\u0007\u0000\u0000\u0096\u0097\u0005\u001f\u0000\u0000\u0097"+ + "\u0098\u0005\u0003\u0000\u0000\u0098\u0099\u0005 \u0000\u0000\u0099\u0019"+ + "\u0001\u0000\u0000\u0000\u009a\u009c\u0003\u001e\u000f\u0000\u009b\u009d"+ + "\u0003\u0002\u0001\u0000\u009c\u009b\u0001\u0000\u0000\u0000\u009d\u009e"+ + "\u0001\u0000\u0000\u0000\u009e\u009c\u0001\u0000\u0000\u0000\u009e\u009f"+ + "\u0001\u0000\u0000\u0000\u009f\u00a0\u0001\u0000\u0000\u0000\u00a0\u00a1"+ + "\u0003\u001c\u000e\u0000\u00a1\u001b\u0001\u0000\u0000\u0000\u00a2\u00a3"+ + "\u0005\b\u0000\u0000\u00a3\u001d\u0001\u0000\u0000\u0000\u00a4\u00a5\u0005"+ + "\u0007\u0000\u0000\u00a5\u00a6\u0005\u001f\u0000\u0000\u00a6\u00a7\u0005"+ + " \u0000\u0000\u00a7\u001f\u0001\u0000\u0000\u0000\u00a8\u00ac\u0005\u001d"+ + "\u0000\u0000\u00a9\u00ab\u0005\u001c\u0000\u0000\u00aa\u00a9\u0001\u0000"+ + "\u0000\u0000\u00ab\u00ae\u0001\u0000\u0000\u0000\u00ac\u00aa\u0001\u0000"+ + "\u0000\u0000\u00ac\u00ad\u0001\u0000\u0000\u0000\u00ad!\u0001\u0000\u0000"+ + "\u0000\u00ae\u00ac\u0001\u0000\u0000\u0000\u00af\u00b3\u0005\u001d\u0000"+ + "\u0000\u00b0\u00b2\u0005\u001c\u0000\u0000\u00b1\u00b0\u0001\u0000\u0000"+ + "\u0000\u00b2\u00b5\u0001\u0000\u0000\u0000\u00b3\u00b1\u0001\u0000\u0000"+ + "\u0000\u00b3\u00b4\u0001\u0000\u0000\u0000\u00b4#\u0001\u0000\u0000\u0000"+ + "\u00b5\u00b3\u0001\u0000\u0000\u0000\u00b6\u00b7\u0007\u0003\u0000\u0000"+ + "\u00b7%\u0001\u0000\u0000\u0000\u00b8\u00b9\u0005\r\u0000\u0000\u00b9"+ + "\u00bd\u0005-\u0000\u0000\u00ba\u00bb\u0005\u000e\u0000\u0000\u00bb\u00bd"+ + "\u00050\u0000\u0000\u00bc\u00b8\u0001\u0000\u0000\u0000\u00bc\u00ba\u0001"+ + "\u0000\u0000\u0000\u00bd\'\u0001\u0000\u0000\u0000\u000f+AT\\dkuy|\u0090"+ + "\u0093\u009e\u00ac\u00b3\u00bc"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserBaseListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserBaseListener.java new file mode 100644 index 000000000000..b7fdeef1bebc --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserBaseListener.java @@ -0,0 +1,282 @@ +// Generated from java-escape by ANTLR 4.11.1 + + package org.netbeans.modules.php.blade.syntax.antlr4.formatter; + + +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.tree.ErrorNode; +import org.antlr.v4.runtime.tree.TerminalNode; + +/** + * This class provides an empty implementation of {@link BladeAntlrFormatterParserListener}, + * which can be extended to create a listener which only needs to handle a subset + * of the available methods. + */ +@SuppressWarnings("CheckReturnValue") +public class BladeAntlrFormatterParserBaseListener implements BladeAntlrFormatterParserListener { + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterFile(BladeAntlrFormatterParser.FileContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitFile(BladeAntlrFormatterParser.FileContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterStatement(BladeAntlrFormatterParser.StatementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitStatement(BladeAntlrFormatterParser.StatementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterInline_tag_statement(BladeAntlrFormatterParser.Inline_tag_statementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitInline_tag_statement(BladeAntlrFormatterParser.Inline_tag_statementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterHtml_close_tag(BladeAntlrFormatterParser.Html_close_tagContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitHtml_close_tag(BladeAntlrFormatterParser.Html_close_tagContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterHtml_indent(BladeAntlrFormatterParser.Html_indentContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitHtml_indent(BladeAntlrFormatterParser.Html_indentContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterHtml_tag(BladeAntlrFormatterParser.Html_tagContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitHtml_tag(BladeAntlrFormatterParser.Html_tagContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSelf_closed_tag(BladeAntlrFormatterParser.Self_closed_tagContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSelf_closed_tag(BladeAntlrFormatterParser.Self_closed_tagContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterBlock_start(BladeAntlrFormatterParser.Block_startContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitBlock_start(BladeAntlrFormatterParser.Block_startContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterBlock_directive_name(BladeAntlrFormatterParser.Block_directive_nameContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitBlock_directive_name(BladeAntlrFormatterParser.Block_directive_nameContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterBlock_end(BladeAntlrFormatterParser.Block_endContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitBlock_end(BladeAntlrFormatterParser.Block_endContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterBlock_aligned_directive(BladeAntlrFormatterParser.Block_aligned_directiveContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitBlock_aligned_directive(BladeAntlrFormatterParser.Block_aligned_directiveContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterInline_identable_element(BladeAntlrFormatterParser.Inline_identable_elementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitInline_identable_element(BladeAntlrFormatterParser.Inline_identable_elementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSection_inline(BladeAntlrFormatterParser.Section_inlineContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSection_inline(BladeAntlrFormatterParser.Section_inlineContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSection_block(BladeAntlrFormatterParser.Section_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSection_block(BladeAntlrFormatterParser.Section_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSection_block_end(BladeAntlrFormatterParser.Section_block_endContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSection_block_end(BladeAntlrFormatterParser.Section_block_endContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSection_block_start(BladeAntlrFormatterParser.Section_block_startContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSection_block_start(BladeAntlrFormatterParser.Section_block_startContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterNl_with_space_before(BladeAntlrFormatterParser.Nl_with_space_beforeContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitNl_with_space_before(BladeAntlrFormatterParser.Nl_with_space_beforeContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterNl_with_space(BladeAntlrFormatterParser.Nl_with_spaceContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitNl_with_space(BladeAntlrFormatterParser.Nl_with_spaceContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterStatic_element(BladeAntlrFormatterParser.Static_elementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitStatic_element(BladeAntlrFormatterParser.Static_elementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterBlade_echo(BladeAntlrFormatterParser.Blade_echoContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitBlade_echo(BladeAntlrFormatterParser.Blade_echoContext ctx) { } + + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void visitTerminal(TerminalNode node) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void visitErrorNode(ErrorNode node) { } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserListener.java new file mode 100644 index 000000000000..340c1cdc50f8 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserListener.java @@ -0,0 +1,212 @@ +// Generated from java-escape by ANTLR 4.11.1 + + package org.netbeans.modules.php.blade.syntax.antlr4.formatter; + +import org.antlr.v4.runtime.tree.ParseTreeListener; + +/** + * This interface defines a complete listener for a parse tree produced by + * {@link BladeAntlrFormatterParser}. + */ +public interface BladeAntlrFormatterParserListener extends ParseTreeListener { + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#file}. + * @param ctx the parse tree + */ + void enterFile(BladeAntlrFormatterParser.FileContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#file}. + * @param ctx the parse tree + */ + void exitFile(BladeAntlrFormatterParser.FileContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#statement}. + * @param ctx the parse tree + */ + void enterStatement(BladeAntlrFormatterParser.StatementContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#statement}. + * @param ctx the parse tree + */ + void exitStatement(BladeAntlrFormatterParser.StatementContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#inline_tag_statement}. + * @param ctx the parse tree + */ + void enterInline_tag_statement(BladeAntlrFormatterParser.Inline_tag_statementContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#inline_tag_statement}. + * @param ctx the parse tree + */ + void exitInline_tag_statement(BladeAntlrFormatterParser.Inline_tag_statementContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#html_close_tag}. + * @param ctx the parse tree + */ + void enterHtml_close_tag(BladeAntlrFormatterParser.Html_close_tagContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#html_close_tag}. + * @param ctx the parse tree + */ + void exitHtml_close_tag(BladeAntlrFormatterParser.Html_close_tagContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#html_indent}. + * @param ctx the parse tree + */ + void enterHtml_indent(BladeAntlrFormatterParser.Html_indentContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#html_indent}. + * @param ctx the parse tree + */ + void exitHtml_indent(BladeAntlrFormatterParser.Html_indentContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#html_tag}. + * @param ctx the parse tree + */ + void enterHtml_tag(BladeAntlrFormatterParser.Html_tagContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#html_tag}. + * @param ctx the parse tree + */ + void exitHtml_tag(BladeAntlrFormatterParser.Html_tagContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#self_closed_tag}. + * @param ctx the parse tree + */ + void enterSelf_closed_tag(BladeAntlrFormatterParser.Self_closed_tagContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#self_closed_tag}. + * @param ctx the parse tree + */ + void exitSelf_closed_tag(BladeAntlrFormatterParser.Self_closed_tagContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#block_start}. + * @param ctx the parse tree + */ + void enterBlock_start(BladeAntlrFormatterParser.Block_startContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#block_start}. + * @param ctx the parse tree + */ + void exitBlock_start(BladeAntlrFormatterParser.Block_startContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#block_directive_name}. + * @param ctx the parse tree + */ + void enterBlock_directive_name(BladeAntlrFormatterParser.Block_directive_nameContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#block_directive_name}. + * @param ctx the parse tree + */ + void exitBlock_directive_name(BladeAntlrFormatterParser.Block_directive_nameContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#block_end}. + * @param ctx the parse tree + */ + void enterBlock_end(BladeAntlrFormatterParser.Block_endContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#block_end}. + * @param ctx the parse tree + */ + void exitBlock_end(BladeAntlrFormatterParser.Block_endContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#block_aligned_directive}. + * @param ctx the parse tree + */ + void enterBlock_aligned_directive(BladeAntlrFormatterParser.Block_aligned_directiveContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#block_aligned_directive}. + * @param ctx the parse tree + */ + void exitBlock_aligned_directive(BladeAntlrFormatterParser.Block_aligned_directiveContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#inline_identable_element}. + * @param ctx the parse tree + */ + void enterInline_identable_element(BladeAntlrFormatterParser.Inline_identable_elementContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#inline_identable_element}. + * @param ctx the parse tree + */ + void exitInline_identable_element(BladeAntlrFormatterParser.Inline_identable_elementContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#section_inline}. + * @param ctx the parse tree + */ + void enterSection_inline(BladeAntlrFormatterParser.Section_inlineContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#section_inline}. + * @param ctx the parse tree + */ + void exitSection_inline(BladeAntlrFormatterParser.Section_inlineContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#section_block}. + * @param ctx the parse tree + */ + void enterSection_block(BladeAntlrFormatterParser.Section_blockContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#section_block}. + * @param ctx the parse tree + */ + void exitSection_block(BladeAntlrFormatterParser.Section_blockContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#section_block_end}. + * @param ctx the parse tree + */ + void enterSection_block_end(BladeAntlrFormatterParser.Section_block_endContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#section_block_end}. + * @param ctx the parse tree + */ + void exitSection_block_end(BladeAntlrFormatterParser.Section_block_endContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#section_block_start}. + * @param ctx the parse tree + */ + void enterSection_block_start(BladeAntlrFormatterParser.Section_block_startContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#section_block_start}. + * @param ctx the parse tree + */ + void exitSection_block_start(BladeAntlrFormatterParser.Section_block_startContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#nl_with_space_before}. + * @param ctx the parse tree + */ + void enterNl_with_space_before(BladeAntlrFormatterParser.Nl_with_space_beforeContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#nl_with_space_before}. + * @param ctx the parse tree + */ + void exitNl_with_space_before(BladeAntlrFormatterParser.Nl_with_space_beforeContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#nl_with_space}. + * @param ctx the parse tree + */ + void enterNl_with_space(BladeAntlrFormatterParser.Nl_with_spaceContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#nl_with_space}. + * @param ctx the parse tree + */ + void exitNl_with_space(BladeAntlrFormatterParser.Nl_with_spaceContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#static_element}. + * @param ctx the parse tree + */ + void enterStatic_element(BladeAntlrFormatterParser.Static_elementContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#static_element}. + * @param ctx the parse tree + */ + void exitStatic_element(BladeAntlrFormatterParser.Static_elementContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#blade_echo}. + * @param ctx the parse tree + */ + void enterBlade_echo(BladeAntlrFormatterParser.Blade_echoContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#blade_echo}. + * @param ctx the parse tree + */ + void exitBlade_echo(BladeAntlrFormatterParser.Blade_echoContext ctx); +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/LexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/LexerAdaptor.java new file mode 100644 index 000000000000..a923d32b2c8c --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/LexerAdaptor.java @@ -0,0 +1,81 @@ +/* +Licensed to the Apache Software Foundation (ASF) + */ +package org.netbeans.modules.php.blade.syntax.antlr4.formatter; + +import org.netbeans.modules.php.blade.syntax.antlr4.v10.*; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.Token; + +/** + * + * @author bogdan + */ +public abstract class LexerAdaptor extends Lexer { + + private int _currentRuleType = Token.INVALID_TYPE; + public int roundParenBalance = 0; + public int squareParenBalance = 0; + public int curlyParenBalance = 0; + public int exitIfModePosition = 0; + + public LexerAdaptor(CharStream input) { + super(input); + } + + public int getCurrentRuleType() { + return _currentRuleType; + } + + public void setCurrentRuleType(int ruleType) { + this._currentRuleType = ruleType; + } + + @Override + public Token emit() { + return super.emit(); + } + + @Override + public void reset() { + setCurrentRuleType(Token.INVALID_TYPE); + super.reset(); + } + + public void consumeDirectiveArgLParen() { + if (this.roundParenBalance == 0) { + this.setType(BladeAntlrFormatterLexer.D_ARG_LPAREN); + } else { + this.skip(); + } + this.roundParenBalance++; + } + + public void consumeDirectiveArgRParen() { + //we start from 0 balance + this.roundParenBalance--; + System.out.println("balance " + this.roundParenBalance); + if (this.roundParenBalance <= 0) { + this.setType(BladeAntlrFormatterLexer.D_ARG_RPAREN); + this.roundParenBalance = 0; + this.mode(DEFAULT_MODE); + } else { + this.skip(); + } + } + + public void consumeBladeParamComma() { + if (this.hasNoBladeParamOpenBracket()) { + this.setType(BladeAntlrFormatterLexer.PARAM_COMMA); + } else { + this.skip(); + } + } + + public boolean hasNoBladeParamOpenBracket() { + return this.roundParenBalance == 1 + && this.squareParenBalance == 0 + && this.curlyParenBalance == 0; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 new file mode 100644 index 000000000000..27a260f73fa7 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 @@ -0,0 +1,264 @@ +lexer grammar BladeAntlrColoringLexer; +import BladeColoringCommonLexer; + +@header{ + package org.netbeans.modules.php.blade.syntax.antlr4.v10; +} + +options { + superClass = ColoringLexerAdaptor; + caseInsensitive = true; + } + +channels {PHP_CODE} + +tokens { + DIRECTIVE, + PHP_EXPRESSION, + BLADE_PHP_ECHO_EXPR, + RAW_TAG, + CONTENT_TAG, + HTML, + HTML_TAG, + ERROR +} + +fragment NekudoWithelistMatch : '::' | '?:' | ' : '; + +fragment DirectivesWithEndTag : 'for' ('each')? | 'if' | 'while' + | 'section' | 'session' | 'once' | 'push' | 'PushOnce' + | 'switch' | 'unless' | 'can' ('any' | 'not')? + | 'auth' | 'guest' + | 'error' | 'production' | 'empty'; + +fragment Include : '@include' ('If' | 'When' | 'First' | 'Unless')?; + +//to remove +fragment DOUBLE_QUOTED_STRING_FRAGMENT_WITH_PHP + : '"' (ESC_DOUBLE_QUOTED_STRING | '{' PhpVariable '}' | . | ~[:])*? '"'; + +fragment ComponentTagIdentifier + : [a-z_\u0080-\ufffe][a-z0-9.:\u0080-\ufffe-]*; + +//?? +fragment SpecialChars : '°'; + +PHP_INLINE : '' | '' | EOF); + +D_GENERIC_BLOCK_DIRECTIVES : ('@' DirectivesWithEndTag | '@sectionMissing' | '@hasSection')->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); + +D_GENERIC_INLINE_DIRECTIVES : ('@elseif' | Include | '@extends' | '@each' | '@yield' | '@props' | '@method' + | '@class' | '@style' | '@aware' | '@break' | '@continue' | '@selected' | '@disabled' | '@readonly' | '@required') (' ')+ {this._input.LA(1) == '('}? ->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); + +D_GENERIC_INLINE_MIXED_DIRECTIVES : ('@break' | '@continue')->type(DIRECTIVE); + +D_GENERIC_END_TAGS : ('@stop' | '@show' | '@overwrite' | '@viteReactRefresh' | '@end' DirectivesWithEndTag)->type(DIRECTIVE); + +//verbatim has special blade escape logic +D_VERBATIM : '@verbatim' ->pushMode(VERBATIM_MODE), type(DIRECTIVE); +D_ENDVERBATIM : '@endverbatim'->type(DIRECTIVE); + +D_MISC : ('@dd' | '@dump' | '@js' | '@json' | '@inject')->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); + +D_SIMPLE : ('@else' | '@csrf' | '@default' | '@append' | '@parent')->type(DIRECTIVE); + +//php emebeddings +D_PHP_SHORT : '@php' (' ')? {this._input.LA(1) == '('}? ->type(D_PHP),pushMode(LOOK_FOR_PHP_EXPRESSION); +D_PHP : '@php'->pushMode(BLADE_INLINE_PHP); + +//allow php expression highlight for custom directives which start with 'end' also +D_END : ('@end' NameString)->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); + +//known plugins +D_LIVEWIRE : ('@livewireStyles' | '@bukStyles' | '@livewireScripts' | '@bukScripts' | '@click' ('.away')? '=')->type(DIRECTIVE); +D_ASSET_BUNDLER : '@vite'->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); + +//we will decide that a custom directive has expression to avoid email matching +D_CUSTOM : ('@' NameString {this._input.LA(1) == '(' || + (this._input.LA(1) == ' ' && this._input.LA(2) == '(')}? ) ->pushMode(LOOK_FOR_PHP_EXPRESSION); + +D_UNKNOWN : '@' NameString; + +//TODO move all known directives to fragment? +//hack to allow completion for directives +//it doesn't trigger completion +D_AT : '@' (' ' | '>' | [\n\r])?; + +//display +CONTENT_TAG_OPEN : '{{' ->pushMode(INSIDE_REGULAR_ECHO),type(CONTENT_TAG); +RAW_TAG_OPEN : '{!!' ->pushMode(INSIDE_RAW_ECHO),type(RAW_TAG); + +CSS_COMMENT : ('/*' .*? '*/' | '//')->type(HTML); + +HTML_X : ('type(HTML),pushMode(INSIDE_HTML_COMPONENT_TAG); + +CLOSE_TAG : ('' [\n\r ]*)+->type(HTML); + +HTML : ((' ')+ | [\r\n]+ | ComponentTagIdentifier | SpecialChars | '"' {this._input.LA(1) != '@'}? | '\\\'' {this._input.LA(1) != '@'}? | '_' | '.' +| ',' | '=' | [()-;]+ | '[' | ']' )* '<' {this._input.LA(1) != 'x' && this._input.LA(1) != '?' && this._input.LA(2) != 'p'}? ->pushMode(INSIDE_HTML_TAG),more; + +HTML_MISC : ((' ')+ | [\r\n]+ | ('#' | '.')? ComponentTagIdentifier | SpecialChars | '"' {this._input.LA(1) != '@'}? +| ',' | '\\\'' | '_' | '.' | '=' | [()-;]+ | '[' | ']' )+->type(HTML); + +HTML_WS : ((' ')+ | [\r\n]+)->type(HTML); + +INCOMPLETE_BLADE_TAG : ('{!' | '{{-') ->type(HTML); + +OTHER : . ->type(HTML); + +mode INSIDE_HTML_TAG; + +OTHER_HTML_POP : . {this._input.LA(1) == '@' || this._input.LA(1) == '{' || (this._input.LA(1) == '<' && (this._input.LA(2) == 'x' || this._input.LA(2) == '?'))}? ->type(HTML_TAG), popMode; + +OTHER_HTML : . ->more; + +HTML_EOF : EOF->type(HTML_TAG),popMode; + +// {{ }} +mode INSIDE_REGULAR_ECHO; + +CONTENT_TAG_CLOSE : ('}}')->popMode,type(CONTENT_TAG); +//hack due to a netbeans php embedding issue when adding or deleting ':' chars +ECHO_DOUBLE_NEKODU : NekudoWithelistMatch {this.consumeEscapedEchoToken();}; +ECHO_STRING_LITERAL : (SINGLE_QUOTED_STRING_FRAGMENT | DOUBLE_QUOTED_STRING_FRAGMENT_WITH_PHP) {this.consumeEscapedEchoToken();}; +ECHO_PHP_FREEZE_SYNTAX : (':)' | ':') ->skip; + +GREEDY_REGULAR_ECHO_EXPR : ~[ ':{}]+ {this.consumeEscapedEchoToken();}; + +ESCAPED_ECHO_EXPR : . [ ]* {this.consumeEscapedEchoToken();}; +EXIT_ECHO_EOF : EOF->type(ERROR),popMode; + +// {!! !!} +mode INSIDE_RAW_ECHO; + +RAW_TAG_CLOSE : ('!!}')->popMode, type(RAW_TAG); +//hack due to a netbeans php embedding issue when adding or deleting ':' chars +RAW_ECHO_DOUBLE_NEKODU : NekudoWithelistMatch {this.consumeNotEscapedEchoToken();}; +RAW_ECHO_STRING_LITERAL : (SINGLE_QUOTED_STRING_FRAGMENT | DOUBLE_QUOTED_STRING_FRAGMENT_WITH_PHP) {this.consumeNotEscapedEchoToken();}; +RAW_ECHO_PHP_FREEZE_SYNTAX : (':)' | ':') ->skip; +RAW_ECHO_EXPR : ~[ ':!{}]+ {this.consumeNotEscapedEchoToken();}; +RAW_ECHO_EXPR_MORE : . [ ]* {this.consumeNotEscapedEchoToken();}; +EXIT_RAW_ECHO_EOF : EOF->type(ERROR),popMode; + +// @directive ()? +mode LOOK_FOR_PHP_EXPRESSION; + +WS_EXPR : [ ]+ {this._input.LA(1) == '('}? ->pushMode(INSIDE_PHP_EXPRESSION); +OPEN_EXPR_PAREN_MORE : '(' {this.increaseRoundParenBalance();} ->more,pushMode(INSIDE_PHP_EXPRESSION); + +AFTER_DIRECTIVE : NameString->type(ERROR), popMode; +L_OTHER : . ->type(ERROR), popMode; + +// @directive (?) +mode INSIDE_PHP_EXPRESSION; + +OPEN_EXPR_PAREN : {this.roundParenBalance == 0}? '(' {this.increaseRoundParenBalance();} {this.consumeExprToken();}; +CLOSE_EXPR_PAREN : {this.roundParenBalance == 1}? ')' + {this.decreaseRoundParenBalance();}->type(PHP_EXPRESSION),mode(DEFAULT_MODE); + +LPAREN : {this.roundParenBalance > 0}? '(' {this.increaseRoundParenBalance();} {this.consumeExprToken();}; +RPAREN : {this.roundParenBalance > 0}? ')' {this.decreaseRoundParenBalance();} {this.consumeExprToken();}; + +//in case of lexer restart context +EXIT_RPAREN : ')' {this.roundParenBalance == 0}?->type(PHP_EXPRESSION),mode(DEFAULT_MODE); + +DB_STRING_OPEN : '"' ->more,pushMode(DB_STRING_MODE); +//hack due to a netbeans php embedding issue when adding or deleting ':' chars + +SHORT_IF_EXPR_ERR : ('?:') {this.testForFreezeCombination();}; + +DOUBLE_NEKODU : ('::') {this.consumeExprToken();}; + + +EXPR_STRING_LITERAL : (SINGLE_QUOTED_STRING_FRAGMENT (' ')*) {this.consumeExprToken();}; + +//STATIC_STRING : //check if start of token ... check if bracket and + +FREEZE_NEKUDO_GREEDY : ':' {this._input.LA(1) != ':'}?->skip; + +FREEZE_NEKUDO : ':'->skip; + +PHP_EXPRESSION_COMMENT : ('/*' .*? '*/')->skip; + +PHP_EXPRESSION_MORE : . {this.consumeExprToken();}; + +EXIT_EOF : EOF->type(ERROR),mode(DEFAULT_MODE); + +// @php +mode BLADE_INLINE_PHP; + +D_ENDPHP : '@endphp'->popMode; + +//hack to merge all php inputs into one token +BLADE_PHP_INLINE : . { + this._input.LA(1) == '@' && + this._input.LA(2) == 'e' && + this._input.LA(3) == 'n' && + this._input.LA(4) == 'd' && + this._input.LA(5) == 'p' && + this._input.LA(6) == 'h' && + this._input.LA(7) == 'p' + }?->channel(PHP_CODE) ; +BLADE_PHP_INLINE_MORE : . ->more; + +EXIT_INLINE_PHP_EOF : EOF->type(ERROR),popMode; + +// @verbatim +mode VERBATIM_MODE; + +D_ENDVERBATIM_IN_MODE : '@endverbatim'->type(DIRECTIVE), popMode; + +//hack to merge all php inputs into one token +VERBATIM_HTML : . { + this._input.LA(1) == '@' && + this._input.LA(2) == 'e' && + this._input.LA(3) == 'n' && + this._input.LA(4) == 'd' && + this._input.LA(5) == 'v' && + this._input.LA(6) == 'e' && + this._input.LA(7) == 'r' + }? ->type(HTML); +VERBATIM_HTML_MORE : . ->more; + +EXIT_VERBATIM_MOD_EOF : EOF->type(ERROR),popMode; + +mode INSIDE_HTML_COMPONENT_TAG; + +COMPONENT_ATTRIBUTE : (':' FullIdentifier '="') ->type(HTML),pushMode(COMPONENT_PHP_EXPRESSION); + +COMPONENT_CONTENT_TAG_OPEN : '{{' ->pushMode(INSIDE_REGULAR_ECHO),type(CONTENT_TAG); +COMPONENT_RAW_TAG_OPEN : '{!!' ->pushMode(INSIDE_RAW_ECHO),type(RAW_TAG); + +EXIT_HTML_COMPONENT : '>'->type(HTML), popMode; + +HTML_COMPONENT_ANY : . ->type(HTML); + +EXIT_HTML_COMPONENT_EOF : EOF->type(ERROR),popMode; + +mode COMPONENT_PHP_EXPRESSION; + +EXIT_COMPONENT_PHP_EXPRESSION : '"'->type(HTML), popMode; +COMPONENT_PHP_EXPRESSION_LAST : . {this._input.LA(1) == '"'}? ->type(PHP_EXPRESSION); +COMPONENT_PHP_EXPRESSION : . ->more; + +EXIT_COMPONENT_PHP_EXPRESSION_EOF : EOF->type(ERROR),popMode; + +mode DB_STRING_MODE; + +DB_STRING_NEKUDO_GREEDY : NekudoWithelistMatch '$'? FullIdentifier '}' ->more; + +DB_STRING_NEKUDO : NekudoWithelistMatch ->more; +//TODO numeric +DB_JSON_PAIR : '{' [\\']? FullIdentifier [\\']? ':'+ [\\']? FullIdentifier? [\\']? (',' ( [\\']? FullIdentifier [\\']? ':'+ [\\']? FullIdentifier [\\']? ))* ','? '}' ->more; + +PHP_INTERCALATED : '{' '$' FullIdentifier ('[' [\\'] FullIdentifier [\\'] ']')* '::' FullIdentifier '}'->more; + +DB_POINT : ('{' '$' FullIdentifier ('[' [\\'] FullIdentifier? [\\'] ']')* (('::'+ FullIdentifier)? (':' FullIdentifier?)+ ) '}' | ':$')->type(ERROR); + +DB_QUOTE_MORE : '\\"'->more; + +DB_QUOTE_EXIT : '"'->more, popMode; + +DB_QUOTE_ANY : . ->more; + +DB_QUOTE_EOF : EOF->type(ERROR),popMode; \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java new file mode 100644 index 000000000000..86836c78400e --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java @@ -0,0 +1,1765 @@ +// Generated from java-escape by ANTLR 4.11.1 + + package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +public class BladeAntlrColoringLexer extends ColoringLexerAdaptor { + static { RuntimeMetaData.checkVersion("4.11.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + DIRECTIVE=1, PHP_EXPRESSION=2, BLADE_PHP_ECHO_EXPR=3, RAW_TAG=4, CONTENT_TAG=5, + HTML=6, HTML_TAG=7, ERROR=8, BLADE_COMMENT=9, PHP_INLINE=10, D_PHP=11, + D_CUSTOM=12, D_UNKNOWN=13, D_AT=14, BLADE_COMMENT_START=15, ECHO_DOUBLE_NEKODU=16, + ECHO_STRING_LITERAL=17, ECHO_PHP_FREEZE_SYNTAX=18, GREEDY_REGULAR_ECHO_EXPR=19, + ESCAPED_ECHO_EXPR=20, RAW_ECHO_DOUBLE_NEKODU=21, RAW_ECHO_STRING_LITERAL=22, + RAW_ECHO_PHP_FREEZE_SYNTAX=23, RAW_ECHO_EXPR=24, RAW_ECHO_EXPR_MORE=25, + WS_EXPR=26, OPEN_EXPR_PAREN=27, LPAREN=28, RPAREN=29, SHORT_IF_EXPR_ERR=30, + DOUBLE_NEKODU=31, EXPR_STRING_LITERAL=32, FREEZE_NEKUDO_GREEDY=33, FREEZE_NEKUDO=34, + PHP_EXPRESSION_COMMENT=35, PHP_EXPRESSION_MORE=36, D_ENDPHP=37, BLADE_PHP_INLINE=38, + BLADE_COMMENT_END=39, D_ENDVERBATIM=40, DB_STRING_OPEN=41, EXIT_HTML_COMPONENT=42, + DB_QUOTE_MORE=43; + public static final int + PHP_CODE=2; + public static final int + INSIDE_HTML_TAG=1, INSIDE_REGULAR_ECHO=2, INSIDE_RAW_ECHO=3, LOOK_FOR_PHP_EXPRESSION=4, + INSIDE_PHP_EXPRESSION=5, BLADE_INLINE_PHP=6, VERBATIM_MODE=7, INSIDE_HTML_COMPONENT_TAG=8, + COMPONENT_PHP_EXPRESSION=9, DB_STRING_MODE=10, INSIDE_BLADE_COMMENT=11; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN", "PHP_CODE" + }; + + public static String[] modeNames = { + "DEFAULT_MODE", "INSIDE_HTML_TAG", "INSIDE_REGULAR_ECHO", "INSIDE_RAW_ECHO", + "LOOK_FOR_PHP_EXPRESSION", "INSIDE_PHP_EXPRESSION", "BLADE_INLINE_PHP", + "VERBATIM_MODE", "INSIDE_HTML_COMPONENT_TAG", "COMPONENT_PHP_EXPRESSION", + "DB_STRING_MODE", "INSIDE_BLADE_COMMENT" + }; + + private static String[] makeRuleNames() { + return new String[] { + "NekudoWithelistMatch", "DirectivesWithEndTag", "Include", "DOUBLE_QUOTED_STRING_FRAGMENT_WITH_PHP", + "ComponentTagIdentifier", "SpecialChars", "PHP_INLINE", "D_GENERIC_BLOCK_DIRECTIVES", + "D_GENERIC_INLINE_DIRECTIVES", "D_GENERIC_INLINE_MIXED_DIRECTIVES", "D_GENERIC_END_TAGS", + "D_VERBATIM", "D_ENDVERBATIM", "D_MISC", "D_SIMPLE", "D_PHP_SHORT", "D_PHP", + "D_END", "D_LIVEWIRE", "D_ASSET_BUNDLER", "D_CUSTOM", "D_UNKNOWN", "D_AT", + "CONTENT_TAG_OPEN", "RAW_TAG_OPEN", "CSS_COMMENT", "HTML_X", "CLOSE_TAG", + "HTML", "HTML_MISC", "HTML_WS", "INCOMPLETE_BLADE_TAG", "OTHER", "NameString", + "BladeLabel", "FullIdentifier", "ESC_DOUBLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING_FRAGMENT", + "SINGLE_QUOTED_STRING_FRAGMENT", "LineComment", "PhpVariable", "PhpKeyword", + "Digit", "BLADE_COMMENT_START", "EMAIL_SUBSTRING", "VERSION_WITH_AT", + "D_ESCAPES", "OTHER_HTML_POP", "OTHER_HTML", "HTML_EOF", "CONTENT_TAG_CLOSE", + "ECHO_DOUBLE_NEKODU", "ECHO_STRING_LITERAL", "ECHO_PHP_FREEZE_SYNTAX", + "GREEDY_REGULAR_ECHO_EXPR", "ESCAPED_ECHO_EXPR", "EXIT_ECHO_EOF", "RAW_TAG_CLOSE", + "RAW_ECHO_DOUBLE_NEKODU", "RAW_ECHO_STRING_LITERAL", "RAW_ECHO_PHP_FREEZE_SYNTAX", + "RAW_ECHO_EXPR", "RAW_ECHO_EXPR_MORE", "EXIT_RAW_ECHO_EOF", "WS_EXPR", + "OPEN_EXPR_PAREN_MORE", "AFTER_DIRECTIVE", "L_OTHER", "OPEN_EXPR_PAREN", + "CLOSE_EXPR_PAREN", "LPAREN", "RPAREN", "EXIT_RPAREN", "DB_STRING_OPEN", + "SHORT_IF_EXPR_ERR", "DOUBLE_NEKODU", "EXPR_STRING_LITERAL", "FREEZE_NEKUDO_GREEDY", + "FREEZE_NEKUDO", "PHP_EXPRESSION_COMMENT", "PHP_EXPRESSION_MORE", "EXIT_EOF", + "D_ENDPHP", "BLADE_PHP_INLINE", "BLADE_PHP_INLINE_MORE", "EXIT_INLINE_PHP_EOF", + "D_ENDVERBATIM_IN_MODE", "VERBATIM_HTML", "VERBATIM_HTML_MORE", "EXIT_VERBATIM_MOD_EOF", + "COMPONENT_ATTRIBUTE", "COMPONENT_CONTENT_TAG_OPEN", "COMPONENT_RAW_TAG_OPEN", + "EXIT_HTML_COMPONENT", "HTML_COMPONENT_ANY", "EXIT_HTML_COMPONENT_EOF", + "EXIT_COMPONENT_PHP_EXPRESSION", "COMPONENT_PHP_EXPRESSION_LAST", "COMPONENT_PHP_EXPRESSION", + "EXIT_COMPONENT_PHP_EXPRESSION_EOF", "DB_STRING_NEKUDO_GREEDY", "DB_STRING_NEKUDO", + "DB_JSON_PAIR", "PHP_INTERCALATED", "DB_POINT", "DB_QUOTE_MORE", "DB_QUOTE_EXIT", + "DB_QUOTE_ANY", "DB_QUOTE_EOF", "BLADE_COMMENT_END", "BLADE_COMMENT_PEEK", + "BLADE_COMMENT_MORE", "BLADE_COMMENT_EOF" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, null, null, null, null, null, null, null, "'@php'", + null, null, null, "'{{--'", null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, "':'", + null, null, "'@endphp'", null, "'--}}'", null, null, "'>'", "'\\\"'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "DIRECTIVE", "PHP_EXPRESSION", "BLADE_PHP_ECHO_EXPR", "RAW_TAG", + "CONTENT_TAG", "HTML", "HTML_TAG", "ERROR", "BLADE_COMMENT", "PHP_INLINE", + "D_PHP", "D_CUSTOM", "D_UNKNOWN", "D_AT", "BLADE_COMMENT_START", "ECHO_DOUBLE_NEKODU", + "ECHO_STRING_LITERAL", "ECHO_PHP_FREEZE_SYNTAX", "GREEDY_REGULAR_ECHO_EXPR", + "ESCAPED_ECHO_EXPR", "RAW_ECHO_DOUBLE_NEKODU", "RAW_ECHO_STRING_LITERAL", + "RAW_ECHO_PHP_FREEZE_SYNTAX", "RAW_ECHO_EXPR", "RAW_ECHO_EXPR_MORE", + "WS_EXPR", "OPEN_EXPR_PAREN", "LPAREN", "RPAREN", "SHORT_IF_EXPR_ERR", + "DOUBLE_NEKODU", "EXPR_STRING_LITERAL", "FREEZE_NEKUDO_GREEDY", "FREEZE_NEKUDO", + "PHP_EXPRESSION_COMMENT", "PHP_EXPRESSION_MORE", "D_ENDPHP", "BLADE_PHP_INLINE", + "BLADE_COMMENT_END", "D_ENDVERBATIM", "DB_STRING_OPEN", "EXIT_HTML_COMPONENT", + "DB_QUOTE_MORE" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + + public BladeAntlrColoringLexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "BladeAntlrColoringLexer.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public String[] getChannelNames() { return channelNames; } + + @Override + public String[] getModeNames() { return modeNames; } + + @Override + public ATN getATN() { return _ATN; } + + @Override + public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { + switch (ruleIndex) { + case 51: + ECHO_DOUBLE_NEKODU_action((RuleContext)_localctx, actionIndex); + break; + case 52: + ECHO_STRING_LITERAL_action((RuleContext)_localctx, actionIndex); + break; + case 54: + GREEDY_REGULAR_ECHO_EXPR_action((RuleContext)_localctx, actionIndex); + break; + case 55: + ESCAPED_ECHO_EXPR_action((RuleContext)_localctx, actionIndex); + break; + case 58: + RAW_ECHO_DOUBLE_NEKODU_action((RuleContext)_localctx, actionIndex); + break; + case 59: + RAW_ECHO_STRING_LITERAL_action((RuleContext)_localctx, actionIndex); + break; + case 61: + RAW_ECHO_EXPR_action((RuleContext)_localctx, actionIndex); + break; + case 62: + RAW_ECHO_EXPR_MORE_action((RuleContext)_localctx, actionIndex); + break; + case 65: + OPEN_EXPR_PAREN_MORE_action((RuleContext)_localctx, actionIndex); + break; + case 68: + OPEN_EXPR_PAREN_action((RuleContext)_localctx, actionIndex); + break; + case 69: + CLOSE_EXPR_PAREN_action((RuleContext)_localctx, actionIndex); + break; + case 70: + LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 71: + RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 74: + SHORT_IF_EXPR_ERR_action((RuleContext)_localctx, actionIndex); + break; + case 75: + DOUBLE_NEKODU_action((RuleContext)_localctx, actionIndex); + break; + case 76: + EXPR_STRING_LITERAL_action((RuleContext)_localctx, actionIndex); + break; + case 80: + PHP_EXPRESSION_MORE_action((RuleContext)_localctx, actionIndex); + break; + } + } + private void ECHO_DOUBLE_NEKODU_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 0: + this.consumeEscapedEchoToken(); + break; + } + } + private void ECHO_STRING_LITERAL_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 1: + this.consumeEscapedEchoToken(); + break; + } + } + private void GREEDY_REGULAR_ECHO_EXPR_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 2: + this.consumeEscapedEchoToken(); + break; + } + } + private void ESCAPED_ECHO_EXPR_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 3: + this.consumeEscapedEchoToken(); + break; + } + } + private void RAW_ECHO_DOUBLE_NEKODU_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 4: + this.consumeNotEscapedEchoToken(); + break; + } + } + private void RAW_ECHO_STRING_LITERAL_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 5: + this.consumeNotEscapedEchoToken(); + break; + } + } + private void RAW_ECHO_EXPR_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 6: + this.consumeNotEscapedEchoToken(); + break; + } + } + private void RAW_ECHO_EXPR_MORE_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 7: + this.consumeNotEscapedEchoToken(); + break; + } + } + private void OPEN_EXPR_PAREN_MORE_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 8: + this.increaseRoundParenBalance(); + break; + } + } + private void OPEN_EXPR_PAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 9: + this.increaseRoundParenBalance(); + break; + case 10: + this.consumeExprToken(); + break; + } + } + private void CLOSE_EXPR_PAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 11: + this.decreaseRoundParenBalance(); + break; + } + } + private void LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 12: + this.increaseRoundParenBalance(); + break; + case 13: + this.consumeExprToken(); + break; + } + } + private void RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 14: + this.decreaseRoundParenBalance(); + break; + case 15: + this.consumeExprToken(); + break; + } + } + private void SHORT_IF_EXPR_ERR_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 16: + this.testForFreezeCombination(); + break; + } + } + private void DOUBLE_NEKODU_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 17: + this.consumeExprToken(); + break; + } + } + private void EXPR_STRING_LITERAL_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 18: + this.consumeExprToken(); + break; + } + } + private void PHP_EXPRESSION_MORE_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 19: + this.consumeExprToken(); + break; + } + } + @Override + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { + switch (ruleIndex) { + case 8: + return D_GENERIC_INLINE_DIRECTIVES_sempred((RuleContext)_localctx, predIndex); + case 15: + return D_PHP_SHORT_sempred((RuleContext)_localctx, predIndex); + case 20: + return D_CUSTOM_sempred((RuleContext)_localctx, predIndex); + case 28: + return HTML_sempred((RuleContext)_localctx, predIndex); + case 29: + return HTML_MISC_sempred((RuleContext)_localctx, predIndex); + case 47: + return OTHER_HTML_POP_sempred((RuleContext)_localctx, predIndex); + case 64: + return WS_EXPR_sempred((RuleContext)_localctx, predIndex); + case 68: + return OPEN_EXPR_PAREN_sempred((RuleContext)_localctx, predIndex); + case 69: + return CLOSE_EXPR_PAREN_sempred((RuleContext)_localctx, predIndex); + case 70: + return LPAREN_sempred((RuleContext)_localctx, predIndex); + case 71: + return RPAREN_sempred((RuleContext)_localctx, predIndex); + case 72: + return EXIT_RPAREN_sempred((RuleContext)_localctx, predIndex); + case 77: + return FREEZE_NEKUDO_GREEDY_sempred((RuleContext)_localctx, predIndex); + case 83: + return BLADE_PHP_INLINE_sempred((RuleContext)_localctx, predIndex); + case 87: + return VERBATIM_HTML_sempred((RuleContext)_localctx, predIndex); + case 97: + return COMPONENT_PHP_EXPRESSION_LAST_sempred((RuleContext)_localctx, predIndex); + case 110: + return BLADE_COMMENT_PEEK_sempred((RuleContext)_localctx, predIndex); + } + return true; + } + private boolean D_GENERIC_INLINE_DIRECTIVES_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 0: + return this._input.LA(1) == '('; + } + return true; + } + private boolean D_PHP_SHORT_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 1: + return this._input.LA(1) == '('; + } + return true; + } + private boolean D_CUSTOM_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 2: + return this._input.LA(1) == '(' || + (this._input.LA(1) == ' ' && this._input.LA(2) == '('); + } + return true; + } + private boolean HTML_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 3: + return this._input.LA(1) != '@'; + case 4: + return this._input.LA(1) != '@'; + case 5: + return this._input.LA(1) != 'x' && this._input.LA(1) != '?' && this._input.LA(2) != 'p'; + } + return true; + } + private boolean HTML_MISC_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 6: + return this._input.LA(1) != '@'; + } + return true; + } + private boolean OTHER_HTML_POP_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 7: + return this._input.LA(1) == '@' || this._input.LA(1) == '{' || (this._input.LA(1) == '<' && (this._input.LA(2) == 'x' || this._input.LA(2) == '?')); + } + return true; + } + private boolean WS_EXPR_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 8: + return this._input.LA(1) == '('; + } + return true; + } + private boolean OPEN_EXPR_PAREN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 9: + return this.roundParenBalance == 0; + } + return true; + } + private boolean CLOSE_EXPR_PAREN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 10: + return this.roundParenBalance == 1; + } + return true; + } + private boolean LPAREN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 11: + return this.roundParenBalance > 0; + } + return true; + } + private boolean RPAREN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 12: + return this.roundParenBalance > 0; + } + return true; + } + private boolean EXIT_RPAREN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 13: + return this.roundParenBalance == 0; + } + return true; + } + private boolean FREEZE_NEKUDO_GREEDY_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 14: + return this._input.LA(1) != ':'; + } + return true; + } + private boolean BLADE_PHP_INLINE_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 15: + return + this._input.LA(1) == '@' && + this._input.LA(2) == 'e' && + this._input.LA(3) == 'n' && + this._input.LA(4) == 'd' && + this._input.LA(5) == 'p' && + this._input.LA(6) == 'h' && + this._input.LA(7) == 'p' + ; + } + return true; + } + private boolean VERBATIM_HTML_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 16: + return + this._input.LA(1) == '@' && + this._input.LA(2) == 'e' && + this._input.LA(3) == 'n' && + this._input.LA(4) == 'd' && + this._input.LA(5) == 'v' && + this._input.LA(6) == 'e' && + this._input.LA(7) == 'r' + ; + } + return true; + } + private boolean COMPONENT_PHP_EXPRESSION_LAST_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 17: + return this._input.LA(1) == '"'; + } + return true; + } + private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 18: + return + this._input.LA(1) == '-' && + this._input.LA(2) == '-' && + this._input.LA(3) == '}' && + this._input.LA(4) == '}' + ; + } + return true; + } + + public static final String _serializedATN = + "\u0004\u0000+\u0735\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ + "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ + "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ + "\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ + "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ + "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ + "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"+ + "\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012"+ + "\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015"+ + "\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018"+ + "\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007\u001b"+ + "\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007\u001e"+ + "\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002"+ + "#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002"+ + "(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002"+ + "-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u00071\u0002"+ + "2\u00072\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u00076\u0002"+ + "7\u00077\u00028\u00078\u00029\u00079\u0002:\u0007:\u0002;\u0007;\u0002"+ + "<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007?\u0002@\u0007@\u0002"+ + "A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007D\u0002E\u0007E\u0002"+ + "F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007I\u0002J\u0007J\u0002"+ + "K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007N\u0002O\u0007O\u0002"+ + "P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007S\u0002T\u0007T\u0002"+ + "U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007X\u0002Y\u0007Y\u0002"+ + "Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007]\u0002^\u0007^\u0002"+ + "_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002b\u0007b\u0002c\u0007c\u0002"+ + "d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002g\u0007g\u0002h\u0007h\u0002"+ + "i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002l\u0007l\u0002m\u0007m\u0002"+ + "n\u0007n\u0002o\u0007o\u0002p\u0007p\u0001\u0000\u0001\u0000\u0001\u0000"+ + "\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0003\u0000\u00f6\b\u0000"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0003\u0001\u0100\b\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u013d\b\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u015c\b\u0001"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0003\u0002\u0178\b\u0002\u0001\u0003\u0001\u0003"+ + "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ + "\u0005\u0003\u0182\b\u0003\n\u0003\f\u0003\u0185\t\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0004\u0001\u0004\u0005\u0004\u018b\b\u0004\n\u0004\f\u0004"+ + "\u018e\t\u0004\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006"+ + "\u0001\u0006\u0001\u0006\u0005\u0006\u0197\b\u0006\n\u0006\f\u0006\u019a"+ + "\t\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0005\u0006\u01a5\b\u0006\n"+ + "\u0006\f\u0006\u01a8\t\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003"+ + "\u0006\u01ad\b\u0006\u0003\u0006\u01af\b\u0006\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0003\u0007\u01cd\b\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0003\b\u023f\b\b\u0001\b\u0004\b\u0242\b\b\u000b\b"+ + "\f\b\u0243\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0003\t\u025a\b\t\u0001\t\u0001\t\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0003\n\u0289\b\n\u0001\n\u0001"+ + "\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0003\r\u02c0\b\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000e\u0001\u000e\u0003\u000e\u02e5\b\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0003"+ + "\u000f\u02ef\b\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ + "\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u0347\b\u0012\u0001"+ + "\u0012\u0003\u0012\u034a\b\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001"+ + "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ + "\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ + "\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001"+ + "\u0016\u0003\u0016\u0362\b\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001"+ + "\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0001\u0019\u0005\u0019\u0375\b\u0019\n\u0019\f\u0019\u0378\t\u0019"+ + "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0003\u0019\u037e\b\u0019"+ + "\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001a\u0004\u001a\u038d\b\u001a\u000b\u001a\f\u001a\u038e\u0003"+ + "\u001a\u0391\b\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001"+ + "\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0005\u001b\u039c"+ + "\b\u001b\n\u001b\f\u001b\u039f\t\u001b\u0004\u001b\u03a1\b\u001b\u000b"+ + "\u001b\f\u001b\u03a2\u0001\u001b\u0001\u001b\u0001\u001c\u0004\u001c\u03a8"+ + "\b\u001c\u000b\u001c\f\u001c\u03a9\u0001\u001c\u0004\u001c\u03ad\b\u001c"+ + "\u000b\u001c\f\u001c\u03ae\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ + "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ + "\u0004\u001c\u03bb\b\u001c\u000b\u001c\f\u001c\u03bc\u0001\u001c\u0005"+ + "\u001c\u03c0\b\u001c\n\u001c\f\u001c\u03c3\t\u001c\u0001\u001c\u0001\u001c"+ + "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0004\u001d"+ + "\u03cc\b\u001d\u000b\u001d\f\u001d\u03cd\u0001\u001d\u0004\u001d\u03d1"+ + "\b\u001d\u000b\u001d\f\u001d\u03d2\u0001\u001d\u0003\u001d\u03d6\b\u001d"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0004\u001d\u03e1\b\u001d\u000b\u001d"+ + "\f\u001d\u03e2\u0001\u001d\u0004\u001d\u03e6\b\u001d\u000b\u001d\f\u001d"+ + "\u03e7\u0001\u001d\u0001\u001d\u0001\u001e\u0004\u001e\u03ed\b\u001e\u000b"+ + "\u001e\f\u001e\u03ee\u0001\u001e\u0004\u001e\u03f2\b\u001e\u000b\u001e"+ + "\f\u001e\u03f3\u0003\u001e\u03f6\b\u001e\u0001\u001e\u0001\u001e\u0001"+ + "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0003\u001f\u03ff"+ + "\b\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001!\u0001"+ + "!\u0005!\u0409\b!\n!\f!\u040c\t!\u0001\"\u0001\"\u0005\"\u0410\b\"\n\""+ + "\f\"\u0413\t\"\u0001#\u0001#\u0005#\u0417\b#\n#\f#\u041a\t#\u0001$\u0001"+ + "$\u0001%\u0001%\u0001%\u0005%\u0421\b%\n%\f%\u0424\t%\u0001%\u0001%\u0001"+ + "&\u0001&\u0001&\u0001&\u0005&\u042c\b&\n&\f&\u042f\t&\u0001&\u0001&\u0001"+ + "\'\u0001\'\u0001\'\u0001\'\u0005\'\u0437\b\'\n\'\f\'\u043a\t\'\u0001("+ + "\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001"+ + ")\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001"+ + ")\u0003)\u0451\b)\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001"+ + "+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001"+ + "-\u0003-\u0465\b-\u0004-\u0467\b-\u000b-\f-\u0468\u0001-\u0001-\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0003.\u0474\b.\u0001.\u0001"+ + ".\u0001.\u0001.\u0003.\u047a\b.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0005.\u0484\b.\n.\f.\u0487\t.\u0001.\u0003.\u048a\b."+ + "\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0005.\u0496\b.\n.\f.\u0499\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0005.\u04a4\b.\n.\f.\u04a7\t.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0005"+ + ".\u04b5\b.\n.\f.\u04b8\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0005.\u04c5\b.\n.\f.\u04c8\t.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0005.\u04d6\b.\n.\f.\u04d9\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0005.\u04e2\b.\n.\f.\u04e5\t.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0005.\u04f2\b.\n.\f.\u04f5"+ + "\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0005.\u04ff"+ + "\b.\n.\f.\u0502\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0005.\u050f\b.\n.\f.\u0512\t.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0005.\u051c\b.\n.\f.\u051f\t.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0005"+ + ".\u0535\b.\n.\f.\u0538\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0005.\u0546\b.\n.\f.\u0549\t.\u0003"+ + ".\u054b\b.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "0\u00010\u00010\u00010\u00011\u00011\u00011\u00011\u00011\u00012\u0001"+ + "2\u00012\u00012\u00012\u00012\u00013\u00013\u00013\u00014\u00014\u0003"+ + "4\u0569\b4\u00014\u00014\u00015\u00015\u00015\u00035\u0570\b5\u00015\u0001"+ + "5\u00016\u00046\u0575\b6\u000b6\f6\u0576\u00016\u00016\u00017\u00017\u0005"+ + "7\u057d\b7\n7\f7\u0580\t7\u00017\u00017\u00018\u00018\u00018\u00018\u0001"+ + "8\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001"+ + ":\u0001;\u0001;\u0003;\u0595\b;\u0001;\u0001;\u0001<\u0001<\u0001<\u0003"+ + "<\u059c\b<\u0001<\u0001<\u0001=\u0004=\u05a1\b=\u000b=\f=\u05a2\u0001"+ + "=\u0001=\u0001>\u0001>\u0005>\u05a9\b>\n>\f>\u05ac\t>\u0001>\u0001>\u0001"+ + "?\u0001?\u0001?\u0001?\u0001?\u0001@\u0004@\u05b6\b@\u000b@\f@\u05b7\u0001"+ + "@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ + "D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ + "E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001"+ + "G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001"+ + "I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001"+ + "K\u0001K\u0001K\u0001L\u0001L\u0005L\u05fb\bL\nL\fL\u05fe\tL\u0001L\u0001"+ + "L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001"+ + "O\u0001O\u0001O\u0001O\u0005O\u060f\bO\nO\fO\u0612\tO\u0001O\u0001O\u0001"+ + "O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ + "R\u0001S\u0001S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001"+ + "U\u0001U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ + "V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ + "V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001"+ + "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001"+ + "\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001"+ + "]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0001"+ + "_\u0001`\u0001`\u0001`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001"+ + "a\u0001b\u0001b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001c\u0001"+ + "d\u0001d\u0003d\u068f\bd\u0001d\u0001d\u0001d\u0001d\u0001d\u0001e\u0001"+ + "e\u0001e\u0001e\u0001f\u0001f\u0003f\u069c\bf\u0001f\u0001f\u0003f\u06a0"+ + "\bf\u0001f\u0004f\u06a3\bf\u000bf\ff\u06a4\u0001f\u0003f\u06a8\bf\u0001"+ + "f\u0003f\u06ab\bf\u0001f\u0003f\u06ae\bf\u0001f\u0001f\u0003f\u06b2\b"+ + "f\u0001f\u0001f\u0003f\u06b6\bf\u0001f\u0004f\u06b9\bf\u000bf\ff\u06ba"+ + "\u0001f\u0003f\u06be\bf\u0001f\u0001f\u0003f\u06c2\bf\u0005f\u06c4\bf"+ + "\nf\ff\u06c7\tf\u0001f\u0003f\u06ca\bf\u0001f\u0001f\u0001f\u0001f\u0001"+ + "g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0005g\u06d9"+ + "\bg\ng\fg\u06dc\tg\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001"+ + "g\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0003h\u06ec\bh\u0001h\u0001"+ + "h\u0005h\u06f0\bh\nh\fh\u06f3\th\u0001h\u0001h\u0004h\u06f7\bh\u000bh"+ + "\fh\u06f8\u0001h\u0003h\u06fc\bh\u0001h\u0001h\u0003h\u0700\bh\u0004h"+ + "\u0702\bh\u000bh\fh\u0703\u0001h\u0001h\u0001h\u0001h\u0003h\u070a\bh"+ + "\u0001h\u0001h\u0001i\u0001i\u0001i\u0001i\u0001i\u0001j\u0001j\u0001"+ + "j\u0001j\u0001j\u0001k\u0001k\u0001k\u0001k\u0001l\u0001l\u0001l\u0001"+ + "l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001n\u0001"+ + "n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001o\u0001p\u0001p\u0001"+ + "p\u0001p\u0001p\u0006\u0183\u0198\u01a6\u0376\u0422\u0610\u0000q\f\u0000"+ + "\u000e\u0000\u0010\u0000\u0012\u0000\u0014\u0000\u0016\u0000\u0018\n\u001a"+ + "\u0000\u001c\u0000\u001e\u0000 \u0000\"\u0000$(&\u0000(\u0000*\u0000,"+ + "\u000b.\u00000\u00002\u00004\f6\r8\u000e:\u0000<\u0000>\u0000@\u0000B"+ + "\u0000D\u0006F\u0000H\u0000J\u0000L\u0000N\u0000P\u0000R\u0000T\u0000"+ + "V\u0000X\u0000Z\u0000\\\u0000^\u0000`\u0000b\u000fd\u0000f\u0000h\u0000"+ + "j\u0000l\u0000n\u0000p\u0000r\u0010t\u0011v\u0012x\u0013z\u0014|\u0000"+ + "~\u0000\u0080\u0015\u0082\u0016\u0084\u0017\u0086\u0018\u0088\u0019\u008a"+ + "\u0000\u008c\u001a\u008e\u0000\u0090\u0000\u0092\u0000\u0094\u001b\u0096"+ + "\u0000\u0098\u001c\u009a\u001d\u009c\u0000\u009e)\u00a0\u001e\u00a2\u001f"+ + "\u00a4 \u00a6!\u00a8\"\u00aa#\u00ac$\u00ae\u0000\u00b0%\u00b2&\u00b4\u0000"+ + "\u00b6\u0000\u00b8\u0000\u00ba\u0000\u00bc\u0000\u00be\u0000\u00c0\u0000"+ + "\u00c2\u0000\u00c4\u0000\u00c6*\u00c8\u0000\u00ca\u0000\u00cc\u0000\u00ce"+ + "\u0000\u00d0\u0000\u00d2\u0000\u00d4\u0000\u00d6\u0000\u00d8\u0000\u00da"+ + "\u0000\u00dc\u0000\u00de+\u00e0\u0000\u00e2\u0000\u00e4\u0000\u00e6\'"+ + "\u00e8\u0000\u00ea\u0000\u00ec\u0000\f\u0000\u0001\u0002\u0003\u0004\u0005"+ + "\u0006\u0007\b\t\n\u000b-\u0002\u0000FFff\u0002\u0000OOoo\u0002\u0000"+ + "RRrr\u0002\u0000EEee\u0002\u0000AAaa\u0002\u0000CCcc\u0002\u0000HHhh\u0002"+ + "\u0000IIii\u0002\u0000WWww\u0002\u0000LLll\u0002\u0000SSss\u0002\u0000"+ + "TTtt\u0002\u0000NNnn\u0002\u0000PPpp\u0002\u0000UUuu\u0002\u0000YYyy\u0002"+ + "\u0000GGgg\u0002\u0000DDdd\u0002\u0000MMmm\u0001\u0000::\u0004\u0000A"+ + "Z__az\u0080\u8000\ufffe\u0005\u0000-.0:AZaz\u0080\u8000\ufffe\u0002\u0000"+ + "XXxx\u0002\u0000BBbb\u0002\u0000KKkk\u0002\u0000QQqq\u0002\u0000VVvv\u0002"+ + "\u0000JJjj\u0004\u0000\n\n\r\r >>\u0003\u0000\n\n\r\r \u0002\u0000\n"+ + "\n\r\r\u0004\u0000,,..==__\u0001\u0000(;\u0002\u0000[[]]\u0002\u0000#"+ + "#..\u0003\u0000..==__\u0005\u000009AZ__az\u0080\u8000\ufffe\u0003\u0000"+ + "AZaz\u0080\u8000\ufffe\u0006\u0000..09AZ__az\u0080\u8000\ufffe\u0006\u0000"+ + "--09AZ__az\u0080\u8000\ufffe\u0002\u0000\"\"\\\\\u0002\u0000\'\'\\\\\u0001"+ + "\u0000 \u0005\u0000 \'\'::{{}}\u0005\u0000 !\'\'::{{}}\u07d1\u0000\u0018"+ + "\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c"+ + "\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001"+ + "\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000"+ + "\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000"+ + "\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000."+ + "\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001\u0000"+ + "\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000"+ + "\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<"+ + "\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001\u0000"+ + "\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000"+ + "\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000\u0000\u0000J"+ + "\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0000b\u0001\u0000"+ + "\u0000\u0000\u0000d\u0001\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000"+ + "\u0000h\u0001\u0000\u0000\u0000\u0001j\u0001\u0000\u0000\u0000\u0001l"+ + "\u0001\u0000\u0000\u0000\u0001n\u0001\u0000\u0000\u0000\u0002p\u0001\u0000"+ + "\u0000\u0000\u0002r\u0001\u0000\u0000\u0000\u0002t\u0001\u0000\u0000\u0000"+ + "\u0002v\u0001\u0000\u0000\u0000\u0002x\u0001\u0000\u0000\u0000\u0002z"+ + "\u0001\u0000\u0000\u0000\u0002|\u0001\u0000\u0000\u0000\u0003~\u0001\u0000"+ + "\u0000\u0000\u0003\u0080\u0001\u0000\u0000\u0000\u0003\u0082\u0001\u0000"+ + "\u0000\u0000\u0003\u0084\u0001\u0000\u0000\u0000\u0003\u0086\u0001\u0000"+ + "\u0000\u0000\u0003\u0088\u0001\u0000\u0000\u0000\u0003\u008a\u0001\u0000"+ + "\u0000\u0000\u0004\u008c\u0001\u0000\u0000\u0000\u0004\u008e\u0001\u0000"+ + "\u0000\u0000\u0004\u0090\u0001\u0000\u0000\u0000\u0004\u0092\u0001\u0000"+ + "\u0000\u0000\u0005\u0094\u0001\u0000\u0000\u0000\u0005\u0096\u0001\u0000"+ + "\u0000\u0000\u0005\u0098\u0001\u0000\u0000\u0000\u0005\u009a\u0001\u0000"+ + "\u0000\u0000\u0005\u009c\u0001\u0000\u0000\u0000\u0005\u009e\u0001\u0000"+ + "\u0000\u0000\u0005\u00a0\u0001\u0000\u0000\u0000\u0005\u00a2\u0001\u0000"+ + "\u0000\u0000\u0005\u00a4\u0001\u0000\u0000\u0000\u0005\u00a6\u0001\u0000"+ + "\u0000\u0000\u0005\u00a8\u0001\u0000\u0000\u0000\u0005\u00aa\u0001\u0000"+ + "\u0000\u0000\u0005\u00ac\u0001\u0000\u0000\u0000\u0005\u00ae\u0001\u0000"+ + "\u0000\u0000\u0006\u00b0\u0001\u0000\u0000\u0000\u0006\u00b2\u0001\u0000"+ + "\u0000\u0000\u0006\u00b4\u0001\u0000\u0000\u0000\u0006\u00b6\u0001\u0000"+ + "\u0000\u0000\u0007\u00b8\u0001\u0000\u0000\u0000\u0007\u00ba\u0001\u0000"+ + "\u0000\u0000\u0007\u00bc\u0001\u0000\u0000\u0000\u0007\u00be\u0001\u0000"+ + "\u0000\u0000\b\u00c0\u0001\u0000\u0000\u0000\b\u00c2\u0001\u0000\u0000"+ + "\u0000\b\u00c4\u0001\u0000\u0000\u0000\b\u00c6\u0001\u0000\u0000\u0000"+ + "\b\u00c8\u0001\u0000\u0000\u0000\b\u00ca\u0001\u0000\u0000\u0000\t\u00cc"+ + "\u0001\u0000\u0000\u0000\t\u00ce\u0001\u0000\u0000\u0000\t\u00d0\u0001"+ + "\u0000\u0000\u0000\t\u00d2\u0001\u0000\u0000\u0000\n\u00d4\u0001\u0000"+ + "\u0000\u0000\n\u00d6\u0001\u0000\u0000\u0000\n\u00d8\u0001\u0000\u0000"+ + "\u0000\n\u00da\u0001\u0000\u0000\u0000\n\u00dc\u0001\u0000\u0000\u0000"+ + "\n\u00de\u0001\u0000\u0000\u0000\n\u00e0\u0001\u0000\u0000\u0000\n\u00e2"+ + "\u0001\u0000\u0000\u0000\n\u00e4\u0001\u0000\u0000\u0000\u000b\u00e6\u0001"+ + "\u0000\u0000\u0000\u000b\u00e8\u0001\u0000\u0000\u0000\u000b\u00ea\u0001"+ + "\u0000\u0000\u0000\u000b\u00ec\u0001\u0000\u0000\u0000\f\u00f5\u0001\u0000"+ + "\u0000\u0000\u000e\u015b\u0001\u0000\u0000\u0000\u0010\u015d\u0001\u0000"+ + "\u0000\u0000\u0012\u0179\u0001\u0000\u0000\u0000\u0014\u0188\u0001\u0000"+ + "\u0000\u0000\u0016\u018f\u0001\u0000\u0000\u0000\u0018\u01ae\u0001\u0000"+ + "\u0000\u0000\u001a\u01cc\u0001\u0000\u0000\u0000\u001c\u023e\u0001\u0000"+ + "\u0000\u0000\u001e\u0259\u0001\u0000\u0000\u0000 \u0288\u0001\u0000\u0000"+ + "\u0000\"\u028c\u0001\u0000\u0000\u0000$\u0299\u0001\u0000\u0000\u0000"+ + "&\u02bf\u0001\u0000\u0000\u0000(\u02e4\u0001\u0000\u0000\u0000*\u02e8"+ + "\u0001\u0000\u0000\u0000,\u02f5\u0001\u0000\u0000\u0000.\u02fc\u0001\u0000"+ + "\u0000\u00000\u0349\u0001\u0000\u0000\u00002\u034d\u0001\u0000\u0000\u0000"+ + "4\u0356\u0001\u0000\u0000\u00006\u035c\u0001\u0000\u0000\u00008\u035f"+ + "\u0001\u0000\u0000\u0000:\u0363\u0001\u0000\u0000\u0000<\u0369\u0001\u0000"+ + "\u0000\u0000>\u037d\u0001\u0000\u0000\u0000@\u0390\u0001\u0000\u0000\u0000"+ + "B\u03a0\u0001\u0000\u0000\u0000D\u03c1\u0001\u0000\u0000\u0000F\u03e5"+ + "\u0001\u0000\u0000\u0000H\u03f5\u0001\u0000\u0000\u0000J\u03fe\u0001\u0000"+ + "\u0000\u0000L\u0402\u0001\u0000\u0000\u0000N\u0406\u0001\u0000\u0000\u0000"+ + "P\u040d\u0001\u0000\u0000\u0000R\u0414\u0001\u0000\u0000\u0000T\u041b"+ + "\u0001\u0000\u0000\u0000V\u041d\u0001\u0000\u0000\u0000X\u0427\u0001\u0000"+ + "\u0000\u0000Z\u0432\u0001\u0000\u0000\u0000\\\u043b\u0001\u0000\u0000"+ + "\u0000^\u0450\u0001\u0000\u0000\u0000`\u0452\u0001\u0000\u0000\u0000b"+ + "\u0454\u0001\u0000\u0000\u0000d\u045b\u0001\u0000\u0000\u0000f\u0461\u0001"+ + "\u0000\u0000\u0000h\u054a\u0001\u0000\u0000\u0000j\u054e\u0001\u0000\u0000"+ + "\u0000l\u0554\u0001\u0000\u0000\u0000n\u0558\u0001\u0000\u0000\u0000p"+ + "\u055d\u0001\u0000\u0000\u0000r\u0563\u0001\u0000\u0000\u0000t\u0568\u0001"+ + "\u0000\u0000\u0000v\u056f\u0001\u0000\u0000\u0000x\u0574\u0001\u0000\u0000"+ + "\u0000z\u057a\u0001\u0000\u0000\u0000|\u0583\u0001\u0000\u0000\u0000~"+ + "\u0588\u0001\u0000\u0000\u0000\u0080\u058f\u0001\u0000\u0000\u0000\u0082"+ + "\u0594\u0001\u0000\u0000\u0000\u0084\u059b\u0001\u0000\u0000\u0000\u0086"+ + "\u05a0\u0001\u0000\u0000\u0000\u0088\u05a6\u0001\u0000\u0000\u0000\u008a"+ + "\u05af\u0001\u0000\u0000\u0000\u008c\u05b5\u0001\u0000\u0000\u0000\u008e"+ + "\u05bd\u0001\u0000\u0000\u0000\u0090\u05c3\u0001\u0000\u0000\u0000\u0092"+ + "\u05c8\u0001\u0000\u0000\u0000\u0094\u05cd\u0001\u0000\u0000\u0000\u0096"+ + "\u05d2\u0001\u0000\u0000\u0000\u0098\u05d9\u0001\u0000\u0000\u0000\u009a"+ + "\u05de\u0001\u0000\u0000\u0000\u009c\u05e3\u0001\u0000\u0000\u0000\u009e"+ + "\u05e9\u0001\u0000\u0000\u0000\u00a0\u05ee\u0001\u0000\u0000\u0000\u00a2"+ + "\u05f3\u0001\u0000\u0000\u0000\u00a4\u05f8\u0001\u0000\u0000\u0000\u00a6"+ + "\u0601\u0001\u0000\u0000\u0000\u00a8\u0606\u0001\u0000\u0000\u0000\u00aa"+ + "\u060a\u0001\u0000\u0000\u0000\u00ac\u0618\u0001\u0000\u0000\u0000\u00ae"+ + "\u061b\u0001\u0000\u0000\u0000\u00b0\u0620\u0001\u0000\u0000\u0000\u00b2"+ + "\u062a\u0001\u0000\u0000\u0000\u00b4\u062f\u0001\u0000\u0000\u0000\u00b6"+ + "\u0633\u0001\u0000\u0000\u0000\u00b8\u0638\u0001\u0000\u0000\u0000\u00ba"+ + "\u0648\u0001\u0000\u0000\u0000\u00bc\u064d\u0001\u0000\u0000\u0000\u00be"+ + "\u0651\u0001\u0000\u0000\u0000\u00c0\u0656\u0001\u0000\u0000\u0000\u00c2"+ + "\u065e\u0001\u0000\u0000\u0000\u00c4\u0664\u0001\u0000\u0000\u0000\u00c6"+ + "\u066b\u0001\u0000\u0000\u0000\u00c8\u0670\u0001\u0000\u0000\u0000\u00ca"+ + "\u0674\u0001\u0000\u0000\u0000\u00cc\u0679\u0001\u0000\u0000\u0000\u00ce"+ + "\u067e\u0001\u0000\u0000\u0000\u00d0\u0683\u0001\u0000\u0000\u0000\u00d2"+ + "\u0687\u0001\u0000\u0000\u0000\u00d4\u068c\u0001\u0000\u0000\u0000\u00d6"+ + "\u0695\u0001\u0000\u0000\u0000\u00d8\u0699\u0001\u0000\u0000\u0000\u00da"+ + "\u06cf\u0001\u0000\u0000\u0000\u00dc\u0709\u0001\u0000\u0000\u0000\u00de"+ + "\u070d\u0001\u0000\u0000\u0000\u00e0\u0712\u0001\u0000\u0000\u0000\u00e2"+ + "\u0717\u0001\u0000\u0000\u0000\u00e4\u071b\u0001\u0000\u0000\u0000\u00e6"+ + "\u0720\u0001\u0000\u0000\u0000\u00e8\u0727\u0001\u0000\u0000\u0000\u00ea"+ + "\u072c\u0001\u0000\u0000\u0000\u00ec\u0730\u0001\u0000\u0000\u0000\u00ee"+ + "\u00ef\u0005:\u0000\u0000\u00ef\u00f6\u0005:\u0000\u0000\u00f0\u00f1\u0005"+ + "?\u0000\u0000\u00f1\u00f6\u0005:\u0000\u0000\u00f2\u00f3\u0005 \u0000"+ + "\u0000\u00f3\u00f4\u0005:\u0000\u0000\u00f4\u00f6\u0005 \u0000\u0000\u00f5"+ + "\u00ee\u0001\u0000\u0000\u0000\u00f5\u00f0\u0001\u0000\u0000\u0000\u00f5"+ + "\u00f2\u0001\u0000\u0000\u0000\u00f6\r\u0001\u0000\u0000\u0000\u00f7\u00f8"+ + "\u0007\u0000\u0000\u0000\u00f8\u00f9\u0007\u0001\u0000\u0000\u00f9\u00fa"+ + "\u0007\u0002\u0000\u0000\u00fa\u00ff\u0001\u0000\u0000\u0000\u00fb\u00fc"+ + "\u0007\u0003\u0000\u0000\u00fc\u00fd\u0007\u0004\u0000\u0000\u00fd\u00fe"+ + "\u0007\u0005\u0000\u0000\u00fe\u0100\u0007\u0006\u0000\u0000\u00ff\u00fb"+ + "\u0001\u0000\u0000\u0000\u00ff\u0100\u0001\u0000\u0000\u0000\u0100\u015c"+ + "\u0001\u0000\u0000\u0000\u0101\u0102\u0007\u0007\u0000\u0000\u0102\u015c"+ + "\u0007\u0000\u0000\u0000\u0103\u0104\u0007\b\u0000\u0000\u0104\u0105\u0007"+ + "\u0006\u0000\u0000\u0105\u0106\u0007\u0007\u0000\u0000\u0106\u0107\u0007"+ + "\t\u0000\u0000\u0107\u015c\u0007\u0003\u0000\u0000\u0108\u0109\u0007\n"+ + "\u0000\u0000\u0109\u010a\u0007\u0003\u0000\u0000\u010a\u010b\u0007\u0005"+ + "\u0000\u0000\u010b\u010c\u0007\u000b\u0000\u0000\u010c\u010d\u0007\u0007"+ + "\u0000\u0000\u010d\u010e\u0007\u0001\u0000\u0000\u010e\u015c\u0007\f\u0000"+ + "\u0000\u010f\u0110\u0007\n\u0000\u0000\u0110\u0111\u0007\u0003\u0000\u0000"+ + "\u0111\u0112\u0007\n\u0000\u0000\u0112\u0113\u0007\n\u0000\u0000\u0113"+ + "\u0114\u0007\u0007\u0000\u0000\u0114\u0115\u0007\u0001\u0000\u0000\u0115"+ + "\u015c\u0007\f\u0000\u0000\u0116\u0117\u0007\u0001\u0000\u0000\u0117\u0118"+ + "\u0007\f\u0000\u0000\u0118\u0119\u0007\u0005\u0000\u0000\u0119\u015c\u0007"+ + "\u0003\u0000\u0000\u011a\u011b\u0007\r\u0000\u0000\u011b\u011c\u0007\u000e"+ + "\u0000\u0000\u011c\u011d\u0007\n\u0000\u0000\u011d\u015c\u0007\u0006\u0000"+ + "\u0000\u011e\u011f\u0007\r\u0000\u0000\u011f\u0120\u0007\u000e\u0000\u0000"+ + "\u0120\u0121\u0007\n\u0000\u0000\u0121\u0122\u0007\u0006\u0000\u0000\u0122"+ + "\u0123\u0007\u0001\u0000\u0000\u0123\u0124\u0007\f\u0000\u0000\u0124\u0125"+ + "\u0007\u0005\u0000\u0000\u0125\u015c\u0007\u0003\u0000\u0000\u0126\u0127"+ + "\u0007\n\u0000\u0000\u0127\u0128\u0007\b\u0000\u0000\u0128\u0129\u0007"+ + "\u0007\u0000\u0000\u0129\u012a\u0007\u000b\u0000\u0000\u012a\u012b\u0007"+ + "\u0005\u0000\u0000\u012b\u015c\u0007\u0006\u0000\u0000\u012c\u012d\u0007"+ + "\u000e\u0000\u0000\u012d\u012e\u0007\f\u0000\u0000\u012e\u012f\u0007\t"+ + "\u0000\u0000\u012f\u0130\u0007\u0003\u0000\u0000\u0130\u0131\u0007\n\u0000"+ + "\u0000\u0131\u015c\u0007\n\u0000\u0000\u0132\u0133\u0007\u0005\u0000\u0000"+ + "\u0133\u0134\u0007\u0004\u0000\u0000\u0134\u0135\u0007\f\u0000\u0000\u0135"+ + "\u013c\u0001\u0000\u0000\u0000\u0136\u0137\u0007\u0004\u0000\u0000\u0137"+ + "\u0138\u0007\f\u0000\u0000\u0138\u013d\u0007\u000f\u0000\u0000\u0139\u013a"+ + "\u0007\f\u0000\u0000\u013a\u013b\u0007\u0001\u0000\u0000\u013b\u013d\u0007"+ + "\u000b\u0000\u0000\u013c\u0136\u0001\u0000\u0000\u0000\u013c\u0139\u0001"+ + "\u0000\u0000\u0000\u013c\u013d\u0001\u0000\u0000\u0000\u013d\u015c\u0001"+ + "\u0000\u0000\u0000\u013e\u013f\u0007\u0004\u0000\u0000\u013f\u0140\u0007"+ + "\u000e\u0000\u0000\u0140\u0141\u0007\u000b\u0000\u0000\u0141\u015c\u0007"+ + "\u0006\u0000\u0000\u0142\u0143\u0007\u0010\u0000\u0000\u0143\u0144\u0007"+ + "\u000e\u0000\u0000\u0144\u0145\u0007\u0003\u0000\u0000\u0145\u0146\u0007"+ + "\n\u0000\u0000\u0146\u015c\u0007\u000b\u0000\u0000\u0147\u0148\u0007\u0003"+ + "\u0000\u0000\u0148\u0149\u0007\u0002\u0000\u0000\u0149\u014a\u0007\u0002"+ + "\u0000\u0000\u014a\u014b\u0007\u0001\u0000\u0000\u014b\u015c\u0007\u0002"+ + "\u0000\u0000\u014c\u014d\u0007\r\u0000\u0000\u014d\u014e\u0007\u0002\u0000"+ + "\u0000\u014e\u014f\u0007\u0001\u0000\u0000\u014f\u0150\u0007\u0011\u0000"+ + "\u0000\u0150\u0151\u0007\u000e\u0000\u0000\u0151\u0152\u0007\u0005\u0000"+ + "\u0000\u0152\u0153\u0007\u000b\u0000\u0000\u0153\u0154\u0007\u0007\u0000"+ + "\u0000\u0154\u0155\u0007\u0001\u0000\u0000\u0155\u015c\u0007\f\u0000\u0000"+ + "\u0156\u0157\u0007\u0003\u0000\u0000\u0157\u0158\u0007\u0012\u0000\u0000"+ + "\u0158\u0159\u0007\r\u0000\u0000\u0159\u015a\u0007\u000b\u0000\u0000\u015a"+ + "\u015c\u0007\u000f\u0000\u0000\u015b\u00f7\u0001\u0000\u0000\u0000\u015b"+ + "\u0101\u0001\u0000\u0000\u0000\u015b\u0103\u0001\u0000\u0000\u0000\u015b"+ + "\u0108\u0001\u0000\u0000\u0000\u015b\u010f\u0001\u0000\u0000\u0000\u015b"+ + "\u0116\u0001\u0000\u0000\u0000\u015b\u011a\u0001\u0000\u0000\u0000\u015b"+ + "\u011e\u0001\u0000\u0000\u0000\u015b\u0126\u0001\u0000\u0000\u0000\u015b"+ + "\u012c\u0001\u0000\u0000\u0000\u015b\u0132\u0001\u0000\u0000\u0000\u015b"+ + "\u013e\u0001\u0000\u0000\u0000\u015b\u0142\u0001\u0000\u0000\u0000\u015b"+ + "\u0147\u0001\u0000\u0000\u0000\u015b\u014c\u0001\u0000\u0000\u0000\u015b"+ + "\u0156\u0001\u0000\u0000\u0000\u015c\u000f\u0001\u0000\u0000\u0000\u015d"+ + "\u015e\u0005@\u0000\u0000\u015e\u015f\u0007\u0007\u0000\u0000\u015f\u0160"+ + "\u0007\f\u0000\u0000\u0160\u0161\u0007\u0005\u0000\u0000\u0161\u0162\u0007"+ + "\t\u0000\u0000\u0162\u0163\u0007\u000e\u0000\u0000\u0163\u0164\u0007\u0011"+ + "\u0000\u0000\u0164\u0165\u0007\u0003\u0000\u0000\u0165\u0177\u0001\u0000"+ + "\u0000\u0000\u0166\u0167\u0007\u0007\u0000\u0000\u0167\u0178\u0007\u0000"+ + "\u0000\u0000\u0168\u0169\u0007\b\u0000\u0000\u0169\u016a\u0007\u0006\u0000"+ + "\u0000\u016a\u016b\u0007\u0003\u0000\u0000\u016b\u0178\u0007\f\u0000\u0000"+ + "\u016c\u016d\u0007\u0000\u0000\u0000\u016d\u016e\u0007\u0007\u0000\u0000"+ + "\u016e\u016f\u0007\u0002\u0000\u0000\u016f\u0170\u0007\n\u0000\u0000\u0170"+ + "\u0178\u0007\u000b\u0000\u0000\u0171\u0172\u0007\u000e\u0000\u0000\u0172"+ + "\u0173\u0007\f\u0000\u0000\u0173\u0174\u0007\t\u0000\u0000\u0174\u0175"+ + "\u0007\u0003\u0000\u0000\u0175\u0176\u0007\n\u0000\u0000\u0176\u0178\u0007"+ + "\n\u0000\u0000\u0177\u0166\u0001\u0000\u0000\u0000\u0177\u0168\u0001\u0000"+ + "\u0000\u0000\u0177\u016c\u0001\u0000\u0000\u0000\u0177\u0171\u0001\u0000"+ + "\u0000\u0000\u0177\u0178\u0001\u0000\u0000\u0000\u0178\u0011\u0001\u0000"+ + "\u0000\u0000\u0179\u0183\u0005\"\u0000\u0000\u017a\u0182\u0003T$\u0000"+ + "\u017b\u017c\u0005{\u0000\u0000\u017c\u017d\u0003\\(\u0000\u017d\u017e"+ + "\u0005}\u0000\u0000\u017e\u0182\u0001\u0000\u0000\u0000\u017f\u0182\t"+ + "\u0000\u0000\u0000\u0180\u0182\b\u0013\u0000\u0000\u0181\u017a\u0001\u0000"+ + "\u0000\u0000\u0181\u017b\u0001\u0000\u0000\u0000\u0181\u017f\u0001\u0000"+ + "\u0000\u0000\u0181\u0180\u0001\u0000\u0000\u0000\u0182\u0185\u0001\u0000"+ + "\u0000\u0000\u0183\u0184\u0001\u0000\u0000\u0000\u0183\u0181\u0001\u0000"+ + "\u0000\u0000\u0184\u0186\u0001\u0000\u0000\u0000\u0185\u0183\u0001\u0000"+ + "\u0000\u0000\u0186\u0187\u0005\"\u0000\u0000\u0187\u0013\u0001\u0000\u0000"+ + "\u0000\u0188\u018c\u0007\u0014\u0000\u0000\u0189\u018b\u0007\u0015\u0000"+ + "\u0000\u018a\u0189\u0001\u0000\u0000\u0000\u018b\u018e\u0001\u0000\u0000"+ + "\u0000\u018c\u018a\u0001\u0000\u0000\u0000\u018c\u018d\u0001\u0000\u0000"+ + "\u0000\u018d\u0015\u0001\u0000\u0000\u0000\u018e\u018c\u0001\u0000\u0000"+ + "\u0000\u018f\u0190\u0005\u00b0\u0000\u0000\u0190\u0017\u0001\u0000\u0000"+ + "\u0000\u0191\u0192\u0005<\u0000\u0000\u0192\u0193\u0005?\u0000\u0000\u0193"+ + "\u0194\u0005=\u0000\u0000\u0194\u0198\u0001\u0000\u0000\u0000\u0195\u0197"+ + "\t\u0000\u0000\u0000\u0196\u0195\u0001\u0000\u0000\u0000\u0197\u019a\u0001"+ + "\u0000\u0000\u0000\u0198\u0199\u0001\u0000\u0000\u0000\u0198\u0196\u0001"+ + "\u0000\u0000\u0000\u0199\u019b\u0001\u0000\u0000\u0000\u019a\u0198\u0001"+ + "\u0000\u0000\u0000\u019b\u019c\u0005?\u0000\u0000\u019c\u01af\u0005>\u0000"+ + "\u0000\u019d\u019e\u0005<\u0000\u0000\u019e\u019f\u0005?\u0000\u0000\u019f"+ + "\u01a0\u0007\r\u0000\u0000\u01a0\u01a1\u0007\u0006\u0000\u0000\u01a1\u01a2"+ + "\u0007\r\u0000\u0000\u01a2\u01a6\u0001\u0000\u0000\u0000\u01a3\u01a5\t"+ + "\u0000\u0000\u0000\u01a4\u01a3\u0001\u0000\u0000\u0000\u01a5\u01a8\u0001"+ + "\u0000\u0000\u0000\u01a6\u01a7\u0001\u0000\u0000\u0000\u01a6\u01a4\u0001"+ + "\u0000\u0000\u0000\u01a7\u01ac\u0001\u0000\u0000\u0000\u01a8\u01a6\u0001"+ + "\u0000\u0000\u0000\u01a9\u01aa\u0005?\u0000\u0000\u01aa\u01ad\u0005>\u0000"+ + "\u0000\u01ab\u01ad\u0005\u0000\u0000\u0001\u01ac\u01a9\u0001\u0000\u0000"+ + "\u0000\u01ac\u01ab\u0001\u0000\u0000\u0000\u01ad\u01af\u0001\u0000\u0000"+ + "\u0000\u01ae\u0191\u0001\u0000\u0000\u0000\u01ae\u019d\u0001\u0000\u0000"+ + "\u0000\u01af\u0019\u0001\u0000\u0000\u0000\u01b0\u01b1\u0005@\u0000\u0000"+ + "\u01b1\u01cd\u0003\u000e\u0001\u0000\u01b2\u01b3\u0005@\u0000\u0000\u01b3"+ + "\u01b4\u0007\n\u0000\u0000\u01b4\u01b5\u0007\u0003\u0000\u0000\u01b5\u01b6"+ + "\u0007\u0005\u0000\u0000\u01b6\u01b7\u0007\u000b\u0000\u0000\u01b7\u01b8"+ + "\u0007\u0007\u0000\u0000\u01b8\u01b9\u0007\u0001\u0000\u0000\u01b9\u01ba"+ + "\u0007\f\u0000\u0000\u01ba\u01bb\u0007\u0012\u0000\u0000\u01bb\u01bc\u0007"+ + "\u0007\u0000\u0000\u01bc\u01bd\u0007\n\u0000\u0000\u01bd\u01be\u0007\n"+ + "\u0000\u0000\u01be\u01bf\u0007\u0007\u0000\u0000\u01bf\u01c0\u0007\f\u0000"+ + "\u0000\u01c0\u01cd\u0007\u0010\u0000\u0000\u01c1\u01c2\u0005@\u0000\u0000"+ + "\u01c2\u01c3\u0007\u0006\u0000\u0000\u01c3\u01c4\u0007\u0004\u0000\u0000"+ + "\u01c4\u01c5\u0007\n\u0000\u0000\u01c5\u01c6\u0007\n\u0000\u0000\u01c6"+ + "\u01c7\u0007\u0003\u0000\u0000\u01c7\u01c8\u0007\u0005\u0000\u0000\u01c8"+ + "\u01c9\u0007\u000b\u0000\u0000\u01c9\u01ca\u0007\u0007\u0000\u0000\u01ca"+ + "\u01cb\u0007\u0001\u0000\u0000\u01cb\u01cd\u0007\f\u0000\u0000\u01cc\u01b0"+ + "\u0001\u0000\u0000\u0000\u01cc\u01b2\u0001\u0000\u0000\u0000\u01cc\u01c1"+ + "\u0001\u0000\u0000\u0000\u01cd\u01ce\u0001\u0000\u0000\u0000\u01ce\u01cf"+ + "\u0006\u0007\u0000\u0000\u01cf\u01d0\u0006\u0007\u0001\u0000\u01d0\u001b"+ + "\u0001\u0000\u0000\u0000\u01d1\u01d2\u0005@\u0000\u0000\u01d2\u01d3\u0007"+ + "\u0003\u0000\u0000\u01d3\u01d4\u0007\t\u0000\u0000\u01d4\u01d5\u0007\n"+ + "\u0000\u0000\u01d5\u01d6\u0007\u0003\u0000\u0000\u01d6\u01d7\u0007\u0007"+ + "\u0000\u0000\u01d7\u023f\u0007\u0000\u0000\u0000\u01d8\u023f\u0003\u0010"+ + "\u0002\u0000\u01d9\u01da\u0005@\u0000\u0000\u01da\u01db\u0007\u0003\u0000"+ + "\u0000\u01db\u01dc\u0007\u0016\u0000\u0000\u01dc\u01dd\u0007\u000b\u0000"+ + "\u0000\u01dd\u01de\u0007\u0003\u0000\u0000\u01de\u01df\u0007\f\u0000\u0000"+ + "\u01df\u01e0\u0007\u0011\u0000\u0000\u01e0\u023f\u0007\n\u0000\u0000\u01e1"+ + "\u01e2\u0005@\u0000\u0000\u01e2\u01e3\u0007\u0003\u0000\u0000\u01e3\u01e4"+ + "\u0007\u0004\u0000\u0000\u01e4\u01e5\u0007\u0005\u0000\u0000\u01e5\u023f"+ + "\u0007\u0006\u0000\u0000\u01e6\u01e7\u0005@\u0000\u0000\u01e7\u01e8\u0007"+ + "\u000f\u0000\u0000\u01e8\u01e9\u0007\u0007\u0000\u0000\u01e9\u01ea\u0007"+ + "\u0003\u0000\u0000\u01ea\u01eb\u0007\t\u0000\u0000\u01eb\u023f\u0007\u0011"+ + "\u0000\u0000\u01ec\u01ed\u0005@\u0000\u0000\u01ed\u01ee\u0007\r\u0000"+ + "\u0000\u01ee\u01ef\u0007\u0002\u0000\u0000\u01ef\u01f0\u0007\u0001\u0000"+ + "\u0000\u01f0\u01f1\u0007\r\u0000\u0000\u01f1\u023f\u0007\n\u0000\u0000"+ + "\u01f2\u01f3\u0005@\u0000\u0000\u01f3\u01f4\u0007\u0012\u0000\u0000\u01f4"+ + "\u01f5\u0007\u0003\u0000\u0000\u01f5\u01f6\u0007\u000b\u0000\u0000\u01f6"+ + "\u01f7\u0007\u0006\u0000\u0000\u01f7\u01f8\u0007\u0001\u0000\u0000\u01f8"+ + "\u023f\u0007\u0011\u0000\u0000\u01f9\u01fa\u0005@\u0000\u0000\u01fa\u01fb"+ + "\u0007\u0005\u0000\u0000\u01fb\u01fc\u0007\t\u0000\u0000\u01fc\u01fd\u0007"+ + "\u0004\u0000\u0000\u01fd\u01fe\u0007\n\u0000\u0000\u01fe\u023f\u0007\n"+ + "\u0000\u0000\u01ff\u0200\u0005@\u0000\u0000\u0200\u0201\u0007\n\u0000"+ + "\u0000\u0201\u0202\u0007\u000b\u0000\u0000\u0202\u0203\u0007\u000f\u0000"+ + "\u0000\u0203\u0204\u0007\t\u0000\u0000\u0204\u023f\u0007\u0003\u0000\u0000"+ + "\u0205\u0206\u0005@\u0000\u0000\u0206\u0207\u0007\u0004\u0000\u0000\u0207"+ + "\u0208\u0007\b\u0000\u0000\u0208\u0209\u0007\u0004\u0000\u0000\u0209\u020a"+ + "\u0007\u0002\u0000\u0000\u020a\u023f\u0007\u0003\u0000\u0000\u020b\u020c"+ + "\u0005@\u0000\u0000\u020c\u020d\u0007\u0017\u0000\u0000\u020d\u020e\u0007"+ + "\u0002\u0000\u0000\u020e\u020f\u0007\u0003\u0000\u0000\u020f\u0210\u0007"+ + "\u0004\u0000\u0000\u0210\u023f\u0007\u0018\u0000\u0000\u0211\u0212\u0005"+ + "@\u0000\u0000\u0212\u0213\u0007\u0005\u0000\u0000\u0213\u0214\u0007\u0001"+ + "\u0000\u0000\u0214\u0215\u0007\f\u0000\u0000\u0215\u0216\u0007\u000b\u0000"+ + "\u0000\u0216\u0217\u0007\u0007\u0000\u0000\u0217\u0218\u0007\f\u0000\u0000"+ + "\u0218\u0219\u0007\u000e\u0000\u0000\u0219\u023f\u0007\u0003\u0000\u0000"+ + "\u021a\u021b\u0005@\u0000\u0000\u021b\u021c\u0007\n\u0000\u0000\u021c"+ + "\u021d\u0007\u0003\u0000\u0000\u021d\u021e\u0007\t\u0000\u0000\u021e\u021f"+ + "\u0007\u0003\u0000\u0000\u021f\u0220\u0007\u0005\u0000\u0000\u0220\u0221"+ + "\u0007\u000b\u0000\u0000\u0221\u0222\u0007\u0003\u0000\u0000\u0222\u023f"+ + "\u0007\u0011\u0000\u0000\u0223\u0224\u0005@\u0000\u0000\u0224\u0225\u0007"+ + "\u0011\u0000\u0000\u0225\u0226\u0007\u0007\u0000\u0000\u0226\u0227\u0007"+ + "\n\u0000\u0000\u0227\u0228\u0007\u0004\u0000\u0000\u0228\u0229\u0007\u0017"+ + "\u0000\u0000\u0229\u022a\u0007\t\u0000\u0000\u022a\u022b\u0007\u0003\u0000"+ + "\u0000\u022b\u023f\u0007\u0011\u0000\u0000\u022c\u022d\u0005@\u0000\u0000"+ + "\u022d\u022e\u0007\u0002\u0000\u0000\u022e\u022f\u0007\u0003\u0000\u0000"+ + "\u022f\u0230\u0007\u0004\u0000\u0000\u0230\u0231\u0007\u0011\u0000\u0000"+ + "\u0231\u0232\u0007\u0001\u0000\u0000\u0232\u0233\u0007\f\u0000\u0000\u0233"+ + "\u0234\u0007\t\u0000\u0000\u0234\u023f\u0007\u000f\u0000\u0000\u0235\u0236"+ + "\u0005@\u0000\u0000\u0236\u0237\u0007\u0002\u0000\u0000\u0237\u0238\u0007"+ + "\u0003\u0000\u0000\u0238\u0239\u0007\u0019\u0000\u0000\u0239\u023a\u0007"+ + "\u000e\u0000\u0000\u023a\u023b\u0007\u0007\u0000\u0000\u023b\u023c\u0007"+ + "\u0002\u0000\u0000\u023c\u023d\u0007\u0003\u0000\u0000\u023d\u023f\u0007"+ + "\u0011\u0000\u0000\u023e\u01d1\u0001\u0000\u0000\u0000\u023e\u01d8\u0001"+ + "\u0000\u0000\u0000\u023e\u01d9\u0001\u0000\u0000\u0000\u023e\u01e1\u0001"+ + "\u0000\u0000\u0000\u023e\u01e6\u0001\u0000\u0000\u0000\u023e\u01ec\u0001"+ + "\u0000\u0000\u0000\u023e\u01f2\u0001\u0000\u0000\u0000\u023e\u01f9\u0001"+ + "\u0000\u0000\u0000\u023e\u01ff\u0001\u0000\u0000\u0000\u023e\u0205\u0001"+ + "\u0000\u0000\u0000\u023e\u020b\u0001\u0000\u0000\u0000\u023e\u0211\u0001"+ + "\u0000\u0000\u0000\u023e\u021a\u0001\u0000\u0000\u0000\u023e\u0223\u0001"+ + "\u0000\u0000\u0000\u023e\u022c\u0001\u0000\u0000\u0000\u023e\u0235\u0001"+ + "\u0000\u0000\u0000\u023f\u0241\u0001\u0000\u0000\u0000\u0240\u0242\u0005"+ + " \u0000\u0000\u0241\u0240\u0001\u0000\u0000\u0000\u0242\u0243\u0001\u0000"+ + "\u0000\u0000\u0243\u0241\u0001\u0000\u0000\u0000\u0243\u0244\u0001\u0000"+ + "\u0000\u0000\u0244\u0245\u0001\u0000\u0000\u0000\u0245\u0246\u0004\b\u0000"+ + "\u0000\u0246\u0247\u0001\u0000\u0000\u0000\u0247\u0248\u0006\b\u0000\u0000"+ + "\u0248\u0249\u0006\b\u0001\u0000\u0249\u001d\u0001\u0000\u0000\u0000\u024a"+ + "\u024b\u0005@\u0000\u0000\u024b\u024c\u0007\u0017\u0000\u0000\u024c\u024d"+ + "\u0007\u0002\u0000\u0000\u024d\u024e\u0007\u0003\u0000\u0000\u024e\u024f"+ + "\u0007\u0004\u0000\u0000\u024f\u025a\u0007\u0018\u0000\u0000\u0250\u0251"+ + "\u0005@\u0000\u0000\u0251\u0252\u0007\u0005\u0000\u0000\u0252\u0253\u0007"+ + "\u0001\u0000\u0000\u0253\u0254\u0007\f\u0000\u0000\u0254\u0255\u0007\u000b"+ + "\u0000\u0000\u0255\u0256\u0007\u0007\u0000\u0000\u0256\u0257\u0007\f\u0000"+ + "\u0000\u0257\u0258\u0007\u000e\u0000\u0000\u0258\u025a\u0007\u0003\u0000"+ + "\u0000\u0259\u024a\u0001\u0000\u0000\u0000\u0259\u0250\u0001\u0000\u0000"+ + "\u0000\u025a\u025b\u0001\u0000\u0000\u0000\u025b\u025c\u0006\t\u0001\u0000"+ + "\u025c\u001f\u0001\u0000\u0000\u0000\u025d\u025e\u0005@\u0000\u0000\u025e"+ + "\u025f\u0007\n\u0000\u0000\u025f\u0260\u0007\u000b\u0000\u0000\u0260\u0261"+ + "\u0007\u0001\u0000\u0000\u0261\u0289\u0007\r\u0000\u0000\u0262\u0263\u0005"+ + "@\u0000\u0000\u0263\u0264\u0007\n\u0000\u0000\u0264\u0265\u0007\u0006"+ + "\u0000\u0000\u0265\u0266\u0007\u0001\u0000\u0000\u0266\u0289\u0007\b\u0000"+ + "\u0000\u0267\u0268\u0005@\u0000\u0000\u0268\u0269\u0007\u0001\u0000\u0000"+ + "\u0269\u026a\u0007\u001a\u0000\u0000\u026a\u026b\u0007\u0003\u0000\u0000"+ + "\u026b\u026c\u0007\u0002\u0000\u0000\u026c\u026d\u0007\b\u0000\u0000\u026d"+ + "\u026e\u0007\u0002\u0000\u0000\u026e\u026f\u0007\u0007\u0000\u0000\u026f"+ + "\u0270\u0007\u000b\u0000\u0000\u0270\u0289\u0007\u0003\u0000\u0000\u0271"+ + "\u0272\u0005@\u0000\u0000\u0272\u0273\u0007\u001a\u0000\u0000\u0273\u0274"+ + "\u0007\u0007\u0000\u0000\u0274\u0275\u0007\u000b\u0000\u0000\u0275\u0276"+ + "\u0007\u0003\u0000\u0000\u0276\u0277\u0007\u0002\u0000\u0000\u0277\u0278"+ + "\u0007\u0003\u0000\u0000\u0278\u0279\u0007\u0004\u0000\u0000\u0279\u027a"+ + "\u0007\u0005\u0000\u0000\u027a\u027b\u0007\u000b\u0000\u0000\u027b\u027c"+ + "\u0007\u0002\u0000\u0000\u027c\u027d\u0007\u0003\u0000\u0000\u027d\u027e"+ + "\u0007\u0000\u0000\u0000\u027e\u027f\u0007\u0002\u0000\u0000\u027f\u0280"+ + "\u0007\u0003\u0000\u0000\u0280\u0281\u0007\n\u0000\u0000\u0281\u0289\u0007"+ + "\u0006\u0000\u0000\u0282\u0283\u0005@\u0000\u0000\u0283\u0284\u0007\u0003"+ + "\u0000\u0000\u0284\u0285\u0007\f\u0000\u0000\u0285\u0286\u0007\u0011\u0000"+ + "\u0000\u0286\u0287\u0001\u0000\u0000\u0000\u0287\u0289\u0003\u000e\u0001"+ + "\u0000\u0288\u025d\u0001\u0000\u0000\u0000\u0288\u0262\u0001\u0000\u0000"+ + "\u0000\u0288\u0267\u0001\u0000\u0000\u0000\u0288\u0271\u0001\u0000\u0000"+ + "\u0000\u0288\u0282\u0001\u0000\u0000\u0000\u0289\u028a\u0001\u0000\u0000"+ + "\u0000\u028a\u028b\u0006\n\u0001\u0000\u028b!\u0001\u0000\u0000\u0000"+ + "\u028c\u028d\u0005@\u0000\u0000\u028d\u028e\u0007\u001a\u0000\u0000\u028e"+ + "\u028f\u0007\u0003\u0000\u0000\u028f\u0290\u0007\u0002\u0000\u0000\u0290"+ + "\u0291\u0007\u0017\u0000\u0000\u0291\u0292\u0007\u0004\u0000\u0000\u0292"+ + "\u0293\u0007\u000b\u0000\u0000\u0293\u0294\u0007\u0007\u0000\u0000\u0294"+ + "\u0295\u0007\u0012\u0000\u0000\u0295\u0296\u0001\u0000\u0000\u0000\u0296"+ + "\u0297\u0006\u000b\u0002\u0000\u0297\u0298\u0006\u000b\u0001\u0000\u0298"+ + "#\u0001\u0000\u0000\u0000\u0299\u029a\u0005@\u0000\u0000\u029a\u029b\u0007"+ + "\u0003\u0000\u0000\u029b\u029c\u0007\f\u0000\u0000\u029c\u029d\u0007\u0011"+ + "\u0000\u0000\u029d\u029e\u0007\u001a\u0000\u0000\u029e\u029f\u0007\u0003"+ + "\u0000\u0000\u029f\u02a0\u0007\u0002\u0000\u0000\u02a0\u02a1\u0007\u0017"+ + "\u0000\u0000\u02a1\u02a2\u0007\u0004\u0000\u0000\u02a2\u02a3\u0007\u000b"+ + "\u0000\u0000\u02a3\u02a4\u0007\u0007\u0000\u0000\u02a4\u02a5\u0007\u0012"+ + "\u0000\u0000\u02a5\u02a6\u0001\u0000\u0000\u0000\u02a6\u02a7\u0006\f\u0001"+ + "\u0000\u02a7%\u0001\u0000\u0000\u0000\u02a8\u02a9\u0005@\u0000\u0000\u02a9"+ + "\u02aa\u0007\u0011\u0000\u0000\u02aa\u02c0\u0007\u0011\u0000\u0000\u02ab"+ + "\u02ac\u0005@\u0000\u0000\u02ac\u02ad\u0007\u0011\u0000\u0000\u02ad\u02ae"+ + "\u0007\u000e\u0000\u0000\u02ae\u02af\u0007\u0012\u0000\u0000\u02af\u02c0"+ + "\u0007\r\u0000\u0000\u02b0\u02b1\u0005@\u0000\u0000\u02b1\u02b2\u0007"+ + "\u001b\u0000\u0000\u02b2\u02c0\u0007\n\u0000\u0000\u02b3\u02b4\u0005@"+ + "\u0000\u0000\u02b4\u02b5\u0007\u001b\u0000\u0000\u02b5\u02b6\u0007\n\u0000"+ + "\u0000\u02b6\u02b7\u0007\u0001\u0000\u0000\u02b7\u02c0\u0007\f\u0000\u0000"+ + "\u02b8\u02b9\u0005@\u0000\u0000\u02b9\u02ba\u0007\u0007\u0000\u0000\u02ba"+ + "\u02bb\u0007\f\u0000\u0000\u02bb\u02bc\u0007\u001b\u0000\u0000\u02bc\u02bd"+ + "\u0007\u0003\u0000\u0000\u02bd\u02be\u0007\u0005\u0000\u0000\u02be\u02c0"+ + "\u0007\u000b\u0000\u0000\u02bf\u02a8\u0001\u0000\u0000\u0000\u02bf\u02ab"+ + "\u0001\u0000\u0000\u0000\u02bf\u02b0\u0001\u0000\u0000\u0000\u02bf\u02b3"+ + "\u0001\u0000\u0000\u0000\u02bf\u02b8\u0001\u0000\u0000\u0000\u02c0\u02c1"+ + "\u0001\u0000\u0000\u0000\u02c1\u02c2\u0006\r\u0000\u0000\u02c2\u02c3\u0006"+ + "\r\u0001\u0000\u02c3\'\u0001\u0000\u0000\u0000\u02c4\u02c5\u0005@\u0000"+ + "\u0000\u02c5\u02c6\u0007\u0003\u0000\u0000\u02c6\u02c7\u0007\t\u0000\u0000"+ + "\u02c7\u02c8\u0007\n\u0000\u0000\u02c8\u02e5\u0007\u0003\u0000\u0000\u02c9"+ + "\u02ca\u0005@\u0000\u0000\u02ca\u02cb\u0007\u0005\u0000\u0000\u02cb\u02cc"+ + "\u0007\n\u0000\u0000\u02cc\u02cd\u0007\u0002\u0000\u0000\u02cd\u02e5\u0007"+ + "\u0000\u0000\u0000\u02ce\u02cf\u0005@\u0000\u0000\u02cf\u02d0\u0007\u0011"+ + "\u0000\u0000\u02d0\u02d1\u0007\u0003\u0000\u0000\u02d1\u02d2\u0007\u0000"+ + "\u0000\u0000\u02d2\u02d3\u0007\u0004\u0000\u0000\u02d3\u02d4\u0007\u000e"+ + "\u0000\u0000\u02d4\u02d5\u0007\t\u0000\u0000\u02d5\u02e5\u0007\u000b\u0000"+ + "\u0000\u02d6\u02d7\u0005@\u0000\u0000\u02d7\u02d8\u0007\u0004\u0000\u0000"+ + "\u02d8\u02d9\u0007\r\u0000\u0000\u02d9\u02da\u0007\r\u0000\u0000\u02da"+ + "\u02db\u0007\u0003\u0000\u0000\u02db\u02dc\u0007\f\u0000\u0000\u02dc\u02e5"+ + "\u0007\u0011\u0000\u0000\u02dd\u02de\u0005@\u0000\u0000\u02de\u02df\u0007"+ + "\r\u0000\u0000\u02df\u02e0\u0007\u0004\u0000\u0000\u02e0\u02e1\u0007\u0002"+ + "\u0000\u0000\u02e1\u02e2\u0007\u0003\u0000\u0000\u02e2\u02e3\u0007\f\u0000"+ + "\u0000\u02e3\u02e5\u0007\u000b\u0000\u0000\u02e4\u02c4\u0001\u0000\u0000"+ + "\u0000\u02e4\u02c9\u0001\u0000\u0000\u0000\u02e4\u02ce\u0001\u0000\u0000"+ + "\u0000\u02e4\u02d6\u0001\u0000\u0000\u0000\u02e4\u02dd\u0001\u0000\u0000"+ + "\u0000\u02e5\u02e6\u0001\u0000\u0000\u0000\u02e6\u02e7\u0006\u000e\u0001"+ + "\u0000\u02e7)\u0001\u0000\u0000\u0000\u02e8\u02e9\u0005@\u0000\u0000\u02e9"+ + "\u02ea\u0007\r\u0000\u0000\u02ea\u02eb\u0007\u0006\u0000\u0000\u02eb\u02ec"+ + "\u0007\r\u0000\u0000\u02ec\u02ee\u0001\u0000\u0000\u0000\u02ed\u02ef\u0005"+ + " \u0000\u0000\u02ee\u02ed\u0001\u0000\u0000\u0000\u02ee\u02ef\u0001\u0000"+ + "\u0000\u0000\u02ef\u02f0\u0001\u0000\u0000\u0000\u02f0\u02f1\u0004\u000f"+ + "\u0001\u0000\u02f1\u02f2\u0001\u0000\u0000\u0000\u02f2\u02f3\u0006\u000f"+ + "\u0003\u0000\u02f3\u02f4\u0006\u000f\u0000\u0000\u02f4+\u0001\u0000\u0000"+ + "\u0000\u02f5\u02f6\u0005@\u0000\u0000\u02f6\u02f7\u0007\r\u0000\u0000"+ + "\u02f7\u02f8\u0007\u0006\u0000\u0000\u02f8\u02f9\u0007\r\u0000\u0000\u02f9"+ + "\u02fa\u0001\u0000\u0000\u0000\u02fa\u02fb\u0006\u0010\u0004\u0000\u02fb"+ + "-\u0001\u0000\u0000\u0000\u02fc\u02fd\u0005@\u0000\u0000\u02fd\u02fe\u0007"+ + "\u0003\u0000\u0000\u02fe\u02ff\u0007\f\u0000\u0000\u02ff\u0300\u0007\u0011"+ + "\u0000\u0000\u0300\u0301\u0001\u0000\u0000\u0000\u0301\u0302\u0003N!\u0000"+ + "\u0302\u0303\u0001\u0000\u0000\u0000\u0303\u0304\u0006\u0011\u0000\u0000"+ + "\u0304\u0305\u0006\u0011\u0001\u0000\u0305/\u0001\u0000\u0000\u0000\u0306"+ + "\u0307\u0005@\u0000\u0000\u0307\u0308\u0007\t\u0000\u0000\u0308\u0309"+ + "\u0007\u0007\u0000\u0000\u0309\u030a\u0007\u001a\u0000\u0000\u030a\u030b"+ + "\u0007\u0003\u0000\u0000\u030b\u030c\u0007\b\u0000\u0000\u030c\u030d\u0007"+ + "\u0007\u0000\u0000\u030d\u030e\u0007\u0002\u0000\u0000\u030e\u030f\u0007"+ + "\u0003\u0000\u0000\u030f\u0310\u0007\n\u0000\u0000\u0310\u0311\u0007\u000b"+ + "\u0000\u0000\u0311\u0312\u0007\u000f\u0000\u0000\u0312\u0313\u0007\t\u0000"+ + "\u0000\u0313\u0314\u0007\u0003\u0000\u0000\u0314\u034a\u0007\n\u0000\u0000"+ + "\u0315\u0316\u0005@\u0000\u0000\u0316\u0317\u0007\u0017\u0000\u0000\u0317"+ + "\u0318\u0007\u000e\u0000\u0000\u0318\u0319\u0007\u0018\u0000\u0000\u0319"+ + "\u031a\u0007\n\u0000\u0000\u031a\u031b\u0007\u000b\u0000\u0000\u031b\u031c"+ + "\u0007\u000f\u0000\u0000\u031c\u031d\u0007\t\u0000\u0000\u031d\u031e\u0007"+ + "\u0003\u0000\u0000\u031e\u034a\u0007\n\u0000\u0000\u031f\u0320\u0005@"+ + "\u0000\u0000\u0320\u0321\u0007\t\u0000\u0000\u0321\u0322\u0007\u0007\u0000"+ + "\u0000\u0322\u0323\u0007\u001a\u0000\u0000\u0323\u0324\u0007\u0003\u0000"+ + "\u0000\u0324\u0325\u0007\b\u0000\u0000\u0325\u0326\u0007\u0007\u0000\u0000"+ + "\u0326\u0327\u0007\u0002\u0000\u0000\u0327\u0328\u0007\u0003\u0000\u0000"+ + "\u0328\u0329\u0007\n\u0000\u0000\u0329\u032a\u0007\u0005\u0000\u0000\u032a"+ + "\u032b\u0007\u0002\u0000\u0000\u032b\u032c\u0007\u0007\u0000\u0000\u032c"+ + "\u032d\u0007\r\u0000\u0000\u032d\u032e\u0007\u000b\u0000\u0000\u032e\u034a"+ + "\u0007\n\u0000\u0000\u032f\u0330\u0005@\u0000\u0000\u0330\u0331\u0007"+ + "\u0017\u0000\u0000\u0331\u0332\u0007\u000e\u0000\u0000\u0332\u0333\u0007"+ + "\u0018\u0000\u0000\u0333\u0334\u0007\n\u0000\u0000\u0334\u0335\u0007\u0005"+ + "\u0000\u0000\u0335\u0336\u0007\u0002\u0000\u0000\u0336\u0337\u0007\u0007"+ + "\u0000\u0000\u0337\u0338\u0007\r\u0000\u0000\u0338\u0339\u0007\u000b\u0000"+ + "\u0000\u0339\u034a\u0007\n\u0000\u0000\u033a\u033b\u0005@\u0000\u0000"+ + "\u033b\u033c\u0007\u0005\u0000\u0000\u033c\u033d\u0007\t\u0000\u0000\u033d"+ + "\u033e\u0007\u0007\u0000\u0000\u033e\u033f\u0007\u0005\u0000\u0000\u033f"+ + "\u0340\u0007\u0018\u0000\u0000\u0340\u0346\u0001\u0000\u0000\u0000\u0341"+ + "\u0342\u0005.\u0000\u0000\u0342\u0343\u0007\u0004\u0000\u0000\u0343\u0344"+ + "\u0007\b\u0000\u0000\u0344\u0345\u0007\u0004\u0000\u0000\u0345\u0347\u0007"+ + "\u000f\u0000\u0000\u0346\u0341\u0001\u0000\u0000\u0000\u0346\u0347\u0001"+ + "\u0000\u0000\u0000\u0347\u0348\u0001\u0000\u0000\u0000\u0348\u034a\u0005"+ + "=\u0000\u0000\u0349\u0306\u0001\u0000\u0000\u0000\u0349\u0315\u0001\u0000"+ + "\u0000\u0000\u0349\u031f\u0001\u0000\u0000\u0000\u0349\u032f\u0001\u0000"+ + "\u0000\u0000\u0349\u033a\u0001\u0000\u0000\u0000\u034a\u034b\u0001\u0000"+ + "\u0000\u0000\u034b\u034c\u0006\u0012\u0001\u0000\u034c1\u0001\u0000\u0000"+ + "\u0000\u034d\u034e\u0005@\u0000\u0000\u034e\u034f\u0007\u001a\u0000\u0000"+ + "\u034f\u0350\u0007\u0007\u0000\u0000\u0350\u0351\u0007\u000b\u0000\u0000"+ + "\u0351\u0352\u0007\u0003\u0000\u0000\u0352\u0353\u0001\u0000\u0000\u0000"+ + "\u0353\u0354\u0006\u0013\u0000\u0000\u0354\u0355\u0006\u0013\u0001\u0000"+ + "\u03553\u0001\u0000\u0000\u0000\u0356\u0357\u0005@\u0000\u0000\u0357\u0358"+ + "\u0003N!\u0000\u0358\u0359\u0004\u0014\u0002\u0000\u0359\u035a\u0001\u0000"+ + "\u0000\u0000\u035a\u035b\u0006\u0014\u0000\u0000\u035b5\u0001\u0000\u0000"+ + "\u0000\u035c\u035d\u0005@\u0000\u0000\u035d\u035e\u0003N!\u0000\u035e"+ + "7\u0001\u0000\u0000\u0000\u035f\u0361\u0005@\u0000\u0000\u0360\u0362\u0007"+ + "\u001c\u0000\u0000\u0361\u0360\u0001\u0000\u0000\u0000\u0361\u0362\u0001"+ + "\u0000\u0000\u0000\u03629\u0001\u0000\u0000\u0000\u0363\u0364\u0005{\u0000"+ + "\u0000\u0364\u0365\u0005{\u0000\u0000\u0365\u0366\u0001\u0000\u0000\u0000"+ + "\u0366\u0367\u0006\u0017\u0005\u0000\u0367\u0368\u0006\u0017\u0006\u0000"+ + "\u0368;\u0001\u0000\u0000\u0000\u0369\u036a\u0005{\u0000\u0000\u036a\u036b"+ + "\u0005!\u0000\u0000\u036b\u036c\u0005!\u0000\u0000\u036c\u036d\u0001\u0000"+ + "\u0000\u0000\u036d\u036e\u0006\u0018\u0007\u0000\u036e\u036f\u0006\u0018"+ + "\b\u0000\u036f=\u0001\u0000\u0000\u0000\u0370\u0371\u0005/\u0000\u0000"+ + "\u0371\u0372\u0005*\u0000\u0000\u0372\u0376\u0001\u0000\u0000\u0000\u0373"+ + "\u0375\t\u0000\u0000\u0000\u0374\u0373\u0001\u0000\u0000\u0000\u0375\u0378"+ + "\u0001\u0000\u0000\u0000\u0376\u0377\u0001\u0000\u0000\u0000\u0376\u0374"+ + "\u0001\u0000\u0000\u0000\u0377\u0379\u0001\u0000\u0000\u0000\u0378\u0376"+ + "\u0001\u0000\u0000\u0000\u0379\u037a\u0005*\u0000\u0000\u037a\u037e\u0005"+ + "/\u0000\u0000\u037b\u037c\u0005/\u0000\u0000\u037c\u037e\u0005/\u0000"+ + "\u0000\u037d\u0370\u0001\u0000\u0000\u0000\u037d\u037b\u0001\u0000\u0000"+ + "\u0000\u037e\u037f\u0001\u0000\u0000\u0000\u037f\u0380\u0006\u0019\t\u0000"+ + "\u0380?\u0001\u0000\u0000\u0000\u0381\u0382\u0005<\u0000\u0000\u0382\u0383"+ + "\u0007\u0016\u0000\u0000\u0383\u0384\u0005-\u0000\u0000\u0384\u0385\u0001"+ + "\u0000\u0000\u0000\u0385\u0391\u0003\u0014\u0004\u0000\u0386\u0387\u0005"+ + "<\u0000\u0000\u0387\u038c\u0003\u0014\u0004\u0000\u0388\u0389\u0005:\u0000"+ + "\u0000\u0389\u038a\u0005:\u0000\u0000\u038a\u038b\u0001\u0000\u0000\u0000"+ + "\u038b\u038d\u0003\u0014\u0004\u0000\u038c\u0388\u0001\u0000\u0000\u0000"+ + "\u038d\u038e\u0001\u0000\u0000\u0000\u038e\u038c\u0001\u0000\u0000\u0000"+ + "\u038e\u038f\u0001\u0000\u0000\u0000\u038f\u0391\u0001\u0000\u0000\u0000"+ + "\u0390\u0381\u0001\u0000\u0000\u0000\u0390\u0386\u0001\u0000\u0000\u0000"+ + "\u0391\u0392\u0001\u0000\u0000\u0000\u0392\u0393\u0006\u001a\t\u0000\u0393"+ + "\u0394\u0006\u001a\n\u0000\u0394A\u0001\u0000\u0000\u0000\u0395\u0396"+ + "\u0005<\u0000\u0000\u0396\u0397\u0005/\u0000\u0000\u0397\u0398\u0001\u0000"+ + "\u0000\u0000\u0398\u0399\u0003R#\u0000\u0399\u039d\u0005>\u0000\u0000"+ + "\u039a\u039c\u0007\u001d\u0000\u0000\u039b\u039a\u0001\u0000\u0000\u0000"+ + "\u039c\u039f\u0001\u0000\u0000\u0000\u039d\u039b\u0001\u0000\u0000\u0000"+ + "\u039d\u039e\u0001\u0000\u0000\u0000\u039e\u03a1\u0001\u0000\u0000\u0000"+ + "\u039f\u039d\u0001\u0000\u0000\u0000\u03a0\u0395\u0001\u0000\u0000\u0000"+ + "\u03a1\u03a2\u0001\u0000\u0000\u0000\u03a2\u03a0\u0001\u0000\u0000\u0000"+ + "\u03a2\u03a3\u0001\u0000\u0000\u0000\u03a3\u03a4\u0001\u0000\u0000\u0000"+ + "\u03a4\u03a5\u0006\u001b\t\u0000\u03a5C\u0001\u0000\u0000\u0000\u03a6"+ + "\u03a8\u0005 \u0000\u0000\u03a7\u03a6\u0001\u0000\u0000\u0000\u03a8\u03a9"+ + "\u0001\u0000\u0000\u0000\u03a9\u03a7\u0001\u0000\u0000\u0000\u03a9\u03aa"+ + "\u0001\u0000\u0000\u0000\u03aa\u03c0\u0001\u0000\u0000\u0000\u03ab\u03ad"+ + "\u0007\u001e\u0000\u0000\u03ac\u03ab\u0001\u0000\u0000\u0000\u03ad\u03ae"+ + "\u0001\u0000\u0000\u0000\u03ae\u03ac\u0001\u0000\u0000\u0000\u03ae\u03af"+ + "\u0001\u0000\u0000\u0000\u03af\u03c0\u0001\u0000\u0000\u0000\u03b0\u03c0"+ + "\u0003\u0014\u0004\u0000\u03b1\u03c0\u0003\u0016\u0005\u0000\u03b2\u03b3"+ + "\u0005\"\u0000\u0000\u03b3\u03c0\u0004\u001c\u0003\u0000\u03b4\u03b5\u0005"+ + "\\\u0000\u0000\u03b5\u03b6\u0005\'\u0000\u0000\u03b6\u03b7\u0001\u0000"+ + "\u0000\u0000\u03b7\u03c0\u0004\u001c\u0004\u0000\u03b8\u03c0\u0007\u001f"+ + "\u0000\u0000\u03b9\u03bb\u0007 \u0000\u0000\u03ba\u03b9\u0001\u0000\u0000"+ + "\u0000\u03bb\u03bc\u0001\u0000\u0000\u0000\u03bc\u03ba\u0001\u0000\u0000"+ + "\u0000\u03bc\u03bd\u0001\u0000\u0000\u0000\u03bd\u03c0\u0001\u0000\u0000"+ + "\u0000\u03be\u03c0\u0007!\u0000\u0000\u03bf\u03a7\u0001\u0000\u0000\u0000"+ + "\u03bf\u03ac\u0001\u0000\u0000\u0000\u03bf\u03b0\u0001\u0000\u0000\u0000"+ + "\u03bf\u03b1\u0001\u0000\u0000\u0000\u03bf\u03b2\u0001\u0000\u0000\u0000"+ + "\u03bf\u03b4\u0001\u0000\u0000\u0000\u03bf\u03b8\u0001\u0000\u0000\u0000"+ + "\u03bf\u03ba\u0001\u0000\u0000\u0000\u03bf\u03be\u0001\u0000\u0000\u0000"+ + "\u03c0\u03c3\u0001\u0000\u0000\u0000\u03c1\u03bf\u0001\u0000\u0000\u0000"+ + "\u03c1\u03c2\u0001\u0000\u0000\u0000\u03c2\u03c4\u0001\u0000\u0000\u0000"+ + "\u03c3\u03c1\u0001\u0000\u0000\u0000\u03c4\u03c5\u0005<\u0000\u0000\u03c5"+ + "\u03c6\u0004\u001c\u0005\u0000\u03c6\u03c7\u0001\u0000\u0000\u0000\u03c7"+ + "\u03c8\u0006\u001c\u000b\u0000\u03c8\u03c9\u0006\u001c\f\u0000\u03c9E"+ + "\u0001\u0000\u0000\u0000\u03ca\u03cc\u0005 \u0000\u0000\u03cb\u03ca\u0001"+ + "\u0000\u0000\u0000\u03cc\u03cd\u0001\u0000\u0000\u0000\u03cd\u03cb\u0001"+ + "\u0000\u0000\u0000\u03cd\u03ce\u0001\u0000\u0000\u0000\u03ce\u03e6\u0001"+ + "\u0000\u0000\u0000\u03cf\u03d1\u0007\u001e\u0000\u0000\u03d0\u03cf\u0001"+ + "\u0000\u0000\u0000\u03d1\u03d2\u0001\u0000\u0000\u0000\u03d2\u03d0\u0001"+ + "\u0000\u0000\u0000\u03d2\u03d3\u0001\u0000\u0000\u0000\u03d3\u03e6\u0001"+ + "\u0000\u0000\u0000\u03d4\u03d6\u0007\"\u0000\u0000\u03d5\u03d4\u0001\u0000"+ + "\u0000\u0000\u03d5\u03d6\u0001\u0000\u0000\u0000\u03d6\u03d7\u0001\u0000"+ + "\u0000\u0000\u03d7\u03e6\u0003\u0014\u0004\u0000\u03d8\u03e6\u0003\u0016"+ + "\u0005\u0000\u03d9\u03da\u0005\"\u0000\u0000\u03da\u03e6\u0004\u001d\u0006"+ + "\u0000\u03db\u03e6\u0005,\u0000\u0000\u03dc\u03dd\u0005\\\u0000\u0000"+ + "\u03dd\u03e6\u0005\'\u0000\u0000\u03de\u03e6\u0007#\u0000\u0000\u03df"+ + "\u03e1\u0007 \u0000\u0000\u03e0\u03df\u0001\u0000\u0000\u0000\u03e1\u03e2"+ + "\u0001\u0000\u0000\u0000\u03e2\u03e0\u0001\u0000\u0000\u0000\u03e2\u03e3"+ + "\u0001\u0000\u0000\u0000\u03e3\u03e6\u0001\u0000\u0000\u0000\u03e4\u03e6"+ + "\u0007!\u0000\u0000\u03e5\u03cb\u0001\u0000\u0000\u0000\u03e5\u03d0\u0001"+ + "\u0000\u0000\u0000\u03e5\u03d5\u0001\u0000\u0000\u0000\u03e5\u03d8\u0001"+ + "\u0000\u0000\u0000\u03e5\u03d9\u0001\u0000\u0000\u0000\u03e5\u03db\u0001"+ + "\u0000\u0000\u0000\u03e5\u03dc\u0001\u0000\u0000\u0000\u03e5\u03de\u0001"+ + "\u0000\u0000\u0000\u03e5\u03e0\u0001\u0000\u0000\u0000\u03e5\u03e4\u0001"+ + "\u0000\u0000\u0000\u03e6\u03e7\u0001\u0000\u0000\u0000\u03e7\u03e5\u0001"+ + "\u0000\u0000\u0000\u03e7\u03e8\u0001\u0000\u0000\u0000\u03e8\u03e9\u0001"+ + "\u0000\u0000\u0000\u03e9\u03ea\u0006\u001d\t\u0000\u03eaG\u0001\u0000"+ + "\u0000\u0000\u03eb\u03ed\u0005 \u0000\u0000\u03ec\u03eb\u0001\u0000\u0000"+ + "\u0000\u03ed\u03ee\u0001\u0000\u0000\u0000\u03ee\u03ec\u0001\u0000\u0000"+ + "\u0000\u03ee\u03ef\u0001\u0000\u0000\u0000\u03ef\u03f6\u0001\u0000\u0000"+ + "\u0000\u03f0\u03f2\u0007\u001e\u0000\u0000\u03f1\u03f0\u0001\u0000\u0000"+ + "\u0000\u03f2\u03f3\u0001\u0000\u0000\u0000\u03f3\u03f1\u0001\u0000\u0000"+ + "\u0000\u03f3\u03f4\u0001\u0000\u0000\u0000\u03f4\u03f6\u0001\u0000\u0000"+ + "\u0000\u03f5\u03ec\u0001\u0000\u0000\u0000\u03f5\u03f1\u0001\u0000\u0000"+ + "\u0000\u03f6\u03f7\u0001\u0000\u0000\u0000\u03f7\u03f8\u0006\u001e\t\u0000"+ + "\u03f8I\u0001\u0000\u0000\u0000\u03f9\u03fa\u0005{\u0000\u0000\u03fa\u03ff"+ + "\u0005!\u0000\u0000\u03fb\u03fc\u0005{\u0000\u0000\u03fc\u03fd\u0005{"+ + "\u0000\u0000\u03fd\u03ff\u0005-\u0000\u0000\u03fe\u03f9\u0001\u0000\u0000"+ + "\u0000\u03fe\u03fb\u0001\u0000\u0000\u0000\u03ff\u0400\u0001\u0000\u0000"+ + "\u0000\u0400\u0401\u0006\u001f\t\u0000\u0401K\u0001\u0000\u0000\u0000"+ + "\u0402\u0403\t\u0000\u0000\u0000\u0403\u0404\u0001\u0000\u0000\u0000\u0404"+ + "\u0405\u0006 \t\u0000\u0405M\u0001\u0000\u0000\u0000\u0406\u040a\u0007"+ + "\u0014\u0000\u0000\u0407\u0409\u0007$\u0000\u0000\u0408\u0407\u0001\u0000"+ + "\u0000\u0000\u0409\u040c\u0001\u0000\u0000\u0000\u040a\u0408\u0001\u0000"+ + "\u0000\u0000\u040a\u040b\u0001\u0000\u0000\u0000\u040bO\u0001\u0000\u0000"+ + "\u0000\u040c\u040a\u0001\u0000\u0000\u0000\u040d\u0411\u0007%\u0000\u0000"+ + "\u040e\u0410\u0007&\u0000\u0000\u040f\u040e\u0001\u0000\u0000\u0000\u0410"+ + "\u0413\u0001\u0000\u0000\u0000\u0411\u040f\u0001\u0000\u0000\u0000\u0411"+ + "\u0412\u0001\u0000\u0000\u0000\u0412Q\u0001\u0000\u0000\u0000\u0413\u0411"+ + "\u0001\u0000\u0000\u0000\u0414\u0418\u0007\u0014\u0000\u0000\u0415\u0417"+ + "\u0007\'\u0000\u0000\u0416\u0415\u0001\u0000\u0000\u0000\u0417\u041a\u0001"+ + "\u0000\u0000\u0000\u0418\u0416\u0001\u0000\u0000\u0000\u0418\u0419\u0001"+ + "\u0000\u0000\u0000\u0419S\u0001\u0000\u0000\u0000\u041a\u0418\u0001\u0000"+ + "\u0000\u0000\u041b\u041c\u0007(\u0000\u0000\u041cU\u0001\u0000\u0000\u0000"+ + "\u041d\u0422\u0005\"\u0000\u0000\u041e\u0421\u0003T$\u0000\u041f\u0421"+ + "\t\u0000\u0000\u0000\u0420\u041e\u0001\u0000\u0000\u0000\u0420\u041f\u0001"+ + "\u0000\u0000\u0000\u0421\u0424\u0001\u0000\u0000\u0000\u0422\u0423\u0001"+ + "\u0000\u0000\u0000\u0422\u0420\u0001\u0000\u0000\u0000\u0423\u0425\u0001"+ + "\u0000\u0000\u0000\u0424\u0422\u0001\u0000\u0000\u0000\u0425\u0426\u0005"+ + "\"\u0000\u0000\u0426W\u0001\u0000\u0000\u0000\u0427\u042d\u0005\'\u0000"+ + "\u0000\u0428\u042c\b)\u0000\u0000\u0429\u042a\u0005\\\u0000\u0000\u042a"+ + "\u042c\t\u0000\u0000\u0000\u042b\u0428\u0001\u0000\u0000\u0000\u042b\u0429"+ + "\u0001\u0000\u0000\u0000\u042c\u042f\u0001\u0000\u0000\u0000\u042d\u042b"+ + "\u0001\u0000\u0000\u0000\u042d\u042e\u0001\u0000\u0000\u0000\u042e\u0430"+ + "\u0001\u0000\u0000\u0000\u042f\u042d\u0001\u0000\u0000\u0000\u0430\u0431"+ + "\u0005\'\u0000\u0000\u0431Y\u0001\u0000\u0000\u0000\u0432\u0433\u0005"+ + "/\u0000\u0000\u0433\u0434\u0005/\u0000\u0000\u0434\u0438\u0001\u0000\u0000"+ + "\u0000\u0435\u0437\b\u001e\u0000\u0000\u0436\u0435\u0001\u0000\u0000\u0000"+ + "\u0437\u043a\u0001\u0000\u0000\u0000\u0438\u0436\u0001\u0000\u0000\u0000"+ + "\u0438\u0439\u0001\u0000\u0000\u0000\u0439[\u0001\u0000\u0000\u0000\u043a"+ + "\u0438\u0001\u0000\u0000\u0000\u043b\u043c\u0005$\u0000\u0000\u043c\u043d"+ + "\u0003N!\u0000\u043d]\u0001\u0000\u0000\u0000\u043e\u043f\u0007\u0004"+ + "\u0000\u0000\u043f\u0440\u0007\u0002\u0000\u0000\u0440\u0441\u0007\u0002"+ + "\u0000\u0000\u0441\u0442\u0007\u0004\u0000\u0000\u0442\u0451\u0007\u000f"+ + "\u0000\u0000\u0443\u0444\u0007\u0005\u0000\u0000\u0444\u0445\u0007\t\u0000"+ + "\u0000\u0445\u0446\u0007\u0004\u0000\u0000\u0446\u0447\u0007\n\u0000\u0000"+ + "\u0447\u0451\u0007\n\u0000\u0000\u0448\u0449\u0007\u0003\u0000\u0000\u0449"+ + "\u044a\u0007\u0012\u0000\u0000\u044a\u044b\u0007\r\u0000\u0000\u044b\u044c"+ + "\u0007\u000b\u0000\u0000\u044c\u0451\u0007\u000f\u0000\u0000\u044d\u044e"+ + "\u0007\u000e\u0000\u0000\u044e\u044f\u0007\n\u0000\u0000\u044f\u0451\u0007"+ + "\u0003\u0000\u0000\u0450\u043e\u0001\u0000\u0000\u0000\u0450\u0443\u0001"+ + "\u0000\u0000\u0000\u0450\u0448\u0001\u0000\u0000\u0000\u0450\u044d\u0001"+ + "\u0000\u0000\u0000\u0451_\u0001\u0000\u0000\u0000\u0452\u0453\u000209"+ + "\u0000\u0453a\u0001\u0000\u0000\u0000\u0454\u0455\u0005{\u0000\u0000\u0455"+ + "\u0456\u0005{\u0000\u0000\u0456\u0457\u0005-\u0000\u0000\u0457\u0458\u0005"+ + "-\u0000\u0000\u0458\u0459\u0001\u0000\u0000\u0000\u0459\u045a\u0006+\r"+ + "\u0000\u045ac\u0001\u0000\u0000\u0000\u045b\u045c\u0005@\u0000\u0000\u045c"+ + "\u045d\u0003R#\u0000\u045d\u045e\u0005.\u0000\u0000\u045e\u045f\u0001"+ + "\u0000\u0000\u0000\u045f\u0460\u0006,\t\u0000\u0460e\u0001\u0000\u0000"+ + "\u0000\u0461\u0466\u0005@\u0000\u0000\u0462\u0464\u0003`*\u0000\u0463"+ + "\u0465\u0005.\u0000\u0000\u0464\u0463\u0001\u0000\u0000\u0000\u0464\u0465"+ + "\u0001\u0000\u0000\u0000\u0465\u0467\u0001\u0000\u0000\u0000\u0466\u0462"+ + "\u0001\u0000\u0000\u0000\u0467\u0468\u0001\u0000\u0000\u0000\u0468\u0466"+ + "\u0001\u0000\u0000\u0000\u0468\u0469\u0001\u0000\u0000\u0000\u0469\u046a"+ + "\u0001\u0000\u0000\u0000\u046a\u046b\u0006-\t\u0000\u046bg\u0001\u0000"+ + "\u0000\u0000\u046c\u046d\u0005{\u0000\u0000\u046d\u046e\u0005{\u0000\u0000"+ + "\u046e\u054b\u0005{\u0000\u0000\u046f\u0470\u0005@\u0000\u0000\u0470\u0471"+ + "\u0005@\u0000\u0000\u0471\u0473\u0001\u0000\u0000\u0000\u0472\u0474\u0005"+ + "@\u0000\u0000\u0473\u0472\u0001\u0000\u0000\u0000\u0473\u0474\u0001\u0000"+ + "\u0000\u0000\u0474\u054b\u0001\u0000\u0000\u0000\u0475\u0476\u0005@\u0000"+ + "\u0000\u0476\u0477\u0005{\u0000\u0000\u0477\u0479\u0001\u0000\u0000\u0000"+ + "\u0478\u047a\u0005{\u0000\u0000\u0479\u0478\u0001\u0000\u0000\u0000\u0479"+ + "\u047a\u0001\u0000\u0000\u0000\u047a\u054b\u0001\u0000\u0000\u0000\u047b"+ + "\u047c\u0005@\u0000\u0000\u047c\u047d\u0007\u0012\u0000\u0000\u047d\u047e"+ + "\u0007\u0003\u0000\u0000\u047e\u047f\u0007\u0011\u0000\u0000\u047f\u0480"+ + "\u0007\u0007\u0000\u0000\u0480\u0481\u0007\u0004\u0000\u0000\u0481\u0485"+ + "\u0001\u0000\u0000\u0000\u0482\u0484\u0007*\u0000\u0000\u0483\u0482\u0001"+ + "\u0000\u0000\u0000\u0484\u0487\u0001\u0000\u0000\u0000\u0485\u0483\u0001"+ + "\u0000\u0000\u0000\u0485\u0486\u0001\u0000\u0000\u0000\u0486\u0489\u0001"+ + "\u0000\u0000\u0000\u0487\u0485\u0001\u0000\u0000\u0000\u0488\u048a\u0005"+ + "(\u0000\u0000\u0489\u0488\u0001\u0000\u0000\u0000\u0489\u048a\u0001\u0000"+ + "\u0000\u0000\u048a\u054b\u0001\u0000\u0000\u0000\u048b\u048c\u0005@\u0000"+ + "\u0000\u048c\u048d\u0007\u0005\u0000\u0000\u048d\u048e\u0007\u0006\u0000"+ + "\u0000\u048e\u048f\u0007\u0004\u0000\u0000\u048f\u0490\u0007\u0002\u0000"+ + "\u0000\u0490\u0491\u0007\n\u0000\u0000\u0491\u0492\u0007\u0003\u0000\u0000"+ + "\u0492\u0493\u0007\u000b\u0000\u0000\u0493\u0497\u0001\u0000\u0000\u0000"+ + "\u0494\u0496\u0007*\u0000\u0000\u0495\u0494\u0001\u0000\u0000\u0000\u0496"+ + "\u0499\u0001\u0000\u0000\u0000\u0497\u0495\u0001\u0000\u0000\u0000\u0497"+ + "\u0498\u0001\u0000\u0000\u0000\u0498\u054b\u0001\u0000\u0000\u0000\u0499"+ + "\u0497\u0001\u0000\u0000\u0000\u049a\u049b\u0005@\u0000\u0000\u049b\u049c"+ + "\u0007\u0007\u0000\u0000\u049c\u049d\u0007\u0012\u0000\u0000\u049d\u049e"+ + "\u0007\r\u0000\u0000\u049e\u049f\u0007\u0001\u0000\u0000\u049f\u04a0\u0007"+ + "\u0002\u0000\u0000\u04a0\u04a1\u0007\u000b\u0000\u0000\u04a1\u04a5\u0001"+ + "\u0000\u0000\u0000\u04a2\u04a4\u0007*\u0000\u0000\u04a3\u04a2\u0001\u0000"+ + "\u0000\u0000\u04a4\u04a7\u0001\u0000\u0000\u0000\u04a5\u04a3\u0001\u0000"+ + "\u0000\u0000\u04a5\u04a6\u0001\u0000\u0000\u0000\u04a6\u054b\u0001\u0000"+ + "\u0000\u0000\u04a7\u04a5\u0001\u0000\u0000\u0000\u04a8\u04a9\u0005@\u0000"+ + "\u0000\u04a9\u04aa\u0007\f\u0000\u0000\u04aa\u04ab\u0007\u0004\u0000\u0000"+ + "\u04ab\u04ac\u0007\u0012\u0000\u0000\u04ac\u04ad\u0007\u0003\u0000\u0000"+ + "\u04ad\u04ae\u0007\n\u0000\u0000\u04ae\u04af\u0007\r\u0000\u0000\u04af"+ + "\u04b0\u0007\u0004\u0000\u0000\u04b0\u04b1\u0007\u0005\u0000\u0000\u04b1"+ + "\u04b2\u0007\u0003\u0000\u0000\u04b2\u04b6\u0001\u0000\u0000\u0000\u04b3"+ + "\u04b5\u0007*\u0000\u0000\u04b4\u04b3\u0001\u0000\u0000\u0000\u04b5\u04b8"+ + "\u0001\u0000\u0000\u0000\u04b6\u04b4\u0001\u0000\u0000\u0000\u04b6\u04b7"+ + "\u0001\u0000\u0000\u0000\u04b7\u054b\u0001\u0000\u0000\u0000\u04b8\u04b6"+ + "\u0001\u0000\u0000\u0000\u04b9\u04ba\u0005@\u0000\u0000\u04ba\u04bb\u0007"+ + "\u0011\u0000\u0000\u04bb\u04bc\u0007\u0001\u0000\u0000\u04bc\u04bd\u0007"+ + "\u0005\u0000\u0000\u04bd\u04be\u0007\u000e\u0000\u0000\u04be\u04bf\u0007"+ + "\u0012\u0000\u0000\u04bf\u04c0\u0007\u0003\u0000\u0000\u04c0\u04c1\u0007"+ + "\f\u0000\u0000\u04c1\u04c2\u0007\u000b\u0000\u0000\u04c2\u04c6\u0001\u0000"+ + "\u0000\u0000\u04c3\u04c5\u0007*\u0000\u0000\u04c4\u04c3\u0001\u0000\u0000"+ + "\u0000\u04c5\u04c8\u0001\u0000\u0000\u0000\u04c6\u04c4\u0001\u0000\u0000"+ + "\u0000\u04c6\u04c7\u0001\u0000\u0000\u0000\u04c7\u054b\u0001\u0000\u0000"+ + "\u0000\u04c8\u04c6\u0001\u0000\u0000\u0000\u04c9\u04ca\u0005@\u0000\u0000"+ + "\u04ca\u04cb\u0007\u0000\u0000\u0000\u04cb\u04cc\u0007\u0001\u0000\u0000"+ + "\u04cc\u04cd\u0007\f\u0000\u0000\u04cd\u04ce\u0007\u000b\u0000\u0000\u04ce"+ + "\u04cf\u0005-\u0000\u0000\u04cf\u04d0\u0007\u0000\u0000\u0000\u04d0\u04d1"+ + "\u0007\u0004\u0000\u0000\u04d1\u04d2\u0007\u0005\u0000\u0000\u04d2\u04d3"+ + "\u0007\u0003\u0000\u0000\u04d3\u04d7\u0001\u0000\u0000\u0000\u04d4\u04d6"+ + "\u0007*\u0000\u0000\u04d5\u04d4\u0001\u0000\u0000\u0000\u04d6\u04d9\u0001"+ + "\u0000\u0000\u0000\u04d7\u04d5\u0001\u0000\u0000\u0000\u04d7\u04d8\u0001"+ + "\u0000\u0000\u0000\u04d8\u054b\u0001\u0000\u0000\u0000\u04d9\u04d7\u0001"+ + "\u0000\u0000\u0000\u04da\u04db\u0005@\u0000\u0000\u04db\u04dc\u0007\r"+ + "\u0000\u0000\u04dc\u04dd\u0007\u0004\u0000\u0000\u04dd\u04de\u0007\u0010"+ + "\u0000\u0000\u04de\u04df\u0007\u0003\u0000\u0000\u04df\u04e3\u0001\u0000"+ + "\u0000\u0000\u04e0\u04e2\u0007*\u0000\u0000\u04e1\u04e0\u0001\u0000\u0000"+ + "\u0000\u04e2\u04e5\u0001\u0000\u0000\u0000\u04e3\u04e1\u0001\u0000\u0000"+ + "\u0000\u04e3\u04e4\u0001\u0000\u0000\u0000\u04e4\u054b\u0001\u0000\u0000"+ + "\u0000\u04e5\u04e3\u0001\u0000\u0000\u0000\u04e6\u04e7\u0005@\u0000\u0000"+ + "\u04e7\u04e8\u0007\n\u0000\u0000\u04e8\u04e9\u0007\u000e\u0000\u0000\u04e9"+ + "\u04ea\u0007\r\u0000\u0000\u04ea\u04eb\u0007\r\u0000\u0000\u04eb\u04ec"+ + "\u0007\u0001\u0000\u0000\u04ec\u04ed\u0007\u0002\u0000\u0000\u04ed\u04ee"+ + "\u0007\u000b\u0000\u0000\u04ee\u04ef\u0007\n\u0000\u0000\u04ef\u04f3\u0001"+ + "\u0000\u0000\u0000\u04f0\u04f2\u0007*\u0000\u0000\u04f1\u04f0\u0001\u0000"+ + "\u0000\u0000\u04f2\u04f5\u0001\u0000\u0000\u0000\u04f3\u04f1\u0001\u0000"+ + "\u0000\u0000\u04f3\u04f4\u0001\u0000\u0000\u0000\u04f4\u054b\u0001\u0000"+ + "\u0000\u0000\u04f5\u04f3\u0001\u0000\u0000\u0000\u04f6\u04f7\u0005@\u0000"+ + "\u0000\u04f7\u04f8\u0007\t\u0000\u0000\u04f8\u04f9\u0007\u0004\u0000\u0000"+ + "\u04f9\u04fa\u0007\u000f\u0000\u0000\u04fa\u04fb\u0007\u0003\u0000\u0000"+ + "\u04fb\u04fc\u0007\u0002\u0000\u0000\u04fc\u0500\u0001\u0000\u0000\u0000"+ + "\u04fd\u04ff\u0007*\u0000\u0000\u04fe\u04fd\u0001\u0000\u0000\u0000\u04ff"+ + "\u0502\u0001\u0000\u0000\u0000\u0500\u04fe\u0001\u0000\u0000\u0000\u0500"+ + "\u0501\u0001\u0000\u0000\u0000\u0501\u054b\u0001\u0000\u0000\u0000\u0502"+ + "\u0500\u0001\u0000\u0000\u0000\u0503\u0504\u0005@\u0000\u0000\u0504\u0505"+ + "\u0007\u000b\u0000\u0000\u0505\u0506\u0007\u0004\u0000\u0000\u0506\u0507"+ + "\u0007\u0007\u0000\u0000\u0507\u0508\u0007\t\u0000\u0000\u0508\u0509\u0007"+ + "\b\u0000\u0000\u0509\u050a\u0007\u0007\u0000\u0000\u050a\u050b\u0007\f"+ + "\u0000\u0000\u050b\u050c\u0007\u0011\u0000\u0000\u050c\u0510\u0001\u0000"+ + "\u0000\u0000\u050d\u050f\u0007*\u0000\u0000\u050e\u050d\u0001\u0000\u0000"+ + "\u0000\u050f\u0512\u0001\u0000\u0000\u0000\u0510\u050e\u0001\u0000\u0000"+ + "\u0000\u0510\u0511\u0001\u0000\u0000\u0000\u0511\u054b\u0001\u0000\u0000"+ + "\u0000\u0512\u0510\u0001\u0000\u0000\u0000\u0513\u0514\u0005@\u0000\u0000"+ + "\u0514\u0515\u0007\u0004\u0000\u0000\u0515\u0516\u0007\r\u0000\u0000\u0516"+ + "\u0517\u0007\r\u0000\u0000\u0517\u0518\u0007\t\u0000\u0000\u0518\u0519"+ + "\u0007\u000f\u0000\u0000\u0519\u051d\u0001\u0000\u0000\u0000\u051a\u051c"+ + "\u0007*\u0000\u0000\u051b\u051a\u0001\u0000\u0000\u0000\u051c\u051f\u0001"+ + "\u0000\u0000\u0000\u051d\u051b\u0001\u0000\u0000\u0000\u051d\u051e\u0001"+ + "\u0000\u0000\u0000\u051e\u054b\u0001\u0000\u0000\u0000\u051f\u051d\u0001"+ + "\u0000\u0000\u0000\u0520\u0521\u0005@\u0000\u0000\u0521\u0522\u0005-\u0000"+ + "\u0000\u0522\u0523\u0007\b\u0000\u0000\u0523\u0524\u0007\u0003\u0000\u0000"+ + "\u0524\u0525\u0007\u0017\u0000\u0000\u0525\u0526\u0007\u0018\u0000\u0000"+ + "\u0526\u0527\u0007\u0007\u0000\u0000\u0527\u0528\u0007\u000b\u0000\u0000"+ + "\u0528\u0529\u0005-\u0000\u0000\u0529\u052a\u0007\u0018\u0000\u0000\u052a"+ + "\u052b\u0007\u0003\u0000\u0000\u052b\u052c\u0007\u000f\u0000\u0000\u052c"+ + "\u052d\u0007\u0000\u0000\u0000\u052d\u052e\u0007\u0002\u0000\u0000\u052e"+ + "\u052f\u0007\u0004\u0000\u0000\u052f\u0530\u0007\u0012\u0000\u0000\u0530"+ + "\u0531\u0007\u0003\u0000\u0000\u0531\u0532\u0007\n\u0000\u0000\u0532\u0536"+ + "\u0001\u0000\u0000\u0000\u0533\u0535\u0007*\u0000\u0000\u0534\u0533\u0001"+ + "\u0000\u0000\u0000\u0535\u0538\u0001\u0000\u0000\u0000\u0536\u0534\u0001"+ + "\u0000\u0000\u0000\u0536\u0537\u0001\u0000\u0000\u0000\u0537\u054b\u0001"+ + "\u0000\u0000\u0000\u0538\u0536\u0001\u0000\u0000\u0000\u0539\u053a\u0005"+ + "@\u0000\u0000\u053a\u053b\u0007\u0018\u0000\u0000\u053b\u053c\u0007\u0003"+ + "\u0000\u0000\u053c\u053d\u0007\u000f\u0000\u0000\u053d\u053e\u0007\u0000"+ + "\u0000\u0000\u053e\u053f\u0007\u0002\u0000\u0000\u053f\u0540\u0007\u0004"+ + "\u0000\u0000\u0540\u0541\u0007\u0012\u0000\u0000\u0541\u0542\u0007\u0003"+ + "\u0000\u0000\u0542\u0543\u0007\n\u0000\u0000\u0543\u0547\u0001\u0000\u0000"+ + "\u0000\u0544\u0546\u0007*\u0000\u0000\u0545\u0544\u0001\u0000\u0000\u0000"+ + "\u0546\u0549\u0001\u0000\u0000\u0000\u0547\u0545\u0001\u0000\u0000\u0000"+ + "\u0547\u0548\u0001\u0000\u0000\u0000\u0548\u054b\u0001\u0000\u0000\u0000"+ + "\u0549\u0547\u0001\u0000\u0000\u0000\u054a\u046c\u0001\u0000\u0000\u0000"+ + "\u054a\u046f\u0001\u0000\u0000\u0000\u054a\u0475\u0001\u0000\u0000\u0000"+ + "\u054a\u047b\u0001\u0000\u0000\u0000\u054a\u048b\u0001\u0000\u0000\u0000"+ + "\u054a\u049a\u0001\u0000\u0000\u0000\u054a\u04a8\u0001\u0000\u0000\u0000"+ + "\u054a\u04b9\u0001\u0000\u0000\u0000\u054a\u04c9\u0001\u0000\u0000\u0000"+ + "\u054a\u04da\u0001\u0000\u0000\u0000\u054a\u04e6\u0001\u0000\u0000\u0000"+ + "\u054a\u04f6\u0001\u0000\u0000\u0000\u054a\u0503\u0001\u0000\u0000\u0000"+ + "\u054a\u0513\u0001\u0000\u0000\u0000\u054a\u0520\u0001\u0000\u0000\u0000"+ + "\u054a\u0539\u0001\u0000\u0000\u0000\u054b\u054c\u0001\u0000\u0000\u0000"+ + "\u054c\u054d\u0006.\t\u0000\u054di\u0001\u0000\u0000\u0000\u054e\u054f"+ + "\t\u0000\u0000\u0000\u054f\u0550\u0004/\u0007\u0000\u0550\u0551\u0001"+ + "\u0000\u0000\u0000\u0551\u0552\u0006/\u000e\u0000\u0552\u0553\u0006/\u000f"+ + "\u0000\u0553k\u0001\u0000\u0000\u0000\u0554\u0555\t\u0000\u0000\u0000"+ + "\u0555\u0556\u0001\u0000\u0000\u0000\u0556\u0557\u00060\f\u0000\u0557"+ + "m\u0001\u0000\u0000\u0000\u0558\u0559\u0005\u0000\u0000\u0001\u0559\u055a"+ + "\u0001\u0000\u0000\u0000\u055a\u055b\u00061\u000e\u0000\u055b\u055c\u0006"+ + "1\u000f\u0000\u055co\u0001\u0000\u0000\u0000\u055d\u055e\u0005}\u0000"+ + "\u0000\u055e\u055f\u0005}\u0000\u0000\u055f\u0560\u0001\u0000\u0000\u0000"+ + "\u0560\u0561\u00062\u000f\u0000\u0561\u0562\u00062\u0006\u0000\u0562q"+ + "\u0001\u0000\u0000\u0000\u0563\u0564\u0003\f\u0000\u0000\u0564\u0565\u0006"+ + "3\u0010\u0000\u0565s\u0001\u0000\u0000\u0000\u0566\u0569\u0003X&\u0000"+ + "\u0567\u0569\u0003\u0012\u0003\u0000\u0568\u0566\u0001\u0000\u0000\u0000"+ + "\u0568\u0567\u0001\u0000\u0000\u0000\u0569\u056a\u0001\u0000\u0000\u0000"+ + "\u056a\u056b\u00064\u0011\u0000\u056bu\u0001\u0000\u0000\u0000\u056c\u056d"+ + "\u0005:\u0000\u0000\u056d\u0570\u0005)\u0000\u0000\u056e\u0570\u0005:"+ + "\u0000\u0000\u056f\u056c\u0001\u0000\u0000\u0000\u056f\u056e\u0001\u0000"+ + "\u0000\u0000\u0570\u0571\u0001\u0000\u0000\u0000\u0571\u0572\u00065\u0012"+ + "\u0000\u0572w\u0001\u0000\u0000\u0000\u0573\u0575\b+\u0000\u0000\u0574"+ + "\u0573\u0001\u0000\u0000\u0000\u0575\u0576\u0001\u0000\u0000\u0000\u0576"+ + "\u0574\u0001\u0000\u0000\u0000\u0576\u0577\u0001\u0000\u0000\u0000\u0577"+ + "\u0578\u0001\u0000\u0000\u0000\u0578\u0579\u00066\u0013\u0000\u0579y\u0001"+ + "\u0000\u0000\u0000\u057a\u057e\t\u0000\u0000\u0000\u057b\u057d\u0007*"+ + "\u0000\u0000\u057c\u057b\u0001\u0000\u0000\u0000\u057d\u0580\u0001\u0000"+ + "\u0000\u0000\u057e\u057c\u0001\u0000\u0000\u0000\u057e\u057f\u0001\u0000"+ + "\u0000\u0000\u057f\u0581\u0001\u0000\u0000\u0000\u0580\u057e\u0001\u0000"+ + "\u0000\u0000\u0581\u0582\u00067\u0014\u0000\u0582{\u0001\u0000\u0000\u0000"+ + "\u0583\u0584\u0005\u0000\u0000\u0001\u0584\u0585\u0001\u0000\u0000\u0000"+ + "\u0585\u0586\u00068\u0015\u0000\u0586\u0587\u00068\u000f\u0000\u0587}"+ + "\u0001\u0000\u0000\u0000\u0588\u0589\u0005!\u0000\u0000\u0589\u058a\u0005"+ + "!\u0000\u0000\u058a\u058b\u0005}\u0000\u0000\u058b\u058c\u0001\u0000\u0000"+ + "\u0000\u058c\u058d\u00069\u000f\u0000\u058d\u058e\u00069\b\u0000\u058e"+ + "\u007f\u0001\u0000\u0000\u0000\u058f\u0590\u0003\f\u0000\u0000\u0590\u0591"+ + "\u0006:\u0016\u0000\u0591\u0081\u0001\u0000\u0000\u0000\u0592\u0595\u0003"+ + "X&\u0000\u0593\u0595\u0003\u0012\u0003\u0000\u0594\u0592\u0001\u0000\u0000"+ + "\u0000\u0594\u0593\u0001\u0000\u0000\u0000\u0595\u0596\u0001\u0000\u0000"+ + "\u0000\u0596\u0597\u0006;\u0017\u0000\u0597\u0083\u0001\u0000\u0000\u0000"+ + "\u0598\u0599\u0005:\u0000\u0000\u0599\u059c\u0005)\u0000\u0000\u059a\u059c"+ + "\u0005:\u0000\u0000\u059b\u0598\u0001\u0000\u0000\u0000\u059b\u059a\u0001"+ + "\u0000\u0000\u0000\u059c\u059d\u0001\u0000\u0000\u0000\u059d\u059e\u0006"+ + "<\u0012\u0000\u059e\u0085\u0001\u0000\u0000\u0000\u059f\u05a1\b,\u0000"+ + "\u0000\u05a0\u059f\u0001\u0000\u0000\u0000\u05a1\u05a2\u0001\u0000\u0000"+ + "\u0000\u05a2\u05a0\u0001\u0000\u0000\u0000\u05a2\u05a3\u0001\u0000\u0000"+ + "\u0000\u05a3\u05a4\u0001\u0000\u0000\u0000\u05a4\u05a5\u0006=\u0018\u0000"+ + "\u05a5\u0087\u0001\u0000\u0000\u0000\u05a6\u05aa\t\u0000\u0000\u0000\u05a7"+ + "\u05a9\u0007*\u0000\u0000\u05a8\u05a7\u0001\u0000\u0000\u0000\u05a9\u05ac"+ + "\u0001\u0000\u0000\u0000\u05aa\u05a8\u0001\u0000\u0000\u0000\u05aa\u05ab"+ + "\u0001\u0000\u0000\u0000\u05ab\u05ad\u0001\u0000\u0000\u0000\u05ac\u05aa"+ + "\u0001\u0000\u0000\u0000\u05ad\u05ae\u0006>\u0019\u0000\u05ae\u0089\u0001"+ + "\u0000\u0000\u0000\u05af\u05b0\u0005\u0000\u0000\u0001\u05b0\u05b1\u0001"+ + "\u0000\u0000\u0000\u05b1\u05b2\u0006?\u0015\u0000\u05b2\u05b3\u0006?\u000f"+ + "\u0000\u05b3\u008b\u0001\u0000\u0000\u0000\u05b4\u05b6\u0007*\u0000\u0000"+ + "\u05b5\u05b4\u0001\u0000\u0000\u0000\u05b6\u05b7\u0001\u0000\u0000\u0000"+ + "\u05b7\u05b5\u0001\u0000\u0000\u0000\u05b7\u05b8\u0001\u0000\u0000\u0000"+ + "\u05b8\u05b9\u0001\u0000\u0000\u0000\u05b9\u05ba\u0004@\b\u0000\u05ba"+ + "\u05bb\u0001\u0000\u0000\u0000\u05bb\u05bc\u0006@\u001a\u0000\u05bc\u008d"+ + "\u0001\u0000\u0000\u0000\u05bd\u05be\u0005(\u0000\u0000\u05be\u05bf\u0006"+ + "A\u001b\u0000\u05bf\u05c0\u0001\u0000\u0000\u0000\u05c0\u05c1\u0006A\f"+ + "\u0000\u05c1\u05c2\u0006A\u001a\u0000\u05c2\u008f\u0001\u0000\u0000\u0000"+ + "\u05c3\u05c4\u0003N!\u0000\u05c4\u05c5\u0001\u0000\u0000\u0000\u05c5\u05c6"+ + "\u0006B\u0015\u0000\u05c6\u05c7\u0006B\u000f\u0000\u05c7\u0091\u0001\u0000"+ + "\u0000\u0000\u05c8\u05c9\t\u0000\u0000\u0000\u05c9\u05ca\u0001\u0000\u0000"+ + "\u0000\u05ca\u05cb\u0006C\u0015\u0000\u05cb\u05cc\u0006C\u000f\u0000\u05cc"+ + "\u0093\u0001\u0000\u0000\u0000\u05cd\u05ce\u0004D\t\u0000\u05ce\u05cf"+ + "\u0005(\u0000\u0000\u05cf\u05d0\u0006D\u001c\u0000\u05d0\u05d1\u0006D"+ + "\u001d\u0000\u05d1\u0095\u0001\u0000\u0000\u0000\u05d2\u05d3\u0004E\n"+ + "\u0000\u05d3\u05d4\u0005)\u0000\u0000\u05d4\u05d5\u0006E\u001e\u0000\u05d5"+ + "\u05d6\u0001\u0000\u0000\u0000\u05d6\u05d7\u0006E\u001f\u0000\u05d7\u05d8"+ + "\u0006E \u0000\u05d8\u0097\u0001\u0000\u0000\u0000\u05d9\u05da\u0004F"+ + "\u000b\u0000\u05da\u05db\u0005(\u0000\u0000\u05db\u05dc\u0006F!\u0000"+ + "\u05dc\u05dd\u0006F\"\u0000\u05dd\u0099\u0001\u0000\u0000\u0000\u05de"+ + "\u05df\u0004G\f\u0000\u05df\u05e0\u0005)\u0000\u0000\u05e0\u05e1\u0006"+ + "G#\u0000\u05e1\u05e2\u0006G$\u0000\u05e2\u009b\u0001\u0000\u0000\u0000"+ + "\u05e3\u05e4\u0005)\u0000\u0000\u05e4\u05e5\u0004H\r\u0000\u05e5\u05e6"+ + "\u0001\u0000\u0000\u0000\u05e6\u05e7\u0006H\u001f\u0000\u05e7\u05e8\u0006"+ + "H \u0000\u05e8\u009d\u0001\u0000\u0000\u0000\u05e9\u05ea\u0005\"\u0000"+ + "\u0000\u05ea\u05eb\u0001\u0000\u0000\u0000\u05eb\u05ec\u0006I\f\u0000"+ + "\u05ec\u05ed\u0006I%\u0000\u05ed\u009f\u0001\u0000\u0000\u0000\u05ee\u05ef"+ + "\u0005?\u0000\u0000\u05ef\u05f0\u0005:\u0000\u0000\u05f0\u05f1\u0001\u0000"+ + "\u0000\u0000\u05f1\u05f2\u0006J&\u0000\u05f2\u00a1\u0001\u0000\u0000\u0000"+ + "\u05f3\u05f4\u0005:\u0000\u0000\u05f4\u05f5\u0005:\u0000\u0000\u05f5\u05f6"+ + "\u0001\u0000\u0000\u0000\u05f6\u05f7\u0006K\'\u0000\u05f7\u00a3\u0001"+ + "\u0000\u0000\u0000\u05f8\u05fc\u0003X&\u0000\u05f9\u05fb\u0005 \u0000"+ + "\u0000\u05fa\u05f9\u0001\u0000\u0000\u0000\u05fb\u05fe\u0001\u0000\u0000"+ + "\u0000\u05fc\u05fa\u0001\u0000\u0000\u0000\u05fc\u05fd\u0001\u0000\u0000"+ + "\u0000\u05fd\u05ff\u0001\u0000\u0000\u0000\u05fe\u05fc\u0001\u0000\u0000"+ + "\u0000\u05ff\u0600\u0006L(\u0000\u0600\u00a5\u0001\u0000\u0000\u0000\u0601"+ + "\u0602\u0005:\u0000\u0000\u0602\u0603\u0004M\u000e\u0000\u0603\u0604\u0001"+ + "\u0000\u0000\u0000\u0604\u0605\u0006M\u0012\u0000\u0605\u00a7\u0001\u0000"+ + "\u0000\u0000\u0606\u0607\u0005:\u0000\u0000\u0607\u0608\u0001\u0000\u0000"+ + "\u0000\u0608\u0609\u0006N\u0012\u0000\u0609\u00a9\u0001\u0000\u0000\u0000"+ + "\u060a\u060b\u0005/\u0000\u0000\u060b\u060c\u0005*\u0000\u0000\u060c\u0610"+ + "\u0001\u0000\u0000\u0000\u060d\u060f\t\u0000\u0000\u0000\u060e\u060d\u0001"+ + "\u0000\u0000\u0000\u060f\u0612\u0001\u0000\u0000\u0000\u0610\u0611\u0001"+ + "\u0000\u0000\u0000\u0610\u060e\u0001\u0000\u0000\u0000\u0611\u0613\u0001"+ + "\u0000\u0000\u0000\u0612\u0610\u0001\u0000\u0000\u0000\u0613\u0614\u0005"+ + "*\u0000\u0000\u0614\u0615\u0005/\u0000\u0000\u0615\u0616\u0001\u0000\u0000"+ + "\u0000\u0616\u0617\u0006O\u0012\u0000\u0617\u00ab\u0001\u0000\u0000\u0000"+ + "\u0618\u0619\t\u0000\u0000\u0000\u0619\u061a\u0006P)\u0000\u061a\u00ad"+ + "\u0001\u0000\u0000\u0000\u061b\u061c\u0005\u0000\u0000\u0001\u061c\u061d"+ + "\u0001\u0000\u0000\u0000\u061d\u061e\u0006Q\u0015\u0000\u061e\u061f\u0006"+ + "Q \u0000\u061f\u00af\u0001\u0000\u0000\u0000\u0620\u0621\u0005@\u0000"+ + "\u0000\u0621\u0622\u0007\u0003\u0000\u0000\u0622\u0623\u0007\f\u0000\u0000"+ + "\u0623\u0624\u0007\u0011\u0000\u0000\u0624\u0625\u0007\r\u0000\u0000\u0625"+ + "\u0626\u0007\u0006\u0000\u0000\u0626\u0627\u0007\r\u0000\u0000\u0627\u0628"+ + "\u0001\u0000\u0000\u0000\u0628\u0629\u0006R\u000f\u0000\u0629\u00b1\u0001"+ + "\u0000\u0000\u0000\u062a\u062b\t\u0000\u0000\u0000\u062b\u062c\u0004S"+ + "\u000f\u0000\u062c\u062d\u0001\u0000\u0000\u0000\u062d\u062e\u0006S*\u0000"+ + "\u062e\u00b3\u0001\u0000\u0000\u0000\u062f\u0630\t\u0000\u0000\u0000\u0630"+ + "\u0631\u0001\u0000\u0000\u0000\u0631\u0632\u0006T\f\u0000\u0632\u00b5"+ + "\u0001\u0000\u0000\u0000\u0633\u0634\u0005\u0000\u0000\u0001\u0634\u0635"+ + "\u0001\u0000\u0000\u0000\u0635\u0636\u0006U\u0015\u0000\u0636\u0637\u0006"+ + "U\u000f\u0000\u0637\u00b7\u0001\u0000\u0000\u0000\u0638\u0639\u0005@\u0000"+ + "\u0000\u0639\u063a\u0007\u0003\u0000\u0000\u063a\u063b\u0007\f\u0000\u0000"+ + "\u063b\u063c\u0007\u0011\u0000\u0000\u063c\u063d\u0007\u001a\u0000\u0000"+ + "\u063d\u063e\u0007\u0003\u0000\u0000\u063e\u063f\u0007\u0002\u0000\u0000"+ + "\u063f\u0640\u0007\u0017\u0000\u0000\u0640\u0641\u0007\u0004\u0000\u0000"+ + "\u0641\u0642\u0007\u000b\u0000\u0000\u0642\u0643\u0007\u0007\u0000\u0000"+ + "\u0643\u0644\u0007\u0012\u0000\u0000\u0644\u0645\u0001\u0000\u0000\u0000"+ + "\u0645\u0646\u0006V\u0001\u0000\u0646\u0647\u0006V\u000f\u0000\u0647\u00b9"+ + "\u0001\u0000\u0000\u0000\u0648\u0649\t\u0000\u0000\u0000\u0649\u064a\u0004"+ + "W\u0010\u0000\u064a\u064b\u0001\u0000\u0000\u0000\u064b\u064c\u0006W\t"+ + "\u0000\u064c\u00bb\u0001\u0000\u0000\u0000\u064d\u064e\t\u0000\u0000\u0000"+ + "\u064e\u064f\u0001\u0000\u0000\u0000\u064f\u0650\u0006X\f\u0000\u0650"+ + "\u00bd\u0001\u0000\u0000\u0000\u0651\u0652\u0005\u0000\u0000\u0001\u0652"+ + "\u0653\u0001\u0000\u0000\u0000\u0653\u0654\u0006Y\u0015\u0000\u0654\u0655"+ + "\u0006Y\u000f\u0000\u0655\u00bf\u0001\u0000\u0000\u0000\u0656\u0657\u0005"+ + ":\u0000\u0000\u0657\u0658\u0003R#\u0000\u0658\u0659\u0005=\u0000\u0000"+ + "\u0659\u065a\u0005\"\u0000\u0000\u065a\u065b\u0001\u0000\u0000\u0000\u065b"+ + "\u065c\u0006Z\t\u0000\u065c\u065d\u0006Z+\u0000\u065d\u00c1\u0001\u0000"+ + "\u0000\u0000\u065e\u065f\u0005{\u0000\u0000\u065f\u0660\u0005{\u0000\u0000"+ + "\u0660\u0661\u0001\u0000\u0000\u0000\u0661\u0662\u0006[\u0005\u0000\u0662"+ + "\u0663\u0006[\u0006\u0000\u0663\u00c3\u0001\u0000\u0000\u0000\u0664\u0665"+ + "\u0005{\u0000\u0000\u0665\u0666\u0005!\u0000\u0000\u0666\u0667\u0005!"+ + "\u0000\u0000\u0667\u0668\u0001\u0000\u0000\u0000\u0668\u0669\u0006\\\u0007"+ + "\u0000\u0669\u066a\u0006\\\b\u0000\u066a\u00c5\u0001\u0000\u0000\u0000"+ + "\u066b\u066c\u0005>\u0000\u0000\u066c\u066d\u0001\u0000\u0000\u0000\u066d"+ + "\u066e\u0006]\t\u0000\u066e\u066f\u0006]\u000f\u0000\u066f\u00c7\u0001"+ + "\u0000\u0000\u0000\u0670\u0671\t\u0000\u0000\u0000\u0671\u0672\u0001\u0000"+ + "\u0000\u0000\u0672\u0673\u0006^\t\u0000\u0673\u00c9\u0001\u0000\u0000"+ + "\u0000\u0674\u0675\u0005\u0000\u0000\u0001\u0675\u0676\u0001\u0000\u0000"+ + "\u0000\u0676\u0677\u0006_\u0015\u0000\u0677\u0678\u0006_\u000f\u0000\u0678"+ + "\u00cb\u0001\u0000\u0000\u0000\u0679\u067a\u0005\"\u0000\u0000\u067a\u067b"+ + "\u0001\u0000\u0000\u0000\u067b\u067c\u0006`\t\u0000\u067c\u067d\u0006"+ + "`\u000f\u0000\u067d\u00cd\u0001\u0000\u0000\u0000\u067e\u067f\t\u0000"+ + "\u0000\u0000\u067f\u0680\u0004a\u0011\u0000\u0680\u0681\u0001\u0000\u0000"+ + "\u0000\u0681\u0682\u0006a\u001f\u0000\u0682\u00cf\u0001\u0000\u0000\u0000"+ + "\u0683\u0684\t\u0000\u0000\u0000\u0684\u0685\u0001\u0000\u0000\u0000\u0685"+ + "\u0686\u0006b\f\u0000\u0686\u00d1\u0001\u0000\u0000\u0000\u0687\u0688"+ + "\u0005\u0000\u0000\u0001\u0688\u0689\u0001\u0000\u0000\u0000\u0689\u068a"+ + "\u0006c\u0015\u0000\u068a\u068b\u0006c\u000f\u0000\u068b\u00d3\u0001\u0000"+ + "\u0000\u0000\u068c\u068e\u0003\f\u0000\u0000\u068d\u068f\u0005$\u0000"+ + "\u0000\u068e\u068d\u0001\u0000\u0000\u0000\u068e\u068f\u0001\u0000\u0000"+ + "\u0000\u068f\u0690\u0001\u0000\u0000\u0000\u0690\u0691\u0003R#\u0000\u0691"+ + "\u0692\u0005}\u0000\u0000\u0692\u0693\u0001\u0000\u0000\u0000\u0693\u0694"+ + "\u0006d\f\u0000\u0694\u00d5\u0001\u0000\u0000\u0000\u0695\u0696\u0003"+ + "\f\u0000\u0000\u0696\u0697\u0001\u0000\u0000\u0000\u0697\u0698\u0006e"+ + "\f\u0000\u0698\u00d7\u0001\u0000\u0000\u0000\u0699\u069b\u0005{\u0000"+ + "\u0000\u069a\u069c\u0007)\u0000\u0000\u069b\u069a\u0001\u0000\u0000\u0000"+ + "\u069b\u069c\u0001\u0000\u0000\u0000\u069c\u069d\u0001\u0000\u0000\u0000"+ + "\u069d\u069f\u0003R#\u0000\u069e\u06a0\u0007)\u0000\u0000\u069f\u069e"+ + "\u0001\u0000\u0000\u0000\u069f\u06a0\u0001\u0000\u0000\u0000\u06a0\u06a2"+ + "\u0001\u0000\u0000\u0000\u06a1\u06a3\u0005:\u0000\u0000\u06a2\u06a1\u0001"+ + "\u0000\u0000\u0000\u06a3\u06a4\u0001\u0000\u0000\u0000\u06a4\u06a2\u0001"+ + "\u0000\u0000\u0000\u06a4\u06a5\u0001\u0000\u0000\u0000\u06a5\u06a7\u0001"+ + "\u0000\u0000\u0000\u06a6\u06a8\u0007)\u0000\u0000\u06a7\u06a6\u0001\u0000"+ + "\u0000\u0000\u06a7\u06a8\u0001\u0000\u0000\u0000\u06a8\u06aa\u0001\u0000"+ + "\u0000\u0000\u06a9\u06ab\u0003R#\u0000\u06aa\u06a9\u0001\u0000\u0000\u0000"+ + "\u06aa\u06ab\u0001\u0000\u0000\u0000\u06ab\u06ad\u0001\u0000\u0000\u0000"+ + "\u06ac\u06ae\u0007)\u0000\u0000\u06ad\u06ac\u0001\u0000\u0000\u0000\u06ad"+ + "\u06ae\u0001\u0000\u0000\u0000\u06ae\u06c5\u0001\u0000\u0000\u0000\u06af"+ + "\u06b1\u0005,\u0000\u0000\u06b0\u06b2\u0007)\u0000\u0000\u06b1\u06b0\u0001"+ + "\u0000\u0000\u0000\u06b1\u06b2\u0001\u0000\u0000\u0000\u06b2\u06b3\u0001"+ + "\u0000\u0000\u0000\u06b3\u06b5\u0003R#\u0000\u06b4\u06b6\u0007)\u0000"+ + "\u0000\u06b5\u06b4\u0001\u0000\u0000\u0000\u06b5\u06b6\u0001\u0000\u0000"+ + "\u0000\u06b6\u06b8\u0001\u0000\u0000\u0000\u06b7\u06b9\u0005:\u0000\u0000"+ + "\u06b8\u06b7\u0001\u0000\u0000\u0000\u06b9\u06ba\u0001\u0000\u0000\u0000"+ + "\u06ba\u06b8\u0001\u0000\u0000\u0000\u06ba\u06bb\u0001\u0000\u0000\u0000"+ + "\u06bb\u06bd\u0001\u0000\u0000\u0000\u06bc\u06be\u0007)\u0000\u0000\u06bd"+ + "\u06bc\u0001\u0000\u0000\u0000\u06bd\u06be\u0001\u0000\u0000\u0000\u06be"+ + "\u06bf\u0001\u0000\u0000\u0000\u06bf\u06c1\u0003R#\u0000\u06c0\u06c2\u0007"+ + ")\u0000\u0000\u06c1\u06c0\u0001\u0000\u0000\u0000\u06c1\u06c2\u0001\u0000"+ + "\u0000\u0000\u06c2\u06c4\u0001\u0000\u0000\u0000\u06c3\u06af\u0001\u0000"+ + "\u0000\u0000\u06c4\u06c7\u0001\u0000\u0000\u0000\u06c5\u06c3\u0001\u0000"+ + "\u0000\u0000\u06c5\u06c6\u0001\u0000\u0000\u0000\u06c6\u06c9\u0001\u0000"+ + "\u0000\u0000\u06c7\u06c5\u0001\u0000\u0000\u0000\u06c8\u06ca\u0005,\u0000"+ + "\u0000\u06c9\u06c8\u0001\u0000\u0000\u0000\u06c9\u06ca\u0001\u0000\u0000"+ + "\u0000\u06ca\u06cb\u0001\u0000\u0000\u0000\u06cb\u06cc\u0005}\u0000\u0000"+ + "\u06cc\u06cd\u0001\u0000\u0000\u0000\u06cd\u06ce\u0006f\f\u0000\u06ce"+ + "\u00d9\u0001\u0000\u0000\u0000\u06cf\u06d0\u0005{\u0000\u0000\u06d0\u06d1"+ + "\u0005$\u0000\u0000\u06d1\u06da\u0003R#\u0000\u06d2\u06d3\u0005[\u0000"+ + "\u0000\u06d3\u06d4\u0007)\u0000\u0000\u06d4\u06d5\u0003R#\u0000\u06d5"+ + "\u06d6\u0007)\u0000\u0000\u06d6\u06d7\u0005]\u0000\u0000\u06d7\u06d9\u0001"+ + "\u0000\u0000\u0000\u06d8\u06d2\u0001\u0000\u0000\u0000\u06d9\u06dc\u0001"+ + "\u0000\u0000\u0000\u06da\u06d8\u0001\u0000\u0000\u0000\u06da\u06db\u0001"+ + "\u0000\u0000\u0000\u06db\u06dd\u0001\u0000\u0000\u0000\u06dc\u06da\u0001"+ + "\u0000\u0000\u0000\u06dd\u06de\u0005:\u0000\u0000\u06de\u06df\u0005:\u0000"+ + "\u0000\u06df\u06e0\u0001\u0000\u0000\u0000\u06e0\u06e1\u0003R#\u0000\u06e1"+ + "\u06e2\u0005}\u0000\u0000\u06e2\u06e3\u0001\u0000\u0000\u0000\u06e3\u06e4"+ + "\u0006g\f\u0000\u06e4\u00db\u0001\u0000\u0000\u0000\u06e5\u06e6\u0005"+ + "{\u0000\u0000\u06e6\u06e7\u0005$\u0000\u0000\u06e7\u06f1\u0003R#\u0000"+ + "\u06e8\u06e9\u0005[\u0000\u0000\u06e9\u06eb\u0007)\u0000\u0000\u06ea\u06ec"+ + "\u0003R#\u0000\u06eb\u06ea\u0001\u0000\u0000\u0000\u06eb\u06ec\u0001\u0000"+ + "\u0000\u0000\u06ec\u06ed\u0001\u0000\u0000\u0000\u06ed\u06ee\u0007)\u0000"+ + "\u0000\u06ee\u06f0\u0005]\u0000\u0000\u06ef\u06e8\u0001\u0000\u0000\u0000"+ + "\u06f0\u06f3\u0001\u0000\u0000\u0000\u06f1\u06ef\u0001\u0000\u0000\u0000"+ + "\u06f1\u06f2\u0001\u0000\u0000\u0000\u06f2\u06fb\u0001\u0000\u0000\u0000"+ + "\u06f3\u06f1\u0001\u0000\u0000\u0000\u06f4\u06f5\u0005:\u0000\u0000\u06f5"+ + "\u06f7\u0005:\u0000\u0000\u06f6\u06f4\u0001\u0000\u0000\u0000\u06f7\u06f8"+ + "\u0001\u0000\u0000\u0000\u06f8\u06f6\u0001\u0000\u0000\u0000\u06f8\u06f9"+ + "\u0001\u0000\u0000\u0000\u06f9\u06fa\u0001\u0000\u0000\u0000\u06fa\u06fc"+ + "\u0003R#\u0000\u06fb\u06f6\u0001\u0000\u0000\u0000\u06fb\u06fc\u0001\u0000"+ + "\u0000\u0000\u06fc\u0701\u0001\u0000\u0000\u0000\u06fd\u06ff\u0005:\u0000"+ + "\u0000\u06fe\u0700\u0003R#\u0000\u06ff\u06fe\u0001\u0000\u0000\u0000\u06ff"+ + "\u0700\u0001\u0000\u0000\u0000\u0700\u0702\u0001\u0000\u0000\u0000\u0701"+ + "\u06fd\u0001\u0000\u0000\u0000\u0702\u0703\u0001\u0000\u0000\u0000\u0703"+ + "\u0701\u0001\u0000\u0000\u0000\u0703\u0704\u0001\u0000\u0000\u0000\u0704"+ + "\u0705\u0001\u0000\u0000\u0000\u0705\u0706\u0005}\u0000\u0000\u0706\u070a"+ + "\u0001\u0000\u0000\u0000\u0707\u0708\u0005:\u0000\u0000\u0708\u070a\u0005"+ + "$\u0000\u0000\u0709\u06e5\u0001\u0000\u0000\u0000\u0709\u0707\u0001\u0000"+ + "\u0000\u0000\u070a\u070b\u0001\u0000\u0000\u0000\u070b\u070c\u0006h\u0015"+ + "\u0000\u070c\u00dd\u0001\u0000\u0000\u0000\u070d\u070e\u0005\\\u0000\u0000"+ + "\u070e\u070f\u0005\"\u0000\u0000\u070f\u0710\u0001\u0000\u0000\u0000\u0710"+ + "\u0711\u0006i\f\u0000\u0711\u00df\u0001\u0000\u0000\u0000\u0712\u0713"+ + "\u0005\"\u0000\u0000\u0713\u0714\u0001\u0000\u0000\u0000\u0714\u0715\u0006"+ + "j\f\u0000\u0715\u0716\u0006j\u000f\u0000\u0716\u00e1\u0001\u0000\u0000"+ + "\u0000\u0717\u0718\t\u0000\u0000\u0000\u0718\u0719\u0001\u0000\u0000\u0000"+ + "\u0719\u071a\u0006k\f\u0000\u071a\u00e3\u0001\u0000\u0000\u0000\u071b"+ + "\u071c\u0005\u0000\u0000\u0001\u071c\u071d\u0001\u0000\u0000\u0000\u071d"+ + "\u071e\u0006l\u0015\u0000\u071e\u071f\u0006l\u000f\u0000\u071f\u00e5\u0001"+ + "\u0000\u0000\u0000\u0720\u0721\u0005-\u0000\u0000\u0721\u0722\u0005-\u0000"+ + "\u0000\u0722\u0723\u0005}\u0000\u0000\u0723\u0724\u0005}\u0000\u0000\u0724"+ + "\u0725\u0001\u0000\u0000\u0000\u0725\u0726\u0006m\u000f\u0000\u0726\u00e7"+ + "\u0001\u0000\u0000\u0000\u0727\u0728\t\u0000\u0000\u0000\u0728\u0729\u0004"+ + "n\u0012\u0000\u0729\u072a\u0001\u0000\u0000\u0000\u072a\u072b\u0006n,"+ + "\u0000\u072b\u00e9\u0001\u0000\u0000\u0000\u072c\u072d\t\u0000\u0000\u0000"+ + "\u072d\u072e\u0001\u0000\u0000\u0000\u072e\u072f\u0006o\f\u0000\u072f"+ + "\u00eb\u0001\u0000\u0000\u0000\u0730\u0731\u0005\u0000\u0000\u0001\u0731"+ + "\u0732\u0001\u0000\u0000\u0000\u0732\u0733\u0006p,\u0000\u0733\u0734\u0006"+ + "p\u000f\u0000\u0734\u00ed\u0001\u0000\u0000\u0000u\u0000\u0001\u0002\u0003"+ + "\u0004\u0005\u0006\u0007\b\t\n\u000b\u00f5\u00ff\u013c\u015b\u0177\u0181"+ + "\u0183\u018c\u0198\u01a6\u01ac\u01ae\u01cc\u023e\u0243\u0259\u0288\u02bf"+ + "\u02e4\u02ee\u0346\u0349\u0361\u0376\u037d\u038e\u0390\u039d\u03a2\u03a9"+ + "\u03ae\u03bc\u03bf\u03c1\u03cd\u03d2\u03d5\u03e2\u03e5\u03e7\u03ee\u03f3"+ + "\u03f5\u03fe\u040a\u0411\u0418\u0420\u0422\u042b\u042d\u0438\u0450\u0464"+ + "\u0468\u0473\u0479\u0485\u0489\u0497\u04a5\u04b6\u04c6\u04d7\u04e3\u04f3"+ + "\u0500\u0510\u051d\u0536\u0547\u054a\u0568\u056f\u0576\u057e\u0594\u059b"+ + "\u05a2\u05aa\u05b7\u05fc\u0610\u068e\u069b\u069f\u06a4\u06a7\u06aa\u06ad"+ + "\u06b1\u06b5\u06ba\u06bd\u06c1\u06c5\u06c9\u06da\u06eb\u06f1\u06f8\u06fb"+ + "\u06ff\u0703\u0709-\u0005\u0004\u0000\u0007\u0001\u0000\u0005\u0007\u0000"+ + "\u0007\u000b\u0000\u0005\u0006\u0000\u0005\u0002\u0000\u0007\u0005\u0000"+ + "\u0005\u0003\u0000\u0007\u0004\u0000\u0007\u0006\u0000\u0005\b\u0000\u0005"+ + "\u0001\u0000\u0003\u0000\u0000\u0005\u000b\u0000\u0007\u0007\u0000\u0004"+ + "\u0000\u0000\u00013\u0000\u00014\u0001\u0006\u0000\u0000\u00016\u0002"+ + "\u00017\u0003\u0007\b\u0000\u0001:\u0004\u0001;\u0005\u0001=\u0006\u0001"+ + ">\u0007\u0005\u0005\u0000\u0001A\b\u0001D\t\u0001D\n\u0001E\u000b\u0007"+ + "\u0002\u0000\u0002\u0000\u0000\u0001F\f\u0001F\r\u0001G\u000e\u0001G\u000f"+ + "\u0005\n\u0000\u0001J\u0010\u0001K\u0011\u0001L\u0012\u0001P\u0013\u0000"+ + "\u0002\u0000\u0005\t\u0000\u0007\t\u0000"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 new file mode 100644 index 000000000000..a88de8e22777 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 @@ -0,0 +1,473 @@ +lexer grammar BladeAntlrLexer; +import BladeCommonLexer; + +@header{ + package org.netbeans.modules.php.blade.syntax.antlr4.v10; +} + +options { + superClass = LexerAdaptor; + caseInsensitive = true; +} + +tokens { + PHP_EXPRESSION, + PHP_VARIABLE, + PHP_KEYWORD, + PHP_NEW, + PHP_IDENTIFIER, + PHP_NAMESPACE_PATH, + PHP_STATIC_ACCESS, + PHP_CLASS_KEYWORD, + PHP_INSTANCE_ACCESS, + BLADE_PARAM_EXTRA, + BLADE_PARAM_LPAREN, + BLADE_PARAM_RPAREN, + BLADE_EXPR_LPAREN, + BLADE_EXPR_RPAREN, + BL_SQ_LPAREN, + BL_SQ_LRAREN, + BL_PARAM_STRING, + BL_PARAM_ASSIGN, + BL_COMMA, + BL_PARAM_COMMA, + PHP_EXPR_STRING, + ERROR +} + +channels { COMMENT, PHP_CODE } + +fragment CompomentIdentifier + : [a-z\u0080-\ufffe][a-z0-9-_.:\u0080-\ufffe]*; + +fragment CssSelector + : ('#' | '.')? [a-z\u0080-\ufffe][a-z0-9-_:\u0080-\ufffe]* | CssAttrSelector; + +fragment JsFunctionStart + : NameString '(' NameString* (',' (' ')* NameString)* (' ')* ')' (' ')* ('{' { this._input.LA(1) != '{'}?)?; + +fragment StringParam + : [\\'] CssSelector ((' ')* CssSelector)* [\\'] | '"' CssSelector ((' ')* CssSelector)* [\\'] '"'; + +fragment CssAttrSelector + : '[' FullIdentifier (EQ StringAttrValue)? ']'; + +fragment StringAttrValue + : '"' FullIdentifier '"' | [\\'] FullIdentifier [\\']; +//RULES + + +//conditionals +D_IF : '@if'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_ELSEIF : '@elseif'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_ELSE : '@else'; +D_ENDIF : '@endif'; +D_SWITCH : '@switch'->pushMode(LOOK_FOR_PHP_EXPRESSION); +D_CASE : '@case'->pushMode(LOOK_FOR_PHP_EXPRESSION); +D_DEFAULT : '@default'; +D_ENDSWITCH : '@endswitch'; + +D_EMPTY : '@empty'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_ENDEMPTY : '@endempty'; + +D_COND_BLOCK_START : ('@unless' | '@isset')->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_COND_BLOCK_END : ('@endunless' | '@endisset'); + +//loops +D_FOREACH : '@foreach'->pushMode(FOREACH_LOOP_EXPRESSION); +D_ENDFOREACH : '@endforeach'; +D_FOR : '@for'->pushMode(LOOK_FOR_PHP_EXPRESSION); +D_ENDFOR : '@endfor'; +D_FORELSE : '@forelse'->pushMode(FOREACH_LOOP_EXPRESSION); +D_ENDFORELSE : '@endforelse'; +D_WHILE : '@while'->pushMode(LOOK_FOR_PHP_EXPRESSION); +D_ENDWHILE : '@endwhile'; +D_BREAK : '@break'->pushMode(LOOK_FOR_PHP_EXPRESSION); +D_LOOP_ACTION : ('@continue')->pushMode(LOOK_FOR_PHP_EXPRESSION); + +//includes +D_INCLUDE : '@include'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_INCLUDE_IF : '@includeIf'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_INCLUDE_WHEN : '@includeWhen'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_INCLUDE_FIRST : '@includeFirst'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_INCLUDE_UNLESS : '@includeUnless'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_EACH : '@each'->pushMode(LOOK_FOR_BLADE_PARAMETERS); + +//layout +D_EXTENDS : '@extends'->pushMode(LOOK_FOR_BLADE_PARAMETERS); + +//from livewire (converts variable to javascript syntax) +D_JS : '@js'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); + +//safe json_encode +D_JSON : '@json'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); + +D_SECTION : '@section'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_HAS_SECTION : '@hasSection'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_SECTION_MISSING : '@sectionMissing'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_ENDSECTION : '@endsection'; +D_YIELD : '@yield'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_PARENT : '@parent'; +D_SHOW : '@show'; +D_OVERWRITE : '@overwrite'; +D_STOP : '@stop'; +D_APPEND : '@append'; +D_ONCE : '@once'; +D_ENDONCE : '@endonce'; +D_STACK : '@stack'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_PUSH : '@push'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_ENDPUSH : '@endpush'; +D_PUSH_IF : '@pushIf'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_ENDPUSH_IF : '@endPushIf'; +D_PUSH_ONCE : '@pushOnce'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_ENDPUSH_ONCE : '@endPushOnce'; +D_PREPEND : '@prepend'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_ENDPREPEND : '@endprepend'; +D_PROPS : '@props'->pushMode(LOOK_FOR_PHP_EXPRESSION); + +D_FRAGMENT : '@fragment'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_ENDFRAGMENT : '@endfragment'; + +//forms +D_CSRF : '@csrf'; +D_METHOD : '@method'->pushMode(LOOK_FOR_PHP_EXPRESSION); +D_ERROR : '@error'->pushMode(LOOK_FOR_PHP_EXPRESSION); +D_ENDERROR : '@enderror'; + +//env +D_PRODUCTION : '@production'; +D_ENDPRODUCTION : '@endproduction'; +D_ENV : '@env'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_ENDENV : '@endenv'; + +//auth and roles +D_AUTH_START : ('@auth' | '@guest')->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_AUTH_END : ('@endauth' | '@endguest'); + +//lazy parser +D_PERMISSION_START : '@can' ('not' | 'any')?->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_PERMISSION_ELSE : '@elsecan' ('not' | 'any')?->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_PERMISSION_END : '@endcan' ('not' |'any')?; + +//styles, attributes +D_CLASS : '@class'->pushMode(LOOK_FOR_PHP_EXPRESSION); +D_STYLE : '@style'->pushMode(LOOK_FOR_PHP_EXPRESSION); +D_HTML_ATTR_EXPR : ('@checked' | '@disabled' | '@readonly' | '@required' | '@selected')->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_AWARE : '@aware'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); + +//misc +D_SESSION : '@session'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_ENDSESSION : '@endsession'; + +D_DD : ('@dd' | '@dump')->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_LANG : '@lang'->pushMode(LOOK_FOR_BLADE_PARAMETERS); + +//php injection +D_USE : '@use'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_INJECT : '@inject'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_PHP_SHORT : '@php' (' ')? {this._input.LA(1) == '('}? ->type(D_PHP),pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_PHP : '@php' {this._input.LA(1) == ' ' || this._input.LA(1) == '\r' || this._input.LA(1) == '\n'}?->pushMode(BLADE_INLINE_PHP); + +D_VERBATIM : '@verbatim' ->pushMode(VERBATIM_MODE); +D_ENDVERBATIM : '@endverbatim'; + +//known plugins +D_LIVEWIRE : '@livewireStyles' | '@bukStyles' | '@livewireScripts' | '@bukScripts' | '@livewire'; +D_ASSET_BUNDLER : '@vite'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); + +D_MISC : '@viteReactRefresh'; + +//we will decide that a custom directive has expression to avoid email matching +D_CUSTOM : ('@' NameString {this._input.LA(1) == '(' || + (this._input.LA(1) == ' ' && this._input.LA(2) == '(')}? ) ->pushMode(LOOK_FOR_BLADE_PARAMETERS); + +D_UNKNOWN_ATTR_ENC : '@' NameString {this._input.LA(1) == '"'}?; +D_UNKNOWN : '@' NameString {this._input.LA(1) != '"'}?; + +//display +CONTENT_TAG_OPEN : '{{' ->pushMode(INSIDE_REGULAR_ECHO); +RAW_TAG_OPEN : '{!!' ->pushMode(INSIDE_RAW_ECHO); + +AT : '@'->type(HTML); +//for completion +RAW_TAG_START : '{!'->type(HTML); + +PHP_INLINE_START : ('pushMode(INSIDE_PHP_INLINE); + + + +HTML_COMPONENT_PREFIX : ''}? ->type(HTML_COMPONENT_PREFIX); +JS_SCRIPT : ('$'? '(' StringParam | FullIdentifier ')' ('.' NameString)? | JsFunctionStart ('.' JsFunctionStart)*) ->skip; +HTML_TAG_START : '<' FullIdentifier; +HTML_CLOSE_TAG : ('')+ ->skip; +HTML_TAG_SELF_CLOSE : '/>' {this.compomentTagOpen = false;}->type(HTML); +HTML_CLOSE_SYMBOL : '>' {this.compomentTagOpen = false;} ->type(HTML); +STRING_PATH : ('"' HTML_PATH* '"' | [\\'] HTML_PATH [\\'])->skip; +HTML_PATH : (' ')* FullIdentifier ('/' FullIdentifier)+ ('.' NameString)? ('?' NameString (EQ NameString)*)? ->skip; +HTML_TEXT : (' ')* FullIdentifier ((' ')+ FullIdentifier)+ ->skip; + + +HTML_IDENTIFIER : FullIdentifier {this.consumeHtmlIdentifier();}; + +EQ : '='; +WS : ((' ')+ | [\r\n]+)->skip; +OTHER : . ->skip; + +/** +* MODES +* +*/ + +// {{ }} +mode INSIDE_REGULAR_ECHO; + +REGULAR_ECHO_PHP_VAR : PhpVariable->type(PHP_VARIABLE); +REGULAR_ECHO_KEYWORD : PhpKeyword->type(PHP_KEYWORD); + +REGULAR_PHP_NAMESPACE_PATH : ('\\'? (NameString '\\')+)->type(PHP_NAMESPACE_PATH); +REGULAR_ECHO_PHP_IDENTIFIER : NameString->type(PHP_IDENTIFIER); +REGULAR_ECHO_STATIC_ACCESS : '::'->type(PHP_STATIC_ACCESS); +CONTENT_TAG_CLOSE : ('}}')->popMode; +REGULAR_ECHO_LPAREN : '(' ->type(BLADE_EXPR_LPAREN); +REGULAR_ECHO_RPAREN : ')' ->type(BLADE_EXPR_RPAREN); +REGULAR_ECHO_INSTANCE_ACCESS : '->'->type(PHP_INSTANCE_ACCESS); + +//not treated +REGULAR_ECHO_EXPR_MORE : . ->skip; +EXIT_REGULAR_ECHO_EOF : EOF->type(ERROR),popMode; + +// {!! !!} +mode INSIDE_RAW_ECHO; + +RAW_ECHO_PHP_VAR : PhpVariable->type(PHP_VARIABLE); +RAW_ECHO_KEYWORD : PhpKeyword->type(PHP_KEYWORD); +RAW_ECHO_PHP_NAMESPACE_PATH : ('\\'? (NameString '\\')+)->type(PHP_NAMESPACE_PATH); +RAW_ECHO_PHP_IDENTIFIER : NameString->type(PHP_IDENTIFIER); +RAW_ECHO_STATIC_ACCESS : '::'->type(PHP_STATIC_ACCESS); +RAW_TAG_CLOSE : ('!!}')->popMode; +RAW_ECHO_LPAREN : '(' ->type(BLADE_EXPR_LPAREN); +RAW_ECHO_RPAREN : ')' ->type(BLADE_EXPR_RPAREN); +RAW_ECHO_INSTANCE_ACCESS : '->'->type(PHP_INSTANCE_ACCESS); + +//NOT TREATED +RAW_ECHO_EXPR_MORE : . ->skip; +EXIT_RAW_ECHO_EOF : EOF->type(ERROR),popMode; + +mode LOOK_FOR_PHP_EXPRESSION; + +WS_EXPR_ESCAPE : [ ]+ {this._input.LA(1) == '@'}?->skip, popMode; +WS_EXPR : [ ]+->skip; +OPEN_EXPR_PAREN_MORE : '(' ->more,pushMode(INSIDE_PHP_EXPRESSION); + +L_OHTER_ESCAPE : . {this._input.LA(1) == '@'}?->type(HTML), popMode; +L_OTHER : . ->type(HTML), popMode; + +//{{}}, @if, @foreach +mode INSIDE_PHP_EXPRESSION; + +OPEN_EXPR_PAREN : {this.roundParenBalance == 0}? '(' {this.increaseRoundParenBalance();} ->more; +CLOSE_EXPR_PAREN : {this.roundParenBalance == 1}? ')' + {this.decreaseRoundParenBalance();}->type(PHP_EXPRESSION),mode(DEFAULT_MODE); + +LPAREN : {this.roundParenBalance > 0}? '(' {this.increaseRoundParenBalance();}->more; +RPAREN : {this.roundParenBalance > 0}? ')' {this.decreaseRoundParenBalance();}->more; + +//in case of lexer restart context +EXIT_RPAREN : ')' {this.roundParenBalance == 0}?->type(PHP_EXPRESSION),mode(DEFAULT_MODE); + +PHP_EXPRESSION_MORE : . ->more; + +EXIT_EOF : EOF->type(ERROR),popMode; + +//@if +mode LOOK_FOR_PHP_COMPOSED_EXPRESSION; + +WS_COMPOSED_EXPR : [ ]+->skip; +BLADE_EXPR_LPAREN : '(' {this.roundParenBalance = 0;} ->pushMode(INSIDE_PHP_COMPOSED_EXPRESSION); + +L_COMPOSED_EXPR_OTHER : . ->type(HTML), popMode; + +//{{}}, @if, @foreach +mode INSIDE_PHP_COMPOSED_EXPRESSION; + +EXPR_SQ_LPAREN : '[' {this.squareParenBalance++;}->type(BL_SQ_LPAREN); +EXPR_SQ_RPAREN : ']' {this.squareParenBalance--;}->type(BL_SQ_RPAREN); + +EXPR_CURLY_LPAREN : '{' {this.curlyParenBalance++;}->type(PHP_EXPRESSION); +EXPR_CURLY_RPAREN : '}' {this.curlyParenBalance--;}->type(PHP_EXPRESSION); + +EXPR_STRING : DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT; + +//EXPR_ASSIGN : '=>'->type(BL_PARAM_ASSIGN); + +COMPOSED_EXPR_PHP_VAR : PhpVariable->type(PHP_VARIABLE); +COMPOSED_PHP_KEYWORD : PhpKeyword->type(PHP_KEYWORD); +COMPOSED_PHP_NAMESPACE_PATH : ('\\'? (NameString '\\')+)->type(PHP_NAMESPACE_PATH); +COMPOSED_EXPR_PHP_IDENTIFIER : NameString->type(PHP_IDENTIFIER); +COMPOSED_EXPR_STATIC_ACCESS : '::'->type(PHP_STATIC_ACCESS); + +COMPOSED_EXPR_LPAREN : '(' {this.increaseRoundParenBalance();}->type(BLADE_EXPR_LPAREN); +COMPOSED_EXPR_RPAREN : ')' {consumeExprRParen();}; + +//not treated +PHP_COMPOSED_EXPRESSION : . ->skip; + +EXIT_COMPOSED_EXPRESSION_EOF : EOF->type(ERROR),popMode; + +//@section, @include etc +mode LOOK_FOR_BLADE_PARAMETERS; + +WS_BL_PARAM : [ ]+->skip; +OPEN_BL_PARAM_PAREN_MORE : '(' {this.roundParenBalance = 0;} ->type(BLADE_PARAM_LPAREN),pushMode(INSIDE_BLADE_PARAMETERS); + +L_BL_PARAM_OTHER : . ->type(HTML), popMode; + +mode FOREACH_LOOP_EXPRESSION; + +FOREACH_WS_EXPR : [ ]+->skip; +FOREACH_LOOP_LPAREN : '(' {this.increaseRoundParenBalance();}; +FOREACH_LOOP_RPAREN : ')' {this.decreaseRoundParenBalance(); if (this.roundParenBalance == 0){this.popMode();}}; + +FOREACH_AS : 'as'; + +FOREACH_PHP_VARIABLE : PhpVariable->type(PHP_VARIABLE); + +FOREACH_PARAM_ASSIGN : '=>'; + +LOOP_COMPOSED_PHP_KEYWORD : PhpKeyword->type(PHP_EXPRESSION); + +LOOP_NAME_STRING : (DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT | NameString)->type(PHP_EXPRESSION); + +LOOP_STATIC_ACCESS : '::'->type(PHP_EXPRESSION); + +LOOP_PHP_EXPRESSION : . ->type(PHP_EXPRESSION); +FOREACH_EOF : EOF->type(ERROR),popMode; +//( ) +mode INSIDE_BLADE_PARAMETERS; + +BL_PARAM_LINE_COMMENT : LineComment->channel(COMMENT); + +BL_SQ_LPAREN : '[' {this.squareParenBalance++;}; +BL_SQ_RPAREN : ']' {this.squareParenBalance--;}; + +BL_CURLY_LPAREN : '{' {this.curlyParenBalance++;}->type(BLADE_PARAM_EXTRA); +BL_CURLY_RPAREN : '}' {this.curlyParenBalance--;}->type(BLADE_PARAM_EXTRA); + +BL_PARAM_LPAREN : '(' {this.increaseRoundParenBalance();}->type(BLADE_PARAM_EXTRA); +BL_PARAM_RPAREN : ')' {consumeParamRParen();}; + +BL_PARAM_STRING : DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT; + +BL_PARAM_PHP_VARIABLE : PhpVariable->type(PHP_VARIABLE); + +BL_PARAM_ASSIGN : '=>'; + +BL_PARAM_PHP_KEYWORD : PhpKeyword->type(PHP_KEYWORD); + +BL_PARAM_CONCAT_OPERATOR : '.'; + +BL_COMMA_EL : ',' {this.consumeBladeParamComma();}; + +BL_PARAM_WS : [ \t\r\n]+->skip; + +BL_NAME_STRING : NameString; + +BL_PARAM_MORE : . ->type(BLADE_PARAM_EXTRA); + +BL_PARAM_EXIT_EOF : EOF->type(ERROR),popMode; + +//@php @endphp +mode BLADE_INLINE_PHP; + +PHP_D_BLADE_COMMENT : ('//' ~[\n\r]+)->skip; +PHP_D_BLADE_ML_COMMENT : '/*' .*? '*/' [\n\r]*->skip; + +D_ENDPHP : '@endphp'->popMode; +PHP_D_UNKNOWN : '@'->type(HTML),popMode; + +//hack to merge all php inputs into one token +PHP_D_EXPR_SQ_LPAREN : '[' ->type(PHP_EXPRESSION); +PHP_D_EXPR_SQ_RPAREN : ']' ->type(PHP_EXPRESSION); + +PHP_D_EXPR_CURLY_LPAREN : '{' ->type(PHP_EXPRESSION); +PHP_D_EXPR_CURLY_RPAREN : '}' ->type(PHP_EXPRESSION); + +PHP_D_EXPR_STRING : (DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT)->type(PHP_EXPR_STRING); + +//EXPR_ASSIGN : '=>'->type(BL_PARAM_ASSIGN); + +PHP_D_COMPOSED_EXPR_PHP_VAR : PhpVariable->type(PHP_VARIABLE); +PHP_D_NEW : 'new' {this._input.LA(1) == ' '}? ->type(PHP_NEW); +PHP_D_CLASS : 'class' ->type(PHP_CLASS_KEYWORD); + +PHP_D_COMPOSED_PHP_KEYWORD : PhpKeyword->type(PHP_KEYWORD); + +PHP_D_NAMESPACE_PATH : ('\\'? (NameString '\\')+)->type(PHP_NAMESPACE_PATH); + +PHP_D_COMPOSED_EXPR_PHP_CLASS_IDENTIFIER : '\\' NameString->type(PHP_IDENTIFIER); +PHP_D_COMPOSED_EXPR_PHP_IDENTIFIER : NameString->type(PHP_IDENTIFIER); +PHP_D_COMPOSED_EXPR_STATIC_ACCESS : '::'->type(PHP_STATIC_ACCESS); + +PHP_D_COMPOSED_EXPR_LPAREN : '('->type(BLADE_EXPR_LPAREN); +PHP_D_COMPOSED_EXPR_RPAREN : ')' ->type(BLADE_EXPR_RPAREN); +PHP_D_WS : ' ' ->skip; + +PHP_D_EXIT_COMPOSED_EXPRESSION_EOF : EOF->type(ERROR),popMode; + +//untreated +PHP_D_PHP_COMPOSED_EXPRESSION : . ->skip; + +//php inline +//might think to skip tokens which are not used ?? +mode INSIDE_PHP_INLINE; + +PHP_EXIT : '?>'->popMode; + +PHP_INLINE_COMMENT : ('//' ~[\n\r]+)->skip; +PHP_INLINE_ML_COMMENT : ('/*' .*? '*/')->skip; +//hack to merge all php inputs into one token +PHP_EXPR_SQ_LPAREN : '[' ->type(PHP_EXPRESSION); +PHP_EXPR_SQ_RPAREN : ']' ->type(PHP_EXPRESSION); + +PHP_EXPR_CURLY_LPAREN : '{' ->type(PHP_EXPRESSION); +PHP_EXPR_CURLY_RPAREN : '}' ->type(PHP_EXPRESSION); + +PHP_EXPR_STRING : (DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT)->type(PHP_EXPR_STRING); + +//EXPR_ASSIGN : '=>'->type(BL_PARAM_ASSIGN); + +PHP_COMPOSED_EXPR_PHP_VAR : PhpVariable->type(PHP_VARIABLE); +PHP_COMPOSED_PHP_KEYWORD : PhpKeyword->type(PHP_KEYWORD); +PHP_COMPOSED_EXPR_PHP_IDENTIFIER : NameString->type(PHP_IDENTIFIER); +PHP_COMPOSED_EXPR_STATIC_ACCESS : '::'->type(PHP_STATIC_ACCESS); +//need to implement alias access +PHP_COMPOSED_EXPR_INSTANCE_ACCESS : '->'->type(PHP_INSTANCE_ACCESS); + +PHP_COMPOSED_EXPR_LPAREN : '('->type(BLADE_EXPR_LPAREN); +PHP_COMPOSED_EXPR_RPAREN : ')' ->type(BLADE_EXPR_RPAREN); + + +PHP_EXIT_COMPOSED_EXPRESSION_EOF : EOF->type(PHP_EXPRESSION),popMode; + +PHP_PHP_COMPOSED_EXPRESSION : . ->type(PHP_EXPRESSION); + +mode VERBATIM_MODE; + +D_ENDVERBATIM_IN_MODE : '@endverbatim'->type(D_ENDVERBATIM), mode(DEFAULT_MODE); + +//hack to merge all php inputs into one token +VERBATIM_HTML : . { + this._input.LA(1) == '@' && + this._input.LA(2) == 'e' && + this._input.LA(3) == 'n' && + this._input.LA(4) == 'd' && + this._input.LA(5) == 'v' && + this._input.LA(6) == 'e' && + this._input.LA(7) == 'r' + }? ->skip; + + +EXIT_VERBATIM_MOD_EOF : EOF->type(ERROR),mode(DEFAULT_MODE); + +VERBATIM_HTML_MORE : . ->more; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java new file mode 100644 index 000000000000..daa06d403dde --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java @@ -0,0 +1,2583 @@ +// Generated from java-escape by ANTLR 4.11.1 + + package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +public class BladeAntlrLexer extends LexerAdaptor { + static { RuntimeMetaData.checkVersion("4.11.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + PHP_EXPRESSION=1, PHP_VARIABLE=2, PHP_KEYWORD=3, PHP_NEW=4, PHP_IDENTIFIER=5, + PHP_NAMESPACE_PATH=6, PHP_STATIC_ACCESS=7, PHP_CLASS_KEYWORD=8, PHP_INSTANCE_ACCESS=9, + BLADE_PARAM_EXTRA=10, BLADE_PARAM_LPAREN=11, BLADE_PARAM_RPAREN=12, BLADE_EXPR_LPAREN=13, + BLADE_EXPR_RPAREN=14, BL_SQ_LPAREN=15, BL_SQ_LRAREN=16, BL_PARAM_STRING=17, + BL_PARAM_ASSIGN=18, BL_COMMA=19, BL_PARAM_COMMA=20, PHP_EXPR_STRING=21, + ERROR=22, HTML=23, BLADE_COMMENT=24, D_IF=25, D_ELSEIF=26, D_ELSE=27, + D_ENDIF=28, D_SWITCH=29, D_CASE=30, D_DEFAULT=31, D_ENDSWITCH=32, D_EMPTY=33, + D_ENDEMPTY=34, D_COND_BLOCK_START=35, D_COND_BLOCK_END=36, D_FOREACH=37, + D_ENDFOREACH=38, D_FOR=39, D_ENDFOR=40, D_FORELSE=41, D_ENDFORELSE=42, + D_WHILE=43, D_ENDWHILE=44, D_BREAK=45, D_LOOP_ACTION=46, D_INCLUDE=47, + D_INCLUDE_IF=48, D_INCLUDE_WHEN=49, D_INCLUDE_FIRST=50, D_INCLUDE_UNLESS=51, + D_EACH=52, D_EXTENDS=53, D_JS=54, D_JSON=55, D_SECTION=56, D_HAS_SECTION=57, + D_SECTION_MISSING=58, D_ENDSECTION=59, D_YIELD=60, D_PARENT=61, D_SHOW=62, + D_OVERWRITE=63, D_STOP=64, D_APPEND=65, D_ONCE=66, D_ENDONCE=67, D_STACK=68, + D_PUSH=69, D_ENDPUSH=70, D_PUSH_IF=71, D_ENDPUSH_IF=72, D_PUSH_ONCE=73, + D_ENDPUSH_ONCE=74, D_PREPEND=75, D_ENDPREPEND=76, D_PROPS=77, D_FRAGMENT=78, + D_ENDFRAGMENT=79, D_CSRF=80, D_METHOD=81, D_ERROR=82, D_ENDERROR=83, D_PRODUCTION=84, + D_ENDPRODUCTION=85, D_ENV=86, D_ENDENV=87, D_AUTH_START=88, D_AUTH_END=89, + D_PERMISSION_START=90, D_PERMISSION_ELSE=91, D_PERMISSION_END=92, D_CLASS=93, + D_STYLE=94, D_HTML_ATTR_EXPR=95, D_AWARE=96, D_SESSION=97, D_ENDSESSION=98, + D_DD=99, D_LANG=100, D_USE=101, D_INJECT=102, D_PHP=103, D_VERBATIM=104, + D_ENDVERBATIM=105, D_LIVEWIRE=106, D_ASSET_BUNDLER=107, D_MISC=108, D_CUSTOM=109, + D_UNKNOWN_ATTR_ENC=110, D_UNKNOWN=111, CONTENT_TAG_OPEN=112, RAW_TAG_OPEN=113, + PHP_INLINE_START=114, HTML_COMPONENT_PREFIX=115, JS_SCRIPT=116, HTML_TAG_START=117, + HTML_CLOSE_TAG=118, STRING_PATH=119, HTML_PATH=120, HTML_TEXT=121, HTML_IDENTIFIER=122, + EQ=123, WS=124, OTHER=125, BLADE_COMMENT_START=126, CONTENT_TAG_CLOSE=127, + REGULAR_ECHO_EXPR_MORE=128, RAW_TAG_CLOSE=129, RAW_ECHO_EXPR_MORE=130, + WS_EXPR_ESCAPE=131, WS_EXPR=132, WS_COMPOSED_EXPR=133, EXPR_STRING=134, + COMPOSED_EXPR_RPAREN=135, PHP_COMPOSED_EXPRESSION=136, WS_BL_PARAM=137, + FOREACH_WS_EXPR=138, FOREACH_LOOP_LPAREN=139, FOREACH_LOOP_RPAREN=140, + FOREACH_AS=141, FOREACH_PARAM_ASSIGN=142, BL_PARAM_LINE_COMMENT=143, BL_SQ_RPAREN=144, + BL_PARAM_RPAREN=145, BL_PARAM_CONCAT_OPERATOR=146, BL_COMMA_EL=147, BL_PARAM_WS=148, + BL_NAME_STRING=149, PHP_D_BLADE_COMMENT=150, PHP_D_BLADE_ML_COMMENT=151, + D_ENDPHP=152, PHP_D_WS=153, PHP_D_PHP_COMPOSED_EXPRESSION=154, PHP_EXIT=155, + PHP_INLINE_COMMENT=156, PHP_INLINE_ML_COMMENT=157, VERBATIM_HTML=158, + BLADE_COMMENT_END=159, BLADE_COMMENT_PEEK=160, BLADE_COMMENT_MORE=161, + BLADE_COMMENT_EOF=162, AT=163, RAW_TAG_START=164, REGULAR_ECHO_STATIC_ACCESS=165, + REGULAR_ECHO_LPAREN=166, REGULAR_ECHO_RPAREN=167, REGULAR_ECHO_INSTANCE_ACCESS=168, + PHP_D_EXPR_CURLY_LPAREN=169, PHP_D_EXPR_CURLY_RPAREN=170, PHP_D_CLASS=171; + public static final int + COMMENT=2, PHP_CODE=3; + public static final int + INSIDE_REGULAR_ECHO=1, INSIDE_RAW_ECHO=2, LOOK_FOR_PHP_EXPRESSION=3, INSIDE_PHP_EXPRESSION=4, + LOOK_FOR_PHP_COMPOSED_EXPRESSION=5, INSIDE_PHP_COMPOSED_EXPRESSION=6, + LOOK_FOR_BLADE_PARAMETERS=7, FOREACH_LOOP_EXPRESSION=8, INSIDE_BLADE_PARAMETERS=9, + BLADE_INLINE_PHP=10, INSIDE_PHP_INLINE=11, VERBATIM_MODE=12, INSIDE_BLADE_COMMENT=13; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN", "COMMENT", "PHP_CODE" + }; + + public static String[] modeNames = { + "DEFAULT_MODE", "INSIDE_REGULAR_ECHO", "INSIDE_RAW_ECHO", "LOOK_FOR_PHP_EXPRESSION", + "INSIDE_PHP_EXPRESSION", "LOOK_FOR_PHP_COMPOSED_EXPRESSION", "INSIDE_PHP_COMPOSED_EXPRESSION", + "LOOK_FOR_BLADE_PARAMETERS", "FOREACH_LOOP_EXPRESSION", "INSIDE_BLADE_PARAMETERS", + "BLADE_INLINE_PHP", "INSIDE_PHP_INLINE", "VERBATIM_MODE", "INSIDE_BLADE_COMMENT" + }; + + private static String[] makeRuleNames() { + return new String[] { + "CompomentIdentifier", "CssSelector", "JsFunctionStart", "StringParam", + "CssAttrSelector", "StringAttrValue", "D_IF", "D_ELSEIF", "D_ELSE", "D_ENDIF", + "D_SWITCH", "D_CASE", "D_DEFAULT", "D_ENDSWITCH", "D_EMPTY", "D_ENDEMPTY", + "D_COND_BLOCK_START", "D_COND_BLOCK_END", "D_FOREACH", "D_ENDFOREACH", + "D_FOR", "D_ENDFOR", "D_FORELSE", "D_ENDFORELSE", "D_WHILE", "D_ENDWHILE", + "D_BREAK", "D_LOOP_ACTION", "D_INCLUDE", "D_INCLUDE_IF", "D_INCLUDE_WHEN", + "D_INCLUDE_FIRST", "D_INCLUDE_UNLESS", "D_EACH", "D_EXTENDS", "D_JS", + "D_JSON", "D_SECTION", "D_HAS_SECTION", "D_SECTION_MISSING", "D_ENDSECTION", + "D_YIELD", "D_PARENT", "D_SHOW", "D_OVERWRITE", "D_STOP", "D_APPEND", + "D_ONCE", "D_ENDONCE", "D_STACK", "D_PUSH", "D_ENDPUSH", "D_PUSH_IF", + "D_ENDPUSH_IF", "D_PUSH_ONCE", "D_ENDPUSH_ONCE", "D_PREPEND", "D_ENDPREPEND", + "D_PROPS", "D_FRAGMENT", "D_ENDFRAGMENT", "D_CSRF", "D_METHOD", "D_ERROR", + "D_ENDERROR", "D_PRODUCTION", "D_ENDPRODUCTION", "D_ENV", "D_ENDENV", + "D_AUTH_START", "D_AUTH_END", "D_PERMISSION_START", "D_PERMISSION_ELSE", + "D_PERMISSION_END", "D_CLASS", "D_STYLE", "D_HTML_ATTR_EXPR", "D_AWARE", + "D_SESSION", "D_ENDSESSION", "D_DD", "D_LANG", "D_USE", "D_INJECT", "D_PHP_SHORT", + "D_PHP", "D_VERBATIM", "D_ENDVERBATIM", "D_LIVEWIRE", "D_ASSET_BUNDLER", + "D_MISC", "D_CUSTOM", "D_UNKNOWN_ATTR_ENC", "D_UNKNOWN", "CONTENT_TAG_OPEN", + "RAW_TAG_OPEN", "AT", "RAW_TAG_START", "PHP_INLINE_START", "HTML_COMPONENT_PREFIX", + "HTML_L_COMPONENT", "JS_SCRIPT", "HTML_TAG_START", "HTML_CLOSE_TAG", + "HTML_TAG_SELF_CLOSE", "HTML_CLOSE_SYMBOL", "STRING_PATH", "HTML_PATH", + "HTML_TEXT", "HTML_IDENTIFIER", "EQ", "WS", "OTHER", "NameString", "BladeLabel", + "FullIdentifier", "ESC_DOUBLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING_FRAGMENT", + "SINGLE_QUOTED_STRING_FRAGMENT", "LineComment", "PhpVariable", "PhpKeyword", + "Digit", "BLADE_COMMENT_START", "EMAIL_SUBSTRING", "VERSION_WITH_AT", + "D_ESCAPES", "REGULAR_ECHO_PHP_VAR", "REGULAR_ECHO_KEYWORD", "REGULAR_PHP_NAMESPACE_PATH", + "REGULAR_ECHO_PHP_IDENTIFIER", "REGULAR_ECHO_STATIC_ACCESS", "CONTENT_TAG_CLOSE", + "REGULAR_ECHO_LPAREN", "REGULAR_ECHO_RPAREN", "REGULAR_ECHO_INSTANCE_ACCESS", + "REGULAR_ECHO_EXPR_MORE", "EXIT_REGULAR_ECHO_EOF", "RAW_ECHO_PHP_VAR", + "RAW_ECHO_KEYWORD", "RAW_ECHO_PHP_NAMESPACE_PATH", "RAW_ECHO_PHP_IDENTIFIER", + "RAW_ECHO_STATIC_ACCESS", "RAW_TAG_CLOSE", "RAW_ECHO_LPAREN", "RAW_ECHO_RPAREN", + "RAW_ECHO_INSTANCE_ACCESS", "RAW_ECHO_EXPR_MORE", "EXIT_RAW_ECHO_EOF", + "WS_EXPR_ESCAPE", "WS_EXPR", "OPEN_EXPR_PAREN_MORE", "L_OHTER_ESCAPE", + "L_OTHER", "OPEN_EXPR_PAREN", "CLOSE_EXPR_PAREN", "LPAREN", "RPAREN", + "EXIT_RPAREN", "PHP_EXPRESSION_MORE", "EXIT_EOF", "WS_COMPOSED_EXPR", + "BLADE_EXPR_LPAREN", "L_COMPOSED_EXPR_OTHER", "EXPR_SQ_LPAREN", "EXPR_SQ_RPAREN", + "EXPR_CURLY_LPAREN", "EXPR_CURLY_RPAREN", "EXPR_STRING", "COMPOSED_EXPR_PHP_VAR", + "COMPOSED_PHP_KEYWORD", "COMPOSED_PHP_NAMESPACE_PATH", "COMPOSED_EXPR_PHP_IDENTIFIER", + "COMPOSED_EXPR_STATIC_ACCESS", "COMPOSED_EXPR_LPAREN", "COMPOSED_EXPR_RPAREN", + "PHP_COMPOSED_EXPRESSION", "EXIT_COMPOSED_EXPRESSION_EOF", "WS_BL_PARAM", + "OPEN_BL_PARAM_PAREN_MORE", "L_BL_PARAM_OTHER", "FOREACH_WS_EXPR", "FOREACH_LOOP_LPAREN", + "FOREACH_LOOP_RPAREN", "FOREACH_AS", "FOREACH_PHP_VARIABLE", "FOREACH_PARAM_ASSIGN", + "LOOP_COMPOSED_PHP_KEYWORD", "LOOP_NAME_STRING", "LOOP_STATIC_ACCESS", + "LOOP_PHP_EXPRESSION", "FOREACH_EOF", "BL_PARAM_LINE_COMMENT", "BL_SQ_LPAREN", + "BL_SQ_RPAREN", "BL_CURLY_LPAREN", "BL_CURLY_RPAREN", "BL_PARAM_LPAREN", + "BL_PARAM_RPAREN", "BL_PARAM_STRING", "BL_PARAM_PHP_VARIABLE", "BL_PARAM_ASSIGN", + "BL_PARAM_PHP_KEYWORD", "BL_PARAM_CONCAT_OPERATOR", "BL_COMMA_EL", "BL_PARAM_WS", + "BL_NAME_STRING", "BL_PARAM_MORE", "BL_PARAM_EXIT_EOF", "PHP_D_BLADE_COMMENT", + "PHP_D_BLADE_ML_COMMENT", "D_ENDPHP", "PHP_D_UNKNOWN", "PHP_D_EXPR_SQ_LPAREN", + "PHP_D_EXPR_SQ_RPAREN", "PHP_D_EXPR_CURLY_LPAREN", "PHP_D_EXPR_CURLY_RPAREN", + "PHP_D_EXPR_STRING", "PHP_D_COMPOSED_EXPR_PHP_VAR", "PHP_D_NEW", "PHP_D_CLASS", + "PHP_D_COMPOSED_PHP_KEYWORD", "PHP_D_NAMESPACE_PATH", "PHP_D_COMPOSED_EXPR_PHP_CLASS_IDENTIFIER", + "PHP_D_COMPOSED_EXPR_PHP_IDENTIFIER", "PHP_D_COMPOSED_EXPR_STATIC_ACCESS", + "PHP_D_COMPOSED_EXPR_LPAREN", "PHP_D_COMPOSED_EXPR_RPAREN", "PHP_D_WS", + "PHP_D_EXIT_COMPOSED_EXPRESSION_EOF", "PHP_D_PHP_COMPOSED_EXPRESSION", + "PHP_EXIT", "PHP_INLINE_COMMENT", "PHP_INLINE_ML_COMMENT", "PHP_EXPR_SQ_LPAREN", + "PHP_EXPR_SQ_RPAREN", "PHP_EXPR_CURLY_LPAREN", "PHP_EXPR_CURLY_RPAREN", + "PHP_EXPR_STRING", "PHP_COMPOSED_EXPR_PHP_VAR", "PHP_COMPOSED_PHP_KEYWORD", + "PHP_COMPOSED_EXPR_PHP_IDENTIFIER", "PHP_COMPOSED_EXPR_STATIC_ACCESS", + "PHP_COMPOSED_EXPR_INSTANCE_ACCESS", "PHP_COMPOSED_EXPR_LPAREN", "PHP_COMPOSED_EXPR_RPAREN", + "PHP_EXIT_COMPOSED_EXPRESSION_EOF", "PHP_PHP_COMPOSED_EXPRESSION", "D_ENDVERBATIM_IN_MODE", + "VERBATIM_HTML", "EXIT_VERBATIM_MOD_EOF", "VERBATIM_HTML_MORE", "BLADE_COMMENT_END", + "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", "BLADE_COMMENT_EOF" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, "'@if'", "'@elseif'", "'@else'", "'@endif'", "'@switch'", "'@case'", + "'@default'", "'@endswitch'", "'@empty'", "'@endempty'", null, null, + "'@foreach'", "'@endforeach'", "'@for'", "'@endfor'", "'@forelse'", "'@endforelse'", + "'@while'", "'@endwhile'", "'@break'", null, "'@include'", "'@includeIf'", + "'@includeWhen'", "'@includeFirst'", "'@includeUnless'", "'@each'", "'@extends'", + "'@js'", "'@json'", "'@section'", "'@hasSection'", "'@sectionMissing'", + "'@endsection'", "'@yield'", "'@parent'", "'@show'", "'@overwrite'", + "'@stop'", "'@append'", "'@once'", "'@endonce'", "'@stack'", "'@push'", + "'@endpush'", "'@pushIf'", "'@endPushIf'", "'@pushOnce'", "'@endPushOnce'", + "'@prepend'", "'@endprepend'", "'@props'", "'@fragment'", "'@endfragment'", + "'@csrf'", "'@method'", "'@error'", "'@enderror'", "'@production'", "'@endproduction'", + "'@env'", "'@endenv'", null, null, null, null, null, "'@class'", "'@style'", + null, "'@aware'", "'@session'", "'@endsession'", null, "'@lang'", "'@use'", + "'@inject'", null, "'@verbatim'", "'@endverbatim'", null, "'@vite'", + "'@viteReactRefresh'", null, null, null, "'{{'", "'{!!'", null, null, + null, null, null, null, null, null, null, "'='", null, null, "'{{--'", + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, "'as'", null, null, null, null, "'.'", "','", null, null, + null, null, "'@endphp'", "' '", null, "'?>'", null, null, null, "'--}}'", + null, null, null, null, "'{!'", null, null, null, null, null, null, "'class'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "PHP_EXPRESSION", "PHP_VARIABLE", "PHP_KEYWORD", "PHP_NEW", "PHP_IDENTIFIER", + "PHP_NAMESPACE_PATH", "PHP_STATIC_ACCESS", "PHP_CLASS_KEYWORD", "PHP_INSTANCE_ACCESS", + "BLADE_PARAM_EXTRA", "BLADE_PARAM_LPAREN", "BLADE_PARAM_RPAREN", "BLADE_EXPR_LPAREN", + "BLADE_EXPR_RPAREN", "BL_SQ_LPAREN", "BL_SQ_LRAREN", "BL_PARAM_STRING", + "BL_PARAM_ASSIGN", "BL_COMMA", "BL_PARAM_COMMA", "PHP_EXPR_STRING", "ERROR", + "HTML", "BLADE_COMMENT", "D_IF", "D_ELSEIF", "D_ELSE", "D_ENDIF", "D_SWITCH", + "D_CASE", "D_DEFAULT", "D_ENDSWITCH", "D_EMPTY", "D_ENDEMPTY", "D_COND_BLOCK_START", + "D_COND_BLOCK_END", "D_FOREACH", "D_ENDFOREACH", "D_FOR", "D_ENDFOR", + "D_FORELSE", "D_ENDFORELSE", "D_WHILE", "D_ENDWHILE", "D_BREAK", "D_LOOP_ACTION", + "D_INCLUDE", "D_INCLUDE_IF", "D_INCLUDE_WHEN", "D_INCLUDE_FIRST", "D_INCLUDE_UNLESS", + "D_EACH", "D_EXTENDS", "D_JS", "D_JSON", "D_SECTION", "D_HAS_SECTION", + "D_SECTION_MISSING", "D_ENDSECTION", "D_YIELD", "D_PARENT", "D_SHOW", + "D_OVERWRITE", "D_STOP", "D_APPEND", "D_ONCE", "D_ENDONCE", "D_STACK", + "D_PUSH", "D_ENDPUSH", "D_PUSH_IF", "D_ENDPUSH_IF", "D_PUSH_ONCE", "D_ENDPUSH_ONCE", + "D_PREPEND", "D_ENDPREPEND", "D_PROPS", "D_FRAGMENT", "D_ENDFRAGMENT", + "D_CSRF", "D_METHOD", "D_ERROR", "D_ENDERROR", "D_PRODUCTION", "D_ENDPRODUCTION", + "D_ENV", "D_ENDENV", "D_AUTH_START", "D_AUTH_END", "D_PERMISSION_START", + "D_PERMISSION_ELSE", "D_PERMISSION_END", "D_CLASS", "D_STYLE", "D_HTML_ATTR_EXPR", + "D_AWARE", "D_SESSION", "D_ENDSESSION", "D_DD", "D_LANG", "D_USE", "D_INJECT", + "D_PHP", "D_VERBATIM", "D_ENDVERBATIM", "D_LIVEWIRE", "D_ASSET_BUNDLER", + "D_MISC", "D_CUSTOM", "D_UNKNOWN_ATTR_ENC", "D_UNKNOWN", "CONTENT_TAG_OPEN", + "RAW_TAG_OPEN", "PHP_INLINE_START", "HTML_COMPONENT_PREFIX", "JS_SCRIPT", + "HTML_TAG_START", "HTML_CLOSE_TAG", "STRING_PATH", "HTML_PATH", "HTML_TEXT", + "HTML_IDENTIFIER", "EQ", "WS", "OTHER", "BLADE_COMMENT_START", "CONTENT_TAG_CLOSE", + "REGULAR_ECHO_EXPR_MORE", "RAW_TAG_CLOSE", "RAW_ECHO_EXPR_MORE", "WS_EXPR_ESCAPE", + "WS_EXPR", "WS_COMPOSED_EXPR", "EXPR_STRING", "COMPOSED_EXPR_RPAREN", + "PHP_COMPOSED_EXPRESSION", "WS_BL_PARAM", "FOREACH_WS_EXPR", "FOREACH_LOOP_LPAREN", + "FOREACH_LOOP_RPAREN", "FOREACH_AS", "FOREACH_PARAM_ASSIGN", "BL_PARAM_LINE_COMMENT", + "BL_SQ_RPAREN", "BL_PARAM_RPAREN", "BL_PARAM_CONCAT_OPERATOR", "BL_COMMA_EL", + "BL_PARAM_WS", "BL_NAME_STRING", "PHP_D_BLADE_COMMENT", "PHP_D_BLADE_ML_COMMENT", + "D_ENDPHP", "PHP_D_WS", "PHP_D_PHP_COMPOSED_EXPRESSION", "PHP_EXIT", + "PHP_INLINE_COMMENT", "PHP_INLINE_ML_COMMENT", "VERBATIM_HTML", "BLADE_COMMENT_END", + "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", "BLADE_COMMENT_EOF", "AT", + "RAW_TAG_START", "REGULAR_ECHO_STATIC_ACCESS", "REGULAR_ECHO_LPAREN", + "REGULAR_ECHO_RPAREN", "REGULAR_ECHO_INSTANCE_ACCESS", "PHP_D_EXPR_CURLY_LPAREN", + "PHP_D_EXPR_CURLY_RPAREN", "PHP_D_CLASS" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + + public BladeAntlrLexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "BladeAntlrLexer.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public String[] getChannelNames() { return channelNames; } + + @Override + public String[] getModeNames() { return modeNames; } + + @Override + public ATN getATN() { return _ATN; } + + @Override + public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { + switch (ruleIndex) { + case 99: + HTML_COMPONENT_PREFIX_action((RuleContext)_localctx, actionIndex); + break; + case 104: + HTML_TAG_SELF_CLOSE_action((RuleContext)_localctx, actionIndex); + break; + case 105: + HTML_CLOSE_SYMBOL_action((RuleContext)_localctx, actionIndex); + break; + case 109: + HTML_IDENTIFIER_action((RuleContext)_localctx, actionIndex); + break; + case 154: + OPEN_EXPR_PAREN_action((RuleContext)_localctx, actionIndex); + break; + case 155: + CLOSE_EXPR_PAREN_action((RuleContext)_localctx, actionIndex); + break; + case 156: + LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 157: + RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 162: + BLADE_EXPR_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 164: + EXPR_SQ_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 165: + EXPR_SQ_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 166: + EXPR_CURLY_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 167: + EXPR_CURLY_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 174: + COMPOSED_EXPR_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 175: + COMPOSED_EXPR_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 179: + OPEN_BL_PARAM_PAREN_MORE_action((RuleContext)_localctx, actionIndex); + break; + case 182: + FOREACH_LOOP_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 183: + FOREACH_LOOP_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 193: + BL_SQ_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 194: + BL_SQ_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 195: + BL_CURLY_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 196: + BL_CURLY_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 197: + BL_PARAM_LPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 198: + BL_PARAM_RPAREN_action((RuleContext)_localctx, actionIndex); + break; + case 204: + BL_COMMA_EL_action((RuleContext)_localctx, actionIndex); + break; + } + } + private void HTML_COMPONENT_PREFIX_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 0: + this.compomentTagOpen = true; + break; + } + } + private void HTML_TAG_SELF_CLOSE_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 1: + this.compomentTagOpen = false; + break; + } + } + private void HTML_CLOSE_SYMBOL_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 2: + this.compomentTagOpen = false; + break; + } + } + private void HTML_IDENTIFIER_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 3: + this.consumeHtmlIdentifier(); + break; + } + } + private void OPEN_EXPR_PAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 4: + this.increaseRoundParenBalance(); + break; + } + } + private void CLOSE_EXPR_PAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 5: + this.decreaseRoundParenBalance(); + break; + } + } + private void LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 6: + this.increaseRoundParenBalance(); + break; + } + } + private void RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 7: + this.decreaseRoundParenBalance(); + break; + } + } + private void BLADE_EXPR_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 8: + this.roundParenBalance = 0; + break; + } + } + private void EXPR_SQ_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 9: + this.squareParenBalance++; + break; + } + } + private void EXPR_SQ_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 10: + this.squareParenBalance--; + break; + } + } + private void EXPR_CURLY_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 11: + this.curlyParenBalance++; + break; + } + } + private void EXPR_CURLY_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 12: + this.curlyParenBalance--; + break; + } + } + private void COMPOSED_EXPR_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 13: + this.increaseRoundParenBalance(); + break; + } + } + private void COMPOSED_EXPR_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 14: + consumeExprRParen(); + break; + } + } + private void OPEN_BL_PARAM_PAREN_MORE_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 15: + this.roundParenBalance = 0; + break; + } + } + private void FOREACH_LOOP_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 16: + this.increaseRoundParenBalance(); + break; + } + } + private void FOREACH_LOOP_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 17: + this.decreaseRoundParenBalance(); if (this.roundParenBalance == 0){this.popMode();} + break; + } + } + private void BL_SQ_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 18: + this.squareParenBalance++; + break; + } + } + private void BL_SQ_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 19: + this.squareParenBalance--; + break; + } + } + private void BL_CURLY_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 20: + this.curlyParenBalance++; + break; + } + } + private void BL_CURLY_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 21: + this.curlyParenBalance--; + break; + } + } + private void BL_PARAM_LPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 22: + this.increaseRoundParenBalance(); + break; + } + } + private void BL_PARAM_RPAREN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 23: + consumeParamRParen(); + break; + } + } + private void BL_COMMA_EL_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 24: + this.consumeBladeParamComma(); + break; + } + } + @Override + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { + switch (ruleIndex) { + case 2: + return JsFunctionStart_sempred((RuleContext)_localctx, predIndex); + case 84: + return D_PHP_SHORT_sempred((RuleContext)_localctx, predIndex); + case 85: + return D_PHP_sempred((RuleContext)_localctx, predIndex); + case 91: + return D_CUSTOM_sempred((RuleContext)_localctx, predIndex); + case 92: + return D_UNKNOWN_ATTR_ENC_sempred((RuleContext)_localctx, predIndex); + case 93: + return D_UNKNOWN_sempred((RuleContext)_localctx, predIndex); + case 100: + return HTML_L_COMPONENT_sempred((RuleContext)_localctx, predIndex); + case 149: + return WS_EXPR_ESCAPE_sempred((RuleContext)_localctx, predIndex); + case 152: + return L_OHTER_ESCAPE_sempred((RuleContext)_localctx, predIndex); + case 154: + return OPEN_EXPR_PAREN_sempred((RuleContext)_localctx, predIndex); + case 155: + return CLOSE_EXPR_PAREN_sempred((RuleContext)_localctx, predIndex); + case 156: + return LPAREN_sempred((RuleContext)_localctx, predIndex); + case 157: + return RPAREN_sempred((RuleContext)_localctx, predIndex); + case 158: + return EXIT_RPAREN_sempred((RuleContext)_localctx, predIndex); + case 219: + return PHP_D_NEW_sempred((RuleContext)_localctx, predIndex); + case 249: + return VERBATIM_HTML_sempred((RuleContext)_localctx, predIndex); + case 253: + return BLADE_COMMENT_PEEK_sempred((RuleContext)_localctx, predIndex); + } + return true; + } + private boolean JsFunctionStart_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 0: + return this._input.LA(1) != '{'; + } + return true; + } + private boolean D_PHP_SHORT_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 1: + return this._input.LA(1) == '('; + } + return true; + } + private boolean D_PHP_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 2: + return this._input.LA(1) == ' ' || this._input.LA(1) == '\r' || this._input.LA(1) == '\n'; + } + return true; + } + private boolean D_CUSTOM_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 3: + return this._input.LA(1) == '(' || + (this._input.LA(1) == ' ' && this._input.LA(2) == '('); + } + return true; + } + private boolean D_UNKNOWN_ATTR_ENC_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 4: + return this._input.LA(1) == '"'; + } + return true; + } + private boolean D_UNKNOWN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 5: + return this._input.LA(1) != '"'; + } + return true; + } + private boolean HTML_L_COMPONENT_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 6: + return this._input.LA(1) == '>'; + } + return true; + } + private boolean WS_EXPR_ESCAPE_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 7: + return this._input.LA(1) == '@'; + } + return true; + } + private boolean L_OHTER_ESCAPE_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 8: + return this._input.LA(1) == '@'; + } + return true; + } + private boolean OPEN_EXPR_PAREN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 9: + return this.roundParenBalance == 0; + } + return true; + } + private boolean CLOSE_EXPR_PAREN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 10: + return this.roundParenBalance == 1; + } + return true; + } + private boolean LPAREN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 11: + return this.roundParenBalance > 0; + } + return true; + } + private boolean RPAREN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 12: + return this.roundParenBalance > 0; + } + return true; + } + private boolean EXIT_RPAREN_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 13: + return this.roundParenBalance == 0; + } + return true; + } + private boolean PHP_D_NEW_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 14: + return this._input.LA(1) == ' '; + } + return true; + } + private boolean VERBATIM_HTML_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 15: + return + this._input.LA(1) == '@' && + this._input.LA(2) == 'e' && + this._input.LA(3) == 'n' && + this._input.LA(4) == 'd' && + this._input.LA(5) == 'v' && + this._input.LA(6) == 'e' && + this._input.LA(7) == 'r' + ; + } + return true; + } + private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 16: + return + this._input.LA(1) == '-' && + this._input.LA(2) == '-' && + this._input.LA(3) == '}' && + this._input.LA(4) == '}' + ; + } + return true; + } + + private static final String _serializedATNSegment0 = + "\u0004\u0000\u00ab\u0b3f\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ + "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ + "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ + "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+ + "\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003"+ + "\u0007\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006"+ + "\u0007\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002"+ + "\n\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002"+ + "\u000e\u0007\u000e\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002"+ + "\u0011\u0007\u0011\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002"+ + "\u0014\u0007\u0014\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002"+ + "\u0017\u0007\u0017\u0002\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002"+ + "\u001a\u0007\u001a\u0002\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002"+ + "\u001d\u0007\u001d\u0002\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002"+ + " \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002"+ + "%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002"+ + "*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002"+ + "/\u0007/\u00020\u00070\u00021\u00071\u00022\u00072\u00023\u00073\u0002"+ + "4\u00074\u00025\u00075\u00026\u00076\u00027\u00077\u00028\u00078\u0002"+ + "9\u00079\u0002:\u0007:\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002"+ + ">\u0007>\u0002?\u0007?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002"+ + "C\u0007C\u0002D\u0007D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002"+ + "H\u0007H\u0002I\u0007I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002"+ + "M\u0007M\u0002N\u0007N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002"+ + "R\u0007R\u0002S\u0007S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002"+ + "W\u0007W\u0002X\u0007X\u0002Y\u0007Y\u0002Z\u0007Z\u0002[\u0007[\u0002"+ + "\\\u0007\\\u0002]\u0007]\u0002^\u0007^\u0002_\u0007_\u0002`\u0007`\u0002"+ + "a\u0007a\u0002b\u0007b\u0002c\u0007c\u0002d\u0007d\u0002e\u0007e\u0002"+ + "f\u0007f\u0002g\u0007g\u0002h\u0007h\u0002i\u0007i\u0002j\u0007j\u0002"+ + "k\u0007k\u0002l\u0007l\u0002m\u0007m\u0002n\u0007n\u0002o\u0007o\u0002"+ + "p\u0007p\u0002q\u0007q\u0002r\u0007r\u0002s\u0007s\u0002t\u0007t\u0002"+ + "u\u0007u\u0002v\u0007v\u0002w\u0007w\u0002x\u0007x\u0002y\u0007y\u0002"+ + "z\u0007z\u0002{\u0007{\u0002|\u0007|\u0002}\u0007}\u0002~\u0007~\u0002"+ + "\u007f\u0007\u007f\u0002\u0080\u0007\u0080\u0002\u0081\u0007\u0081\u0002"+ + "\u0082\u0007\u0082\u0002\u0083\u0007\u0083\u0002\u0084\u0007\u0084\u0002"+ + "\u0085\u0007\u0085\u0002\u0086\u0007\u0086\u0002\u0087\u0007\u0087\u0002"+ + "\u0088\u0007\u0088\u0002\u0089\u0007\u0089\u0002\u008a\u0007\u008a\u0002"+ + "\u008b\u0007\u008b\u0002\u008c\u0007\u008c\u0002\u008d\u0007\u008d\u0002"+ + "\u008e\u0007\u008e\u0002\u008f\u0007\u008f\u0002\u0090\u0007\u0090\u0002"+ + "\u0091\u0007\u0091\u0002\u0092\u0007\u0092\u0002\u0093\u0007\u0093\u0002"+ + "\u0094\u0007\u0094\u0002\u0095\u0007\u0095\u0002\u0096\u0007\u0096\u0002"+ + "\u0097\u0007\u0097\u0002\u0098\u0007\u0098\u0002\u0099\u0007\u0099\u0002"+ + "\u009a\u0007\u009a\u0002\u009b\u0007\u009b\u0002\u009c\u0007\u009c\u0002"+ + "\u009d\u0007\u009d\u0002\u009e\u0007\u009e\u0002\u009f\u0007\u009f\u0002"+ + "\u00a0\u0007\u00a0\u0002\u00a1\u0007\u00a1\u0002\u00a2\u0007\u00a2\u0002"+ + "\u00a3\u0007\u00a3\u0002\u00a4\u0007\u00a4\u0002\u00a5\u0007\u00a5\u0002"+ + "\u00a6\u0007\u00a6\u0002\u00a7\u0007\u00a7\u0002\u00a8\u0007\u00a8\u0002"+ + "\u00a9\u0007\u00a9\u0002\u00aa\u0007\u00aa\u0002\u00ab\u0007\u00ab\u0002"+ + "\u00ac\u0007\u00ac\u0002\u00ad\u0007\u00ad\u0002\u00ae\u0007\u00ae\u0002"+ + "\u00af\u0007\u00af\u0002\u00b0\u0007\u00b0\u0002\u00b1\u0007\u00b1\u0002"+ + "\u00b2\u0007\u00b2\u0002\u00b3\u0007\u00b3\u0002\u00b4\u0007\u00b4\u0002"+ + "\u00b5\u0007\u00b5\u0002\u00b6\u0007\u00b6\u0002\u00b7\u0007\u00b7\u0002"+ + "\u00b8\u0007\u00b8\u0002\u00b9\u0007\u00b9\u0002\u00ba\u0007\u00ba\u0002"+ + "\u00bb\u0007\u00bb\u0002\u00bc\u0007\u00bc\u0002\u00bd\u0007\u00bd\u0002"+ + "\u00be\u0007\u00be\u0002\u00bf\u0007\u00bf\u0002\u00c0\u0007\u00c0\u0002"+ + "\u00c1\u0007\u00c1\u0002\u00c2\u0007\u00c2\u0002\u00c3\u0007\u00c3\u0002"+ + "\u00c4\u0007\u00c4\u0002\u00c5\u0007\u00c5\u0002\u00c6\u0007\u00c6\u0002"+ + "\u00c7\u0007\u00c7\u0002\u00c8\u0007\u00c8\u0002\u00c9\u0007\u00c9\u0002"+ + "\u00ca\u0007\u00ca\u0002\u00cb\u0007\u00cb\u0002\u00cc\u0007\u00cc\u0002"+ + "\u00cd\u0007\u00cd\u0002\u00ce\u0007\u00ce\u0002\u00cf\u0007\u00cf\u0002"+ + "\u00d0\u0007\u00d0\u0002\u00d1\u0007\u00d1\u0002\u00d2\u0007\u00d2\u0002"+ + "\u00d3\u0007\u00d3\u0002\u00d4\u0007\u00d4\u0002\u00d5\u0007\u00d5\u0002"+ + "\u00d6\u0007\u00d6\u0002\u00d7\u0007\u00d7\u0002\u00d8\u0007\u00d8\u0002"+ + "\u00d9\u0007\u00d9\u0002\u00da\u0007\u00da\u0002\u00db\u0007\u00db\u0002"+ + "\u00dc\u0007\u00dc\u0002\u00dd\u0007\u00dd\u0002\u00de\u0007\u00de\u0002"+ + "\u00df\u0007\u00df\u0002\u00e0\u0007\u00e0\u0002\u00e1\u0007\u00e1\u0002"+ + "\u00e2\u0007\u00e2\u0002\u00e3\u0007\u00e3\u0002\u00e4\u0007\u00e4\u0002"+ + "\u00e5\u0007\u00e5\u0002\u00e6\u0007\u00e6\u0002\u00e7\u0007\u00e7\u0002"+ + "\u00e8\u0007\u00e8\u0002\u00e9\u0007\u00e9\u0002\u00ea\u0007\u00ea\u0002"+ + "\u00eb\u0007\u00eb\u0002\u00ec\u0007\u00ec\u0002\u00ed\u0007\u00ed\u0002"+ + "\u00ee\u0007\u00ee\u0002\u00ef\u0007\u00ef\u0002\u00f0\u0007\u00f0\u0002"+ + "\u00f1\u0007\u00f1\u0002\u00f2\u0007\u00f2\u0002\u00f3\u0007\u00f3\u0002"+ + "\u00f4\u0007\u00f4\u0002\u00f5\u0007\u00f5\u0002\u00f6\u0007\u00f6\u0002"+ + "\u00f7\u0007\u00f7\u0002\u00f8\u0007\u00f8\u0002\u00f9\u0007\u00f9\u0002"+ + "\u00fa\u0007\u00fa\u0002\u00fb\u0007\u00fb\u0002\u00fc\u0007\u00fc\u0002"+ + "\u00fd\u0007\u00fd\u0002\u00fe\u0007\u00fe\u0002\u00ff\u0007\u00ff\u0001"+ + "\u0000\u0001\u0000\u0005\u0000\u0211\b\u0000\n\u0000\f\u0000\u0214\t\u0000"+ + "\u0001\u0001\u0003\u0001\u0217\b\u0001\u0001\u0001\u0001\u0001\u0005\u0001"+ + "\u021b\b\u0001\n\u0001\f\u0001\u021e\t\u0001\u0001\u0001\u0003\u0001\u0221"+ + "\b\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0005\u0002\u0226\b\u0002"+ + "\n\u0002\f\u0002\u0229\t\u0002\u0001\u0002\u0001\u0002\u0005\u0002\u022d"+ + "\b\u0002\n\u0002\f\u0002\u0230\t\u0002\u0001\u0002\u0005\u0002\u0233\b"+ + "\u0002\n\u0002\f\u0002\u0236\t\u0002\u0001\u0002\u0005\u0002\u0239\b\u0002"+ + "\n\u0002\f\u0002\u023c\t\u0002\u0001\u0002\u0001\u0002\u0005\u0002\u0240"+ + "\b\u0002\n\u0002\f\u0002\u0243\t\u0002\u0001\u0002\u0001\u0002\u0003\u0002"+ + "\u0247\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0005\u0003\u024c\b"+ + "\u0003\n\u0003\f\u0003\u024f\t\u0003\u0001\u0003\u0005\u0003\u0252\b\u0003"+ + "\n\u0003\f\u0003\u0255\t\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0005\u0003\u025c\b\u0003\n\u0003\f\u0003\u025f\t\u0003"+ + "\u0001\u0003\u0005\u0003\u0262\b\u0003\n\u0003\f\u0003\u0265\t\u0003\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0003\u0003\u026a\b\u0003\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0003\u0004\u0271\b\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u027d\b\u0005\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ + "\u0003\u0010\u02e2\b\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0003\u0011"+ + "\u02f9\b\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ + "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ + "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+ + "\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+ + "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+ + "\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ + "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ + "\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019"+ + "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+ + "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+ + "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+ + "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ + "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ + "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ + "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ + "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ + " \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001!\u0001"+ + "!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001"+ + "\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001"+ + "#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0001$\u0001"+ + "$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001"+ + "%\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001"+ + "&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001"+ + "\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ + "\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001"+ + "(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001"+ + ")\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001*\u0001"+ + "*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001"+ + "+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u0001"+ + "0\u00010\u00010\u00011\u00011\u00011\u00011\u00011\u00011\u00011\u0001"+ + "1\u00011\u00012\u00012\u00012\u00012\u00012\u00012\u00012\u00012\u0001"+ + "3\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00014\u0001"+ + "4\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u00015\u0001"+ + "5\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u0001"+ + "6\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u0001"+ + "6\u00016\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u0001"+ + "7\u00017\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u00018\u0001"+ + "8\u00018\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u00019\u0001"+ + "9\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001"+ + ":\u0001:\u0001:\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001;\u0001"+ + ";\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001<\u0001"+ + "<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001"+ + "<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001"+ + ">\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001"+ + "?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001"+ + "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001"+ + "A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ + "C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001"+ + "E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0003"+ + "E\u0518\bE\u0001E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001"+ + "F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001"+ + "F\u0003F\u052d\bF\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001"+ + "G\u0001G\u0001G\u0001G\u0003G\u053a\bG\u0001G\u0001G\u0001H\u0001H\u0001"+ + "H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001"+ + "H\u0001H\u0001H\u0003H\u054d\bH\u0001H\u0001H\u0001I\u0001I\u0001I\u0001"+ + "I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001"+ + "I\u0003I\u055f\bI\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001"+ + "J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001"+ + "K\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ + "L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ + "L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ + "L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ + "L\u0001L\u0001L\u0001L\u0001L\u0003L\u059f\bL\u0001L\u0001L\u0001M\u0001"+ + "M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001"+ + "N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001O\u0001"+ + "O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001"+ + "O\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0003P\u05cb"+ + "\bP\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001"+ + "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001"+ + "T\u0001T\u0001T\u0001T\u0003T\u05ee\bT\u0001T\u0001T\u0001T\u0001T\u0001"+ + "T\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+ + "V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ + "V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001"+ + "W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0003X\u0654\bX\u0001Y\u0001Y\u0001"+ + "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ + "\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001"+ + "^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001`\u0001"+ + "`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001"+ + "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0003b\u069a\bb\u0001b\u0001b\u0001"+ + "c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0004"+ + "c\u06a8\bc\u000bc\fc\u06a9\u0003c\u06ac\bc\u0001c\u0001c\u0001d\u0001"+ + "d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001e\u0003e\u06ba"+ + "\be\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0003e\u06c2\be\u0001e\u0001"+ + "e\u0001e\u0005e\u06c7\be\ne\fe\u06ca\te\u0003e\u06cc\be\u0001e\u0001e"+ + "\u0001f\u0001f\u0001f\u0001g\u0001g\u0001g\u0001g\u0001g\u0005g\u06d8"+ + "\bg\ng\fg\u06db\tg\u0001g\u0001g\u0004g\u06df\bg\u000bg\fg\u06e0\u0001"+ + "g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001i\u0001"+ + "i\u0001i\u0001i\u0001i\u0001j\u0001j\u0005j\u06f3\bj\nj\fj\u06f6\tj\u0001"+ + "j\u0001j\u0001j\u0001j\u0001j\u0003j\u06fd\bj\u0001j\u0001j\u0001k\u0005"+ + "k\u0702\bk\nk\fk\u0705\tk\u0001k\u0001k\u0001k\u0004k\u070a\bk\u000bk"+ + "\fk\u070b\u0001k\u0001k\u0003k\u0710\bk\u0001k\u0001k\u0001k\u0001k\u0001"+ + "k\u0005k\u0717\bk\nk\fk\u071a\tk\u0003k\u071c\bk\u0001k\u0001k\u0001l"+ + "\u0005l\u0721\bl\nl\fl\u0724\tl\u0001l\u0001l\u0004l\u0728\bl\u000bl\f"+ + "l\u0729\u0001l\u0004l\u072d\bl\u000bl\fl\u072e\u0001l\u0001l\u0001m\u0001"+ + "m\u0001m\u0001n\u0001n\u0001o\u0004o\u0739\bo\u000bo\fo\u073a\u0001o\u0004"+ + "o\u073e\bo\u000bo\fo\u073f\u0003o\u0742\bo\u0001o\u0001o\u0001p\u0001"+ + "p\u0001p\u0001p\u0001q\u0001q\u0005q\u074c\bq\nq\fq\u074f\tq\u0001r\u0001"+ + "r\u0005r\u0753\br\nr\fr\u0756\tr\u0001s\u0001s\u0005s\u075a\bs\ns\fs\u075d"+ + "\ts\u0001t\u0001t\u0001u\u0001u\u0001u\u0005u\u0764\bu\nu\fu\u0767\tu"+ + "\u0001u\u0001u\u0001v\u0001v\u0001v\u0001v\u0005v\u076f\bv\nv\fv\u0772"+ + "\tv\u0001v\u0001v\u0001w\u0001w\u0001w\u0001w\u0005w\u077a\bw\nw\fw\u077d"+ + "\tw\u0001x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001"+ + "y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001"+ + "y\u0001y\u0003y\u0794\by\u0001z\u0001z\u0001{\u0001{\u0001{\u0001{\u0001"+ + "{\u0001{\u0001{\u0001{\u0001|\u0001|\u0001|\u0001|\u0001|\u0001|\u0001"+ + "}\u0001}\u0001}\u0003}\u07a9\b}\u0004}\u07ab\b}\u000b}\f}\u07ac\u0001"+ + "}\u0001}\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0003~\u07b8"+ + "\b~\u0001~\u0001~\u0001~\u0001~\u0003~\u07be\b~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0005~\u07c8\b~\n~\f~\u07cb\t~\u0001~\u0003"+ + "~\u07ce\b~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0005~\u07da\b~\n~\f~\u07dd\t~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0005~\u07e8\b~\n~\f~\u07eb\t~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0005~\u07f9\b~\n~\f~\u07fc\t~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005~\u0809\b~\n~\f~\u080c\t~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0005~\u081a\b~\n~\f~\u081d\t~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0005~\u0826\b~\n~\f~\u0829\t~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005~\u0836\b~\n~"+ + "\f~\u0839\t~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005"+ + "~\u0843\b~\n~\f~\u0846\t~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0005~\u0853\b~\n~\f~\u0856\t~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005~\u0860\b~\n~\f~\u0863"+ + "\t~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0005~\u0879\b~\n~\f~\u087c\t~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005~\u088a\b~\n~\f~\u088d"+ + "\t~\u0003~\u088f\b~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f"+ + "\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0081"+ + "\u0003\u0081\u089c\b\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0004\u0081"+ + "\u08a1\b\u0081\u000b\u0081\f\u0081\u08a2\u0001\u0081\u0001\u0081\u0001"+ + "\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001"+ + "\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001"+ + "\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001"+ + "\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001"+ + "\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0088\u0001"+ + "\u0088\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001"+ + "\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001"+ + "\u008b\u0001\u008b\u0001\u008c\u0003\u008c\u08d4\b\u008c\u0001\u008c\u0001"+ + "\u008c\u0001\u008c\u0004\u008c\u08d9\b\u008c\u000b\u008c\f\u008c\u08da"+ + "\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d"+ + "\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008f"+ + "\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u0090"+ + "\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0091\u0001\u0091\u0001\u0091"+ + "\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092"+ + "\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094"+ + "\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0004\u0095\u0905\b\u0095"+ + "\u000b\u0095\f\u0095\u0906\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095"+ + "\u0001\u0095\u0001\u0096\u0004\u0096\u090f\b\u0096\u000b\u0096\f\u0096"+ + "\u0910\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001"+ + "\u0097\u0001\u0097\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001"+ + "\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001"+ + "\u0099\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001"+ + "\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001"+ + "\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001"+ + "\u009c\u0001\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001"+ + "\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001"+ + "\u009e\u0001\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ + "\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0004"+ + "\u00a1\u094e\b\u00a1\u000b\u00a1\f\u00a1\u094f\u0001\u00a1\u0001\u00a1"+ + "\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3"+ + "\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001\u00a4"+ + "\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5"+ + "\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6"+ + "\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7"+ + "\u0001\u00a8\u0001\u00a8\u0003\u00a8\u0974\b\u00a8\u0001\u00a9\u0001\u00a9"+ + "\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa"+ + "\u0001\u00ab\u0003\u00ab\u097f\b\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab"+ + "\u0004\u00ab\u0984\b\u00ab\u000b\u00ab\f\u00ab\u0985\u0001\u00ab\u0001"+ + "\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001"+ + "\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0001"+ + "\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0001\u00af\u0001"+ + "\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001"+ + "\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0004\u00b2\u09a5\b\u00b2\u000b"+ + "\u00b2\f\u00b2\u09a6\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001"+ + "\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001"+ + "\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5\u0004\u00b5\u09b7\b\u00b5\u000b"+ + "\u00b5\f\u00b5\u09b8\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001"+ + "\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001"+ + "\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001"+ + "\u00ba\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001"+ + "\u00bc\u0001\u00bc\u0001\u00bc\u0003\u00bc\u09d4\b\u00bc\u0001\u00bc\u0001"+ + "\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001"+ + "\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00bf\u0001\u00bf\u0001"+ + "\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001"+ + "\u00c0\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c2\u0001\u00c2\u0001"+ + "\u00c2\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001"+ + "\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c5\u0001"+ + "\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c6\u0001\u00c6\u0001"+ + "\u00c6\u0001\u00c7\u0001\u00c7\u0003\u00c7\u0a04\b\u00c7\u0001\u00c8\u0001"+ + "\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001"+ + "\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00cb\u0001\u00cb\u0001"+ + "\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cd\u0004\u00cd\u0a17\b\u00cd\u000b"+ + "\u00cd\f\u00cd\u0a18\u0001\u00cd\u0001\u00cd\u0001\u00ce\u0001\u00ce\u0001"+ + "\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00d0\u0001\u00d0\u0001"+ + "\u00d0\u0001\u00d0\u0001\u00d0\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001"+ + "\u00d1\u0004\u00d1\u0a2c\b\u00d1\u000b\u00d1\f\u00d1\u0a2d\u0001\u00d1"+ + "\u0001\u00d1\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0005\u00d2"+ + "\u0a36\b\u00d2\n\u00d2\f\u00d2\u0a39\t\u00d2\u0001\u00d2\u0001\u00d2\u0001"+ + "\u00d2\u0001\u00d2\u0005\u00d2\u0a3f\b\u00d2\n\u00d2\f\u00d2\u0a42\t\u00d2"+ + "\u0001\u00d2\u0001\u00d2\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3"+ + "\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3"+ + "\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d5"+ + "\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d6\u0001\u00d6\u0001\u00d6"+ + "\u0001\u00d6\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d8"+ + "\u0001\u00d8\u0001\u00d8\u0001\u00d8\u0001\u00d9\u0001\u00d9\u0003\u00d9"+ + "\u0a67\b\u00d9\u0001\u00d9\u0001\u00d9\u0001\u00da\u0001\u00da\u0001\u00da"+ + "\u0001\u00da\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db"+ + "\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00dc\u0001\u00dc\u0001\u00dc"+ + "\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dd"+ + "\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00de\u0003\u00de\u0a84\b\u00de"+ + "\u0001\u00de\u0001\u00de\u0001\u00de\u0004\u00de\u0a89\b\u00de\u000b\u00de"+ + "\f\u00de\u0a8a\u0001\u00de\u0001\u00de\u0001\u00df\u0001\u00df\u0001\u00df"+ + "\u0001\u00df\u0001\u00df\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0"+ + "\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e2"+ + "\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001\u00e3\u0001\u00e3\u0001\u00e3"+ + "\u0001\u00e3\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e5"+ + "\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e6\u0001\u00e6"+ + "\u0001\u00e6\u0001\u00e6\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7"+ + "\u0001\u00e7\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0004\u00e8"+ + "\u0abb\b\u00e8\u000b\u00e8\f\u00e8\u0abc\u0001\u00e8\u0001\u00e8\u0001"+ + "\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0005\u00e9\u0ac5\b\u00e9\n"+ + "\u00e9\f\u00e9\u0ac8\t\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001"+ + "\u00e9\u0001\u00e9\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001"+ + "\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00ec\u0001\u00ec\u0001"+ + "\u00ec\u0001\u00ec\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001"+ + "\u00ee\u0001\u00ee\u0003\u00ee\u0ae1\b\u00ee\u0001\u00ee\u0001\u00ee\u0001"+ + "\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00f0\u0001\u00f0\u0001"+ + "\u00f0\u0001\u00f0\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001"+ + "\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f3\u0001"+ + "\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f4\u0001\u00f4\u0001"+ + "\u00f4\u0001\u00f4\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001"+ + "\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f7\u0001"+ + "\u00f7\u0001\u00f7\u0001\u00f7\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ + "\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ + "\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ + "\u00f8\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001"+ + "\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fb\u0001"+ + "\u00fb\u0001\u00fb\u0001\u00fb\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001"+ + "\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fd\u0001"+ + "\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fe\u0001\u00fe\u0001"+ + "\u00fe\u0001\u00fe\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001"+ + "\u00ff\u0003\u0765\u0a37\u0ac6\u0000\u0100\u000e\u0000\u0010\u0000\u0012"+ + "\u0000\u0014\u0000\u0016\u0000\u0018\u0000\u001a\u0019\u001c\u001a\u001e"+ + "\u001b \u001c\"\u001d$\u001e&\u001f( *!,\".#0$2%4&6\'8(:)<*>+@,B-D.F/"+ + "H0J1L2N3P4R5T6V7X8Z9\\:^;`f?h@jAlBnCpDrEtFvGxHzI|J~K\u0080L\u0082"+ + "M\u0084N\u0086O\u0088P\u008aQ\u008cR\u008eS\u0090T\u0092U\u0094V\u0096"+ + "W\u0098X\u009aY\u009cZ\u009e[\u00a0\\\u00a2]\u00a4^\u00a6_\u00a8`\u00aa"+ + "a\u00acb\u00aec\u00b0d\u00b2e\u00b4f\u00b6\u0000\u00b8g\u00bah\u00bci"+ + "\u00bej\u00c0k\u00c2l\u00c4m\u00c6n\u00c8o\u00cap\u00ccq\u00ce\u00a3\u00d0"+ + "\u00a4\u00d2r\u00d4s\u00d6\u0000\u00d8t\u00dau\u00dcv\u00de\u0000\u00e0"+ + "\u0000\u00e2w\u00e4x\u00e6y\u00e8z\u00ea{\u00ec|\u00ee}\u00f0\u0000\u00f2"+ + "\u0000\u00f4\u0000\u00f6\u0000\u00f8\u0000\u00fa\u0000\u00fc\u0000\u00fe"+ + "\u0000\u0100\u0000\u0102\u0000\u0104~\u0106\u0000\u0108\u0000\u010a\u0000"+ + "\u010c\u0000\u010e\u0000\u0110\u0000\u0112\u0000\u0114\u00a5\u0116\u007f"+ + "\u0118\u00a6\u011a\u00a7\u011c\u00a8\u011e\u0080\u0120\u0000\u0122\u0000"+ + "\u0124\u0000\u0126\u0000\u0128\u0000\u012a\u0000\u012c\u0081\u012e\u0000"+ + "\u0130\u0000\u0132\u0000\u0134\u0082\u0136\u0000\u0138\u0083\u013a\u0084"+ + "\u013c\u0000\u013e\u0000\u0140\u0000\u0142\u0000\u0144\u0000\u0146\u0000"+ + "\u0148\u0000\u014a\u0000\u014c\u0000\u014e\u0000\u0150\u0085\u0152\r\u0154"+ + "\u0000\u0156\u0000\u0158\u0000\u015a\u0000\u015c\u0000\u015e\u0086\u0160"+ + "\u0000\u0162\u0000\u0164\u0000\u0166\u0000\u0168\u0000\u016a\u0000\u016c"+ + "\u0087\u016e\u0088\u0170\u0000\u0172\u0089\u0174\u0000\u0176\u0000\u0178"+ + "\u008a\u017a\u008b\u017c\u008c\u017e\u008d\u0180\u0000\u0182\u008e\u0184"+ + "\u0000\u0186\u0000\u0188\u0000\u018a\u0000\u018c\u0000\u018e\u008f\u0190"+ + "\u000f\u0192\u0090\u0194\u0000\u0196\u0000\u0198\u0000\u019a\u0091\u019c"+ + "\u0011\u019e\u0000\u01a0\u0012\u01a2\u0000\u01a4\u0092\u01a6\u0093\u01a8"+ + "\u0094\u01aa\u0095\u01ac\u0000\u01ae\u0000\u01b0\u0096\u01b2\u0097\u01b4"+ + "\u0098\u01b6\u0000\u01b8\u0000\u01ba\u0000\u01bc\u00a9\u01be\u00aa\u01c0"+ + "\u0000\u01c2\u0000\u01c4\u0000\u01c6\u00ab\u01c8\u0000\u01ca\u0000\u01cc"+ + "\u0000\u01ce\u0000\u01d0\u0000\u01d2\u0000\u01d4\u0000\u01d6\u0099\u01d8"+ + "\u0000\u01da\u009a\u01dc\u009b\u01de\u009c\u01e0\u009d\u01e2\u0000\u01e4"+ + "\u0000\u01e6\u0000\u01e8\u0000\u01ea\u0015\u01ec\u0000\u01ee\u0000\u01f0"+ + "\u0000\u01f2\u0000\u01f4\u0000\u01f6\u0000\u01f8\u0000\u01fa\u0000\u01fc"+ + "\u0000\u01fe\u0000\u0200\u009e\u0202\u0000\u0204\u0000\u0206\u009f\u0208"+ + "\u00a0\u020a\u00a1\u020c\u00a2\u000e\u0000\u0001\u0002\u0003\u0004\u0005"+ + "\u0006\u0007\b\t\n\u000b\f\r\'\u0003\u0000AZaz\u0080\u8000\ufffe\u0006"+ + "\u0000-.0:AZ__az\u0080\u8000\ufffe\u0002\u0000##..\u0006\u0000--0:AZ_"+ + "_az\u0080\u8000\ufffe\u0002\u0000\'\'\\\\\u0002\u0000IIii\u0002\u0000"+ + "FFff\u0002\u0000EEee\u0002\u0000LLll\u0002\u0000SSss\u0002\u0000NNnn\u0002"+ + "\u0000DDdd\u0002\u0000WWww\u0002\u0000TTtt\u0002\u0000CCcc\u0002\u0000"+ + "HHhh\u0002\u0000AAaa\u0002\u0000UUuu\u0002\u0000MMmm\u0002\u0000PPpp\u0002"+ + "\u0000YYyy\u0002\u0000OOoo\u0002\u0000RRrr\u0002\u0000BBbb\u0002\u0000"+ + "KKkk\u0002\u0000XXxx\u0002\u0000JJjj\u0002\u0000GGgg\u0002\u0000VVvv\u0002"+ + "\u0000QQqq\u0003\u0000\n\n\r\r \u0002\u0000\n\n\r\r\u0004\u0000AZ__a"+ + "z\u0080\u8000\ufffe\u0005\u000009AZ__az\u0080\u8000\ufffe\u0006\u0000"+ + "..09AZ__az\u0080\u8000\ufffe\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002"+ + "\u0000\"\"\\\\\u0001\u0000 \u0003\u0000\t\n\r\r \u0ba3\u0000\u001a\u0001"+ + "\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001"+ + "\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000"+ + "\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000"+ + "\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,"+ + "\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000"+ + "\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000"+ + "\u00006\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:"+ + "\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000"+ + "\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000"+ + "\u0000D\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H"+ + "\u0001\u0000\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000"+ + "\u0000\u0000\u0000N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000"+ + "\u0000R\u0001\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V"+ + "\u0001\u0000\u0000\u0000\u0000X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000"+ + "\u0000\u0000\u0000\\\u0001\u0000\u0000\u0000\u0000^\u0001\u0000\u0000"+ + "\u0000\u0000`\u0001\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000\u0000"+ + "d\u0001\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001"+ + "\u0000\u0000\u0000\u0000j\u0001\u0000\u0000\u0000\u0000l\u0001\u0000\u0000"+ + "\u0000\u0000n\u0001\u0000\u0000\u0000\u0000p\u0001\u0000\u0000\u0000\u0000"+ + "r\u0001\u0000\u0000\u0000\u0000t\u0001\u0000\u0000\u0000\u0000v\u0001"+ + "\u0000\u0000\u0000\u0000x\u0001\u0000\u0000\u0000\u0000z\u0001\u0000\u0000"+ + "\u0000\u0000|\u0001\u0000\u0000\u0000\u0000~\u0001\u0000\u0000\u0000\u0000"+ + "\u0080\u0001\u0000\u0000\u0000\u0000\u0082\u0001\u0000\u0000\u0000\u0000"+ + "\u0084\u0001\u0000\u0000\u0000\u0000\u0086\u0001\u0000\u0000\u0000\u0000"+ + "\u0088\u0001\u0000\u0000\u0000\u0000\u008a\u0001\u0000\u0000\u0000\u0000"+ + "\u008c\u0001\u0000\u0000\u0000\u0000\u008e\u0001\u0000\u0000\u0000\u0000"+ + "\u0090\u0001\u0000\u0000\u0000\u0000\u0092\u0001\u0000\u0000\u0000\u0000"+ + "\u0094\u0001\u0000\u0000\u0000\u0000\u0096\u0001\u0000\u0000\u0000\u0000"+ + "\u0098\u0001\u0000\u0000\u0000\u0000\u009a\u0001\u0000\u0000\u0000\u0000"+ + "\u009c\u0001\u0000\u0000\u0000\u0000\u009e\u0001\u0000\u0000\u0000\u0000"+ + "\u00a0\u0001\u0000\u0000\u0000\u0000\u00a2\u0001\u0000\u0000\u0000\u0000"+ + "\u00a4\u0001\u0000\u0000\u0000\u0000\u00a6\u0001\u0000\u0000\u0000\u0000"+ + "\u00a8\u0001\u0000\u0000\u0000\u0000\u00aa\u0001\u0000\u0000\u0000\u0000"+ + "\u00ac\u0001\u0000\u0000\u0000\u0000\u00ae\u0001\u0000\u0000\u0000\u0000"+ + "\u00b0\u0001\u0000\u0000\u0000\u0000\u00b2\u0001\u0000\u0000\u0000\u0000"+ + "\u00b4\u0001\u0000\u0000\u0000\u0000\u00b6\u0001\u0000\u0000\u0000\u0000"+ + "\u00b8\u0001\u0000\u0000\u0000\u0000\u00ba\u0001\u0000\u0000\u0000\u0000"+ + "\u00bc\u0001\u0000\u0000\u0000\u0000\u00be\u0001\u0000\u0000\u0000\u0000"+ + "\u00c0\u0001\u0000\u0000\u0000\u0000\u00c2\u0001\u0000\u0000\u0000\u0000"+ + "\u00c4\u0001\u0000\u0000\u0000\u0000\u00c6\u0001\u0000\u0000\u0000\u0000"+ + "\u00c8\u0001\u0000\u0000\u0000\u0000\u00ca\u0001\u0000\u0000\u0000\u0000"+ + "\u00cc\u0001\u0000\u0000\u0000\u0000\u00ce\u0001\u0000\u0000\u0000\u0000"+ + "\u00d0\u0001\u0000\u0000\u0000\u0000\u00d2\u0001\u0000\u0000\u0000\u0000"+ + "\u00d4\u0001\u0000\u0000\u0000\u0000\u00d6\u0001\u0000\u0000\u0000\u0000"+ + "\u00d8\u0001\u0000\u0000\u0000\u0000\u00da\u0001\u0000\u0000\u0000\u0000"+ + "\u00dc\u0001\u0000\u0000\u0000\u0000\u00de\u0001\u0000\u0000\u0000\u0000"+ + "\u00e0\u0001\u0000\u0000\u0000\u0000\u00e2\u0001\u0000\u0000\u0000\u0000"+ + "\u00e4\u0001\u0000\u0000\u0000\u0000\u00e6\u0001\u0000\u0000\u0000\u0000"+ + "\u00e8\u0001\u0000\u0000\u0000\u0000\u00ea\u0001\u0000\u0000\u0000\u0000"+ + "\u00ec\u0001\u0000\u0000\u0000\u0000\u00ee\u0001\u0000\u0000\u0000\u0000"+ + "\u0104\u0001\u0000\u0000\u0000\u0000\u0106\u0001\u0000\u0000\u0000\u0000"+ + "\u0108\u0001\u0000\u0000\u0000\u0000\u010a\u0001\u0000\u0000\u0000\u0001"+ + "\u010c\u0001\u0000\u0000\u0000\u0001\u010e\u0001\u0000\u0000\u0000\u0001"+ + "\u0110\u0001\u0000\u0000\u0000\u0001\u0112\u0001\u0000\u0000\u0000\u0001"+ + "\u0114\u0001\u0000\u0000\u0000\u0001\u0116\u0001\u0000\u0000\u0000\u0001"+ + "\u0118\u0001\u0000\u0000\u0000\u0001\u011a\u0001\u0000\u0000\u0000\u0001"+ + "\u011c\u0001\u0000\u0000\u0000\u0001\u011e\u0001\u0000\u0000\u0000\u0001"+ + "\u0120\u0001\u0000\u0000\u0000\u0002\u0122\u0001\u0000\u0000\u0000\u0002"+ + "\u0124\u0001\u0000\u0000\u0000\u0002\u0126\u0001\u0000\u0000\u0000\u0002"+ + "\u0128\u0001\u0000\u0000\u0000\u0002\u012a\u0001\u0000\u0000\u0000\u0002"+ + "\u012c\u0001\u0000\u0000\u0000\u0002\u012e\u0001\u0000\u0000\u0000\u0002"+ + "\u0130\u0001\u0000\u0000\u0000\u0002\u0132\u0001\u0000\u0000\u0000\u0002"+ + "\u0134\u0001\u0000\u0000\u0000\u0002\u0136\u0001\u0000\u0000\u0000\u0003"+ + "\u0138\u0001\u0000\u0000\u0000\u0003\u013a\u0001\u0000\u0000\u0000\u0003"+ + "\u013c\u0001\u0000\u0000\u0000\u0003\u013e\u0001\u0000\u0000\u0000\u0003"+ + "\u0140\u0001\u0000\u0000\u0000\u0004\u0142\u0001\u0000\u0000\u0000\u0004"+ + "\u0144\u0001\u0000\u0000\u0000\u0004\u0146\u0001\u0000\u0000\u0000\u0004"+ + "\u0148\u0001\u0000\u0000\u0000\u0004\u014a\u0001\u0000\u0000\u0000\u0004"+ + "\u014c\u0001\u0000\u0000\u0000\u0004\u014e\u0001\u0000\u0000\u0000\u0005"+ + "\u0150\u0001\u0000\u0000\u0000\u0005\u0152\u0001\u0000\u0000\u0000\u0005"+ + "\u0154\u0001\u0000\u0000\u0000\u0006\u0156\u0001\u0000\u0000\u0000\u0006"+ + "\u0158\u0001\u0000\u0000\u0000\u0006\u015a\u0001\u0000\u0000\u0000\u0006"+ + "\u015c\u0001\u0000\u0000\u0000\u0006\u015e\u0001\u0000\u0000\u0000\u0006"+ + "\u0160\u0001\u0000\u0000\u0000\u0006\u0162\u0001\u0000\u0000\u0000\u0006"+ + "\u0164\u0001\u0000\u0000\u0000\u0006\u0166\u0001\u0000\u0000\u0000\u0006"+ + "\u0168\u0001\u0000\u0000\u0000\u0006\u016a\u0001\u0000\u0000\u0000\u0006"+ + "\u016c\u0001\u0000\u0000\u0000\u0006\u016e\u0001\u0000\u0000\u0000\u0006"+ + "\u0170\u0001\u0000\u0000\u0000\u0007\u0172\u0001\u0000\u0000\u0000\u0007"+ + "\u0174\u0001\u0000\u0000\u0000\u0007\u0176\u0001\u0000\u0000\u0000\b\u0178"+ + "\u0001\u0000\u0000\u0000\b\u017a\u0001\u0000\u0000\u0000\b\u017c\u0001"+ + "\u0000\u0000\u0000\b\u017e\u0001\u0000\u0000\u0000\b\u0180\u0001\u0000"+ + "\u0000\u0000\b\u0182\u0001\u0000\u0000\u0000\b\u0184\u0001\u0000\u0000"+ + "\u0000\b\u0186\u0001\u0000\u0000\u0000\b\u0188\u0001\u0000\u0000\u0000"+ + "\b\u018a\u0001\u0000\u0000\u0000\b\u018c\u0001\u0000\u0000\u0000\t\u018e"+ + "\u0001\u0000\u0000\u0000\t\u0190\u0001\u0000\u0000\u0000\t\u0192\u0001"+ + "\u0000\u0000\u0000\t\u0194\u0001\u0000\u0000\u0000\t\u0196\u0001\u0000"+ + "\u0000\u0000\t\u0198\u0001\u0000\u0000\u0000\t\u019a\u0001\u0000\u0000"+ + "\u0000\t\u019c\u0001\u0000\u0000\u0000\t\u019e\u0001\u0000\u0000\u0000"+ + "\t\u01a0\u0001\u0000\u0000\u0000\t\u01a2\u0001\u0000\u0000\u0000\t\u01a4"+ + "\u0001\u0000\u0000\u0000\t\u01a6\u0001\u0000\u0000\u0000\t\u01a8\u0001"+ + "\u0000\u0000\u0000\t\u01aa\u0001\u0000\u0000\u0000\t\u01ac\u0001\u0000"+ + "\u0000\u0000\t\u01ae\u0001\u0000\u0000\u0000\n\u01b0\u0001\u0000\u0000"+ + "\u0000\n\u01b2\u0001\u0000\u0000\u0000\n\u01b4\u0001\u0000\u0000\u0000"+ + "\n\u01b6\u0001\u0000\u0000\u0000\n\u01b8\u0001\u0000\u0000\u0000\n\u01ba"+ + "\u0001\u0000\u0000\u0000\n\u01bc\u0001\u0000\u0000\u0000\n\u01be\u0001"+ + "\u0000\u0000\u0000\n\u01c0\u0001\u0000\u0000\u0000\n\u01c2\u0001\u0000"+ + "\u0000\u0000\n\u01c4\u0001\u0000\u0000\u0000\n\u01c6\u0001\u0000\u0000"+ + "\u0000\n\u01c8\u0001\u0000\u0000\u0000\n\u01ca\u0001\u0000\u0000\u0000"+ + "\n\u01cc\u0001\u0000\u0000\u0000\n\u01ce\u0001\u0000\u0000\u0000\n\u01d0"+ + "\u0001\u0000\u0000\u0000\n\u01d2\u0001\u0000\u0000\u0000\n\u01d4\u0001"+ + "\u0000\u0000\u0000\n\u01d6\u0001\u0000\u0000\u0000\n\u01d8\u0001\u0000"+ + "\u0000\u0000\n\u01da\u0001\u0000\u0000\u0000\u000b\u01dc\u0001\u0000\u0000"+ + "\u0000\u000b\u01de\u0001\u0000\u0000\u0000\u000b\u01e0\u0001\u0000\u0000"+ + "\u0000\u000b\u01e2\u0001\u0000\u0000\u0000\u000b\u01e4\u0001\u0000\u0000"+ + "\u0000\u000b\u01e6\u0001\u0000\u0000\u0000\u000b\u01e8\u0001\u0000\u0000"+ + "\u0000\u000b\u01ea\u0001\u0000\u0000\u0000\u000b\u01ec\u0001\u0000\u0000"+ + "\u0000\u000b\u01ee\u0001\u0000\u0000\u0000\u000b\u01f0\u0001\u0000\u0000"+ + "\u0000\u000b\u01f2\u0001\u0000\u0000\u0000\u000b\u01f4\u0001\u0000\u0000"+ + "\u0000\u000b\u01f6\u0001\u0000\u0000\u0000\u000b\u01f8\u0001\u0000\u0000"+ + "\u0000\u000b\u01fa\u0001\u0000\u0000\u0000\u000b\u01fc\u0001\u0000\u0000"+ + "\u0000\f\u01fe\u0001\u0000\u0000\u0000\f\u0200\u0001\u0000\u0000\u0000"+ + "\f\u0202\u0001\u0000\u0000\u0000\f\u0204\u0001\u0000\u0000\u0000\r\u0206"+ + "\u0001\u0000\u0000\u0000\r\u0208\u0001\u0000\u0000\u0000\r\u020a\u0001"+ + "\u0000\u0000\u0000\r\u020c\u0001\u0000\u0000\u0000\u000e\u020e\u0001\u0000"+ + "\u0000\u0000\u0010\u0220\u0001\u0000\u0000\u0000\u0012\u0222\u0001\u0000"+ + "\u0000\u0000\u0014\u0269\u0001\u0000\u0000\u0000\u0016\u026b\u0001\u0000"+ + "\u0000\u0000\u0018\u027c\u0001\u0000\u0000\u0000\u001a\u027e\u0001\u0000"+ + "\u0000\u0000\u001c\u0284\u0001\u0000\u0000\u0000\u001e\u028e\u0001\u0000"+ + "\u0000\u0000 \u0294\u0001\u0000\u0000\u0000\"\u029b\u0001\u0000\u0000"+ + "\u0000$\u02a5\u0001\u0000\u0000\u0000&\u02ad\u0001\u0000\u0000\u0000("+ + "\u02b6\u0001\u0000\u0000\u0000*\u02c1\u0001\u0000\u0000\u0000,\u02ca\u0001"+ + "\u0000\u0000\u0000.\u02e1\u0001\u0000\u0000\u00000\u02f8\u0001\u0000\u0000"+ + "\u00002\u02fa\u0001\u0000\u0000\u00004\u0305\u0001\u0000\u0000\u00006"+ + "\u0311\u0001\u0000\u0000\u00008\u0318\u0001\u0000\u0000\u0000:\u0320\u0001"+ + "\u0000\u0000\u0000<\u032b\u0001\u0000\u0000\u0000>\u0337\u0001\u0000\u0000"+ + "\u0000@\u0340\u0001\u0000\u0000\u0000B\u034a\u0001\u0000\u0000\u0000D"+ + "\u0353\u0001\u0000\u0000\u0000F\u035f\u0001\u0000\u0000\u0000H\u036a\u0001"+ + "\u0000\u0000\u0000J\u0377\u0001\u0000\u0000\u0000L\u0386\u0001\u0000\u0000"+ + "\u0000N\u0396\u0001\u0000\u0000\u0000P\u03a7\u0001\u0000\u0000\u0000R"+ + "\u03af\u0001\u0000\u0000\u0000T\u03ba\u0001\u0000\u0000\u0000V\u03c0\u0001"+ + "\u0000\u0000\u0000X\u03c8\u0001\u0000\u0000\u0000Z\u03d3\u0001\u0000\u0000"+ + "\u0000\\\u03e1\u0001\u0000\u0000\u0000^\u03f3\u0001\u0000\u0000\u0000"+ + "`\u03ff\u0001\u0000\u0000\u0000b\u0408\u0001\u0000\u0000\u0000d\u0410"+ + "\u0001\u0000\u0000\u0000f\u0416\u0001\u0000\u0000\u0000h\u0421\u0001\u0000"+ + "\u0000\u0000j\u0427\u0001\u0000\u0000\u0000l\u042f\u0001\u0000\u0000\u0000"+ + "n\u0435\u0001\u0000\u0000\u0000p\u043e\u0001\u0000\u0000\u0000r\u0447"+ + "\u0001\u0000\u0000\u0000t\u044f\u0001\u0000\u0000\u0000v\u0458\u0001\u0000"+ + "\u0000\u0000x\u0462\u0001\u0000\u0000\u0000z\u046d\u0001\u0000\u0000\u0000"+ + "|\u0479\u0001\u0000\u0000\u0000~\u0486\u0001\u0000\u0000\u0000\u0080\u0491"+ + "\u0001\u0000\u0000\u0000\u0082\u049d\u0001\u0000\u0000\u0000\u0084\u04a6"+ + "\u0001\u0000\u0000\u0000\u0086\u04b2\u0001\u0000\u0000\u0000\u0088\u04bf"+ + "\u0001\u0000\u0000\u0000\u008a\u04c5\u0001\u0000\u0000\u0000\u008c\u04cf"+ + "\u0001\u0000\u0000\u0000\u008e\u04d8\u0001\u0000\u0000\u0000\u0090\u04e2"+ + "\u0001\u0000\u0000\u0000\u0092\u04ee\u0001\u0000\u0000\u0000\u0094\u04fd"+ + "\u0001\u0000\u0000\u0000\u0096\u0504\u0001\u0000\u0000\u0000\u0098\u0517"+ + "\u0001\u0000\u0000\u0000\u009a\u052c\u0001\u0000\u0000\u0000\u009c\u052e"+ + "\u0001\u0000\u0000\u0000\u009e\u053d\u0001\u0000\u0000\u0000\u00a0\u0550"+ + "\u0001\u0000\u0000\u0000\u00a2\u0560\u0001\u0000\u0000\u0000\u00a4\u0569"+ + "\u0001\u0000\u0000\u0000\u00a6\u059e\u0001\u0000\u0000\u0000\u00a8\u05a2"+ + "\u0001\u0000\u0000\u0000\u00aa\u05ab\u0001\u0000\u0000\u0000\u00ac\u05b6"+ + "\u0001\u0000\u0000\u0000\u00ae\u05ca\u0001\u0000\u0000\u0000\u00b0\u05ce"+ + "\u0001\u0000\u0000\u0000\u00b2\u05d6\u0001\u0000\u0000\u0000\u00b4\u05dd"+ + "\u0001\u0000\u0000\u0000\u00b6\u05e7\u0001\u0000\u0000\u0000\u00b8\u05f4"+ + "\u0001\u0000\u0000\u0000\u00ba\u05fd\u0001\u0000\u0000\u0000\u00bc\u0609"+ + "\u0001\u0000\u0000\u0000\u00be\u0653\u0001\u0000\u0000\u0000\u00c0\u0655"+ + "\u0001\u0000\u0000\u0000\u00c2\u065d\u0001\u0000\u0000\u0000\u00c4\u066f"+ + "\u0001\u0000\u0000\u0000\u00c6\u0675\u0001\u0000\u0000\u0000\u00c8\u0679"+ + "\u0001\u0000\u0000\u0000\u00ca\u067d\u0001\u0000\u0000\u0000\u00cc\u0682"+ + "\u0001\u0000\u0000\u0000\u00ce\u0688\u0001\u0000\u0000\u0000\u00d0\u068c"+ + "\u0001\u0000\u0000\u0000\u00d2\u0699\u0001\u0000\u0000\u0000\u00d4\u069d"+ + "\u0001\u0000\u0000\u0000\u00d6\u06af\u0001\u0000\u0000\u0000\u00d8\u06cb"+ + "\u0001\u0000\u0000\u0000\u00da\u06cf\u0001\u0000\u0000\u0000\u00dc\u06de"+ + "\u0001\u0000\u0000\u0000\u00de\u06e4\u0001\u0000\u0000\u0000\u00e0\u06eb"+ + "\u0001\u0000\u0000\u0000\u00e2\u06fc\u0001\u0000\u0000\u0000\u00e4\u0703"+ + "\u0001\u0000\u0000\u0000\u00e6\u0722\u0001\u0000\u0000\u0000\u00e8\u0732"+ + "\u0001\u0000\u0000\u0000\u00ea\u0735\u0001\u0000\u0000\u0000\u00ec\u0741"+ + "\u0001\u0000\u0000\u0000\u00ee\u0745\u0001\u0000\u0000\u0000\u00f0\u0749"+ + "\u0001\u0000\u0000\u0000\u00f2\u0750\u0001\u0000\u0000\u0000\u00f4\u0757"+ + "\u0001\u0000\u0000\u0000\u00f6\u075e\u0001\u0000\u0000\u0000\u00f8\u0760"+ + "\u0001\u0000\u0000\u0000\u00fa\u076a\u0001\u0000\u0000\u0000\u00fc\u0775"+ + "\u0001\u0000\u0000\u0000\u00fe\u077e\u0001\u0000\u0000\u0000\u0100\u0793"+ + "\u0001\u0000\u0000\u0000\u0102\u0795\u0001\u0000\u0000\u0000\u0104\u0797"+ + "\u0001\u0000\u0000\u0000\u0106\u079f\u0001\u0000\u0000\u0000\u0108\u07a5"+ + "\u0001\u0000\u0000\u0000\u010a\u088e\u0001\u0000\u0000\u0000\u010c\u0892"+ + "\u0001\u0000\u0000\u0000\u010e\u0896\u0001\u0000\u0000\u0000\u0110\u089b"+ + "\u0001\u0000\u0000\u0000\u0112\u08a6\u0001\u0000\u0000\u0000\u0114\u08aa"+ + "\u0001\u0000\u0000\u0000\u0116\u08af\u0001\u0000\u0000\u0000\u0118\u08b4"+ + "\u0001\u0000\u0000\u0000\u011a\u08b8\u0001\u0000\u0000\u0000\u011c\u08bc"+ + "\u0001\u0000\u0000\u0000\u011e\u08c1\u0001\u0000\u0000\u0000\u0120\u08c5"+ + "\u0001\u0000\u0000\u0000\u0122\u08ca\u0001\u0000\u0000\u0000\u0124\u08ce"+ + "\u0001\u0000\u0000\u0000\u0126\u08d3\u0001\u0000\u0000\u0000\u0128\u08de"+ + "\u0001\u0000\u0000\u0000\u012a\u08e2\u0001\u0000\u0000\u0000\u012c\u08e7"+ + "\u0001\u0000\u0000\u0000\u012e\u08ed\u0001\u0000\u0000\u0000\u0130\u08f1"+ + "\u0001\u0000\u0000\u0000\u0132\u08f5\u0001\u0000\u0000\u0000\u0134\u08fa"+ + "\u0001\u0000\u0000\u0000\u0136\u08fe\u0001\u0000\u0000\u0000\u0138\u0904"+ + "\u0001\u0000\u0000\u0000\u013a\u090e\u0001\u0000\u0000\u0000\u013c\u0914"+ + "\u0001\u0000\u0000\u0000\u013e\u0919\u0001\u0000\u0000\u0000\u0140\u091f"+ + "\u0001\u0000\u0000\u0000\u0142\u0924\u0001\u0000\u0000\u0000\u0144\u092a"+ + "\u0001\u0000\u0000\u0000\u0146\u0931\u0001\u0000\u0000\u0000\u0148\u0937"+ + "\u0001\u0000\u0000\u0000\u014a\u093d\u0001\u0000\u0000\u0000\u014c\u0943"+ + "\u0001\u0000\u0000\u0000\u014e\u0947\u0001\u0000\u0000\u0000\u0150\u094d"+ + "\u0001\u0000\u0000\u0000\u0152\u0953\u0001\u0000\u0000\u0000\u0154\u0958"+ + "\u0001\u0000\u0000\u0000\u0156\u095d\u0001\u0000\u0000\u0000\u0158\u0962"+ + "\u0001\u0000\u0000\u0000\u015a\u0967\u0001\u0000\u0000\u0000\u015c\u096c"+ + "\u0001\u0000\u0000\u0000\u015e\u0973\u0001\u0000\u0000\u0000\u0160\u0975"+ + "\u0001\u0000\u0000\u0000\u0162\u0979\u0001\u0000\u0000\u0000\u0164\u097e"+ + "\u0001\u0000\u0000\u0000\u0166\u0989\u0001\u0000\u0000\u0000\u0168\u098d"+ + "\u0001\u0000\u0000\u0000\u016a\u0992\u0001\u0000\u0000\u0000\u016c\u0997"+ + "\u0001\u0000\u0000\u0000\u016e\u099a\u0001\u0000\u0000\u0000\u0170\u099e"+ + "\u0001\u0000\u0000\u0000\u0172\u09a4\u0001\u0000\u0000\u0000\u0174\u09aa"+ + "\u0001\u0000\u0000\u0000\u0176\u09b0\u0001\u0000\u0000\u0000\u0178\u09b6"+ + "\u0001\u0000\u0000\u0000\u017a\u09bc\u0001\u0000\u0000\u0000\u017c\u09bf"+ + "\u0001\u0000\u0000\u0000\u017e\u09c2\u0001\u0000\u0000\u0000\u0180\u09c5"+ + "\u0001\u0000\u0000\u0000\u0182\u09c9\u0001\u0000\u0000\u0000\u0184\u09cc"+ + "\u0001\u0000\u0000\u0000\u0186\u09d3\u0001\u0000\u0000\u0000\u0188\u09d7"+ + "\u0001\u0000\u0000\u0000\u018a\u09dc\u0001\u0000\u0000\u0000\u018c\u09e0"+ + "\u0001\u0000\u0000\u0000\u018e\u09e5\u0001\u0000\u0000\u0000\u0190\u09e9"+ + "\u0001\u0000\u0000\u0000\u0192\u09ec\u0001\u0000\u0000\u0000\u0194\u09ef"+ + "\u0001\u0000\u0000\u0000\u0196\u09f4\u0001\u0000\u0000\u0000\u0198\u09f9"+ + "\u0001\u0000\u0000\u0000\u019a\u09fe\u0001\u0000\u0000\u0000\u019c\u0a03"+ + "\u0001\u0000\u0000\u0000\u019e\u0a05\u0001\u0000\u0000\u0000\u01a0\u0a09"+ + "\u0001\u0000\u0000\u0000\u01a2\u0a0c\u0001\u0000\u0000\u0000\u01a4\u0a10"+ + "\u0001\u0000\u0000\u0000\u01a6\u0a12\u0001\u0000\u0000\u0000\u01a8\u0a16"+ + "\u0001\u0000\u0000\u0000\u01aa\u0a1c\u0001\u0000\u0000\u0000\u01ac\u0a1e"+ + "\u0001\u0000\u0000\u0000\u01ae\u0a22\u0001\u0000\u0000\u0000\u01b0\u0a27"+ + "\u0001\u0000\u0000\u0000\u01b2\u0a31\u0001\u0000\u0000\u0000\u01b4\u0a45"+ + "\u0001\u0000\u0000\u0000\u01b6\u0a4f\u0001\u0000\u0000\u0000\u01b8\u0a54"+ + "\u0001\u0000\u0000\u0000\u01ba\u0a58\u0001\u0000\u0000\u0000\u01bc\u0a5c"+ + "\u0001\u0000\u0000\u0000\u01be\u0a60\u0001\u0000\u0000\u0000\u01c0\u0a66"+ + "\u0001\u0000\u0000\u0000\u01c2\u0a6a\u0001\u0000\u0000\u0000\u01c4\u0a6e"+ + "\u0001\u0000\u0000\u0000\u01c6\u0a76\u0001\u0000\u0000\u0000\u01c8\u0a7e"+ + "\u0001\u0000\u0000\u0000\u01ca\u0a83\u0001\u0000\u0000\u0000\u01cc\u0a8e"+ + "\u0001\u0000\u0000\u0000\u01ce\u0a93\u0001\u0000\u0000\u0000\u01d0\u0a97"+ + "\u0001\u0000\u0000\u0000\u01d2\u0a9c\u0001\u0000\u0000\u0000\u01d4\u0aa0"+ + "\u0001\u0000\u0000\u0000\u01d6\u0aa4\u0001\u0000\u0000\u0000\u01d8\u0aa8"+ + "\u0001\u0000\u0000\u0000\u01da\u0aad\u0001\u0000\u0000\u0000\u01dc\u0ab1"+ + "\u0001\u0000\u0000\u0000\u01de\u0ab6\u0001\u0000\u0000\u0000\u01e0\u0ac0"+ + "\u0001\u0000\u0000\u0000\u01e2\u0ace\u0001\u0000\u0000\u0000\u01e4\u0ad2"+ + "\u0001\u0000\u0000\u0000\u01e6\u0ad6\u0001\u0000\u0000\u0000\u01e8\u0ada"+ + "\u0001\u0000\u0000\u0000\u01ea\u0ae0\u0001\u0000\u0000\u0000\u01ec\u0ae4"+ + "\u0001\u0000\u0000\u0000\u01ee\u0ae8\u0001\u0000\u0000\u0000\u01f0\u0aec"+ + "\u0001\u0000\u0000\u0000\u01f2\u0af0\u0001\u0000\u0000\u0000\u01f4\u0af5"+ + "\u0001\u0000\u0000\u0000\u01f6\u0afa\u0001\u0000\u0000\u0000\u01f8\u0afe"+ + "\u0001\u0000\u0000\u0000\u01fa\u0b02\u0001\u0000\u0000\u0000\u01fc\u0b07"+ + "\u0001\u0000\u0000\u0000\u01fe\u0b0b\u0001\u0000\u0000\u0000\u0200\u0b1b"+ + "\u0001\u0000\u0000\u0000\u0202\u0b20\u0001\u0000\u0000\u0000\u0204\u0b25"+ + "\u0001\u0000\u0000\u0000\u0206\u0b29\u0001\u0000\u0000\u0000\u0208\u0b31"+ + "\u0001\u0000\u0000\u0000\u020a\u0b36\u0001\u0000\u0000\u0000\u020c\u0b3a"+ + "\u0001\u0000\u0000\u0000\u020e\u0212\u0007\u0000\u0000\u0000\u020f\u0211"+ + "\u0007\u0001\u0000\u0000\u0210\u020f\u0001\u0000\u0000\u0000\u0211\u0214"+ + "\u0001\u0000\u0000\u0000\u0212\u0210\u0001\u0000\u0000\u0000\u0212\u0213"+ + "\u0001\u0000\u0000\u0000\u0213\u000f\u0001\u0000\u0000\u0000\u0214\u0212"+ + "\u0001\u0000\u0000\u0000\u0215\u0217\u0007\u0002\u0000\u0000\u0216\u0215"+ + "\u0001\u0000\u0000\u0000\u0216\u0217\u0001\u0000\u0000\u0000\u0217\u0218"+ + "\u0001\u0000\u0000\u0000\u0218\u021c\u0007\u0000\u0000\u0000\u0219\u021b"+ + "\u0007\u0003\u0000\u0000\u021a\u0219\u0001\u0000\u0000\u0000\u021b\u021e"+ + "\u0001\u0000\u0000\u0000\u021c\u021a\u0001\u0000\u0000\u0000\u021c\u021d"+ + "\u0001\u0000\u0000\u0000\u021d\u0221\u0001\u0000\u0000\u0000\u021e\u021c"+ + "\u0001\u0000\u0000\u0000\u021f\u0221\u0003\u0016\u0004\u0000\u0220\u0216"+ + "\u0001\u0000\u0000\u0000\u0220\u021f\u0001\u0000\u0000\u0000\u0221\u0011"+ + "\u0001\u0000\u0000\u0000\u0222\u0223\u0003\u00f0q\u0000\u0223\u0227\u0005"+ + "(\u0000\u0000\u0224\u0226\u0003\u00f0q\u0000\u0225\u0224\u0001\u0000\u0000"+ + "\u0000\u0226\u0229\u0001\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000"+ + "\u0000\u0227\u0228\u0001\u0000\u0000\u0000\u0228\u0234\u0001\u0000\u0000"+ + "\u0000\u0229\u0227\u0001\u0000\u0000\u0000\u022a\u022e\u0005,\u0000\u0000"+ + "\u022b\u022d\u0005 \u0000\u0000\u022c\u022b\u0001\u0000\u0000\u0000\u022d"+ + "\u0230\u0001\u0000\u0000\u0000\u022e\u022c\u0001\u0000\u0000\u0000\u022e"+ + "\u022f\u0001\u0000\u0000\u0000\u022f\u0231\u0001\u0000\u0000\u0000\u0230"+ + "\u022e\u0001\u0000\u0000\u0000\u0231\u0233\u0003\u00f0q\u0000\u0232\u022a"+ + "\u0001\u0000\u0000\u0000\u0233\u0236\u0001\u0000\u0000\u0000\u0234\u0232"+ + "\u0001\u0000\u0000\u0000\u0234\u0235\u0001\u0000\u0000\u0000\u0235\u023a"+ + "\u0001\u0000\u0000\u0000\u0236\u0234\u0001\u0000\u0000\u0000\u0237\u0239"+ + "\u0005 \u0000\u0000\u0238\u0237\u0001\u0000\u0000\u0000\u0239\u023c\u0001"+ + "\u0000\u0000\u0000\u023a\u0238\u0001\u0000\u0000\u0000\u023a\u023b\u0001"+ + "\u0000\u0000\u0000\u023b\u023d\u0001\u0000\u0000\u0000\u023c\u023a\u0001"+ + "\u0000\u0000\u0000\u023d\u0241\u0005)\u0000\u0000\u023e\u0240\u0005 \u0000"+ + "\u0000\u023f\u023e\u0001\u0000\u0000\u0000\u0240\u0243\u0001\u0000\u0000"+ + "\u0000\u0241\u023f\u0001\u0000\u0000\u0000\u0241\u0242\u0001\u0000\u0000"+ + "\u0000\u0242\u0246\u0001\u0000\u0000\u0000\u0243\u0241\u0001\u0000\u0000"+ + "\u0000\u0244\u0245\u0005{\u0000\u0000\u0245\u0247\u0004\u0002\u0000\u0000"+ + "\u0246\u0244\u0001\u0000\u0000\u0000\u0246\u0247\u0001\u0000\u0000\u0000"+ + "\u0247\u0013\u0001\u0000\u0000\u0000\u0248\u0249\u0007\u0004\u0000\u0000"+ + "\u0249\u0253\u0003\u0010\u0001\u0000\u024a\u024c\u0005 \u0000\u0000\u024b"+ + "\u024a\u0001\u0000\u0000\u0000\u024c\u024f\u0001\u0000\u0000\u0000\u024d"+ + "\u024b\u0001\u0000\u0000\u0000\u024d\u024e\u0001\u0000\u0000\u0000\u024e"+ + "\u0250\u0001\u0000\u0000\u0000\u024f\u024d\u0001\u0000\u0000\u0000\u0250"+ + "\u0252\u0003\u0010\u0001\u0000\u0251\u024d\u0001\u0000\u0000\u0000\u0252"+ + "\u0255\u0001\u0000\u0000\u0000\u0253\u0251\u0001\u0000\u0000\u0000\u0253"+ + "\u0254\u0001\u0000\u0000\u0000\u0254\u0256\u0001\u0000\u0000\u0000\u0255"+ + "\u0253\u0001\u0000\u0000\u0000\u0256\u0257\u0007\u0004\u0000\u0000\u0257"+ + "\u026a\u0001\u0000\u0000\u0000\u0258\u0259\u0005\"\u0000\u0000\u0259\u0263"+ + "\u0003\u0010\u0001\u0000\u025a\u025c\u0005 \u0000\u0000\u025b\u025a\u0001"+ + "\u0000\u0000\u0000\u025c\u025f\u0001\u0000\u0000\u0000\u025d\u025b\u0001"+ + "\u0000\u0000\u0000\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u0260\u0001"+ + "\u0000\u0000\u0000\u025f\u025d\u0001\u0000\u0000\u0000\u0260\u0262\u0003"+ + "\u0010\u0001\u0000\u0261\u025d\u0001\u0000\u0000\u0000\u0262\u0265\u0001"+ + "\u0000\u0000\u0000\u0263\u0261\u0001\u0000\u0000\u0000\u0263\u0264\u0001"+ + "\u0000\u0000\u0000\u0264\u0266\u0001\u0000\u0000\u0000\u0265\u0263\u0001"+ + "\u0000\u0000\u0000\u0266\u0267\u0007\u0004\u0000\u0000\u0267\u0268\u0005"+ + "\"\u0000\u0000\u0268\u026a\u0001\u0000\u0000\u0000\u0269\u0248\u0001\u0000"+ + "\u0000\u0000\u0269\u0258\u0001\u0000\u0000\u0000\u026a\u0015\u0001\u0000"+ + "\u0000\u0000\u026b\u026c\u0005[\u0000\u0000\u026c\u0270\u0003\u00f4s\u0000"+ + "\u026d\u026e\u0003\u00ean\u0000\u026e\u026f\u0003\u0018\u0005\u0000\u026f"+ + "\u0271\u0001\u0000\u0000\u0000\u0270\u026d\u0001\u0000\u0000\u0000\u0270"+ + "\u0271\u0001\u0000\u0000\u0000\u0271\u0272\u0001\u0000\u0000\u0000\u0272"+ + "\u0273\u0005]\u0000\u0000\u0273\u0017\u0001\u0000\u0000\u0000\u0274\u0275"+ + "\u0005\"\u0000\u0000\u0275\u0276\u0003\u00f4s\u0000\u0276\u0277\u0005"+ + "\"\u0000\u0000\u0277\u027d\u0001\u0000\u0000\u0000\u0278\u0279\u0007\u0004"+ + "\u0000\u0000\u0279\u027a\u0003\u00f4s\u0000\u027a\u027b\u0007\u0004\u0000"+ + "\u0000\u027b\u027d\u0001\u0000\u0000\u0000\u027c\u0274\u0001\u0000\u0000"+ + "\u0000\u027c\u0278\u0001\u0000\u0000\u0000\u027d\u0019\u0001\u0000\u0000"+ + "\u0000\u027e\u027f\u0005@\u0000\u0000\u027f\u0280\u0007\u0005\u0000\u0000"+ + "\u0280\u0281\u0007\u0006\u0000\u0000\u0281\u0282\u0001\u0000\u0000\u0000"+ + "\u0282\u0283\u0006\u0006\u0000\u0000\u0283\u001b\u0001\u0000\u0000\u0000"+ + "\u0284\u0285\u0005@\u0000\u0000\u0285\u0286\u0007\u0007\u0000\u0000\u0286"+ + "\u0287\u0007\b\u0000\u0000\u0287\u0288\u0007\t\u0000\u0000\u0288\u0289"+ + "\u0007\u0007\u0000\u0000\u0289\u028a\u0007\u0005\u0000\u0000\u028a\u028b"+ + "\u0007\u0006\u0000\u0000\u028b\u028c\u0001\u0000\u0000\u0000\u028c\u028d"+ + "\u0006\u0007\u0000\u0000\u028d\u001d\u0001\u0000\u0000\u0000\u028e\u028f"+ + "\u0005@\u0000\u0000\u028f\u0290\u0007\u0007\u0000\u0000\u0290\u0291\u0007"+ + "\b\u0000\u0000\u0291\u0292\u0007\t\u0000\u0000\u0292\u0293\u0007\u0007"+ + "\u0000\u0000\u0293\u001f\u0001\u0000\u0000\u0000\u0294\u0295\u0005@\u0000"+ + "\u0000\u0295\u0296\u0007\u0007\u0000\u0000\u0296\u0297\u0007\n\u0000\u0000"+ + "\u0297\u0298\u0007\u000b\u0000\u0000\u0298\u0299\u0007\u0005\u0000\u0000"+ + "\u0299\u029a\u0007\u0006\u0000\u0000\u029a!\u0001\u0000\u0000\u0000\u029b"+ + "\u029c\u0005@\u0000\u0000\u029c\u029d\u0007\t\u0000\u0000\u029d\u029e"+ + "\u0007\f\u0000\u0000\u029e\u029f\u0007\u0005\u0000\u0000\u029f\u02a0\u0007"+ + "\r\u0000\u0000\u02a0\u02a1\u0007\u000e\u0000\u0000\u02a1\u02a2\u0007\u000f"+ + "\u0000\u0000\u02a2\u02a3\u0001\u0000\u0000\u0000\u02a3\u02a4\u0006\n\u0001"+ + "\u0000\u02a4#\u0001\u0000\u0000\u0000\u02a5\u02a6\u0005@\u0000\u0000\u02a6"+ + "\u02a7\u0007\u000e\u0000\u0000\u02a7\u02a8\u0007\u0010\u0000\u0000\u02a8"+ + "\u02a9\u0007\t\u0000\u0000\u02a9\u02aa\u0007\u0007\u0000\u0000\u02aa\u02ab"+ + "\u0001\u0000\u0000\u0000\u02ab\u02ac\u0006\u000b\u0001\u0000\u02ac%\u0001"+ + "\u0000\u0000\u0000\u02ad\u02ae\u0005@\u0000\u0000\u02ae\u02af\u0007\u000b"+ + "\u0000\u0000\u02af\u02b0\u0007\u0007\u0000\u0000\u02b0\u02b1\u0007\u0006"+ + "\u0000\u0000\u02b1\u02b2\u0007\u0010\u0000\u0000\u02b2\u02b3\u0007\u0011"+ + "\u0000\u0000\u02b3\u02b4\u0007\b\u0000\u0000\u02b4\u02b5\u0007\r\u0000"+ + "\u0000\u02b5\'\u0001\u0000\u0000\u0000\u02b6\u02b7\u0005@\u0000\u0000"+ + "\u02b7\u02b8\u0007\u0007\u0000\u0000\u02b8\u02b9\u0007\n\u0000\u0000\u02b9"+ + "\u02ba\u0007\u000b\u0000\u0000\u02ba\u02bb\u0007\t\u0000\u0000\u02bb\u02bc"+ + "\u0007\f\u0000\u0000\u02bc\u02bd\u0007\u0005\u0000\u0000\u02bd\u02be\u0007"+ + "\r\u0000\u0000\u02be\u02bf\u0007\u000e\u0000\u0000\u02bf\u02c0\u0007\u000f"+ + "\u0000\u0000\u02c0)\u0001\u0000\u0000\u0000\u02c1\u02c2\u0005@\u0000\u0000"+ + "\u02c2\u02c3\u0007\u0007\u0000\u0000\u02c3\u02c4\u0007\u0012\u0000\u0000"+ + "\u02c4\u02c5\u0007\u0013\u0000\u0000\u02c5\u02c6\u0007\r\u0000\u0000\u02c6"+ + "\u02c7\u0007\u0014\u0000\u0000\u02c7\u02c8\u0001\u0000\u0000\u0000\u02c8"+ + "\u02c9\u0006\u000e\u0000\u0000\u02c9+\u0001\u0000\u0000\u0000\u02ca\u02cb"+ + "\u0005@\u0000\u0000\u02cb\u02cc\u0007\u0007\u0000\u0000\u02cc\u02cd\u0007"+ + "\n\u0000\u0000\u02cd\u02ce\u0007\u000b\u0000\u0000\u02ce\u02cf\u0007\u0007"+ + "\u0000\u0000\u02cf\u02d0\u0007\u0012\u0000\u0000\u02d0\u02d1\u0007\u0013"+ + "\u0000\u0000\u02d1\u02d2\u0007\r\u0000\u0000\u02d2\u02d3\u0007\u0014\u0000"+ + "\u0000\u02d3-\u0001\u0000\u0000\u0000\u02d4\u02d5\u0005@\u0000\u0000\u02d5"+ + "\u02d6\u0007\u0011\u0000\u0000\u02d6\u02d7\u0007\n\u0000\u0000\u02d7\u02d8"+ + "\u0007\b\u0000\u0000\u02d8\u02d9\u0007\u0007\u0000\u0000\u02d9\u02da\u0007"+ + "\t\u0000\u0000\u02da\u02e2\u0007\t\u0000\u0000\u02db\u02dc\u0005@\u0000"+ + "\u0000\u02dc\u02dd\u0007\u0005\u0000\u0000\u02dd\u02de\u0007\t\u0000\u0000"+ + "\u02de\u02df\u0007\t\u0000\u0000\u02df\u02e0\u0007\u0007\u0000\u0000\u02e0"+ + "\u02e2\u0007\r\u0000\u0000\u02e1\u02d4\u0001\u0000\u0000\u0000\u02e1\u02db"+ + "\u0001\u0000\u0000\u0000\u02e2\u02e3\u0001\u0000\u0000\u0000\u02e3\u02e4"+ + "\u0006\u0010\u0000\u0000\u02e4/\u0001\u0000\u0000\u0000\u02e5\u02e6\u0005"+ + "@\u0000\u0000\u02e6\u02e7\u0007\u0007\u0000\u0000\u02e7\u02e8\u0007\n"+ + "\u0000\u0000\u02e8\u02e9\u0007\u000b\u0000\u0000\u02e9\u02ea\u0007\u0011"+ + "\u0000\u0000\u02ea\u02eb\u0007\n\u0000\u0000\u02eb\u02ec\u0007\b\u0000"+ + "\u0000\u02ec\u02ed\u0007\u0007\u0000\u0000\u02ed\u02ee\u0007\t\u0000\u0000"+ + "\u02ee\u02f9\u0007\t\u0000\u0000\u02ef\u02f0\u0005@\u0000\u0000\u02f0"+ + "\u02f1\u0007\u0007\u0000\u0000\u02f1\u02f2\u0007\n\u0000\u0000\u02f2\u02f3"+ + "\u0007\u000b\u0000\u0000\u02f3\u02f4\u0007\u0005\u0000\u0000\u02f4\u02f5"+ + "\u0007\t\u0000\u0000\u02f5\u02f6\u0007\t\u0000\u0000\u02f6\u02f7\u0007"+ + "\u0007\u0000\u0000\u02f7\u02f9\u0007\r\u0000\u0000\u02f8\u02e5\u0001\u0000"+ + "\u0000\u0000\u02f8\u02ef\u0001\u0000\u0000\u0000\u02f91\u0001\u0000\u0000"+ + "\u0000\u02fa\u02fb\u0005@\u0000\u0000\u02fb\u02fc\u0007\u0006\u0000\u0000"+ + "\u02fc\u02fd\u0007\u0015\u0000\u0000\u02fd\u02fe\u0007\u0016\u0000\u0000"+ + "\u02fe\u02ff\u0007\u0007\u0000\u0000\u02ff\u0300\u0007\u0010\u0000\u0000"+ + "\u0300\u0301\u0007\u000e\u0000\u0000\u0301\u0302\u0007\u000f\u0000\u0000"+ + "\u0302\u0303\u0001\u0000\u0000\u0000\u0303\u0304\u0006\u0012\u0002\u0000"+ + "\u03043\u0001\u0000\u0000\u0000\u0305\u0306\u0005@\u0000\u0000\u0306\u0307"+ + "\u0007\u0007\u0000\u0000\u0307\u0308\u0007\n\u0000\u0000\u0308\u0309\u0007"+ + "\u000b\u0000\u0000\u0309\u030a\u0007\u0006\u0000\u0000\u030a\u030b\u0007"+ + "\u0015\u0000\u0000\u030b\u030c\u0007\u0016\u0000\u0000\u030c\u030d\u0007"+ + "\u0007\u0000\u0000\u030d\u030e\u0007\u0010\u0000\u0000\u030e\u030f\u0007"+ + "\u000e\u0000\u0000\u030f\u0310\u0007\u000f\u0000\u0000\u03105\u0001\u0000"+ + "\u0000\u0000\u0311\u0312\u0005@\u0000\u0000\u0312\u0313\u0007\u0006\u0000"+ + "\u0000\u0313\u0314\u0007\u0015\u0000\u0000\u0314\u0315\u0007\u0016\u0000"+ + "\u0000\u0315\u0316\u0001\u0000\u0000\u0000\u0316\u0317\u0006\u0014\u0001"+ + "\u0000\u03177\u0001\u0000\u0000\u0000\u0318\u0319\u0005@\u0000\u0000\u0319"+ + "\u031a\u0007\u0007\u0000\u0000\u031a\u031b\u0007\n\u0000\u0000\u031b\u031c"+ + "\u0007\u000b\u0000\u0000\u031c\u031d\u0007\u0006\u0000\u0000\u031d\u031e"+ + "\u0007\u0015\u0000\u0000\u031e\u031f\u0007\u0016\u0000\u0000\u031f9\u0001"+ + "\u0000\u0000\u0000\u0320\u0321\u0005@\u0000\u0000\u0321\u0322\u0007\u0006"+ + "\u0000\u0000\u0322\u0323\u0007\u0015\u0000\u0000\u0323\u0324\u0007\u0016"+ + "\u0000\u0000\u0324\u0325\u0007\u0007\u0000\u0000\u0325\u0326\u0007\b\u0000"+ + "\u0000\u0326\u0327\u0007\t\u0000\u0000\u0327\u0328\u0007\u0007\u0000\u0000"+ + "\u0328\u0329\u0001\u0000\u0000\u0000\u0329\u032a\u0006\u0016\u0002\u0000"+ + "\u032a;\u0001\u0000\u0000\u0000\u032b\u032c\u0005@\u0000\u0000\u032c\u032d"+ + "\u0007\u0007\u0000\u0000\u032d\u032e\u0007\n\u0000\u0000\u032e\u032f\u0007"+ + "\u000b\u0000\u0000\u032f\u0330\u0007\u0006\u0000\u0000\u0330\u0331\u0007"+ + "\u0015\u0000\u0000\u0331\u0332\u0007\u0016\u0000\u0000\u0332\u0333\u0007"+ + "\u0007\u0000\u0000\u0333\u0334\u0007\b\u0000\u0000\u0334\u0335\u0007\t"+ + "\u0000\u0000\u0335\u0336\u0007\u0007\u0000\u0000\u0336=\u0001\u0000\u0000"+ + "\u0000\u0337\u0338\u0005@\u0000\u0000\u0338\u0339\u0007\f\u0000\u0000"+ + "\u0339\u033a\u0007\u000f\u0000\u0000\u033a\u033b\u0007\u0005\u0000\u0000"+ + "\u033b\u033c\u0007\b\u0000\u0000\u033c\u033d\u0007\u0007\u0000\u0000\u033d"+ + "\u033e\u0001\u0000\u0000\u0000\u033e\u033f\u0006\u0018\u0001\u0000\u033f"+ + "?\u0001\u0000\u0000\u0000\u0340\u0341\u0005@\u0000\u0000\u0341\u0342\u0007"+ + "\u0007\u0000\u0000\u0342\u0343\u0007\n\u0000\u0000\u0343\u0344\u0007\u000b"+ + "\u0000\u0000\u0344\u0345\u0007\f\u0000\u0000\u0345\u0346\u0007\u000f\u0000"+ + "\u0000\u0346\u0347\u0007\u0005\u0000\u0000\u0347\u0348\u0007\b\u0000\u0000"+ + "\u0348\u0349\u0007\u0007\u0000\u0000\u0349A\u0001\u0000\u0000\u0000\u034a"+ + "\u034b\u0005@\u0000\u0000\u034b\u034c\u0007\u0017\u0000\u0000\u034c\u034d"+ + "\u0007\u0016\u0000\u0000\u034d\u034e\u0007\u0007\u0000\u0000\u034e\u034f"+ + "\u0007\u0010\u0000\u0000\u034f\u0350\u0007\u0018\u0000\u0000\u0350\u0351"+ + "\u0001\u0000\u0000\u0000\u0351\u0352\u0006\u001a\u0001\u0000\u0352C\u0001"+ + "\u0000\u0000\u0000\u0353\u0354\u0005@\u0000\u0000\u0354\u0355\u0007\u000e"+ + "\u0000\u0000\u0355\u0356\u0007\u0015\u0000\u0000\u0356\u0357\u0007\n\u0000"+ + "\u0000\u0357\u0358\u0007\r\u0000\u0000\u0358\u0359\u0007\u0005\u0000\u0000"+ + "\u0359\u035a\u0007\n\u0000\u0000\u035a\u035b\u0007\u0011\u0000\u0000\u035b"+ + "\u035c\u0007\u0007\u0000\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d"+ + "\u035e\u0006\u001b\u0001\u0000\u035eE\u0001\u0000\u0000\u0000\u035f\u0360"+ + "\u0005@\u0000\u0000\u0360\u0361\u0007\u0005\u0000\u0000\u0361\u0362\u0007"+ + "\n\u0000\u0000\u0362\u0363\u0007\u000e\u0000\u0000\u0363\u0364\u0007\b"+ + "\u0000\u0000\u0364\u0365\u0007\u0011\u0000\u0000\u0365\u0366\u0007\u000b"+ + "\u0000\u0000\u0366\u0367\u0007\u0007\u0000\u0000\u0367\u0368\u0001\u0000"+ + "\u0000\u0000\u0368\u0369\u0006\u001c\u0003\u0000\u0369G\u0001\u0000\u0000"+ + "\u0000\u036a\u036b\u0005@\u0000\u0000\u036b\u036c\u0007\u0005\u0000\u0000"+ + "\u036c\u036d\u0007\n\u0000\u0000\u036d\u036e\u0007\u000e\u0000\u0000\u036e"+ + "\u036f\u0007\b\u0000\u0000\u036f\u0370\u0007\u0011\u0000\u0000\u0370\u0371"+ + "\u0007\u000b\u0000\u0000\u0371\u0372\u0007\u0007\u0000\u0000\u0372\u0373"+ + "\u0007\u0005\u0000\u0000\u0373\u0374\u0007\u0006\u0000\u0000\u0374\u0375"+ + "\u0001\u0000\u0000\u0000\u0375\u0376\u0006\u001d\u0003\u0000\u0376I\u0001"+ + "\u0000\u0000\u0000\u0377\u0378\u0005@\u0000\u0000\u0378\u0379\u0007\u0005"+ + "\u0000\u0000\u0379\u037a\u0007\n\u0000\u0000\u037a\u037b\u0007\u000e\u0000"+ + "\u0000\u037b\u037c\u0007\b\u0000\u0000\u037c\u037d\u0007\u0011\u0000\u0000"+ + "\u037d\u037e\u0007\u000b\u0000\u0000\u037e\u037f\u0007\u0007\u0000\u0000"+ + "\u037f\u0380\u0007\f\u0000\u0000\u0380\u0381\u0007\u000f\u0000\u0000\u0381"+ + "\u0382\u0007\u0007\u0000\u0000\u0382\u0383\u0007\n\u0000\u0000\u0383\u0384"+ + "\u0001\u0000\u0000\u0000\u0384\u0385\u0006\u001e\u0003\u0000\u0385K\u0001"+ + "\u0000\u0000\u0000\u0386\u0387\u0005@\u0000\u0000\u0387\u0388\u0007\u0005"+ + "\u0000\u0000\u0388\u0389\u0007\n\u0000\u0000\u0389\u038a\u0007\u000e\u0000"+ + "\u0000\u038a\u038b\u0007\b\u0000\u0000\u038b\u038c\u0007\u0011\u0000\u0000"+ + "\u038c\u038d\u0007\u000b\u0000\u0000\u038d\u038e\u0007\u0007\u0000\u0000"+ + "\u038e\u038f\u0007\u0006\u0000\u0000\u038f\u0390\u0007\u0005\u0000\u0000"+ + "\u0390\u0391\u0007\u0016\u0000\u0000\u0391\u0392\u0007\t\u0000\u0000\u0392"+ + "\u0393\u0007\r\u0000\u0000\u0393\u0394\u0001\u0000\u0000\u0000\u0394\u0395"+ + "\u0006\u001f\u0003\u0000\u0395M\u0001\u0000\u0000\u0000\u0396\u0397\u0005"+ + "@\u0000\u0000\u0397\u0398\u0007\u0005\u0000\u0000\u0398\u0399\u0007\n"+ + "\u0000\u0000\u0399\u039a\u0007\u000e\u0000\u0000\u039a\u039b\u0007\b\u0000"+ + "\u0000\u039b\u039c\u0007\u0011\u0000\u0000\u039c\u039d\u0007\u000b\u0000"+ + "\u0000\u039d\u039e\u0007\u0007\u0000\u0000\u039e\u039f\u0007\u0011\u0000"+ + "\u0000\u039f\u03a0\u0007\n\u0000\u0000\u03a0\u03a1\u0007\b\u0000\u0000"+ + "\u03a1\u03a2\u0007\u0007\u0000\u0000\u03a2\u03a3\u0007\t\u0000\u0000\u03a3"+ + "\u03a4\u0007\t\u0000\u0000\u03a4\u03a5\u0001\u0000\u0000\u0000\u03a5\u03a6"+ + "\u0006 \u0003\u0000\u03a6O\u0001\u0000\u0000\u0000\u03a7\u03a8\u0005@"+ + "\u0000\u0000\u03a8\u03a9\u0007\u0007\u0000\u0000\u03a9\u03aa\u0007\u0010"+ + "\u0000\u0000\u03aa\u03ab\u0007\u000e\u0000\u0000\u03ab\u03ac\u0007\u000f"+ + "\u0000\u0000\u03ac\u03ad\u0001\u0000\u0000\u0000\u03ad\u03ae\u0006!\u0003"+ + "\u0000\u03aeQ\u0001\u0000\u0000\u0000\u03af\u03b0\u0005@\u0000\u0000\u03b0"+ + "\u03b1\u0007\u0007\u0000\u0000\u03b1\u03b2\u0007\u0019\u0000\u0000\u03b2"+ + "\u03b3\u0007\r\u0000\u0000\u03b3\u03b4\u0007\u0007\u0000\u0000\u03b4\u03b5"+ + "\u0007\n\u0000\u0000\u03b5\u03b6\u0007\u000b\u0000\u0000\u03b6\u03b7\u0007"+ + "\t\u0000\u0000\u03b7\u03b8\u0001\u0000\u0000\u0000\u03b8\u03b9\u0006\""+ + "\u0003\u0000\u03b9S\u0001\u0000\u0000\u0000\u03ba\u03bb\u0005@\u0000\u0000"+ + "\u03bb\u03bc\u0007\u001a\u0000\u0000\u03bc\u03bd\u0007\t\u0000\u0000\u03bd"+ + "\u03be\u0001\u0000\u0000\u0000\u03be\u03bf\u0006#\u0000\u0000\u03bfU\u0001"+ + "\u0000\u0000\u0000\u03c0\u03c1\u0005@\u0000\u0000\u03c1\u03c2\u0007\u001a"+ + "\u0000\u0000\u03c2\u03c3\u0007\t\u0000\u0000\u03c3\u03c4\u0007\u0015\u0000"+ + "\u0000\u03c4\u03c5\u0007\n\u0000\u0000\u03c5\u03c6\u0001\u0000\u0000\u0000"+ + "\u03c6\u03c7\u0006$\u0000\u0000\u03c7W\u0001\u0000\u0000\u0000\u03c8\u03c9"+ + "\u0005@\u0000\u0000\u03c9\u03ca\u0007\t\u0000\u0000\u03ca\u03cb\u0007"+ + "\u0007\u0000\u0000\u03cb\u03cc\u0007\u000e\u0000\u0000\u03cc\u03cd\u0007"+ + "\r\u0000\u0000\u03cd\u03ce\u0007\u0005\u0000\u0000\u03ce\u03cf\u0007\u0015"+ + "\u0000\u0000\u03cf\u03d0\u0007\n\u0000\u0000\u03d0\u03d1\u0001\u0000\u0000"+ + "\u0000\u03d1\u03d2\u0006%\u0003\u0000\u03d2Y\u0001\u0000\u0000\u0000\u03d3"+ + "\u03d4\u0005@\u0000\u0000\u03d4\u03d5\u0007\u000f\u0000\u0000\u03d5\u03d6"+ + "\u0007\u0010\u0000\u0000\u03d6\u03d7\u0007\t\u0000\u0000\u03d7\u03d8\u0007"+ + "\t\u0000\u0000\u03d8\u03d9\u0007\u0007\u0000\u0000\u03d9\u03da\u0007\u000e"+ + "\u0000\u0000\u03da\u03db\u0007\r\u0000\u0000\u03db\u03dc\u0007\u0005\u0000"+ + "\u0000\u03dc\u03dd\u0007\u0015\u0000\u0000\u03dd\u03de\u0007\n\u0000\u0000"+ + "\u03de\u03df\u0001\u0000\u0000\u0000\u03df\u03e0\u0006&\u0003\u0000\u03e0"+ + "[\u0001\u0000\u0000\u0000\u03e1\u03e2\u0005@\u0000\u0000\u03e2\u03e3\u0007"+ + "\t\u0000\u0000\u03e3\u03e4\u0007\u0007\u0000\u0000\u03e4\u03e5\u0007\u000e"+ + "\u0000\u0000\u03e5\u03e6\u0007\r\u0000\u0000\u03e6\u03e7\u0007\u0005\u0000"+ + "\u0000\u03e7\u03e8\u0007\u0015\u0000\u0000\u03e8\u03e9\u0007\n\u0000\u0000"+ + "\u03e9\u03ea\u0007\u0012\u0000\u0000\u03ea\u03eb\u0007\u0005\u0000\u0000"+ + "\u03eb\u03ec\u0007\t\u0000\u0000\u03ec\u03ed\u0007\t\u0000\u0000\u03ed"+ + "\u03ee\u0007\u0005\u0000\u0000\u03ee\u03ef\u0007\n\u0000\u0000\u03ef\u03f0"+ + "\u0007\u001b\u0000\u0000\u03f0\u03f1\u0001\u0000\u0000\u0000\u03f1\u03f2"+ + "\u0006\'\u0003\u0000\u03f2]\u0001\u0000\u0000\u0000\u03f3\u03f4\u0005"+ + "@\u0000\u0000\u03f4\u03f5\u0007\u0007\u0000\u0000\u03f5\u03f6\u0007\n"+ + "\u0000\u0000\u03f6\u03f7\u0007\u000b\u0000\u0000\u03f7\u03f8\u0007\t\u0000"+ + "\u0000\u03f8\u03f9\u0007\u0007\u0000\u0000\u03f9\u03fa\u0007\u000e\u0000"+ + "\u0000\u03fa\u03fb\u0007\r\u0000\u0000\u03fb\u03fc\u0007\u0005\u0000\u0000"+ + "\u03fc\u03fd\u0007\u0015\u0000\u0000\u03fd\u03fe\u0007\n\u0000\u0000\u03fe"+ + "_\u0001\u0000\u0000\u0000\u03ff\u0400\u0005@\u0000\u0000\u0400\u0401\u0007"+ + "\u0014\u0000\u0000\u0401\u0402\u0007\u0005\u0000\u0000\u0402\u0403\u0007"+ + "\u0007\u0000\u0000\u0403\u0404\u0007\b\u0000\u0000\u0404\u0405\u0007\u000b"+ + "\u0000\u0000\u0405\u0406\u0001\u0000\u0000\u0000\u0406\u0407\u0006)\u0003"+ + "\u0000\u0407a\u0001\u0000\u0000\u0000\u0408\u0409\u0005@\u0000\u0000\u0409"+ + "\u040a\u0007\u0013\u0000\u0000\u040a\u040b\u0007\u0010\u0000\u0000\u040b"+ + "\u040c\u0007\u0016\u0000\u0000\u040c\u040d\u0007\u0007\u0000\u0000\u040d"+ + "\u040e\u0007\n\u0000\u0000\u040e\u040f\u0007\r\u0000\u0000\u040fc\u0001"+ + "\u0000\u0000\u0000\u0410\u0411\u0005@\u0000\u0000\u0411\u0412\u0007\t"+ + "\u0000\u0000\u0412\u0413\u0007\u000f\u0000\u0000\u0413\u0414\u0007\u0015"+ + "\u0000\u0000\u0414\u0415\u0007\f\u0000\u0000\u0415e\u0001\u0000\u0000"+ + "\u0000\u0416\u0417\u0005@\u0000\u0000\u0417\u0418\u0007\u0015\u0000\u0000"+ + "\u0418\u0419\u0007\u001c\u0000\u0000\u0419\u041a\u0007\u0007\u0000\u0000"+ + "\u041a\u041b\u0007\u0016\u0000\u0000\u041b\u041c\u0007\f\u0000\u0000\u041c"+ + "\u041d\u0007\u0016\u0000\u0000\u041d\u041e\u0007\u0005\u0000\u0000\u041e"+ + "\u041f\u0007\r\u0000\u0000\u041f\u0420\u0007\u0007\u0000\u0000\u0420g"+ + "\u0001\u0000\u0000\u0000\u0421\u0422\u0005@\u0000\u0000\u0422\u0423\u0007"+ + "\t\u0000\u0000\u0423\u0424\u0007\r\u0000\u0000\u0424\u0425\u0007\u0015"+ + "\u0000\u0000\u0425\u0426\u0007\u0013\u0000\u0000\u0426i\u0001\u0000\u0000"+ + "\u0000\u0427\u0428\u0005@\u0000\u0000\u0428\u0429\u0007\u0010\u0000\u0000"+ + "\u0429\u042a\u0007\u0013\u0000\u0000\u042a\u042b\u0007\u0013\u0000\u0000"+ + "\u042b\u042c\u0007\u0007\u0000\u0000\u042c\u042d\u0007\n\u0000\u0000\u042d"+ + "\u042e\u0007\u000b\u0000\u0000\u042ek\u0001\u0000\u0000\u0000\u042f\u0430"+ + "\u0005@\u0000\u0000\u0430\u0431\u0007\u0015\u0000\u0000\u0431\u0432\u0007"+ + "\n\u0000\u0000\u0432\u0433\u0007\u000e\u0000\u0000\u0433\u0434\u0007\u0007"+ + "\u0000\u0000\u0434m\u0001\u0000\u0000\u0000\u0435\u0436\u0005@\u0000\u0000"+ + "\u0436\u0437\u0007\u0007\u0000\u0000\u0437\u0438\u0007\n\u0000\u0000\u0438"+ + "\u0439\u0007\u000b\u0000\u0000\u0439\u043a\u0007\u0015\u0000\u0000\u043a"+ + "\u043b\u0007\n\u0000\u0000\u043b\u043c\u0007\u000e\u0000\u0000\u043c\u043d"+ + "\u0007\u0007\u0000\u0000\u043do\u0001\u0000\u0000\u0000\u043e\u043f\u0005"+ + "@\u0000\u0000\u043f\u0440\u0007\t\u0000\u0000\u0440\u0441\u0007\r\u0000"+ + "\u0000\u0441\u0442\u0007\u0010\u0000\u0000\u0442\u0443\u0007\u000e\u0000"+ + "\u0000\u0443\u0444\u0007\u0018\u0000\u0000\u0444\u0445\u0001\u0000\u0000"+ + "\u0000\u0445\u0446\u00061\u0003\u0000\u0446q\u0001\u0000\u0000\u0000\u0447"+ + "\u0448\u0005@\u0000\u0000\u0448\u0449\u0007\u0013\u0000\u0000\u0449\u044a"+ + "\u0007\u0011\u0000\u0000\u044a\u044b\u0007\t\u0000\u0000\u044b\u044c\u0007"+ + "\u000f\u0000\u0000\u044c\u044d\u0001\u0000\u0000\u0000\u044d\u044e\u0006"+ + "2\u0003\u0000\u044es\u0001\u0000\u0000\u0000\u044f\u0450\u0005@\u0000"+ + "\u0000\u0450\u0451\u0007\u0007\u0000\u0000\u0451\u0452\u0007\n\u0000\u0000"+ + "\u0452\u0453\u0007\u000b\u0000\u0000\u0453\u0454\u0007\u0013\u0000\u0000"+ + "\u0454\u0455\u0007\u0011\u0000\u0000\u0455\u0456\u0007\t\u0000\u0000\u0456"+ + "\u0457\u0007\u000f\u0000\u0000\u0457u\u0001\u0000\u0000\u0000\u0458\u0459"+ + "\u0005@\u0000\u0000\u0459\u045a\u0007\u0013\u0000\u0000\u045a\u045b\u0007"+ + "\u0011\u0000\u0000\u045b\u045c\u0007\t\u0000\u0000\u045c\u045d\u0007\u000f"+ + "\u0000\u0000\u045d\u045e\u0007\u0005\u0000\u0000\u045e\u045f\u0007\u0006"+ + "\u0000\u0000\u045f\u0460\u0001\u0000\u0000\u0000\u0460\u0461\u00064\u0003"+ + "\u0000\u0461w\u0001\u0000\u0000\u0000\u0462\u0463\u0005@\u0000\u0000\u0463"+ + "\u0464\u0007\u0007\u0000\u0000\u0464\u0465\u0007\n\u0000\u0000\u0465\u0466"+ + "\u0007\u000b\u0000\u0000\u0466\u0467\u0007\u0013\u0000\u0000\u0467\u0468"+ + "\u0007\u0011\u0000\u0000\u0468\u0469\u0007\t\u0000\u0000\u0469\u046a\u0007"+ + "\u000f\u0000\u0000\u046a\u046b\u0007\u0005\u0000\u0000\u046b\u046c\u0007"+ + "\u0006\u0000\u0000\u046cy\u0001\u0000\u0000\u0000\u046d\u046e\u0005@\u0000"+ + "\u0000\u046e\u046f\u0007\u0013\u0000\u0000\u046f\u0470\u0007\u0011\u0000"+ + "\u0000\u0470\u0471\u0007\t\u0000\u0000\u0471\u0472\u0007\u000f\u0000\u0000"+ + "\u0472\u0473\u0007\u0015\u0000\u0000\u0473\u0474\u0007\n\u0000\u0000\u0474"+ + "\u0475\u0007\u000e\u0000\u0000\u0475\u0476\u0007\u0007\u0000\u0000\u0476"+ + "\u0477\u0001\u0000\u0000\u0000\u0477\u0478\u00066\u0003\u0000\u0478{\u0001"+ + "\u0000\u0000\u0000\u0479\u047a\u0005@\u0000\u0000\u047a\u047b\u0007\u0007"+ + "\u0000\u0000\u047b\u047c\u0007\n\u0000\u0000\u047c\u047d\u0007\u000b\u0000"+ + "\u0000\u047d\u047e\u0007\u0013\u0000\u0000\u047e\u047f\u0007\u0011\u0000"+ + "\u0000\u047f\u0480\u0007\t\u0000\u0000\u0480\u0481\u0007\u000f\u0000\u0000"+ + "\u0481\u0482\u0007\u0015\u0000\u0000\u0482\u0483\u0007\n\u0000\u0000\u0483"+ + "\u0484\u0007\u000e\u0000\u0000\u0484\u0485\u0007\u0007\u0000\u0000\u0485"+ + "}\u0001\u0000\u0000\u0000\u0486\u0487\u0005@\u0000\u0000\u0487\u0488\u0007"+ + "\u0013\u0000\u0000\u0488\u0489\u0007\u0016\u0000\u0000\u0489\u048a\u0007"+ + "\u0007\u0000\u0000\u048a\u048b\u0007\u0013\u0000\u0000\u048b\u048c\u0007"+ + "\u0007\u0000\u0000\u048c\u048d\u0007\n\u0000\u0000\u048d\u048e\u0007\u000b"+ + "\u0000\u0000\u048e\u048f\u0001\u0000\u0000\u0000\u048f\u0490\u00068\u0003"+ + "\u0000\u0490\u007f\u0001\u0000\u0000\u0000\u0491\u0492\u0005@\u0000\u0000"+ + "\u0492\u0493\u0007\u0007\u0000\u0000\u0493\u0494\u0007\n\u0000\u0000\u0494"+ + "\u0495\u0007\u000b\u0000\u0000\u0495\u0496\u0007\u0013\u0000\u0000\u0496"+ + "\u0497\u0007\u0016\u0000\u0000\u0497\u0498\u0007\u0007\u0000\u0000\u0498"+ + "\u0499\u0007\u0013\u0000\u0000\u0499\u049a\u0007\u0007\u0000\u0000\u049a"+ + "\u049b\u0007\n\u0000\u0000\u049b\u049c\u0007\u000b\u0000\u0000\u049c\u0081"+ + "\u0001\u0000\u0000\u0000\u049d\u049e\u0005@\u0000\u0000\u049e\u049f\u0007"+ + "\u0013\u0000\u0000\u049f\u04a0\u0007\u0016\u0000\u0000\u04a0\u04a1\u0007"+ + "\u0015\u0000\u0000\u04a1\u04a2\u0007\u0013\u0000\u0000\u04a2\u04a3\u0007"+ + "\t\u0000\u0000\u04a3\u04a4\u0001\u0000\u0000\u0000\u04a4\u04a5\u0006:"+ + "\u0001\u0000\u04a5\u0083\u0001\u0000\u0000\u0000\u04a6\u04a7\u0005@\u0000"+ + "\u0000\u04a7\u04a8\u0007\u0006\u0000\u0000\u04a8\u04a9\u0007\u0016\u0000"+ + "\u0000\u04a9\u04aa\u0007\u0010\u0000\u0000\u04aa\u04ab\u0007\u001b\u0000"+ + "\u0000\u04ab\u04ac\u0007\u0012\u0000\u0000\u04ac\u04ad\u0007\u0007\u0000"+ + "\u0000\u04ad\u04ae\u0007\n\u0000\u0000\u04ae\u04af\u0007\r\u0000\u0000"+ + "\u04af\u04b0\u0001\u0000\u0000\u0000\u04b0\u04b1\u0006;\u0000\u0000\u04b1"+ + "\u0085\u0001\u0000\u0000\u0000\u04b2\u04b3\u0005@\u0000\u0000\u04b3\u04b4"+ + "\u0007\u0007\u0000\u0000\u04b4\u04b5\u0007\n\u0000\u0000\u04b5\u04b6\u0007"+ + "\u000b\u0000\u0000\u04b6\u04b7\u0007\u0006\u0000\u0000\u04b7\u04b8\u0007"+ + "\u0016\u0000\u0000\u04b8\u04b9\u0007\u0010\u0000\u0000\u04b9\u04ba\u0007"+ + "\u001b\u0000\u0000\u04ba\u04bb\u0007\u0012\u0000\u0000\u04bb\u04bc\u0007"+ + "\u0007\u0000\u0000\u04bc\u04bd\u0007\n\u0000\u0000\u04bd\u04be\u0007\r"+ + "\u0000\u0000\u04be\u0087\u0001\u0000\u0000\u0000\u04bf\u04c0\u0005@\u0000"+ + "\u0000\u04c0\u04c1\u0007\u000e\u0000\u0000\u04c1\u04c2\u0007\t\u0000\u0000"+ + "\u04c2\u04c3\u0007\u0016\u0000\u0000\u04c3\u04c4\u0007\u0006\u0000\u0000"+ + "\u04c4\u0089\u0001\u0000\u0000\u0000\u04c5\u04c6\u0005@\u0000\u0000\u04c6"+ + "\u04c7\u0007\u0012\u0000\u0000\u04c7\u04c8\u0007\u0007\u0000\u0000\u04c8"+ + "\u04c9\u0007\r\u0000\u0000\u04c9\u04ca\u0007\u000f\u0000\u0000\u04ca\u04cb"+ + "\u0007\u0015\u0000\u0000\u04cb\u04cc\u0007\u000b\u0000\u0000\u04cc\u04cd"+ + "\u0001\u0000\u0000\u0000\u04cd\u04ce\u0006>\u0001\u0000\u04ce\u008b\u0001"+ + "\u0000\u0000\u0000\u04cf\u04d0\u0005@\u0000\u0000\u04d0\u04d1\u0007\u0007"+ + "\u0000\u0000\u04d1\u04d2\u0007\u0016\u0000\u0000\u04d2\u04d3\u0007\u0016"+ + "\u0000\u0000\u04d3\u04d4\u0007\u0015\u0000\u0000\u04d4\u04d5\u0007\u0016"+ + "\u0000\u0000\u04d5\u04d6\u0001\u0000\u0000\u0000\u04d6\u04d7\u0006?\u0001"+ + "\u0000\u04d7\u008d\u0001\u0000\u0000\u0000\u04d8\u04d9\u0005@\u0000\u0000"+ + "\u04d9\u04da\u0007\u0007\u0000\u0000\u04da\u04db\u0007\n\u0000\u0000\u04db"+ + "\u04dc\u0007\u000b\u0000\u0000\u04dc\u04dd\u0007\u0007\u0000\u0000\u04dd"+ + "\u04de\u0007\u0016\u0000\u0000\u04de\u04df\u0007\u0016\u0000\u0000\u04df"+ + "\u04e0\u0007\u0015\u0000\u0000\u04e0\u04e1\u0007\u0016\u0000\u0000\u04e1"+ + "\u008f\u0001\u0000\u0000\u0000\u04e2\u04e3\u0005@\u0000\u0000\u04e3\u04e4"+ + "\u0007\u0013\u0000\u0000\u04e4\u04e5\u0007\u0016\u0000\u0000\u04e5\u04e6"+ + "\u0007\u0015\u0000\u0000\u04e6\u04e7\u0007\u000b\u0000\u0000\u04e7\u04e8"+ + "\u0007\u0011\u0000\u0000\u04e8\u04e9\u0007\u000e\u0000\u0000\u04e9\u04ea"+ + "\u0007\r\u0000\u0000\u04ea\u04eb\u0007\u0005\u0000\u0000\u04eb\u04ec\u0007"+ + "\u0015\u0000\u0000\u04ec\u04ed\u0007\n\u0000\u0000\u04ed\u0091\u0001\u0000"+ + "\u0000\u0000\u04ee\u04ef\u0005@\u0000\u0000\u04ef\u04f0\u0007\u0007\u0000"+ + "\u0000\u04f0\u04f1\u0007\n\u0000\u0000\u04f1\u04f2\u0007\u000b\u0000\u0000"+ + "\u04f2\u04f3\u0007\u0013\u0000\u0000\u04f3\u04f4\u0007\u0016\u0000\u0000"+ + "\u04f4\u04f5\u0007\u0015\u0000\u0000\u04f5\u04f6\u0007\u000b\u0000\u0000"+ + "\u04f6\u04f7\u0007\u0011\u0000\u0000\u04f7\u04f8\u0007\u000e\u0000\u0000"+ + "\u04f8\u04f9\u0007\r\u0000\u0000\u04f9\u04fa\u0007\u0005\u0000\u0000\u04fa"+ + "\u04fb\u0007\u0015\u0000\u0000\u04fb\u04fc\u0007\n\u0000\u0000\u04fc\u0093"+ + "\u0001\u0000\u0000\u0000\u04fd\u04fe\u0005@\u0000\u0000\u04fe\u04ff\u0007"+ + "\u0007\u0000\u0000\u04ff\u0500\u0007\n\u0000\u0000\u0500\u0501\u0007\u001c"+ + "\u0000\u0000\u0501\u0502\u0001\u0000\u0000\u0000\u0502\u0503\u0006C\u0003"+ + "\u0000\u0503\u0095\u0001\u0000\u0000\u0000\u0504\u0505\u0005@\u0000\u0000"+ + "\u0505\u0506\u0007\u0007\u0000\u0000\u0506\u0507\u0007\n\u0000\u0000\u0507"+ + "\u0508\u0007\u000b\u0000\u0000\u0508\u0509\u0007\u0007\u0000\u0000\u0509"+ + "\u050a\u0007\n\u0000\u0000\u050a\u050b\u0007\u001c\u0000\u0000\u050b\u0097"+ + "\u0001\u0000\u0000\u0000\u050c\u050d\u0005@\u0000\u0000\u050d\u050e\u0007"+ + "\u0010\u0000\u0000\u050e\u050f\u0007\u0011\u0000\u0000\u050f\u0510\u0007"+ + "\r\u0000\u0000\u0510\u0518\u0007\u000f\u0000\u0000\u0511\u0512\u0005@"+ + "\u0000\u0000\u0512\u0513\u0007\u001b\u0000\u0000\u0513\u0514\u0007\u0011"+ + "\u0000\u0000\u0514\u0515\u0007\u0007\u0000\u0000\u0515\u0516\u0007\t\u0000"+ + "\u0000\u0516\u0518\u0007\r\u0000\u0000\u0517\u050c\u0001\u0000\u0000\u0000"+ + "\u0517\u0511\u0001\u0000\u0000\u0000\u0518\u0519\u0001\u0000\u0000\u0000"+ + "\u0519\u051a\u0006E\u0003\u0000\u051a\u0099\u0001\u0000\u0000\u0000\u051b"+ + "\u051c\u0005@\u0000\u0000\u051c\u051d\u0007\u0007\u0000\u0000\u051d\u051e"+ + "\u0007\n\u0000\u0000\u051e\u051f\u0007\u000b\u0000\u0000\u051f\u0520\u0007"+ + "\u0010\u0000\u0000\u0520\u0521\u0007\u0011\u0000\u0000\u0521\u0522\u0007"+ + "\r\u0000\u0000\u0522\u052d\u0007\u000f\u0000\u0000\u0523\u0524\u0005@"+ + "\u0000\u0000\u0524\u0525\u0007\u0007\u0000\u0000\u0525\u0526\u0007\n\u0000"+ + "\u0000\u0526\u0527\u0007\u000b\u0000\u0000\u0527\u0528\u0007\u001b\u0000"+ + "\u0000\u0528\u0529\u0007\u0011\u0000\u0000\u0529\u052a\u0007\u0007\u0000"+ + "\u0000\u052a\u052b\u0007\t\u0000\u0000\u052b\u052d\u0007\r\u0000\u0000"+ + "\u052c\u051b\u0001\u0000\u0000\u0000\u052c\u0523\u0001\u0000\u0000\u0000"+ + "\u052d\u009b\u0001\u0000\u0000\u0000\u052e\u052f\u0005@\u0000\u0000\u052f"+ + "\u0530\u0007\u000e\u0000\u0000\u0530\u0531\u0007\u0010\u0000\u0000\u0531"+ + "\u0532\u0007\n\u0000\u0000\u0532\u0539\u0001\u0000\u0000\u0000\u0533\u0534"+ + "\u0007\n\u0000\u0000\u0534\u0535\u0007\u0015\u0000\u0000\u0535\u053a\u0007"+ + "\r\u0000\u0000\u0536\u0537\u0007\u0010\u0000\u0000\u0537\u0538\u0007\n"+ + "\u0000\u0000\u0538\u053a\u0007\u0014\u0000\u0000\u0539\u0533\u0001\u0000"+ + "\u0000\u0000\u0539\u0536\u0001\u0000\u0000\u0000\u0539\u053a\u0001\u0000"+ + "\u0000\u0000\u053a\u053b\u0001\u0000\u0000\u0000\u053b\u053c\u0006G\u0000"+ + "\u0000\u053c\u009d\u0001\u0000\u0000\u0000\u053d\u053e\u0005@\u0000\u0000"+ + "\u053e\u053f\u0007\u0007\u0000\u0000\u053f\u0540\u0007\b\u0000\u0000\u0540"+ + "\u0541\u0007\t\u0000\u0000\u0541\u0542\u0007\u0007\u0000\u0000\u0542\u0543"+ + "\u0007\u000e\u0000\u0000\u0543\u0544\u0007\u0010\u0000\u0000\u0544\u0545"+ + "\u0007\n\u0000\u0000\u0545\u054c\u0001\u0000\u0000\u0000\u0546\u0547\u0007"+ + "\n\u0000\u0000\u0547\u0548\u0007\u0015\u0000\u0000\u0548\u054d\u0007\r"+ + "\u0000\u0000\u0549\u054a\u0007\u0010\u0000\u0000\u054a\u054b\u0007\n\u0000"+ + "\u0000\u054b\u054d\u0007\u0014\u0000\u0000\u054c\u0546\u0001\u0000\u0000"+ + "\u0000\u054c\u0549\u0001\u0000\u0000\u0000\u054c\u054d\u0001\u0000\u0000"+ + "\u0000\u054d\u054e\u0001\u0000\u0000\u0000\u054e\u054f\u0006H\u0000\u0000"+ + "\u054f\u009f\u0001\u0000\u0000\u0000\u0550\u0551\u0005@\u0000\u0000\u0551"+ + "\u0552\u0007\u0007\u0000\u0000\u0552\u0553\u0007\n\u0000\u0000\u0553\u0554"+ + "\u0007\u000b\u0000\u0000\u0554\u0555\u0007\u000e\u0000\u0000\u0555\u0556"+ + "\u0007\u0010\u0000\u0000\u0556\u0557\u0007\n\u0000\u0000\u0557\u055e\u0001"+ + "\u0000\u0000\u0000\u0558\u0559\u0007\n\u0000\u0000\u0559\u055a\u0007\u0015"+ + "\u0000\u0000\u055a\u055f\u0007\r\u0000\u0000\u055b\u055c\u0007\u0010\u0000"+ + "\u0000\u055c\u055d\u0007\n\u0000\u0000\u055d\u055f\u0007\u0014\u0000\u0000"+ + "\u055e\u0558\u0001\u0000\u0000\u0000\u055e\u055b\u0001\u0000\u0000\u0000"+ + "\u055e\u055f\u0001\u0000\u0000\u0000\u055f\u00a1\u0001\u0000\u0000\u0000"+ + "\u0560\u0561\u0005@\u0000\u0000\u0561\u0562\u0007\u000e\u0000\u0000\u0562"+ + "\u0563\u0007\b\u0000\u0000\u0563\u0564\u0007\u0010\u0000\u0000\u0564\u0565"+ + "\u0007\t\u0000\u0000\u0565\u0566\u0007\t\u0000\u0000\u0566\u0567\u0001"+ + "\u0000\u0000\u0000\u0567\u0568\u0006J\u0001\u0000\u0568\u00a3\u0001\u0000"+ + "\u0000\u0000\u0569\u056a\u0005@\u0000\u0000\u056a\u056b\u0007\t\u0000"+ + "\u0000\u056b\u056c\u0007\r\u0000\u0000\u056c\u056d\u0007\u0014\u0000\u0000"+ + "\u056d\u056e\u0007\b\u0000\u0000\u056e\u056f\u0007\u0007\u0000\u0000\u056f"+ + "\u0570\u0001\u0000\u0000\u0000\u0570\u0571\u0006K\u0001\u0000\u0571\u00a5"+ + "\u0001\u0000\u0000\u0000\u0572\u0573\u0005@\u0000\u0000\u0573\u0574\u0007"+ + "\u000e\u0000\u0000\u0574\u0575\u0007\u000f\u0000\u0000\u0575\u0576\u0007"+ + "\u0007\u0000\u0000\u0576\u0577\u0007\u000e\u0000\u0000\u0577\u0578\u0007"+ + "\u0018\u0000\u0000\u0578\u0579\u0007\u0007\u0000\u0000\u0579\u059f\u0007"+ + "\u000b\u0000\u0000\u057a\u057b\u0005@\u0000\u0000\u057b\u057c\u0007\u000b"+ + "\u0000\u0000\u057c\u057d\u0007\u0005\u0000\u0000\u057d\u057e\u0007\t\u0000"+ + "\u0000\u057e\u057f\u0007\u0010\u0000\u0000\u057f\u0580\u0007\u0017\u0000"+ + "\u0000\u0580\u0581\u0007\b\u0000\u0000\u0581\u0582\u0007\u0007\u0000\u0000"+ + "\u0582\u059f\u0007\u000b\u0000\u0000\u0583\u0584\u0005@\u0000\u0000\u0584"+ + "\u0585\u0007\u0016\u0000\u0000\u0585\u0586\u0007\u0007\u0000\u0000\u0586"+ + "\u0587\u0007\u0010\u0000\u0000\u0587\u0588\u0007\u000b\u0000\u0000\u0588"+ + "\u0589\u0007\u0015\u0000\u0000\u0589\u058a\u0007\n\u0000\u0000\u058a\u058b"+ + "\u0007\b\u0000\u0000\u058b\u059f\u0007\u0014\u0000\u0000\u058c\u058d\u0005"+ + "@\u0000\u0000\u058d\u058e\u0007\u0016\u0000\u0000\u058e\u058f\u0007\u0007"+ + "\u0000\u0000\u058f\u0590\u0007\u001d\u0000\u0000\u0590\u0591\u0007\u0011"+ + "\u0000\u0000\u0591\u0592\u0007\u0005\u0000\u0000\u0592\u0593\u0007\u0016"+ + "\u0000\u0000\u0593\u0594\u0007\u0007\u0000\u0000\u0594\u059f\u0007\u000b"+ + "\u0000\u0000\u0595\u0596\u0005@\u0000\u0000\u0596\u0597\u0007\t\u0000"+ + "\u0000\u0597\u0598\u0007\u0007\u0000\u0000\u0598\u0599\u0007\b\u0000\u0000"+ + "\u0599\u059a\u0007\u0007\u0000\u0000\u059a\u059b\u0007\u000e\u0000\u0000"+ + "\u059b\u059c\u0007\r\u0000\u0000\u059c\u059d\u0007\u0007\u0000\u0000\u059d"+ + "\u059f\u0007\u000b\u0000\u0000\u059e\u0572\u0001\u0000\u0000\u0000\u059e"+ + "\u057a\u0001\u0000\u0000\u0000\u059e\u0583\u0001\u0000\u0000\u0000\u059e"+ + "\u058c\u0001\u0000\u0000\u0000\u059e\u0595\u0001\u0000\u0000\u0000\u059f"+ + "\u05a0\u0001\u0000\u0000\u0000\u05a0\u05a1\u0006L\u0000\u0000\u05a1\u00a7"+ + "\u0001\u0000\u0000\u0000\u05a2\u05a3\u0005@\u0000\u0000\u05a3\u05a4\u0007"+ + "\u0010\u0000\u0000\u05a4\u05a5\u0007\f\u0000\u0000\u05a5\u05a6\u0007\u0010"+ + "\u0000\u0000\u05a6\u05a7\u0007\u0016\u0000\u0000\u05a7\u05a8\u0007\u0007"+ + "\u0000\u0000\u05a8\u05a9\u0001\u0000\u0000\u0000\u05a9\u05aa\u0006M\u0000"+ + "\u0000\u05aa\u00a9\u0001\u0000\u0000\u0000\u05ab\u05ac\u0005@\u0000\u0000"+ + "\u05ac\u05ad\u0007\t\u0000\u0000\u05ad\u05ae\u0007\u0007\u0000\u0000\u05ae"+ + "\u05af\u0007\t\u0000\u0000\u05af\u05b0\u0007\t\u0000\u0000\u05b0\u05b1"+ + "\u0007\u0005\u0000\u0000\u05b1\u05b2\u0007\u0015\u0000\u0000\u05b2\u05b3"+ + "\u0007\n\u0000\u0000\u05b3\u05b4\u0001\u0000\u0000\u0000\u05b4\u05b5\u0006"+ + "N\u0000\u0000\u05b5\u00ab\u0001\u0000\u0000\u0000\u05b6\u05b7\u0005@\u0000"+ + "\u0000\u05b7\u05b8\u0007\u0007\u0000\u0000\u05b8\u05b9\u0007\n\u0000\u0000"+ + "\u05b9\u05ba\u0007\u000b\u0000\u0000\u05ba\u05bb\u0007\t\u0000\u0000\u05bb"+ + "\u05bc\u0007\u0007\u0000\u0000\u05bc\u05bd\u0007\t\u0000\u0000\u05bd\u05be"+ + "\u0007\t\u0000\u0000\u05be\u05bf\u0007\u0005\u0000\u0000\u05bf\u05c0\u0007"+ + "\u0015\u0000\u0000\u05c0\u05c1\u0007\n\u0000\u0000\u05c1\u00ad\u0001\u0000"+ + "\u0000\u0000\u05c2\u05c3\u0005@\u0000\u0000\u05c3\u05c4\u0007\u000b\u0000"+ + "\u0000\u05c4\u05cb\u0007\u000b\u0000\u0000\u05c5\u05c6\u0005@\u0000\u0000"+ + "\u05c6\u05c7\u0007\u000b\u0000\u0000\u05c7\u05c8\u0007\u0011\u0000\u0000"+ + "\u05c8\u05c9\u0007\u0012\u0000\u0000\u05c9\u05cb\u0007\u0013\u0000\u0000"+ + "\u05ca\u05c2\u0001\u0000\u0000\u0000\u05ca\u05c5\u0001\u0000\u0000\u0000"+ + "\u05cb\u05cc\u0001\u0000\u0000\u0000\u05cc\u05cd\u0006P\u0000\u0000\u05cd"+ + "\u00af\u0001\u0000\u0000\u0000\u05ce\u05cf\u0005@\u0000\u0000\u05cf\u05d0"+ + "\u0007\b\u0000\u0000\u05d0\u05d1\u0007\u0010\u0000\u0000\u05d1\u05d2\u0007"+ + "\n\u0000\u0000\u05d2\u05d3\u0007\u001b\u0000\u0000\u05d3\u05d4\u0001\u0000"+ + "\u0000\u0000\u05d4\u05d5\u0006Q\u0003\u0000\u05d5\u00b1\u0001\u0000\u0000"+ + "\u0000\u05d6\u05d7\u0005@\u0000\u0000\u05d7\u05d8\u0007\u0011\u0000\u0000"+ + "\u05d8\u05d9\u0007\t\u0000\u0000\u05d9\u05da\u0007\u0007\u0000\u0000\u05da"+ + "\u05db\u0001\u0000\u0000\u0000\u05db\u05dc\u0006R\u0003\u0000\u05dc\u00b3"+ + "\u0001\u0000\u0000\u0000\u05dd\u05de\u0005@\u0000\u0000\u05de\u05df\u0007"+ + "\u0005\u0000\u0000\u05df\u05e0\u0007\n\u0000\u0000\u05e0\u05e1\u0007\u001a"+ + "\u0000\u0000\u05e1\u05e2\u0007\u0007\u0000\u0000\u05e2\u05e3\u0007\u000e"+ + "\u0000\u0000\u05e3\u05e4\u0007\r\u0000\u0000\u05e4\u05e5\u0001\u0000\u0000"+ + "\u0000\u05e5\u05e6\u0006S\u0003\u0000\u05e6\u00b5\u0001\u0000\u0000\u0000"+ + "\u05e7\u05e8\u0005@\u0000\u0000\u05e8\u05e9\u0007\u0013\u0000\u0000\u05e9"+ + "\u05ea\u0007\u000f\u0000\u0000\u05ea\u05eb\u0007\u0013\u0000\u0000\u05eb"+ + "\u05ed\u0001\u0000\u0000\u0000\u05ec\u05ee\u0005 \u0000\u0000\u05ed\u05ec"+ + "\u0001\u0000\u0000\u0000\u05ed\u05ee\u0001\u0000\u0000\u0000\u05ee\u05ef"+ + "\u0001\u0000\u0000\u0000\u05ef\u05f0\u0004T\u0001\u0000\u05f0\u05f1\u0001"+ + "\u0000\u0000\u0000\u05f1\u05f2\u0006T\u0004\u0000\u05f2\u05f3\u0006T\u0000"+ + "\u0000\u05f3\u00b7\u0001\u0000\u0000\u0000\u05f4\u05f5\u0005@\u0000\u0000"+ + "\u05f5\u05f6\u0007\u0013\u0000\u0000\u05f6\u05f7\u0007\u000f\u0000\u0000"+ + "\u05f7\u05f8\u0007\u0013\u0000\u0000\u05f8\u05f9\u0001\u0000\u0000\u0000"+ + "\u05f9\u05fa\u0004U\u0002\u0000\u05fa\u05fb\u0001\u0000\u0000\u0000\u05fb"+ + "\u05fc\u0006U\u0005\u0000\u05fc\u00b9\u0001\u0000\u0000\u0000\u05fd\u05fe"+ + "\u0005@\u0000\u0000\u05fe\u05ff\u0007\u001c\u0000\u0000\u05ff\u0600\u0007"+ + "\u0007\u0000\u0000\u0600\u0601\u0007\u0016\u0000\u0000\u0601\u0602\u0007"+ + "\u0017\u0000\u0000\u0602\u0603\u0007\u0010\u0000\u0000\u0603\u0604\u0007"+ + "\r\u0000\u0000\u0604\u0605\u0007\u0005\u0000\u0000\u0605\u0606\u0007\u0012"+ + "\u0000\u0000\u0606\u0607\u0001\u0000\u0000\u0000\u0607\u0608\u0006V\u0006"+ + "\u0000\u0608\u00bb\u0001\u0000\u0000\u0000\u0609\u060a\u0005@\u0000\u0000"+ + "\u060a\u060b\u0007\u0007\u0000\u0000\u060b\u060c\u0007\n\u0000\u0000\u060c"+ + "\u060d\u0007\u000b\u0000\u0000\u060d\u060e\u0007\u001c\u0000\u0000\u060e"+ + "\u060f\u0007\u0007\u0000\u0000\u060f\u0610\u0007\u0016\u0000\u0000\u0610"+ + "\u0611\u0007\u0017\u0000\u0000\u0611\u0612\u0007\u0010\u0000\u0000\u0612"+ + "\u0613\u0007\r\u0000\u0000\u0613\u0614\u0007\u0005\u0000\u0000\u0614\u0615"+ + "\u0007\u0012\u0000\u0000\u0615\u00bd\u0001\u0000\u0000\u0000\u0616\u0617"+ + "\u0005@\u0000\u0000\u0617\u0618\u0007\b\u0000\u0000\u0618\u0619\u0007"+ + "\u0005\u0000\u0000\u0619\u061a\u0007\u001c\u0000\u0000\u061a\u061b\u0007"+ + "\u0007\u0000\u0000\u061b\u061c\u0007\f\u0000\u0000\u061c\u061d\u0007\u0005"+ + "\u0000\u0000\u061d\u061e\u0007\u0016\u0000\u0000\u061e\u061f\u0007\u0007"+ + "\u0000\u0000\u061f\u0620\u0007\t\u0000\u0000\u0620\u0621\u0007\r\u0000"+ + "\u0000\u0621\u0622\u0007\u0014\u0000\u0000\u0622\u0623\u0007\b\u0000\u0000"+ + "\u0623\u0624\u0007\u0007\u0000\u0000\u0624\u0654\u0007\t\u0000\u0000\u0625"+ + "\u0626\u0005@\u0000\u0000\u0626\u0627\u0007\u0017\u0000\u0000\u0627\u0628"+ + "\u0007\u0011\u0000\u0000\u0628\u0629\u0007\u0018\u0000\u0000\u0629\u062a"+ + "\u0007\t\u0000\u0000\u062a\u062b\u0007\r\u0000\u0000\u062b\u062c\u0007"+ + "\u0014\u0000\u0000\u062c\u062d\u0007\b\u0000\u0000\u062d\u062e\u0007\u0007"+ + "\u0000\u0000\u062e\u0654\u0007\t\u0000\u0000\u062f\u0630\u0005@\u0000"+ + "\u0000\u0630\u0631\u0007\b\u0000\u0000\u0631\u0632\u0007\u0005\u0000\u0000"+ + "\u0632\u0633\u0007\u001c\u0000\u0000\u0633\u0634\u0007\u0007\u0000\u0000"+ + "\u0634\u0635\u0007\f\u0000\u0000\u0635\u0636\u0007\u0005\u0000\u0000\u0636"+ + "\u0637\u0007\u0016\u0000\u0000\u0637\u0638\u0007\u0007\u0000\u0000\u0638"+ + "\u0639\u0007\t\u0000\u0000\u0639\u063a\u0007\u000e\u0000\u0000\u063a\u063b"+ + "\u0007\u0016\u0000\u0000\u063b\u063c\u0007\u0005\u0000\u0000\u063c\u063d"+ + "\u0007\u0013\u0000\u0000\u063d\u063e\u0007\r\u0000\u0000\u063e\u0654\u0007"+ + "\t\u0000\u0000\u063f\u0640\u0005@\u0000\u0000\u0640\u0641\u0007\u0017"+ + "\u0000\u0000\u0641\u0642\u0007\u0011\u0000\u0000\u0642\u0643\u0007\u0018"+ + "\u0000\u0000\u0643\u0644\u0007\t\u0000\u0000\u0644\u0645\u0007\u000e\u0000"+ + "\u0000\u0645\u0646\u0007\u0016\u0000\u0000\u0646\u0647\u0007\u0005\u0000"+ + "\u0000\u0647\u0648\u0007\u0013\u0000\u0000\u0648\u0649\u0007\r\u0000\u0000"+ + "\u0649\u0654\u0007\t\u0000\u0000\u064a\u064b\u0005@\u0000\u0000\u064b"+ + "\u064c\u0007\b\u0000\u0000\u064c\u064d\u0007\u0005\u0000\u0000\u064d\u064e"+ + "\u0007\u001c\u0000\u0000\u064e\u064f\u0007\u0007\u0000\u0000\u064f\u0650"+ + "\u0007\f\u0000\u0000\u0650\u0651\u0007\u0005\u0000\u0000\u0651\u0652\u0007"+ + "\u0016\u0000\u0000\u0652\u0654\u0007\u0007\u0000\u0000\u0653\u0616\u0001"+ + "\u0000\u0000\u0000\u0653\u0625\u0001\u0000\u0000\u0000\u0653\u062f\u0001"+ + "\u0000\u0000\u0000\u0653\u063f\u0001\u0000\u0000\u0000\u0653\u064a\u0001"+ + "\u0000\u0000\u0000\u0654\u00bf\u0001\u0000\u0000\u0000\u0655\u0656\u0005"+ + "@\u0000\u0000\u0656\u0657\u0007\u001c\u0000\u0000\u0657\u0658\u0007\u0005"+ + "\u0000\u0000\u0658\u0659\u0007\r\u0000\u0000\u0659\u065a\u0007\u0007\u0000"+ + "\u0000\u065a\u065b\u0001\u0000\u0000\u0000\u065b\u065c\u0006Y\u0000\u0000"+ + "\u065c\u00c1\u0001\u0000\u0000\u0000\u065d\u065e\u0005@\u0000\u0000\u065e"+ + "\u065f\u0007\u001c\u0000\u0000\u065f\u0660\u0007\u0005\u0000\u0000\u0660"+ + "\u0661\u0007\r\u0000\u0000\u0661\u0662\u0007\u0007\u0000\u0000\u0662\u0663"+ + "\u0007\u0016\u0000\u0000\u0663\u0664\u0007\u0007\u0000\u0000\u0664\u0665"+ + "\u0007\u0010\u0000\u0000\u0665\u0666\u0007\u000e\u0000\u0000\u0666\u0667"+ + "\u0007\r\u0000\u0000\u0667\u0668\u0007\u0016\u0000\u0000\u0668\u0669\u0007"+ + "\u0007\u0000\u0000\u0669\u066a\u0007\u0006\u0000\u0000\u066a\u066b\u0007"+ + "\u0016\u0000\u0000\u066b\u066c\u0007\u0007\u0000\u0000\u066c\u066d\u0007"+ + "\t\u0000\u0000\u066d\u066e\u0007\u000f\u0000\u0000\u066e\u00c3\u0001\u0000"+ + "\u0000\u0000\u066f\u0670\u0005@\u0000\u0000\u0670\u0671\u0003\u00f0q\u0000"+ + "\u0671\u0672\u0004[\u0003\u0000\u0672\u0673\u0001\u0000\u0000\u0000\u0673"+ + "\u0674\u0006[\u0003\u0000\u0674\u00c5\u0001\u0000\u0000\u0000\u0675\u0676"+ + "\u0005@\u0000\u0000\u0676\u0677\u0003\u00f0q\u0000\u0677\u0678\u0004\\"+ + "\u0004\u0000\u0678\u00c7\u0001\u0000\u0000\u0000\u0679\u067a\u0005@\u0000"+ + "\u0000\u067a\u067b\u0003\u00f0q\u0000\u067b\u067c\u0004]\u0005\u0000\u067c"+ + "\u00c9\u0001\u0000\u0000\u0000\u067d\u067e\u0005{\u0000\u0000\u067e\u067f"+ + "\u0005{\u0000\u0000\u067f\u0680\u0001\u0000\u0000\u0000\u0680\u0681\u0006"+ + "^\u0007\u0000\u0681\u00cb\u0001\u0000\u0000\u0000\u0682\u0683\u0005{\u0000"+ + "\u0000\u0683\u0684\u0005!\u0000\u0000\u0684\u0685\u0005!\u0000\u0000\u0685"+ + "\u0686\u0001\u0000\u0000\u0000\u0686\u0687\u0006_\b\u0000\u0687\u00cd"+ + "\u0001\u0000\u0000\u0000\u0688\u0689\u0005@\u0000\u0000\u0689\u068a\u0001"+ + "\u0000\u0000\u0000\u068a\u068b\u0006`\t\u0000\u068b\u00cf\u0001\u0000"+ + "\u0000\u0000\u068c\u068d\u0005{\u0000\u0000\u068d\u068e\u0005!\u0000\u0000"+ + "\u068e\u068f\u0001\u0000\u0000\u0000\u068f\u0690\u0006a\t\u0000\u0690"+ + "\u00d1\u0001\u0000\u0000\u0000\u0691\u0692\u0005<\u0000\u0000\u0692\u0693"+ + "\u0005?\u0000\u0000\u0693\u0694\u0007\u0013\u0000\u0000\u0694\u0695\u0007"+ + "\u000f\u0000\u0000\u0695\u069a\u0007\u0013\u0000\u0000\u0696\u0697\u0005"+ + "<\u0000\u0000\u0697\u0698\u0005?\u0000\u0000\u0698\u069a\u0005=\u0000"+ + "\u0000\u0699\u0691\u0001\u0000\u0000\u0000\u0699\u0696\u0001\u0000\u0000"+ + "\u0000\u069a\u069b\u0001\u0000\u0000\u0000\u069b\u069c\u0006b\n\u0000"+ + "\u069c\u00d3\u0001\u0000\u0000\u0000\u069d\u069e\u0005<\u0000\u0000\u069e"+ + "\u069f\u0007\u0019\u0000\u0000\u069f\u06a0\u0005-\u0000\u0000\u06a0\u06ab"+ + "\u0001\u0000\u0000\u0000\u06a1\u06ac\u0003\u000e\u0000\u0000\u06a2\u06a7"+ + "\u0003\u000e\u0000\u0000\u06a3\u06a4\u0005:\u0000\u0000\u06a4\u06a5\u0005"+ + ":\u0000\u0000\u06a5\u06a6\u0001\u0000\u0000\u0000\u06a6\u06a8\u0003\u000e"+ + "\u0000\u0000\u06a7\u06a3\u0001\u0000\u0000\u0000\u06a8\u06a9\u0001\u0000"+ + "\u0000\u0000\u06a9\u06a7\u0001\u0000\u0000\u0000\u06a9\u06aa\u0001\u0000"+ + "\u0000\u0000\u06aa\u06ac\u0001\u0000\u0000\u0000\u06ab\u06a1\u0001\u0000"+ + "\u0000\u0000\u06ab\u06a2\u0001\u0000\u0000\u0000\u06ab\u06ac\u0001\u0000"+ + "\u0000\u0000\u06ac\u06ad\u0001\u0000\u0000\u0000\u06ad\u06ae\u0006c\u000b"+ + "\u0000\u06ae\u00d5\u0001\u0000\u0000\u0000\u06af\u06b0\u0005<\u0000\u0000"+ + "\u06b0\u06b1\u0007\u0019\u0000\u0000\u06b1\u06b2\u0005-\u0000\u0000\u06b2"+ + "\u06b3\u0001\u0000\u0000\u0000\u06b3\u06b4\u0003\u000e\u0000\u0000\u06b4"+ + "\u06b5\u0004d\u0006\u0000\u06b5\u06b6\u0001\u0000\u0000\u0000\u06b6\u06b7"+ + "\u0006d\f\u0000\u06b7\u00d7\u0001\u0000\u0000\u0000\u06b8\u06ba\u0005"+ + "$\u0000\u0000\u06b9\u06b8\u0001\u0000\u0000\u0000\u06b9\u06ba\u0001\u0000"+ + "\u0000\u0000\u06ba\u06bb\u0001\u0000\u0000\u0000\u06bb\u06bc\u0005(\u0000"+ + "\u0000\u06bc\u06cc\u0003\u0014\u0003\u0000\u06bd\u06be\u0003\u00f4s\u0000"+ + "\u06be\u06c1\u0005)\u0000\u0000\u06bf\u06c0\u0005.\u0000\u0000\u06c0\u06c2"+ + "\u0003\u00f0q\u0000\u06c1\u06bf\u0001\u0000\u0000\u0000\u06c1\u06c2\u0001"+ + "\u0000\u0000\u0000\u06c2\u06cc\u0001\u0000\u0000\u0000\u06c3\u06c8\u0003"+ + "\u0012\u0002\u0000\u06c4\u06c5\u0005.\u0000\u0000\u06c5\u06c7\u0003\u0012"+ + "\u0002\u0000\u06c6\u06c4\u0001\u0000\u0000\u0000\u06c7\u06ca\u0001\u0000"+ + "\u0000\u0000\u06c8\u06c6\u0001\u0000\u0000\u0000\u06c8\u06c9\u0001\u0000"+ + "\u0000\u0000\u06c9\u06cc\u0001\u0000\u0000\u0000\u06ca\u06c8\u0001\u0000"+ + "\u0000\u0000\u06cb\u06b9\u0001\u0000\u0000\u0000\u06cb\u06bd\u0001\u0000"+ + "\u0000\u0000\u06cb\u06c3\u0001\u0000\u0000\u0000\u06cc\u06cd\u0001\u0000"+ + "\u0000\u0000\u06cd\u06ce\u0006e\r\u0000\u06ce\u00d9\u0001\u0000\u0000"+ + "\u0000\u06cf\u06d0\u0005<\u0000\u0000\u06d0\u06d1\u0003\u00f4s\u0000\u06d1"+ + "\u00db\u0001\u0000\u0000\u0000\u06d2\u06d3\u0005<\u0000\u0000\u06d3\u06d4"+ + "\u0005/\u0000\u0000\u06d4\u06d5\u0001\u0000\u0000\u0000\u06d5\u06d9\u0003"+ + "\u00f4s\u0000\u06d6\u06d8\u0007\u001e\u0000\u0000\u06d7\u06d6\u0001\u0000"+ + "\u0000\u0000\u06d8\u06db\u0001\u0000\u0000\u0000\u06d9\u06d7\u0001\u0000"+ + "\u0000\u0000\u06d9\u06da\u0001\u0000\u0000\u0000\u06da\u06dc\u0001\u0000"+ + "\u0000\u0000\u06db\u06d9\u0001\u0000\u0000\u0000\u06dc\u06dd\u0005>\u0000"+ + "\u0000\u06dd\u06df\u0001\u0000\u0000\u0000\u06de\u06d2\u0001\u0000\u0000"+ + "\u0000\u06df\u06e0\u0001\u0000\u0000\u0000\u06e0\u06de\u0001\u0000\u0000"+ + "\u0000\u06e0\u06e1\u0001\u0000\u0000\u0000\u06e1\u06e2\u0001\u0000\u0000"+ + "\u0000\u06e2\u06e3\u0006g\r\u0000\u06e3\u00dd\u0001\u0000\u0000\u0000"+ + "\u06e4\u06e5\u0005/\u0000\u0000\u06e5\u06e6\u0005>\u0000\u0000\u06e6\u06e7"+ + "\u0001\u0000\u0000\u0000\u06e7\u06e8\u0006h\u000e\u0000\u06e8\u06e9\u0001"+ + "\u0000\u0000\u0000\u06e9\u06ea\u0006h\t\u0000\u06ea\u00df\u0001\u0000"+ + "\u0000\u0000\u06eb\u06ec\u0005>\u0000\u0000\u06ec\u06ed\u0006i\u000f\u0000"+ + "\u06ed\u06ee\u0001\u0000\u0000\u0000\u06ee\u06ef\u0006i\t\u0000\u06ef"+ + "\u00e1\u0001\u0000\u0000\u0000\u06f0\u06f4\u0005\"\u0000\u0000\u06f1\u06f3"+ + "\u0003\u00e4k\u0000\u06f2\u06f1\u0001\u0000\u0000\u0000\u06f3\u06f6\u0001"+ + "\u0000\u0000\u0000\u06f4\u06f2\u0001\u0000\u0000\u0000\u06f4\u06f5\u0001"+ + "\u0000\u0000\u0000\u06f5\u06f7\u0001\u0000\u0000\u0000\u06f6\u06f4\u0001"+ + "\u0000\u0000\u0000\u06f7\u06fd\u0005\"\u0000\u0000\u06f8\u06f9\u0007\u0004"+ + "\u0000\u0000\u06f9\u06fa\u0003\u00e4k\u0000\u06fa\u06fb\u0007\u0004\u0000"+ + "\u0000\u06fb\u06fd\u0001\u0000\u0000\u0000\u06fc\u06f0\u0001\u0000\u0000"+ + "\u0000\u06fc\u06f8\u0001\u0000\u0000\u0000\u06fd\u06fe\u0001\u0000\u0000"+ + "\u0000\u06fe\u06ff\u0006j\r\u0000\u06ff\u00e3\u0001\u0000\u0000\u0000"+ + "\u0700\u0702\u0005 \u0000\u0000\u0701\u0700\u0001\u0000\u0000\u0000\u0702"+ + "\u0705\u0001\u0000\u0000\u0000\u0703\u0701\u0001\u0000\u0000\u0000\u0703"+ + "\u0704\u0001\u0000\u0000\u0000\u0704\u0706\u0001\u0000\u0000\u0000\u0705"+ + "\u0703\u0001\u0000\u0000\u0000\u0706\u0709\u0003\u00f4s\u0000\u0707\u0708"+ + "\u0005/\u0000\u0000\u0708\u070a\u0003\u00f4s\u0000\u0709\u0707\u0001\u0000"+ + "\u0000\u0000\u070a\u070b\u0001\u0000\u0000\u0000\u070b\u0709\u0001\u0000"+ + "\u0000\u0000\u070b\u070c\u0001\u0000\u0000\u0000\u070c\u070f\u0001\u0000"+ + "\u0000\u0000\u070d\u070e\u0005.\u0000\u0000\u070e\u0710\u0003\u00f0q\u0000"+ + "\u070f\u070d\u0001\u0000\u0000\u0000\u070f\u0710\u0001\u0000\u0000\u0000"+ + "\u0710\u071b\u0001\u0000\u0000\u0000\u0711\u0712\u0005?\u0000\u0000\u0712"+ + "\u0718\u0003\u00f0q\u0000\u0713\u0714\u0003\u00ean\u0000\u0714\u0715\u0003"+ + "\u00f0q\u0000\u0715\u0717\u0001\u0000\u0000\u0000\u0716\u0713\u0001\u0000"+ + "\u0000\u0000\u0717\u071a\u0001\u0000\u0000\u0000\u0718\u0716\u0001\u0000"+ + "\u0000\u0000\u0718\u0719\u0001\u0000\u0000\u0000\u0719\u071c\u0001\u0000"+ + "\u0000\u0000\u071a\u0718\u0001\u0000\u0000\u0000\u071b\u0711\u0001\u0000"+ + "\u0000\u0000\u071b\u071c\u0001\u0000\u0000\u0000\u071c\u071d\u0001\u0000"+ + "\u0000\u0000\u071d\u071e\u0006k\r\u0000\u071e\u00e5\u0001\u0000\u0000"+ + "\u0000\u071f\u0721\u0005 \u0000\u0000\u0720\u071f\u0001\u0000\u0000\u0000"+ + "\u0721\u0724\u0001\u0000\u0000\u0000\u0722\u0720\u0001\u0000\u0000\u0000"+ + "\u0722\u0723\u0001\u0000\u0000\u0000\u0723\u0725\u0001\u0000\u0000\u0000"+ + "\u0724\u0722\u0001\u0000\u0000\u0000\u0725\u072c\u0003\u00f4s\u0000\u0726"+ + "\u0728\u0005 \u0000\u0000\u0727\u0726\u0001\u0000\u0000\u0000\u0728\u0729"+ + "\u0001\u0000\u0000\u0000\u0729\u0727\u0001\u0000\u0000\u0000\u0729\u072a"+ + "\u0001\u0000\u0000\u0000\u072a\u072b\u0001\u0000\u0000\u0000\u072b\u072d"+ + "\u0003\u00f4s\u0000\u072c\u0727\u0001\u0000\u0000\u0000\u072d\u072e\u0001"+ + "\u0000\u0000\u0000\u072e\u072c\u0001\u0000\u0000\u0000\u072e\u072f\u0001"+ + "\u0000\u0000\u0000\u072f\u0730\u0001\u0000\u0000\u0000\u0730\u0731\u0006"+ + "l\r\u0000\u0731\u00e7\u0001\u0000\u0000\u0000\u0732\u0733\u0003\u00f4"+ + "s\u0000\u0733\u0734\u0006m\u0010\u0000\u0734\u00e9\u0001\u0000\u0000\u0000"+ + "\u0735\u0736\u0005=\u0000\u0000\u0736\u00eb\u0001\u0000\u0000\u0000\u0737"+ + "\u0739\u0005 \u0000\u0000\u0738\u0737\u0001\u0000\u0000\u0000\u0739\u073a"+ + "\u0001\u0000\u0000\u0000\u073a\u0738\u0001\u0000\u0000\u0000\u073a\u073b"+ + "\u0001\u0000\u0000\u0000\u073b\u0742\u0001\u0000\u0000\u0000\u073c\u073e"+ + "\u0007\u001f\u0000\u0000\u073d\u073c\u0001\u0000\u0000\u0000\u073e\u073f"+ + "\u0001\u0000\u0000\u0000\u073f\u073d\u0001\u0000\u0000\u0000\u073f\u0740"+ + "\u0001\u0000\u0000\u0000\u0740\u0742\u0001\u0000\u0000\u0000\u0741\u0738"+ + "\u0001\u0000\u0000\u0000\u0741\u073d\u0001\u0000\u0000\u0000\u0742\u0743"+ + "\u0001\u0000\u0000\u0000\u0743\u0744\u0006o\r\u0000\u0744\u00ed\u0001"+ + "\u0000\u0000\u0000\u0745\u0746\t\u0000\u0000\u0000\u0746\u0747\u0001\u0000"+ + "\u0000\u0000\u0747\u0748\u0006p\r\u0000\u0748\u00ef\u0001\u0000\u0000"+ + "\u0000\u0749\u074d\u0007 \u0000\u0000\u074a\u074c\u0007!\u0000\u0000\u074b"+ + "\u074a\u0001\u0000\u0000\u0000\u074c\u074f\u0001\u0000\u0000\u0000\u074d"+ + "\u074b\u0001\u0000\u0000\u0000\u074d\u074e\u0001\u0000\u0000\u0000\u074e"+ + "\u00f1\u0001\u0000\u0000\u0000\u074f\u074d\u0001\u0000\u0000\u0000\u0750"+ + "\u0754\u0007\u0000\u0000\u0000\u0751\u0753\u0007\"\u0000\u0000\u0752\u0751"+ + "\u0001\u0000\u0000\u0000\u0753\u0756\u0001\u0000\u0000\u0000\u0754\u0752"+ + "\u0001\u0000\u0000\u0000\u0754\u0755\u0001\u0000\u0000\u0000\u0755\u00f3"+ + "\u0001\u0000\u0000\u0000\u0756\u0754\u0001\u0000\u0000\u0000\u0757\u075b"+ + "\u0007 \u0000\u0000\u0758\u075a\u0007#\u0000\u0000\u0759\u0758\u0001\u0000"+ + "\u0000\u0000\u075a\u075d\u0001\u0000\u0000\u0000\u075b\u0759\u0001\u0000"+ + "\u0000\u0000\u075b\u075c\u0001\u0000\u0000\u0000\u075c\u00f5\u0001\u0000"+ + "\u0000\u0000\u075d\u075b\u0001\u0000\u0000\u0000\u075e\u075f\u0007$\u0000"+ + "\u0000\u075f\u00f7\u0001\u0000\u0000\u0000\u0760\u0765\u0005\"\u0000\u0000"+ + "\u0761\u0764\u0003\u00f6t\u0000\u0762\u0764\t\u0000\u0000\u0000\u0763"+ + "\u0761\u0001\u0000\u0000\u0000\u0763\u0762\u0001\u0000\u0000\u0000\u0764"+ + "\u0767\u0001\u0000\u0000\u0000\u0765\u0766\u0001\u0000\u0000\u0000\u0765"+ + "\u0763\u0001\u0000\u0000\u0000\u0766\u0768\u0001\u0000\u0000\u0000\u0767"+ + "\u0765\u0001\u0000\u0000\u0000\u0768\u0769\u0005\"\u0000\u0000\u0769\u00f9"+ + "\u0001\u0000\u0000\u0000\u076a\u0770\u0005\'\u0000\u0000\u076b\u076f\b"+ + "\u0004\u0000\u0000\u076c\u076d\u0005\\\u0000\u0000\u076d\u076f\t\u0000"+ + "\u0000\u0000\u076e\u076b\u0001\u0000\u0000\u0000\u076e\u076c\u0001\u0000"+ + "\u0000\u0000\u076f\u0772\u0001\u0000\u0000\u0000\u0770\u076e\u0001\u0000"+ + "\u0000\u0000\u0770\u0771\u0001\u0000\u0000\u0000\u0771\u0773\u0001\u0000"+ + "\u0000\u0000\u0772\u0770\u0001\u0000\u0000\u0000\u0773\u0774\u0005\'\u0000"+ + "\u0000\u0774\u00fb\u0001\u0000\u0000\u0000\u0775\u0776\u0005/\u0000\u0000"+ + "\u0776\u0777\u0005/\u0000\u0000\u0777\u077b\u0001\u0000\u0000\u0000\u0778"+ + "\u077a\b\u001f\u0000\u0000\u0779\u0778\u0001\u0000\u0000\u0000\u077a\u077d"+ + "\u0001\u0000\u0000\u0000\u077b\u0779\u0001\u0000\u0000\u0000\u077b\u077c"+ + "\u0001\u0000\u0000\u0000\u077c\u00fd\u0001\u0000\u0000\u0000\u077d\u077b"+ + "\u0001\u0000\u0000\u0000\u077e\u077f\u0005$\u0000\u0000\u077f\u0780\u0003"+ + "\u00f0q\u0000\u0780\u00ff\u0001\u0000\u0000\u0000\u0781\u0782\u0007\u0010"+ + "\u0000\u0000\u0782\u0783\u0007\u0016\u0000\u0000\u0783\u0784\u0007\u0016"+ + "\u0000\u0000\u0784\u0785\u0007\u0010\u0000\u0000\u0785\u0794\u0007\u0014"+ + "\u0000\u0000\u0786\u0787\u0007\u000e\u0000\u0000\u0787\u0788\u0007\b\u0000"+ + "\u0000\u0788\u0789\u0007\u0010\u0000\u0000\u0789\u078a\u0007\t\u0000\u0000"+ + "\u078a\u0794\u0007\t\u0000\u0000\u078b\u078c\u0007\u0007\u0000\u0000\u078c"+ + "\u078d\u0007\u0012\u0000\u0000\u078d\u078e\u0007\u0013\u0000\u0000\u078e"+ + "\u078f\u0007\r\u0000\u0000\u078f\u0794\u0007\u0014\u0000\u0000\u0790\u0791"+ + "\u0007\u0011\u0000\u0000\u0791\u0792\u0007\t\u0000\u0000\u0792\u0794\u0007"+ + "\u0007\u0000\u0000\u0793\u0781\u0001\u0000\u0000\u0000\u0793\u0786\u0001"+ + "\u0000\u0000\u0000\u0793\u078b\u0001\u0000\u0000\u0000\u0793\u0790\u0001"+ + "\u0000\u0000\u0000\u0794\u0101\u0001\u0000\u0000\u0000\u0795\u0796\u0002"+ + "09\u0000\u0796\u0103\u0001\u0000\u0000\u0000\u0797\u0798\u0005{\u0000"+ + "\u0000\u0798\u0799\u0005{\u0000\u0000\u0799\u079a\u0005-\u0000\u0000\u079a"+ + "\u079b\u0005-\u0000\u0000\u079b\u079c\u0001\u0000\u0000\u0000\u079c\u079d"+ + "\u0006{\u0011\u0000\u079d\u079e\u0006{\r\u0000\u079e\u0105\u0001\u0000"+ + "\u0000\u0000\u079f\u07a0\u0005@\u0000\u0000\u07a0\u07a1\u0003\u00f4s\u0000"+ + "\u07a1\u07a2\u0005.\u0000\u0000\u07a2\u07a3\u0001\u0000\u0000\u0000\u07a3"+ + "\u07a4\u0006|\t\u0000\u07a4\u0107\u0001\u0000\u0000\u0000\u07a5\u07aa"+ + "\u0005@\u0000\u0000\u07a6\u07a8\u0003\u0102z\u0000\u07a7\u07a9\u0005."+ + "\u0000\u0000\u07a8\u07a7\u0001\u0000\u0000\u0000\u07a8\u07a9\u0001\u0000"+ + "\u0000\u0000\u07a9\u07ab\u0001\u0000\u0000\u0000\u07aa\u07a6\u0001\u0000"+ + "\u0000\u0000\u07ab\u07ac\u0001\u0000\u0000\u0000\u07ac\u07aa\u0001\u0000"+ + "\u0000\u0000\u07ac\u07ad\u0001\u0000\u0000\u0000\u07ad\u07ae\u0001\u0000"+ + "\u0000\u0000\u07ae\u07af\u0006}\t\u0000\u07af\u0109\u0001\u0000\u0000"+ + "\u0000\u07b0\u07b1\u0005{\u0000\u0000\u07b1\u07b2\u0005{\u0000\u0000\u07b2"+ + "\u088f\u0005{\u0000\u0000\u07b3\u07b4\u0005@\u0000\u0000\u07b4\u07b5\u0005"+ + "@\u0000\u0000\u07b5\u07b7\u0001\u0000\u0000\u0000\u07b6\u07b8\u0005@\u0000"+ + "\u0000\u07b7\u07b6\u0001\u0000\u0000\u0000\u07b7\u07b8\u0001\u0000\u0000"+ + "\u0000\u07b8\u088f\u0001\u0000\u0000\u0000\u07b9\u07ba\u0005@\u0000\u0000"+ + "\u07ba\u07bb\u0005{\u0000\u0000\u07bb\u07bd\u0001\u0000\u0000\u0000\u07bc"+ + "\u07be\u0005{\u0000\u0000\u07bd\u07bc\u0001\u0000\u0000\u0000\u07bd\u07be"+ + "\u0001\u0000\u0000\u0000\u07be\u088f\u0001\u0000\u0000\u0000\u07bf\u07c0"+ + "\u0005@\u0000\u0000\u07c0\u07c1\u0007\u0012\u0000\u0000\u07c1\u07c2\u0007"+ + "\u0007\u0000\u0000\u07c2\u07c3\u0007\u000b\u0000\u0000\u07c3\u07c4\u0007"+ + "\u0005\u0000\u0000\u07c4\u07c5\u0007\u0010\u0000\u0000\u07c5\u07c9\u0001"+ + "\u0000\u0000\u0000\u07c6\u07c8\u0007%\u0000\u0000\u07c7\u07c6\u0001\u0000"+ + "\u0000\u0000\u07c8\u07cb\u0001\u0000\u0000\u0000\u07c9\u07c7\u0001\u0000"+ + "\u0000\u0000\u07c9\u07ca\u0001\u0000\u0000\u0000\u07ca\u07cd\u0001\u0000"+ + "\u0000\u0000\u07cb\u07c9\u0001\u0000\u0000\u0000\u07cc\u07ce\u0005(\u0000"+ + "\u0000\u07cd\u07cc\u0001\u0000\u0000\u0000\u07cd\u07ce\u0001\u0000\u0000"+ + "\u0000\u07ce\u088f\u0001\u0000\u0000\u0000\u07cf\u07d0\u0005@\u0000\u0000"+ + "\u07d0\u07d1\u0007\u000e\u0000\u0000\u07d1\u07d2\u0007\u000f\u0000\u0000"+ + "\u07d2\u07d3\u0007\u0010\u0000\u0000\u07d3\u07d4\u0007\u0016\u0000\u0000"+ + "\u07d4\u07d5\u0007\t\u0000\u0000\u07d5\u07d6\u0007\u0007\u0000\u0000\u07d6"+ + "\u07d7\u0007\r\u0000\u0000\u07d7\u07db\u0001\u0000\u0000\u0000\u07d8\u07da"+ + "\u0007%\u0000\u0000\u07d9\u07d8\u0001\u0000\u0000\u0000\u07da\u07dd\u0001"+ + "\u0000\u0000\u0000\u07db\u07d9\u0001\u0000\u0000\u0000\u07db\u07dc\u0001"+ + "\u0000\u0000\u0000\u07dc\u088f\u0001\u0000\u0000\u0000\u07dd\u07db\u0001"+ + "\u0000\u0000\u0000\u07de\u07df\u0005@\u0000\u0000\u07df\u07e0\u0007\u0005"+ + "\u0000\u0000\u07e0\u07e1\u0007\u0012\u0000\u0000\u07e1\u07e2\u0007\u0013"+ + "\u0000\u0000\u07e2\u07e3\u0007\u0015\u0000\u0000\u07e3\u07e4\u0007\u0016"+ + "\u0000\u0000\u07e4\u07e5\u0007\r\u0000\u0000\u07e5\u07e9\u0001\u0000\u0000"+ + "\u0000\u07e6\u07e8\u0007%\u0000\u0000\u07e7\u07e6\u0001\u0000\u0000\u0000"+ + "\u07e8\u07eb\u0001\u0000\u0000\u0000\u07e9\u07e7\u0001\u0000\u0000\u0000"+ + "\u07e9\u07ea\u0001\u0000\u0000\u0000\u07ea\u088f\u0001\u0000\u0000\u0000"+ + "\u07eb\u07e9\u0001\u0000\u0000\u0000\u07ec\u07ed\u0005@\u0000\u0000\u07ed"+ + "\u07ee\u0007\n\u0000\u0000\u07ee\u07ef\u0007\u0010\u0000\u0000\u07ef\u07f0"+ + "\u0007\u0012\u0000\u0000\u07f0\u07f1\u0007\u0007\u0000\u0000\u07f1\u07f2"+ + "\u0007\t\u0000\u0000\u07f2\u07f3\u0007\u0013\u0000\u0000\u07f3\u07f4\u0007"+ + "\u0010\u0000\u0000\u07f4\u07f5\u0007\u000e\u0000\u0000\u07f5\u07f6\u0007"+ + "\u0007\u0000\u0000\u07f6\u07fa\u0001\u0000\u0000\u0000\u07f7\u07f9\u0007"+ + "%\u0000\u0000\u07f8\u07f7\u0001\u0000\u0000\u0000\u07f9\u07fc\u0001\u0000"+ + "\u0000\u0000\u07fa\u07f8\u0001\u0000\u0000\u0000\u07fa\u07fb\u0001\u0000"+ + "\u0000\u0000\u07fb\u088f\u0001\u0000\u0000\u0000\u07fc\u07fa\u0001\u0000"+ + "\u0000\u0000\u07fd\u07fe\u0005@\u0000\u0000\u07fe\u07ff\u0007\u000b\u0000"+ + "\u0000\u07ff\u0800\u0007\u0015\u0000\u0000\u0800\u0801\u0007\u000e\u0000"+ + "\u0000\u0801\u0802\u0007\u0011\u0000\u0000\u0802\u0803\u0007\u0012\u0000"+ + "\u0000\u0803\u0804\u0007\u0007\u0000\u0000\u0804\u0805\u0007\n\u0000\u0000"+ + "\u0805\u0806\u0007\r\u0000\u0000\u0806\u080a\u0001\u0000\u0000\u0000\u0807"+ + "\u0809\u0007%\u0000\u0000\u0808\u0807\u0001\u0000\u0000\u0000\u0809\u080c"+ + "\u0001\u0000\u0000\u0000\u080a\u0808\u0001\u0000\u0000\u0000\u080a\u080b"+ + "\u0001\u0000\u0000\u0000\u080b\u088f\u0001\u0000\u0000\u0000\u080c\u080a"+ + "\u0001\u0000\u0000\u0000\u080d\u080e\u0005@\u0000\u0000\u080e\u080f\u0007"+ + "\u0006\u0000\u0000\u080f\u0810\u0007\u0015\u0000\u0000\u0810\u0811\u0007"+ + "\n\u0000\u0000\u0811\u0812\u0007\r\u0000\u0000\u0812\u0813\u0005-\u0000"+ + "\u0000\u0813\u0814\u0007\u0006\u0000\u0000\u0814\u0815\u0007\u0010\u0000"+ + "\u0000\u0815\u0816\u0007\u000e\u0000\u0000\u0816\u0817\u0007\u0007\u0000"+ + "\u0000\u0817\u081b\u0001\u0000\u0000\u0000\u0818\u081a\u0007%\u0000\u0000"+ + "\u0819\u0818\u0001\u0000\u0000\u0000\u081a\u081d\u0001\u0000\u0000\u0000"+ + "\u081b\u0819\u0001\u0000\u0000\u0000\u081b\u081c\u0001\u0000\u0000\u0000"+ + "\u081c\u088f\u0001\u0000\u0000\u0000\u081d\u081b\u0001\u0000\u0000\u0000"+ + "\u081e\u081f\u0005@\u0000\u0000\u081f\u0820\u0007\u0013\u0000\u0000\u0820"+ + "\u0821\u0007\u0010\u0000\u0000\u0821\u0822\u0007\u001b\u0000\u0000\u0822"+ + "\u0823\u0007\u0007\u0000\u0000\u0823\u0827\u0001\u0000\u0000\u0000\u0824"+ + "\u0826\u0007%\u0000\u0000\u0825\u0824\u0001\u0000\u0000\u0000\u0826\u0829"+ + "\u0001\u0000\u0000\u0000\u0827\u0825\u0001\u0000\u0000\u0000\u0827\u0828"+ + "\u0001\u0000\u0000\u0000\u0828\u088f\u0001\u0000\u0000\u0000\u0829\u0827"+ + "\u0001\u0000\u0000\u0000\u082a\u082b\u0005@\u0000\u0000\u082b\u082c\u0007"+ + "\t\u0000\u0000\u082c\u082d\u0007\u0011\u0000\u0000\u082d\u082e\u0007\u0013"+ + "\u0000\u0000\u082e\u082f\u0007\u0013\u0000\u0000\u082f\u0830\u0007\u0015"+ + "\u0000\u0000\u0830\u0831\u0007\u0016\u0000\u0000\u0831\u0832\u0007\r\u0000"+ + "\u0000\u0832\u0833\u0007\t\u0000\u0000\u0833\u0837\u0001\u0000\u0000\u0000"+ + "\u0834\u0836\u0007%\u0000\u0000\u0835\u0834\u0001\u0000\u0000\u0000\u0836"+ + "\u0839\u0001\u0000\u0000\u0000\u0837\u0835\u0001\u0000\u0000\u0000\u0837"+ + "\u0838\u0001\u0000\u0000\u0000\u0838\u088f\u0001\u0000\u0000\u0000\u0839"+ + "\u0837\u0001\u0000\u0000\u0000\u083a\u083b\u0005@\u0000\u0000\u083b\u083c"+ + "\u0007\b\u0000\u0000\u083c\u083d\u0007\u0010\u0000\u0000\u083d\u083e\u0007"+ + "\u0014\u0000\u0000\u083e\u083f\u0007\u0007\u0000\u0000\u083f\u0840\u0007"+ + "\u0016\u0000\u0000\u0840\u0844\u0001\u0000\u0000\u0000\u0841\u0843\u0007"+ + "%\u0000\u0000\u0842\u0841\u0001\u0000\u0000\u0000\u0843\u0846\u0001\u0000"+ + "\u0000\u0000\u0844\u0842\u0001\u0000\u0000\u0000\u0844\u0845\u0001\u0000"+ + "\u0000\u0000\u0845\u088f\u0001\u0000\u0000\u0000\u0846\u0844\u0001\u0000"+ + "\u0000\u0000\u0847\u0848\u0005@\u0000\u0000\u0848\u0849\u0007\r\u0000"+ + "\u0000\u0849\u084a\u0007\u0010\u0000\u0000\u084a\u084b\u0007\u0005\u0000"+ + "\u0000\u084b\u084c\u0007\b\u0000\u0000\u084c\u084d\u0007\f\u0000\u0000"+ + "\u084d\u084e\u0007\u0005\u0000\u0000\u084e\u084f\u0007\n\u0000\u0000\u084f"+ + "\u0850\u0007\u000b\u0000\u0000\u0850\u0854\u0001\u0000\u0000\u0000\u0851"+ + "\u0853\u0007%\u0000\u0000\u0852\u0851\u0001\u0000\u0000\u0000\u0853\u0856"+ + "\u0001\u0000\u0000\u0000\u0854\u0852\u0001\u0000\u0000\u0000\u0854\u0855"+ + "\u0001\u0000\u0000\u0000\u0855\u088f\u0001\u0000\u0000\u0000\u0856\u0854"+ + "\u0001\u0000\u0000\u0000\u0857\u0858\u0005@\u0000\u0000\u0858\u0859\u0007"+ + "\u0010\u0000\u0000\u0859\u085a\u0007\u0013\u0000\u0000\u085a\u085b\u0007"+ + "\u0013\u0000\u0000\u085b\u085c\u0007\b\u0000\u0000\u085c\u085d\u0007\u0014"+ + "\u0000\u0000\u085d\u0861\u0001\u0000\u0000\u0000\u085e\u0860\u0007%\u0000"+ + "\u0000\u085f\u085e\u0001\u0000\u0000\u0000\u0860\u0863\u0001\u0000\u0000"+ + "\u0000\u0861\u085f\u0001\u0000\u0000\u0000\u0861\u0862\u0001\u0000\u0000"+ + "\u0000\u0862\u088f\u0001\u0000\u0000\u0000\u0863\u0861\u0001\u0000\u0000"+ + "\u0000\u0864\u0865\u0005@\u0000\u0000\u0865\u0866\u0005-\u0000\u0000\u0866"+ + "\u0867\u0007\f\u0000\u0000\u0867\u0868\u0007\u0007\u0000\u0000\u0868\u0869"+ + "\u0007\u0017\u0000\u0000\u0869\u086a\u0007\u0018\u0000\u0000\u086a\u086b"+ + "\u0007\u0005\u0000\u0000\u086b\u086c\u0007\r\u0000\u0000\u086c\u086d\u0005"+ + "-\u0000\u0000\u086d\u086e\u0007\u0018\u0000\u0000\u086e\u086f\u0007\u0007"+ + "\u0000\u0000\u086f\u0870\u0007\u0014\u0000\u0000\u0870\u0871\u0007\u0006"+ + "\u0000\u0000\u0871\u0872\u0007\u0016\u0000\u0000\u0872\u0873\u0007\u0010"+ + "\u0000\u0000\u0873\u0874\u0007\u0012\u0000\u0000\u0874\u0875\u0007\u0007"+ + "\u0000\u0000\u0875\u0876\u0007\t\u0000\u0000\u0876\u087a\u0001\u0000\u0000"+ + "\u0000\u0877\u0879\u0007%\u0000\u0000\u0878\u0877\u0001\u0000\u0000\u0000"+ + "\u0879\u087c\u0001\u0000\u0000\u0000\u087a\u0878\u0001\u0000\u0000\u0000"+ + "\u087a\u087b\u0001\u0000\u0000\u0000\u087b\u088f\u0001\u0000\u0000\u0000"+ + "\u087c\u087a\u0001\u0000\u0000\u0000\u087d\u087e\u0005@\u0000\u0000\u087e"+ + "\u087f\u0007\u0018\u0000\u0000\u087f\u0880\u0007\u0007\u0000\u0000\u0880"+ + "\u0881\u0007\u0014\u0000\u0000\u0881\u0882\u0007\u0006\u0000\u0000\u0882"+ + "\u0883\u0007\u0016\u0000\u0000\u0883\u0884\u0007\u0010\u0000\u0000\u0884"+ + "\u0885\u0007\u0012\u0000\u0000\u0885\u0886\u0007\u0007\u0000\u0000\u0886"+ + "\u0887\u0007\t\u0000\u0000\u0887\u088b\u0001\u0000\u0000\u0000\u0888\u088a"+ + "\u0007%\u0000\u0000\u0889\u0888\u0001\u0000\u0000\u0000\u088a\u088d\u0001"+ + "\u0000\u0000\u0000\u088b\u0889\u0001\u0000\u0000\u0000\u088b\u088c\u0001"+ + "\u0000\u0000\u0000\u088c\u088f\u0001\u0000\u0000\u0000\u088d\u088b\u0001"+ + "\u0000\u0000\u0000\u088e\u07b0\u0001\u0000\u0000\u0000\u088e\u07b3\u0001"+ + "\u0000\u0000\u0000\u088e\u07b9\u0001\u0000\u0000\u0000\u088e\u07bf\u0001"+ + "\u0000\u0000\u0000\u088e\u07cf\u0001\u0000\u0000\u0000\u088e\u07de\u0001"+ + "\u0000\u0000\u0000\u088e\u07ec\u0001\u0000\u0000\u0000\u088e\u07fd\u0001"+ + "\u0000\u0000\u0000\u088e\u080d\u0001\u0000\u0000\u0000\u088e\u081e\u0001"+ + "\u0000\u0000\u0000\u088e\u082a\u0001\u0000\u0000\u0000\u088e\u083a\u0001"+ + "\u0000\u0000\u0000\u088e\u0847\u0001\u0000\u0000\u0000\u088e\u0857\u0001"+ + "\u0000\u0000\u0000\u088e\u0864\u0001\u0000\u0000\u0000\u088e\u087d\u0001"+ + "\u0000\u0000\u0000\u088f\u0890\u0001\u0000\u0000\u0000\u0890\u0891\u0006"+ + "~\t\u0000\u0891\u010b\u0001\u0000\u0000\u0000\u0892\u0893\u0003\u00fe"+ + "x\u0000\u0893\u0894\u0001\u0000\u0000\u0000\u0894\u0895\u0006\u007f\u0012"+ + "\u0000\u0895\u010d\u0001\u0000\u0000\u0000\u0896\u0897\u0003\u0100y\u0000"+ + "\u0897\u0898\u0001\u0000\u0000\u0000\u0898\u0899\u0006\u0080\u0013\u0000"+ + "\u0899\u010f\u0001\u0000\u0000\u0000\u089a\u089c\u0005\\\u0000\u0000\u089b"+ + "\u089a\u0001\u0000\u0000\u0000\u089b\u089c\u0001\u0000\u0000\u0000\u089c"+ + "\u08a0\u0001\u0000\u0000\u0000\u089d\u089e\u0003\u00f0q\u0000\u089e\u089f"+ + "\u0005\\\u0000\u0000\u089f\u08a1\u0001\u0000\u0000\u0000\u08a0\u089d\u0001"+ + "\u0000\u0000\u0000\u08a1\u08a2\u0001\u0000\u0000\u0000\u08a2\u08a0\u0001"+ + "\u0000\u0000\u0000\u08a2\u08a3\u0001\u0000\u0000\u0000\u08a3\u08a4\u0001"+ + "\u0000\u0000\u0000\u08a4\u08a5\u0006\u0081\u0014\u0000\u08a5\u0111\u0001"+ + "\u0000\u0000\u0000\u08a6\u08a7\u0003\u00f0q\u0000\u08a7\u08a8\u0001\u0000"+ + "\u0000\u0000\u08a8\u08a9\u0006\u0082\u0015\u0000\u08a9\u0113\u0001\u0000"+ + "\u0000\u0000\u08aa\u08ab\u0005:\u0000\u0000\u08ab\u08ac\u0005:\u0000\u0000"+ + "\u08ac\u08ad\u0001\u0000\u0000\u0000\u08ad\u08ae\u0006\u0083\u0016\u0000"+ + "\u08ae\u0115\u0001\u0000\u0000\u0000\u08af\u08b0\u0005}\u0000\u0000\u08b0"+ + "\u08b1\u0005}\u0000\u0000\u08b1\u08b2\u0001\u0000\u0000\u0000\u08b2\u08b3"+ + "\u0006\u0084\u0017\u0000\u08b3\u0117\u0001\u0000\u0000\u0000\u08b4\u08b5"+ + "\u0005(\u0000\u0000\u08b5\u08b6\u0001\u0000\u0000\u0000\u08b6\u08b7\u0006"+ + "\u0085\u0018\u0000\u08b7\u0119\u0001\u0000\u0000\u0000\u08b8\u08b9\u0005"+ + ")\u0000\u0000\u08b9\u08ba\u0001\u0000\u0000\u0000\u08ba\u08bb\u0006\u0086"+ + "\u0019\u0000\u08bb\u011b\u0001\u0000\u0000\u0000\u08bc\u08bd\u0005-\u0000"+ + "\u0000\u08bd\u08be\u0005>\u0000\u0000\u08be\u08bf\u0001\u0000\u0000\u0000"+ + "\u08bf\u08c0\u0006\u0087\u001a\u0000\u08c0\u011d\u0001\u0000\u0000\u0000"+ + "\u08c1\u08c2\t\u0000\u0000\u0000\u08c2\u08c3\u0001\u0000\u0000\u0000\u08c3"+ + "\u08c4\u0006\u0088\r\u0000\u08c4\u011f\u0001\u0000\u0000\u0000\u08c5\u08c6"+ + "\u0005\u0000\u0000\u0001\u08c6\u08c7\u0001\u0000\u0000\u0000\u08c7\u08c8"+ + "\u0006\u0089\u001b\u0000\u08c8\u08c9\u0006\u0089\u0017\u0000\u08c9\u0121"+ + "\u0001\u0000\u0000\u0000\u08ca\u08cb\u0003\u00fex\u0000\u08cb\u08cc\u0001"+ + "\u0000\u0000\u0000\u08cc\u08cd\u0006\u008a\u0012\u0000\u08cd\u0123\u0001"+ + "\u0000\u0000\u0000\u08ce\u08cf\u0003\u0100y\u0000\u08cf\u08d0\u0001\u0000"+ + "\u0000\u0000\u08d0\u08d1\u0006\u008b\u0013\u0000\u08d1\u0125\u0001\u0000"+ + "\u0000\u0000\u08d2\u08d4\u0005\\\u0000\u0000\u08d3\u08d2\u0001\u0000\u0000"+ + "\u0000\u08d3\u08d4\u0001\u0000\u0000\u0000\u08d4\u08d8\u0001\u0000\u0000"+ + "\u0000\u08d5\u08d6\u0003\u00f0q\u0000\u08d6\u08d7\u0005\\\u0000\u0000"+ + "\u08d7\u08d9\u0001\u0000\u0000\u0000\u08d8\u08d5\u0001\u0000\u0000\u0000"+ + "\u08d9\u08da\u0001\u0000\u0000\u0000\u08da\u08d8\u0001\u0000\u0000\u0000"+ + "\u08da\u08db\u0001\u0000\u0000\u0000\u08db\u08dc\u0001\u0000\u0000\u0000"+ + "\u08dc\u08dd\u0006\u008c\u0014\u0000\u08dd\u0127\u0001\u0000\u0000\u0000"+ + "\u08de\u08df\u0003\u00f0q\u0000\u08df\u08e0\u0001\u0000\u0000\u0000\u08e0"+ + "\u08e1\u0006\u008d\u0015\u0000\u08e1\u0129\u0001\u0000\u0000\u0000\u08e2"+ + "\u08e3\u0005:\u0000\u0000\u08e3\u08e4\u0005:\u0000\u0000\u08e4\u08e5\u0001"+ + "\u0000\u0000\u0000\u08e5\u08e6\u0006\u008e\u0016\u0000\u08e6\u012b\u0001"+ + "\u0000\u0000\u0000\u08e7\u08e8\u0005!\u0000\u0000\u08e8\u08e9\u0005!\u0000"+ + "\u0000\u08e9\u08ea\u0005}\u0000\u0000\u08ea\u08eb\u0001\u0000\u0000\u0000"+ + "\u08eb\u08ec\u0006\u008f\u0017\u0000\u08ec\u012d\u0001\u0000\u0000\u0000"+ + "\u08ed\u08ee\u0005(\u0000\u0000\u08ee\u08ef\u0001\u0000\u0000\u0000\u08ef"+ + "\u08f0\u0006\u0090\u0018\u0000\u08f0\u012f\u0001\u0000\u0000\u0000\u08f1"+ + "\u08f2\u0005)\u0000\u0000\u08f2\u08f3\u0001\u0000\u0000\u0000\u08f3\u08f4"+ + "\u0006\u0091\u0019\u0000\u08f4\u0131\u0001\u0000\u0000\u0000\u08f5\u08f6"+ + "\u0005-\u0000\u0000\u08f6\u08f7\u0005>\u0000\u0000\u08f7\u08f8\u0001\u0000"+ + "\u0000\u0000\u08f8\u08f9\u0006\u0092\u001a\u0000\u08f9\u0133\u0001\u0000"+ + "\u0000\u0000\u08fa\u08fb\t\u0000\u0000\u0000\u08fb\u08fc\u0001\u0000\u0000"+ + "\u0000\u08fc\u08fd\u0006\u0093\r\u0000\u08fd\u0135\u0001\u0000\u0000\u0000"+ + "\u08fe\u08ff\u0005\u0000\u0000\u0001\u08ff\u0900\u0001\u0000\u0000\u0000"+ + "\u0900\u0901\u0006\u0094\u001b\u0000\u0901\u0902\u0006\u0094\u0017\u0000"+ + "\u0902\u0137\u0001\u0000\u0000\u0000\u0903\u0905\u0007%\u0000\u0000\u0904"+ + "\u0903\u0001\u0000\u0000\u0000\u0905\u0906\u0001\u0000\u0000\u0000\u0906"+ + "\u0904\u0001\u0000\u0000\u0000\u0906\u0907\u0001\u0000\u0000\u0000\u0907"+ + "\u0908\u0001\u0000\u0000\u0000\u0908\u0909\u0004\u0095\u0007\u0000\u0909"+ + "\u090a\u0001\u0000\u0000\u0000\u090a\u090b\u0006\u0095\r\u0000\u090b\u090c"+ + "\u0006\u0095\u0017\u0000\u090c\u0139\u0001\u0000\u0000\u0000\u090d\u090f"+ + "\u0007%\u0000\u0000\u090e\u090d\u0001\u0000\u0000\u0000\u090f\u0910\u0001"+ + "\u0000\u0000\u0000\u0910\u090e\u0001\u0000\u0000\u0000\u0910\u0911\u0001"+ + "\u0000\u0000\u0000\u0911\u0912\u0001\u0000\u0000\u0000\u0912\u0913\u0006"+ + "\u0096\r\u0000\u0913\u013b\u0001\u0000\u0000\u0000\u0914\u0915\u0005("+ + "\u0000\u0000\u0915\u0916\u0001\u0000\u0000\u0000\u0916\u0917\u0006\u0097"+ + "\u001c\u0000\u0917\u0918\u0006\u0097\u001d\u0000\u0918\u013d\u0001\u0000"+ + "\u0000\u0000\u0919\u091a\t\u0000\u0000\u0000\u091a\u091b\u0004\u0098\b"+ + "\u0000\u091b\u091c\u0001\u0000\u0000\u0000\u091c\u091d\u0006\u0098\t\u0000"+ + "\u091d\u091e\u0006\u0098\u0017\u0000\u091e\u013f\u0001\u0000\u0000\u0000"+ + "\u091f\u0920\t\u0000\u0000\u0000\u0920\u0921\u0001\u0000\u0000\u0000\u0921"+ + "\u0922\u0006\u0099\t\u0000\u0922\u0923\u0006\u0099\u0017\u0000\u0923\u0141"+ + "\u0001\u0000\u0000\u0000\u0924\u0925\u0004\u009a\t\u0000\u0925\u0926\u0005"+ + "(\u0000\u0000\u0926\u0927\u0006\u009a\u001e\u0000\u0927\u0928\u0001\u0000"+ + "\u0000\u0000\u0928\u0929\u0006\u009a\u001c\u0000\u0929\u0143\u0001\u0000"+ + "\u0000\u0000\u092a\u092b\u0004\u009b\n\u0000\u092b\u092c\u0005)\u0000"+ + "\u0000\u092c\u092d\u0006\u009b\u001f\u0000\u092d\u092e\u0001\u0000\u0000"+ + "\u0000\u092e\u092f\u0006\u009b \u0000\u092f\u0930\u0006\u009b!\u0000\u0930"+ + "\u0145\u0001\u0000\u0000\u0000\u0931\u0932\u0004\u009c\u000b\u0000\u0932"+ + "\u0933\u0005(\u0000\u0000\u0933\u0934\u0006\u009c\"\u0000\u0934\u0935"+ + "\u0001\u0000\u0000\u0000\u0935\u0936\u0006\u009c\u001c\u0000\u0936\u0147"+ + "\u0001\u0000\u0000\u0000\u0937\u0938\u0004\u009d\f\u0000\u0938\u0939\u0005"+ + ")\u0000\u0000\u0939\u093a\u0006\u009d#\u0000\u093a\u093b\u0001\u0000\u0000"+ + "\u0000\u093b\u093c\u0006\u009d\u001c\u0000\u093c\u0149\u0001\u0000\u0000"+ + "\u0000\u093d\u093e\u0005)\u0000\u0000\u093e\u093f\u0004\u009e\r\u0000"+ + "\u093f\u0940\u0001\u0000\u0000\u0000\u0940\u0941\u0006\u009e \u0000\u0941"+ + "\u0942\u0006\u009e!\u0000\u0942\u014b\u0001\u0000\u0000\u0000\u0943\u0944"+ + "\t\u0000\u0000\u0000\u0944\u0945\u0001\u0000\u0000\u0000\u0945\u0946\u0006"+ + "\u009f\u001c\u0000\u0946\u014d\u0001\u0000\u0000\u0000\u0947\u0948\u0005"+ + "\u0000\u0000\u0001\u0948\u0949\u0001\u0000\u0000\u0000\u0949\u094a\u0006"+ + "\u00a0\u001b\u0000\u094a\u094b\u0006\u00a0\u0017\u0000\u094b\u014f\u0001"+ + "\u0000\u0000\u0000\u094c\u094e\u0007%\u0000\u0000\u094d\u094c\u0001\u0000"+ + "\u0000\u0000\u094e\u094f\u0001\u0000\u0000\u0000\u094f\u094d\u0001\u0000"+ + "\u0000\u0000\u094f\u0950\u0001\u0000\u0000\u0000\u0950\u0951\u0001\u0000"+ + "\u0000\u0000\u0951\u0952\u0006\u00a1\r\u0000\u0952\u0151\u0001\u0000\u0000"+ + "\u0000\u0953\u0954\u0005(\u0000\u0000\u0954\u0955\u0006\u00a2$\u0000\u0955"+ + "\u0956\u0001\u0000\u0000\u0000\u0956\u0957\u0006\u00a2%\u0000\u0957\u0153"+ + "\u0001\u0000\u0000\u0000\u0958\u0959\t\u0000\u0000\u0000\u0959\u095a\u0001"+ + "\u0000\u0000\u0000\u095a\u095b\u0006\u00a3\t\u0000\u095b\u095c\u0006\u00a3"+ + "\u0017\u0000\u095c\u0155\u0001\u0000\u0000\u0000\u095d\u095e\u0005[\u0000"+ + "\u0000\u095e\u095f\u0006\u00a4&\u0000\u095f\u0960\u0001\u0000\u0000\u0000"+ + "\u0960\u0961\u0006\u00a4\'\u0000\u0961\u0157\u0001\u0000\u0000\u0000\u0962"+ + "\u0963\u0005]\u0000\u0000\u0963\u0964\u0006\u00a5(\u0000\u0964\u0965\u0001"+ + "\u0000\u0000\u0000\u0965\u0966\u0006\u00a5)\u0000\u0966\u0159\u0001\u0000"+ + "\u0000\u0000\u0967\u0968\u0005{\u0000\u0000\u0968\u0969\u0006\u00a6*\u0000"+ + "\u0969\u096a\u0001\u0000\u0000\u0000\u096a\u096b\u0006\u00a6 \u0000\u096b"+ + "\u015b\u0001\u0000\u0000\u0000\u096c\u096d\u0005}\u0000\u0000\u096d\u096e"+ + "\u0006\u00a7+\u0000\u096e\u096f\u0001\u0000\u0000\u0000\u096f\u0970\u0006"+ + "\u00a7 \u0000\u0970\u015d\u0001\u0000\u0000\u0000\u0971\u0974\u0003\u00f8"+ + "u\u0000\u0972\u0974\u0003\u00fav\u0000\u0973\u0971\u0001\u0000\u0000\u0000"+ + "\u0973\u0972\u0001\u0000\u0000\u0000\u0974\u015f\u0001\u0000\u0000\u0000"+ + "\u0975\u0976\u0003\u00fex\u0000\u0976\u0977\u0001\u0000\u0000\u0000\u0977"+ + "\u0978\u0006\u00a9\u0012\u0000\u0978\u0161\u0001\u0000\u0000\u0000\u0979"+ + "\u097a\u0003\u0100y\u0000\u097a\u097b\u0001\u0000\u0000\u0000\u097b\u097c"+ + "\u0006\u00aa\u0013\u0000\u097c\u0163\u0001\u0000\u0000\u0000\u097d\u097f"+ + "\u0005\\\u0000\u0000\u097e\u097d\u0001\u0000\u0000\u0000\u097e\u097f\u0001"+ + "\u0000"; + private static final String _serializedATNSegment1 = + "\u0000\u0000\u097f\u0983\u0001\u0000\u0000\u0000\u0980\u0981\u0003\u00f0"+ + "q\u0000\u0981\u0982\u0005\\\u0000\u0000\u0982\u0984\u0001\u0000\u0000"+ + "\u0000\u0983\u0980\u0001\u0000\u0000\u0000\u0984\u0985\u0001\u0000\u0000"+ + "\u0000\u0985\u0983\u0001\u0000\u0000\u0000\u0985\u0986\u0001\u0000\u0000"+ + "\u0000\u0986\u0987\u0001\u0000\u0000\u0000\u0987\u0988\u0006\u00ab\u0014"+ + "\u0000\u0988\u0165\u0001\u0000\u0000\u0000\u0989\u098a\u0003\u00f0q\u0000"+ + "\u098a\u098b\u0001\u0000\u0000\u0000\u098b\u098c\u0006\u00ac\u0015\u0000"+ + "\u098c\u0167\u0001\u0000\u0000\u0000\u098d\u098e\u0005:\u0000\u0000\u098e"+ + "\u098f\u0005:\u0000\u0000\u098f\u0990\u0001\u0000\u0000\u0000\u0990\u0991"+ + "\u0006\u00ad\u0016\u0000\u0991\u0169\u0001\u0000\u0000\u0000\u0992\u0993"+ + "\u0005(\u0000\u0000\u0993\u0994\u0006\u00ae,\u0000\u0994\u0995\u0001\u0000"+ + "\u0000\u0000\u0995\u0996\u0006\u00ae\u0018\u0000\u0996\u016b\u0001\u0000"+ + "\u0000\u0000\u0997\u0998\u0005)\u0000\u0000\u0998\u0999\u0006\u00af-\u0000"+ + "\u0999\u016d\u0001\u0000\u0000\u0000\u099a\u099b\t\u0000\u0000\u0000\u099b"+ + "\u099c\u0001\u0000\u0000\u0000\u099c\u099d\u0006\u00b0\r\u0000\u099d\u016f"+ + "\u0001\u0000\u0000\u0000\u099e\u099f\u0005\u0000\u0000\u0001\u099f\u09a0"+ + "\u0001\u0000\u0000\u0000\u09a0\u09a1\u0006\u00b1\u001b\u0000\u09a1\u09a2"+ + "\u0006\u00b1\u0017\u0000\u09a2\u0171\u0001\u0000\u0000\u0000\u09a3\u09a5"+ + "\u0007%\u0000\u0000\u09a4\u09a3\u0001\u0000\u0000\u0000\u09a5\u09a6\u0001"+ + "\u0000\u0000\u0000\u09a6\u09a4\u0001\u0000\u0000\u0000\u09a6\u09a7\u0001"+ + "\u0000\u0000\u0000\u09a7\u09a8\u0001\u0000\u0000\u0000\u09a8\u09a9\u0006"+ + "\u00b2\r\u0000\u09a9\u0173\u0001\u0000\u0000\u0000\u09aa\u09ab\u0005("+ + "\u0000\u0000\u09ab\u09ac\u0006\u00b3.\u0000\u09ac\u09ad\u0001\u0000\u0000"+ + "\u0000\u09ad\u09ae\u0006\u00b3/\u0000\u09ae\u09af\u0006\u00b30\u0000\u09af"+ + "\u0175\u0001\u0000\u0000\u0000\u09b0\u09b1\t\u0000\u0000\u0000\u09b1\u09b2"+ + "\u0001\u0000\u0000\u0000\u09b2\u09b3\u0006\u00b4\t\u0000\u09b3\u09b4\u0006"+ + "\u00b4\u0017\u0000\u09b4\u0177\u0001\u0000\u0000\u0000\u09b5\u09b7\u0007"+ + "%\u0000\u0000\u09b6\u09b5\u0001\u0000\u0000\u0000\u09b7\u09b8\u0001\u0000"+ + "\u0000\u0000\u09b8\u09b6\u0001\u0000\u0000\u0000\u09b8\u09b9\u0001\u0000"+ + "\u0000\u0000\u09b9\u09ba\u0001\u0000\u0000\u0000\u09ba\u09bb\u0006\u00b5"+ + "\r\u0000\u09bb\u0179\u0001\u0000\u0000\u0000\u09bc\u09bd\u0005(\u0000"+ + "\u0000\u09bd\u09be\u0006\u00b61\u0000\u09be\u017b\u0001\u0000\u0000\u0000"+ + "\u09bf\u09c0\u0005)\u0000\u0000\u09c0\u09c1\u0006\u00b72\u0000\u09c1\u017d"+ + "\u0001\u0000\u0000\u0000\u09c2\u09c3\u0007\u0010\u0000\u0000\u09c3\u09c4"+ + "\u0007\t\u0000\u0000\u09c4\u017f\u0001\u0000\u0000\u0000\u09c5\u09c6\u0003"+ + "\u00fex\u0000\u09c6\u09c7\u0001\u0000\u0000\u0000\u09c7\u09c8\u0006\u00b9"+ + "\u0012\u0000\u09c8\u0181\u0001\u0000\u0000\u0000\u09c9\u09ca\u0005=\u0000"+ + "\u0000\u09ca\u09cb\u0005>\u0000\u0000\u09cb\u0183\u0001\u0000\u0000\u0000"+ + "\u09cc\u09cd\u0003\u0100y\u0000\u09cd\u09ce\u0001\u0000\u0000\u0000\u09ce"+ + "\u09cf\u0006\u00bb \u0000\u09cf\u0185\u0001\u0000\u0000\u0000\u09d0\u09d4"+ + "\u0003\u00f8u\u0000\u09d1\u09d4\u0003\u00fav\u0000\u09d2\u09d4\u0003\u00f0"+ + "q\u0000\u09d3\u09d0\u0001\u0000\u0000\u0000\u09d3\u09d1\u0001\u0000\u0000"+ + "\u0000\u09d3\u09d2\u0001\u0000\u0000\u0000\u09d4\u09d5\u0001\u0000\u0000"+ + "\u0000\u09d5\u09d6\u0006\u00bc \u0000\u09d6\u0187\u0001\u0000\u0000\u0000"+ + "\u09d7\u09d8\u0005:\u0000\u0000\u09d8\u09d9\u0005:\u0000\u0000\u09d9\u09da"+ + "\u0001\u0000\u0000\u0000\u09da\u09db\u0006\u00bd \u0000\u09db\u0189\u0001"+ + "\u0000\u0000\u0000\u09dc\u09dd\t\u0000\u0000\u0000\u09dd\u09de\u0001\u0000"+ + "\u0000\u0000\u09de\u09df\u0006\u00be \u0000\u09df\u018b\u0001\u0000\u0000"+ + "\u0000\u09e0\u09e1\u0005\u0000\u0000\u0001\u09e1\u09e2\u0001\u0000\u0000"+ + "\u0000\u09e2\u09e3\u0006\u00bf\u001b\u0000\u09e3\u09e4\u0006\u00bf\u0017"+ + "\u0000\u09e4\u018d\u0001\u0000\u0000\u0000\u09e5\u09e6\u0003\u00fcw\u0000"+ + "\u09e6\u09e7\u0001\u0000\u0000\u0000\u09e7\u09e8\u0006\u00c03\u0000\u09e8"+ + "\u018f\u0001\u0000\u0000\u0000\u09e9\u09ea\u0005[\u0000\u0000\u09ea\u09eb"+ + "\u0006\u00c14\u0000\u09eb\u0191\u0001\u0000\u0000\u0000\u09ec\u09ed\u0005"+ + "]\u0000\u0000\u09ed\u09ee\u0006\u00c25\u0000\u09ee\u0193\u0001\u0000\u0000"+ + "\u0000\u09ef\u09f0\u0005{\u0000\u0000\u09f0\u09f1\u0006\u00c36\u0000\u09f1"+ + "\u09f2\u0001\u0000\u0000\u0000\u09f2\u09f3\u0006\u00c37\u0000\u09f3\u0195"+ + "\u0001\u0000\u0000\u0000\u09f4\u09f5\u0005}\u0000\u0000\u09f5\u09f6\u0006"+ + "\u00c48\u0000\u09f6\u09f7\u0001\u0000\u0000\u0000\u09f7\u09f8\u0006\u00c4"+ + "7\u0000\u09f8\u0197\u0001\u0000\u0000\u0000\u09f9\u09fa\u0005(\u0000\u0000"+ + "\u09fa\u09fb\u0006\u00c59\u0000\u09fb\u09fc\u0001\u0000\u0000\u0000\u09fc"+ + "\u09fd\u0006\u00c57\u0000\u09fd\u0199\u0001\u0000\u0000\u0000\u09fe\u09ff"+ + "\u0005)\u0000\u0000\u09ff\u0a00\u0006\u00c6:\u0000\u0a00\u019b\u0001\u0000"+ + "\u0000\u0000\u0a01\u0a04\u0003\u00f8u\u0000\u0a02\u0a04\u0003\u00fav\u0000"+ + "\u0a03\u0a01\u0001\u0000\u0000\u0000\u0a03\u0a02\u0001\u0000\u0000\u0000"+ + "\u0a04\u019d\u0001\u0000\u0000\u0000\u0a05\u0a06\u0003\u00fex\u0000\u0a06"+ + "\u0a07\u0001\u0000\u0000\u0000\u0a07\u0a08\u0006\u00c8\u0012\u0000\u0a08"+ + "\u019f\u0001\u0000\u0000\u0000\u0a09\u0a0a\u0005=\u0000\u0000\u0a0a\u0a0b"+ + "\u0005>\u0000\u0000\u0a0b\u01a1\u0001\u0000\u0000\u0000\u0a0c\u0a0d\u0003"+ + "\u0100y\u0000\u0a0d\u0a0e\u0001\u0000\u0000\u0000\u0a0e\u0a0f\u0006\u00ca"+ + "\u0013\u0000\u0a0f\u01a3\u0001\u0000\u0000\u0000\u0a10\u0a11\u0005.\u0000"+ + "\u0000\u0a11\u01a5\u0001\u0000\u0000\u0000\u0a12\u0a13\u0005,\u0000\u0000"+ + "\u0a13\u0a14\u0006\u00cc;\u0000\u0a14\u01a7\u0001\u0000\u0000\u0000\u0a15"+ + "\u0a17\u0007&\u0000\u0000\u0a16\u0a15\u0001\u0000\u0000\u0000\u0a17\u0a18"+ + "\u0001\u0000\u0000\u0000\u0a18\u0a16\u0001\u0000\u0000\u0000\u0a18\u0a19"+ + "\u0001\u0000\u0000\u0000\u0a19\u0a1a\u0001\u0000\u0000\u0000\u0a1a\u0a1b"+ + "\u0006\u00cd\r\u0000\u0a1b\u01a9\u0001\u0000\u0000\u0000\u0a1c\u0a1d\u0003"+ + "\u00f0q\u0000\u0a1d\u01ab\u0001\u0000\u0000\u0000\u0a1e\u0a1f\t\u0000"+ + "\u0000\u0000\u0a1f\u0a20\u0001\u0000\u0000\u0000\u0a20\u0a21\u0006\u00cf"+ + "7\u0000\u0a21\u01ad\u0001\u0000\u0000\u0000\u0a22\u0a23\u0005\u0000\u0000"+ + "\u0001\u0a23\u0a24\u0001\u0000\u0000\u0000\u0a24\u0a25\u0006\u00d0\u001b"+ + "\u0000\u0a25\u0a26\u0006\u00d0\u0017\u0000\u0a26\u01af\u0001\u0000\u0000"+ + "\u0000\u0a27\u0a28\u0005/\u0000\u0000\u0a28\u0a29\u0005/\u0000\u0000\u0a29"+ + "\u0a2b\u0001\u0000\u0000\u0000\u0a2a\u0a2c\b\u001f\u0000\u0000\u0a2b\u0a2a"+ + "\u0001\u0000\u0000\u0000\u0a2c\u0a2d\u0001\u0000\u0000\u0000\u0a2d\u0a2b"+ + "\u0001\u0000\u0000\u0000\u0a2d\u0a2e\u0001\u0000\u0000\u0000\u0a2e\u0a2f"+ + "\u0001\u0000\u0000\u0000\u0a2f\u0a30\u0006\u00d1\r\u0000\u0a30\u01b1\u0001"+ + "\u0000\u0000\u0000\u0a31\u0a32\u0005/\u0000\u0000\u0a32\u0a33\u0005*\u0000"+ + "\u0000\u0a33\u0a37\u0001\u0000\u0000\u0000\u0a34\u0a36\t\u0000\u0000\u0000"+ + "\u0a35\u0a34\u0001\u0000\u0000\u0000\u0a36\u0a39\u0001\u0000\u0000\u0000"+ + "\u0a37\u0a38\u0001\u0000\u0000\u0000\u0a37\u0a35\u0001\u0000\u0000\u0000"+ + "\u0a38\u0a3a\u0001\u0000\u0000\u0000\u0a39\u0a37\u0001\u0000\u0000\u0000"+ + "\u0a3a\u0a3b\u0005*\u0000\u0000\u0a3b\u0a3c\u0005/\u0000\u0000\u0a3c\u0a40"+ + "\u0001\u0000\u0000\u0000\u0a3d\u0a3f\u0007\u001f\u0000\u0000\u0a3e\u0a3d"+ + "\u0001\u0000\u0000\u0000\u0a3f\u0a42\u0001\u0000\u0000\u0000\u0a40\u0a3e"+ + "\u0001\u0000\u0000\u0000\u0a40\u0a41\u0001\u0000\u0000\u0000\u0a41\u0a43"+ + "\u0001\u0000\u0000\u0000\u0a42\u0a40\u0001\u0000\u0000\u0000\u0a43\u0a44"+ + "\u0006\u00d2\r\u0000\u0a44\u01b3\u0001\u0000\u0000\u0000\u0a45\u0a46\u0005"+ + "@\u0000\u0000\u0a46\u0a47\u0007\u0007\u0000\u0000\u0a47\u0a48\u0007\n"+ + "\u0000\u0000\u0a48\u0a49\u0007\u000b\u0000\u0000\u0a49\u0a4a\u0007\u0013"+ + "\u0000\u0000\u0a4a\u0a4b\u0007\u000f\u0000\u0000\u0a4b\u0a4c\u0007\u0013"+ + "\u0000\u0000\u0a4c\u0a4d\u0001\u0000\u0000\u0000\u0a4d\u0a4e\u0006\u00d3"+ + "\u0017\u0000\u0a4e\u01b5\u0001\u0000\u0000\u0000\u0a4f\u0a50\u0005@\u0000"+ + "\u0000\u0a50\u0a51\u0001\u0000\u0000\u0000\u0a51\u0a52\u0006\u00d4\t\u0000"+ + "\u0a52\u0a53\u0006\u00d4\u0017\u0000\u0a53\u01b7\u0001\u0000\u0000\u0000"+ + "\u0a54\u0a55\u0005[\u0000\u0000\u0a55\u0a56\u0001\u0000\u0000\u0000\u0a56"+ + "\u0a57\u0006\u00d5 \u0000\u0a57\u01b9\u0001\u0000\u0000\u0000\u0a58\u0a59"+ + "\u0005]\u0000\u0000\u0a59\u0a5a\u0001\u0000\u0000\u0000\u0a5a\u0a5b\u0006"+ + "\u00d6 \u0000\u0a5b\u01bb\u0001\u0000\u0000\u0000\u0a5c\u0a5d\u0005{\u0000"+ + "\u0000\u0a5d\u0a5e\u0001\u0000\u0000\u0000\u0a5e\u0a5f\u0006\u00d7 \u0000"+ + "\u0a5f\u01bd\u0001\u0000\u0000\u0000\u0a60\u0a61\u0005}\u0000\u0000\u0a61"+ + "\u0a62\u0001\u0000\u0000\u0000\u0a62\u0a63\u0006\u00d8 \u0000\u0a63\u01bf"+ + "\u0001\u0000\u0000\u0000\u0a64\u0a67\u0003\u00f8u\u0000\u0a65\u0a67\u0003"+ + "\u00fav\u0000\u0a66\u0a64\u0001\u0000\u0000\u0000\u0a66\u0a65\u0001\u0000"+ + "\u0000\u0000\u0a67\u0a68\u0001\u0000\u0000\u0000\u0a68\u0a69\u0006\u00d9"+ + "<\u0000\u0a69\u01c1\u0001\u0000\u0000\u0000\u0a6a\u0a6b\u0003\u00fex\u0000"+ + "\u0a6b\u0a6c\u0001\u0000\u0000\u0000\u0a6c\u0a6d\u0006\u00da\u0012\u0000"+ + "\u0a6d\u01c3\u0001\u0000\u0000\u0000\u0a6e\u0a6f\u0007\n\u0000\u0000\u0a6f"+ + "\u0a70\u0007\u0007\u0000\u0000\u0a70\u0a71\u0007\f\u0000\u0000\u0a71\u0a72"+ + "\u0001\u0000\u0000\u0000\u0a72\u0a73\u0004\u00db\u000e\u0000\u0a73\u0a74"+ + "\u0001\u0000\u0000\u0000\u0a74\u0a75\u0006\u00db=\u0000\u0a75\u01c5\u0001"+ + "\u0000\u0000\u0000\u0a76\u0a77\u0007\u000e\u0000\u0000\u0a77\u0a78\u0007"+ + "\b\u0000\u0000\u0a78\u0a79\u0007\u0010\u0000\u0000\u0a79\u0a7a\u0007\t"+ + "\u0000\u0000\u0a7a\u0a7b\u0007\t\u0000\u0000\u0a7b\u0a7c\u0001\u0000\u0000"+ + "\u0000\u0a7c\u0a7d\u0006\u00dc>\u0000\u0a7d\u01c7\u0001\u0000\u0000\u0000"+ + "\u0a7e\u0a7f\u0003\u0100y\u0000\u0a7f\u0a80\u0001\u0000\u0000\u0000\u0a80"+ + "\u0a81\u0006\u00dd\u0013\u0000\u0a81\u01c9\u0001\u0000\u0000\u0000\u0a82"+ + "\u0a84\u0005\\\u0000\u0000\u0a83\u0a82\u0001\u0000\u0000\u0000\u0a83\u0a84"+ + "\u0001\u0000\u0000\u0000\u0a84\u0a88\u0001\u0000\u0000\u0000\u0a85\u0a86"+ + "\u0003\u00f0q\u0000\u0a86\u0a87\u0005\\\u0000\u0000\u0a87\u0a89\u0001"+ + "\u0000\u0000\u0000\u0a88\u0a85\u0001\u0000\u0000\u0000\u0a89\u0a8a\u0001"+ + "\u0000\u0000\u0000\u0a8a\u0a88\u0001\u0000\u0000\u0000\u0a8a\u0a8b\u0001"+ + "\u0000\u0000\u0000\u0a8b\u0a8c\u0001\u0000\u0000\u0000\u0a8c\u0a8d\u0006"+ + "\u00de\u0014\u0000\u0a8d\u01cb\u0001\u0000\u0000\u0000\u0a8e\u0a8f\u0005"+ + "\\\u0000\u0000\u0a8f\u0a90\u0003\u00f0q\u0000\u0a90\u0a91\u0001\u0000"+ + "\u0000\u0000\u0a91\u0a92\u0006\u00df\u0015\u0000\u0a92\u01cd\u0001\u0000"+ + "\u0000\u0000\u0a93\u0a94\u0003\u00f0q\u0000\u0a94\u0a95\u0001\u0000\u0000"+ + "\u0000\u0a95\u0a96\u0006\u00e0\u0015\u0000\u0a96\u01cf\u0001\u0000\u0000"+ + "\u0000\u0a97\u0a98\u0005:\u0000\u0000\u0a98\u0a99\u0005:\u0000\u0000\u0a99"+ + "\u0a9a\u0001\u0000\u0000\u0000\u0a9a\u0a9b\u0006\u00e1\u0016\u0000\u0a9b"+ + "\u01d1\u0001\u0000\u0000\u0000\u0a9c\u0a9d\u0005(\u0000\u0000\u0a9d\u0a9e"+ + "\u0001\u0000\u0000\u0000\u0a9e\u0a9f\u0006\u00e2\u0018\u0000\u0a9f\u01d3"+ + "\u0001\u0000\u0000\u0000\u0aa0\u0aa1\u0005)\u0000\u0000\u0aa1\u0aa2\u0001"+ + "\u0000\u0000\u0000\u0aa2\u0aa3\u0006\u00e3\u0019\u0000\u0aa3\u01d5\u0001"+ + "\u0000\u0000\u0000\u0aa4\u0aa5\u0005 \u0000\u0000\u0aa5\u0aa6\u0001\u0000"+ + "\u0000\u0000\u0aa6\u0aa7\u0006\u00e4\r\u0000\u0aa7\u01d7\u0001\u0000\u0000"+ + "\u0000\u0aa8\u0aa9\u0005\u0000\u0000\u0001\u0aa9\u0aaa\u0001\u0000\u0000"+ + "\u0000\u0aaa\u0aab\u0006\u00e5\u001b\u0000\u0aab\u0aac\u0006\u00e5\u0017"+ + "\u0000\u0aac\u01d9\u0001\u0000\u0000\u0000\u0aad\u0aae\t\u0000\u0000\u0000"+ + "\u0aae\u0aaf\u0001\u0000\u0000\u0000\u0aaf\u0ab0\u0006\u00e6\r\u0000\u0ab0"+ + "\u01db\u0001\u0000\u0000\u0000\u0ab1\u0ab2\u0005?\u0000\u0000\u0ab2\u0ab3"+ + "\u0005>\u0000\u0000\u0ab3\u0ab4\u0001\u0000\u0000\u0000\u0ab4\u0ab5\u0006"+ + "\u00e7\u0017\u0000\u0ab5\u01dd\u0001\u0000\u0000\u0000\u0ab6\u0ab7\u0005"+ + "/\u0000\u0000\u0ab7\u0ab8\u0005/\u0000\u0000\u0ab8\u0aba\u0001\u0000\u0000"+ + "\u0000\u0ab9\u0abb\b\u001f\u0000\u0000\u0aba\u0ab9\u0001\u0000\u0000\u0000"+ + "\u0abb\u0abc\u0001\u0000\u0000\u0000\u0abc\u0aba\u0001\u0000\u0000\u0000"+ + "\u0abc\u0abd\u0001\u0000\u0000\u0000\u0abd\u0abe\u0001\u0000\u0000\u0000"+ + "\u0abe\u0abf\u0006\u00e8\r\u0000\u0abf\u01df\u0001\u0000\u0000\u0000\u0ac0"+ + "\u0ac1\u0005/\u0000\u0000\u0ac1\u0ac2\u0005*\u0000\u0000\u0ac2\u0ac6\u0001"+ + "\u0000\u0000\u0000\u0ac3\u0ac5\t\u0000\u0000\u0000\u0ac4\u0ac3\u0001\u0000"+ + "\u0000\u0000\u0ac5\u0ac8\u0001\u0000\u0000\u0000\u0ac6\u0ac7\u0001\u0000"+ + "\u0000\u0000\u0ac6\u0ac4\u0001\u0000\u0000\u0000\u0ac7\u0ac9\u0001\u0000"+ + "\u0000\u0000\u0ac8\u0ac6\u0001\u0000\u0000\u0000\u0ac9\u0aca\u0005*\u0000"+ + "\u0000\u0aca\u0acb\u0005/\u0000\u0000\u0acb\u0acc\u0001\u0000\u0000\u0000"+ + "\u0acc\u0acd\u0006\u00e9\r\u0000\u0acd\u01e1\u0001\u0000\u0000\u0000\u0ace"+ + "\u0acf\u0005[\u0000\u0000\u0acf\u0ad0\u0001\u0000\u0000\u0000\u0ad0\u0ad1"+ + "\u0006\u00ea \u0000\u0ad1\u01e3\u0001\u0000\u0000\u0000\u0ad2\u0ad3\u0005"+ + "]\u0000\u0000\u0ad3\u0ad4\u0001\u0000\u0000\u0000\u0ad4\u0ad5\u0006\u00eb"+ + " \u0000\u0ad5\u01e5\u0001\u0000\u0000\u0000\u0ad6\u0ad7\u0005{\u0000\u0000"+ + "\u0ad7\u0ad8\u0001\u0000\u0000\u0000\u0ad8\u0ad9\u0006\u00ec \u0000\u0ad9"+ + "\u01e7\u0001\u0000\u0000\u0000\u0ada\u0adb\u0005}\u0000\u0000\u0adb\u0adc"+ + "\u0001\u0000\u0000\u0000\u0adc\u0add\u0006\u00ed \u0000\u0add\u01e9\u0001"+ + "\u0000\u0000\u0000\u0ade\u0ae1\u0003\u00f8u\u0000\u0adf\u0ae1\u0003\u00fa"+ + "v\u0000\u0ae0\u0ade\u0001\u0000\u0000\u0000\u0ae0\u0adf\u0001\u0000\u0000"+ + "\u0000\u0ae1\u0ae2\u0001\u0000\u0000\u0000\u0ae2\u0ae3\u0006\u00ee<\u0000"+ + "\u0ae3\u01eb\u0001\u0000\u0000\u0000\u0ae4\u0ae5\u0003\u00fex\u0000\u0ae5"+ + "\u0ae6\u0001\u0000\u0000\u0000\u0ae6\u0ae7\u0006\u00ef\u0012\u0000\u0ae7"+ + "\u01ed\u0001\u0000\u0000\u0000\u0ae8\u0ae9\u0003\u0100y\u0000\u0ae9\u0aea"+ + "\u0001\u0000\u0000\u0000\u0aea\u0aeb\u0006\u00f0\u0013\u0000\u0aeb\u01ef"+ + "\u0001\u0000\u0000\u0000\u0aec\u0aed\u0003\u00f0q\u0000\u0aed\u0aee\u0001"+ + "\u0000\u0000\u0000\u0aee\u0aef\u0006\u00f1\u0015\u0000\u0aef\u01f1\u0001"+ + "\u0000\u0000\u0000\u0af0\u0af1\u0005:\u0000\u0000\u0af1\u0af2\u0005:\u0000"+ + "\u0000\u0af2\u0af3\u0001\u0000\u0000\u0000\u0af3\u0af4\u0006\u00f2\u0016"+ + "\u0000\u0af4\u01f3\u0001\u0000\u0000\u0000\u0af5\u0af6\u0005-\u0000\u0000"+ + "\u0af6\u0af7\u0005>\u0000\u0000\u0af7\u0af8\u0001\u0000\u0000\u0000\u0af8"+ + "\u0af9\u0006\u00f3\u001a\u0000\u0af9\u01f5\u0001\u0000\u0000\u0000\u0afa"+ + "\u0afb\u0005(\u0000\u0000\u0afb\u0afc\u0001\u0000\u0000\u0000\u0afc\u0afd"+ + "\u0006\u00f4\u0018\u0000\u0afd\u01f7\u0001\u0000\u0000\u0000\u0afe\u0aff"+ + "\u0005)\u0000\u0000\u0aff\u0b00\u0001\u0000\u0000\u0000\u0b00\u0b01\u0006"+ + "\u00f5\u0019\u0000\u0b01\u01f9\u0001\u0000\u0000\u0000\u0b02\u0b03\u0005"+ + "\u0000\u0000\u0001\u0b03\u0b04\u0001\u0000\u0000\u0000\u0b04\u0b05\u0006"+ + "\u00f6 \u0000\u0b05\u0b06\u0006\u00f6\u0017\u0000\u0b06\u01fb\u0001\u0000"+ + "\u0000\u0000\u0b07\u0b08\t\u0000\u0000\u0000\u0b08\u0b09\u0001\u0000\u0000"+ + "\u0000\u0b09\u0b0a\u0006\u00f7 \u0000\u0b0a\u01fd\u0001\u0000\u0000\u0000"+ + "\u0b0b\u0b0c\u0005@\u0000\u0000\u0b0c\u0b0d\u0007\u0007\u0000\u0000\u0b0d"+ + "\u0b0e\u0007\n\u0000\u0000\u0b0e\u0b0f\u0007\u000b\u0000\u0000\u0b0f\u0b10"+ + "\u0007\u001c\u0000\u0000\u0b10\u0b11\u0007\u0007\u0000\u0000\u0b11\u0b12"+ + "\u0007\u0016\u0000\u0000\u0b12\u0b13\u0007\u0017\u0000\u0000\u0b13\u0b14"+ + "\u0007\u0010\u0000\u0000\u0b14\u0b15\u0007\r\u0000\u0000\u0b15\u0b16\u0007"+ + "\u0005\u0000\u0000\u0b16\u0b17\u0007\u0012\u0000\u0000\u0b17\u0b18\u0001"+ + "\u0000\u0000\u0000\u0b18\u0b19\u0006\u00f8?\u0000\u0b19\u0b1a\u0006\u00f8"+ + "!\u0000\u0b1a\u01ff\u0001\u0000\u0000\u0000\u0b1b\u0b1c\t\u0000\u0000"+ + "\u0000\u0b1c\u0b1d\u0004\u00f9\u000f\u0000\u0b1d\u0b1e\u0001\u0000\u0000"+ + "\u0000\u0b1e\u0b1f\u0006\u00f9\r\u0000\u0b1f\u0201\u0001\u0000\u0000\u0000"+ + "\u0b20\u0b21\u0005\u0000\u0000\u0001\u0b21\u0b22\u0001\u0000\u0000\u0000"+ + "\u0b22\u0b23\u0006\u00fa\u001b\u0000\u0b23\u0b24\u0006\u00fa!\u0000\u0b24"+ + "\u0203\u0001\u0000\u0000\u0000\u0b25\u0b26\t\u0000\u0000\u0000\u0b26\u0b27"+ + "\u0001\u0000\u0000\u0000\u0b27\u0b28\u0006\u00fb\u001c\u0000\u0b28\u0205"+ + "\u0001\u0000\u0000\u0000\u0b29\u0b2a\u0005-\u0000\u0000\u0b2a\u0b2b\u0005"+ + "-\u0000\u0000\u0b2b\u0b2c\u0005}\u0000\u0000\u0b2c\u0b2d\u0005}\u0000"+ + "\u0000\u0b2d\u0b2e\u0001\u0000\u0000\u0000\u0b2e\u0b2f\u0006\u00fc\u0017"+ + "\u0000\u0b2f\u0b30\u0006\u00fc\r\u0000\u0b30\u0207\u0001\u0000\u0000\u0000"+ + "\u0b31\u0b32\t\u0000\u0000\u0000\u0b32\u0b33\u0004\u00fd\u0010\u0000\u0b33"+ + "\u0b34\u0001\u0000\u0000\u0000\u0b34\u0b35\u0006\u00fd\r\u0000\u0b35\u0209"+ + "\u0001\u0000\u0000\u0000\u0b36\u0b37\t\u0000\u0000\u0000\u0b37\u0b38\u0001"+ + "\u0000\u0000\u0000\u0b38\u0b39\u0006\u00fe\r\u0000\u0b39\u020b\u0001\u0000"+ + "\u0000\u0000\u0b3a\u0b3b\u0005\u0000\u0000\u0001\u0b3b\u0b3c\u0001\u0000"+ + "\u0000\u0000\u0b3c\u0b3d\u0006\u00ff\u0017\u0000\u0b3d\u0b3e\u0006\u00ff"+ + "\r\u0000\u0b3e\u020d\u0001\u0000\u0000\u0000t\u0000\u0001\u0002\u0003"+ + "\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u0212\u0216\u021c\u0220\u0227"+ + "\u022e\u0234\u023a\u0241\u0246\u024d\u0253\u025d\u0263\u0269\u0270\u027c"+ + "\u02e1\u02f8\u0517\u052c\u0539\u054c\u055e\u059e\u05ca\u05ed\u0653\u0699"+ + "\u06a9\u06ab\u06b9\u06c1\u06c8\u06cb\u06d9\u06e0\u06f4\u06fc\u0703\u070b"+ + "\u070f\u0718\u071b\u0722\u0729\u072e\u073a\u073f\u0741\u074d\u0754\u075b"+ + "\u0763\u0765\u076e\u0770\u077b\u0793\u07a8\u07ac\u07b7\u07bd\u07c9\u07cd"+ + "\u07db\u07e9\u07fa\u080a\u081b\u0827\u0837\u0844\u0854\u0861\u087a\u088b"+ + "\u088e\u089b\u08a2\u08d3\u08da\u0906\u0910\u094f\u0973\u097e\u0985\u09a6"+ + "\u09b8\u09d3\u0a03\u0a18\u0a2d\u0a37\u0a40\u0a66\u0a83\u0a8a\u0abc\u0ac6"+ + "\u0ae0@\u0005\u0005\u0000\u0005\u0003\u0000\u0005\b\u0000\u0005\u0007"+ + "\u0000\u0007g\u0000\u0005\n\u0000\u0005\f\u0000\u0005\u0001\u0000\u0005"+ + "\u0002\u0000\u0007\u0017\u0000\u0005\u000b\u0000\u0001c\u0000\u0007s\u0000"+ + "\u0006\u0000\u0000\u0001h\u0001\u0001i\u0002\u0001m\u0003\u0005\r\u0000"+ + "\u0007\u0002\u0000\u0007\u0003\u0000\u0007\u0006\u0000\u0007\u0005\u0000"+ + "\u0007\u0007\u0000\u0004\u0000\u0000\u0007\r\u0000\u0007\u000e\u0000\u0007"+ + "\t\u0000\u0007\u0016\u0000\u0003\u0000\u0000\u0005\u0004\u0000\u0001\u009a"+ + "\u0004\u0001\u009b\u0005\u0007\u0001\u0000\u0002\u0000\u0000\u0001\u009c"+ + "\u0006\u0001\u009d\u0007\u0001\u00a2\b\u0005\u0006\u0000\u0001\u00a4\t"+ + "\u0007\u000f\u0000\u0001\u00a5\n\u0007\u0090\u0000\u0001\u00a6\u000b\u0001"+ + "\u00a7\f\u0001\u00ae\r\u0001\u00af\u000e\u0001\u00b3\u000f\u0007\u000b"+ + "\u0000\u0005\t\u0000\u0001\u00b6\u0010\u0001\u00b7\u0011\u0000\u0002\u0000"+ + "\u0001\u00c1\u0012\u0001\u00c2\u0013\u0001\u00c3\u0014\u0007\n\u0000\u0001"+ + "\u00c4\u0015\u0001\u00c5\u0016\u0001\u00c6\u0017\u0001\u00cc\u0018\u0007"+ + "\u0015\u0000\u0007\u0004\u0000\u0007\b\u0000\u0007i\u0000"; + public static final String _serializedATN = Utils.join( + new String[] { + _serializedATNSegment0, + _serializedATNSegment1 + }, + "" + ); + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 new file mode 100644 index 000000000000..d3121117c97a --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 @@ -0,0 +1,217 @@ +parser grammar BladeAntlrParser; + +@header{ + /** + * Parser generated for netbeans blade editor + * Some elements have been simplified to optimize parser speed + * For example + * - switch statement have a loos validation + * - generic block statement "@isset" | "@unless" are grouped togehter + * - the start match and end match will be checked in the parser + */ + package org.netbeans.modules.php.blade.syntax.antlr4.v10; +} + +@parser::members {public static int bladeVersion = 10;} + +options { tokenVocab = BladeAntlrLexer; } + +file : general_statement* EOF; + +general_statement: inline_statement + | block_statement + | html + ; + +inline_statement: + inline_directive + | possibleDirective + | regular_echo + | raw_echo + | phpInline + ; + +inline_directive: + section_inline + | identifiableType + | stack + | includeCond + | each + | (D_INCLUDE_FIRST | D_CLASS | D_STYLE | D_METHOD | D_PROPS + | D_DD | D_JS | D_JS | D_AWARE | D_HTML_ATTR_EXPR | D_CASE | D_JSON) composed_php_expression + | (D_CSRF | D_LOOP_ACTION | D_BREAK | D_LIVEWIRE | D_DEFAULT) + | asset_bundler + | inject + //using basic inline case statement to not add complexity to parser + | D_PERMISSION_ELSE composed_php_expression + | loop_action + | D_ELSE //custom block directives? + | D_MISC + | custom_directive + ; + +block_statement: + section + | condSection + | push + | pushIf + | once_block + | prepend + | fragmentD + | if + | switch + | env_block + | empty_block + | error_block + //we can consider the statements not being empty + | conditional_block + | auth_block + //lazy parser for can + | permission + | while + | for + | foreach + | forelse + | session + | verbatim_block + | php_blade + ; + +identifiableType : d_name=(D_INCLUDE | D_INCLUDE_IF | D_EXTENDS + | D_YIELD | D_USE | D_LANG) BLADE_PARAM_LPAREN (idString = BL_PARAM_STRING | composedArgument) (BL_COMMA composedArgument)? (BL_COMMA)? BLADE_PARAM_RPAREN; +section_inline: D_SECTION doubleArgWrapperP; +section : D_SECTION singleArgWrapperP (general_statement | D_PARENT)* (D_SHOW | D_STOP | D_OVERWRITE | D_ENDSECTION | D_APPEND); +push : D_PUSH singleArgWrapperP general_statement* D_ENDPUSH; +pushOnce : D_PUSH_ONCE singleArgWrapperP general_statement* D_ENDPUSH_ONCE; +pushIf : D_PUSH_IF singleArgWrapperP general_statement* D_ENDPUSH_IF; +prepend : D_PREPEND singleArgWrapperP general_statement* D_ENDPREPEND; +fragmentD : D_FRAGMENT composed_php_expression general_statement* D_ENDFRAGMENT; + +if : D_IF main_php_expression general_statement* (D_ELSEIF main_php_expression general_statement*)* else? endif; +else : D_ELSE general_statement*; +endif: D_ENDIF; +empty_block : D_EMPTY composed_php_expression simple_conditional_stm D_ENDEMPTY; + +//the consistency for these blocks need to be checked inside the parser +conditional_block : D_COND_BLOCK_START main_php_expression simple_conditional_stm D_COND_BLOCK_END; +auth_block : D_AUTH_START (BLADE_PARAM_LPAREN (composedArgument)* BLADE_PARAM_RPAREN)* simple_conditional_stm D_AUTH_END; +env_block: (D_ENV singleArgWrapperP simple_conditional_stm D_ENDENV) | D_PRODUCTION simple_conditional_stm D_ENDPRODUCTION; +permission : D_PERMISSION_START composed_php_expression simple_conditional_stm D_PERMISSION_END; + +simple_conditional_stm : general_statement* else?; +// +error_block : D_ERROR php_expression general_statement* D_ENDERROR; + +//no need to add complexity to parser +switch: D_SWITCH php_expression (general_statement | D_BREAK)+ D_ENDSWITCH; + +//loops +while : D_WHILE php_expression (general_statement)* D_ENDWHILE; +for : D_FOR php_expression (general_statement)* D_ENDFOR; +foreach : D_FOREACH FOREACH_LOOP_LPAREN loop_expression FOREACH_LOOP_RPAREN (general_statement)* D_ENDFOREACH; +forelse : D_FORELSE FOREACH_LOOP_LPAREN loop_expression FOREACH_LOOP_RPAREN (general_statement | D_EMPTY)* D_ENDFORELSE; + +//misc block +session : D_SESSION composed_php_expression general_statement* D_ENDSESSION; + +//layout +stack : D_STACK singleArgWrapperP; +asset_bundler : d_name=D_ASSET_BUNDLER BLADE_EXPR_LPAREN (BL_SQ_LPAREN id_strings=EXPR_STRING+ BL_SQ_RPAREN dir=EXPR_STRING? | id_string=EXPR_STRING | composed_php_expression+) BLADE_EXPR_RPAREN; +inject : D_INJECT BLADE_PARAM_LPAREN composedArgument BL_COMMA (identifiableArgument | composedArgument) BLADE_PARAM_RPAREN; + +includeCond : d_name=(D_INCLUDE_WHEN | D_INCLUDE_UNLESS) BLADE_PARAM_LPAREN + composedArgument + BL_COMMA + (idString=BL_PARAM_STRING | composedArgument) + (BL_COMMA composedArgument)? + BLADE_PARAM_RPAREN; + +each : D_EACH BLADE_PARAM_LPAREN + (idString=BL_PARAM_STRING | composedArgument) //default path + BL_COMMA + composedArgument + BL_COMMA + composedArgument + (BL_COMMA + (identifiableArgument | composedArgument))? //fallback + BLADE_PARAM_RPAREN; + +once_block : D_ONCE general_statement+ D_ENDONCE; +condSection : (D_SECTION_MISSING | D_HAS_SECTION) singleArgWrapperP simple_conditional_stm D_ENDIF; + +custom_directive : D_CUSTOM ((BLADE_PARAM_LPAREN BLADE_PARAM_RPAREN) | multiArgWrapper ) +; + +possibleDirective : D_UNKNOWN | D_UNKNOWN_ATTR_ENC; + +php_blade : D_PHP composed_php_expression* D_ENDPHP | D_PHP main_php_expression; + +phpInline : PHP_INLINE_START composed_php_expression+ (PHP_EXIT | EOF); +//echo + +regular_echo : CONTENT_TAG_OPEN echo_expr* CONTENT_TAG_CLOSE; +raw_echo : RAW_TAG_OPEN echo_expr* RAW_TAG_CLOSE; + +echo_expr : composed_php_expression; + +class_expr_usage: class_name_reference +| object_alias_static_access +| object_alias_direct_access +| static_direct_class_access +| static_direct_namespace_class_access +| class_instance; + +object_alias_static_access : alias_name=PHP_VARIABLE PHP_STATIC_ACCESS static_property=PHP_IDENTIFIER; +object_alias_direct_access : alias_name=PHP_VARIABLE PHP_INSTANCE_ACCESS property=PHP_IDENTIFIER; +static_direct_class_access : class_name=PHP_IDENTIFIER PHP_STATIC_ACCESS + func_name=PHP_IDENTIFIER BLADE_EXPR_LPAREN composed_php_expression* BLADE_EXPR_RPAREN + | class_name=PHP_IDENTIFIER PHP_STATIC_ACCESS static_property=PHP_IDENTIFIER + ; +static_direct_namespace_class_access : namespace=PHP_NAMESPACE_PATH? class_name=PHP_IDENTIFIER PHP_STATIC_ACCESS + func_name=PHP_IDENTIFIER BLADE_EXPR_LPAREN composed_php_expression* BLADE_EXPR_RPAREN + | namespace=PHP_NAMESPACE_PATH? class_name=PHP_IDENTIFIER PHP_STATIC_ACCESS static_property=PHP_IDENTIFIER + ; + +class_instance : PHP_NEW (namespace=PHP_NAMESPACE_PATH? class_name=PHP_IDENTIFIER) BLADE_EXPR_LPAREN composed_php_expression* BLADE_EXPR_RPAREN; +class_name_reference : namespace=PHP_NAMESPACE_PATH? class_name=PHP_IDENTIFIER PHP_STATIC_ACCESS PHP_CLASS_KEYWORD; + +namespacePath : namespace=PHP_NAMESPACE_PATH? class_name=PHP_IDENTIFIER; + +function_call : func_name=PHP_IDENTIFIER BLADE_EXPR_LPAREN composed_php_expression* BLADE_EXPR_RPAREN; + +php_expression: PHP_EXPRESSION; +loop_expression : simple_foreach_expr +| (PHP_VARIABLE | PHP_EXPRESSION | FOREACH_PARAM_ASSIGN | FOREACH_LOOP_LPAREN | FOREACH_LOOP_RPAREN | FOREACH_AS)+ //complex expression (lazy handling) +; + +main_php_expression : BLADE_EXPR_LPAREN composed_php_expression+ BLADE_EXPR_RPAREN; + +composed_php_expression : class_expr_usage | function_call | PHP_IDENTIFIER | namespacePath | PHP_VARIABLE +| PHP_NAMESPACE_PATH | EXPR_STRING | + PHP_KEYWORD | PHP_EXPRESSION+ | PHP_STATIC_ACCESS | PHP_CLASS_KEYWORD +| PHP_INSTANCE_ACCESS | BL_SQ_LPAREN composed_php_expression* BL_SQ_RPAREN | BLADE_EXPR_LPAREN composed_php_expression* BLADE_EXPR_RPAREN | PHP_EXPR_STRING; + +simple_foreach_expr: loop_array=PHP_VARIABLE FOREACH_AS key=PHP_VARIABLE (FOREACH_PARAM_ASSIGN item=PHP_VARIABLE)?; + +singleArgWrapperP: BLADE_PARAM_LPAREN (idString=BL_PARAM_STRING | composedArgument) BLADE_PARAM_RPAREN; +doubleArgWrapperP: BLADE_PARAM_LPAREN (idString=BL_PARAM_STRING | composedArgument) BL_COMMA composedArgument BLADE_PARAM_RPAREN; +multiArgWrapper : BLADE_PARAM_LPAREN (composedArgument) (BL_COMMA composedArgument)* BLADE_PARAM_RPAREN; + +identifiableArgument : BL_PARAM_STRING; +composedArgument : (phpExpr)+ ; + +phpExpr : identifiableArray | arrayDefine | BLADE_PARAM_EXTRA | PHP_VARIABLE | PHP_KEYWORD | BL_PARAM_CONCAT_OPERATOR | BL_PARAM_STRING | BL_PARAM_ASSIGN | BL_NAME_STRING | BL_PARAM_COMMA; + +//['key' => $value] +identifiableArray : BL_SQ_LPAREN paramAssign (BL_PARAM_COMMA paramAssign)* BL_PARAM_COMMA? BL_SQ_RPAREN; +arrayDefine : BL_SQ_LPAREN phpExpr+ BL_SQ_RPAREN +| BL_SQ_LPAREN BL_SQ_RPAREN; + +paramAssign : BL_PARAM_STRING BL_PARAM_ASSIGN (PHP_VARIABLE | PHP_KEYWORD | BL_PARAM_STRING); +verbatim_block : D_VERBATIM D_ENDVERBATIM; + +loop_action : (D_LOOP_ACTION | D_BREAK) php_expression?; + + +//html +html : HTML+ | HTML_COMPONENT_PREFIX | HTML_TAG_START | EQ | HTML_IDENTIFIER; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.java new file mode 100644 index 000000000000..eeb99c968722 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.java @@ -0,0 +1,6250 @@ +// Generated from java-escape by ANTLR 4.11.1 + + /** + * Parser generated for netbeans blade editor + * Some elements have been simplified to optimize parser speed + * For example + * - switch statement have a loos validation + * - generic block statement "@isset" | "@unless" are grouped togehter + * - the start match and end match will be checked in the parser + */ + package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.misc.*; +import org.antlr.v4.runtime.tree.*; +import java.util.List; +import java.util.Iterator; +import java.util.ArrayList; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +public class BladeAntlrParser extends Parser { + static { RuntimeMetaData.checkVersion("4.11.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + PHP_EXPRESSION=1, PHP_VARIABLE=2, PHP_KEYWORD=3, PHP_NEW=4, PHP_IDENTIFIER=5, + PHP_NAMESPACE_PATH=6, PHP_STATIC_ACCESS=7, PHP_CLASS_KEYWORD=8, PHP_INSTANCE_ACCESS=9, + BLADE_PARAM_EXTRA=10, BLADE_PARAM_LPAREN=11, BLADE_PARAM_RPAREN=12, BLADE_EXPR_LPAREN=13, + BLADE_EXPR_RPAREN=14, BL_SQ_LPAREN=15, BL_SQ_LRAREN=16, BL_PARAM_STRING=17, + BL_PARAM_ASSIGN=18, BL_COMMA=19, BL_PARAM_COMMA=20, PHP_EXPR_STRING=21, + ERROR=22, HTML=23, BLADE_COMMENT=24, D_IF=25, D_ELSEIF=26, D_ELSE=27, + D_ENDIF=28, D_SWITCH=29, D_CASE=30, D_DEFAULT=31, D_ENDSWITCH=32, D_EMPTY=33, + D_ENDEMPTY=34, D_COND_BLOCK_START=35, D_COND_BLOCK_END=36, D_FOREACH=37, + D_ENDFOREACH=38, D_FOR=39, D_ENDFOR=40, D_FORELSE=41, D_ENDFORELSE=42, + D_WHILE=43, D_ENDWHILE=44, D_BREAK=45, D_LOOP_ACTION=46, D_INCLUDE=47, + D_INCLUDE_IF=48, D_INCLUDE_WHEN=49, D_INCLUDE_FIRST=50, D_INCLUDE_UNLESS=51, + D_EACH=52, D_EXTENDS=53, D_JS=54, D_JSON=55, D_SECTION=56, D_HAS_SECTION=57, + D_SECTION_MISSING=58, D_ENDSECTION=59, D_YIELD=60, D_PARENT=61, D_SHOW=62, + D_OVERWRITE=63, D_STOP=64, D_APPEND=65, D_ONCE=66, D_ENDONCE=67, D_STACK=68, + D_PUSH=69, D_ENDPUSH=70, D_PUSH_IF=71, D_ENDPUSH_IF=72, D_PUSH_ONCE=73, + D_ENDPUSH_ONCE=74, D_PREPEND=75, D_ENDPREPEND=76, D_PROPS=77, D_FRAGMENT=78, + D_ENDFRAGMENT=79, D_CSRF=80, D_METHOD=81, D_ERROR=82, D_ENDERROR=83, D_PRODUCTION=84, + D_ENDPRODUCTION=85, D_ENV=86, D_ENDENV=87, D_AUTH_START=88, D_AUTH_END=89, + D_PERMISSION_START=90, D_PERMISSION_ELSE=91, D_PERMISSION_END=92, D_CLASS=93, + D_STYLE=94, D_HTML_ATTR_EXPR=95, D_AWARE=96, D_SESSION=97, D_ENDSESSION=98, + D_DD=99, D_LANG=100, D_USE=101, D_INJECT=102, D_PHP=103, D_VERBATIM=104, + D_ENDVERBATIM=105, D_LIVEWIRE=106, D_ASSET_BUNDLER=107, D_MISC=108, D_CUSTOM=109, + D_UNKNOWN_ATTR_ENC=110, D_UNKNOWN=111, CONTENT_TAG_OPEN=112, RAW_TAG_OPEN=113, + PHP_INLINE_START=114, HTML_COMPONENT_PREFIX=115, JS_SCRIPT=116, HTML_TAG_START=117, + HTML_CLOSE_TAG=118, STRING_PATH=119, HTML_PATH=120, HTML_TEXT=121, HTML_IDENTIFIER=122, + EQ=123, WS=124, OTHER=125, BLADE_COMMENT_START=126, CONTENT_TAG_CLOSE=127, + REGULAR_ECHO_EXPR_MORE=128, RAW_TAG_CLOSE=129, RAW_ECHO_EXPR_MORE=130, + WS_EXPR_ESCAPE=131, WS_EXPR=132, WS_COMPOSED_EXPR=133, EXPR_STRING=134, + COMPOSED_EXPR_RPAREN=135, PHP_COMPOSED_EXPRESSION=136, WS_BL_PARAM=137, + FOREACH_WS_EXPR=138, FOREACH_LOOP_LPAREN=139, FOREACH_LOOP_RPAREN=140, + FOREACH_AS=141, FOREACH_PARAM_ASSIGN=142, BL_PARAM_LINE_COMMENT=143, BL_SQ_RPAREN=144, + BL_PARAM_RPAREN=145, BL_PARAM_CONCAT_OPERATOR=146, BL_COMMA_EL=147, BL_PARAM_WS=148, + BL_NAME_STRING=149, PHP_D_BLADE_COMMENT=150, PHP_D_BLADE_ML_COMMENT=151, + D_ENDPHP=152, PHP_D_WS=153, PHP_D_PHP_COMPOSED_EXPRESSION=154, PHP_EXIT=155, + PHP_INLINE_COMMENT=156, PHP_INLINE_ML_COMMENT=157, VERBATIM_HTML=158, + BLADE_COMMENT_END=159, BLADE_COMMENT_PEEK=160, BLADE_COMMENT_MORE=161, + BLADE_COMMENT_EOF=162, AT=163, RAW_TAG_START=164, REGULAR_ECHO_STATIC_ACCESS=165, + REGULAR_ECHO_LPAREN=166, REGULAR_ECHO_RPAREN=167, REGULAR_ECHO_INSTANCE_ACCESS=168, + PHP_D_EXPR_CURLY_LPAREN=169, PHP_D_EXPR_CURLY_RPAREN=170, PHP_D_CLASS=171; + public static final int + RULE_file = 0, RULE_general_statement = 1, RULE_inline_statement = 2, + RULE_inline_directive = 3, RULE_block_statement = 4, RULE_identifiableType = 5, + RULE_section_inline = 6, RULE_section = 7, RULE_push = 8, RULE_pushOnce = 9, + RULE_pushIf = 10, RULE_prepend = 11, RULE_fragmentD = 12, RULE_if = 13, + RULE_else = 14, RULE_endif = 15, RULE_empty_block = 16, RULE_conditional_block = 17, + RULE_auth_block = 18, RULE_env_block = 19, RULE_permission = 20, RULE_simple_conditional_stm = 21, + RULE_error_block = 22, RULE_switch = 23, RULE_while = 24, RULE_for = 25, + RULE_foreach = 26, RULE_forelse = 27, RULE_session = 28, RULE_stack = 29, + RULE_asset_bundler = 30, RULE_inject = 31, RULE_includeCond = 32, RULE_each = 33, + RULE_once_block = 34, RULE_condSection = 35, RULE_custom_directive = 36, + RULE_possibleDirective = 37, RULE_php_blade = 38, RULE_phpInline = 39, + RULE_regular_echo = 40, RULE_raw_echo = 41, RULE_echo_expr = 42, RULE_class_expr_usage = 43, + RULE_object_alias_static_access = 44, RULE_object_alias_direct_access = 45, + RULE_static_direct_class_access = 46, RULE_static_direct_namespace_class_access = 47, + RULE_class_instance = 48, RULE_class_name_reference = 49, RULE_namespacePath = 50, + RULE_function_call = 51, RULE_php_expression = 52, RULE_loop_expression = 53, + RULE_main_php_expression = 54, RULE_composed_php_expression = 55, RULE_simple_foreach_expr = 56, + RULE_singleArgWrapperP = 57, RULE_doubleArgWrapperP = 58, RULE_multiArgWrapper = 59, + RULE_identifiableArgument = 60, RULE_composedArgument = 61, RULE_phpExpr = 62, + RULE_identifiableArray = 63, RULE_arrayDefine = 64, RULE_paramAssign = 65, + RULE_verbatim_block = 66, RULE_loop_action = 67, RULE_html = 68; + private static String[] makeRuleNames() { + return new String[] { + "file", "general_statement", "inline_statement", "inline_directive", + "block_statement", "identifiableType", "section_inline", "section", "push", + "pushOnce", "pushIf", "prepend", "fragmentD", "if", "else", "endif", + "empty_block", "conditional_block", "auth_block", "env_block", "permission", + "simple_conditional_stm", "error_block", "switch", "while", "for", "foreach", + "forelse", "session", "stack", "asset_bundler", "inject", "includeCond", + "each", "once_block", "condSection", "custom_directive", "possibleDirective", + "php_blade", "phpInline", "regular_echo", "raw_echo", "echo_expr", "class_expr_usage", + "object_alias_static_access", "object_alias_direct_access", "static_direct_class_access", + "static_direct_namespace_class_access", "class_instance", "class_name_reference", + "namespacePath", "function_call", "php_expression", "loop_expression", + "main_php_expression", "composed_php_expression", "simple_foreach_expr", + "singleArgWrapperP", "doubleArgWrapperP", "multiArgWrapper", "identifiableArgument", + "composedArgument", "phpExpr", "identifiableArray", "arrayDefine", "paramAssign", + "verbatim_block", "loop_action", "html" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, "'@if'", "'@elseif'", "'@else'", "'@endif'", "'@switch'", "'@case'", + "'@default'", "'@endswitch'", "'@empty'", "'@endempty'", null, null, + "'@foreach'", "'@endforeach'", "'@for'", "'@endfor'", "'@forelse'", "'@endforelse'", + "'@while'", "'@endwhile'", "'@break'", null, "'@include'", "'@includeIf'", + "'@includeWhen'", "'@includeFirst'", "'@includeUnless'", "'@each'", "'@extends'", + "'@js'", "'@json'", "'@section'", "'@hasSection'", "'@sectionMissing'", + "'@endsection'", "'@yield'", "'@parent'", "'@show'", "'@overwrite'", + "'@stop'", "'@append'", "'@once'", "'@endonce'", "'@stack'", "'@push'", + "'@endpush'", "'@pushIf'", "'@endPushIf'", "'@pushOnce'", "'@endPushOnce'", + "'@prepend'", "'@endprepend'", "'@props'", "'@fragment'", "'@endfragment'", + "'@csrf'", "'@method'", "'@error'", "'@enderror'", "'@production'", "'@endproduction'", + "'@env'", "'@endenv'", null, null, null, null, null, "'@class'", "'@style'", + null, "'@aware'", "'@session'", "'@endsession'", null, "'@lang'", "'@use'", + "'@inject'", null, "'@verbatim'", "'@endverbatim'", null, "'@vite'", + "'@viteReactRefresh'", null, null, null, "'{{'", "'{!!'", null, null, + null, null, null, null, null, null, null, "'='", null, null, "'{{--'", + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, "'as'", null, null, null, null, "'.'", "','", null, null, + null, null, "'@endphp'", "' '", null, "'?>'", null, null, null, "'--}}'", + null, null, null, null, "'{!'", null, null, null, null, null, null, "'class'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "PHP_EXPRESSION", "PHP_VARIABLE", "PHP_KEYWORD", "PHP_NEW", "PHP_IDENTIFIER", + "PHP_NAMESPACE_PATH", "PHP_STATIC_ACCESS", "PHP_CLASS_KEYWORD", "PHP_INSTANCE_ACCESS", + "BLADE_PARAM_EXTRA", "BLADE_PARAM_LPAREN", "BLADE_PARAM_RPAREN", "BLADE_EXPR_LPAREN", + "BLADE_EXPR_RPAREN", "BL_SQ_LPAREN", "BL_SQ_LRAREN", "BL_PARAM_STRING", + "BL_PARAM_ASSIGN", "BL_COMMA", "BL_PARAM_COMMA", "PHP_EXPR_STRING", "ERROR", + "HTML", "BLADE_COMMENT", "D_IF", "D_ELSEIF", "D_ELSE", "D_ENDIF", "D_SWITCH", + "D_CASE", "D_DEFAULT", "D_ENDSWITCH", "D_EMPTY", "D_ENDEMPTY", "D_COND_BLOCK_START", + "D_COND_BLOCK_END", "D_FOREACH", "D_ENDFOREACH", "D_FOR", "D_ENDFOR", + "D_FORELSE", "D_ENDFORELSE", "D_WHILE", "D_ENDWHILE", "D_BREAK", "D_LOOP_ACTION", + "D_INCLUDE", "D_INCLUDE_IF", "D_INCLUDE_WHEN", "D_INCLUDE_FIRST", "D_INCLUDE_UNLESS", + "D_EACH", "D_EXTENDS", "D_JS", "D_JSON", "D_SECTION", "D_HAS_SECTION", + "D_SECTION_MISSING", "D_ENDSECTION", "D_YIELD", "D_PARENT", "D_SHOW", + "D_OVERWRITE", "D_STOP", "D_APPEND", "D_ONCE", "D_ENDONCE", "D_STACK", + "D_PUSH", "D_ENDPUSH", "D_PUSH_IF", "D_ENDPUSH_IF", "D_PUSH_ONCE", "D_ENDPUSH_ONCE", + "D_PREPEND", "D_ENDPREPEND", "D_PROPS", "D_FRAGMENT", "D_ENDFRAGMENT", + "D_CSRF", "D_METHOD", "D_ERROR", "D_ENDERROR", "D_PRODUCTION", "D_ENDPRODUCTION", + "D_ENV", "D_ENDENV", "D_AUTH_START", "D_AUTH_END", "D_PERMISSION_START", + "D_PERMISSION_ELSE", "D_PERMISSION_END", "D_CLASS", "D_STYLE", "D_HTML_ATTR_EXPR", + "D_AWARE", "D_SESSION", "D_ENDSESSION", "D_DD", "D_LANG", "D_USE", "D_INJECT", + "D_PHP", "D_VERBATIM", "D_ENDVERBATIM", "D_LIVEWIRE", "D_ASSET_BUNDLER", + "D_MISC", "D_CUSTOM", "D_UNKNOWN_ATTR_ENC", "D_UNKNOWN", "CONTENT_TAG_OPEN", + "RAW_TAG_OPEN", "PHP_INLINE_START", "HTML_COMPONENT_PREFIX", "JS_SCRIPT", + "HTML_TAG_START", "HTML_CLOSE_TAG", "STRING_PATH", "HTML_PATH", "HTML_TEXT", + "HTML_IDENTIFIER", "EQ", "WS", "OTHER", "BLADE_COMMENT_START", "CONTENT_TAG_CLOSE", + "REGULAR_ECHO_EXPR_MORE", "RAW_TAG_CLOSE", "RAW_ECHO_EXPR_MORE", "WS_EXPR_ESCAPE", + "WS_EXPR", "WS_COMPOSED_EXPR", "EXPR_STRING", "COMPOSED_EXPR_RPAREN", + "PHP_COMPOSED_EXPRESSION", "WS_BL_PARAM", "FOREACH_WS_EXPR", "FOREACH_LOOP_LPAREN", + "FOREACH_LOOP_RPAREN", "FOREACH_AS", "FOREACH_PARAM_ASSIGN", "BL_PARAM_LINE_COMMENT", + "BL_SQ_RPAREN", "BL_PARAM_RPAREN", "BL_PARAM_CONCAT_OPERATOR", "BL_COMMA_EL", + "BL_PARAM_WS", "BL_NAME_STRING", "PHP_D_BLADE_COMMENT", "PHP_D_BLADE_ML_COMMENT", + "D_ENDPHP", "PHP_D_WS", "PHP_D_PHP_COMPOSED_EXPRESSION", "PHP_EXIT", + "PHP_INLINE_COMMENT", "PHP_INLINE_ML_COMMENT", "VERBATIM_HTML", "BLADE_COMMENT_END", + "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", "BLADE_COMMENT_EOF", "AT", + "RAW_TAG_START", "REGULAR_ECHO_STATIC_ACCESS", "REGULAR_ECHO_LPAREN", + "REGULAR_ECHO_RPAREN", "REGULAR_ECHO_INSTANCE_ACCESS", "PHP_D_EXPR_CURLY_LPAREN", + "PHP_D_EXPR_CURLY_RPAREN", "PHP_D_CLASS" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + @Override + public String getGrammarFileName() { return "java-escape"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public ATN getATN() { return _ATN; } + + public static int bladeVersion = 10; + public BladeAntlrParser(TokenStream input) { + super(input); + _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @SuppressWarnings("CheckReturnValue") + public static class FileContext extends ParserRuleContext { + public TerminalNode EOF() { return getToken(BladeAntlrParser.EOF, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public FileContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_file; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterFile(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitFile(this); + } + } + + public final FileContext file() throws RecognitionException { + FileContext _localctx = new FileContext(_ctx, getState()); + enterRule(_localctx, 0, RULE_file); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(141); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(138); + general_statement(); + } + } + setState(143); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(144); + match(EOF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class General_statementContext extends ParserRuleContext { + public Inline_statementContext inline_statement() { + return getRuleContext(Inline_statementContext.class,0); + } + public Block_statementContext block_statement() { + return getRuleContext(Block_statementContext.class,0); + } + public HtmlContext html() { + return getRuleContext(HtmlContext.class,0); + } + public General_statementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_general_statement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterGeneral_statement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitGeneral_statement(this); + } + } + + public final General_statementContext general_statement() throws RecognitionException { + General_statementContext _localctx = new General_statementContext(_ctx, getState()); + enterRule(_localctx, 2, RULE_general_statement); + try { + setState(149); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(146); + inline_statement(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(147); + block_statement(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(148); + html(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Inline_statementContext extends ParserRuleContext { + public Inline_directiveContext inline_directive() { + return getRuleContext(Inline_directiveContext.class,0); + } + public PossibleDirectiveContext possibleDirective() { + return getRuleContext(PossibleDirectiveContext.class,0); + } + public Regular_echoContext regular_echo() { + return getRuleContext(Regular_echoContext.class,0); + } + public Raw_echoContext raw_echo() { + return getRuleContext(Raw_echoContext.class,0); + } + public PhpInlineContext phpInline() { + return getRuleContext(PhpInlineContext.class,0); + } + public Inline_statementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_inline_statement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterInline_statement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitInline_statement(this); + } + } + + public final Inline_statementContext inline_statement() throws RecognitionException { + Inline_statementContext _localctx = new Inline_statementContext(_ctx, getState()); + enterRule(_localctx, 4, RULE_inline_statement); + try { + setState(156); + _errHandler.sync(this); + switch (_input.LA(1)) { + case D_ELSE: + case D_CASE: + case D_DEFAULT: + case D_BREAK: + case D_LOOP_ACTION: + case D_INCLUDE: + case D_INCLUDE_IF: + case D_INCLUDE_WHEN: + case D_INCLUDE_FIRST: + case D_INCLUDE_UNLESS: + case D_EACH: + case D_EXTENDS: + case D_JS: + case D_JSON: + case D_SECTION: + case D_YIELD: + case D_STACK: + case D_PROPS: + case D_CSRF: + case D_METHOD: + case D_PERMISSION_ELSE: + case D_CLASS: + case D_STYLE: + case D_HTML_ATTR_EXPR: + case D_AWARE: + case D_DD: + case D_LANG: + case D_USE: + case D_INJECT: + case D_LIVEWIRE: + case D_ASSET_BUNDLER: + case D_MISC: + case D_CUSTOM: + enterOuterAlt(_localctx, 1); + { + setState(151); + inline_directive(); + } + break; + case D_UNKNOWN_ATTR_ENC: + case D_UNKNOWN: + enterOuterAlt(_localctx, 2); + { + setState(152); + possibleDirective(); + } + break; + case CONTENT_TAG_OPEN: + enterOuterAlt(_localctx, 3); + { + setState(153); + regular_echo(); + } + break; + case RAW_TAG_OPEN: + enterOuterAlt(_localctx, 4); + { + setState(154); + raw_echo(); + } + break; + case PHP_INLINE_START: + enterOuterAlt(_localctx, 5); + { + setState(155); + phpInline(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Inline_directiveContext extends ParserRuleContext { + public Section_inlineContext section_inline() { + return getRuleContext(Section_inlineContext.class,0); + } + public IdentifiableTypeContext identifiableType() { + return getRuleContext(IdentifiableTypeContext.class,0); + } + public StackContext stack() { + return getRuleContext(StackContext.class,0); + } + public IncludeCondContext includeCond() { + return getRuleContext(IncludeCondContext.class,0); + } + public EachContext each() { + return getRuleContext(EachContext.class,0); + } + public Composed_php_expressionContext composed_php_expression() { + return getRuleContext(Composed_php_expressionContext.class,0); + } + public TerminalNode D_INCLUDE_FIRST() { return getToken(BladeAntlrParser.D_INCLUDE_FIRST, 0); } + public TerminalNode D_CLASS() { return getToken(BladeAntlrParser.D_CLASS, 0); } + public TerminalNode D_STYLE() { return getToken(BladeAntlrParser.D_STYLE, 0); } + public TerminalNode D_METHOD() { return getToken(BladeAntlrParser.D_METHOD, 0); } + public TerminalNode D_PROPS() { return getToken(BladeAntlrParser.D_PROPS, 0); } + public TerminalNode D_DD() { return getToken(BladeAntlrParser.D_DD, 0); } + public TerminalNode D_JS() { return getToken(BladeAntlrParser.D_JS, 0); } + public TerminalNode D_AWARE() { return getToken(BladeAntlrParser.D_AWARE, 0); } + public TerminalNode D_HTML_ATTR_EXPR() { return getToken(BladeAntlrParser.D_HTML_ATTR_EXPR, 0); } + public TerminalNode D_CASE() { return getToken(BladeAntlrParser.D_CASE, 0); } + public TerminalNode D_JSON() { return getToken(BladeAntlrParser.D_JSON, 0); } + public TerminalNode D_CSRF() { return getToken(BladeAntlrParser.D_CSRF, 0); } + public TerminalNode D_LOOP_ACTION() { return getToken(BladeAntlrParser.D_LOOP_ACTION, 0); } + public TerminalNode D_BREAK() { return getToken(BladeAntlrParser.D_BREAK, 0); } + public TerminalNode D_LIVEWIRE() { return getToken(BladeAntlrParser.D_LIVEWIRE, 0); } + public TerminalNode D_DEFAULT() { return getToken(BladeAntlrParser.D_DEFAULT, 0); } + public Asset_bundlerContext asset_bundler() { + return getRuleContext(Asset_bundlerContext.class,0); + } + public InjectContext inject() { + return getRuleContext(InjectContext.class,0); + } + public TerminalNode D_PERMISSION_ELSE() { return getToken(BladeAntlrParser.D_PERMISSION_ELSE, 0); } + public Loop_actionContext loop_action() { + return getRuleContext(Loop_actionContext.class,0); + } + public TerminalNode D_ELSE() { return getToken(BladeAntlrParser.D_ELSE, 0); } + public TerminalNode D_MISC() { return getToken(BladeAntlrParser.D_MISC, 0); } + public Custom_directiveContext custom_directive() { + return getRuleContext(Custom_directiveContext.class,0); + } + public Inline_directiveContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_inline_directive; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterInline_directive(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitInline_directive(this); + } + } + + public final Inline_directiveContext inline_directive() throws RecognitionException { + Inline_directiveContext _localctx = new Inline_directiveContext(_ctx, getState()); + enterRule(_localctx, 6, RULE_inline_directive); + int _la; + try { + setState(174); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,3,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(158); + section_inline(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(159); + identifiableType(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(160); + stack(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(161); + includeCond(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(162); + each(); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(163); + _la = _input.LA(1); + if ( !(((_la) & ~0x3f) == 0 && ((1L << _la) & 55169096509030400L) != 0 || (((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 5177361L) != 0) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(164); + composed_php_expression(); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(165); + _la = _input.LA(1); + if ( !(((_la) & ~0x3f) == 0 && ((1L << _la) & 105555263750144L) != 0 || _la==D_CSRF || _la==D_LIVEWIRE) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(166); + asset_bundler(); + } + break; + case 9: + enterOuterAlt(_localctx, 9); + { + setState(167); + inject(); + } + break; + case 10: + enterOuterAlt(_localctx, 10); + { + setState(168); + match(D_PERMISSION_ELSE); + setState(169); + composed_php_expression(); + } + break; + case 11: + enterOuterAlt(_localctx, 11); + { + setState(170); + loop_action(); + } + break; + case 12: + enterOuterAlt(_localctx, 12); + { + setState(171); + match(D_ELSE); + } + break; + case 13: + enterOuterAlt(_localctx, 13); + { + setState(172); + match(D_MISC); + } + break; + case 14: + enterOuterAlt(_localctx, 14); + { + setState(173); + custom_directive(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Block_statementContext extends ParserRuleContext { + public SectionContext section() { + return getRuleContext(SectionContext.class,0); + } + public CondSectionContext condSection() { + return getRuleContext(CondSectionContext.class,0); + } + public PushContext push() { + return getRuleContext(PushContext.class,0); + } + public PushIfContext pushIf() { + return getRuleContext(PushIfContext.class,0); + } + public Once_blockContext once_block() { + return getRuleContext(Once_blockContext.class,0); + } + public PrependContext prepend() { + return getRuleContext(PrependContext.class,0); + } + public FragmentDContext fragmentD() { + return getRuleContext(FragmentDContext.class,0); + } + public IfContext if_() { + return getRuleContext(IfContext.class,0); + } + public SwitchContext switch_() { + return getRuleContext(SwitchContext.class,0); + } + public Env_blockContext env_block() { + return getRuleContext(Env_blockContext.class,0); + } + public Empty_blockContext empty_block() { + return getRuleContext(Empty_blockContext.class,0); + } + public Error_blockContext error_block() { + return getRuleContext(Error_blockContext.class,0); + } + public Conditional_blockContext conditional_block() { + return getRuleContext(Conditional_blockContext.class,0); + } + public Auth_blockContext auth_block() { + return getRuleContext(Auth_blockContext.class,0); + } + public PermissionContext permission() { + return getRuleContext(PermissionContext.class,0); + } + public WhileContext while_() { + return getRuleContext(WhileContext.class,0); + } + public ForContext for_() { + return getRuleContext(ForContext.class,0); + } + public ForeachContext foreach() { + return getRuleContext(ForeachContext.class,0); + } + public ForelseContext forelse() { + return getRuleContext(ForelseContext.class,0); + } + public SessionContext session() { + return getRuleContext(SessionContext.class,0); + } + public Verbatim_blockContext verbatim_block() { + return getRuleContext(Verbatim_blockContext.class,0); + } + public Php_bladeContext php_blade() { + return getRuleContext(Php_bladeContext.class,0); + } + public Block_statementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_block_statement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterBlock_statement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitBlock_statement(this); + } + } + + public final Block_statementContext block_statement() throws RecognitionException { + Block_statementContext _localctx = new Block_statementContext(_ctx, getState()); + enterRule(_localctx, 8, RULE_block_statement); + try { + setState(198); + _errHandler.sync(this); + switch (_input.LA(1)) { + case D_SECTION: + enterOuterAlt(_localctx, 1); + { + setState(176); + section(); + } + break; + case D_HAS_SECTION: + case D_SECTION_MISSING: + enterOuterAlt(_localctx, 2); + { + setState(177); + condSection(); + } + break; + case D_PUSH: + enterOuterAlt(_localctx, 3); + { + setState(178); + push(); + } + break; + case D_PUSH_IF: + enterOuterAlt(_localctx, 4); + { + setState(179); + pushIf(); + } + break; + case D_ONCE: + enterOuterAlt(_localctx, 5); + { + setState(180); + once_block(); + } + break; + case D_PREPEND: + enterOuterAlt(_localctx, 6); + { + setState(181); + prepend(); + } + break; + case D_FRAGMENT: + enterOuterAlt(_localctx, 7); + { + setState(182); + fragmentD(); + } + break; + case D_IF: + enterOuterAlt(_localctx, 8); + { + setState(183); + if_(); + } + break; + case D_SWITCH: + enterOuterAlt(_localctx, 9); + { + setState(184); + switch_(); + } + break; + case D_PRODUCTION: + case D_ENV: + enterOuterAlt(_localctx, 10); + { + setState(185); + env_block(); + } + break; + case D_EMPTY: + enterOuterAlt(_localctx, 11); + { + setState(186); + empty_block(); + } + break; + case D_ERROR: + enterOuterAlt(_localctx, 12); + { + setState(187); + error_block(); + } + break; + case D_COND_BLOCK_START: + enterOuterAlt(_localctx, 13); + { + setState(188); + conditional_block(); + } + break; + case D_AUTH_START: + enterOuterAlt(_localctx, 14); + { + setState(189); + auth_block(); + } + break; + case D_PERMISSION_START: + enterOuterAlt(_localctx, 15); + { + setState(190); + permission(); + } + break; + case D_WHILE: + enterOuterAlt(_localctx, 16); + { + setState(191); + while_(); + } + break; + case D_FOR: + enterOuterAlt(_localctx, 17); + { + setState(192); + for_(); + } + break; + case D_FOREACH: + enterOuterAlt(_localctx, 18); + { + setState(193); + foreach(); + } + break; + case D_FORELSE: + enterOuterAlt(_localctx, 19); + { + setState(194); + forelse(); + } + break; + case D_SESSION: + enterOuterAlt(_localctx, 20); + { + setState(195); + session(); + } + break; + case D_VERBATIM: + enterOuterAlt(_localctx, 21); + { + setState(196); + verbatim_block(); + } + break; + case D_PHP: + enterOuterAlt(_localctx, 22); + { + setState(197); + php_blade(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IdentifiableTypeContext extends ParserRuleContext { + public Token d_name; + public Token idString; + public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } + public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } + public TerminalNode D_INCLUDE() { return getToken(BladeAntlrParser.D_INCLUDE, 0); } + public TerminalNode D_INCLUDE_IF() { return getToken(BladeAntlrParser.D_INCLUDE_IF, 0); } + public TerminalNode D_EXTENDS() { return getToken(BladeAntlrParser.D_EXTENDS, 0); } + public TerminalNode D_YIELD() { return getToken(BladeAntlrParser.D_YIELD, 0); } + public TerminalNode D_USE() { return getToken(BladeAntlrParser.D_USE, 0); } + public TerminalNode D_LANG() { return getToken(BladeAntlrParser.D_LANG, 0); } + public List composedArgument() { + return getRuleContexts(ComposedArgumentContext.class); + } + public ComposedArgumentContext composedArgument(int i) { + return getRuleContext(ComposedArgumentContext.class,i); + } + public TerminalNode BL_PARAM_STRING() { return getToken(BladeAntlrParser.BL_PARAM_STRING, 0); } + public List BL_COMMA() { return getTokens(BladeAntlrParser.BL_COMMA); } + public TerminalNode BL_COMMA(int i) { + return getToken(BladeAntlrParser.BL_COMMA, i); + } + public IdentifiableTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_identifiableType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterIdentifiableType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitIdentifiableType(this); + } + } + + public final IdentifiableTypeContext identifiableType() throws RecognitionException { + IdentifiableTypeContext _localctx = new IdentifiableTypeContext(_ctx, getState()); + enterRule(_localctx, 10, RULE_identifiableType); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(200); + ((IdentifiableTypeContext)_localctx).d_name = _input.LT(1); + _la = _input.LA(1); + if ( !((((_la - 47)) & ~0x3f) == 0 && ((1L << (_la - 47)) & 27021597764231235L) != 0) ) { + ((IdentifiableTypeContext)_localctx).d_name = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(201); + match(BLADE_PARAM_LPAREN); + setState(204); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) { + case 1: + { + setState(202); + ((IdentifiableTypeContext)_localctx).idString = match(BL_PARAM_STRING); + } + break; + case 2: + { + setState(203); + composedArgument(); + } + break; + } + setState(208); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { + case 1: + { + setState(206); + match(BL_COMMA); + setState(207); + composedArgument(); + } + break; + } + setState(211); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==BL_COMMA) { + { + setState(210); + match(BL_COMMA); + } + } + + setState(213); + match(BLADE_PARAM_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Section_inlineContext extends ParserRuleContext { + public TerminalNode D_SECTION() { return getToken(BladeAntlrParser.D_SECTION, 0); } + public DoubleArgWrapperPContext doubleArgWrapperP() { + return getRuleContext(DoubleArgWrapperPContext.class,0); + } + public Section_inlineContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_section_inline; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterSection_inline(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitSection_inline(this); + } + } + + public final Section_inlineContext section_inline() throws RecognitionException { + Section_inlineContext _localctx = new Section_inlineContext(_ctx, getState()); + enterRule(_localctx, 12, RULE_section_inline); + try { + enterOuterAlt(_localctx, 1); + { + setState(215); + match(D_SECTION); + setState(216); + doubleArgWrapperP(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SectionContext extends ParserRuleContext { + public TerminalNode D_SECTION() { return getToken(BladeAntlrParser.D_SECTION, 0); } + public SingleArgWrapperPContext singleArgWrapperP() { + return getRuleContext(SingleArgWrapperPContext.class,0); + } + public TerminalNode D_SHOW() { return getToken(BladeAntlrParser.D_SHOW, 0); } + public TerminalNode D_STOP() { return getToken(BladeAntlrParser.D_STOP, 0); } + public TerminalNode D_OVERWRITE() { return getToken(BladeAntlrParser.D_OVERWRITE, 0); } + public TerminalNode D_ENDSECTION() { return getToken(BladeAntlrParser.D_ENDSECTION, 0); } + public TerminalNode D_APPEND() { return getToken(BladeAntlrParser.D_APPEND, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public List D_PARENT() { return getTokens(BladeAntlrParser.D_PARENT); } + public TerminalNode D_PARENT(int i) { + return getToken(BladeAntlrParser.D_PARENT, i); + } + public SectionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_section; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterSection(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitSection(this); + } + } + + public final SectionContext section() throws RecognitionException { + SectionContext _localctx = new SectionContext(_ctx, getState()); + enterRule(_localctx, 14, RULE_section); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(218); + match(D_SECTION); + setState(219); + singleArgWrapperP(); + setState(224); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 4035201810946850816L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + setState(222); + _errHandler.sync(this); + switch (_input.LA(1)) { + case HTML: + case D_IF: + case D_ELSE: + case D_SWITCH: + case D_CASE: + case D_DEFAULT: + case D_EMPTY: + case D_COND_BLOCK_START: + case D_FOREACH: + case D_FOR: + case D_FORELSE: + case D_WHILE: + case D_BREAK: + case D_LOOP_ACTION: + case D_INCLUDE: + case D_INCLUDE_IF: + case D_INCLUDE_WHEN: + case D_INCLUDE_FIRST: + case D_INCLUDE_UNLESS: + case D_EACH: + case D_EXTENDS: + case D_JS: + case D_JSON: + case D_SECTION: + case D_HAS_SECTION: + case D_SECTION_MISSING: + case D_YIELD: + case D_ONCE: + case D_STACK: + case D_PUSH: + case D_PUSH_IF: + case D_PREPEND: + case D_PROPS: + case D_FRAGMENT: + case D_CSRF: + case D_METHOD: + case D_ERROR: + case D_PRODUCTION: + case D_ENV: + case D_AUTH_START: + case D_PERMISSION_START: + case D_PERMISSION_ELSE: + case D_CLASS: + case D_STYLE: + case D_HTML_ATTR_EXPR: + case D_AWARE: + case D_SESSION: + case D_DD: + case D_LANG: + case D_USE: + case D_INJECT: + case D_PHP: + case D_VERBATIM: + case D_LIVEWIRE: + case D_ASSET_BUNDLER: + case D_MISC: + case D_CUSTOM: + case D_UNKNOWN_ATTR_ENC: + case D_UNKNOWN: + case CONTENT_TAG_OPEN: + case RAW_TAG_OPEN: + case PHP_INLINE_START: + case HTML_COMPONENT_PREFIX: + case HTML_TAG_START: + case HTML_IDENTIFIER: + case EQ: + { + setState(220); + general_statement(); + } + break; + case D_PARENT: + { + setState(221); + match(D_PARENT); + } + break; + default: + throw new NoViableAltException(this); + } + } + setState(226); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(227); + _la = _input.LA(1); + if ( !((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & 121L) != 0) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PushContext extends ParserRuleContext { + public TerminalNode D_PUSH() { return getToken(BladeAntlrParser.D_PUSH, 0); } + public SingleArgWrapperPContext singleArgWrapperP() { + return getRuleContext(SingleArgWrapperPContext.class,0); + } + public TerminalNode D_ENDPUSH() { return getToken(BladeAntlrParser.D_ENDPUSH, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public PushContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_push; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPush(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPush(this); + } + } + + public final PushContext push() throws RecognitionException { + PushContext _localctx = new PushContext(_ctx, getState()); + enterRule(_localctx, 16, RULE_push); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(229); + match(D_PUSH); + setState(230); + singleArgWrapperP(); + setState(234); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(231); + general_statement(); + } + } + setState(236); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(237); + match(D_ENDPUSH); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PushOnceContext extends ParserRuleContext { + public TerminalNode D_PUSH_ONCE() { return getToken(BladeAntlrParser.D_PUSH_ONCE, 0); } + public SingleArgWrapperPContext singleArgWrapperP() { + return getRuleContext(SingleArgWrapperPContext.class,0); + } + public TerminalNode D_ENDPUSH_ONCE() { return getToken(BladeAntlrParser.D_ENDPUSH_ONCE, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public PushOnceContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_pushOnce; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPushOnce(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPushOnce(this); + } + } + + public final PushOnceContext pushOnce() throws RecognitionException { + PushOnceContext _localctx = new PushOnceContext(_ctx, getState()); + enterRule(_localctx, 18, RULE_pushOnce); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(239); + match(D_PUSH_ONCE); + setState(240); + singleArgWrapperP(); + setState(244); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(241); + general_statement(); + } + } + setState(246); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(247); + match(D_ENDPUSH_ONCE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PushIfContext extends ParserRuleContext { + public TerminalNode D_PUSH_IF() { return getToken(BladeAntlrParser.D_PUSH_IF, 0); } + public SingleArgWrapperPContext singleArgWrapperP() { + return getRuleContext(SingleArgWrapperPContext.class,0); + } + public TerminalNode D_ENDPUSH_IF() { return getToken(BladeAntlrParser.D_ENDPUSH_IF, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public PushIfContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_pushIf; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPushIf(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPushIf(this); + } + } + + public final PushIfContext pushIf() throws RecognitionException { + PushIfContext _localctx = new PushIfContext(_ctx, getState()); + enterRule(_localctx, 20, RULE_pushIf); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(249); + match(D_PUSH_IF); + setState(250); + singleArgWrapperP(); + setState(254); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(251); + general_statement(); + } + } + setState(256); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(257); + match(D_ENDPUSH_IF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PrependContext extends ParserRuleContext { + public TerminalNode D_PREPEND() { return getToken(BladeAntlrParser.D_PREPEND, 0); } + public SingleArgWrapperPContext singleArgWrapperP() { + return getRuleContext(SingleArgWrapperPContext.class,0); + } + public TerminalNode D_ENDPREPEND() { return getToken(BladeAntlrParser.D_ENDPREPEND, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public PrependContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_prepend; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPrepend(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPrepend(this); + } + } + + public final PrependContext prepend() throws RecognitionException { + PrependContext _localctx = new PrependContext(_ctx, getState()); + enterRule(_localctx, 22, RULE_prepend); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(259); + match(D_PREPEND); + setState(260); + singleArgWrapperP(); + setState(264); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(261); + general_statement(); + } + } + setState(266); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(267); + match(D_ENDPREPEND); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FragmentDContext extends ParserRuleContext { + public TerminalNode D_FRAGMENT() { return getToken(BladeAntlrParser.D_FRAGMENT, 0); } + public Composed_php_expressionContext composed_php_expression() { + return getRuleContext(Composed_php_expressionContext.class,0); + } + public TerminalNode D_ENDFRAGMENT() { return getToken(BladeAntlrParser.D_ENDFRAGMENT, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public FragmentDContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fragmentD; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterFragmentD(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitFragmentD(this); + } + } + + public final FragmentDContext fragmentD() throws RecognitionException { + FragmentDContext _localctx = new FragmentDContext(_ctx, getState()); + enterRule(_localctx, 24, RULE_fragmentD); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(269); + match(D_FRAGMENT); + setState(270); + composed_php_expression(); + setState(274); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(271); + general_statement(); + } + } + setState(276); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(277); + match(D_ENDFRAGMENT); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IfContext extends ParserRuleContext { + public TerminalNode D_IF() { return getToken(BladeAntlrParser.D_IF, 0); } + public List main_php_expression() { + return getRuleContexts(Main_php_expressionContext.class); + } + public Main_php_expressionContext main_php_expression(int i) { + return getRuleContext(Main_php_expressionContext.class,i); + } + public EndifContext endif() { + return getRuleContext(EndifContext.class,0); + } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public List D_ELSEIF() { return getTokens(BladeAntlrParser.D_ELSEIF); } + public TerminalNode D_ELSEIF(int i) { + return getToken(BladeAntlrParser.D_ELSEIF, i); + } + public ElseContext else_() { + return getRuleContext(ElseContext.class,0); + } + public IfContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_if; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterIf(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitIf(this); + } + } + + public final IfContext if_() throws RecognitionException { + IfContext _localctx = new IfContext(_ctx, getState()); + enterRule(_localctx, 26, RULE_if); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(279); + match(D_IF); + setState(280); + main_php_expression(); + setState(284); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,15,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(281); + general_statement(); + } + } + } + setState(286); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,15,_ctx); + } + setState(297); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==D_ELSEIF) { + { + { + setState(287); + match(D_ELSEIF); + setState(288); + main_php_expression(); + setState(292); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,16,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(289); + general_statement(); + } + } + } + setState(294); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,16,_ctx); + } + } + } + setState(299); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(301); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==D_ELSE) { + { + setState(300); + else_(); + } + } + + setState(303); + endif(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ElseContext extends ParserRuleContext { + public TerminalNode D_ELSE() { return getToken(BladeAntlrParser.D_ELSE, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public ElseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_else; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterElse(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitElse(this); + } + } + + public final ElseContext else_() throws RecognitionException { + ElseContext _localctx = new ElseContext(_ctx, getState()); + enterRule(_localctx, 28, RULE_else); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(305); + match(D_ELSE); + setState(309); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(306); + general_statement(); + } + } + setState(311); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class EndifContext extends ParserRuleContext { + public TerminalNode D_ENDIF() { return getToken(BladeAntlrParser.D_ENDIF, 0); } + public EndifContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_endif; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterEndif(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitEndif(this); + } + } + + public final EndifContext endif() throws RecognitionException { + EndifContext _localctx = new EndifContext(_ctx, getState()); + enterRule(_localctx, 30, RULE_endif); + try { + enterOuterAlt(_localctx, 1); + { + setState(312); + match(D_ENDIF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Empty_blockContext extends ParserRuleContext { + public TerminalNode D_EMPTY() { return getToken(BladeAntlrParser.D_EMPTY, 0); } + public Composed_php_expressionContext composed_php_expression() { + return getRuleContext(Composed_php_expressionContext.class,0); + } + public Simple_conditional_stmContext simple_conditional_stm() { + return getRuleContext(Simple_conditional_stmContext.class,0); + } + public TerminalNode D_ENDEMPTY() { return getToken(BladeAntlrParser.D_ENDEMPTY, 0); } + public Empty_blockContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_empty_block; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterEmpty_block(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitEmpty_block(this); + } + } + + public final Empty_blockContext empty_block() throws RecognitionException { + Empty_blockContext _localctx = new Empty_blockContext(_ctx, getState()); + enterRule(_localctx, 32, RULE_empty_block); + try { + enterOuterAlt(_localctx, 1); + { + setState(314); + match(D_EMPTY); + setState(315); + composed_php_expression(); + setState(316); + simple_conditional_stm(); + setState(317); + match(D_ENDEMPTY); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Conditional_blockContext extends ParserRuleContext { + public TerminalNode D_COND_BLOCK_START() { return getToken(BladeAntlrParser.D_COND_BLOCK_START, 0); } + public Main_php_expressionContext main_php_expression() { + return getRuleContext(Main_php_expressionContext.class,0); + } + public Simple_conditional_stmContext simple_conditional_stm() { + return getRuleContext(Simple_conditional_stmContext.class,0); + } + public TerminalNode D_COND_BLOCK_END() { return getToken(BladeAntlrParser.D_COND_BLOCK_END, 0); } + public Conditional_blockContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_conditional_block; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterConditional_block(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitConditional_block(this); + } + } + + public final Conditional_blockContext conditional_block() throws RecognitionException { + Conditional_blockContext _localctx = new Conditional_blockContext(_ctx, getState()); + enterRule(_localctx, 34, RULE_conditional_block); + try { + enterOuterAlt(_localctx, 1); + { + setState(319); + match(D_COND_BLOCK_START); + setState(320); + main_php_expression(); + setState(321); + simple_conditional_stm(); + setState(322); + match(D_COND_BLOCK_END); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Auth_blockContext extends ParserRuleContext { + public TerminalNode D_AUTH_START() { return getToken(BladeAntlrParser.D_AUTH_START, 0); } + public Simple_conditional_stmContext simple_conditional_stm() { + return getRuleContext(Simple_conditional_stmContext.class,0); + } + public TerminalNode D_AUTH_END() { return getToken(BladeAntlrParser.D_AUTH_END, 0); } + public List BLADE_PARAM_LPAREN() { return getTokens(BladeAntlrParser.BLADE_PARAM_LPAREN); } + public TerminalNode BLADE_PARAM_LPAREN(int i) { + return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, i); + } + public List BLADE_PARAM_RPAREN() { return getTokens(BladeAntlrParser.BLADE_PARAM_RPAREN); } + public TerminalNode BLADE_PARAM_RPAREN(int i) { + return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, i); + } + public List composedArgument() { + return getRuleContexts(ComposedArgumentContext.class); + } + public ComposedArgumentContext composedArgument(int i) { + return getRuleContext(ComposedArgumentContext.class,i); + } + public Auth_blockContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_auth_block; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterAuth_block(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitAuth_block(this); + } + } + + public final Auth_blockContext auth_block() throws RecognitionException { + Auth_blockContext _localctx = new Auth_blockContext(_ctx, getState()); + enterRule(_localctx, 36, RULE_auth_block); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(324); + match(D_AUTH_START); + setState(335); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==BLADE_PARAM_LPAREN) { + { + { + setState(325); + match(BLADE_PARAM_LPAREN); + setState(329); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1475596L) != 0 || _la==BL_PARAM_CONCAT_OPERATOR || _la==BL_NAME_STRING) { + { + { + setState(326); + composedArgument(); + } + } + setState(331); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(332); + match(BLADE_PARAM_RPAREN); + } + } + setState(337); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(338); + simple_conditional_stm(); + setState(339); + match(D_AUTH_END); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Env_blockContext extends ParserRuleContext { + public TerminalNode D_ENV() { return getToken(BladeAntlrParser.D_ENV, 0); } + public SingleArgWrapperPContext singleArgWrapperP() { + return getRuleContext(SingleArgWrapperPContext.class,0); + } + public Simple_conditional_stmContext simple_conditional_stm() { + return getRuleContext(Simple_conditional_stmContext.class,0); + } + public TerminalNode D_ENDENV() { return getToken(BladeAntlrParser.D_ENDENV, 0); } + public TerminalNode D_PRODUCTION() { return getToken(BladeAntlrParser.D_PRODUCTION, 0); } + public TerminalNode D_ENDPRODUCTION() { return getToken(BladeAntlrParser.D_ENDPRODUCTION, 0); } + public Env_blockContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_env_block; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterEnv_block(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitEnv_block(this); + } + } + + public final Env_blockContext env_block() throws RecognitionException { + Env_blockContext _localctx = new Env_blockContext(_ctx, getState()); + enterRule(_localctx, 38, RULE_env_block); + try { + setState(350); + _errHandler.sync(this); + switch (_input.LA(1)) { + case D_ENV: + enterOuterAlt(_localctx, 1); + { + { + setState(341); + match(D_ENV); + setState(342); + singleArgWrapperP(); + setState(343); + simple_conditional_stm(); + setState(344); + match(D_ENDENV); + } + } + break; + case D_PRODUCTION: + enterOuterAlt(_localctx, 2); + { + setState(346); + match(D_PRODUCTION); + setState(347); + simple_conditional_stm(); + setState(348); + match(D_ENDPRODUCTION); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PermissionContext extends ParserRuleContext { + public TerminalNode D_PERMISSION_START() { return getToken(BladeAntlrParser.D_PERMISSION_START, 0); } + public Composed_php_expressionContext composed_php_expression() { + return getRuleContext(Composed_php_expressionContext.class,0); + } + public Simple_conditional_stmContext simple_conditional_stm() { + return getRuleContext(Simple_conditional_stmContext.class,0); + } + public TerminalNode D_PERMISSION_END() { return getToken(BladeAntlrParser.D_PERMISSION_END, 0); } + public PermissionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_permission; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPermission(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPermission(this); + } + } + + public final PermissionContext permission() throws RecognitionException { + PermissionContext _localctx = new PermissionContext(_ctx, getState()); + enterRule(_localctx, 40, RULE_permission); + try { + enterOuterAlt(_localctx, 1); + { + setState(352); + match(D_PERMISSION_START); + setState(353); + composed_php_expression(); + setState(354); + simple_conditional_stm(); + setState(355); + match(D_PERMISSION_END); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Simple_conditional_stmContext extends ParserRuleContext { + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public ElseContext else_() { + return getRuleContext(ElseContext.class,0); + } + public Simple_conditional_stmContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_simple_conditional_stm; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterSimple_conditional_stm(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitSimple_conditional_stm(this); + } + } + + public final Simple_conditional_stmContext simple_conditional_stm() throws RecognitionException { + Simple_conditional_stmContext _localctx = new Simple_conditional_stmContext(_ctx, getState()); + enterRule(_localctx, 42, RULE_simple_conditional_stm); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(360); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,23,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(357); + general_statement(); + } + } + } + setState(362); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,23,_ctx); + } + setState(364); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==D_ELSE) { + { + setState(363); + else_(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Error_blockContext extends ParserRuleContext { + public TerminalNode D_ERROR() { return getToken(BladeAntlrParser.D_ERROR, 0); } + public Php_expressionContext php_expression() { + return getRuleContext(Php_expressionContext.class,0); + } + public TerminalNode D_ENDERROR() { return getToken(BladeAntlrParser.D_ENDERROR, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public Error_blockContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_error_block; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterError_block(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitError_block(this); + } + } + + public final Error_blockContext error_block() throws RecognitionException { + Error_blockContext _localctx = new Error_blockContext(_ctx, getState()); + enterRule(_localctx, 44, RULE_error_block); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(366); + match(D_ERROR); + setState(367); + php_expression(); + setState(371); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(368); + general_statement(); + } + } + setState(373); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(374); + match(D_ENDERROR); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SwitchContext extends ParserRuleContext { + public TerminalNode D_SWITCH() { return getToken(BladeAntlrParser.D_SWITCH, 0); } + public Php_expressionContext php_expression() { + return getRuleContext(Php_expressionContext.class,0); + } + public TerminalNode D_ENDSWITCH() { return getToken(BladeAntlrParser.D_ENDSWITCH, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public List D_BREAK() { return getTokens(BladeAntlrParser.D_BREAK); } + public TerminalNode D_BREAK(int i) { + return getToken(BladeAntlrParser.D_BREAK, i); + } + public SwitchContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_switch; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterSwitch(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitSwitch(this); + } + } + + public final SwitchContext switch_() throws RecognitionException { + SwitchContext _localctx = new SwitchContext(_ctx, getState()); + enterRule(_localctx, 46, RULE_switch); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(376); + match(D_SWITCH); + setState(377); + php_expression(); + setState(380); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + setState(380); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,26,_ctx) ) { + case 1: + { + setState(378); + general_statement(); + } + break; + case 2: + { + setState(379); + match(D_BREAK); + } + break; + } + } + setState(382); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( ((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0 ); + setState(384); + match(D_ENDSWITCH); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class WhileContext extends ParserRuleContext { + public TerminalNode D_WHILE() { return getToken(BladeAntlrParser.D_WHILE, 0); } + public Php_expressionContext php_expression() { + return getRuleContext(Php_expressionContext.class,0); + } + public TerminalNode D_ENDWHILE() { return getToken(BladeAntlrParser.D_ENDWHILE, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public WhileContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_while; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterWhile(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitWhile(this); + } + } + + public final WhileContext while_() throws RecognitionException { + WhileContext _localctx = new WhileContext(_ctx, getState()); + enterRule(_localctx, 48, RULE_while); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(386); + match(D_WHILE); + setState(387); + php_expression(); + setState(391); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(388); + general_statement(); + } + } + setState(393); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(394); + match(D_ENDWHILE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ForContext extends ParserRuleContext { + public TerminalNode D_FOR() { return getToken(BladeAntlrParser.D_FOR, 0); } + public Php_expressionContext php_expression() { + return getRuleContext(Php_expressionContext.class,0); + } + public TerminalNode D_ENDFOR() { return getToken(BladeAntlrParser.D_ENDFOR, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public ForContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_for; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterFor(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitFor(this); + } + } + + public final ForContext for_() throws RecognitionException { + ForContext _localctx = new ForContext(_ctx, getState()); + enterRule(_localctx, 50, RULE_for); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(396); + match(D_FOR); + setState(397); + php_expression(); + setState(401); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(398); + general_statement(); + } + } + setState(403); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(404); + match(D_ENDFOR); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ForeachContext extends ParserRuleContext { + public TerminalNode D_FOREACH() { return getToken(BladeAntlrParser.D_FOREACH, 0); } + public TerminalNode FOREACH_LOOP_LPAREN() { return getToken(BladeAntlrParser.FOREACH_LOOP_LPAREN, 0); } + public Loop_expressionContext loop_expression() { + return getRuleContext(Loop_expressionContext.class,0); + } + public TerminalNode FOREACH_LOOP_RPAREN() { return getToken(BladeAntlrParser.FOREACH_LOOP_RPAREN, 0); } + public TerminalNode D_ENDFOREACH() { return getToken(BladeAntlrParser.D_ENDFOREACH, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public ForeachContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_foreach; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterForeach(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitForeach(this); + } + } + + public final ForeachContext foreach() throws RecognitionException { + ForeachContext _localctx = new ForeachContext(_ctx, getState()); + enterRule(_localctx, 52, RULE_foreach); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(406); + match(D_FOREACH); + setState(407); + match(FOREACH_LOOP_LPAREN); + setState(408); + loop_expression(); + setState(409); + match(FOREACH_LOOP_RPAREN); + setState(413); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(410); + general_statement(); + } + } + setState(415); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(416); + match(D_ENDFOREACH); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ForelseContext extends ParserRuleContext { + public TerminalNode D_FORELSE() { return getToken(BladeAntlrParser.D_FORELSE, 0); } + public TerminalNode FOREACH_LOOP_LPAREN() { return getToken(BladeAntlrParser.FOREACH_LOOP_LPAREN, 0); } + public Loop_expressionContext loop_expression() { + return getRuleContext(Loop_expressionContext.class,0); + } + public TerminalNode FOREACH_LOOP_RPAREN() { return getToken(BladeAntlrParser.FOREACH_LOOP_RPAREN, 0); } + public TerminalNode D_ENDFORELSE() { return getToken(BladeAntlrParser.D_ENDFORELSE, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public List D_EMPTY() { return getTokens(BladeAntlrParser.D_EMPTY); } + public TerminalNode D_EMPTY(int i) { + return getToken(BladeAntlrParser.D_EMPTY, i); + } + public ForelseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_forelse; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterForelse(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitForelse(this); + } + } + + public final ForelseContext forelse() throws RecognitionException { + ForelseContext _localctx = new ForelseContext(_ctx, getState()); + enterRule(_localctx, 54, RULE_forelse); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(418); + match(D_FORELSE); + setState(419); + match(FOREACH_LOOP_LPAREN); + setState(420); + loop_expression(); + setState(421); + match(FOREACH_LOOP_RPAREN); + setState(426); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + setState(424); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,31,_ctx) ) { + case 1: + { + setState(422); + general_statement(); + } + break; + case 2: + { + setState(423); + match(D_EMPTY); + } + break; + } + } + setState(428); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(429); + match(D_ENDFORELSE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SessionContext extends ParserRuleContext { + public TerminalNode D_SESSION() { return getToken(BladeAntlrParser.D_SESSION, 0); } + public Composed_php_expressionContext composed_php_expression() { + return getRuleContext(Composed_php_expressionContext.class,0); + } + public TerminalNode D_ENDSESSION() { return getToken(BladeAntlrParser.D_ENDSESSION, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public SessionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_session; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterSession(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitSession(this); + } + } + + public final SessionContext session() throws RecognitionException { + SessionContext _localctx = new SessionContext(_ctx, getState()); + enterRule(_localctx, 56, RULE_session); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(431); + match(D_SESSION); + setState(432); + composed_php_expression(); + setState(436); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + { + { + setState(433); + general_statement(); + } + } + setState(438); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(439); + match(D_ENDSESSION); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StackContext extends ParserRuleContext { + public TerminalNode D_STACK() { return getToken(BladeAntlrParser.D_STACK, 0); } + public SingleArgWrapperPContext singleArgWrapperP() { + return getRuleContext(SingleArgWrapperPContext.class,0); + } + public StackContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_stack; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterStack(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitStack(this); + } + } + + public final StackContext stack() throws RecognitionException { + StackContext _localctx = new StackContext(_ctx, getState()); + enterRule(_localctx, 58, RULE_stack); + try { + enterOuterAlt(_localctx, 1); + { + setState(441); + match(D_STACK); + setState(442); + singleArgWrapperP(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Asset_bundlerContext extends ParserRuleContext { + public Token d_name; + public Token id_strings; + public Token dir; + public Token id_string; + public TerminalNode BLADE_EXPR_LPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_LPAREN, 0); } + public TerminalNode BLADE_EXPR_RPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_RPAREN, 0); } + public TerminalNode D_ASSET_BUNDLER() { return getToken(BladeAntlrParser.D_ASSET_BUNDLER, 0); } + public TerminalNode BL_SQ_LPAREN() { return getToken(BladeAntlrParser.BL_SQ_LPAREN, 0); } + public TerminalNode BL_SQ_RPAREN() { return getToken(BladeAntlrParser.BL_SQ_RPAREN, 0); } + public List EXPR_STRING() { return getTokens(BladeAntlrParser.EXPR_STRING); } + public TerminalNode EXPR_STRING(int i) { + return getToken(BladeAntlrParser.EXPR_STRING, i); + } + public List composed_php_expression() { + return getRuleContexts(Composed_php_expressionContext.class); + } + public Composed_php_expressionContext composed_php_expression(int i) { + return getRuleContext(Composed_php_expressionContext.class,i); + } + public Asset_bundlerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_asset_bundler; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterAsset_bundler(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitAsset_bundler(this); + } + } + + public final Asset_bundlerContext asset_bundler() throws RecognitionException { + Asset_bundlerContext _localctx = new Asset_bundlerContext(_ctx, getState()); + enterRule(_localctx, 60, RULE_asset_bundler); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(444); + ((Asset_bundlerContext)_localctx).d_name = match(D_ASSET_BUNDLER); + setState(445); + match(BLADE_EXPR_LPAREN); + setState(462); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { + case 1: + { + setState(446); + match(BL_SQ_LPAREN); + setState(448); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(447); + ((Asset_bundlerContext)_localctx).id_strings = match(EXPR_STRING); + } + } + setState(450); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==EXPR_STRING ); + setState(452); + match(BL_SQ_RPAREN); + setState(454); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==EXPR_STRING) { + { + setState(453); + ((Asset_bundlerContext)_localctx).dir = match(EXPR_STRING); + } + } + + } + break; + case 2: + { + setState(456); + ((Asset_bundlerContext)_localctx).id_string = match(EXPR_STRING); + } + break; + case 3: + { + setState(458); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(457); + composed_php_expression(); + } + } + setState(460); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( ((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING ); + } + break; + } + setState(464); + match(BLADE_EXPR_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class InjectContext extends ParserRuleContext { + public TerminalNode D_INJECT() { return getToken(BladeAntlrParser.D_INJECT, 0); } + public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } + public List composedArgument() { + return getRuleContexts(ComposedArgumentContext.class); + } + public ComposedArgumentContext composedArgument(int i) { + return getRuleContext(ComposedArgumentContext.class,i); + } + public TerminalNode BL_COMMA() { return getToken(BladeAntlrParser.BL_COMMA, 0); } + public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } + public IdentifiableArgumentContext identifiableArgument() { + return getRuleContext(IdentifiableArgumentContext.class,0); + } + public InjectContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_inject; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterInject(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitInject(this); + } + } + + public final InjectContext inject() throws RecognitionException { + InjectContext _localctx = new InjectContext(_ctx, getState()); + enterRule(_localctx, 62, RULE_inject); + try { + enterOuterAlt(_localctx, 1); + { + setState(466); + match(D_INJECT); + setState(467); + match(BLADE_PARAM_LPAREN); + setState(468); + composedArgument(); + setState(469); + match(BL_COMMA); + setState(472); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { + case 1: + { + setState(470); + identifiableArgument(); + } + break; + case 2: + { + setState(471); + composedArgument(); + } + break; + } + setState(474); + match(BLADE_PARAM_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IncludeCondContext extends ParserRuleContext { + public Token d_name; + public Token idString; + public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } + public List composedArgument() { + return getRuleContexts(ComposedArgumentContext.class); + } + public ComposedArgumentContext composedArgument(int i) { + return getRuleContext(ComposedArgumentContext.class,i); + } + public List BL_COMMA() { return getTokens(BladeAntlrParser.BL_COMMA); } + public TerminalNode BL_COMMA(int i) { + return getToken(BladeAntlrParser.BL_COMMA, i); + } + public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } + public TerminalNode D_INCLUDE_WHEN() { return getToken(BladeAntlrParser.D_INCLUDE_WHEN, 0); } + public TerminalNode D_INCLUDE_UNLESS() { return getToken(BladeAntlrParser.D_INCLUDE_UNLESS, 0); } + public TerminalNode BL_PARAM_STRING() { return getToken(BladeAntlrParser.BL_PARAM_STRING, 0); } + public IncludeCondContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_includeCond; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterIncludeCond(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitIncludeCond(this); + } + } + + public final IncludeCondContext includeCond() throws RecognitionException { + IncludeCondContext _localctx = new IncludeCondContext(_ctx, getState()); + enterRule(_localctx, 64, RULE_includeCond); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(476); + ((IncludeCondContext)_localctx).d_name = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==D_INCLUDE_WHEN || _la==D_INCLUDE_UNLESS) ) { + ((IncludeCondContext)_localctx).d_name = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(477); + match(BLADE_PARAM_LPAREN); + setState(478); + composedArgument(); + setState(479); + match(BL_COMMA); + setState(482); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { + case 1: + { + setState(480); + ((IncludeCondContext)_localctx).idString = match(BL_PARAM_STRING); + } + break; + case 2: + { + setState(481); + composedArgument(); + } + break; + } + setState(486); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==BL_COMMA) { + { + setState(484); + match(BL_COMMA); + setState(485); + composedArgument(); + } + } + + setState(488); + match(BLADE_PARAM_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class EachContext extends ParserRuleContext { + public Token idString; + public TerminalNode D_EACH() { return getToken(BladeAntlrParser.D_EACH, 0); } + public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } + public List BL_COMMA() { return getTokens(BladeAntlrParser.BL_COMMA); } + public TerminalNode BL_COMMA(int i) { + return getToken(BladeAntlrParser.BL_COMMA, i); + } + public List composedArgument() { + return getRuleContexts(ComposedArgumentContext.class); + } + public ComposedArgumentContext composedArgument(int i) { + return getRuleContext(ComposedArgumentContext.class,i); + } + public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } + public TerminalNode BL_PARAM_STRING() { return getToken(BladeAntlrParser.BL_PARAM_STRING, 0); } + public IdentifiableArgumentContext identifiableArgument() { + return getRuleContext(IdentifiableArgumentContext.class,0); + } + public EachContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_each; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterEach(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitEach(this); + } + } + + public final EachContext each() throws RecognitionException { + EachContext _localctx = new EachContext(_ctx, getState()); + enterRule(_localctx, 66, RULE_each); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(490); + match(D_EACH); + setState(491); + match(BLADE_PARAM_LPAREN); + setState(494); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { + case 1: + { + setState(492); + ((EachContext)_localctx).idString = match(BL_PARAM_STRING); + } + break; + case 2: + { + setState(493); + composedArgument(); + } + break; + } + setState(496); + match(BL_COMMA); + setState(497); + composedArgument(); + setState(498); + match(BL_COMMA); + setState(499); + composedArgument(); + setState(505); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==BL_COMMA) { + { + setState(500); + match(BL_COMMA); + setState(503); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { + case 1: + { + setState(501); + identifiableArgument(); + } + break; + case 2: + { + setState(502); + composedArgument(); + } + break; + } + } + } + + setState(507); + match(BLADE_PARAM_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Once_blockContext extends ParserRuleContext { + public TerminalNode D_ONCE() { return getToken(BladeAntlrParser.D_ONCE, 0); } + public TerminalNode D_ENDONCE() { return getToken(BladeAntlrParser.D_ENDONCE, 0); } + public List general_statement() { + return getRuleContexts(General_statementContext.class); + } + public General_statementContext general_statement(int i) { + return getRuleContext(General_statementContext.class,i); + } + public Once_blockContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_once_block; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterOnce_block(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitOnce_block(this); + } + } + + public final Once_blockContext once_block() throws RecognitionException { + Once_blockContext _localctx = new Once_blockContext(_ctx, getState()); + enterRule(_localctx, 68, RULE_once_block); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(509); + match(D_ONCE); + setState(511); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(510); + general_statement(); + } + } + setState(513); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( ((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0 ); + setState(515); + match(D_ENDONCE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class CondSectionContext extends ParserRuleContext { + public SingleArgWrapperPContext singleArgWrapperP() { + return getRuleContext(SingleArgWrapperPContext.class,0); + } + public Simple_conditional_stmContext simple_conditional_stm() { + return getRuleContext(Simple_conditional_stmContext.class,0); + } + public TerminalNode D_ENDIF() { return getToken(BladeAntlrParser.D_ENDIF, 0); } + public TerminalNode D_SECTION_MISSING() { return getToken(BladeAntlrParser.D_SECTION_MISSING, 0); } + public TerminalNode D_HAS_SECTION() { return getToken(BladeAntlrParser.D_HAS_SECTION, 0); } + public CondSectionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_condSection; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterCondSection(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitCondSection(this); + } + } + + public final CondSectionContext condSection() throws RecognitionException { + CondSectionContext _localctx = new CondSectionContext(_ctx, getState()); + enterRule(_localctx, 70, RULE_condSection); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(517); + _la = _input.LA(1); + if ( !(_la==D_HAS_SECTION || _la==D_SECTION_MISSING) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(518); + singleArgWrapperP(); + setState(519); + simple_conditional_stm(); + setState(520); + match(D_ENDIF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Custom_directiveContext extends ParserRuleContext { + public TerminalNode D_CUSTOM() { return getToken(BladeAntlrParser.D_CUSTOM, 0); } + public MultiArgWrapperContext multiArgWrapper() { + return getRuleContext(MultiArgWrapperContext.class,0); + } + public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } + public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } + public Custom_directiveContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_custom_directive; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterCustom_directive(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitCustom_directive(this); + } + } + + public final Custom_directiveContext custom_directive() throws RecognitionException { + Custom_directiveContext _localctx = new Custom_directiveContext(_ctx, getState()); + enterRule(_localctx, 72, RULE_custom_directive); + try { + enterOuterAlt(_localctx, 1); + { + setState(522); + match(D_CUSTOM); + setState(526); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { + case 1: + { + { + setState(523); + match(BLADE_PARAM_LPAREN); + setState(524); + match(BLADE_PARAM_RPAREN); + } + } + break; + case 2: + { + setState(525); + multiArgWrapper(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PossibleDirectiveContext extends ParserRuleContext { + public TerminalNode D_UNKNOWN() { return getToken(BladeAntlrParser.D_UNKNOWN, 0); } + public TerminalNode D_UNKNOWN_ATTR_ENC() { return getToken(BladeAntlrParser.D_UNKNOWN_ATTR_ENC, 0); } + public PossibleDirectiveContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_possibleDirective; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPossibleDirective(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPossibleDirective(this); + } + } + + public final PossibleDirectiveContext possibleDirective() throws RecognitionException { + PossibleDirectiveContext _localctx = new PossibleDirectiveContext(_ctx, getState()); + enterRule(_localctx, 74, RULE_possibleDirective); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(528); + _la = _input.LA(1); + if ( !(_la==D_UNKNOWN_ATTR_ENC || _la==D_UNKNOWN) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Php_bladeContext extends ParserRuleContext { + public TerminalNode D_PHP() { return getToken(BladeAntlrParser.D_PHP, 0); } + public TerminalNode D_ENDPHP() { return getToken(BladeAntlrParser.D_ENDPHP, 0); } + public List composed_php_expression() { + return getRuleContexts(Composed_php_expressionContext.class); + } + public Composed_php_expressionContext composed_php_expression(int i) { + return getRuleContext(Composed_php_expressionContext.class,i); + } + public Main_php_expressionContext main_php_expression() { + return getRuleContext(Main_php_expressionContext.class,0); + } + public Php_bladeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_php_blade; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPhp_blade(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPhp_blade(this); + } + } + + public final Php_bladeContext php_blade() throws RecognitionException { + Php_bladeContext _localctx = new Php_bladeContext(_ctx, getState()); + enterRule(_localctx, 76, RULE_php_blade); + int _la; + try { + setState(540); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(530); + match(D_PHP); + setState(534); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + { + { + setState(531); + composed_php_expression(); + } + } + setState(536); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(537); + match(D_ENDPHP); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(538); + match(D_PHP); + setState(539); + main_php_expression(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PhpInlineContext extends ParserRuleContext { + public TerminalNode PHP_INLINE_START() { return getToken(BladeAntlrParser.PHP_INLINE_START, 0); } + public TerminalNode PHP_EXIT() { return getToken(BladeAntlrParser.PHP_EXIT, 0); } + public TerminalNode EOF() { return getToken(BladeAntlrParser.EOF, 0); } + public List composed_php_expression() { + return getRuleContexts(Composed_php_expressionContext.class); + } + public Composed_php_expressionContext composed_php_expression(int i) { + return getRuleContext(Composed_php_expressionContext.class,i); + } + public PhpInlineContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_phpInline; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPhpInline(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPhpInline(this); + } + } + + public final PhpInlineContext phpInline() throws RecognitionException { + PhpInlineContext _localctx = new PhpInlineContext(_ctx, getState()); + enterRule(_localctx, 78, RULE_phpInline); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(542); + match(PHP_INLINE_START); + setState(544); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(543); + composed_php_expression(); + } + } + setState(546); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( ((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING ); + setState(548); + _la = _input.LA(1); + if ( !(_la==EOF || _la==PHP_EXIT) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Regular_echoContext extends ParserRuleContext { + public TerminalNode CONTENT_TAG_OPEN() { return getToken(BladeAntlrParser.CONTENT_TAG_OPEN, 0); } + public TerminalNode CONTENT_TAG_CLOSE() { return getToken(BladeAntlrParser.CONTENT_TAG_CLOSE, 0); } + public List echo_expr() { + return getRuleContexts(Echo_exprContext.class); + } + public Echo_exprContext echo_expr(int i) { + return getRuleContext(Echo_exprContext.class,i); + } + public Regular_echoContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_regular_echo; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterRegular_echo(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitRegular_echo(this); + } + } + + public final Regular_echoContext regular_echo() throws RecognitionException { + Regular_echoContext _localctx = new Regular_echoContext(_ctx, getState()); + enterRule(_localctx, 80, RULE_regular_echo); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(550); + match(CONTENT_TAG_OPEN); + setState(554); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + { + { + setState(551); + echo_expr(); + } + } + setState(556); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(557); + match(CONTENT_TAG_CLOSE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Raw_echoContext extends ParserRuleContext { + public TerminalNode RAW_TAG_OPEN() { return getToken(BladeAntlrParser.RAW_TAG_OPEN, 0); } + public TerminalNode RAW_TAG_CLOSE() { return getToken(BladeAntlrParser.RAW_TAG_CLOSE, 0); } + public List echo_expr() { + return getRuleContexts(Echo_exprContext.class); + } + public Echo_exprContext echo_expr(int i) { + return getRuleContext(Echo_exprContext.class,i); + } + public Raw_echoContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_raw_echo; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterRaw_echo(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitRaw_echo(this); + } + } + + public final Raw_echoContext raw_echo() throws RecognitionException { + Raw_echoContext _localctx = new Raw_echoContext(_ctx, getState()); + enterRule(_localctx, 82, RULE_raw_echo); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(559); + match(RAW_TAG_OPEN); + setState(563); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + { + { + setState(560); + echo_expr(); + } + } + setState(565); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(566); + match(RAW_TAG_CLOSE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Echo_exprContext extends ParserRuleContext { + public Composed_php_expressionContext composed_php_expression() { + return getRuleContext(Composed_php_expressionContext.class,0); + } + public Echo_exprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_echo_expr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterEcho_expr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitEcho_expr(this); + } + } + + public final Echo_exprContext echo_expr() throws RecognitionException { + Echo_exprContext _localctx = new Echo_exprContext(_ctx, getState()); + enterRule(_localctx, 84, RULE_echo_expr); + try { + enterOuterAlt(_localctx, 1); + { + setState(568); + composed_php_expression(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Class_expr_usageContext extends ParserRuleContext { + public Class_name_referenceContext class_name_reference() { + return getRuleContext(Class_name_referenceContext.class,0); + } + public Object_alias_static_accessContext object_alias_static_access() { + return getRuleContext(Object_alias_static_accessContext.class,0); + } + public Object_alias_direct_accessContext object_alias_direct_access() { + return getRuleContext(Object_alias_direct_accessContext.class,0); + } + public Static_direct_class_accessContext static_direct_class_access() { + return getRuleContext(Static_direct_class_accessContext.class,0); + } + public Static_direct_namespace_class_accessContext static_direct_namespace_class_access() { + return getRuleContext(Static_direct_namespace_class_accessContext.class,0); + } + public Class_instanceContext class_instance() { + return getRuleContext(Class_instanceContext.class,0); + } + public Class_expr_usageContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_class_expr_usage; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterClass_expr_usage(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitClass_expr_usage(this); + } + } + + public final Class_expr_usageContext class_expr_usage() throws RecognitionException { + Class_expr_usageContext _localctx = new Class_expr_usageContext(_ctx, getState()); + enterRule(_localctx, 86, RULE_class_expr_usage); + try { + setState(576); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(570); + class_name_reference(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(571); + object_alias_static_access(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(572); + object_alias_direct_access(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(573); + static_direct_class_access(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(574); + static_direct_namespace_class_access(); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(575); + class_instance(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Object_alias_static_accessContext extends ParserRuleContext { + public Token alias_name; + public Token static_property; + public TerminalNode PHP_STATIC_ACCESS() { return getToken(BladeAntlrParser.PHP_STATIC_ACCESS, 0); } + public TerminalNode PHP_VARIABLE() { return getToken(BladeAntlrParser.PHP_VARIABLE, 0); } + public TerminalNode PHP_IDENTIFIER() { return getToken(BladeAntlrParser.PHP_IDENTIFIER, 0); } + public Object_alias_static_accessContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_object_alias_static_access; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterObject_alias_static_access(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitObject_alias_static_access(this); + } + } + + public final Object_alias_static_accessContext object_alias_static_access() throws RecognitionException { + Object_alias_static_accessContext _localctx = new Object_alias_static_accessContext(_ctx, getState()); + enterRule(_localctx, 88, RULE_object_alias_static_access); + try { + enterOuterAlt(_localctx, 1); + { + setState(578); + ((Object_alias_static_accessContext)_localctx).alias_name = match(PHP_VARIABLE); + setState(579); + match(PHP_STATIC_ACCESS); + setState(580); + ((Object_alias_static_accessContext)_localctx).static_property = match(PHP_IDENTIFIER); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Object_alias_direct_accessContext extends ParserRuleContext { + public Token alias_name; + public Token property; + public TerminalNode PHP_INSTANCE_ACCESS() { return getToken(BladeAntlrParser.PHP_INSTANCE_ACCESS, 0); } + public TerminalNode PHP_VARIABLE() { return getToken(BladeAntlrParser.PHP_VARIABLE, 0); } + public TerminalNode PHP_IDENTIFIER() { return getToken(BladeAntlrParser.PHP_IDENTIFIER, 0); } + public Object_alias_direct_accessContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_object_alias_direct_access; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterObject_alias_direct_access(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitObject_alias_direct_access(this); + } + } + + public final Object_alias_direct_accessContext object_alias_direct_access() throws RecognitionException { + Object_alias_direct_accessContext _localctx = new Object_alias_direct_accessContext(_ctx, getState()); + enterRule(_localctx, 90, RULE_object_alias_direct_access); + try { + enterOuterAlt(_localctx, 1); + { + setState(582); + ((Object_alias_direct_accessContext)_localctx).alias_name = match(PHP_VARIABLE); + setState(583); + match(PHP_INSTANCE_ACCESS); + setState(584); + ((Object_alias_direct_accessContext)_localctx).property = match(PHP_IDENTIFIER); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Static_direct_class_accessContext extends ParserRuleContext { + public Token class_name; + public Token func_name; + public Token static_property; + public TerminalNode PHP_STATIC_ACCESS() { return getToken(BladeAntlrParser.PHP_STATIC_ACCESS, 0); } + public TerminalNode BLADE_EXPR_LPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_LPAREN, 0); } + public TerminalNode BLADE_EXPR_RPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_RPAREN, 0); } + public List PHP_IDENTIFIER() { return getTokens(BladeAntlrParser.PHP_IDENTIFIER); } + public TerminalNode PHP_IDENTIFIER(int i) { + return getToken(BladeAntlrParser.PHP_IDENTIFIER, i); + } + public List composed_php_expression() { + return getRuleContexts(Composed_php_expressionContext.class); + } + public Composed_php_expressionContext composed_php_expression(int i) { + return getRuleContext(Composed_php_expressionContext.class,i); + } + public Static_direct_class_accessContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_static_direct_class_access; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterStatic_direct_class_access(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitStatic_direct_class_access(this); + } + } + + public final Static_direct_class_accessContext static_direct_class_access() throws RecognitionException { + Static_direct_class_accessContext _localctx = new Static_direct_class_accessContext(_ctx, getState()); + enterRule(_localctx, 92, RULE_static_direct_class_access); + int _la; + try { + setState(600); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(586); + ((Static_direct_class_accessContext)_localctx).class_name = match(PHP_IDENTIFIER); + setState(587); + match(PHP_STATIC_ACCESS); + setState(588); + ((Static_direct_class_accessContext)_localctx).func_name = match(PHP_IDENTIFIER); + setState(589); + match(BLADE_EXPR_LPAREN); + setState(593); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + { + { + setState(590); + composed_php_expression(); + } + } + setState(595); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(596); + match(BLADE_EXPR_RPAREN); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(597); + ((Static_direct_class_accessContext)_localctx).class_name = match(PHP_IDENTIFIER); + setState(598); + match(PHP_STATIC_ACCESS); + setState(599); + ((Static_direct_class_accessContext)_localctx).static_property = match(PHP_IDENTIFIER); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Static_direct_namespace_class_accessContext extends ParserRuleContext { + public Token namespace; + public Token class_name; + public Token func_name; + public Token static_property; + public TerminalNode PHP_STATIC_ACCESS() { return getToken(BladeAntlrParser.PHP_STATIC_ACCESS, 0); } + public TerminalNode BLADE_EXPR_LPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_LPAREN, 0); } + public TerminalNode BLADE_EXPR_RPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_RPAREN, 0); } + public List PHP_IDENTIFIER() { return getTokens(BladeAntlrParser.PHP_IDENTIFIER); } + public TerminalNode PHP_IDENTIFIER(int i) { + return getToken(BladeAntlrParser.PHP_IDENTIFIER, i); + } + public List composed_php_expression() { + return getRuleContexts(Composed_php_expressionContext.class); + } + public Composed_php_expressionContext composed_php_expression(int i) { + return getRuleContext(Composed_php_expressionContext.class,i); + } + public TerminalNode PHP_NAMESPACE_PATH() { return getToken(BladeAntlrParser.PHP_NAMESPACE_PATH, 0); } + public Static_direct_namespace_class_accessContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_static_direct_namespace_class_access; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterStatic_direct_namespace_class_access(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitStatic_direct_namespace_class_access(this); + } + } + + public final Static_direct_namespace_class_accessContext static_direct_namespace_class_access() throws RecognitionException { + Static_direct_namespace_class_accessContext _localctx = new Static_direct_namespace_class_accessContext(_ctx, getState()); + enterRule(_localctx, 94, RULE_static_direct_namespace_class_access); + int _la; + try { + setState(622); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(603); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PHP_NAMESPACE_PATH) { + { + setState(602); + ((Static_direct_namespace_class_accessContext)_localctx).namespace = match(PHP_NAMESPACE_PATH); + } + } + + setState(605); + ((Static_direct_namespace_class_accessContext)_localctx).class_name = match(PHP_IDENTIFIER); + setState(606); + match(PHP_STATIC_ACCESS); + setState(607); + ((Static_direct_namespace_class_accessContext)_localctx).func_name = match(PHP_IDENTIFIER); + setState(608); + match(BLADE_EXPR_LPAREN); + setState(612); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + { + { + setState(609); + composed_php_expression(); + } + } + setState(614); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(615); + match(BLADE_EXPR_RPAREN); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(617); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PHP_NAMESPACE_PATH) { + { + setState(616); + ((Static_direct_namespace_class_accessContext)_localctx).namespace = match(PHP_NAMESPACE_PATH); + } + } + + setState(619); + ((Static_direct_namespace_class_accessContext)_localctx).class_name = match(PHP_IDENTIFIER); + setState(620); + match(PHP_STATIC_ACCESS); + setState(621); + ((Static_direct_namespace_class_accessContext)_localctx).static_property = match(PHP_IDENTIFIER); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Class_instanceContext extends ParserRuleContext { + public Token namespace; + public Token class_name; + public TerminalNode PHP_NEW() { return getToken(BladeAntlrParser.PHP_NEW, 0); } + public TerminalNode BLADE_EXPR_LPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_LPAREN, 0); } + public TerminalNode BLADE_EXPR_RPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_RPAREN, 0); } + public TerminalNode PHP_IDENTIFIER() { return getToken(BladeAntlrParser.PHP_IDENTIFIER, 0); } + public List composed_php_expression() { + return getRuleContexts(Composed_php_expressionContext.class); + } + public Composed_php_expressionContext composed_php_expression(int i) { + return getRuleContext(Composed_php_expressionContext.class,i); + } + public TerminalNode PHP_NAMESPACE_PATH() { return getToken(BladeAntlrParser.PHP_NAMESPACE_PATH, 0); } + public Class_instanceContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_class_instance; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterClass_instance(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitClass_instance(this); + } + } + + public final Class_instanceContext class_instance() throws RecognitionException { + Class_instanceContext _localctx = new Class_instanceContext(_ctx, getState()); + enterRule(_localctx, 96, RULE_class_instance); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(624); + match(PHP_NEW); + { + setState(626); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PHP_NAMESPACE_PATH) { + { + setState(625); + ((Class_instanceContext)_localctx).namespace = match(PHP_NAMESPACE_PATH); + } + } + + setState(628); + ((Class_instanceContext)_localctx).class_name = match(PHP_IDENTIFIER); + } + setState(630); + match(BLADE_EXPR_LPAREN); + setState(634); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + { + { + setState(631); + composed_php_expression(); + } + } + setState(636); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(637); + match(BLADE_EXPR_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Class_name_referenceContext extends ParserRuleContext { + public Token namespace; + public Token class_name; + public TerminalNode PHP_STATIC_ACCESS() { return getToken(BladeAntlrParser.PHP_STATIC_ACCESS, 0); } + public TerminalNode PHP_CLASS_KEYWORD() { return getToken(BladeAntlrParser.PHP_CLASS_KEYWORD, 0); } + public TerminalNode PHP_IDENTIFIER() { return getToken(BladeAntlrParser.PHP_IDENTIFIER, 0); } + public TerminalNode PHP_NAMESPACE_PATH() { return getToken(BladeAntlrParser.PHP_NAMESPACE_PATH, 0); } + public Class_name_referenceContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_class_name_reference; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterClass_name_reference(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitClass_name_reference(this); + } + } + + public final Class_name_referenceContext class_name_reference() throws RecognitionException { + Class_name_referenceContext _localctx = new Class_name_referenceContext(_ctx, getState()); + enterRule(_localctx, 98, RULE_class_name_reference); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(640); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PHP_NAMESPACE_PATH) { + { + setState(639); + ((Class_name_referenceContext)_localctx).namespace = match(PHP_NAMESPACE_PATH); + } + } + + setState(642); + ((Class_name_referenceContext)_localctx).class_name = match(PHP_IDENTIFIER); + setState(643); + match(PHP_STATIC_ACCESS); + setState(644); + match(PHP_CLASS_KEYWORD); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class NamespacePathContext extends ParserRuleContext { + public Token namespace; + public Token class_name; + public TerminalNode PHP_IDENTIFIER() { return getToken(BladeAntlrParser.PHP_IDENTIFIER, 0); } + public TerminalNode PHP_NAMESPACE_PATH() { return getToken(BladeAntlrParser.PHP_NAMESPACE_PATH, 0); } + public NamespacePathContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_namespacePath; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterNamespacePath(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitNamespacePath(this); + } + } + + public final NamespacePathContext namespacePath() throws RecognitionException { + NamespacePathContext _localctx = new NamespacePathContext(_ctx, getState()); + enterRule(_localctx, 100, RULE_namespacePath); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(647); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PHP_NAMESPACE_PATH) { + { + setState(646); + ((NamespacePathContext)_localctx).namespace = match(PHP_NAMESPACE_PATH); + } + } + + setState(649); + ((NamespacePathContext)_localctx).class_name = match(PHP_IDENTIFIER); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Function_callContext extends ParserRuleContext { + public Token func_name; + public TerminalNode BLADE_EXPR_LPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_LPAREN, 0); } + public TerminalNode BLADE_EXPR_RPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_RPAREN, 0); } + public TerminalNode PHP_IDENTIFIER() { return getToken(BladeAntlrParser.PHP_IDENTIFIER, 0); } + public List composed_php_expression() { + return getRuleContexts(Composed_php_expressionContext.class); + } + public Composed_php_expressionContext composed_php_expression(int i) { + return getRuleContext(Composed_php_expressionContext.class,i); + } + public Function_callContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_function_call; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterFunction_call(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitFunction_call(this); + } + } + + public final Function_callContext function_call() throws RecognitionException { + Function_callContext _localctx = new Function_callContext(_ctx, getState()); + enterRule(_localctx, 102, RULE_function_call); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(651); + ((Function_callContext)_localctx).func_name = match(PHP_IDENTIFIER); + setState(652); + match(BLADE_EXPR_LPAREN); + setState(656); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + { + { + setState(653); + composed_php_expression(); + } + } + setState(658); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(659); + match(BLADE_EXPR_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Php_expressionContext extends ParserRuleContext { + public TerminalNode PHP_EXPRESSION() { return getToken(BladeAntlrParser.PHP_EXPRESSION, 0); } + public Php_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_php_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPhp_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPhp_expression(this); + } + } + + public final Php_expressionContext php_expression() throws RecognitionException { + Php_expressionContext _localctx = new Php_expressionContext(_ctx, getState()); + enterRule(_localctx, 104, RULE_php_expression); + try { + enterOuterAlt(_localctx, 1); + { + setState(661); + match(PHP_EXPRESSION); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Loop_expressionContext extends ParserRuleContext { + public Simple_foreach_exprContext simple_foreach_expr() { + return getRuleContext(Simple_foreach_exprContext.class,0); + } + public List PHP_VARIABLE() { return getTokens(BladeAntlrParser.PHP_VARIABLE); } + public TerminalNode PHP_VARIABLE(int i) { + return getToken(BladeAntlrParser.PHP_VARIABLE, i); + } + public List PHP_EXPRESSION() { return getTokens(BladeAntlrParser.PHP_EXPRESSION); } + public TerminalNode PHP_EXPRESSION(int i) { + return getToken(BladeAntlrParser.PHP_EXPRESSION, i); + } + public List FOREACH_PARAM_ASSIGN() { return getTokens(BladeAntlrParser.FOREACH_PARAM_ASSIGN); } + public TerminalNode FOREACH_PARAM_ASSIGN(int i) { + return getToken(BladeAntlrParser.FOREACH_PARAM_ASSIGN, i); + } + public List FOREACH_LOOP_LPAREN() { return getTokens(BladeAntlrParser.FOREACH_LOOP_LPAREN); } + public TerminalNode FOREACH_LOOP_LPAREN(int i) { + return getToken(BladeAntlrParser.FOREACH_LOOP_LPAREN, i); + } + public List FOREACH_LOOP_RPAREN() { return getTokens(BladeAntlrParser.FOREACH_LOOP_RPAREN); } + public TerminalNode FOREACH_LOOP_RPAREN(int i) { + return getToken(BladeAntlrParser.FOREACH_LOOP_RPAREN, i); + } + public List FOREACH_AS() { return getTokens(BladeAntlrParser.FOREACH_AS); } + public TerminalNode FOREACH_AS(int i) { + return getToken(BladeAntlrParser.FOREACH_AS, i); + } + public Loop_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_loop_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterLoop_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitLoop_expression(this); + } + } + + public final Loop_expressionContext loop_expression() throws RecognitionException { + Loop_expressionContext _localctx = new Loop_expressionContext(_ctx, getState()); + enterRule(_localctx, 106, RULE_loop_expression); + int _la; + try { + int _alt; + setState(669); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(663); + simple_foreach_expr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(665); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(664); + _la = _input.LA(1); + if ( !(_la==PHP_EXPRESSION || _la==PHP_VARIABLE || (((_la - 139)) & ~0x3f) == 0 && ((1L << (_la - 139)) & 15L) != 0) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(667); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,63,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Main_php_expressionContext extends ParserRuleContext { + public TerminalNode BLADE_EXPR_LPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_LPAREN, 0); } + public TerminalNode BLADE_EXPR_RPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_RPAREN, 0); } + public List composed_php_expression() { + return getRuleContexts(Composed_php_expressionContext.class); + } + public Composed_php_expressionContext composed_php_expression(int i) { + return getRuleContext(Composed_php_expressionContext.class,i); + } + public Main_php_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_main_php_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterMain_php_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitMain_php_expression(this); + } + } + + public final Main_php_expressionContext main_php_expression() throws RecognitionException { + Main_php_expressionContext _localctx = new Main_php_expressionContext(_ctx, getState()); + enterRule(_localctx, 108, RULE_main_php_expression); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(671); + match(BLADE_EXPR_LPAREN); + setState(673); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(672); + composed_php_expression(); + } + } + setState(675); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( ((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING ); + setState(677); + match(BLADE_EXPR_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Composed_php_expressionContext extends ParserRuleContext { + public Class_expr_usageContext class_expr_usage() { + return getRuleContext(Class_expr_usageContext.class,0); + } + public Function_callContext function_call() { + return getRuleContext(Function_callContext.class,0); + } + public TerminalNode PHP_IDENTIFIER() { return getToken(BladeAntlrParser.PHP_IDENTIFIER, 0); } + public NamespacePathContext namespacePath() { + return getRuleContext(NamespacePathContext.class,0); + } + public TerminalNode PHP_VARIABLE() { return getToken(BladeAntlrParser.PHP_VARIABLE, 0); } + public TerminalNode PHP_NAMESPACE_PATH() { return getToken(BladeAntlrParser.PHP_NAMESPACE_PATH, 0); } + public TerminalNode EXPR_STRING() { return getToken(BladeAntlrParser.EXPR_STRING, 0); } + public TerminalNode PHP_KEYWORD() { return getToken(BladeAntlrParser.PHP_KEYWORD, 0); } + public List PHP_EXPRESSION() { return getTokens(BladeAntlrParser.PHP_EXPRESSION); } + public TerminalNode PHP_EXPRESSION(int i) { + return getToken(BladeAntlrParser.PHP_EXPRESSION, i); + } + public TerminalNode PHP_STATIC_ACCESS() { return getToken(BladeAntlrParser.PHP_STATIC_ACCESS, 0); } + public TerminalNode PHP_CLASS_KEYWORD() { return getToken(BladeAntlrParser.PHP_CLASS_KEYWORD, 0); } + public TerminalNode PHP_INSTANCE_ACCESS() { return getToken(BladeAntlrParser.PHP_INSTANCE_ACCESS, 0); } + public TerminalNode BL_SQ_LPAREN() { return getToken(BladeAntlrParser.BL_SQ_LPAREN, 0); } + public TerminalNode BL_SQ_RPAREN() { return getToken(BladeAntlrParser.BL_SQ_RPAREN, 0); } + public List composed_php_expression() { + return getRuleContexts(Composed_php_expressionContext.class); + } + public Composed_php_expressionContext composed_php_expression(int i) { + return getRuleContext(Composed_php_expressionContext.class,i); + } + public TerminalNode BLADE_EXPR_LPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_LPAREN, 0); } + public TerminalNode BLADE_EXPR_RPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_RPAREN, 0); } + public TerminalNode PHP_EXPR_STRING() { return getToken(BladeAntlrParser.PHP_EXPR_STRING, 0); } + public Composed_php_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_composed_php_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterComposed_php_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitComposed_php_expression(this); + } + } + + public final Composed_php_expressionContext composed_php_expression() throws RecognitionException { + Composed_php_expressionContext _localctx = new Composed_php_expressionContext(_ctx, getState()); + enterRule(_localctx, 110, RULE_composed_php_expression); + int _la; + try { + int _alt; + setState(712); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(679); + class_expr_usage(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(680); + function_call(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(681); + match(PHP_IDENTIFIER); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(682); + namespacePath(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(683); + match(PHP_VARIABLE); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(684); + match(PHP_NAMESPACE_PATH); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(685); + match(EXPR_STRING); + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(686); + match(PHP_KEYWORD); + } + break; + case 9: + enterOuterAlt(_localctx, 9); + { + setState(688); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(687); + match(PHP_EXPRESSION); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(690); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,66,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + break; + case 10: + enterOuterAlt(_localctx, 10); + { + setState(692); + match(PHP_STATIC_ACCESS); + } + break; + case 11: + enterOuterAlt(_localctx, 11); + { + setState(693); + match(PHP_CLASS_KEYWORD); + } + break; + case 12: + enterOuterAlt(_localctx, 12); + { + setState(694); + match(PHP_INSTANCE_ACCESS); + } + break; + case 13: + enterOuterAlt(_localctx, 13); + { + setState(695); + match(BL_SQ_LPAREN); + setState(699); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + { + { + setState(696); + composed_php_expression(); + } + } + setState(701); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(702); + match(BL_SQ_RPAREN); + } + break; + case 14: + enterOuterAlt(_localctx, 14); + { + setState(703); + match(BLADE_EXPR_LPAREN); + setState(707); + _errHandler.sync(this); + _la = _input.LA(1); + while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + { + { + setState(704); + composed_php_expression(); + } + } + setState(709); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(710); + match(BLADE_EXPR_RPAREN); + } + break; + case 15: + enterOuterAlt(_localctx, 15); + { + setState(711); + match(PHP_EXPR_STRING); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Simple_foreach_exprContext extends ParserRuleContext { + public Token loop_array; + public Token key; + public Token item; + public TerminalNode FOREACH_AS() { return getToken(BladeAntlrParser.FOREACH_AS, 0); } + public List PHP_VARIABLE() { return getTokens(BladeAntlrParser.PHP_VARIABLE); } + public TerminalNode PHP_VARIABLE(int i) { + return getToken(BladeAntlrParser.PHP_VARIABLE, i); + } + public TerminalNode FOREACH_PARAM_ASSIGN() { return getToken(BladeAntlrParser.FOREACH_PARAM_ASSIGN, 0); } + public Simple_foreach_exprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_simple_foreach_expr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterSimple_foreach_expr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitSimple_foreach_expr(this); + } + } + + public final Simple_foreach_exprContext simple_foreach_expr() throws RecognitionException { + Simple_foreach_exprContext _localctx = new Simple_foreach_exprContext(_ctx, getState()); + enterRule(_localctx, 112, RULE_simple_foreach_expr); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(714); + ((Simple_foreach_exprContext)_localctx).loop_array = match(PHP_VARIABLE); + setState(715); + match(FOREACH_AS); + setState(716); + ((Simple_foreach_exprContext)_localctx).key = match(PHP_VARIABLE); + setState(719); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==FOREACH_PARAM_ASSIGN) { + { + setState(717); + match(FOREACH_PARAM_ASSIGN); + setState(718); + ((Simple_foreach_exprContext)_localctx).item = match(PHP_VARIABLE); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SingleArgWrapperPContext extends ParserRuleContext { + public Token idString; + public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } + public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } + public ComposedArgumentContext composedArgument() { + return getRuleContext(ComposedArgumentContext.class,0); + } + public TerminalNode BL_PARAM_STRING() { return getToken(BladeAntlrParser.BL_PARAM_STRING, 0); } + public SingleArgWrapperPContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_singleArgWrapperP; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterSingleArgWrapperP(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitSingleArgWrapperP(this); + } + } + + public final SingleArgWrapperPContext singleArgWrapperP() throws RecognitionException { + SingleArgWrapperPContext _localctx = new SingleArgWrapperPContext(_ctx, getState()); + enterRule(_localctx, 114, RULE_singleArgWrapperP); + try { + enterOuterAlt(_localctx, 1); + { + setState(721); + match(BLADE_PARAM_LPAREN); + setState(724); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { + case 1: + { + setState(722); + ((SingleArgWrapperPContext)_localctx).idString = match(BL_PARAM_STRING); + } + break; + case 2: + { + setState(723); + composedArgument(); + } + break; + } + setState(726); + match(BLADE_PARAM_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DoubleArgWrapperPContext extends ParserRuleContext { + public Token idString; + public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } + public TerminalNode BL_COMMA() { return getToken(BladeAntlrParser.BL_COMMA, 0); } + public List composedArgument() { + return getRuleContexts(ComposedArgumentContext.class); + } + public ComposedArgumentContext composedArgument(int i) { + return getRuleContext(ComposedArgumentContext.class,i); + } + public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } + public TerminalNode BL_PARAM_STRING() { return getToken(BladeAntlrParser.BL_PARAM_STRING, 0); } + public DoubleArgWrapperPContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_doubleArgWrapperP; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterDoubleArgWrapperP(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitDoubleArgWrapperP(this); + } + } + + public final DoubleArgWrapperPContext doubleArgWrapperP() throws RecognitionException { + DoubleArgWrapperPContext _localctx = new DoubleArgWrapperPContext(_ctx, getState()); + enterRule(_localctx, 116, RULE_doubleArgWrapperP); + try { + enterOuterAlt(_localctx, 1); + { + setState(728); + match(BLADE_PARAM_LPAREN); + setState(731); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { + case 1: + { + setState(729); + ((DoubleArgWrapperPContext)_localctx).idString = match(BL_PARAM_STRING); + } + break; + case 2: + { + setState(730); + composedArgument(); + } + break; + } + setState(733); + match(BL_COMMA); + setState(734); + composedArgument(); + setState(735); + match(BLADE_PARAM_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class MultiArgWrapperContext extends ParserRuleContext { + public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } + public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } + public List composedArgument() { + return getRuleContexts(ComposedArgumentContext.class); + } + public ComposedArgumentContext composedArgument(int i) { + return getRuleContext(ComposedArgumentContext.class,i); + } + public List BL_COMMA() { return getTokens(BladeAntlrParser.BL_COMMA); } + public TerminalNode BL_COMMA(int i) { + return getToken(BladeAntlrParser.BL_COMMA, i); + } + public MultiArgWrapperContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_multiArgWrapper; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterMultiArgWrapper(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitMultiArgWrapper(this); + } + } + + public final MultiArgWrapperContext multiArgWrapper() throws RecognitionException { + MultiArgWrapperContext _localctx = new MultiArgWrapperContext(_ctx, getState()); + enterRule(_localctx, 118, RULE_multiArgWrapper); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(737); + match(BLADE_PARAM_LPAREN); + { + setState(738); + composedArgument(); + } + setState(743); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==BL_COMMA) { + { + { + setState(739); + match(BL_COMMA); + setState(740); + composedArgument(); + } + } + setState(745); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(746); + match(BLADE_PARAM_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IdentifiableArgumentContext extends ParserRuleContext { + public TerminalNode BL_PARAM_STRING() { return getToken(BladeAntlrParser.BL_PARAM_STRING, 0); } + public IdentifiableArgumentContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_identifiableArgument; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterIdentifiableArgument(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitIdentifiableArgument(this); + } + } + + public final IdentifiableArgumentContext identifiableArgument() throws RecognitionException { + IdentifiableArgumentContext _localctx = new IdentifiableArgumentContext(_ctx, getState()); + enterRule(_localctx, 120, RULE_identifiableArgument); + try { + enterOuterAlt(_localctx, 1); + { + setState(748); + match(BL_PARAM_STRING); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ComposedArgumentContext extends ParserRuleContext { + public List phpExpr() { + return getRuleContexts(PhpExprContext.class); + } + public PhpExprContext phpExpr(int i) { + return getRuleContext(PhpExprContext.class,i); + } + public ComposedArgumentContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_composedArgument; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterComposedArgument(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitComposedArgument(this); + } + } + + public final ComposedArgumentContext composedArgument() throws RecognitionException { + ComposedArgumentContext _localctx = new ComposedArgumentContext(_ctx, getState()); + enterRule(_localctx, 122, RULE_composedArgument); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(751); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(750); + phpExpr(); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(753); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,74,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PhpExprContext extends ParserRuleContext { + public IdentifiableArrayContext identifiableArray() { + return getRuleContext(IdentifiableArrayContext.class,0); + } + public ArrayDefineContext arrayDefine() { + return getRuleContext(ArrayDefineContext.class,0); + } + public TerminalNode BLADE_PARAM_EXTRA() { return getToken(BladeAntlrParser.BLADE_PARAM_EXTRA, 0); } + public TerminalNode PHP_VARIABLE() { return getToken(BladeAntlrParser.PHP_VARIABLE, 0); } + public TerminalNode PHP_KEYWORD() { return getToken(BladeAntlrParser.PHP_KEYWORD, 0); } + public TerminalNode BL_PARAM_CONCAT_OPERATOR() { return getToken(BladeAntlrParser.BL_PARAM_CONCAT_OPERATOR, 0); } + public TerminalNode BL_PARAM_STRING() { return getToken(BladeAntlrParser.BL_PARAM_STRING, 0); } + public TerminalNode BL_PARAM_ASSIGN() { return getToken(BladeAntlrParser.BL_PARAM_ASSIGN, 0); } + public TerminalNode BL_NAME_STRING() { return getToken(BladeAntlrParser.BL_NAME_STRING, 0); } + public TerminalNode BL_PARAM_COMMA() { return getToken(BladeAntlrParser.BL_PARAM_COMMA, 0); } + public PhpExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_phpExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPhpExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPhpExpr(this); + } + } + + public final PhpExprContext phpExpr() throws RecognitionException { + PhpExprContext _localctx = new PhpExprContext(_ctx, getState()); + enterRule(_localctx, 124, RULE_phpExpr); + try { + setState(765); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(755); + identifiableArray(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(756); + arrayDefine(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(757); + match(BLADE_PARAM_EXTRA); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(758); + match(PHP_VARIABLE); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(759); + match(PHP_KEYWORD); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(760); + match(BL_PARAM_CONCAT_OPERATOR); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(761); + match(BL_PARAM_STRING); + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(762); + match(BL_PARAM_ASSIGN); + } + break; + case 9: + enterOuterAlt(_localctx, 9); + { + setState(763); + match(BL_NAME_STRING); + } + break; + case 10: + enterOuterAlt(_localctx, 10); + { + setState(764); + match(BL_PARAM_COMMA); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IdentifiableArrayContext extends ParserRuleContext { + public TerminalNode BL_SQ_LPAREN() { return getToken(BladeAntlrParser.BL_SQ_LPAREN, 0); } + public List paramAssign() { + return getRuleContexts(ParamAssignContext.class); + } + public ParamAssignContext paramAssign(int i) { + return getRuleContext(ParamAssignContext.class,i); + } + public TerminalNode BL_SQ_RPAREN() { return getToken(BladeAntlrParser.BL_SQ_RPAREN, 0); } + public List BL_PARAM_COMMA() { return getTokens(BladeAntlrParser.BL_PARAM_COMMA); } + public TerminalNode BL_PARAM_COMMA(int i) { + return getToken(BladeAntlrParser.BL_PARAM_COMMA, i); + } + public IdentifiableArrayContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_identifiableArray; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterIdentifiableArray(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitIdentifiableArray(this); + } + } + + public final IdentifiableArrayContext identifiableArray() throws RecognitionException { + IdentifiableArrayContext _localctx = new IdentifiableArrayContext(_ctx, getState()); + enterRule(_localctx, 126, RULE_identifiableArray); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(767); + match(BL_SQ_LPAREN); + setState(768); + paramAssign(); + setState(773); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,76,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(769); + match(BL_PARAM_COMMA); + setState(770); + paramAssign(); + } + } + } + setState(775); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,76,_ctx); + } + setState(777); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==BL_PARAM_COMMA) { + { + setState(776); + match(BL_PARAM_COMMA); + } + } + + setState(779); + match(BL_SQ_RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ArrayDefineContext extends ParserRuleContext { + public TerminalNode BL_SQ_LPAREN() { return getToken(BladeAntlrParser.BL_SQ_LPAREN, 0); } + public TerminalNode BL_SQ_RPAREN() { return getToken(BladeAntlrParser.BL_SQ_RPAREN, 0); } + public List phpExpr() { + return getRuleContexts(PhpExprContext.class); + } + public PhpExprContext phpExpr(int i) { + return getRuleContext(PhpExprContext.class,i); + } + public ArrayDefineContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_arrayDefine; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterArrayDefine(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitArrayDefine(this); + } + } + + public final ArrayDefineContext arrayDefine() throws RecognitionException { + ArrayDefineContext _localctx = new ArrayDefineContext(_ctx, getState()); + enterRule(_localctx, 128, RULE_arrayDefine); + int _la; + try { + setState(791); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,79,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(781); + match(BL_SQ_LPAREN); + setState(783); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(782); + phpExpr(); + } + } + setState(785); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( ((_la) & ~0x3f) == 0 && ((1L << _la) & 1475596L) != 0 || _la==BL_PARAM_CONCAT_OPERATOR || _la==BL_NAME_STRING ); + setState(787); + match(BL_SQ_RPAREN); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(789); + match(BL_SQ_LPAREN); + setState(790); + match(BL_SQ_RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ParamAssignContext extends ParserRuleContext { + public List BL_PARAM_STRING() { return getTokens(BladeAntlrParser.BL_PARAM_STRING); } + public TerminalNode BL_PARAM_STRING(int i) { + return getToken(BladeAntlrParser.BL_PARAM_STRING, i); + } + public TerminalNode BL_PARAM_ASSIGN() { return getToken(BladeAntlrParser.BL_PARAM_ASSIGN, 0); } + public TerminalNode PHP_VARIABLE() { return getToken(BladeAntlrParser.PHP_VARIABLE, 0); } + public TerminalNode PHP_KEYWORD() { return getToken(BladeAntlrParser.PHP_KEYWORD, 0); } + public ParamAssignContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_paramAssign; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterParamAssign(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitParamAssign(this); + } + } + + public final ParamAssignContext paramAssign() throws RecognitionException { + ParamAssignContext _localctx = new ParamAssignContext(_ctx, getState()); + enterRule(_localctx, 130, RULE_paramAssign); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(793); + match(BL_PARAM_STRING); + setState(794); + match(BL_PARAM_ASSIGN); + setState(795); + _la = _input.LA(1); + if ( !(((_la) & ~0x3f) == 0 && ((1L << _la) & 131084L) != 0) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Verbatim_blockContext extends ParserRuleContext { + public TerminalNode D_VERBATIM() { return getToken(BladeAntlrParser.D_VERBATIM, 0); } + public TerminalNode D_ENDVERBATIM() { return getToken(BladeAntlrParser.D_ENDVERBATIM, 0); } + public Verbatim_blockContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_verbatim_block; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterVerbatim_block(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitVerbatim_block(this); + } + } + + public final Verbatim_blockContext verbatim_block() throws RecognitionException { + Verbatim_blockContext _localctx = new Verbatim_blockContext(_ctx, getState()); + enterRule(_localctx, 132, RULE_verbatim_block); + try { + enterOuterAlt(_localctx, 1); + { + setState(797); + match(D_VERBATIM); + setState(798); + match(D_ENDVERBATIM); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Loop_actionContext extends ParserRuleContext { + public TerminalNode D_LOOP_ACTION() { return getToken(BladeAntlrParser.D_LOOP_ACTION, 0); } + public TerminalNode D_BREAK() { return getToken(BladeAntlrParser.D_BREAK, 0); } + public Php_expressionContext php_expression() { + return getRuleContext(Php_expressionContext.class,0); + } + public Loop_actionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_loop_action; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterLoop_action(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitLoop_action(this); + } + } + + public final Loop_actionContext loop_action() throws RecognitionException { + Loop_actionContext _localctx = new Loop_actionContext(_ctx, getState()); + enterRule(_localctx, 134, RULE_loop_action); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(800); + _la = _input.LA(1); + if ( !(_la==D_BREAK || _la==D_LOOP_ACTION) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(802); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PHP_EXPRESSION) { + { + setState(801); + php_expression(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class HtmlContext extends ParserRuleContext { + public List HTML() { return getTokens(BladeAntlrParser.HTML); } + public TerminalNode HTML(int i) { + return getToken(BladeAntlrParser.HTML, i); + } + public TerminalNode HTML_COMPONENT_PREFIX() { return getToken(BladeAntlrParser.HTML_COMPONENT_PREFIX, 0); } + public TerminalNode HTML_TAG_START() { return getToken(BladeAntlrParser.HTML_TAG_START, 0); } + public TerminalNode EQ() { return getToken(BladeAntlrParser.EQ, 0); } + public TerminalNode HTML_IDENTIFIER() { return getToken(BladeAntlrParser.HTML_IDENTIFIER, 0); } + public HtmlContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_html; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterHtml(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitHtml(this); + } + } + + public final HtmlContext html() throws RecognitionException { + HtmlContext _localctx = new HtmlContext(_ctx, getState()); + enterRule(_localctx, 136, RULE_html); + try { + int _alt; + setState(813); + _errHandler.sync(this); + switch (_input.LA(1)) { + case HTML: + enterOuterAlt(_localctx, 1); + { + setState(805); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(804); + match(HTML); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(807); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,81,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + break; + case HTML_COMPONENT_PREFIX: + enterOuterAlt(_localctx, 2); + { + setState(809); + match(HTML_COMPONENT_PREFIX); + } + break; + case HTML_TAG_START: + enterOuterAlt(_localctx, 3); + { + setState(810); + match(HTML_TAG_START); + } + break; + case EQ: + enterOuterAlt(_localctx, 4); + { + setState(811); + match(EQ); + } + break; + case HTML_IDENTIFIER: + enterOuterAlt(_localctx, 5); + { + setState(812); + match(HTML_IDENTIFIER); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static final String _serializedATN = + "\u0004\u0001\u00ab\u0330\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+ + "\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+ + "\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+ + "\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007"+ + "\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007"+ + "\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007"+ + "\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007"+ + "\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007"+ + "\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007"+ + "\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007"+ + "\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007"+ + "\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007"+ + ",\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u0007"+ + "1\u00022\u00072\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u0007"+ + "6\u00027\u00077\u00028\u00078\u00029\u00079\u0002:\u0007:\u0002;\u0007"+ + ";\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007?\u0002@\u0007"+ + "@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007D\u0001\u0000"+ + "\u0005\u0000\u008c\b\u0000\n\u0000\f\u0000\u008f\t\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u0096\b\u0001\u0001"+ + "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0003\u0002\u009d"+ + "\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0003\u0003\u00af"+ + "\b\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0003\u0004\u00c7"+ + "\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u00cd"+ + "\b\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u00d1\b\u0005\u0001\u0005"+ + "\u0003\u0005\u00d4\b\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006"+ + "\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0005\u0007"+ + "\u00df\b\u0007\n\u0007\f\u0007\u00e2\t\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\b\u0001\b\u0001\b\u0005\b\u00e9\b\b\n\b\f\b\u00ec\t\b\u0001\b\u0001\b"+ + "\u0001\t\u0001\t\u0001\t\u0005\t\u00f3\b\t\n\t\f\t\u00f6\t\t\u0001\t\u0001"+ + "\t\u0001\n\u0001\n\u0001\n\u0005\n\u00fd\b\n\n\n\f\n\u0100\t\n\u0001\n"+ + "\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0005\u000b\u0107\b\u000b"+ + "\n\u000b\f\u000b\u010a\t\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f"+ + "\u0001\f\u0005\f\u0111\b\f\n\f\f\f\u0114\t\f\u0001\f\u0001\f\u0001\r\u0001"+ + "\r\u0001\r\u0005\r\u011b\b\r\n\r\f\r\u011e\t\r\u0001\r\u0001\r\u0001\r"+ + "\u0005\r\u0123\b\r\n\r\f\r\u0126\t\r\u0005\r\u0128\b\r\n\r\f\r\u012b\t"+ + "\r\u0001\r\u0003\r\u012e\b\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0005"+ + "\u000e\u0134\b\u000e\n\u000e\f\u000e\u0137\t\u000e\u0001\u000f\u0001\u000f"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0005\u0012\u0148\b\u0012\n\u0012\f\u0012\u014b\t\u0012\u0001"+ + "\u0012\u0005\u0012\u014e\b\u0012\n\u0012\f\u0012\u0151\t\u0012\u0001\u0012"+ + "\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ + "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0003\u0013"+ + "\u015f\b\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+ + "\u0001\u0015\u0005\u0015\u0167\b\u0015\n\u0015\f\u0015\u016a\t\u0015\u0001"+ + "\u0015\u0003\u0015\u016d\b\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0005"+ + "\u0016\u0172\b\u0016\n\u0016\f\u0016\u0175\t\u0016\u0001\u0016\u0001\u0016"+ + "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0004\u0017\u017d\b\u0017"+ + "\u000b\u0017\f\u0017\u017e\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0005\u0018\u0186\b\u0018\n\u0018\f\u0018\u0189\t\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0005\u0019\u0190"+ + "\b\u0019\n\u0019\f\u0019\u0193\t\u0019\u0001\u0019\u0001\u0019\u0001\u001a"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0005\u001a\u019c\b\u001a"+ + "\n\u001a\f\u001a\u019f\t\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001"+ + "\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0005\u001b\u01a9"+ + "\b\u001b\n\u001b\f\u001b\u01ac\t\u001b\u0001\u001b\u0001\u001b\u0001\u001c"+ + "\u0001\u001c\u0001\u001c\u0005\u001c\u01b3\b\u001c\n\u001c\f\u001c\u01b6"+ + "\t\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001"+ + "\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0004\u001e\u01c1\b\u001e\u000b"+ + "\u001e\f\u001e\u01c2\u0001\u001e\u0001\u001e\u0003\u001e\u01c7\b\u001e"+ + "\u0001\u001e\u0001\u001e\u0004\u001e\u01cb\b\u001e\u000b\u001e\f\u001e"+ + "\u01cc\u0003\u001e\u01cf\b\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001"+ + "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0003\u001f\u01d9"+ + "\b\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ + " \u0003 \u01e3\b \u0001 \u0001 \u0003 \u01e7\b \u0001 \u0001 \u0001!\u0001"+ + "!\u0001!\u0001!\u0003!\u01ef\b!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001"+ + "!\u0001!\u0003!\u01f8\b!\u0003!\u01fa\b!\u0001!\u0001!\u0001\"\u0001\""+ + "\u0004\"\u0200\b\"\u000b\"\f\"\u0201\u0001\"\u0001\"\u0001#\u0001#\u0001"+ + "#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0003$\u020f\b$\u0001%\u0001"+ + "%\u0001&\u0001&\u0005&\u0215\b&\n&\f&\u0218\t&\u0001&\u0001&\u0001&\u0003"+ + "&\u021d\b&\u0001\'\u0001\'\u0004\'\u0221\b\'\u000b\'\f\'\u0222\u0001\'"+ + "\u0001\'\u0001(\u0001(\u0005(\u0229\b(\n(\f(\u022c\t(\u0001(\u0001(\u0001"+ + ")\u0001)\u0005)\u0232\b)\n)\f)\u0235\t)\u0001)\u0001)\u0001*\u0001*\u0001"+ + "+\u0001+\u0001+\u0001+\u0001+\u0001+\u0003+\u0241\b+\u0001,\u0001,\u0001"+ + ",\u0001,\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0005.\u0250\b.\n.\f.\u0253\t.\u0001.\u0001.\u0001.\u0001.\u0003.\u0259"+ + "\b.\u0001/\u0003/\u025c\b/\u0001/\u0001/\u0001/\u0001/\u0001/\u0005/\u0263"+ + "\b/\n/\f/\u0266\t/\u0001/\u0001/\u0003/\u026a\b/\u0001/\u0001/\u0001/"+ + "\u0003/\u026f\b/\u00010\u00010\u00030\u0273\b0\u00010\u00010\u00010\u0001"+ + "0\u00050\u0279\b0\n0\f0\u027c\t0\u00010\u00010\u00011\u00031\u0281\b1"+ + "\u00011\u00011\u00011\u00011\u00012\u00032\u0288\b2\u00012\u00012\u0001"+ + "3\u00013\u00013\u00053\u028f\b3\n3\f3\u0292\t3\u00013\u00013\u00014\u0001"+ + "4\u00015\u00015\u00045\u029a\b5\u000b5\f5\u029b\u00035\u029e\b5\u0001"+ + "6\u00016\u00046\u02a2\b6\u000b6\f6\u02a3\u00016\u00016\u00017\u00017\u0001"+ + "7\u00017\u00017\u00017\u00017\u00017\u00017\u00047\u02b1\b7\u000b7\f7"+ + "\u02b2\u00017\u00017\u00017\u00017\u00017\u00057\u02ba\b7\n7\f7\u02bd"+ + "\t7\u00017\u00017\u00017\u00057\u02c2\b7\n7\f7\u02c5\t7\u00017\u00017"+ + "\u00037\u02c9\b7\u00018\u00018\u00018\u00018\u00018\u00038\u02d0\b8\u0001"+ + "9\u00019\u00019\u00039\u02d5\b9\u00019\u00019\u0001:\u0001:\u0001:\u0003"+ + ":\u02dc\b:\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0005"+ + ";\u02e6\b;\n;\f;\u02e9\t;\u0001;\u0001;\u0001<\u0001<\u0001=\u0004=\u02f0"+ + "\b=\u000b=\f=\u02f1\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001"+ + ">\u0001>\u0001>\u0003>\u02fe\b>\u0001?\u0001?\u0001?\u0001?\u0005?\u0304"+ + "\b?\n?\f?\u0307\t?\u0001?\u0003?\u030a\b?\u0001?\u0001?\u0001@\u0001@"+ + "\u0004@\u0310\b@\u000b@\f@\u0311\u0001@\u0001@\u0001@\u0001@\u0003@\u0318"+ + "\b@\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001C\u0001C\u0003"+ + "C\u0323\bC\u0001D\u0004D\u0326\bD\u000bD\fD\u0327\u0001D\u0001D\u0001"+ + "D\u0001D\u0003D\u032e\bD\u0001D\u0000\u0000E\u0000\u0002\u0004\u0006\b"+ + "\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.02"+ + "468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088"+ + "\u0000\u000b\u0007\u0000\u001e\u001e2267MMQQ]`cc\u0004\u0000\u001f\u001f"+ + "-.PPjj\u0004\u0000/055<A\u0002\u00001133\u0001\u0000"+ + "9:\u0001\u0000no\u0001\u0001\u009b\u009b\u0002\u0000\u0001\u0002\u008b"+ + "\u008e\u0002\u0000\u0002\u0003\u0011\u0011\u0001\u0000-.\u037e\u0000\u008d"+ + "\u0001\u0000\u0000\u0000\u0002\u0095\u0001\u0000\u0000\u0000\u0004\u009c"+ + "\u0001\u0000\u0000\u0000\u0006\u00ae\u0001\u0000\u0000\u0000\b\u00c6\u0001"+ + "\u0000\u0000\u0000\n\u00c8\u0001\u0000\u0000\u0000\f\u00d7\u0001\u0000"+ + "\u0000\u0000\u000e\u00da\u0001\u0000\u0000\u0000\u0010\u00e5\u0001\u0000"+ + "\u0000\u0000\u0012\u00ef\u0001\u0000\u0000\u0000\u0014\u00f9\u0001\u0000"+ + "\u0000\u0000\u0016\u0103\u0001\u0000\u0000\u0000\u0018\u010d\u0001\u0000"+ + "\u0000\u0000\u001a\u0117\u0001\u0000\u0000\u0000\u001c\u0131\u0001\u0000"+ + "\u0000\u0000\u001e\u0138\u0001\u0000\u0000\u0000 \u013a\u0001\u0000\u0000"+ + "\u0000\"\u013f\u0001\u0000\u0000\u0000$\u0144\u0001\u0000\u0000\u0000"+ + "&\u015e\u0001\u0000\u0000\u0000(\u0160\u0001\u0000\u0000\u0000*\u0168"+ + "\u0001\u0000\u0000\u0000,\u016e\u0001\u0000\u0000\u0000.\u0178\u0001\u0000"+ + "\u0000\u00000\u0182\u0001\u0000\u0000\u00002\u018c\u0001\u0000\u0000\u0000"+ + "4\u0196\u0001\u0000\u0000\u00006\u01a2\u0001\u0000\u0000\u00008\u01af"+ + "\u0001\u0000\u0000\u0000:\u01b9\u0001\u0000\u0000\u0000<\u01bc\u0001\u0000"+ + "\u0000\u0000>\u01d2\u0001\u0000\u0000\u0000@\u01dc\u0001\u0000\u0000\u0000"+ + "B\u01ea\u0001\u0000\u0000\u0000D\u01fd\u0001\u0000\u0000\u0000F\u0205"+ + "\u0001\u0000\u0000\u0000H\u020a\u0001\u0000\u0000\u0000J\u0210\u0001\u0000"+ + "\u0000\u0000L\u021c\u0001\u0000\u0000\u0000N\u021e\u0001\u0000\u0000\u0000"+ + "P\u0226\u0001\u0000\u0000\u0000R\u022f\u0001\u0000\u0000\u0000T\u0238"+ + "\u0001\u0000\u0000\u0000V\u0240\u0001\u0000\u0000\u0000X\u0242\u0001\u0000"+ + "\u0000\u0000Z\u0246\u0001\u0000\u0000\u0000\\\u0258\u0001\u0000\u0000"+ + "\u0000^\u026e\u0001\u0000\u0000\u0000`\u0270\u0001\u0000\u0000\u0000b"+ + "\u0280\u0001\u0000\u0000\u0000d\u0287\u0001\u0000\u0000\u0000f\u028b\u0001"+ + "\u0000\u0000\u0000h\u0295\u0001\u0000\u0000\u0000j\u029d\u0001\u0000\u0000"+ + "\u0000l\u029f\u0001\u0000\u0000\u0000n\u02c8\u0001\u0000\u0000\u0000p"+ + "\u02ca\u0001\u0000\u0000\u0000r\u02d1\u0001\u0000\u0000\u0000t\u02d8\u0001"+ + "\u0000\u0000\u0000v\u02e1\u0001\u0000\u0000\u0000x\u02ec\u0001\u0000\u0000"+ + "\u0000z\u02ef\u0001\u0000\u0000\u0000|\u02fd\u0001\u0000\u0000\u0000~"+ + "\u02ff\u0001\u0000\u0000\u0000\u0080\u0317\u0001\u0000\u0000\u0000\u0082"+ + "\u0319\u0001\u0000\u0000\u0000\u0084\u031d\u0001\u0000\u0000\u0000\u0086"+ + "\u0320\u0001\u0000\u0000\u0000\u0088\u032d\u0001\u0000\u0000\u0000\u008a"+ + "\u008c\u0003\u0002\u0001\u0000\u008b\u008a\u0001\u0000\u0000\u0000\u008c"+ + "\u008f\u0001\u0000\u0000\u0000\u008d\u008b\u0001\u0000\u0000\u0000\u008d"+ + "\u008e\u0001\u0000\u0000\u0000\u008e\u0090\u0001\u0000\u0000\u0000\u008f"+ + "\u008d\u0001\u0000\u0000\u0000\u0090\u0091\u0005\u0000\u0000\u0001\u0091"+ + "\u0001\u0001\u0000\u0000\u0000\u0092\u0096\u0003\u0004\u0002\u0000\u0093"+ + "\u0096\u0003\b\u0004\u0000\u0094\u0096\u0003\u0088D\u0000\u0095\u0092"+ + "\u0001\u0000\u0000\u0000\u0095\u0093\u0001\u0000\u0000\u0000\u0095\u0094"+ + "\u0001\u0000\u0000\u0000\u0096\u0003\u0001\u0000\u0000\u0000\u0097\u009d"+ + "\u0003\u0006\u0003\u0000\u0098\u009d\u0003J%\u0000\u0099\u009d\u0003P"+ + "(\u0000\u009a\u009d\u0003R)\u0000\u009b\u009d\u0003N\'\u0000\u009c\u0097"+ + "\u0001\u0000\u0000\u0000\u009c\u0098\u0001\u0000\u0000\u0000\u009c\u0099"+ + "\u0001\u0000\u0000\u0000\u009c\u009a\u0001\u0000\u0000\u0000\u009c\u009b"+ + "\u0001\u0000\u0000\u0000\u009d\u0005\u0001\u0000\u0000\u0000\u009e\u00af"+ + "\u0003\f\u0006\u0000\u009f\u00af\u0003\n\u0005\u0000\u00a0\u00af\u0003"+ + ":\u001d\u0000\u00a1\u00af\u0003@ \u0000\u00a2\u00af\u0003B!\u0000\u00a3"+ + "\u00a4\u0007\u0000\u0000\u0000\u00a4\u00af\u0003n7\u0000\u00a5\u00af\u0007"+ + "\u0001\u0000\u0000\u00a6\u00af\u0003<\u001e\u0000\u00a7\u00af\u0003>\u001f"+ + "\u0000\u00a8\u00a9\u0005[\u0000\u0000\u00a9\u00af\u0003n7\u0000\u00aa"+ + "\u00af\u0003\u0086C\u0000\u00ab\u00af\u0005\u001b\u0000\u0000\u00ac\u00af"+ + "\u0005l\u0000\u0000\u00ad\u00af\u0003H$\u0000\u00ae\u009e\u0001\u0000"+ + "\u0000\u0000\u00ae\u009f\u0001\u0000\u0000\u0000\u00ae\u00a0\u0001\u0000"+ + "\u0000\u0000\u00ae\u00a1\u0001\u0000\u0000\u0000\u00ae\u00a2\u0001\u0000"+ + "\u0000\u0000\u00ae\u00a3\u0001\u0000\u0000\u0000\u00ae\u00a5\u0001\u0000"+ + "\u0000\u0000\u00ae\u00a6\u0001\u0000\u0000\u0000\u00ae\u00a7\u0001\u0000"+ + "\u0000\u0000\u00ae\u00a8\u0001\u0000\u0000\u0000\u00ae\u00aa\u0001\u0000"+ + "\u0000\u0000\u00ae\u00ab\u0001\u0000\u0000\u0000\u00ae\u00ac\u0001\u0000"+ + "\u0000\u0000\u00ae\u00ad\u0001\u0000\u0000\u0000\u00af\u0007\u0001\u0000"+ + "\u0000\u0000\u00b0\u00c7\u0003\u000e\u0007\u0000\u00b1\u00c7\u0003F#\u0000"+ + "\u00b2\u00c7\u0003\u0010\b\u0000\u00b3\u00c7\u0003\u0014\n\u0000\u00b4"+ + "\u00c7\u0003D\"\u0000\u00b5\u00c7\u0003\u0016\u000b\u0000\u00b6\u00c7"+ + "\u0003\u0018\f\u0000\u00b7\u00c7\u0003\u001a\r\u0000\u00b8\u00c7\u0003"+ + ".\u0017\u0000\u00b9\u00c7\u0003&\u0013\u0000\u00ba\u00c7\u0003 \u0010"+ + "\u0000\u00bb\u00c7\u0003,\u0016\u0000\u00bc\u00c7\u0003\"\u0011\u0000"+ + "\u00bd\u00c7\u0003$\u0012\u0000\u00be\u00c7\u0003(\u0014\u0000\u00bf\u00c7"+ + "\u00030\u0018\u0000\u00c0\u00c7\u00032\u0019\u0000\u00c1\u00c7\u00034"+ + "\u001a\u0000\u00c2\u00c7\u00036\u001b\u0000\u00c3\u00c7\u00038\u001c\u0000"+ + "\u00c4\u00c7\u0003\u0084B\u0000\u00c5\u00c7\u0003L&\u0000\u00c6\u00b0"+ + "\u0001\u0000\u0000\u0000\u00c6\u00b1\u0001\u0000\u0000\u0000\u00c6\u00b2"+ + "\u0001\u0000\u0000\u0000\u00c6\u00b3\u0001\u0000\u0000\u0000\u00c6\u00b4"+ + "\u0001\u0000\u0000\u0000\u00c6\u00b5\u0001\u0000\u0000\u0000\u00c6\u00b6"+ + "\u0001\u0000\u0000\u0000\u00c6\u00b7\u0001\u0000\u0000\u0000\u00c6\u00b8"+ + "\u0001\u0000\u0000\u0000\u00c6\u00b9\u0001\u0000\u0000\u0000\u00c6\u00ba"+ + "\u0001\u0000\u0000\u0000\u00c6\u00bb\u0001\u0000\u0000\u0000\u00c6\u00bc"+ + "\u0001\u0000\u0000\u0000\u00c6\u00bd\u0001\u0000\u0000\u0000\u00c6\u00be"+ + "\u0001\u0000\u0000\u0000\u00c6\u00bf\u0001\u0000\u0000\u0000\u00c6\u00c0"+ + "\u0001\u0000\u0000\u0000\u00c6\u00c1\u0001\u0000\u0000\u0000\u00c6\u00c2"+ + "\u0001\u0000\u0000\u0000\u00c6\u00c3\u0001\u0000\u0000\u0000\u00c6\u00c4"+ + "\u0001\u0000\u0000\u0000\u00c6\u00c5\u0001\u0000\u0000\u0000\u00c7\t\u0001"+ + "\u0000\u0000\u0000\u00c8\u00c9\u0007\u0002\u0000\u0000\u00c9\u00cc\u0005"+ + "\u000b\u0000\u0000\u00ca\u00cd\u0005\u0011\u0000\u0000\u00cb\u00cd\u0003"+ + "z=\u0000\u00cc\u00ca\u0001\u0000\u0000\u0000\u00cc\u00cb\u0001\u0000\u0000"+ + "\u0000\u00cd\u00d0\u0001\u0000\u0000\u0000\u00ce\u00cf\u0005\u0013\u0000"+ + "\u0000\u00cf\u00d1\u0003z=\u0000\u00d0\u00ce\u0001\u0000\u0000\u0000\u00d0"+ + "\u00d1\u0001\u0000\u0000\u0000\u00d1\u00d3\u0001\u0000\u0000\u0000\u00d2"+ + "\u00d4\u0005\u0013\u0000\u0000\u00d3\u00d2\u0001\u0000\u0000\u0000\u00d3"+ + "\u00d4\u0001\u0000\u0000\u0000\u00d4\u00d5\u0001\u0000\u0000\u0000\u00d5"+ + "\u00d6\u0005\f\u0000\u0000\u00d6\u000b\u0001\u0000\u0000\u0000\u00d7\u00d8"+ + "\u00058\u0000\u0000\u00d8\u00d9\u0003t:\u0000\u00d9\r\u0001\u0000\u0000"+ + "\u0000\u00da\u00db\u00058\u0000\u0000\u00db\u00e0\u0003r9\u0000\u00dc"+ + "\u00df\u0003\u0002\u0001\u0000\u00dd\u00df\u0005=\u0000\u0000\u00de\u00dc"+ + "\u0001\u0000\u0000\u0000\u00de\u00dd\u0001\u0000\u0000\u0000\u00df\u00e2"+ + "\u0001\u0000\u0000\u0000\u00e0\u00de\u0001\u0000\u0000\u0000\u00e0\u00e1"+ + "\u0001\u0000\u0000\u0000\u00e1\u00e3\u0001\u0000\u0000\u0000\u00e2\u00e0"+ + "\u0001\u0000\u0000\u0000\u00e3\u00e4\u0007\u0003\u0000\u0000\u00e4\u000f"+ + "\u0001\u0000\u0000\u0000\u00e5\u00e6\u0005E\u0000\u0000\u00e6\u00ea\u0003"+ + "r9\u0000\u00e7\u00e9\u0003\u0002\u0001\u0000\u00e8\u00e7\u0001\u0000\u0000"+ + "\u0000\u00e9\u00ec\u0001\u0000\u0000\u0000\u00ea\u00e8\u0001\u0000\u0000"+ + "\u0000\u00ea\u00eb\u0001\u0000\u0000\u0000\u00eb\u00ed\u0001\u0000\u0000"+ + "\u0000\u00ec\u00ea\u0001\u0000\u0000\u0000\u00ed\u00ee\u0005F\u0000\u0000"+ + "\u00ee\u0011\u0001\u0000\u0000\u0000\u00ef\u00f0\u0005I\u0000\u0000\u00f0"+ + "\u00f4\u0003r9\u0000\u00f1\u00f3\u0003\u0002\u0001\u0000\u00f2\u00f1\u0001"+ + "\u0000\u0000\u0000\u00f3\u00f6\u0001\u0000\u0000\u0000\u00f4\u00f2\u0001"+ + "\u0000\u0000\u0000\u00f4\u00f5\u0001\u0000\u0000\u0000\u00f5\u00f7\u0001"+ + "\u0000\u0000\u0000\u00f6\u00f4\u0001\u0000\u0000\u0000\u00f7\u00f8\u0005"+ + "J\u0000\u0000\u00f8\u0013\u0001\u0000\u0000\u0000\u00f9\u00fa\u0005G\u0000"+ + "\u0000\u00fa\u00fe\u0003r9\u0000\u00fb\u00fd\u0003\u0002\u0001\u0000\u00fc"+ + "\u00fb\u0001\u0000\u0000\u0000\u00fd\u0100\u0001\u0000\u0000\u0000\u00fe"+ + "\u00fc\u0001\u0000\u0000\u0000\u00fe\u00ff\u0001\u0000\u0000\u0000\u00ff"+ + "\u0101\u0001\u0000\u0000\u0000\u0100\u00fe\u0001\u0000\u0000\u0000\u0101"+ + "\u0102\u0005H\u0000\u0000\u0102\u0015\u0001\u0000\u0000\u0000\u0103\u0104"+ + "\u0005K\u0000\u0000\u0104\u0108\u0003r9\u0000\u0105\u0107\u0003\u0002"+ + "\u0001\u0000\u0106\u0105\u0001\u0000\u0000\u0000\u0107\u010a\u0001\u0000"+ + "\u0000\u0000\u0108\u0106\u0001\u0000\u0000\u0000\u0108\u0109\u0001\u0000"+ + "\u0000\u0000\u0109\u010b\u0001\u0000\u0000\u0000\u010a\u0108\u0001\u0000"+ + "\u0000\u0000\u010b\u010c\u0005L\u0000\u0000\u010c\u0017\u0001\u0000\u0000"+ + "\u0000\u010d\u010e\u0005N\u0000\u0000\u010e\u0112\u0003n7\u0000\u010f"+ + "\u0111\u0003\u0002\u0001\u0000\u0110\u010f\u0001\u0000\u0000\u0000\u0111"+ + "\u0114\u0001\u0000\u0000\u0000\u0112\u0110\u0001\u0000\u0000\u0000\u0112"+ + "\u0113\u0001\u0000\u0000\u0000\u0113\u0115\u0001\u0000\u0000\u0000\u0114"+ + "\u0112\u0001\u0000\u0000\u0000\u0115\u0116\u0005O\u0000\u0000\u0116\u0019"+ + "\u0001\u0000\u0000\u0000\u0117\u0118\u0005\u0019\u0000\u0000\u0118\u011c"+ + "\u0003l6\u0000\u0119\u011b\u0003\u0002\u0001\u0000\u011a\u0119\u0001\u0000"+ + "\u0000\u0000\u011b\u011e\u0001\u0000\u0000\u0000\u011c\u011a\u0001\u0000"+ + "\u0000\u0000\u011c\u011d\u0001\u0000\u0000\u0000\u011d\u0129\u0001\u0000"+ + "\u0000\u0000\u011e\u011c\u0001\u0000\u0000\u0000\u011f\u0120\u0005\u001a"+ + "\u0000\u0000\u0120\u0124\u0003l6\u0000\u0121\u0123\u0003\u0002\u0001\u0000"+ + "\u0122\u0121\u0001\u0000\u0000\u0000\u0123\u0126\u0001\u0000\u0000\u0000"+ + "\u0124\u0122\u0001\u0000\u0000\u0000\u0124\u0125\u0001\u0000\u0000\u0000"+ + "\u0125\u0128\u0001\u0000\u0000\u0000\u0126\u0124\u0001\u0000\u0000\u0000"+ + "\u0127\u011f\u0001\u0000\u0000\u0000\u0128\u012b\u0001\u0000\u0000\u0000"+ + "\u0129\u0127\u0001\u0000\u0000\u0000\u0129\u012a\u0001\u0000\u0000\u0000"+ + "\u012a\u012d\u0001\u0000\u0000\u0000\u012b\u0129\u0001\u0000\u0000\u0000"+ + "\u012c\u012e\u0003\u001c\u000e\u0000\u012d\u012c\u0001\u0000\u0000\u0000"+ + "\u012d\u012e\u0001\u0000\u0000\u0000\u012e\u012f\u0001\u0000\u0000\u0000"+ + "\u012f\u0130\u0003\u001e\u000f\u0000\u0130\u001b\u0001\u0000\u0000\u0000"+ + "\u0131\u0135\u0005\u001b\u0000\u0000\u0132\u0134\u0003\u0002\u0001\u0000"+ + "\u0133\u0132\u0001\u0000\u0000\u0000\u0134\u0137\u0001\u0000\u0000\u0000"+ + "\u0135\u0133\u0001\u0000\u0000\u0000\u0135\u0136\u0001\u0000\u0000\u0000"+ + "\u0136\u001d\u0001\u0000\u0000\u0000\u0137\u0135\u0001\u0000\u0000\u0000"+ + "\u0138\u0139\u0005\u001c\u0000\u0000\u0139\u001f\u0001\u0000\u0000\u0000"+ + "\u013a\u013b\u0005!\u0000\u0000\u013b\u013c\u0003n7\u0000\u013c\u013d"+ + "\u0003*\u0015\u0000\u013d\u013e\u0005\"\u0000\u0000\u013e!\u0001\u0000"+ + "\u0000\u0000\u013f\u0140\u0005#\u0000\u0000\u0140\u0141\u0003l6\u0000"+ + "\u0141\u0142\u0003*\u0015\u0000\u0142\u0143\u0005$\u0000\u0000\u0143#"+ + "\u0001\u0000\u0000\u0000\u0144\u014f\u0005X\u0000\u0000\u0145\u0149\u0005"+ + "\u000b\u0000\u0000\u0146\u0148\u0003z=\u0000\u0147\u0146\u0001\u0000\u0000"+ + "\u0000\u0148\u014b\u0001\u0000\u0000\u0000\u0149\u0147\u0001\u0000\u0000"+ + "\u0000\u0149\u014a\u0001\u0000\u0000\u0000\u014a\u014c\u0001\u0000\u0000"+ + "\u0000\u014b\u0149\u0001\u0000\u0000\u0000\u014c\u014e\u0005\f\u0000\u0000"+ + "\u014d\u0145\u0001\u0000\u0000\u0000\u014e\u0151\u0001\u0000\u0000\u0000"+ + "\u014f\u014d\u0001\u0000\u0000\u0000\u014f\u0150\u0001\u0000\u0000\u0000"+ + "\u0150\u0152\u0001\u0000\u0000\u0000\u0151\u014f\u0001\u0000\u0000\u0000"+ + "\u0152\u0153\u0003*\u0015\u0000\u0153\u0154\u0005Y\u0000\u0000\u0154%"+ + "\u0001\u0000\u0000\u0000\u0155\u0156\u0005V\u0000\u0000\u0156\u0157\u0003"+ + "r9\u0000\u0157\u0158\u0003*\u0015\u0000\u0158\u0159\u0005W\u0000\u0000"+ + "\u0159\u015f\u0001\u0000\u0000\u0000\u015a\u015b\u0005T\u0000\u0000\u015b"+ + "\u015c\u0003*\u0015\u0000\u015c\u015d\u0005U\u0000\u0000\u015d\u015f\u0001"+ + "\u0000\u0000\u0000\u015e\u0155\u0001\u0000\u0000\u0000\u015e\u015a\u0001"+ + "\u0000\u0000\u0000\u015f\'\u0001\u0000\u0000\u0000\u0160\u0161\u0005Z"+ + "\u0000\u0000\u0161\u0162\u0003n7\u0000\u0162\u0163\u0003*\u0015\u0000"+ + "\u0163\u0164\u0005\\\u0000\u0000\u0164)\u0001\u0000\u0000\u0000\u0165"+ + "\u0167\u0003\u0002\u0001\u0000\u0166\u0165\u0001\u0000\u0000\u0000\u0167"+ + "\u016a\u0001\u0000\u0000\u0000\u0168\u0166\u0001\u0000\u0000\u0000\u0168"+ + "\u0169\u0001\u0000\u0000\u0000\u0169\u016c\u0001\u0000\u0000\u0000\u016a"+ + "\u0168\u0001\u0000\u0000\u0000\u016b\u016d\u0003\u001c\u000e\u0000\u016c"+ + "\u016b\u0001\u0000\u0000\u0000\u016c\u016d\u0001\u0000\u0000\u0000\u016d"+ + "+\u0001\u0000\u0000\u0000\u016e\u016f\u0005R\u0000\u0000\u016f\u0173\u0003"+ + "h4\u0000\u0170\u0172\u0003\u0002\u0001\u0000\u0171\u0170\u0001\u0000\u0000"+ + "\u0000\u0172\u0175\u0001\u0000\u0000\u0000\u0173\u0171\u0001\u0000\u0000"+ + "\u0000\u0173\u0174\u0001\u0000\u0000\u0000\u0174\u0176\u0001\u0000\u0000"+ + "\u0000\u0175\u0173\u0001\u0000\u0000\u0000\u0176\u0177\u0005S\u0000\u0000"+ + "\u0177-\u0001\u0000\u0000\u0000\u0178\u0179\u0005\u001d\u0000\u0000\u0179"+ + "\u017c\u0003h4\u0000\u017a\u017d\u0003\u0002\u0001\u0000\u017b\u017d\u0005"+ + "-\u0000\u0000\u017c\u017a\u0001\u0000\u0000\u0000\u017c\u017b\u0001\u0000"+ + "\u0000\u0000\u017d\u017e\u0001\u0000\u0000\u0000\u017e\u017c\u0001\u0000"+ + "\u0000\u0000\u017e\u017f\u0001\u0000\u0000\u0000\u017f\u0180\u0001\u0000"+ + "\u0000\u0000\u0180\u0181\u0005 \u0000\u0000\u0181/\u0001\u0000\u0000\u0000"+ + "\u0182\u0183\u0005+\u0000\u0000\u0183\u0187\u0003h4\u0000\u0184\u0186"+ + "\u0003\u0002\u0001\u0000\u0185\u0184\u0001\u0000\u0000\u0000\u0186\u0189"+ + "\u0001\u0000\u0000\u0000\u0187\u0185\u0001\u0000\u0000\u0000\u0187\u0188"+ + "\u0001\u0000\u0000\u0000\u0188\u018a\u0001\u0000\u0000\u0000\u0189\u0187"+ + "\u0001\u0000\u0000\u0000\u018a\u018b\u0005,\u0000\u0000\u018b1\u0001\u0000"+ + "\u0000\u0000\u018c\u018d\u0005\'\u0000\u0000\u018d\u0191\u0003h4\u0000"+ + "\u018e\u0190\u0003\u0002\u0001\u0000\u018f\u018e\u0001\u0000\u0000\u0000"+ + "\u0190\u0193\u0001\u0000\u0000\u0000\u0191\u018f\u0001\u0000\u0000\u0000"+ + "\u0191\u0192\u0001\u0000\u0000\u0000\u0192\u0194\u0001\u0000\u0000\u0000"+ + "\u0193\u0191\u0001\u0000\u0000\u0000\u0194\u0195\u0005(\u0000\u0000\u0195"+ + "3\u0001\u0000\u0000\u0000\u0196\u0197\u0005%\u0000\u0000\u0197\u0198\u0005"+ + "\u008b\u0000\u0000\u0198\u0199\u0003j5\u0000\u0199\u019d\u0005\u008c\u0000"+ + "\u0000\u019a\u019c\u0003\u0002\u0001\u0000\u019b\u019a\u0001\u0000\u0000"+ + "\u0000\u019c\u019f\u0001\u0000\u0000\u0000\u019d\u019b\u0001\u0000\u0000"+ + "\u0000\u019d\u019e\u0001\u0000\u0000\u0000\u019e\u01a0\u0001\u0000\u0000"+ + "\u0000\u019f\u019d\u0001\u0000\u0000\u0000\u01a0\u01a1\u0005&\u0000\u0000"+ + "\u01a15\u0001\u0000\u0000\u0000\u01a2\u01a3\u0005)\u0000\u0000\u01a3\u01a4"+ + "\u0005\u008b\u0000\u0000\u01a4\u01a5\u0003j5\u0000\u01a5\u01aa\u0005\u008c"+ + "\u0000\u0000\u01a6\u01a9\u0003\u0002\u0001\u0000\u01a7\u01a9\u0005!\u0000"+ + "\u0000\u01a8\u01a6\u0001\u0000\u0000\u0000\u01a8\u01a7\u0001\u0000\u0000"+ + "\u0000\u01a9\u01ac\u0001\u0000\u0000\u0000\u01aa\u01a8\u0001\u0000\u0000"+ + "\u0000\u01aa\u01ab\u0001\u0000\u0000\u0000\u01ab\u01ad\u0001\u0000\u0000"+ + "\u0000\u01ac\u01aa\u0001\u0000\u0000\u0000\u01ad\u01ae\u0005*\u0000\u0000"+ + "\u01ae7\u0001\u0000\u0000\u0000\u01af\u01b0\u0005a\u0000\u0000\u01b0\u01b4"+ + "\u0003n7\u0000\u01b1\u01b3\u0003\u0002\u0001\u0000\u01b2\u01b1\u0001\u0000"+ + "\u0000\u0000\u01b3\u01b6\u0001\u0000\u0000\u0000\u01b4\u01b2\u0001\u0000"+ + "\u0000\u0000\u01b4\u01b5\u0001\u0000\u0000\u0000\u01b5\u01b7\u0001\u0000"+ + "\u0000\u0000\u01b6\u01b4\u0001\u0000\u0000\u0000\u01b7\u01b8\u0005b\u0000"+ + "\u0000\u01b89\u0001\u0000\u0000\u0000\u01b9\u01ba\u0005D\u0000\u0000\u01ba"+ + "\u01bb\u0003r9\u0000\u01bb;\u0001\u0000\u0000\u0000\u01bc\u01bd\u0005"+ + "k\u0000\u0000\u01bd\u01ce\u0005\r\u0000\u0000\u01be\u01c0\u0005\u000f"+ + "\u0000\u0000\u01bf\u01c1\u0005\u0086\u0000\u0000\u01c0\u01bf\u0001\u0000"+ + "\u0000\u0000\u01c1\u01c2\u0001\u0000\u0000\u0000\u01c2\u01c0\u0001\u0000"+ + "\u0000\u0000\u01c2\u01c3\u0001\u0000\u0000\u0000\u01c3\u01c4\u0001\u0000"+ + "\u0000\u0000\u01c4\u01c6\u0005\u0090\u0000\u0000\u01c5\u01c7\u0005\u0086"+ + "\u0000\u0000\u01c6\u01c5\u0001\u0000\u0000\u0000\u01c6\u01c7\u0001\u0000"+ + "\u0000\u0000\u01c7\u01cf\u0001\u0000\u0000\u0000\u01c8\u01cf\u0005\u0086"+ + "\u0000\u0000\u01c9\u01cb\u0003n7\u0000\u01ca\u01c9\u0001\u0000\u0000\u0000"+ + "\u01cb\u01cc\u0001\u0000\u0000\u0000\u01cc\u01ca\u0001\u0000\u0000\u0000"+ + "\u01cc\u01cd\u0001\u0000\u0000\u0000\u01cd\u01cf\u0001\u0000\u0000\u0000"+ + "\u01ce\u01be\u0001\u0000\u0000\u0000\u01ce\u01c8\u0001\u0000\u0000\u0000"+ + "\u01ce\u01ca\u0001\u0000\u0000\u0000\u01cf\u01d0\u0001\u0000\u0000\u0000"+ + "\u01d0\u01d1\u0005\u000e\u0000\u0000\u01d1=\u0001\u0000\u0000\u0000\u01d2"+ + "\u01d3\u0005f\u0000\u0000\u01d3\u01d4\u0005\u000b\u0000\u0000\u01d4\u01d5"+ + "\u0003z=\u0000\u01d5\u01d8\u0005\u0013\u0000\u0000\u01d6\u01d9\u0003x"+ + "<\u0000\u01d7\u01d9\u0003z=\u0000\u01d8\u01d6\u0001\u0000\u0000\u0000"+ + "\u01d8\u01d7\u0001\u0000\u0000\u0000\u01d9\u01da\u0001\u0000\u0000\u0000"+ + "\u01da\u01db\u0005\f\u0000\u0000\u01db?\u0001\u0000\u0000\u0000\u01dc"+ + "\u01dd\u0007\u0004\u0000\u0000\u01dd\u01de\u0005\u000b\u0000\u0000\u01de"+ + "\u01df\u0003z=\u0000\u01df\u01e2\u0005\u0013\u0000\u0000\u01e0\u01e3\u0005"+ + "\u0011\u0000\u0000\u01e1\u01e3\u0003z=\u0000\u01e2\u01e0\u0001\u0000\u0000"+ + "\u0000\u01e2\u01e1\u0001\u0000\u0000\u0000\u01e3\u01e6\u0001\u0000\u0000"+ + "\u0000\u01e4\u01e5\u0005\u0013\u0000\u0000\u01e5\u01e7\u0003z=\u0000\u01e6"+ + "\u01e4\u0001\u0000\u0000\u0000\u01e6\u01e7\u0001\u0000\u0000\u0000\u01e7"+ + "\u01e8\u0001\u0000\u0000\u0000\u01e8\u01e9\u0005\f\u0000\u0000\u01e9A"+ + "\u0001\u0000\u0000\u0000\u01ea\u01eb\u00054\u0000\u0000\u01eb\u01ee\u0005"+ + "\u000b\u0000\u0000\u01ec\u01ef\u0005\u0011\u0000\u0000\u01ed\u01ef\u0003"+ + "z=\u0000\u01ee\u01ec\u0001\u0000\u0000\u0000\u01ee\u01ed\u0001\u0000\u0000"+ + "\u0000\u01ef\u01f0\u0001\u0000\u0000\u0000\u01f0\u01f1\u0005\u0013\u0000"+ + "\u0000\u01f1\u01f2\u0003z=\u0000\u01f2\u01f3\u0005\u0013\u0000\u0000\u01f3"+ + "\u01f9\u0003z=\u0000\u01f4\u01f7\u0005\u0013\u0000\u0000\u01f5\u01f8\u0003"+ + "x<\u0000\u01f6\u01f8\u0003z=\u0000\u01f7\u01f5\u0001\u0000\u0000\u0000"+ + "\u01f7\u01f6\u0001\u0000\u0000\u0000\u01f8\u01fa\u0001\u0000\u0000\u0000"+ + "\u01f9\u01f4\u0001\u0000\u0000\u0000\u01f9\u01fa\u0001\u0000\u0000\u0000"+ + "\u01fa\u01fb\u0001\u0000\u0000\u0000\u01fb\u01fc\u0005\f\u0000\u0000\u01fc"+ + "C\u0001\u0000\u0000\u0000\u01fd\u01ff\u0005B\u0000\u0000\u01fe\u0200\u0003"+ + "\u0002\u0001\u0000\u01ff\u01fe\u0001\u0000\u0000\u0000\u0200\u0201\u0001"+ + "\u0000\u0000\u0000\u0201\u01ff\u0001\u0000\u0000\u0000\u0201\u0202\u0001"+ + "\u0000\u0000\u0000\u0202\u0203\u0001\u0000\u0000\u0000\u0203\u0204\u0005"+ + "C\u0000\u0000\u0204E\u0001\u0000\u0000\u0000\u0205\u0206\u0007\u0005\u0000"+ + "\u0000\u0206\u0207\u0003r9\u0000\u0207\u0208\u0003*\u0015\u0000\u0208"+ + "\u0209\u0005\u001c\u0000\u0000\u0209G\u0001\u0000\u0000\u0000\u020a\u020e"+ + "\u0005m\u0000\u0000\u020b\u020c\u0005\u000b\u0000\u0000\u020c\u020f\u0005"+ + "\f\u0000\u0000\u020d\u020f\u0003v;\u0000\u020e\u020b\u0001\u0000\u0000"+ + "\u0000\u020e\u020d\u0001\u0000\u0000\u0000\u020fI\u0001\u0000\u0000\u0000"+ + "\u0210\u0211\u0007\u0006\u0000\u0000\u0211K\u0001\u0000\u0000\u0000\u0212"+ + "\u0216\u0005g\u0000\u0000\u0213\u0215\u0003n7\u0000\u0214\u0213\u0001"+ + "\u0000\u0000\u0000\u0215\u0218\u0001\u0000\u0000\u0000\u0216\u0214\u0001"+ + "\u0000\u0000\u0000\u0216\u0217\u0001\u0000\u0000\u0000\u0217\u0219\u0001"+ + "\u0000\u0000\u0000\u0218\u0216\u0001\u0000\u0000\u0000\u0219\u021d\u0005"+ + "\u0098\u0000\u0000\u021a\u021b\u0005g\u0000\u0000\u021b\u021d\u0003l6"+ + "\u0000\u021c\u0212\u0001\u0000\u0000\u0000\u021c\u021a\u0001\u0000\u0000"+ + "\u0000\u021dM\u0001\u0000\u0000\u0000\u021e\u0220\u0005r\u0000\u0000\u021f"+ + "\u0221\u0003n7\u0000\u0220\u021f\u0001\u0000\u0000\u0000\u0221\u0222\u0001"+ + "\u0000\u0000\u0000\u0222\u0220\u0001\u0000\u0000\u0000\u0222\u0223\u0001"+ + "\u0000\u0000\u0000\u0223\u0224\u0001\u0000\u0000\u0000\u0224\u0225\u0007"+ + "\u0007\u0000\u0000\u0225O\u0001\u0000\u0000\u0000\u0226\u022a\u0005p\u0000"+ + "\u0000\u0227\u0229\u0003T*\u0000\u0228\u0227\u0001\u0000\u0000\u0000\u0229"+ + "\u022c\u0001\u0000\u0000\u0000\u022a\u0228\u0001\u0000\u0000\u0000\u022a"+ + "\u022b\u0001\u0000\u0000\u0000\u022b\u022d\u0001\u0000\u0000\u0000\u022c"+ + "\u022a\u0001\u0000\u0000\u0000\u022d\u022e\u0005\u007f\u0000\u0000\u022e"+ + "Q\u0001\u0000\u0000\u0000\u022f\u0233\u0005q\u0000\u0000\u0230\u0232\u0003"+ + "T*\u0000\u0231\u0230\u0001\u0000\u0000\u0000\u0232\u0235\u0001\u0000\u0000"+ + "\u0000\u0233\u0231\u0001\u0000\u0000\u0000\u0233\u0234\u0001\u0000\u0000"+ + "\u0000\u0234\u0236\u0001\u0000\u0000\u0000\u0235\u0233\u0001\u0000\u0000"+ + "\u0000\u0236\u0237\u0005\u0081\u0000\u0000\u0237S\u0001\u0000\u0000\u0000"+ + "\u0238\u0239\u0003n7\u0000\u0239U\u0001\u0000\u0000\u0000\u023a\u0241"+ + "\u0003b1\u0000\u023b\u0241\u0003X,\u0000\u023c\u0241\u0003Z-\u0000\u023d"+ + "\u0241\u0003\\.\u0000\u023e\u0241\u0003^/\u0000\u023f\u0241\u0003`0\u0000"+ + "\u0240\u023a\u0001\u0000\u0000\u0000\u0240\u023b\u0001\u0000\u0000\u0000"+ + "\u0240\u023c\u0001\u0000\u0000\u0000\u0240\u023d\u0001\u0000\u0000\u0000"+ + "\u0240\u023e\u0001\u0000\u0000\u0000\u0240\u023f\u0001\u0000\u0000\u0000"+ + "\u0241W\u0001\u0000\u0000\u0000\u0242\u0243\u0005\u0002\u0000\u0000\u0243"+ + "\u0244\u0005\u0007\u0000\u0000\u0244\u0245\u0005\u0005\u0000\u0000\u0245"+ + "Y\u0001\u0000\u0000\u0000\u0246\u0247\u0005\u0002\u0000\u0000\u0247\u0248"+ + "\u0005\t\u0000\u0000\u0248\u0249\u0005\u0005\u0000\u0000\u0249[\u0001"+ + "\u0000\u0000\u0000\u024a\u024b\u0005\u0005\u0000\u0000\u024b\u024c\u0005"+ + "\u0007\u0000\u0000\u024c\u024d\u0005\u0005\u0000\u0000\u024d\u0251\u0005"+ + "\r\u0000\u0000\u024e\u0250\u0003n7\u0000\u024f\u024e\u0001\u0000\u0000"+ + "\u0000\u0250\u0253\u0001\u0000\u0000\u0000\u0251\u024f\u0001\u0000\u0000"+ + "\u0000\u0251\u0252\u0001\u0000\u0000\u0000\u0252\u0254\u0001\u0000\u0000"+ + "\u0000\u0253\u0251\u0001\u0000\u0000\u0000\u0254\u0259\u0005\u000e\u0000"+ + "\u0000\u0255\u0256\u0005\u0005\u0000\u0000\u0256\u0257\u0005\u0007\u0000"+ + "\u0000\u0257\u0259\u0005\u0005\u0000\u0000\u0258\u024a\u0001\u0000\u0000"+ + "\u0000\u0258\u0255\u0001\u0000\u0000\u0000\u0259]\u0001\u0000\u0000\u0000"+ + "\u025a\u025c\u0005\u0006\u0000\u0000\u025b\u025a\u0001\u0000\u0000\u0000"+ + "\u025b\u025c\u0001\u0000\u0000\u0000\u025c\u025d\u0001\u0000\u0000\u0000"+ + "\u025d\u025e\u0005\u0005\u0000\u0000\u025e\u025f\u0005\u0007\u0000\u0000"+ + "\u025f\u0260\u0005\u0005\u0000\u0000\u0260\u0264\u0005\r\u0000\u0000\u0261"+ + "\u0263\u0003n7\u0000\u0262\u0261\u0001\u0000\u0000\u0000\u0263\u0266\u0001"+ + "\u0000\u0000\u0000\u0264\u0262\u0001\u0000\u0000\u0000\u0264\u0265\u0001"+ + "\u0000\u0000\u0000\u0265\u0267\u0001\u0000\u0000\u0000\u0266\u0264\u0001"+ + "\u0000\u0000\u0000\u0267\u026f\u0005\u000e\u0000\u0000\u0268\u026a\u0005"+ + "\u0006\u0000\u0000\u0269\u0268\u0001\u0000\u0000\u0000\u0269\u026a\u0001"+ + "\u0000\u0000\u0000\u026a\u026b\u0001\u0000\u0000\u0000\u026b\u026c\u0005"+ + "\u0005\u0000\u0000\u026c\u026d\u0005\u0007\u0000\u0000\u026d\u026f\u0005"+ + "\u0005\u0000\u0000\u026e\u025b\u0001\u0000\u0000\u0000\u026e\u0269\u0001"+ + "\u0000\u0000\u0000\u026f_\u0001\u0000\u0000\u0000\u0270\u0272\u0005\u0004"+ + "\u0000\u0000\u0271\u0273\u0005\u0006\u0000\u0000\u0272\u0271\u0001\u0000"+ + "\u0000\u0000\u0272\u0273\u0001\u0000\u0000\u0000\u0273\u0274\u0001\u0000"+ + "\u0000\u0000\u0274\u0275\u0005\u0005\u0000\u0000\u0275\u0276\u0001\u0000"+ + "\u0000\u0000\u0276\u027a\u0005\r\u0000\u0000\u0277\u0279\u0003n7\u0000"+ + "\u0278\u0277\u0001\u0000\u0000\u0000\u0279\u027c\u0001\u0000\u0000\u0000"+ + "\u027a\u0278\u0001\u0000\u0000\u0000\u027a\u027b\u0001\u0000\u0000\u0000"+ + "\u027b\u027d\u0001\u0000\u0000\u0000\u027c\u027a\u0001\u0000\u0000\u0000"+ + "\u027d\u027e\u0005\u000e\u0000\u0000\u027ea\u0001\u0000\u0000\u0000\u027f"+ + "\u0281\u0005\u0006\u0000\u0000\u0280\u027f\u0001\u0000\u0000\u0000\u0280"+ + "\u0281\u0001\u0000\u0000\u0000\u0281\u0282\u0001\u0000\u0000\u0000\u0282"+ + "\u0283\u0005\u0005\u0000\u0000\u0283\u0284\u0005\u0007\u0000\u0000\u0284"+ + "\u0285\u0005\b\u0000\u0000\u0285c\u0001\u0000\u0000\u0000\u0286\u0288"+ + "\u0005\u0006\u0000\u0000\u0287\u0286\u0001\u0000\u0000\u0000\u0287\u0288"+ + "\u0001\u0000\u0000\u0000\u0288\u0289\u0001\u0000\u0000\u0000\u0289\u028a"+ + "\u0005\u0005\u0000\u0000\u028ae\u0001\u0000\u0000\u0000\u028b\u028c\u0005"+ + "\u0005\u0000\u0000\u028c\u0290\u0005\r\u0000\u0000\u028d\u028f\u0003n"+ + "7\u0000\u028e\u028d\u0001\u0000\u0000\u0000\u028f\u0292\u0001\u0000\u0000"+ + "\u0000\u0290\u028e\u0001\u0000\u0000\u0000\u0290\u0291\u0001\u0000\u0000"+ + "\u0000\u0291\u0293\u0001\u0000\u0000\u0000\u0292\u0290\u0001\u0000\u0000"+ + "\u0000\u0293\u0294\u0005\u000e\u0000\u0000\u0294g\u0001\u0000\u0000\u0000"+ + "\u0295\u0296\u0005\u0001\u0000\u0000\u0296i\u0001\u0000\u0000\u0000\u0297"+ + "\u029e\u0003p8\u0000\u0298\u029a\u0007\b\u0000\u0000\u0299\u0298\u0001"+ + "\u0000\u0000\u0000\u029a\u029b\u0001\u0000\u0000\u0000\u029b\u0299\u0001"+ + "\u0000\u0000\u0000\u029b\u029c\u0001\u0000\u0000\u0000\u029c\u029e\u0001"+ + "\u0000\u0000\u0000\u029d\u0297\u0001\u0000\u0000\u0000\u029d\u0299\u0001"+ + "\u0000\u0000\u0000\u029ek\u0001\u0000\u0000\u0000\u029f\u02a1\u0005\r"+ + "\u0000\u0000\u02a0\u02a2\u0003n7\u0000\u02a1\u02a0\u0001\u0000\u0000\u0000"+ + "\u02a2\u02a3\u0001\u0000\u0000\u0000\u02a3\u02a1\u0001\u0000\u0000\u0000"+ + "\u02a3\u02a4\u0001\u0000\u0000\u0000\u02a4\u02a5\u0001\u0000\u0000\u0000"+ + "\u02a5\u02a6\u0005\u000e\u0000\u0000\u02a6m\u0001\u0000\u0000\u0000\u02a7"+ + "\u02c9\u0003V+\u0000\u02a8\u02c9\u0003f3\u0000\u02a9\u02c9\u0005\u0005"+ + "\u0000\u0000\u02aa\u02c9\u0003d2\u0000\u02ab\u02c9\u0005\u0002\u0000\u0000"+ + "\u02ac\u02c9\u0005\u0006\u0000\u0000\u02ad\u02c9\u0005\u0086\u0000\u0000"+ + "\u02ae\u02c9\u0005\u0003\u0000\u0000\u02af\u02b1\u0005\u0001\u0000\u0000"+ + "\u02b0\u02af\u0001\u0000\u0000\u0000\u02b1\u02b2\u0001\u0000\u0000\u0000"+ + "\u02b2\u02b0\u0001\u0000\u0000\u0000\u02b2\u02b3\u0001\u0000\u0000\u0000"+ + "\u02b3\u02c9\u0001\u0000\u0000\u0000\u02b4\u02c9\u0005\u0007\u0000\u0000"+ + "\u02b5\u02c9\u0005\b\u0000\u0000\u02b6\u02c9\u0005\t\u0000\u0000\u02b7"+ + "\u02bb\u0005\u000f\u0000\u0000\u02b8\u02ba\u0003n7\u0000\u02b9\u02b8\u0001"+ + "\u0000\u0000\u0000\u02ba\u02bd\u0001\u0000\u0000\u0000\u02bb\u02b9\u0001"+ + "\u0000\u0000\u0000\u02bb\u02bc\u0001\u0000\u0000\u0000\u02bc\u02be\u0001"+ + "\u0000\u0000\u0000\u02bd\u02bb\u0001\u0000\u0000\u0000\u02be\u02c9\u0005"+ + "\u0090\u0000\u0000\u02bf\u02c3\u0005\r\u0000\u0000\u02c0\u02c2\u0003n"+ + "7\u0000\u02c1\u02c0\u0001\u0000\u0000\u0000\u02c2\u02c5\u0001\u0000\u0000"+ + "\u0000\u02c3\u02c1\u0001\u0000\u0000\u0000\u02c3\u02c4\u0001\u0000\u0000"+ + "\u0000\u02c4\u02c6\u0001\u0000\u0000\u0000\u02c5\u02c3\u0001\u0000\u0000"+ + "\u0000\u02c6\u02c9\u0005\u000e\u0000\u0000\u02c7\u02c9\u0005\u0015\u0000"+ + "\u0000\u02c8\u02a7\u0001\u0000\u0000\u0000\u02c8\u02a8\u0001\u0000\u0000"+ + "\u0000\u02c8\u02a9\u0001\u0000\u0000\u0000\u02c8\u02aa\u0001\u0000\u0000"+ + "\u0000\u02c8\u02ab\u0001\u0000\u0000\u0000\u02c8\u02ac\u0001\u0000\u0000"+ + "\u0000\u02c8\u02ad\u0001\u0000\u0000\u0000\u02c8\u02ae\u0001\u0000\u0000"+ + "\u0000\u02c8\u02b0\u0001\u0000\u0000\u0000\u02c8\u02b4\u0001\u0000\u0000"+ + "\u0000\u02c8\u02b5\u0001\u0000\u0000\u0000\u02c8\u02b6\u0001\u0000\u0000"+ + "\u0000\u02c8\u02b7\u0001\u0000\u0000\u0000\u02c8\u02bf\u0001\u0000\u0000"+ + "\u0000\u02c8\u02c7\u0001\u0000\u0000\u0000\u02c9o\u0001\u0000\u0000\u0000"+ + "\u02ca\u02cb\u0005\u0002\u0000\u0000\u02cb\u02cc\u0005\u008d\u0000\u0000"+ + "\u02cc\u02cf\u0005\u0002\u0000\u0000\u02cd\u02ce\u0005\u008e\u0000\u0000"+ + "\u02ce\u02d0\u0005\u0002\u0000\u0000\u02cf\u02cd\u0001\u0000\u0000\u0000"+ + "\u02cf\u02d0\u0001\u0000\u0000\u0000\u02d0q\u0001\u0000\u0000\u0000\u02d1"+ + "\u02d4\u0005\u000b\u0000\u0000\u02d2\u02d5\u0005\u0011\u0000\u0000\u02d3"+ + "\u02d5\u0003z=\u0000\u02d4\u02d2\u0001\u0000\u0000\u0000\u02d4\u02d3\u0001"+ + "\u0000\u0000\u0000\u02d5\u02d6\u0001\u0000\u0000\u0000\u02d6\u02d7\u0005"+ + "\f\u0000\u0000\u02d7s\u0001\u0000\u0000\u0000\u02d8\u02db\u0005\u000b"+ + "\u0000\u0000\u02d9\u02dc\u0005\u0011\u0000\u0000\u02da\u02dc\u0003z=\u0000"+ + "\u02db\u02d9\u0001\u0000\u0000\u0000\u02db\u02da\u0001\u0000\u0000\u0000"+ + "\u02dc\u02dd\u0001\u0000\u0000\u0000\u02dd\u02de\u0005\u0013\u0000\u0000"+ + "\u02de\u02df\u0003z=\u0000\u02df\u02e0\u0005\f\u0000\u0000\u02e0u\u0001"+ + "\u0000\u0000\u0000\u02e1\u02e2\u0005\u000b\u0000\u0000\u02e2\u02e7\u0003"+ + "z=\u0000\u02e3\u02e4\u0005\u0013\u0000\u0000\u02e4\u02e6\u0003z=\u0000"+ + "\u02e5\u02e3\u0001\u0000\u0000\u0000\u02e6\u02e9\u0001\u0000\u0000\u0000"+ + "\u02e7\u02e5\u0001\u0000\u0000\u0000\u02e7\u02e8\u0001\u0000\u0000\u0000"+ + "\u02e8\u02ea\u0001\u0000\u0000\u0000\u02e9\u02e7\u0001\u0000\u0000\u0000"+ + "\u02ea\u02eb\u0005\f\u0000\u0000\u02ebw\u0001\u0000\u0000\u0000\u02ec"+ + "\u02ed\u0005\u0011\u0000\u0000\u02edy\u0001\u0000\u0000\u0000\u02ee\u02f0"+ + "\u0003|>\u0000\u02ef\u02ee\u0001\u0000\u0000\u0000\u02f0\u02f1\u0001\u0000"+ + "\u0000\u0000\u02f1\u02ef\u0001\u0000\u0000\u0000\u02f1\u02f2\u0001\u0000"+ + "\u0000\u0000\u02f2{\u0001\u0000\u0000\u0000\u02f3\u02fe\u0003~?\u0000"+ + "\u02f4\u02fe\u0003\u0080@\u0000\u02f5\u02fe\u0005\n\u0000\u0000\u02f6"+ + "\u02fe\u0005\u0002\u0000\u0000\u02f7\u02fe\u0005\u0003\u0000\u0000\u02f8"+ + "\u02fe\u0005\u0092\u0000\u0000\u02f9\u02fe\u0005\u0011\u0000\u0000\u02fa"+ + "\u02fe\u0005\u0012\u0000\u0000\u02fb\u02fe\u0005\u0095\u0000\u0000\u02fc"+ + "\u02fe\u0005\u0014\u0000\u0000\u02fd\u02f3\u0001\u0000\u0000\u0000\u02fd"+ + "\u02f4\u0001\u0000\u0000\u0000\u02fd\u02f5\u0001\u0000\u0000\u0000\u02fd"+ + "\u02f6\u0001\u0000\u0000\u0000\u02fd\u02f7\u0001\u0000\u0000\u0000\u02fd"+ + "\u02f8\u0001\u0000\u0000\u0000\u02fd\u02f9\u0001\u0000\u0000\u0000\u02fd"+ + "\u02fa\u0001\u0000\u0000\u0000\u02fd\u02fb\u0001\u0000\u0000\u0000\u02fd"+ + "\u02fc\u0001\u0000\u0000\u0000\u02fe}\u0001\u0000\u0000\u0000\u02ff\u0300"+ + "\u0005\u000f\u0000\u0000\u0300\u0305\u0003\u0082A\u0000\u0301\u0302\u0005"+ + "\u0014\u0000\u0000\u0302\u0304\u0003\u0082A\u0000\u0303\u0301\u0001\u0000"+ + "\u0000\u0000\u0304\u0307\u0001\u0000\u0000\u0000\u0305\u0303\u0001\u0000"+ + "\u0000\u0000\u0305\u0306\u0001\u0000\u0000\u0000\u0306\u0309\u0001\u0000"+ + "\u0000\u0000\u0307\u0305\u0001\u0000\u0000\u0000\u0308\u030a\u0005\u0014"+ + "\u0000\u0000\u0309\u0308\u0001\u0000\u0000\u0000\u0309\u030a\u0001\u0000"+ + "\u0000\u0000\u030a\u030b\u0001\u0000\u0000\u0000\u030b\u030c\u0005\u0090"+ + "\u0000\u0000\u030c\u007f\u0001\u0000\u0000\u0000\u030d\u030f\u0005\u000f"+ + "\u0000\u0000\u030e\u0310\u0003|>\u0000\u030f\u030e\u0001\u0000\u0000\u0000"+ + "\u0310\u0311\u0001\u0000\u0000\u0000\u0311\u030f\u0001\u0000\u0000\u0000"+ + "\u0311\u0312\u0001\u0000\u0000\u0000\u0312\u0313\u0001\u0000\u0000\u0000"+ + "\u0313\u0314\u0005\u0090\u0000\u0000\u0314\u0318\u0001\u0000\u0000\u0000"+ + "\u0315\u0316\u0005\u000f\u0000\u0000\u0316\u0318\u0005\u0090\u0000\u0000"+ + "\u0317\u030d\u0001\u0000\u0000\u0000\u0317\u0315\u0001\u0000\u0000\u0000"+ + "\u0318\u0081\u0001\u0000\u0000\u0000\u0319\u031a\u0005\u0011\u0000\u0000"+ + "\u031a\u031b\u0005\u0012\u0000\u0000\u031b\u031c\u0007\t\u0000\u0000\u031c"+ + "\u0083\u0001\u0000\u0000\u0000\u031d\u031e\u0005h\u0000\u0000\u031e\u031f"+ + "\u0005i\u0000\u0000\u031f\u0085\u0001\u0000\u0000\u0000\u0320\u0322\u0007"+ + "\n\u0000\u0000\u0321\u0323\u0003h4\u0000\u0322\u0321\u0001\u0000\u0000"+ + "\u0000\u0322\u0323\u0001\u0000\u0000\u0000\u0323\u0087\u0001\u0000\u0000"+ + "\u0000\u0324\u0326\u0005\u0017\u0000\u0000\u0325\u0324\u0001\u0000\u0000"+ + "\u0000\u0326\u0327\u0001\u0000\u0000\u0000\u0327\u0325\u0001\u0000\u0000"+ + "\u0000\u0327\u0328\u0001\u0000\u0000\u0000\u0328\u032e\u0001\u0000\u0000"+ + "\u0000\u0329\u032e\u0005s\u0000\u0000\u032a\u032e\u0005u\u0000\u0000\u032b"+ + "\u032e\u0005{\u0000\u0000\u032c\u032e\u0005z\u0000\u0000\u032d\u0325\u0001"+ + "\u0000\u0000\u0000\u032d\u0329\u0001\u0000\u0000\u0000\u032d\u032a\u0001"+ + "\u0000\u0000\u0000\u032d\u032b\u0001\u0000\u0000\u0000\u032d\u032c\u0001"+ + "\u0000\u0000\u0000\u032e\u0089\u0001\u0000\u0000\u0000S\u008d\u0095\u009c"+ + "\u00ae\u00c6\u00cc\u00d0\u00d3\u00de\u00e0\u00ea\u00f4\u00fe\u0108\u0112"+ + "\u011c\u0124\u0129\u012d\u0135\u0149\u014f\u015e\u0168\u016c\u0173\u017c"+ + "\u017e\u0187\u0191\u019d\u01a8\u01aa\u01b4\u01c2\u01c6\u01cc\u01ce\u01d8"+ + "\u01e2\u01e6\u01ee\u01f7\u01f9\u0201\u020e\u0216\u021c\u0222\u022a\u0233"+ + "\u0240\u0251\u0258\u025b\u0264\u0269\u026e\u0272\u027a\u0280\u0287\u0290"+ + "\u029b\u029d\u02a3\u02b2\u02bb\u02c3\u02c8\u02cf\u02d4\u02db\u02e7\u02f1"+ + "\u02fd\u0305\u0309\u0311\u0317\u0322\u0327\u032d"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserBaseListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserBaseListener.java new file mode 100644 index 000000000000..2785bf4f2b54 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserBaseListener.java @@ -0,0 +1,878 @@ +// Generated from java-escape by ANTLR 4.11.1 + + /** + * Parser generated for netbeans blade editor + * Some elements have been simplified to optimize parser speed + * For example + * - switch statement have a loos validation + * - generic block statement "@isset" | "@unless" are grouped togehter + * - the start match and end match will be checked in the parser + */ + package org.netbeans.modules.php.blade.syntax.antlr4.v10; + + +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.tree.ErrorNode; +import org.antlr.v4.runtime.tree.TerminalNode; + +/** + * This class provides an empty implementation of {@link BladeAntlrParserListener}, + * which can be extended to create a listener which only needs to handle a subset + * of the available methods. + */ +@SuppressWarnings("CheckReturnValue") +public class BladeAntlrParserBaseListener implements BladeAntlrParserListener { + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterFile(BladeAntlrParser.FileContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitFile(BladeAntlrParser.FileContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterGeneral_statement(BladeAntlrParser.General_statementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitGeneral_statement(BladeAntlrParser.General_statementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterInline_statement(BladeAntlrParser.Inline_statementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitInline_statement(BladeAntlrParser.Inline_statementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterInline_directive(BladeAntlrParser.Inline_directiveContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitInline_directive(BladeAntlrParser.Inline_directiveContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterBlock_statement(BladeAntlrParser.Block_statementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitBlock_statement(BladeAntlrParser.Block_statementContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterIdentifiableType(BladeAntlrParser.IdentifiableTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitIdentifiableType(BladeAntlrParser.IdentifiableTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSection_inline(BladeAntlrParser.Section_inlineContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSection_inline(BladeAntlrParser.Section_inlineContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSection(BladeAntlrParser.SectionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSection(BladeAntlrParser.SectionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterPush(BladeAntlrParser.PushContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitPush(BladeAntlrParser.PushContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterPushOnce(BladeAntlrParser.PushOnceContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitPushOnce(BladeAntlrParser.PushOnceContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterPushIf(BladeAntlrParser.PushIfContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitPushIf(BladeAntlrParser.PushIfContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterPrepend(BladeAntlrParser.PrependContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitPrepend(BladeAntlrParser.PrependContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterFragmentD(BladeAntlrParser.FragmentDContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitFragmentD(BladeAntlrParser.FragmentDContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterIf(BladeAntlrParser.IfContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitIf(BladeAntlrParser.IfContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterElse(BladeAntlrParser.ElseContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitElse(BladeAntlrParser.ElseContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterEndif(BladeAntlrParser.EndifContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitEndif(BladeAntlrParser.EndifContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterEmpty_block(BladeAntlrParser.Empty_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitEmpty_block(BladeAntlrParser.Empty_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterConditional_block(BladeAntlrParser.Conditional_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitConditional_block(BladeAntlrParser.Conditional_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterAuth_block(BladeAntlrParser.Auth_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitAuth_block(BladeAntlrParser.Auth_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterEnv_block(BladeAntlrParser.Env_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitEnv_block(BladeAntlrParser.Env_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterPermission(BladeAntlrParser.PermissionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitPermission(BladeAntlrParser.PermissionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSimple_conditional_stm(BladeAntlrParser.Simple_conditional_stmContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSimple_conditional_stm(BladeAntlrParser.Simple_conditional_stmContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterError_block(BladeAntlrParser.Error_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitError_block(BladeAntlrParser.Error_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSwitch(BladeAntlrParser.SwitchContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSwitch(BladeAntlrParser.SwitchContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterWhile(BladeAntlrParser.WhileContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitWhile(BladeAntlrParser.WhileContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterFor(BladeAntlrParser.ForContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitFor(BladeAntlrParser.ForContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterForeach(BladeAntlrParser.ForeachContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitForeach(BladeAntlrParser.ForeachContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterForelse(BladeAntlrParser.ForelseContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitForelse(BladeAntlrParser.ForelseContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSession(BladeAntlrParser.SessionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSession(BladeAntlrParser.SessionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterStack(BladeAntlrParser.StackContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitStack(BladeAntlrParser.StackContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterAsset_bundler(BladeAntlrParser.Asset_bundlerContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitAsset_bundler(BladeAntlrParser.Asset_bundlerContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterInject(BladeAntlrParser.InjectContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitInject(BladeAntlrParser.InjectContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterIncludeCond(BladeAntlrParser.IncludeCondContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitIncludeCond(BladeAntlrParser.IncludeCondContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterEach(BladeAntlrParser.EachContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitEach(BladeAntlrParser.EachContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterOnce_block(BladeAntlrParser.Once_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitOnce_block(BladeAntlrParser.Once_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterCondSection(BladeAntlrParser.CondSectionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitCondSection(BladeAntlrParser.CondSectionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterCustom_directive(BladeAntlrParser.Custom_directiveContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitCustom_directive(BladeAntlrParser.Custom_directiveContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterPossibleDirective(BladeAntlrParser.PossibleDirectiveContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitPossibleDirective(BladeAntlrParser.PossibleDirectiveContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterPhp_blade(BladeAntlrParser.Php_bladeContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitPhp_blade(BladeAntlrParser.Php_bladeContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterPhpInline(BladeAntlrParser.PhpInlineContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitPhpInline(BladeAntlrParser.PhpInlineContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterRegular_echo(BladeAntlrParser.Regular_echoContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitRegular_echo(BladeAntlrParser.Regular_echoContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterRaw_echo(BladeAntlrParser.Raw_echoContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitRaw_echo(BladeAntlrParser.Raw_echoContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterEcho_expr(BladeAntlrParser.Echo_exprContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitEcho_expr(BladeAntlrParser.Echo_exprContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterClass_expr_usage(BladeAntlrParser.Class_expr_usageContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitClass_expr_usage(BladeAntlrParser.Class_expr_usageContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterObject_alias_static_access(BladeAntlrParser.Object_alias_static_accessContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitObject_alias_static_access(BladeAntlrParser.Object_alias_static_accessContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterObject_alias_direct_access(BladeAntlrParser.Object_alias_direct_accessContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitObject_alias_direct_access(BladeAntlrParser.Object_alias_direct_accessContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterStatic_direct_class_access(BladeAntlrParser.Static_direct_class_accessContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitStatic_direct_class_access(BladeAntlrParser.Static_direct_class_accessContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterStatic_direct_namespace_class_access(BladeAntlrParser.Static_direct_namespace_class_accessContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitStatic_direct_namespace_class_access(BladeAntlrParser.Static_direct_namespace_class_accessContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterClass_instance(BladeAntlrParser.Class_instanceContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitClass_instance(BladeAntlrParser.Class_instanceContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterClass_name_reference(BladeAntlrParser.Class_name_referenceContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitClass_name_reference(BladeAntlrParser.Class_name_referenceContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterNamespacePath(BladeAntlrParser.NamespacePathContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitNamespacePath(BladeAntlrParser.NamespacePathContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterFunction_call(BladeAntlrParser.Function_callContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitFunction_call(BladeAntlrParser.Function_callContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterPhp_expression(BladeAntlrParser.Php_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitPhp_expression(BladeAntlrParser.Php_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterLoop_expression(BladeAntlrParser.Loop_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitLoop_expression(BladeAntlrParser.Loop_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterMain_php_expression(BladeAntlrParser.Main_php_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitMain_php_expression(BladeAntlrParser.Main_php_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterComposed_php_expression(BladeAntlrParser.Composed_php_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitComposed_php_expression(BladeAntlrParser.Composed_php_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSimple_foreach_expr(BladeAntlrParser.Simple_foreach_exprContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSimple_foreach_expr(BladeAntlrParser.Simple_foreach_exprContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterSingleArgWrapperP(BladeAntlrParser.SingleArgWrapperPContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitSingleArgWrapperP(BladeAntlrParser.SingleArgWrapperPContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterDoubleArgWrapperP(BladeAntlrParser.DoubleArgWrapperPContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitDoubleArgWrapperP(BladeAntlrParser.DoubleArgWrapperPContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterMultiArgWrapper(BladeAntlrParser.MultiArgWrapperContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitMultiArgWrapper(BladeAntlrParser.MultiArgWrapperContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterIdentifiableArgument(BladeAntlrParser.IdentifiableArgumentContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitIdentifiableArgument(BladeAntlrParser.IdentifiableArgumentContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterComposedArgument(BladeAntlrParser.ComposedArgumentContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitComposedArgument(BladeAntlrParser.ComposedArgumentContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterPhpExpr(BladeAntlrParser.PhpExprContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitPhpExpr(BladeAntlrParser.PhpExprContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterIdentifiableArray(BladeAntlrParser.IdentifiableArrayContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitIdentifiableArray(BladeAntlrParser.IdentifiableArrayContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterArrayDefine(BladeAntlrParser.ArrayDefineContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitArrayDefine(BladeAntlrParser.ArrayDefineContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterParamAssign(BladeAntlrParser.ParamAssignContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitParamAssign(BladeAntlrParser.ParamAssignContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterVerbatim_block(BladeAntlrParser.Verbatim_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitVerbatim_block(BladeAntlrParser.Verbatim_blockContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterLoop_action(BladeAntlrParser.Loop_actionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitLoop_action(BladeAntlrParser.Loop_actionContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterHtml(BladeAntlrParser.HtmlContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitHtml(BladeAntlrParser.HtmlContext ctx) { } + + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void enterEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void exitEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void visitTerminal(TerminalNode node) { } + /** + * {@inheritDoc} + * + *

    The default implementation does nothing.

    + */ + @Override public void visitErrorNode(ErrorNode node) { } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserListener.java new file mode 100644 index 000000000000..028880cddca2 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserListener.java @@ -0,0 +1,710 @@ +// Generated from java-escape by ANTLR 4.11.1 + + /** + * Parser generated for netbeans blade editor + * Some elements have been simplified to optimize parser speed + * For example + * - switch statement have a loos validation + * - generic block statement "@isset" | "@unless" are grouped togehter + * - the start match and end match will be checked in the parser + */ + package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +import org.antlr.v4.runtime.tree.ParseTreeListener; + +/** + * This interface defines a complete listener for a parse tree produced by + * {@link BladeAntlrParser}. + */ +public interface BladeAntlrParserListener extends ParseTreeListener { + /** + * Enter a parse tree produced by {@link BladeAntlrParser#file}. + * @param ctx the parse tree + */ + void enterFile(BladeAntlrParser.FileContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#file}. + * @param ctx the parse tree + */ + void exitFile(BladeAntlrParser.FileContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#general_statement}. + * @param ctx the parse tree + */ + void enterGeneral_statement(BladeAntlrParser.General_statementContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#general_statement}. + * @param ctx the parse tree + */ + void exitGeneral_statement(BladeAntlrParser.General_statementContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#inline_statement}. + * @param ctx the parse tree + */ + void enterInline_statement(BladeAntlrParser.Inline_statementContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#inline_statement}. + * @param ctx the parse tree + */ + void exitInline_statement(BladeAntlrParser.Inline_statementContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#inline_directive}. + * @param ctx the parse tree + */ + void enterInline_directive(BladeAntlrParser.Inline_directiveContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#inline_directive}. + * @param ctx the parse tree + */ + void exitInline_directive(BladeAntlrParser.Inline_directiveContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#block_statement}. + * @param ctx the parse tree + */ + void enterBlock_statement(BladeAntlrParser.Block_statementContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#block_statement}. + * @param ctx the parse tree + */ + void exitBlock_statement(BladeAntlrParser.Block_statementContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#identifiableType}. + * @param ctx the parse tree + */ + void enterIdentifiableType(BladeAntlrParser.IdentifiableTypeContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#identifiableType}. + * @param ctx the parse tree + */ + void exitIdentifiableType(BladeAntlrParser.IdentifiableTypeContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#section_inline}. + * @param ctx the parse tree + */ + void enterSection_inline(BladeAntlrParser.Section_inlineContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#section_inline}. + * @param ctx the parse tree + */ + void exitSection_inline(BladeAntlrParser.Section_inlineContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#section}. + * @param ctx the parse tree + */ + void enterSection(BladeAntlrParser.SectionContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#section}. + * @param ctx the parse tree + */ + void exitSection(BladeAntlrParser.SectionContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#push}. + * @param ctx the parse tree + */ + void enterPush(BladeAntlrParser.PushContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#push}. + * @param ctx the parse tree + */ + void exitPush(BladeAntlrParser.PushContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#pushOnce}. + * @param ctx the parse tree + */ + void enterPushOnce(BladeAntlrParser.PushOnceContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#pushOnce}. + * @param ctx the parse tree + */ + void exitPushOnce(BladeAntlrParser.PushOnceContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#pushIf}. + * @param ctx the parse tree + */ + void enterPushIf(BladeAntlrParser.PushIfContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#pushIf}. + * @param ctx the parse tree + */ + void exitPushIf(BladeAntlrParser.PushIfContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#prepend}. + * @param ctx the parse tree + */ + void enterPrepend(BladeAntlrParser.PrependContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#prepend}. + * @param ctx the parse tree + */ + void exitPrepend(BladeAntlrParser.PrependContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#fragmentD}. + * @param ctx the parse tree + */ + void enterFragmentD(BladeAntlrParser.FragmentDContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#fragmentD}. + * @param ctx the parse tree + */ + void exitFragmentD(BladeAntlrParser.FragmentDContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#if}. + * @param ctx the parse tree + */ + void enterIf(BladeAntlrParser.IfContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#if}. + * @param ctx the parse tree + */ + void exitIf(BladeAntlrParser.IfContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#else}. + * @param ctx the parse tree + */ + void enterElse(BladeAntlrParser.ElseContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#else}. + * @param ctx the parse tree + */ + void exitElse(BladeAntlrParser.ElseContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#endif}. + * @param ctx the parse tree + */ + void enterEndif(BladeAntlrParser.EndifContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#endif}. + * @param ctx the parse tree + */ + void exitEndif(BladeAntlrParser.EndifContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#empty_block}. + * @param ctx the parse tree + */ + void enterEmpty_block(BladeAntlrParser.Empty_blockContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#empty_block}. + * @param ctx the parse tree + */ + void exitEmpty_block(BladeAntlrParser.Empty_blockContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#conditional_block}. + * @param ctx the parse tree + */ + void enterConditional_block(BladeAntlrParser.Conditional_blockContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#conditional_block}. + * @param ctx the parse tree + */ + void exitConditional_block(BladeAntlrParser.Conditional_blockContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#auth_block}. + * @param ctx the parse tree + */ + void enterAuth_block(BladeAntlrParser.Auth_blockContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#auth_block}. + * @param ctx the parse tree + */ + void exitAuth_block(BladeAntlrParser.Auth_blockContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#env_block}. + * @param ctx the parse tree + */ + void enterEnv_block(BladeAntlrParser.Env_blockContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#env_block}. + * @param ctx the parse tree + */ + void exitEnv_block(BladeAntlrParser.Env_blockContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#permission}. + * @param ctx the parse tree + */ + void enterPermission(BladeAntlrParser.PermissionContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#permission}. + * @param ctx the parse tree + */ + void exitPermission(BladeAntlrParser.PermissionContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#simple_conditional_stm}. + * @param ctx the parse tree + */ + void enterSimple_conditional_stm(BladeAntlrParser.Simple_conditional_stmContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#simple_conditional_stm}. + * @param ctx the parse tree + */ + void exitSimple_conditional_stm(BladeAntlrParser.Simple_conditional_stmContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#error_block}. + * @param ctx the parse tree + */ + void enterError_block(BladeAntlrParser.Error_blockContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#error_block}. + * @param ctx the parse tree + */ + void exitError_block(BladeAntlrParser.Error_blockContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#switch}. + * @param ctx the parse tree + */ + void enterSwitch(BladeAntlrParser.SwitchContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#switch}. + * @param ctx the parse tree + */ + void exitSwitch(BladeAntlrParser.SwitchContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#while}. + * @param ctx the parse tree + */ + void enterWhile(BladeAntlrParser.WhileContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#while}. + * @param ctx the parse tree + */ + void exitWhile(BladeAntlrParser.WhileContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#for}. + * @param ctx the parse tree + */ + void enterFor(BladeAntlrParser.ForContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#for}. + * @param ctx the parse tree + */ + void exitFor(BladeAntlrParser.ForContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#foreach}. + * @param ctx the parse tree + */ + void enterForeach(BladeAntlrParser.ForeachContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#foreach}. + * @param ctx the parse tree + */ + void exitForeach(BladeAntlrParser.ForeachContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#forelse}. + * @param ctx the parse tree + */ + void enterForelse(BladeAntlrParser.ForelseContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#forelse}. + * @param ctx the parse tree + */ + void exitForelse(BladeAntlrParser.ForelseContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#session}. + * @param ctx the parse tree + */ + void enterSession(BladeAntlrParser.SessionContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#session}. + * @param ctx the parse tree + */ + void exitSession(BladeAntlrParser.SessionContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#stack}. + * @param ctx the parse tree + */ + void enterStack(BladeAntlrParser.StackContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#stack}. + * @param ctx the parse tree + */ + void exitStack(BladeAntlrParser.StackContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#asset_bundler}. + * @param ctx the parse tree + */ + void enterAsset_bundler(BladeAntlrParser.Asset_bundlerContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#asset_bundler}. + * @param ctx the parse tree + */ + void exitAsset_bundler(BladeAntlrParser.Asset_bundlerContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#inject}. + * @param ctx the parse tree + */ + void enterInject(BladeAntlrParser.InjectContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#inject}. + * @param ctx the parse tree + */ + void exitInject(BladeAntlrParser.InjectContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#includeCond}. + * @param ctx the parse tree + */ + void enterIncludeCond(BladeAntlrParser.IncludeCondContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#includeCond}. + * @param ctx the parse tree + */ + void exitIncludeCond(BladeAntlrParser.IncludeCondContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#each}. + * @param ctx the parse tree + */ + void enterEach(BladeAntlrParser.EachContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#each}. + * @param ctx the parse tree + */ + void exitEach(BladeAntlrParser.EachContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#once_block}. + * @param ctx the parse tree + */ + void enterOnce_block(BladeAntlrParser.Once_blockContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#once_block}. + * @param ctx the parse tree + */ + void exitOnce_block(BladeAntlrParser.Once_blockContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#condSection}. + * @param ctx the parse tree + */ + void enterCondSection(BladeAntlrParser.CondSectionContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#condSection}. + * @param ctx the parse tree + */ + void exitCondSection(BladeAntlrParser.CondSectionContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#custom_directive}. + * @param ctx the parse tree + */ + void enterCustom_directive(BladeAntlrParser.Custom_directiveContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#custom_directive}. + * @param ctx the parse tree + */ + void exitCustom_directive(BladeAntlrParser.Custom_directiveContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#possibleDirective}. + * @param ctx the parse tree + */ + void enterPossibleDirective(BladeAntlrParser.PossibleDirectiveContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#possibleDirective}. + * @param ctx the parse tree + */ + void exitPossibleDirective(BladeAntlrParser.PossibleDirectiveContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#php_blade}. + * @param ctx the parse tree + */ + void enterPhp_blade(BladeAntlrParser.Php_bladeContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#php_blade}. + * @param ctx the parse tree + */ + void exitPhp_blade(BladeAntlrParser.Php_bladeContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#phpInline}. + * @param ctx the parse tree + */ + void enterPhpInline(BladeAntlrParser.PhpInlineContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#phpInline}. + * @param ctx the parse tree + */ + void exitPhpInline(BladeAntlrParser.PhpInlineContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#regular_echo}. + * @param ctx the parse tree + */ + void enterRegular_echo(BladeAntlrParser.Regular_echoContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#regular_echo}. + * @param ctx the parse tree + */ + void exitRegular_echo(BladeAntlrParser.Regular_echoContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#raw_echo}. + * @param ctx the parse tree + */ + void enterRaw_echo(BladeAntlrParser.Raw_echoContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#raw_echo}. + * @param ctx the parse tree + */ + void exitRaw_echo(BladeAntlrParser.Raw_echoContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#echo_expr}. + * @param ctx the parse tree + */ + void enterEcho_expr(BladeAntlrParser.Echo_exprContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#echo_expr}. + * @param ctx the parse tree + */ + void exitEcho_expr(BladeAntlrParser.Echo_exprContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#class_expr_usage}. + * @param ctx the parse tree + */ + void enterClass_expr_usage(BladeAntlrParser.Class_expr_usageContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#class_expr_usage}. + * @param ctx the parse tree + */ + void exitClass_expr_usage(BladeAntlrParser.Class_expr_usageContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#object_alias_static_access}. + * @param ctx the parse tree + */ + void enterObject_alias_static_access(BladeAntlrParser.Object_alias_static_accessContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#object_alias_static_access}. + * @param ctx the parse tree + */ + void exitObject_alias_static_access(BladeAntlrParser.Object_alias_static_accessContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#object_alias_direct_access}. + * @param ctx the parse tree + */ + void enterObject_alias_direct_access(BladeAntlrParser.Object_alias_direct_accessContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#object_alias_direct_access}. + * @param ctx the parse tree + */ + void exitObject_alias_direct_access(BladeAntlrParser.Object_alias_direct_accessContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#static_direct_class_access}. + * @param ctx the parse tree + */ + void enterStatic_direct_class_access(BladeAntlrParser.Static_direct_class_accessContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#static_direct_class_access}. + * @param ctx the parse tree + */ + void exitStatic_direct_class_access(BladeAntlrParser.Static_direct_class_accessContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#static_direct_namespace_class_access}. + * @param ctx the parse tree + */ + void enterStatic_direct_namespace_class_access(BladeAntlrParser.Static_direct_namespace_class_accessContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#static_direct_namespace_class_access}. + * @param ctx the parse tree + */ + void exitStatic_direct_namespace_class_access(BladeAntlrParser.Static_direct_namespace_class_accessContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#class_instance}. + * @param ctx the parse tree + */ + void enterClass_instance(BladeAntlrParser.Class_instanceContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#class_instance}. + * @param ctx the parse tree + */ + void exitClass_instance(BladeAntlrParser.Class_instanceContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#class_name_reference}. + * @param ctx the parse tree + */ + void enterClass_name_reference(BladeAntlrParser.Class_name_referenceContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#class_name_reference}. + * @param ctx the parse tree + */ + void exitClass_name_reference(BladeAntlrParser.Class_name_referenceContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#namespacePath}. + * @param ctx the parse tree + */ + void enterNamespacePath(BladeAntlrParser.NamespacePathContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#namespacePath}. + * @param ctx the parse tree + */ + void exitNamespacePath(BladeAntlrParser.NamespacePathContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#function_call}. + * @param ctx the parse tree + */ + void enterFunction_call(BladeAntlrParser.Function_callContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#function_call}. + * @param ctx the parse tree + */ + void exitFunction_call(BladeAntlrParser.Function_callContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#php_expression}. + * @param ctx the parse tree + */ + void enterPhp_expression(BladeAntlrParser.Php_expressionContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#php_expression}. + * @param ctx the parse tree + */ + void exitPhp_expression(BladeAntlrParser.Php_expressionContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#loop_expression}. + * @param ctx the parse tree + */ + void enterLoop_expression(BladeAntlrParser.Loop_expressionContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#loop_expression}. + * @param ctx the parse tree + */ + void exitLoop_expression(BladeAntlrParser.Loop_expressionContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#main_php_expression}. + * @param ctx the parse tree + */ + void enterMain_php_expression(BladeAntlrParser.Main_php_expressionContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#main_php_expression}. + * @param ctx the parse tree + */ + void exitMain_php_expression(BladeAntlrParser.Main_php_expressionContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#composed_php_expression}. + * @param ctx the parse tree + */ + void enterComposed_php_expression(BladeAntlrParser.Composed_php_expressionContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#composed_php_expression}. + * @param ctx the parse tree + */ + void exitComposed_php_expression(BladeAntlrParser.Composed_php_expressionContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#simple_foreach_expr}. + * @param ctx the parse tree + */ + void enterSimple_foreach_expr(BladeAntlrParser.Simple_foreach_exprContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#simple_foreach_expr}. + * @param ctx the parse tree + */ + void exitSimple_foreach_expr(BladeAntlrParser.Simple_foreach_exprContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#singleArgWrapperP}. + * @param ctx the parse tree + */ + void enterSingleArgWrapperP(BladeAntlrParser.SingleArgWrapperPContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#singleArgWrapperP}. + * @param ctx the parse tree + */ + void exitSingleArgWrapperP(BladeAntlrParser.SingleArgWrapperPContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#doubleArgWrapperP}. + * @param ctx the parse tree + */ + void enterDoubleArgWrapperP(BladeAntlrParser.DoubleArgWrapperPContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#doubleArgWrapperP}. + * @param ctx the parse tree + */ + void exitDoubleArgWrapperP(BladeAntlrParser.DoubleArgWrapperPContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#multiArgWrapper}. + * @param ctx the parse tree + */ + void enterMultiArgWrapper(BladeAntlrParser.MultiArgWrapperContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#multiArgWrapper}. + * @param ctx the parse tree + */ + void exitMultiArgWrapper(BladeAntlrParser.MultiArgWrapperContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#identifiableArgument}. + * @param ctx the parse tree + */ + void enterIdentifiableArgument(BladeAntlrParser.IdentifiableArgumentContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#identifiableArgument}. + * @param ctx the parse tree + */ + void exitIdentifiableArgument(BladeAntlrParser.IdentifiableArgumentContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#composedArgument}. + * @param ctx the parse tree + */ + void enterComposedArgument(BladeAntlrParser.ComposedArgumentContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#composedArgument}. + * @param ctx the parse tree + */ + void exitComposedArgument(BladeAntlrParser.ComposedArgumentContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#phpExpr}. + * @param ctx the parse tree + */ + void enterPhpExpr(BladeAntlrParser.PhpExprContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#phpExpr}. + * @param ctx the parse tree + */ + void exitPhpExpr(BladeAntlrParser.PhpExprContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#identifiableArray}. + * @param ctx the parse tree + */ + void enterIdentifiableArray(BladeAntlrParser.IdentifiableArrayContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#identifiableArray}. + * @param ctx the parse tree + */ + void exitIdentifiableArray(BladeAntlrParser.IdentifiableArrayContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#arrayDefine}. + * @param ctx the parse tree + */ + void enterArrayDefine(BladeAntlrParser.ArrayDefineContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#arrayDefine}. + * @param ctx the parse tree + */ + void exitArrayDefine(BladeAntlrParser.ArrayDefineContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#paramAssign}. + * @param ctx the parse tree + */ + void enterParamAssign(BladeAntlrParser.ParamAssignContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#paramAssign}. + * @param ctx the parse tree + */ + void exitParamAssign(BladeAntlrParser.ParamAssignContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#verbatim_block}. + * @param ctx the parse tree + */ + void enterVerbatim_block(BladeAntlrParser.Verbatim_blockContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#verbatim_block}. + * @param ctx the parse tree + */ + void exitVerbatim_block(BladeAntlrParser.Verbatim_blockContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#loop_action}. + * @param ctx the parse tree + */ + void enterLoop_action(BladeAntlrParser.Loop_actionContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#loop_action}. + * @param ctx the parse tree + */ + void exitLoop_action(BladeAntlrParser.Loop_actionContext ctx); + /** + * Enter a parse tree produced by {@link BladeAntlrParser#html}. + * @param ctx the parse tree + */ + void enterHtml(BladeAntlrParser.HtmlContext ctx); + /** + * Exit a parse tree produced by {@link BladeAntlrParser#html}. + * @param ctx the parse tree + */ + void exitHtml(BladeAntlrParser.HtmlContext ctx); +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java new file mode 100644 index 000000000000..e0cbcd1ab281 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java @@ -0,0 +1,303 @@ +/* +Licensed to the Apache Software Foundation (ASF) + */ +package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +import java.util.List; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.Token; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser.*; +import org.netbeans.spi.lexer.antlr4.AntlrTokenSequence; + +/** + * + * @author bogdan + */ +public class BladeAntlrUtils { + + public static AntlrTokenSequence getTokens(Document doc) { + + try { + String text = doc.getText(0, doc.getLength()); + return new AntlrTokenSequence(new BladeAntlrLexer(CharStreams.fromString(text))); + } catch (BadLocationException ex) { + + } + return null; + } + + public static Token getToken(Document doc, int offset) { + AntlrTokenSequence tokens = getTokens(doc); + if (tokens == null || tokens.isEmpty()) { + return null; + } + + tokens.seekTo(offset); + + if (!tokens.hasNext()) { + return null; + } + + Token token = tokens.next().get(); + + //need to move back + if ( token != null && tokens.hasPrevious() && token.getStartIndex() > offset && token.getStopIndex() > offset){ + token = tokens.previous().get(); + } + + return token; + } + + public static Token findForward(Document doc, Token start, + List stopTokenText, List openTokensText) { + + AntlrTokenSequence tokens = getTokens(doc); + + if (tokens == null || tokens.isEmpty()) { + return null; + } + + tokens.seekTo(start.getStopIndex() + 1); + + int openTokenBalance = 0; + + while (tokens.hasNext()) { + Token nt = tokens.next().get(); + if (nt == null) { + continue; + } + + String tokenText = nt.getText(); + + if (openTokensText.contains(tokenText)) { + openTokenBalance++; + continue; + } + if (stopTokenText.contains(tokenText)) { + if (openTokenBalance > 0) { + openTokenBalance--; + } else { + return nt; + } + } + } + + return null; + } + + public static Token findForward(AntlrTokenSequence tokens, + List tokensMatch, List tokensStop) { + + while (tokens.hasNext()) { + Token pt = tokens.next().get(); + if (pt == null) { + continue; + } + + if (tokensMatch.contains(pt.getType())) { + return pt; + } + + if (tokensStop.contains(pt.getType())) { + return null; + } + } + + return null; + } + + public static Token findBackward(Document doc, Token start, + List stopTokenText, List openTokensText) { + + AntlrTokenSequence tokens = getTokens(doc); + + if (tokens == null || tokens.isEmpty()) { + return null; + } + + tokens.seekTo(start.getStartIndex() - 1); + + int openTokenBalance = 0; + + while (tokens.hasPrevious()) { + Token pt = tokens.previous().get(); + if (pt == null) { + continue; + } + + String tokenText = pt.getText(); + + if (openTokensText.contains(tokenText)) { + openTokenBalance++; + continue; + } + if (stopTokenText.contains(tokenText)) { + if (openTokenBalance > 0) { + openTokenBalance--; + } else { + return pt; + } + } + } + + return null; + } + + public static Token findBackward(AntlrTokenSequence tokens, + List tokensMatch, List tokensStop) { + + while (tokens.hasPrevious()) { + Token pt = tokens.previous().get(); + if (pt == null) { + continue; + } + + if (tokensMatch.contains(pt.getType())) { + return pt; + } + + if (tokensStop.contains(pt.getType())) { + return null; + } + } + + return null; + } + + public static Token findForward(Document doc, Token start, + int tokensMatch, List skipableTokens) { + AntlrTokenSequence tokens = getTokens(doc); + + if (tokens == null || tokens.isEmpty()) { + return null; + } + + tokens.seekTo(start.getStopIndex() + 1); + + while (tokens.hasNext()) { + Token pt = tokens.next().get(); + if (pt == null) { + continue; + } + + if (pt.getType() == tokensMatch) { + return pt; + } + + if (skipableTokens.contains(pt.getType())) { + continue; + } + + return null; + } + + return null; + + } + + public static Token findForwardWithStop(Document doc, Token start, + int tokensMatch, List stopTokens) { + AntlrTokenSequence tokens = getTokens(doc); + + if (tokens == null || tokens.isEmpty()) { + return null; + } + + tokens.seekTo(start.getStopIndex() + 1); + + while (tokens.hasNext()) { + Token pt = tokens.next().get(); + if (pt == null) { + continue; + } + + if (pt.getType() == tokensMatch) { + return pt; + } + + if (stopTokens.contains(pt.getType())) { + return null; + } + } + + return null; + + } + + public static Token findBackward(Document doc, Token start, + int tokensMatch, List skipableTokens) { + AntlrTokenSequence tokens = getTokens(doc); + + if (tokens == null || tokens.isEmpty()) { + return null; + } + + tokens.seekTo(start.getStartIndex() - 1); + + while (tokens.hasPrevious()) { + Token pt = tokens.previous().get(); + if (pt == null) { + continue; + } + + if (pt.getType() == tokensMatch) { + return pt; + } + + if (skipableTokens.contains(pt.getType())) { + continue; + } + + return null; + } + + return null; + + } + + public static Token findBackwardWithStop(Document doc, Token start, + int tokensMatch, List stopTokens) { + AntlrTokenSequence tokens = getTokens(doc); + + if (tokens == null || tokens.isEmpty()) { + return null; + } + + tokens.seekTo(start.getStartIndex() - 1); + + while (tokens.hasPrevious()) { + Token pt = tokens.previous().get(); + if (pt == null) { + continue; + } + + if (pt.getType() == tokensMatch) { + return pt; + } + + if (stopTokens.contains(pt.getType())) { + return null; + } + } + + return null; + + } + + public static int getTagPairTokenType(int tokenType) { + switch (tokenType) { + case CONTENT_TAG_OPEN: + return CONTENT_TAG_CLOSE; + case CONTENT_TAG_CLOSE: + return CONTENT_TAG_OPEN; + case RAW_TAG_OPEN: + return RAW_TAG_CLOSE; + case RAW_TAG_CLOSE: + return RAW_TAG_OPEN; + default: + return -1; + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 new file mode 100644 index 000000000000..f79431ab19e2 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 @@ -0,0 +1,79 @@ +lexer grammar BladeCommonLexer; + +tokens { + HTML, + BLADE_COMMENT +} + +fragment NameString + : [a-z_\u0080-\ufffe][a-z0-9_\u0080-\ufffe]*; + +fragment BladeLabel + : [a-z\u0080-\ufffe][a-z0-9_.\u0080-\ufffe]*; + +fragment FullIdentifier + : [a-z_\u0080-\ufffe][a-z0-9_\u0080-\ufffe-]*; + +fragment ESC_DOUBLE_QUOTED_STRING + : [\\"]; + +fragment DOUBLE_QUOTED_STRING_FRAGMENT + : '"' (ESC_DOUBLE_QUOTED_STRING | . )*? '"'; + +fragment SINGLE_QUOTED_STRING_FRAGMENT + : '\'' (~('\'' | '\\') | '\\' . )* '\''; + +fragment LineComment + : '//' ~ [\r\n]* + ; + +fragment PhpVariable + : '$' NameString; + +fragment PhpKeyword + : 'array' | 'class' | 'empty' | 'use'; + +fragment Digit + : ('0'..'9'); + +BLADE_COMMENT_START : '{{--' ->pushMode(INSIDE_BLADE_COMMENT); + +EMAIL_SUBSTRING : ('@' FullIdentifier '.')->type(HTML); + +VERSION_WITH_AT: '@' (Digit '.'?)+->type(HTML); + +//escapes +D_ESCAPES + : ( + '{{{' + | '@@' '@'? + | '@{' '{'? + | '@media' [ ]* '('? + | '@charset' [ ]* + | '@import' [ ]* + | '@namespace' [ ]* + | '@document' [ ]* + | '@font-face' [ ]* + | '@page' [ ]* + | '@supports' [ ]* + | '@layer' [ ]* + | '@tailwind' [ ]* + | '@apply' [ ]* + | '@-webkit-keyframes' [ ]* + | '@keyframes' [ ]* + )->type(HTML); + +mode INSIDE_BLADE_COMMENT; + +BLADE_COMMENT_END : '--}}'->popMode; + +//hack to merge all php inputs into one token +BLADE_COMMENT_PEEK : . { + this._input.LA(1) == '-' && + this._input.LA(2) == '-' && + this._input.LA(3) == '}' && + this._input.LA(4) == '}' + }? ->type(BLADE_COMMENT); +BLADE_COMMENT_MORE : . ->more; + +BLADE_COMMENT_EOF : EOF->type(BLADE_COMMENT),popMode; \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 new file mode 100644 index 000000000000..853121caac06 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 @@ -0,0 +1,79 @@ +lexer grammar BladeCommonLexer; + +tokens { + HTML, + BLADE_COMMENT +} + +fragment NameString + : [a-z_\u0080-\ufffe][a-z0-9_\u0080-\ufffe]*; + +fragment BladeLabel + : [a-z\u0080-\ufffe][a-z0-9_.\u0080-\ufffe]*; + +fragment FullIdentifier + : [a-z_\u0080-\ufffe][a-z0-9_\u0080-\ufffe-]*; + +fragment ESC_DOUBLE_QUOTED_STRING + : [\\"]; + +fragment DOUBLE_QUOTED_STRING_FRAGMENT + : '"' (ESC_DOUBLE_QUOTED_STRING | . )*? '"'; + +fragment SINGLE_QUOTED_STRING_FRAGMENT + : '\'' (~('\'' | '\\') | '\\' . )* '\''; + +fragment LineComment + : '//' ~ [\r\n]* + ; + +fragment PhpVariable + : '$' NameString; + +fragment PhpKeyword + : 'array' | 'class' | 'empty' | 'use'; + +fragment Digit + : ('0'..'9'); + +BLADE_COMMENT_START : '{{--' ->pushMode(INSIDE_BLADE_COMMENT), skip; + +EMAIL_SUBSTRING : ('@' FullIdentifier '.')->type(HTML); + +VERSION_WITH_AT: '@' (Digit '.'?)+->type(HTML); + +//escapes +D_ESCAPES + : ( + '{{{' + | '@@' '@'? + | '@{' '{'? + | '@media' [ ]* '('? + | '@charset' [ ]* + | '@import' [ ]* + | '@namespace' [ ]* + | '@document' [ ]* + | '@font-face' [ ]* + | '@page' [ ]* + | '@supports' [ ]* + | '@layer' [ ]* + | '@tailwind' [ ]* + | '@apply' [ ]* + | '@-webkit-keyframes' [ ]* + | '@keyframes' [ ]* + )->type(HTML); + +mode INSIDE_BLADE_COMMENT; + +BLADE_COMMENT_END : '--}}'->popMode, skip; + +//hack to merge all php inputs into one token +BLADE_COMMENT_PEEK : . { + this._input.LA(1) == '-' && + this._input.LA(2) == '-' && + this._input.LA(3) == '}' && + this._input.LA(4) == '}' + }? ->skip; +BLADE_COMMENT_MORE : . ->skip; + +BLADE_COMMENT_EOF : EOF->popMode, skip; \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java new file mode 100644 index 000000000000..9700d68dea3c --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java @@ -0,0 +1,138 @@ +/* +Licensed to the Apache Software Foundation (ASF) + */ +package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.Token; + +/** + * + * @author bogdan + */ +public abstract class ColoringLexerAdaptor extends Lexer { + + private int _currentRuleType = Token.INVALID_TYPE; + public int roundParenBalance = 0; + public int squareParenBalance = 0; + public int curlyParenBalance = 0; + public int exitIfModePosition = 0; + public int phpExpressionOffset = -1; + public boolean hasPhpExprContent = false; + + public ColoringLexerAdaptor(CharStream input) { + super(input); + } + + public int getCurrentRuleType() { + return _currentRuleType; + } + + public void setCurrentRuleType(int ruleType) { + this._currentRuleType = ruleType; + } + + @Override + public Token emit() { + return super.emit(); + } + + @Override + public void reset() { + setCurrentRuleType(Token.INVALID_TYPE); + super.reset(); + } + + /** + * eager check to see if the character position in a line is at the start + * + * @return + */ + public boolean IsNewLineOrStart() { + return this._tokenStartCharPositionInLine <= 2; + } + + public boolean peekNextChar(char peekChar) { + return (char) this._input.LA(1) == peekChar; + } + + public boolean peekNextChars(char peekChar, int number) { + for (int i = 1; i < number; i++) { + if ((char) this._input.LA(i) != peekChar) { + return false; + } + } + return true; + } + + public void increaseRoundParenBalance() { + this.roundParenBalance++; + } + + public void decreaseRoundParenBalance() { + this.roundParenBalance--; + } + + public boolean endsWith(char ch1, char ch2) { + return this._input.LA(1) == ch1 && this._input.LA(2) == ch2; + } + + public boolean endsWith(char ch1, char ch2, char ch3) { + return this._input.LA(1) == ch1 + && this._input.LA(2) == ch2 + && this._input.LA(3) == ch3; + } + + public boolean hasNoBladeParamOpenBracket() { + return this.roundParenBalance > 0 + && this.squareParenBalance == 0 + && this.curlyParenBalance == 0; + } + + //blade coloring lexer + public void consumeEscapedEchoToken() { + if (this._input.LA(1) == '}' && this._input.LA(2) == '}') { + this.setType(BladeAntlrColoringLexer.BLADE_PHP_ECHO_EXPR); + } else { + this.more(); + } + } + + //blade coloring lexer + public void consumeNotEscapedEchoToken() { + if (this._input.LA(1) == '!' && this._input.LA(2) == '!' && this._input.LA(3) == '}') { + this.setType(BladeAntlrColoringLexer.BLADE_PHP_ECHO_EXPR); + } else { + this.more(); + } + } + + public void consumeExprToken(){ + if (this._input.LA(1) == ':' && this._input.LA(2) != ':'){ + this.setType(BladeAntlrColoringLexer.PHP_EXPRESSION); + } else { + this.more(); + } + } + + public void testForFreezeCombination(){ + if (this.roundParenBalance <= 1 && + (this._input.LA(1) == ')' + || this._input.LA(1) == ']')){ + this.setType(BladeAntlrColoringLexer.ERROR); + } else { + this.consumeExprToken(); + } + } + +// to continue when the sepparation of PHP_EXPRESSION can be implemented +// public void setPhpExpressionOffset(){ +// this.phpExpressionOffset = this.getCharIndex(); +// } +// +// public boolean isFirstElement() { +// return this._tokenStartCharIndex <= this.phpExpressionOffset; +// } +} + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java new file mode 100644 index 000000000000..c733cfe0e7c0 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java @@ -0,0 +1,144 @@ +/* +Licensed to the Apache Software Foundation (ASF) + */ +package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.atn.ATN; +import org.antlr.v4.runtime.misc.Interval; + +/** + * + * @author bogdan + */ +public abstract class LexerAdaptor extends Lexer { + + private int _currentRuleType = Token.INVALID_TYPE; + public int roundParenBalance = 0; + public int squareParenBalance = 0; + public int curlyParenBalance = 0; + public int exitIfModePosition = 0; + public boolean compomentTagOpen = false; + + public LexerAdaptor(CharStream input) { + super(input); + } + + public int getCurrentRuleType() { + return _currentRuleType; + } + + public void setCurrentRuleType(int ruleType) { + this._currentRuleType = ruleType; + } + + @Override + public Token emit() { + return super.emit(); + } + + @Override + public void reset() { + setCurrentRuleType(Token.INVALID_TYPE); + super.reset(); + } + + /** + * eager check to see if the character position in a line is at the start + * + * @return + */ + public boolean IsNewLineOrStart() { + return this._tokenStartCharPositionInLine <= 2; + } + + public boolean peekNextChar(char peekChar) { + return (char) this._input.LA(1) == peekChar; + } + + public boolean peekNextChars(char peekChar, int number) { + for (int i = 1; i < number; i++) { + if ((char) this._input.LA(i) != peekChar) { + return false; + } + } + return true; + } + + public void increaseRoundParenBalance() { + this.roundParenBalance++; + } + + public void decreaseRoundParenBalance() { + this.roundParenBalance--; + } + + public boolean endsWith(char ch1, char ch2) { + return this._input.LA(1) == ch1 && this._input.LA(2) == ch2; + } + + public boolean endsWith(char ch1, char ch2, char ch3) { + return this._input.LA(1) == ch1 + && this._input.LA(2) == ch2 + && this._input.LA(3) == ch3; + } + + public boolean hasNoBladeParamOpenBracket() { + return this.roundParenBalance == 0 + && this.squareParenBalance == 0 + && this.curlyParenBalance == 0; + } + + public void consumeBladeParamComma(){ + if (this.hasNoBladeParamOpenBracket()){ + this.setType(BladeAntlrLexer.BL_COMMA); + } else { + this.setType(BladeAntlrLexer.BL_PARAM_COMMA); + } + } + + public void consumeRParen(){ + //we start from 0 balance + this.roundParenBalance--; + if (this.roundParenBalance < 0) { + this.roundParenBalance = 0; + this.setType(BladeAntlrLexer.BLADE_PARAM_RPAREN); + this.mode(DEFAULT_MODE); + } else { + this.setType(BladeAntlrLexer.BLADE_PARAM_EXTRA); + } + } + + public void consumeParamRParen(){ + //we start from 0 balance + this.roundParenBalance--; + if (this.roundParenBalance < 0) { + this.roundParenBalance = 0; + this.setType(BladeAntlrLexer.BLADE_PARAM_RPAREN); + this.mode(DEFAULT_MODE); + } else { + this.setType(BladeAntlrLexer.BLADE_PARAM_EXTRA); + } + } + + public void consumeExprRParen(){ + //we start from 0 balance + this.roundParenBalance--; + this.setType(BladeAntlrLexer.BLADE_EXPR_RPAREN); + if (this.roundParenBalance < 0) { + this.roundParenBalance = 0; + this.mode(DEFAULT_MODE); + } + } + + + public void consumeHtmlIdentifier(){ + if (this.compomentTagOpen == true) { + this.setType(BladeAntlrLexer.HTML_IDENTIFIER); + } else { + this.setType(BladeAntlrLexer.HTML); + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.form b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.form new file mode 100644 index 000000000000..ec263c1cdaf6 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.form @@ -0,0 +1,57 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.java b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.java new file mode 100644 index 000000000000..7b9c05f95fa4 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.java @@ -0,0 +1,94 @@ +/* +Licensed to the Apache Software Foundation (ASF) + */ +package org.netbeans.modules.php.blade.ui.options; + +import org.netbeans.modules.php.api.util.UiUtils; +import org.netbeans.modules.php.blade.editor.preferences.GeneralPreferencesUtils; +import org.netbeans.modules.php.blade.editor.preferences.ModulePreferences; +import org.netbeans.spi.options.OptionsPanelController; + +/** + * + * @author bogdan + */ +@OptionsPanelController.Keywords( + keywords = { + "php", "twig" + }, + location = UiUtils.OPTIONS_PATH, + tabTitle = "Laravel tab" +) +public class BladeOptionsPanel extends javax.swing.JPanel { + + private final BladeOptionsPanelController controller; + + BladeOptionsPanel(BladeOptionsPanelController controller) { + this.controller = controller; + initComponents(); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + jLabel1 = new javax.swing.JLabel(); + auto_tag_completion = new javax.swing.JCheckBox(); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(BladeOptionsPanel.class, "BladeOptionsPanel.jLabel1.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(auto_tag_completion, org.openide.util.NbBundle.getMessage(BladeOptionsPanel.class, "BladeOptionsPanel.auto_tag_completion.text")); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel1) + .addComponent(auto_tag_completion)) + .addContainerGap(127, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(auto_tag_completion) + .addContainerGap(252, Short.MAX_VALUE)) + ); + }// //GEN-END:initComponents + + void load() { + this.auto_tag_completion.setSelected(GeneralPreferencesUtils.isAutoTagCompletionEnabled()); + } + + void store() { + ModulePreferences.setPrefBoolean(GeneralPreferencesUtils.ENABLE_AUTO_TAG_COMPLETION, this.auto_tag_completion.isSelected()); + } + + void cancel() { + //throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody + } + + boolean valid() { + return true; + } + + boolean changed() { + return false; + } + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JCheckBox auto_tag_completion; + private javax.swing.JLabel jLabel1; + // End of variables declaration//GEN-END:variables +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java new file mode 100644 index 000000000000..772608815ff8 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java @@ -0,0 +1,93 @@ +/* +Licensed to the Apache Software Foundation (ASF) + */ +package org.netbeans.modules.php.blade.ui.options; + +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import javax.swing.JComponent; +import org.netbeans.modules.php.api.util.UiUtils; +import org.netbeans.spi.options.OptionsPanelController; +import org.openide.util.HelpCtx; +import org.openide.util.Lookup; + +@UiUtils.PhpOptionsPanelRegistration( + id = BladeOptionsPanelController.ID, + displayName = "Blade", + position = 2150 +) +public class BladeOptionsPanelController extends OptionsPanelController { + + static final String ID = "Blade"; // NOI18N + public static final String OPTIONS_SUBPATH = UiUtils.FRAMEWORKS_AND_TOOLS_SUB_PATH + "/" + ID; // NOI18N + + private BladeOptionsPanel panel; + private final PropertyChangeSupport pcs = new PropertyChangeSupport(this); + private volatile boolean changed; + + @Override + public void update() { + getPanel().load(); + changed = false; + } + + @Override + public void applyChanges() { + getPanel().store(); + changed = false; + } + + @Override + public void cancel() { + getPanel().cancel(); + } + + @Override + public boolean isValid() { + return getPanel().valid(); + } + + @Override + public boolean isChanged() { + return getPanel().changed(); + } + + @Override + public HelpCtx getHelpCtx() { + return new HelpCtx("org.netbeans.modules.php.blade.editor.Options"); //NOI18N + } + + @Override + public JComponent getComponent(Lookup masterLookup) { + return getPanel(); + } + + @Override + public void addPropertyChangeListener(PropertyChangeListener l) { + pcs.addPropertyChangeListener(l); + } + + @Override + public void removePropertyChangeListener(PropertyChangeListener l) { + pcs.removePropertyChangeListener(l); + } + + private BladeOptionsPanel getPanel() { + if (panel == null) { + panel = new BladeOptionsPanel(this); + } + return panel; + } + + void changed() { + if (!changed) { + changed = true; + pcs.firePropertyChange(OptionsPanelController.PROP_CHANGED, false, true); + } + pcs.firePropertyChange(OptionsPanelController.PROP_VALID, null, null); + } + + public static String getOptionsPath() { + return UiUtils.OPTIONS_PATH + "/" + OPTIONS_SUBPATH; // NOI18N + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/Bundle.properties b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/Bundle.properties new file mode 100644 index 000000000000..22a91f094ade --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/Bundle.properties @@ -0,0 +1,3 @@ + +BladeOptionsPanel.jLabel1.text=Blade +BladeOptionsPanel.auto_tag_completion.text=Auto tag completion ("{{ }}", "{!! !!}", "{{-- --}}") diff --git a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/issues/issue61/issue61.blade.php b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/issues/issue61/issue61.blade.php new file mode 100644 index 000000000000..d195ba0d8de1 --- /dev/null +++ b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/issues/issue61/issue61.blade.php @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/content_tag.blade.php b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/content_tag.blade.php new file mode 100644 index 000000000000..16532c33e245 --- /dev/null +++ b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/content_tag.blade.php @@ -0,0 +1 @@ +Hello, {{ $name }}. \ No newline at end of file diff --git a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/escaped_tag.blade.php b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/escaped_tag.blade.php new file mode 100644 index 000000000000..56c97d5369a5 --- /dev/null +++ b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/escaped_tag.blade.php @@ -0,0 +1,3 @@ +

    Laravel

    + +Hello, @{{ name }}. \ No newline at end of file diff --git a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/fragment.blade.php b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/fragment.blade.php new file mode 100644 index 000000000000..c52c3f531d8e --- /dev/null +++ b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/fragment.blade.php @@ -0,0 +1,7 @@ +@fragment('user-list') +
      + @foreach ($users as $user) +
    • {{ $user->name }}
    • + @endforeach +
    +@endfragment \ No newline at end of file diff --git a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/raw_tag.blade.php b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/raw_tag.blade.php new file mode 100644 index 000000000000..4099847299d0 --- /dev/null +++ b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/raw_tag.blade.php @@ -0,0 +1 @@ +Hello, {!! $name !!}. \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java new file mode 100644 index 000000000000..c5f3fb680ddd --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java @@ -0,0 +1,107 @@ +package org.netbeans.modules.php.blade.syntax.antlr4; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.Token; +import org.netbeans.junit.NbTestCase; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrColoringLexer.*; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; + +/** + * + * @author bhaidu + */ +public class BladeAntlrColoringLexerTestBase extends BladeBaseTest { + + public BladeAntlrColoringLexerTestBase(String testName) { + super(testName); + } + + public static final FileObject copyStringToFileObject(FileObject fo, String content) throws IOException { + OutputStream os = fo.getOutputStream(); + try { + InputStream is = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8)); + try { + FileUtil.copy(is, os); + return fo; + } finally { + is.close(); + } + } finally { + os.close(); + } + } + + protected void performTest(String filename) throws Exception { + String result = getTestResult(filename); + String goldenFolder = getDataDir() + "/goldenfiles/"; + File goldenFile = new File(goldenFolder + filename + ".pass"); + if (!goldenFile.exists()) { + FileObject goldenFO = touch(goldenFolder, filename + ".pass"); + copyStringToFileObject(goldenFO, result); + } else { + // if exist, compare it. + FileObject resultFO = touch(getWorkDir(), filename + ".result"); + copyStringToFileObject(resultFO, result); + assertFile(FileUtil.toFile(resultFO), goldenFile, getWorkDir()); + } + } + + protected String getTestResult(String filename) throws Exception { + String content = BladeUtils.getFileContent(new File(getDataDir(), "testfiles/" + filename)); + CommonTokenStream tokenStream = BladeUtils.getColoringTokenStream(content); + System.out.print("\n---Lexer scan for <<" + filename + ">>\n\n"); + return createResult(tokenStream); + } + + protected String createResult(CommonTokenStream tokenStream) throws Exception { + StringBuilder result = new StringBuilder(); + + for (Token token : tokenStream.getTokens()) { + switch (token.getType()) { + case HTML: + result.append("HTML "); + break; + case RAW_TAG: + result.append("RAW_TAG "); + break; + case PHP_EXPRESSION: + result.append("PHP_EXPRESSION "); + break; + case BLADE_PHP_ECHO_EXPR: + result.append("PHP_BLADE_ECHO_EXPR "); + break; + case BLADE_PHP_INLINE: + result.append("BLADE_PHP_INLINE "); + break; + default: + result.append(token.getType()); + result.append(" "); + break; + } + + String text = replaceLinesAndTabs(token.getText()); + result.append(text); + result.append(";"); + result.append("\n"); + } + + return result.toString(); + } + + public static String replaceLinesAndTabs(String input) { + String escapedString = input; + escapedString = escapedString.replaceAll("\n", "\\\\n"); //NOI18N + escapedString = escapedString.replaceAll("\r", "\\\\r"); //NOI18N + escapedString = escapedString.replaceAll("\t", "\\\\t"); //NOI18N + return escapedString; + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java new file mode 100644 index 000000000000..f23bc0f0f853 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java @@ -0,0 +1,111 @@ +package org.netbeans.modules.php.blade.syntax.antlr4; + +import java.io.File; +import java.net.URISyntaxException; +import java.net.URL; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.Token; +import org.netbeans.junit.NbTestCase; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; + +/** + * + * @author bhaidu + */ +public class BladeAntlrLexerTestBase extends NbTestCase { + + public BladeAntlrLexerTestBase(String testName) { + super(testName); + } + + public File getDataDir() { + URL codebase = getClass().getProtectionDomain().getCodeSource().getLocation(); + File dataDir = null; + try { + dataDir = new File(new File(codebase.toURI()), "data"); + } catch (URISyntaxException x) { + throw new Error(x); + } + return dataDir; + } + + protected void performTest(String filename) throws Exception { + performTest(filename, null); + } + + protected String getTestResult(String filename, String caretLine) throws Exception { + return getTestResult(filename); + } + + protected void performTest(String filename, String caretLine) throws Exception { + // parse the file + String result = getTestResult(filename, caretLine); + System.out.print(result); + } + + protected String getTestResult(String filename) throws Exception { + String content = BladeUtils.getFileContent(new File(getDataDir(), "testfiles/" + filename)); + CommonTokenStream tokenStream = BladeUtils.getTokenStream(content); + System.out.print("\n---Lexer scan for <<" + filename + ">>\n\n"); + return createResult(tokenStream); + } + + protected String createResult(CommonTokenStream tokenStream) throws Exception { + StringBuilder result = new StringBuilder(); + + for (Token token : tokenStream.getTokens()) { + int channel = token.getChannel(); + switch (token.getType()) { + case BL_PARAM_STRING: + result.append("BL_PARAM_STRING "); + break; + case BL_NAME_STRING: + result.append("BL_NAME_STRING "); + break; + case BL_COMMA: + result.append("BL_COMMA "); + break; + case BL_PARAM_COMMA: + result.append("BL_PARAM_COMMA "); + break; + case BLADE_PARAM_LPAREN: + result.append("BLADE_PARAM_LPAREN "); + break; + case BLADE_PARAM_RPAREN: + result.append("BLADE_PARAM_RPAREN "); + break; + case BLADE_PARAM_EXTRA: + result.append("BLADE_PARAM_EXTRA "); + break; + case D_VERBATIM: + result.append("D_VERBATIM "); + break; + case D_ENDVERBATIM: + result.append("D_ENDVERBATIM "); + break; + case HTML: + result.append("HTML "); + break; + default: + result.append(token.getType()); + result.append(" "); + break; + } + + String text = replaceLinesAndTabs(token.getText()); + result.append(text); + result.append(";"); + result.append("\n"); + } + + return result.toString(); + } + + public static String replaceLinesAndTabs(String input) { + String escapedString = input; + escapedString = escapedString.replaceAll("\n", "\\\\n"); //NOI18N + escapedString = escapedString.replaceAll("\r", "\\\\r"); //NOI18N + escapedString = escapedString.replaceAll("\t", "\\\\t"); //NOI18N + return escapedString; + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java new file mode 100644 index 000000000000..83f87733ebf6 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java @@ -0,0 +1,92 @@ +package org.netbeans.modules.php.blade.syntax.antlr4; + +import java.io.File; +import java.net.URISyntaxException; +import java.net.URL; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.tree.ParseTreeListener; +import org.netbeans.junit.NbTestCase; +import org.netbeans.modules.php.blade.editor.parser.ParsingUtils; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParserBaseListener; + +/** + * + * @author bhaidu + */ +public class BladeAntlrParserTestBase extends NbTestCase { + + public BladeAntlrParserTestBase(String testName) { + super(testName); + } + + public File getDataDir() { + URL codebase = getClass().getProtectionDomain().getCodeSource().getLocation(); + File dataDir = null; + try { + dataDir = new File(new File(codebase.toURI()), "data"); + } catch (URISyntaxException x) { + throw new Error(x); + } + return dataDir; + } + + protected void performTest(String filename) throws Exception { + performTest(filename, null); + } + + protected String getTestResult(String filename, String caretLine) throws Exception { + return getTestResult(filename); + } + + protected void performTest(String filename, String caretLine) throws Exception { + // parse the file + String result = getTestResult(filename, caretLine); + System.out.print(result); + } + + protected String getTestResult(String filename) throws Exception { + String content = BladeUtils.getFileContent(new File(getDataDir(), "testfiles/" + filename)); + ParsingUtils parsingUtils = new ParsingUtils(); + parsingUtils.parsePhpText(content); + CommonTokenStream tokenStream = BladeUtils.getTokenStream(content); + System.out.print("\n---Psrser scan for <<" + filename + ">>\n\n"); + BladeAntlrParser parser = new BladeAntlrParser(tokenStream); + ParseTreeListener listener = new BladeAntlrParserBaseListener(){ + + }; + parser.addParseListener(listener); + parser.file(); + System.out.println(parser.getBuildParseTree()); + + return createResult(tokenStream); + } + + protected String createResult(CommonTokenStream tokenStream) throws Exception { + StringBuilder result = new StringBuilder(); + + for (Token token : tokenStream.getTokens()) { + switch (token.getType()) { +// case BLADE_ESCAPED_CONTENT: +// result.append("BLADE_ESCAPED_CONTENT "); +// break; + } + + String text = replaceLinesAndTabs(token.getText()); + result.append(text); + result.append(";"); + result.append("\n"); + } + + return result.toString(); + } + + public static String replaceLinesAndTabs(String input) { + String escapedString = input; + escapedString = escapedString.replaceAll("\n", "\\\\n"); //NOI18N + escapedString = escapedString.replaceAll("\r", "\\\\r"); //NOI18N + escapedString = escapedString.replaceAll("\t", "\\\\t"); //NOI18N + return escapedString; + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java new file mode 100644 index 000000000000..c05053ebf87b --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java @@ -0,0 +1,20 @@ +package org.netbeans.modules.php.blade.syntax.antlr4; + +import org.junit.Test; + +/** + * + * @author bhaidu + */ +public class BladeAntrlColoringLexerTest extends BladeAntlrColoringLexerTestBase { + + public BladeAntrlColoringLexerTest(String testName) { + super(testName); + } + + @Test + public void test_smoke_content_tag() throws Exception { + performTest("coloring_lexer/smoke/content_tag.blade.php"); + } + +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java new file mode 100644 index 000000000000..2745fbca6681 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java @@ -0,0 +1,16 @@ +package org.netbeans.modules.php.blade.syntax.antlr4; + +import org.junit.Test; + +/** + * + * @author bhaidu + */ +public class BladeAntrlLexerTest extends BladeAntlrLexerTestBase { + + public BladeAntrlLexerTest(String testName) { + super(testName); + } + + +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java new file mode 100644 index 000000000000..9c7ee6071d11 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java @@ -0,0 +1,15 @@ +package org.netbeans.modules.php.blade.syntax.antlr4; + +import org.junit.Test; + +/** + * + * @author bhaidu + */ +public class BladeAntrlParserTest extends BladeAntlrParserTestBase { + + public BladeAntrlParserTest(String testName) { + super(testName); + } + +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java new file mode 100644 index 000000000000..28ce701c61e1 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java @@ -0,0 +1,51 @@ +package org.netbeans.modules.php.blade.syntax.antlr4; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; +import static junit.framework.TestCase.assertTrue; +import org.netbeans.junit.NbTestCase; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; + +/** + * + * @author bhaidu + */ +public abstract class BladeBaseTest extends NbTestCase { + + public BladeBaseTest(String testName) { + super(testName); + } + + protected FileObject touch(final FileObject dir, final String path) throws IOException { + return FileUtil.createData(dir, path); + } + + public File getDataDir() { + URL codebase = getClass().getProtectionDomain().getCodeSource().getLocation(); + File dataDir = null; + try { + dataDir = new File(new File(codebase.toURI()), "data"); + } catch (URISyntaxException x) { + throw new Error(x); + } + return dataDir; + } + + + protected FileObject touch(final String dir, final String path) throws IOException { + return touch(new File(dir), path); + } + + protected FileObject touch(final File dir, final String path) throws IOException { + if (!dir.isDirectory()) { + assertTrue("success to create " + dir, dir.mkdirs()); + } + FileObject dirFO = FileUtil.toFileObject(FileUtil.normalizeFile(dir)); + return touch(dirFO, path); + } + + abstract protected String getTestResult(String filename) throws Exception; +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java new file mode 100644 index 000000000000..fb495a7370ff --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java @@ -0,0 +1,55 @@ +package org.netbeans.modules.php.blade.syntax.antlr4; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStreamReader; +import org.antlr.v4.runtime.*; +import org.netbeans.modules.php.blade.syntax.antlr4.formatter.BladeAntlrFormatterLexer; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrColoringLexer; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; + +/** + * + * @author bhaidu + */ +public class BladeUtils { + + public static String getFileContent(File file) throws Exception { + StringBuffer sb = new StringBuffer(); + String lineSep = "\n";//NOI18N + BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); + String line = br.readLine(); + while (line != null) { + sb.append(line); + sb.append(lineSep); + line = br.readLine(); + } + br.close(); + return sb.toString(); + } + + public static CommonTokenStream getTokenStream(String content) { + CharStream stream = CharStreams.fromString(content); + BladeAntlrLexer lexer = new BladeAntlrLexer(stream); + CommonTokenStream tokens = new CommonTokenStream(lexer); + tokens.fill(); + return tokens; + } + + public static CommonTokenStream getColoringTokenStream(String content) { + CharStream stream = CharStreams.fromString(content); + BladeAntlrColoringLexer lexer = new BladeAntlrColoringLexer(stream); + CommonTokenStream tokens = new CommonTokenStream(lexer); + tokens.fill(); + return tokens; + } + + public static CommonTokenStream getFormatTokenStream(String content) { + CharStream stream = CharStreams.fromString(content); + BladeAntlrFormatterLexer lexer = new BladeAntlrFormatterLexer(stream); + CommonTokenStream tokens = new CommonTokenStream(lexer); + tokens.fill(); + return tokens; + } +} diff --git a/php/php.editor/nbproject/project.xml b/php/php.editor/nbproject/project.xml index 55533801e57d..21a112701164 100644 --- a/php/php.editor/nbproject/project.xml +++ b/php/php.editor/nbproject/project.xml @@ -601,9 +601,11 @@ org.cakephp.netbeans org.nbphpcouncil.modules.php.yii org.netbeans.modules.php.dbgp + org.netbeans.modules.php.blade org.netbeans.modules.php.nette org.netbeans.modules.php.prado org.netbeans.modules.php.refactoring + org.netbeans.modules.php.laravel org.netbeans.modules.php.smarty org.netbeans.modules.php.symfony org.netbeans.modules.php.zend From a0532568ad566d8c9e4b4ccae71cf7e78658503d Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Wed, 31 Jul 2024 07:36:23 +0300 Subject: [PATCH 02/43] feedback resolve: license header, tab -> whitespace on project.xml, // NOI18N string tag --- php/php.blade/manifest.mf | 2 +- php/php.blade/nbproject/project.xml | 33 +---------- .../php/blade/editor/BladeBracesMatcher.java | 10 ++-- .../completion/PhpCodeCompletionService.java | 18 ++++++ .../BladeHighlightsContainer.java | 18 ++++++ .../BladeHighlightsLayerFactory.java | 18 ++++++ .../editor/hints/BladeHintsProvider.java | 1 - .../php/blade/resources/Bundle.properties | 16 ++++++ .../modules/php/blade/resources/layer.xml | 20 +++++++ .../php/blade/resources/mime-resolver.xml | 20 +++++++ .../blade/syntax/BladeDirectivesUtils.java | 20 ++++--- .../formatter/BladeAntlrFormatterLexer.g4 | 38 ++++++++++++- .../formatter/BladeAntlrFormatterParser.g4 | 20 ++++++- .../syntax/antlr4/formatter/LexerAdaptor.java | 20 ++++++- .../antlr4/v10/BladeAntlrColoringLexer.g4 | 36 ++++++++++++ .../syntax/antlr4/v10/BladeAntlrLexer.g4 | 39 ++++++++++++- .../syntax/antlr4/v10/BladeAntlrParser.g4 | 55 ++++++++++++++++--- .../syntax/antlr4/v10/BladeAntlrUtils.java | 19 ++++++- .../antlr4/v10/BladeColoringCommonLexer.g4 | 18 ++++++ .../syntax/antlr4/v10/BladeCommonLexer.g4 | 18 ++++++ .../antlr4/v10/ColoringLexerAdaptor.java | 19 ++++++- .../blade/syntax/antlr4/v10/LexerAdaptor.java | 19 ++++++- .../blade/ui/options/BladeOptionsPanel.java | 17 +++++- .../options/BladeOptionsPanelController.java | 17 +++++- .../php/blade/ui/options/Bundle.properties | 17 +++++- .../BladeAntlrColoringLexerTestBase.java | 18 ++++++ .../antlr4/BladeAntlrLexerTestBase.java | 18 ++++++ .../antlr4/BladeAntlrParserTestBase.java | 18 ++++++ .../antlr4/BladeAntrlColoringLexerTest.java | 18 ++++++ .../syntax/antlr4/BladeAntrlLexerTest.java | 18 ++++++ .../syntax/antlr4/BladeAntrlParserTest.java | 18 ++++++ .../blade/syntax/antlr4/BladeBaseTest.java | 18 ++++++ .../php/blade/syntax/antlr4/BladeUtils.java | 18 ++++++ php/php.editor/nbproject/project.xml | 3 +- 34 files changed, 604 insertions(+), 71 deletions(-) diff --git a/php/php.blade/manifest.mf b/php/php.blade/manifest.mf index 61a6406d6cd8..7340e66f38d2 100644 --- a/php/php.blade/manifest.mf +++ b/php/php.blade/manifest.mf @@ -3,5 +3,5 @@ AutoUpdate-Show-In-Client: true OpenIDE-Module: org.netbeans.modules.php.blade/1 OpenIDE-Module-Layer: org/netbeans/modules/php/blade/resources/layer.xml OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/php/blade/resources/Bundle.properties -OpenIDE-Module-Specification-Version: 1.00 +OpenIDE-Module-Specification-Version: 1.0.0 diff --git a/php/php.blade/nbproject/project.xml b/php/php.blade/nbproject/project.xml index 5192db4365eb..68d3e31e54b9 100644 --- a/php/php.blade/nbproject/project.xml +++ b/php/php.blade/nbproject/project.xml @@ -409,38 +409,7 @@ - - org.netbeans.modules.php.blade.csl.elements - org.netbeans.modules.php.blade.editor - org.netbeans.modules.php.blade.editor.actions - org.netbeans.modules.php.blade.editor.cache - org.netbeans.modules.php.blade.editor.completion - org.netbeans.modules.php.blade.editor.components - org.netbeans.modules.php.blade.editor.components.annotation - org.netbeans.modules.php.blade.editor.declaration - org.netbeans.modules.php.blade.editor.directives - org.netbeans.modules.php.blade.editor.embedding - org.netbeans.modules.php.blade.editor.format - org.netbeans.modules.php.blade.editor.highlighting - org.netbeans.modules.php.blade.editor.hints - org.netbeans.modules.php.blade.editor.indexing - org.netbeans.modules.php.blade.editor.lexer - org.netbeans.modules.php.blade.editor.navigator - org.netbeans.modules.php.blade.editor.parser - org.netbeans.modules.php.blade.editor.path - org.netbeans.modules.php.blade.editor.preferences - org.netbeans.modules.php.blade.editor.refactoring - org.netbeans.modules.php.blade.editor.tools - org.netbeans.modules.php.blade.editor.typinghooks - org.netbeans.modules.php.blade.editor.ui.customizer - org.netbeans.modules.php.blade.editor.ui.wizard - org.netbeans.modules.php.blade.project - org.netbeans.modules.php.blade.syntax - org.netbeans.modules.php.blade.syntax.annotation - org.netbeans.modules.php.blade.syntax.antlr4.formatter - org.netbeans.modules.php.blade.syntax.antlr4.v10 - org.netbeans.modules.php.blade.syntax.antlr4.v10.compiler - + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java index cc1db9895a4d..3ba5e6a1f16f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -77,9 +77,10 @@ public int[] findOrigin() throws InterruptedException, BadLocationException { String tokenText = originToken.getText(); - if (!tokenText.startsWith("@") - && !tokenText.startsWith("{") - && !tokenText.endsWith("}")) { + if (!tokenText.startsWith("@") // NOI18N + && !tokenText.startsWith("{") // NOI18N + && !tokenText.endsWith("}")) // NOI18N + { return result; } @@ -146,7 +147,8 @@ public BraceDirectionType findBraceDirectionType(String tokenText, Token token) return BraceDirectionType.CURLY_START_TO_END; } - if (tokenText.startsWith("@end") || tokenText.equals("@show")) { + if (tokenText.startsWith(BladeDirectivesUtils.END_DIRECTIVE_PREFIX) || + tokenText.equals(BladeDirectivesUtils.DIRECTIVE_SHOW)) { return BraceDirectionType.END_TO_START; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java index c8458a073ba0..ac8239181495 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.editor.completion; import java.util.ArrayList; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsContainer.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsContainer.java index 3f8640b1b1db..67cda30fe116 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsContainer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsContainer.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.editor.highlighting; import javax.swing.text.AbstractDocument; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsLayerFactory.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsLayerFactory.java index b81d5b06d98f..3752ee15ad56 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsLayerFactory.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/highlighting/BladeHighlightsLayerFactory.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.editor.highlighting; import javax.swing.text.AbstractDocument; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java index e3e1117c2e9f..52767eb34478 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java @@ -22,7 +22,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import javax.swing.text.BadLocationException; import org.netbeans.api.editor.document.EditorDocumentUtils; import org.netbeans.api.project.Project; import org.netbeans.modules.csl.api.Error; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/Bundle.properties b/php/php.blade/src/org/netbeans/modules/php/blade/resources/Bundle.properties index f00205e51804..21a228e9af98 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/resources/Bundle.properties +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/Bundle.properties @@ -1,3 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. OpenIDE-Module-Display-Category=PHP OpenIDE-Module-Long-Description=\ Support for Blade template syntax for PHP.\n\ diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/layer.xml b/php/php.blade/src/org/netbeans/modules/php/blade/resources/layer.xml index b6c971c83ad9..f775d62fc08c 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/resources/layer.xml +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/layer.xml @@ -1,4 +1,24 @@ + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/mime-resolver.xml b/php/php.blade/src/org/netbeans/modules/php/blade/resources/mime-resolver.xml index d0e7152241f8..65f2c52db668 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/resources/mime-resolver.xml +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/mime-resolver.xml @@ -1,6 +1,26 @@ + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java index 7886b57b7f4b..b46c3c1a4f78 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java @@ -25,11 +25,17 @@ * * @author bhaidu */ -public class BladeDirectivesUtils { +public final class BladeDirectivesUtils { + public static final String END_DIRECTIVE_PREFIX = "@end"; // NOI18N + public static final String DIRECTIVE_SECTION = "@section"; // NOI18N + public static final String DIRECTIVE_SHOW = "@show"; // NOI18N + public static final String DIRECTIVE_STOP = "@stop"; // NOI18N + public static final String DIRECTIVE_APPEND = "@append"; // NOI18N + public static String[] directiveStart2EndPair(String directive){ - if (directive.equals("@section")){ - return new String[]{"@endsection", "@show", "@stop", "@append"}; + if (directive.equals(DIRECTIVE_SECTION)){ + return new String[]{"@endsection", DIRECTIVE_SHOW, DIRECTIVE_STOP, DIRECTIVE_APPEND}; } DirectivesList listClass = new DirectivesList(); for (Directive directiveEl : listClass.getDirectives()){ @@ -50,10 +56,10 @@ public static String[] directiveEnd2StartPair(String directive){ case "@endif": return new String[]{"@if", "@hasSection", "@sectionMissing"}; case "@endsection": - case "@stop": - case "@append": - case "@show": - return new String[]{"@section"}; + case DIRECTIVE_APPEND: + case DIRECTIVE_STOP: + case DIRECTIVE_SHOW: + return new String[]{DIRECTIVE_SECTION}; } DirectivesList listClass = new DirectivesList(); for (Directive directiveEl : listClass.getDirectives()){ diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.g4 index b2950e97c9e6..f52cc8168ef5 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.g4 @@ -1,7 +1,43 @@ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ lexer grammar BladeAntlrFormatterLexer; @header{ - package org.netbeans.modules.php.blade.syntax.antlr4.formatter; + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax.antlr4.formatter; } options { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.g4 index 7de7b9840ded..b915b9c25d0b 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.g4 @@ -1,7 +1,25 @@ parser grammar BladeAntlrFormatterParser; @header{ - package org.netbeans.modules.php.blade.syntax.antlr4.formatter; + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax.antlr4.formatter; } options { tokenVocab = BladeAntlrFormatterLexer; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/LexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/LexerAdaptor.java index a923d32b2c8c..36923de2fb18 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/LexerAdaptor.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/LexerAdaptor.java @@ -1,9 +1,23 @@ -/* -Licensed to the Apache Software Foundation (ASF) + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ package org.netbeans.modules.php.blade.syntax.antlr4.formatter; -import org.netbeans.modules.php.blade.syntax.antlr4.v10.*; import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.Token; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 index 27a260f73fa7..0955308d73e5 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 @@ -1,7 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ lexer grammar BladeAntlrColoringLexer; import BladeColoringCommonLexer; @header{ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4.v10; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 index a88de8e22777..2a9635e5c4df 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 @@ -1,8 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ lexer grammar BladeAntlrLexer; import BladeCommonLexer; @header{ - package org.netbeans.modules.php.blade.syntax.antlr4.v10; + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.netbeans.modules.php.blade.syntax.antlr4.v10; } options { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 index d3121117c97a..6e285b0d9312 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 @@ -1,15 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ parser grammar BladeAntlrParser; @header{ - /** - * Parser generated for netbeans blade editor - * Some elements have been simplified to optimize parser speed - * For example - * - switch statement have a loos validation - * - generic block statement "@isset" | "@unless" are grouped togehter - * - the start match and end match will be checked in the parser - */ - package org.netbeans.modules.php.blade.syntax.antlr4.v10; + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +/** + * Parser generated for netbeans blade editor + * Some elements have been simplified to optimize parser speed + * For example + * - switch statement have a loos validation + * - generic block statement "@isset" | "@unless" are grouped togehter + * - the start match and end match will be checked in the parser + */ } @parser::members {public static int bladeVersion = 10;} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java index e0cbcd1ab281..47a886fa710f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java @@ -1,5 +1,20 @@ -/* -Licensed to the Apache Software Foundation (ASF) + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ package org.netbeans.modules.php.blade.syntax.antlr4.v10; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 index f79431ab19e2..5fe43ce485d2 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 @@ -1,3 +1,21 @@ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ lexer grammar BladeCommonLexer; tokens { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 index 853121caac06..e54c30072a04 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 @@ -1,3 +1,21 @@ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ lexer grammar BladeCommonLexer; tokens { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java index 9700d68dea3c..8dde751fa163 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java @@ -1,5 +1,20 @@ -/* -Licensed to the Apache Software Foundation (ASF) + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ package org.netbeans.modules.php.blade.syntax.antlr4.v10; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java index c733cfe0e7c0..45188124859c 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java @@ -1,5 +1,20 @@ -/* -Licensed to the Apache Software Foundation (ASF) + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ package org.netbeans.modules.php.blade.syntax.antlr4.v10; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.java b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.java index 7b9c05f95fa4..ca6bbd80d2da 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.java @@ -1,5 +1,20 @@ /* -Licensed to the Apache Software Foundation (ASF) + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ package org.netbeans.modules.php.blade.ui.options; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java index 772608815ff8..8b6edf154758 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java @@ -1,5 +1,20 @@ /* -Licensed to the Apache Software Foundation (ASF) + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ package org.netbeans.modules.php.blade.ui.options; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/Bundle.properties b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/Bundle.properties index 22a91f094ade..0094b70d270d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/Bundle.properties +++ b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/Bundle.properties @@ -1,3 +1,18 @@ - +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. BladeOptionsPanel.jLabel1.text=Blade BladeOptionsPanel.auto_tag_completion.text=Auto tag completion ("{{ }}", "{!! !!}", "{{-- --}}") diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java index c5f3fb680ddd..0b99deee6f93 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4; import java.io.ByteArrayInputStream; diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java index f23bc0f0f853..bdef2ab6bb9b 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4; import java.io.File; diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java index 83f87733ebf6..13923a4bf3f6 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4; import java.io.File; diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java index c05053ebf87b..885de18ce54f 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4; import org.junit.Test; diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java index 2745fbca6681..4ad3b7ed21c0 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4; import org.junit.Test; diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java index 9c7ee6071d11..1b9e8a885891 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4; import org.junit.Test; diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java index 28ce701c61e1..0cbd29122d83 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4; import java.io.File; diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java index fb495a7370ff..a33a082e1d53 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4; import java.io.BufferedReader; diff --git a/php/php.editor/nbproject/project.xml b/php/php.editor/nbproject/project.xml index 21a112701164..5de0212dd9a1 100644 --- a/php/php.editor/nbproject/project.xml +++ b/php/php.editor/nbproject/project.xml @@ -601,11 +601,10 @@ org.cakephp.netbeans org.nbphpcouncil.modules.php.yii org.netbeans.modules.php.dbgp - org.netbeans.modules.php.blade + org.netbeans.modules.php.blade org.netbeans.modules.php.nette org.netbeans.modules.php.prado org.netbeans.modules.php.refactoring - org.netbeans.modules.php.laravel org.netbeans.modules.php.smarty org.netbeans.modules.php.symfony org.netbeans.modules.php.zend From 77ea0a99a40c5c47b0c6ec6d91adbf1924667666 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Sun, 4 Aug 2024 10:15:32 +0300 Subject: [PATCH 03/43] image license, use a fallback blade icon, license on generated lexer, parser files, // NOI18N comments --- php/php.blade/licenseinfo.xml | 45 ++++++++++++++++++ .../php/blade/csl/elements/NamedElement.java | 2 - .../csl/elements/PhpFunctionElement.java | 2 +- .../php/blade/editor/BladeBracesMatcher.java | 3 +- .../blade/editor/BladeDeclarationFinder.java | 19 ++++---- .../php/blade/editor/EditorStringUtils.java | 32 +++++++++---- .../blade/editor/HyperlinkProviderImpl.java | 18 +++---- .../php/blade/editor/ResourceUtilities.java | 8 +++- .../editor/actions/AntlrDebugAction.java | 2 +- .../php/blade/editor/actions/FindUsage.java | 2 +- .../php/blade/editor/cache/QueryCache.java | 6 +-- .../completion/BladeCompletionHandler.java | 7 +-- .../completion/BladeCompletionItem.java | 18 +++---- .../completion/BladeCompletionProposal.java | 6 +-- .../completion/BladeCompletionProvider.java | 4 +- .../BladePhpCompletionProvider.java | 14 +++--- .../completion/PhpCodeCompletionService.java | 5 +- .../AttributeCompletionService.java | 6 +-- .../ComponentsCompletionService.java | 14 +++--- .../components/annotation/Namespace.java | 2 +- .../modules/php/blade/resources/icon.png | Bin 973 -> 3207 bytes .../php/blade/resources/icons/blade_file.png | Bin 0 -> 3207 bytes .../php/blade/resources/icons/file.png | Bin 973 -> 0 bytes .../blade/resources/icons/laravel_badge.png | Bin 723 -> 0 bytes .../modules/php/blade/syntax/StringUtils.java | 3 +- .../blade/syntax/annotation/Directive.java | 18 +++++++ .../syntax/annotation/DirectiveRegister.java | 18 +++++++ .../php/blade/syntax/annotation/Tag.java | 18 +++++++ .../blade/syntax/annotation/TagRegister.java | 18 +++++++ .../formatter/BladeAntlrFormatterLexer.g4 | 2 +- .../formatter/BladeAntlrFormatterLexer.java | 20 +++++++- .../formatter/BladeAntlrFormatterParser.java | 20 +++++++- ...BladeAntlrFormatterParserBaseListener.java | 20 +++++++- .../BladeAntlrFormatterParserListener.java | 20 +++++++- .../antlr4/v10/BladeAntlrColoringLexer.java | 18 +++++++ .../syntax/antlr4/v10/BladeAntlrLexer.java | 21 +++++++- .../syntax/antlr4/v10/BladeAntlrParser.java | 37 ++++++++++---- .../v10/BladeAntlrParserBaseListener.java | 37 ++++++++++---- .../antlr4/v10/BladeAntlrParserListener.java | 37 ++++++++++---- 39 files changed, 411 insertions(+), 111 deletions(-) create mode 100644 php/php.blade/licenseinfo.xml create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/blade_file.png delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/file.png delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/laravel_badge.png diff --git a/php/php.blade/licenseinfo.xml b/php/php.blade/licenseinfo.xml new file mode 100644 index 000000000000..68c1a44517b8 --- /dev/null +++ b/php/php.blade/licenseinfo.xml @@ -0,0 +1,45 @@ + + + + + src/org/netbeans/modules/php/blade/resources/highlightBlade.blade.php + + + + + tools/skeleton.netbeans + src/org/netbeans/modules/php/blade/resources/icon.png + src/org/netbeans/modules/php/blade/resources/icons/at.png + src/org/netbeans/modules/php/blade/resources/icons/at2.png + src/org/netbeans/modules/php/blade/resources/icons/at4.png + src/org/netbeans/modules/php/blade/resources/icons/blade_file.png + src/org/netbeans/modules/php/blade/resources/icons/layout.png + + + + + + \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java index 486dfac11b81..bd5e1820a1bc 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java @@ -42,14 +42,12 @@ public class NamedElement implements ElementHandle { protected final ElementType type; public NamedElement(String name, FileObject file) { - //we can add a file object from element this.name = name; this.file = file; this.type = ElementType.NA; } public NamedElement(String name, FileObject file, ElementType type) { - //we can add a file object from element this.name = name; this.file = file; this.type = type; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java index 23ee1ff1eaf4..f4d120fc59ea 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java @@ -28,8 +28,8 @@ */ public class PhpFunctionElement extends NamedElement { - public final List params; public final String namespace; + private final List params; public PhpFunctionElement(String name, FileObject file, ElementType type, diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java index 3ba5e6a1f16f..6bd9177cb234 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -233,7 +233,8 @@ public int[] findDirectiveEnd(String directive) { } public int[] findCustomDirectiveEnd(String directive) { - String[] pair = new String[]{"@end" + directive.substring(1)}; + String endPrefix = "@end"; // NOI18N + String[] pair = new String[]{endPrefix + directive.substring(1)}; List stopDirectives = Arrays.asList(pair); List startDirectiveForBalance = Arrays.asList(new String[]{directive}); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java index 8b505f0c8336..d5c0853524c8 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java @@ -292,9 +292,8 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { String namespace = reference.namespace; if (namespace != null && reference.namespace.length() > 2) { - int subOffset = reference.namespace.startsWith("\\") ? 1 : 0; indexClassResults = PhpIndexUtils.queryExactNamespaceClasses(reference.identifier, - reference.namespace.substring(subOffset, reference.namespace.length() - 1), + EditorStringUtils.trimNamespace(namespace), sourceFolder ); } else { @@ -315,10 +314,9 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { return location; } String queryNamespace = reference.namespace; + if (queryNamespace != null && queryNamespace.length() > 2) { - int subOffset = queryNamespace.startsWith("\\") ? 1 : 0; - int endOffset = queryNamespace.endsWith("\\") ? queryNamespace.length() - 1 : queryNamespace.length(); - queryNamespace = queryNamespace.substring(subOffset, endOffset); + queryNamespace = EditorStringUtils.trimNamespace(queryNamespace); } else { queryNamespace = null; } @@ -334,7 +332,9 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { indexResult.getClassNamespace(), indexResult.getParams() ); - DeclarationLocation functionLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); + DeclarationLocation functionLocation = new DeclarationFinder.DeclarationLocation( + indexResult.declarationFile, + indexResult.getStartOffset(), resultHandle); if (location.equals(DeclarationLocation.NONE)) { location = functionLocation; } @@ -376,10 +376,8 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { case PHP_NAMESPACE_PATH_TYPE:{ Collection indexNamespaceResults; if (reference.namespace != null) { - int subOffset = reference.namespace.startsWith("\\") ? 1 : 0; - String namespacePath = reference.namespace.substring(subOffset); indexNamespaceResults = PhpIndexUtils.queryExactNamespaceClasses(reference.identifier, - namespacePath, + EditorStringUtils.trimNamespace(reference.namespace), sourceFolder ); for (PhpIndexResult indexResult : indexNamespaceResults) { @@ -395,7 +393,8 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { for (PhpIndexResult indexResult : indexNamespaceResults) { NamedElement resultHandle = new NamedElement(referenceIdentifier, indexResult.declarationFile, ElementType.PHP_NAMESPACE); - DeclarationLocation constantLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); + DeclarationLocation constantLocation = new DeclarationFinder.DeclarationLocation( + indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); if (location.equals(DeclarationLocation.NONE)) { location = constantLocation; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java index dde99d415548..9bb9086e7e43 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java @@ -25,11 +25,16 @@ * * @author bhaidu */ -public class EditorStringUtils { +public final class EditorStringUtils { + + public static final String NAMESPACE_SEPARATOR = "\\"; // NOI18N + + private EditorStringUtils() { + } public static String implode(Collection items, String delimiter) { - Parameters.notNull("items", items); - Parameters.notNull("delimiter", delimiter); + Parameters.notNull("items", items); // NOI18N + Parameters.notNull("delimiter", delimiter); // NOI18N if (items.isEmpty()) { return ""; // NOI18N @@ -46,19 +51,26 @@ public static String implode(Collection items, String delimiter) { } return buffer.toString(); } - - public static boolean isQuotedString(String text){ - if (text.length() < 2){ + + public static boolean isQuotedString(String text) { + if (text.length() < 2) { return false; } - return (text.startsWith("'") && text.endsWith("'")) + return (text.startsWith("'") && text.endsWith("'")) || (text.startsWith("\"") && text.endsWith("\"")); } - public static String stripSurroundingQuotes(String text){ - if (!isQuotedString(text)){ + public static String stripSurroundingQuotes(String text) { + if (!isQuotedString(text)) { return text; } - return text.substring(1, text.length()-1); + return text.substring(1, text.length() - 1); + } + + public static String trimNamespace(String namespace) { + assert namespace.length() > 2; + int subOffset = namespace.startsWith(NAMESPACE_SEPARATOR) ? 1 : 0; + int endOffset = namespace.endsWith(NAMESPACE_SEPARATOR) ? 1 : 0; + return namespace.substring(subOffset, namespace.length() - endOffset); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java index 2622a72cd93d..045d0a00b458 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java @@ -51,12 +51,12 @@ @MimeRegistration(mimeType = "text/x-php5", service = HyperlinkProviderExt.class) public class HyperlinkProviderImpl implements HyperlinkProviderExt { - String methodName; - String identifiableText; - String tooltipText = ""; - FileObject goToFile; - int goToOffset = 0; - int triggeredEvent = 0; + private String methodName; + private String identifiableText; + private String tooltipText = ""; + private FileObject goToFile; + private int goToOffset = 0; + private int triggeredEvent = 0; public enum DeclarationType { VIEW_PATH; @@ -159,9 +159,9 @@ public void performClickAction(Document doc, int offset, HyperlinkType type) { switch (type) { case GO_TO_DECLARATION: switch (methodName) { - case "view": - case "make": - case "render": + case "view": // NOI18N + case "make": // NOI18N + case "render": // NOI18N if (goToFile != null) { openDocument(goToFile, goToOffset); triggeredEvent++; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java index 3849adeacd71..b06046848da8 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java @@ -19,16 +19,22 @@ package org.netbeans.modules.php.blade.editor; import javax.swing.ImageIcon; +import org.netbeans.api.annotations.common.CheckForNull; import org.openide.util.ImageUtilities; /** * * @author bhaidu */ -public class ResourceUtilities { +public final class ResourceUtilities { public static final String ICON_BASE = "org/netbeans/modules/php/blade/resources/"; //NOI18N + + private ResourceUtilities(){ + + } + @CheckForNull public static ImageIcon loadResourceIcon(String path){ return ImageUtilities.loadImageIcon(ICON_BASE + path, false); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/AntlrDebugAction.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/AntlrDebugAction.java index d17b3f7ac7ee..55e012d7c437 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/AntlrDebugAction.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/AntlrDebugAction.java @@ -48,7 +48,7 @@ @ActionRegistration(displayName = "Antlr Debug", lazy=false) public class AntlrDebugAction extends AbstractAction implements ContextAwareAction, Presenter.Popup { - Node node; + private Node node; public void setNode(Node node){ this.node = node; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/FindUsage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/FindUsage.java index b39b89ece9ec..62d1715761c8 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/FindUsage.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/FindUsage.java @@ -40,7 +40,7 @@ @ActionRegistration(displayName = "Template Usages") public class FindUsage extends AbstractAction implements ActionListener { - Node node; + private final Node node; public FindUsage(Node node) { this.node = node; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java index f4fab33a8324..e6568f2153b0 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java @@ -30,12 +30,12 @@ * * @author bogdan */ -public class QueryCache { +public final class QueryCache { public static final Long DEFAULT_CACHE_TIMEOUT = 60000L; - protected Map> cacheMap; - protected Long cacheTimeout; + private Map> cacheMap; + private Long cacheTimeout; //private static final Map QUERY_SUPPORT_INDEX = new WeakHashMap<>(); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java index 474342ee41e9..84f50ae68c4f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java @@ -105,7 +105,8 @@ public CodeCompletionResult complete(CodeCompletionContext completionContext) { String tokenText = currentToken.getText(); FileObject fo = completionContext.getParserResult().getSnapshot().getSource().getFileObject(); //D_UNKNOWN_ATTR_ENC hack to fix completion not triggered in html embedded text - if (tokenText.startsWith("@") && currentToken.getType() != D_UNKNOWN_ATTR_ENC) { + if (tokenText.startsWith("@") // NOI18N + && currentToken.getType() != D_UNKNOWN_ATTR_ENC) { completeDirectives(completionProposals, completionContext, fo, currentToken); } else { if (prefix.length() == 1) { @@ -174,7 +175,7 @@ private void completeScopedVariables(final List completionPr request.carretOffset = completionContext.getCaretOffset(); request.prefix = variablePrefix; if ("$loop".startsWith(variablePrefix)) { - String variableName = "$loop"; + String variableName = "$loop"; // NOI18N NamedElement variableElement = new NamedElement(variableName, fo, ElementType.VARIABLE); completionProposals.add(new BladeCompletionProposal.BladeVariableItem(variableElement, request, variableName)); } @@ -276,7 +277,7 @@ public CodeCompletionHandler.QueryType getAutoQuery(JTextComponent component, St return CodeCompletionHandler.QueryType.NONE; } - if (typedText.startsWith("@")) { + if (typedText.startsWith("@")) { // NOI18N return CodeCompletionHandler.QueryType.ALL_COMPLETION; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java index 563f0a23194c..90fd15cb90a7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java @@ -245,7 +245,7 @@ protected String getRightHtmlText() { @Override protected ImageIcon getIcon() { - String path = ResourceUtilities.ICON_BASE + "icons/at.png";//NOI18N + String path = ResourceUtilities.ICON_BASE + "icons/at.png"; //NOI18N return ImageUtilities.loadImageIcon(path, false); } } @@ -259,11 +259,11 @@ public DirectiveWithArg(String directive, int substitutionOffset, @Override protected String getSubstituteText() { - String template = getItemText() + "($$${arg})"; + String template = getItemText() + "($$${arg})"; // NOI18N switch (text){ - case "@include": - case "@extends": - template = getItemText() + "('${path}')"; + case "@include": // NOI18N + case "@extends": // NOI18N + template = getItemText() + "('${path}')"; // NOI18N break; } return template; @@ -332,11 +332,11 @@ public BlockDirectiveWithArg(String directive, String endTag, int substitutionOf @Override protected String getSubstituteText() { - String template = getItemText() + "($$${arg})\n\n${selection}${cursor}\n" + endTag; + String template = getItemText() + "($$${arg})\n\n${selection}${cursor}\n" + endTag; // NOI18N switch (text){ case "@foreach": - template = getItemText() + "($$${array} as $$${item})\n${selection}${cursor}\n" + endTag; + template = getItemText() + "($$${array} as $$${item})\n${selection}${cursor}\n" + endTag; // NOI18N break; } @@ -365,7 +365,7 @@ public ViewPath(String name, int substitutionOffset, @Override protected ImageIcon getIcon() { - String path = ResourceUtilities.ICON_BASE + "icons/file.png"; + String path = ResourceUtilities.ICON_BASE + "icons/blade_file.png"; // NOI18N if (isFolder) { path = "org/openide/loaders/defaultFolder.gif";//NOI18N } @@ -374,7 +374,7 @@ protected ImageIcon getIcon() { @Override protected String getRightHtmlText() { - int viewsPos = filePath.indexOf("/views/"); + int viewsPos = filePath.indexOf("/views/"); // NOI18N return filePath.substring(viewsPos, filePath.length()); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java index 138798b37af0..3cf295170969 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java @@ -453,11 +453,11 @@ public String getCustomInsertTemplate() { String template = getName() + "($$${arg})\n ${cursor}\n" + directive.endtag(); switch (getName()) { - case "@foreach": + case "@foreach": // NOI18N template = getName() + "($$${array} as $$${item})\n ${selection}${cursor}\n" + directive.endtag(); break; - case "@section": - case "@session": + case "@section": // NOI18N + case "@session": // NOI18N template = getName() + "('${id}')\n ${cursor}\n" + directive.endtag(); break; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java index 89700f37392d..c7949012c364 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java @@ -171,7 +171,7 @@ protected void query(CompletionResultSet resultSet, Document doc, int caretOffse if ("livewire".startsWith(nText)) { //quick implementation //?? - addHtmlTagCompletionItem(nText, "livewire", "livewire", caretOffset, resultSet); + addHtmlTagCompletionItem(nText, "livewire", "livewire", caretOffset, resultSet); // NOI18N } break; case HTML_COMPONENT_PREFIX: @@ -299,7 +299,7 @@ private static String getReferenceIcon(CompletionType type) { case YIELD_ID: return ResourceUtilities.ICON_BASE + "icons/layout.png"; //NOI18N } - return ResourceUtilities.ICON_BASE + "icons/at.png"; + return ResourceUtilities.ICON_BASE + "icons/at.png"; // NOI18N } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java index 23c541dc059c..53faeeb1d8d4 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java @@ -58,14 +58,14 @@ * @author bhaidu */ @MimeRegistrations(value = { - @MimeRegistration(mimeType = "text/x-php5", service = CompletionProvider.class, position = 102), // @MimeRegistration(mimeType = "text/x-blade", service = CompletionProvider.class, position = 105), + @MimeRegistration(mimeType = "text/x-php5", service = CompletionProvider.class, position = 102), } ) public class BladePhpCompletionProvider implements CompletionProvider { private static final Logger LOGGER = Logger.getLogger(BladePhpCompletionProvider.class.getName()); - public static final String JS_ASSET_FOLDER = "resources/js"; - public static final String CSS_ASSET_FOLDER = "resources/css"; + public static final String JS_ASSET_FOLDER = "resources/js"; // NOI18N + public static final String CSS_ASSET_FOLDER = "resources/css"; // NOI18N public enum CompletionType { BLADE_PATH, @@ -342,7 +342,7 @@ private void addYieldIdCompletionItem(String identifier, FileObject fo, int caretOffset, CompletionResultSet resultSet) { String filePath = fo.getPath(); - int viewsPos = filePath.indexOf("/views/"); + int viewsPos = filePath.indexOf("/views/"); // NOI18N CompletionItem item = CompletionUtilities.newCompletionItemBuilder(identifier) .iconResource(getReferenceIcon(CompletionType.YIELD_ID)) @@ -370,11 +370,11 @@ private static String getReferenceIcon(CompletionType type) { switch (type) { case FOLDER: - return "org/openide/loaders/defaultFolder.gif"; + return "org/openide/loaders/defaultFolder.gif"; // NOI18N case CSS_FILE: - return "org/netbeans/modules/css/visual/resources/style_sheet_16.png"; + return "org/netbeans/modules/css/visual/resources/style_sheet_16.png"; // NOI18N case JS_FILE: - return "org/netbeans/modules/javascript2/editor/resources/javascript.png"; + return "org/netbeans/modules/javascript2/editor/resources/javascript.png"; // NOI18N } return ResourceUtilities.ICON_BASE + "icons/layout.png"; //NOI18N diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java index ac8239181495..1d3c146ee7f1 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java @@ -32,6 +32,7 @@ import org.netbeans.modules.php.blade.csl.elements.ClassElement; import org.netbeans.modules.php.blade.csl.elements.ElementType; import org.netbeans.modules.php.blade.csl.elements.NamedElement; +import org.netbeans.modules.php.blade.editor.EditorStringUtils; import static org.netbeans.modules.php.blade.editor.completion.BladeCompletionHandler.completionRequest; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexFunctionResult; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; @@ -237,7 +238,7 @@ private static void completeNamespace(String prefix, int offset, final List completionProposals, FileObject fo) { - if (!prefix.startsWith("\\") && !Character.isUpperCase(prefix.charAt(0))) { + if (!prefix.startsWith(EditorStringUtils.NAMESPACE_SEPARATOR) && !Character.isUpperCase(prefix.charAt(0))) { //skip lowercase string from namespce search return; } @@ -247,7 +248,7 @@ private static void completeNamespace(String prefix, int offset, if (projectOwner == null) { return; } - int substringOffset = prefix.startsWith("\\") ? 1 : 0; + int substringOffset = prefix.startsWith(EditorStringUtils.NAMESPACE_SEPARATOR) ? 1 : 0; Collection indexClassResults = PhpIndexUtils.queryNamespace( projectOwner.getProjectDirectory(), prefix.substring(substringOffset) ); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java index 499042ed1753..a7e005c2d528 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java @@ -28,9 +28,9 @@ * @author bhaidu */ @AttributeRegister({ - @Attribute(name = "class"), - @Attribute(name = "id"), - @Attribute(name = "title"), + @Attribute(name = "class"), // NOI18N + @Attribute(name = "id"), // NOI18N + @Attribute(name = "title"), // NOI18N }) public class AttributeCompletionService { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java index 39ba9ef68b4d..09f460f93124 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java @@ -34,13 +34,13 @@ * @author bhaidu */ @NamespaceRegister({ - @Namespace(path = "App\\View\\Components", from_app=true, relativeFilePath="app/View/Components"), - @Namespace(path = "App\\Http\\Livewire", from_app=true, relativeFilePath="app/Http/Livewire"), - @Namespace(path = "App\\Livewire", from_app=true, relativeFilePath="app/Livewire"),//from 10 - @Namespace(path = "Illuminate\\Console\\View\\Components"), - @Namespace(path = "BladeUIKit\\Components\\Buttons", packageName="blade-ui-kit/blade-ui-kit"), - @Namespace(path = "BladeUIKit\\Components\\Layouts", packageName="blade-ui-kit/blade-ui-kit"), - @Namespace(path = "BladeUIKit\\Components\\Forms\\Inputs", packageName="blade-ui-kit/blade-ui-kit"), + @Namespace(path = "App\\View\\Components", from_app=true, relativeFilePath="app/View/Components"), // NOI18N + @Namespace(path = "App\\Http\\Livewire", from_app=true, relativeFilePath="app/Http/Livewire"), // NOI18N + @Namespace(path = "App\\Livewire", from_app=true, relativeFilePath="app/Livewire"), // NOI18N + @Namespace(path = "Illuminate\\Console\\View\\Components"), // NOI18N + @Namespace(path = "BladeUIKit\\Components\\Buttons", packageName="blade-ui-kit/blade-ui-kit"), // NOI18N + @Namespace(path = "BladeUIKit\\Components\\Layouts", packageName="blade-ui-kit/blade-ui-kit"), // NOI18N + @Namespace(path = "BladeUIKit\\Components\\Forms\\Inputs", packageName="blade-ui-kit/blade-ui-kit"), // NOI18N }) public class ComponentsCompletionService { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java index dff6931bb05a..7988f90d1aa9 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java @@ -25,7 +25,7 @@ public @interface Namespace { String path(); String relativeFilePath() default ""; - String packageName() default "blade"; + String packageName() default "blade"; // NOI18N //inside App folder boolean from_app() default false; boolean from_vendor() default true; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/icon.png b/php/php.blade/src/org/netbeans/modules/php/blade/resources/icon.png index 87ced4a74a8a75f28331705a6c368f8654294233..4e24f58cf55c5c83268b82e233a9162c452440a5 100644 GIT binary patch literal 3207 zcmV;240!X2P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00059Nkl$8pqpq= z5QkFg)PFie+u)FPC^!g(40UW*-xEWe`XUm1eMw*5I}Y-0^Wuxe9{BF%yWhRvIh=Eq zh!Dp7i`OTlD|uLgWjJ^1bfF;!EvN);6}K?FX{*t}OY&;$)|h z(U~;}0)G5Dj)mQ5(meJ!{OK?;K1Moqr9As|L7PR5d>^HV2heJH)Eh4KhD&aA6yNj8 z;oHQ6$CtFx#eq2trDA(zD23y?EU&%MXKl{|Kq*C{^RnOedm5cfB)FBmL96KkaQ;Fc zo23t0SDVuhCB3_^530Fg(!2XqbHf0{X|a57Fe^u$`^Qz_CbNv2Zd zYpoXHJ*Rf+l)AVYyWJ1Kr=3Q6eCqDEg_i|v+y1NkWHO0u+j<9h^86Ja%kPJPsx|@` txO`9kx6!5bB?Ux(c4>X-`dKIUdjKZ2B|HKh0MGyc002ovPDHLkV1i8F13v%& literal 973 zcmV;;12X)HP)EX>4Tx04R}tkv&MmKpe$iQ?()$2a8B?$WWauh>AK&6^me@v=v%)FuC+YXws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;qmz@Oi`@g@7;y(1mG}v_(bAarW+RVI`Pz| zrE}gV4zZG?5T6r|8gxP8N3P2*zi}=)Ebz>bkx9)Fhls^u8_R9XN`^{2NgPpBjq-)8 z%L?Z$&T6^Jn)l={4Cb}vG}mbkA&x~Pkc0>sRcxRP3sG7%QcR?1Kjz^NJN_iOWO8kQ zkz*besE`~#_#gc4)+|hnyGg+q(D`E9AHzUk7iiRM`}^3o8z+GO8Mx9~{z@H~`6Rv8 z(jrGd-!^b@-O}Ve;Bp5Te9|RDawI=Zp-=$c&*+sb!v+DNN+{ftykfE-YZh(VB zV5CUdYaZ|JZtv~iGtK^f0HlF(yVwbOAOHXW24YJ`L;xEA8vq-0Wtfow000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j&7A76>uO0pnBv00GHKL_t(I%Z<~`i;htk$MMg3 z<{6X4Fbgzl;%?G-$z94@-eQH!Mi^PxD6DAy4SP$OW`PaL!b?e!g|{)Gn`B10MHy2g zk~GH5v6%DJ-BW|JIi1sW{m!|**Y64t^Q;T|u^jJlEfnQP|FJ^Mvp)3THeO;a_TX74 z${W?-m}ea+b|e(#SE%CvMiCmKn1{VF&+dexoQ!$aicQ#zZ`dC5>@l9y@d}r)1AXZ{ zh+eeBJPYVY2hN6~{2cRa2~MH6o?aZo6)eJK!VIzT^ENER1a`+fdy4h=f}UEX#2Nfj z$*hz#jsd*G=>&QJpKAYr921WPvqE7QuQ8m2+vYn#}kJdc3~wRVki{lRJB!&L1|BcEASi}F@$w^ vi+c@l&Arw%aa}l+x^WX%Ls5R1%PfBY;t7whDaFmg00000NkvXXu0mjfnmD{Q diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/blade_file.png b/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/blade_file.png new file mode 100644 index 0000000000000000000000000000000000000000..4e24f58cf55c5c83268b82e233a9162c452440a5 GIT binary patch literal 3207 zcmV;240!X2P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00059Nkl$8pqpq= z5QkFg)PFie+u)FPC^!g(40UW*-xEWe`XUm1eMw*5I}Y-0^Wuxe9{BF%yWhRvIh=Eq zh!Dp7i`OTlD|uLgWjJ^1bfF;!EvN);6}K?FX{*t}OY&;$)|h z(U~;}0)G5Dj)mQ5(meJ!{OK?;K1Moqr9As|L7PR5d>^HV2heJH)Eh4KhD&aA6yNj8 z;oHQ6$CtFx#eq2trDA(zD23y?EU&%MXKl{|Kq*C{^RnOedm5cfB)FBmL96KkaQ;Fc zo23t0SDVuhCB3_^530Fg(!2XqbHf0{X|a57Fe^u$`^Qz_CbNv2Zd zYpoXHJ*Rf+l)AVYyWJ1Kr=3Q6eCqDEg_i|v+y1NkWHO0u+j<9h^86Ja%kPJPsx|@` txO`9kx6!5bB?Ux(c4>X-`dKIUdjKZ2B|HKh0MGyc002ovPDHLkV1i8F13v%& literal 0 HcmV?d00001 diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/file.png b/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/file.png deleted file mode 100644 index 87ced4a74a8a75f28331705a6c368f8654294233..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 973 zcmV;;12X)HP)EX>4Tx04R}tkv&MmKpe$iQ?()$2a8B?$WWauh>AK&6^me@v=v%)FuC+YXws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;qmz@Oi`@g@7;y(1mG}v_(bAarW+RVI`Pz| zrE}gV4zZG?5T6r|8gxP8N3P2*zi}=)Ebz>bkx9)Fhls^u8_R9XN`^{2NgPpBjq-)8 z%L?Z$&T6^Jn)l={4Cb}vG}mbkA&x~Pkc0>sRcxRP3sG7%QcR?1Kjz^NJN_iOWO8kQ zkz*besE`~#_#gc4)+|hnyGg+q(D`E9AHzUk7iiRM`}^3o8z+GO8Mx9~{z@H~`6Rv8 z(jrGd-!^b@-O}Ve;Bp5Te9|RDawI=Zp-=$c&*+sb!v+DNN+{ftykfE-YZh(VB zV5CUdYaZ|JZtv~iGtK^f0HlF(yVwbOAOHXW24YJ`L;xEA8vq-0Wtfow000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j&7A76>uO0pnBv00GHKL_t(I%Z<~`i;htk$MMg3 z<{6X4Fbgzl;%?G-$z94@-eQH!Mi^PxD6DAy4SP$OW`PaL!b?e!g|{)Gn`B10MHy2g zk~GH5v6%DJ-BW|JIi1sW{m!|**Y64t^Q;T|u^jJlEfnQP|FJ^Mvp)3THeO;a_TX74 z${W?-m}ea+b|e(#SE%CvMiCmKn1{VF&+dexoQ!$aicQ#zZ`dC5>@l9y@d}r)1AXZ{ zh+eeBJPYVY2hN6~{2cRa2~MH6o?aZo6)eJK!VIzT^ENER1a`+fdy4h=f}UEX#2Nfj z$*hz#jsd*G=>&QJpKAYr921WPvqE7QuQ8m2+vYn#}kJdc3~wRVki{lRJB!&L1|BcEASi}F@$w^ vi+c@l&Arw%aa}l+x^WX%Ls5R1%PfBY;t7whDaFmg00000NkvXXu0mjfnmD{Q diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/laravel_badge.png b/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/laravel_badge.png deleted file mode 100644 index fc7b7ccb1428036113de07951cbb9b8b27e86430..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 723 zcmV;^0xbQBP)EX>4Tx04UFukxM8&YTEi`ZIrZQ)+w*0}9RzBZHR zxZ-uic52o7xu<$z-I6msrF5Asj55XqljxYNvOSI+l84}JgZ2+AMf!YTOE2Qct1daj_g z?nA={oLv?)a~sY#q4^u93o(cLR@(rYca=WRGAdvt7010qNS#tmY4#WTe4#WYKD-Ig~000JJOGiWi z8vq*s8+2uukpKVy2XskIMF-{r8WspK$N}S20002eNkl-NgPj*&Vcs}GI?)k>oxek zAq2&?&)D4$OveyUz)j4M9rJL}(1X Date: Mon, 5 Aug 2024 06:58:28 +0300 Subject: [PATCH 04/43] remove laravel from friend package list, move icon path in ResourceUtilities, remove unused function, add better return values for queryUtils methods, refactor editorUtils, utils class adjusments --- php/php.api.framework/nbproject/project.xml | 1 - php/php.api.phpmodule/nbproject/project.xml | 1 - php/php.blade/nbproject/project.properties | 1 + .../php/blade/csl/elements/NamedElement.java | 2 +- .../php/blade/editor/BladeBracesMatcher.java | 28 +++--- .../blade/editor/BladeDeclarationFinder.java | 4 +- .../php/blade/editor/EditorStringUtils.java | 24 +---- .../modules/php/blade/editor/EditorUtils.java | 55 +++++++++++ .../blade/editor/HyperlinkProviderImpl.java | 4 +- .../php/blade/editor/ResourceUtilities.java | 11 +++ .../completion/BladeCompletionItem.java | 8 +- .../completion/BladeCompletionProposal.java | 2 +- .../completion/BladeCompletionProvider.java | 6 +- .../BladePhpCompletionProvider.java | 4 +- .../php/blade/editor/indexing/BladeIndex.java | 14 +++ .../blade/editor/indexing/PhpIndexUtils.java | 97 ++++++++++--------- .../php/blade/editor/indexing/QueryUtils.java | 33 +++---- .../blade/editor/lexer/BladeLexerUtils.java | 20 ++-- .../{EditorUtils.java => PHPLexerUtils.java} | 28 ++---- .../editor/navigator/BladeStructureItem.java | 4 +- .../php/blade/editor/parser/ParsingUtils.java | 23 +---- .../php/blade/editor/path/BladePathUtils.java | 54 ++++++----- .../preferences/GeneralPreferencesUtils.java | 7 +- .../php/blade/project/ProjectUtils.java | 14 ++- .../modules/php/blade/syntax/StringUtils.java | 6 +- .../syntax/antlr4/v10/BladeAntlrUtils.java | 16 +-- 26 files changed, 259 insertions(+), 208 deletions(-) create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorUtils.java rename php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/{EditorUtils.java => PHPLexerUtils.java} (69%) diff --git a/php/php.api.framework/nbproject/project.xml b/php/php.api.framework/nbproject/project.xml index 4cb2d522126e..4dcdf5329791 100644 --- a/php/php.api.framework/nbproject/project.xml +++ b/php/php.api.framework/nbproject/project.xml @@ -167,7 +167,6 @@ org.netbeans.modules.php.cake3 org.netbeans.modules.php.doctrine2 org.netbeans.modules.php.fuel - org.netbeans.modules.php.laravel org.netbeans.modules.php.nette2 org.netbeans.modules.php.project org.netbeans.modules.php.smarty diff --git a/php/php.api.phpmodule/nbproject/project.xml b/php/php.api.phpmodule/nbproject/project.xml index 06e9293ecbca..20b8466b0815 100644 --- a/php/php.api.phpmodule/nbproject/project.xml +++ b/php/php.api.phpmodule/nbproject/project.xml @@ -249,7 +249,6 @@ org.netbeans.modules.php.doctrine2 org.netbeans.modules.php.editor org.netbeans.modules.php.fuel - org.netbeans.modules.php.laravel org.netbeans.modules.php.nette org.netbeans.modules.php.nette.tester org.netbeans.modules.php.nette2 diff --git a/php/php.blade/nbproject/project.properties b/php/php.blade/nbproject/project.properties index a18d0ebbe0ed..d4476f1c745e 100644 --- a/php/php.blade/nbproject/project.properties +++ b/php/php.blade/nbproject/project.properties @@ -18,3 +18,4 @@ javac.source=1.8 javac.compilerargs=-Xlint -Xlint:-serial spec.version.base.fatal.warning=false +javac.release=17 diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java index bd5e1820a1bc..1660b48fffb5 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java @@ -70,7 +70,7 @@ public String getName() { @Override public String getIn() { - return ""; + return ""; // NOI18N } @Override diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java index 6bd9177cb234..995f7e3bcabe 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -99,36 +99,36 @@ public int[] findOrigin() throws InterruptedException, BadLocationException { @Override public int[] findMatches() throws InterruptedException, BadLocationException { - int[] result = null; if (originToken == null) { - return result; + return null; } String tokenText = originToken.getText(); switch (currentDirection) { - case CURLY_START_TO_END: + case CURLY_START_TO_END -> { return findCloseTag(); - case CURLY_END_TO_START: + } + case CURLY_END_TO_START -> { return findOpenTag(); - case START_TO_END: + } + case START_TO_END -> { return findDirectiveEnd(tokenText); - case CUSTOM_START_TO_END: + } + case CUSTOM_START_TO_END -> { return findCustomDirectiveEnd(tokenText); - case END_TO_START: + } + case END_TO_START -> { return findOriginForDirectiveEnd(tokenText); + } + default -> { return null;} } - - return result; } private static boolean shouldLookForBraceMatch(@NonNull Token currentToken) { switch (currentToken.getType()) { - case HTML: - case PHP_EXPRESSION: - case AT: - case BLADE_COMMENT: - case ERROR: + case HTML, PHP_EXPRESSION, AT, BLADE_COMMENT, ERROR -> { return false; + } } return true; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java index d5c0853524c8..a530258e7cd5 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java @@ -118,7 +118,7 @@ public OffsetRange getReferenceSpan(Document document, int caretOffset) { } if (nt.getType() == BL_PARAM_STRING || nt.getType() == EXPR_STRING) { - List tokensToMatch = BladeLexerUtils.tokensWithIdentifiableParam(); + List tokensToMatch = BladeLexerUtils.TOKENS_WITH_IDENTIFIABLE_PARAM; List tokensStop = Arrays.asList(new Integer[]{HTML}); org.antlr.v4.runtime.Token matchedToken = BladeAntlrUtils.findBackward(tokens, tokensToMatch, tokensStop); int offsetCorrection = caretOffset - lineOffset; @@ -248,7 +248,7 @@ public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) { case PUSH_IF: case PREPEND: String stackId = referenceIdentifier; - List stacks = QueryUtils.queryStacksReferences(stackId, currentFile); + List stacks = QueryUtils.findStacksReferences(stackId, currentFile); if (stacks == null) { return DeclarationLocation.NONE; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java index 9bb9086e7e43..3fde6c8b3ef9 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java @@ -32,32 +32,12 @@ public final class EditorStringUtils { private EditorStringUtils() { } - public static String implode(Collection items, String delimiter) { - Parameters.notNull("items", items); // NOI18N - Parameters.notNull("delimiter", delimiter); // NOI18N - - if (items.isEmpty()) { - return ""; // NOI18N - } - - StringBuilder buffer = new StringBuilder(200); - boolean first = true; - for (String s : items) { - if (!first) { - buffer.append(delimiter); - } - buffer.append(s); - first = false; - } - return buffer.toString(); - } - public static boolean isQuotedString(String text) { if (text.length() < 2) { return false; } - return (text.startsWith("'") && text.endsWith("'")) - || (text.startsWith("\"") && text.endsWith("\"")); + return (text.startsWith("'") && text.endsWith("'")) // NOI18N + || (text.startsWith("\"") && text.endsWith("\"")); // NOI18N } public static String stripSurroundingQuotes(String text) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorUtils.java new file mode 100644 index 000000000000..f504563d315b --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorUtils.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import javax.swing.text.Document; +import org.netbeans.api.annotations.common.CheckForNull; +import org.netbeans.api.project.Project; +import org.netbeans.modules.editor.NbEditorUtilities; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.openide.filesystems.FileObject; +import org.openide.loaders.DataObject; + +/** + * + * @author bogdan + */ +public final class EditorUtils { + + private EditorUtils() { + } + + @CheckForNull + public static FileObject getFileObjectFromDoc(Document doc) { + DataObject dObject = NbEditorUtilities.getDataObject(doc); + if (dObject != null) { + return dObject.getPrimaryFile().getParent(); + } + return null; + } + + @CheckForNull + public static Project getProjectOwner(Document doc) { + FileObject file = getFileObjectFromDoc(doc); + if (file == null) { + return null; + } + return ProjectUtils.getMainOwner(file); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java index 045d0a00b458..ac8c3f343cb7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java @@ -33,7 +33,7 @@ import org.netbeans.api.lexer.TokenSequence; import org.netbeans.api.project.Project; import org.netbeans.editor.BaseDocument; -import org.netbeans.modules.php.blade.editor.lexer.EditorUtils; +import org.netbeans.modules.php.blade.editor.lexer.PHPLexerUtils; import org.netbeans.modules.php.blade.editor.path.BladePathUtils; import org.netbeans.modules.php.blade.project.BladeProjectProperties; import org.netbeans.modules.php.editor.lexer.PHPTokenId; @@ -87,7 +87,7 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { BaseDocument baseDoc = (BaseDocument) doc; int lineStart = LineDocumentUtils.getLineStart(baseDoc, offset); - TokenSequence tokensq = EditorUtils.getTokenSequence(doc, offset); + TokenSequence tokensq = PHPLexerUtils.getTokenSequence(doc, offset); if (tokensq == null) { return null; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java index b06046848da8..67c5e8ee90dd 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java @@ -28,7 +28,13 @@ */ public final class ResourceUtilities { + public static final String FOLDER = "org/openide/loaders/defaultFolder.gif";//NOI18N public static final String ICON_BASE = "org/netbeans/modules/php/blade/resources/"; //NOI18N + public static final String DIRECTIVE_ICON = ICON_BASE + "icons/at.png"; //NOI18N + public static final String BLADE_VIEW = ICON_BASE + "icons/blade_file.png"; //NOI18N + public static final String LAYOUT_IDENTIFIER = ICON_BASE + "icons/layout.png"; //NOI18N + public static final String COMPONENT_TAG = "org/netbeans/modules/html/custom/resources/custom_html_element.png"; //NOI18N + private ResourceUtilities(){ @@ -38,4 +44,9 @@ private ResourceUtilities(){ public static ImageIcon loadResourceIcon(String path){ return ImageUtilities.loadImageIcon(ICON_BASE + path, false); } + + @CheckForNull + public static ImageIcon loadLayoutIcon(){ + return ImageUtilities.loadImageIcon(LAYOUT_IDENTIFIER, false); + } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java index 90fd15cb90a7..be17635232b7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java @@ -245,7 +245,7 @@ protected String getRightHtmlText() { @Override protected ImageIcon getIcon() { - String path = ResourceUtilities.ICON_BASE + "icons/at.png"; //NOI18N + String path = ResourceUtilities.DIRECTIVE_ICON; return ImageUtilities.loadImageIcon(path, false); } } @@ -312,7 +312,7 @@ protected String getRightHtmlText() { @Override protected ImageIcon getIcon() { - String path = ResourceUtilities.ICON_BASE + "icons/at.png";//NOI18N + String path = ResourceUtilities.DIRECTIVE_ICON; return ImageUtilities.loadImageIcon(path, false); } @@ -365,9 +365,9 @@ public ViewPath(String name, int substitutionOffset, @Override protected ImageIcon getIcon() { - String path = ResourceUtilities.ICON_BASE + "icons/blade_file.png"; // NOI18N + String path = ResourceUtilities.BLADE_VIEW; if (isFolder) { - path = "org/openide/loaders/defaultFolder.gif";//NOI18N + path = ResourceUtilities.FOLDER; } return ImageUtilities.loadImageIcon(path, false); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java index 3cf295170969..b4566b493a57 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java @@ -353,7 +353,7 @@ public DirectiveProposal(ElementHandle element, CompletionRequest request, Strin @Override public ImageIcon getIcon() { - String path = ResourceUtilities.ICON_BASE + "icons/at.png";//NOI18N + String path = ResourceUtilities.DIRECTIVE_ICON; return ImageUtilities.loadImageIcon(path, false); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java index c7949012c364..b76830d256f6 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java @@ -295,11 +295,11 @@ private void addComponentIdCompletionItem(PhpIndexResult indexReference, private static String getReferenceIcon(CompletionType type) { switch (type) { case HTML_COMPONENT_TAG: - return "org/netbeans/modules/html/custom/resources/custom_html_element.png"; //NOI18N + return ResourceUtilities.COMPONENT_TAG; case YIELD_ID: - return ResourceUtilities.ICON_BASE + "icons/layout.png"; //NOI18N + return ResourceUtilities.LAYOUT_IDENTIFIER; } - return ResourceUtilities.ICON_BASE + "icons/at.png"; // NOI18N + return ResourceUtilities.DIRECTIVE_ICON; } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java index 53faeeb1d8d4..92529fe16625 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java @@ -370,13 +370,13 @@ private static String getReferenceIcon(CompletionType type) { switch (type) { case FOLDER: - return "org/openide/loaders/defaultFolder.gif"; // NOI18N + return ResourceUtilities.FOLDER; // NOI18N case CSS_FILE: return "org/netbeans/modules/css/visual/resources/style_sheet_16.png"; // NOI18N case JS_FILE: return "org/netbeans/modules/javascript2/editor/resources/javascript.png"; // NOI18N } - return ResourceUtilities.ICON_BASE + "icons/layout.png"; //NOI18N + return ResourceUtilities.LAYOUT_IDENTIFIER; //NOI18N } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndex.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndex.java index d9db8d33a07f..4859e7f55b18 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndex.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndex.java @@ -179,6 +179,20 @@ public Reference createIndexReference(String value) { } ); } + + public List findStackIdIndexedReferences(String prefix) { + return findIndexedReferences(prefix, + BladeIndexer.STACK_ID, + new String[]{BladeIndexer.STACK_ID, BladeIndexer.STACK_REFERENCE}, + BladeIndexer.STACK_REFERENCE, + new IndexReferenceCallback() { + @Override + public Reference createIndexReference(String value) { + return BladeIndexer.extractStackDataFromIndex(value); + } + } + ); + } private List findIndexedReferences(String prefix, String indexKey, String[] valuesKeys, String valueKey, diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java index 9513b7f7da95..a363b5d8d009 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java @@ -41,13 +41,17 @@ * * @author bhaidu */ -public class PhpIndexUtils { +public final class PhpIndexUtils { private final static QueryCache> cache = new QueryCache(); private final static QueryCache> functionCache = new QueryCache(); private static final Map QUERY_SUPPORT_INSTANCES = new WeakHashMap<>(); + private PhpIndexUtils() { + + } + /** * class query without namespace * @@ -127,7 +131,7 @@ public static Collection queryNamespaceClassesName(String prefix } return results; } - + public static Collection queryExactNamespaceClasses(String identifier, String namespace, FileObject fo) { QuerySupport phpindex = QuerySupportFactory.get(fo); @@ -135,23 +139,23 @@ public static Collection queryExactNamespaceClasses(String ident try { Collection indexResults = phpindex.query( - PHPIndexer.FIELD_TOP_LEVEL, namespace.toLowerCase(), QuerySupport.Kind.EXACT, + PHPIndexer.FIELD_TOP_LEVEL, namespace.toLowerCase(), QuerySupport.Kind.EXACT, new String[]{ PHPIndexer.FIELD_NAMESPACE }); for (IndexResult indexResult : indexResults) { FileObject indexFile = indexResult.getFile(); - - if (!indexFile.getName().equals(identifier)){ + + if (!indexFile.getName().equals(identifier)) { continue; } - + String namespaceValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); - - if (namespaceValue == null){ + + if (namespaceValue == null) { continue; } - + results.add(new PhpIndexResult(namespace + "\\" + identifier, indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); } } catch (IOException ex) { @@ -159,7 +163,7 @@ public static Collection queryExactNamespaceClasses(String ident } return results; } - + public static Collection queryComponentClass(String identifier, String namespace, FileObject fo) { QuerySupport phpindex = QuerySupportFactory.get(fo); @@ -167,13 +171,13 @@ public static Collection queryComponentClass(String identifier, try { Collection indexResults = phpindex.query( - PHPIndexer.FIELD_TOP_LEVEL, namespace.toLowerCase(), QuerySupport.Kind.PREFIX, + PHPIndexer.FIELD_TOP_LEVEL, namespace.toLowerCase(), QuerySupport.Kind.PREFIX, new String[]{ PHPIndexer.FIELD_NAMESPACE }); for (IndexResult indexResult : indexResults) { String namespaceValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); - if (namespaceValue == null){ + if (namespaceValue == null) { continue; } Signature sig = Signature.get(namespaceValue); @@ -320,23 +324,22 @@ public static Collection queryExactClassMethods(FileObje Signature sig = Signature.get(classValue); String name = sig.string(1); String namespace = sig.string(4); - if (name.length() > 0 && name.equals(className) - ) { - if (queryNamespace != null && !namespace.equals(queryNamespace)){ + if (name.length() > 0 && name.equals(className)) { + if (queryNamespace != null && !namespace.equals(queryNamespace)) { continue; } classSignature = sig; - - if (namespace.length() > 0){ + + if (namespace.length() > 0) { classNamespace = namespace + "\\" + className; } } } - - if (classSignature == null){ + + if (classSignature == null) { continue; } - + String[] values = indexResult.getValues(PHPIndexer.FIELD_METHOD); for (String value : values) { Signature sig = Signature.get(value); @@ -359,9 +362,9 @@ public static Collection queryExactClassMethods(FileObje } return results; } - + /** - * + * * * @param fo * @param method @@ -374,10 +377,10 @@ public static Collection queryClassMethods(FileObject fo QuerySupport phpindex = QuerySupportFactory.get(fo); Collection results = new ArrayList<>(); - if (queryNamespace != null && queryNamespace.length() > 3){ + if (queryNamespace != null && queryNamespace.length() > 3) { int startOffset = queryNamespace.startsWith("\\") ? 1 : 0; int endOffset = queryNamespace.endsWith("\\") ? 1 : 0; - queryNamespace = queryNamespace.substring(startOffset, queryNamespace.length() - endOffset); + queryNamespace = queryNamespace.substring(startOffset, queryNamespace.length() - endOffset); } //should query the class befoe //for the moment a quick hack @@ -399,19 +402,19 @@ public static Collection queryClassMethods(FileObject fo if (name.length() > 0 && name.equals(className)) { classSignature = sig; String namespace = sig.string(4); - - if (queryNamespace != null && !namespace.equals(queryNamespace) ){ + + if (queryNamespace != null && !namespace.equals(queryNamespace)) { classSignature = null; continue; } - - if (namespace.length() > 0){ + + if (namespace.length() > 0) { classNamespace = namespace + "\\" + className; } } } - if (classSignature == null){ + if (classSignature == null) { continue; } @@ -464,7 +467,7 @@ public static Collection queryConstants(FileObject fo, String pr } return results; } - + public static Collection queryNamespace(FileObject fo, String prefix) { QuerySupport phpindex = QuerySupportFactory.get(fo); Collection results = new ArrayList<>(); @@ -473,11 +476,11 @@ public static Collection queryNamespace(FileObject fo, String pr //third signature namespace //the first el is the folder String originalPrefix = prefix; - + if (prefix.endsWith("\\\\")) { return results; } - + String[] queryItems = prefix.split("\\\\"); if (queryItems.length == 0) { @@ -524,7 +527,7 @@ public static Collection queryNamespace(FileObject fo, String pr } return results; } - + public static Collection queryNamespaces(FileObject fo, String namespace, QuerySupport.Kind queryType) { QuerySupport phpindex = QuerySupportFactory.get(fo); @@ -533,7 +536,7 @@ public static Collection queryNamespaces(FileObject fo, String n try { Collection indexResults = phpindex.query( - PHPIndexer.FIELD_TOP_LEVEL, queryPrefix, queryType, + PHPIndexer.FIELD_TOP_LEVEL, queryPrefix, queryType, new String[]{ PHPIndexer.FIELD_NAMESPACE, PHPIndexer.FIELD_TOP_LEVEL @@ -542,7 +545,7 @@ public static Collection queryNamespaces(FileObject fo, String n FileObject indexFile = indexResult.getFile(); String namespaceValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); //no namespace found - if (namespaceValue == null){ + if (namespaceValue == null) { continue; } results.add(new PhpIndexResult(namespaceValue, indexFile, PhpIndexResult.Type.NAMESPACE, new OffsetRange(0, 1))); @@ -554,12 +557,12 @@ public static Collection queryNamespaces(FileObject fo, String n } /** - * a optimized hack solution - * assuming that the name of the class is the same with the file - * + * a optimized hack solution assuming that the name of the class is the same + * with the file + * * @param fo * @param namespace - * @return + * @return */ public static Collection queryAllNamespaceClasses(FileObject fo, String namespace) { QuerySupport phpindex = QuerySupportFactory.get(fo); @@ -568,7 +571,7 @@ public static Collection queryAllNamespaceClasses(FileObject fo, try { Collection indexResults = phpindex.query( - PHPIndexer.FIELD_TOP_LEVEL, queryPrefix, QuerySupport.Kind.EXACT, + PHPIndexer.FIELD_TOP_LEVEL, queryPrefix, QuerySupport.Kind.EXACT, new String[]{ PHPIndexer.FIELD_NAMESPACE, PHPIndexer.FIELD_TOP_LEVEL @@ -577,7 +580,7 @@ public static Collection queryAllNamespaceClasses(FileObject fo, FileObject indexFile = indexResult.getFile(); String namespaceValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); //no namespace found - if (namespaceValue == null){ + if (namespaceValue == null) { continue; } results.add(new PhpIndexResult(indexFile.getName(), indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); @@ -619,16 +622,16 @@ public static Collection queryClassConstants(FileObject fo, Stri } return results; } - + /** * @notused TO BE continued - * + * * @param fo * @param prefix * @param ownerClass - * @return + * @return */ - public static Collection queryClassProperties(FileObject fo, String prefix, String ownerClass){ + public static Collection queryClassProperties(FileObject fo, String prefix, String ownerClass) { QuerySupport phpindex = QuerySupportFactory.get(fo); Collection results = new ArrayList<>(); String queryPrefix = prefix.toLowerCase(); @@ -743,9 +746,9 @@ static List parseParameters(final String signature) { /** * TODO improve the function param parsing - * + * * @param sig - * @return + * @return */ static String parseOneParameter(String sig) { String retval = null; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java index 4e7cb2972de2..777e52be6990 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java @@ -19,7 +19,9 @@ package org.netbeans.modules.php.blade.editor.indexing; import java.io.IOException; +import java.util.ArrayList; import java.util.List; +import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.project.Project; import org.netbeans.modules.php.blade.project.ProjectUtils; import org.openide.filesystems.FileObject; @@ -29,43 +31,40 @@ * * @author bogdan */ -public class QueryUtils { +public final class QueryUtils { + + private QueryUtils() { - public static List queryYieldReferences(String prefix, FileObject fo) { - BladeIndex bladeIndex = getIndex(fo); - if (bladeIndex == null) { - return null; - } - return bladeIndex.queryYieldIndexedReferences(prefix); } - + public static List findYieldReferences(String prefix, FileObject fo) { BladeIndex bladeIndex = getIndex(fo); if (bladeIndex == null) { - return null; + return new ArrayList<>(); } return bladeIndex.findYieldIndexedReferences(prefix); } - - public static List queryStacksReferences(String prefix, FileObject fo) { + + public static List findStacksReferences(String prefix, FileObject fo) { BladeIndex bladeIndex = getIndex(fo); if (bladeIndex == null) { - return null; + return new ArrayList<>(); } - return bladeIndex.queryStacksIdsReference(prefix); + return bladeIndex.findStackIdIndexedReferences(prefix); } - + public static List getIncludePathReferences(String prefix, FileObject fo) { BladeIndex bladeIndex = getIndex(fo); if (bladeIndex == null) { - return null; + return new ArrayList<>(); } return bladeIndex.getIncludePaths(prefix); } - + + @CheckForNull public static BladeIndex getIndex(FileObject fo) { Project project = ProjectUtils.getMainOwner(fo); - + try { return BladeIndex.get(project); } catch (IOException ex) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java index 6c9020786636..d9e5de511063 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java @@ -31,7 +31,17 @@ * * @author bogdan */ -public class BladeLexerUtils { +public final class BladeLexerUtils { + + private BladeLexerUtils() { + + } + + public static final List TOKENS_WITH_IDENTIFIABLE_PARAM = Arrays.asList(new Integer[]{ + D_EXTENDS, D_INCLUDE, D_INCLUDE_IF, D_INCLUDE_WHEN, + D_INCLUDE_UNLESS, D_EACH, D_SECTION, D_HAS_SECTION, D_SECTION_MISSING, + D_PUSH, D_PUSH_IF, D_PREPEND, D_USE, D_INJECT, D_ASSET_BUNDLER + }); public static TokenSequence getPhpTokenSequence(TokenHierarchy th, final int offset) { return getTokenSequence(th, offset, PHPTokenId.language()); @@ -66,12 +76,4 @@ public static TokenSequence getTokenSequence(final TokenHierarc } return ts; } - - public static List tokensWithIdentifiableParam() { - return Arrays.asList(new Integer[]{ - D_EXTENDS, D_INCLUDE, D_INCLUDE_IF, D_INCLUDE_WHEN, - D_INCLUDE_UNLESS, D_EACH, D_SECTION, D_HAS_SECTION, D_SECTION_MISSING, - D_PUSH, D_PUSH_IF, D_PREPEND, D_USE, D_INJECT, D_ASSET_BUNDLER - }); - } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/EditorUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/PHPLexerUtils.java similarity index 69% rename from php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/EditorUtils.java rename to php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/PHPLexerUtils.java index 6e304376950d..f550155d71d4 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/EditorUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/PHPLexerUtils.java @@ -21,19 +21,18 @@ import javax.swing.text.Document; import org.netbeans.api.lexer.TokenHierarchy; import org.netbeans.api.lexer.TokenSequence; -import org.netbeans.api.project.Project; import org.netbeans.editor.BaseDocument; -import org.netbeans.modules.editor.NbEditorUtilities; -import org.netbeans.modules.php.blade.project.ProjectUtils; import org.netbeans.modules.php.editor.lexer.PHPTokenId; -import org.openide.filesystems.FileObject; -import org.openide.loaders.DataObject; /** * * @author bogdan */ -public class EditorUtils { +public final class PHPLexerUtils { + + private PHPLexerUtils() { + + } public static TokenSequence getTokenSequence(Document doc, int offset) { BaseDocument baseDoc = (BaseDocument) doc; @@ -52,20 +51,5 @@ public static TokenSequence getTokenSequence(Document doc, int offse return tokenSequence; } - - public static FileObject getFileObjectFromDoc(Document doc) { - DataObject dObject = NbEditorUtilities.getDataObject(doc); - if (dObject != null) { - return dObject.getPrimaryFile().getParent(); - } - return null; - } - - public static Project getProjectOwner(Document doc) { - FileObject file = getFileObjectFromDoc(doc); - if (file == null){ - return null; - } - return ProjectUtils.getMainOwner(file); - } + } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureItem.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureItem.java index b3975d6ccfa1..0e14ecc5e01f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureItem.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/BladeStructureItem.java @@ -163,7 +163,7 @@ public String getHtml(HtmlFormatter formatter) { @Override public ImageIcon getCustomIcon() { - return ResourceUtilities.loadResourceIcon("icons/layout.png"); + return ResourceUtilities.loadLayoutIcon(); } } @@ -211,7 +211,7 @@ public ElementKind getKind() { @Override public ImageIcon getCustomIcon() { - return ResourceUtilities.loadResourceIcon("icons/layout.png"); + return ResourceUtilities.loadLayoutIcon(); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java index 6f93fd83feb4..16c6fd6e8e66 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java @@ -50,17 +50,7 @@ * * @author bogdan */ -public class ParsingUtils { - - private final FileObject currentFile; - - public ParsingUtils(FileObject file) { - this.currentFile = file; - } - - public ParsingUtils() { - this.currentFile = null; - } +public final class ParsingUtils { private PHPParseResult phpParserResult; @@ -70,19 +60,16 @@ public FakeFileObject createFileObject(String phpText) { public void parsePhpText(String phpText) { FakeFileObject file = new FakeFileObject(phpText); - if (currentFile != null) { - file.setParent(currentFile.getParent()); - } parseFileObject(file); } - - public void parseFileObject(FileObject file){ + + public void parseFileObject(FileObject file) { Document doc = openDocument(file); try { Source source = Source.create(doc); - - if (source == null){ + + if (source == null) { return; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java index d3ccef8d5580..6d660dbb8e3d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java @@ -36,11 +36,15 @@ * * @author bogdan */ -public class BladePathUtils { +public final class BladePathUtils { public static final String LARAVEL_VIEW_PATH = "resources/views"; //NOI18N public static final String BLADE_EXT = ".blade.php"; //NOI18N + private BladePathUtils() { + + } + /** * first we need to extract the root folder of view after we apply a generic * path sanitize for blade paths (ex "my.path" -> "my/path.blade.php") @@ -136,9 +140,9 @@ public static List getParentChildrenFromPrefixPath(FileObject contex relativeSlash = unixPath.lastIndexOf("/"); HashSet filteredViewRoots = new HashSet<>(); - + Map relativeFilePathMap = new HashMap<>(); - + if (relativeSlash > 0) { //filter only relative folders for (FileObject rootFolder : viewRoots) { @@ -157,7 +161,7 @@ public static List getParentChildrenFromPrefixPath(FileObject contex if (relativeSlash > 0) { //extract the path name prefix - relativePrefixToCompare = unixPath.substring(relativeSlash+1, unixPath.length()); + relativePrefixToCompare = unixPath.substring(relativeSlash + 1, unixPath.length()); } else { //root reference relativePrefixToCompare = unixPath; @@ -168,7 +172,7 @@ public static List getParentChildrenFromPrefixPath(FileObject contex for (FileObject rootFolder : filteredViewRoots) { list.addAll(Arrays.asList(rootFolder.getChildren())); } - for (Map.Entry entry : relativeFilePathMap.entrySet()){ + for (Map.Entry entry : relativeFilePathMap.entrySet()) { list.addAll(Arrays.asList(entry.getValue().getChildren())); } } else { @@ -181,10 +185,10 @@ public static List getParentChildrenFromPrefixPath(FileObject contex } } } - - for (Map.Entry entry : relativeFilePathMap.entrySet()){ + + for (Map.Entry entry : relativeFilePathMap.entrySet()) { for (FileObject file : entry.getValue().getChildren()) { - if (file.getName().startsWith(relativePrefixToCompare)){ + if (file.getName().startsWith(relativePrefixToCompare)) { list.add(file); } } @@ -275,44 +279,44 @@ public static String toBladeViewPath(FileObject file) { return path; } - - public static String getRelativeProjectPath(FileObject currentFile){ + + public static String getRelativeProjectPath(FileObject currentFile) { Project projectOwner = ProjectConvertors.getNonConvertorOwner(currentFile); - if (projectOwner == null){ + if (projectOwner == null) { return ""; } - + String dirPath = projectOwner.getProjectDirectory().getPath(); String relativePath = currentFile.getPath().replace(dirPath, ""); //only if we found the relative project path - if (currentFile.getPath().length() > relativePath.length()){ + if (currentFile.getPath().length() > relativePath.length()) { return relativePath; } - + return ""; } - - public static String toBladeViewPath(String filePath){ + + public static String toBladeViewPath(String filePath) { return filePath.replace(BLADE_EXT, "").replace("/", "."); } - - public static String viewPathToFilePath(String viewPath){ + + public static String viewPathToFilePath(String viewPath) { return viewPath.replace(".", "/") + BLADE_EXT; } - - public static HashSet getDefaultRoots(Project project){ + + public static HashSet getDefaultRoots(Project project) { HashSet defaultList = new HashSet<>(); FileObject defaultViewsRoot = project.getProjectDirectory().getFileObject(LARAVEL_VIEW_PATH); - - if (defaultViewsRoot != null && defaultViewsRoot.isValid()){ + + if (defaultViewsRoot != null && defaultViewsRoot.isValid()) { defaultList.add(defaultViewsRoot); } - + return defaultList; } - - public static String toBladeToProjectFilePath(String path){ + + public static String toBladeToProjectFilePath(String path) { return LARAVEL_VIEW_PATH + "/" + viewPathToFilePath(path); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/GeneralPreferencesUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/GeneralPreferencesUtils.java index bffc0993746f..c34e71bf47ba 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/GeneralPreferencesUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/preferences/GeneralPreferencesUtils.java @@ -45,6 +45,10 @@ public final class GeneralPreferencesUtils { // default values private static Preferences PREFERENCES; + + private GeneralPreferencesUtils(){ + + } private static final PreferenceChangeListener PREFERENCES_TRACKER = new PreferenceChangeListener() { @Override @@ -55,9 +59,6 @@ public void preferenceChange(PreferenceChangeEvent evt) { } }; - private GeneralPreferencesUtils() { - } - public static boolean isFormattingEnabled(){ lazyInit(); return enableFormatting; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java index 78b4983af70f..773214730f9b 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java @@ -26,7 +26,11 @@ * * @author bogdan */ -public class ProjectUtils { +public final class ProjectUtils { + + private ProjectUtils() { + + } public static Project getMainOwner(FileObject file) { Project project = ProjectConvertors.getNonConvertorOwner(file); @@ -34,17 +38,17 @@ public static Project getMainOwner(FileObject file) { if (project == null) { return null; } - + return project; } - + public static FileObject getProjectDirectory(FileObject file) { Project project = getMainOwner(file); - if (project == null){ + if (project == null) { return null; } - + return project.getProjectDirectory(); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java index c140bae300c5..42b6b9eda961 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java @@ -22,7 +22,11 @@ * * @author bhaidu */ -public class StringUtils { +public final class StringUtils { + + private StringUtils() { + + } public static boolean isUpperCase(String s) { for (char c : s.toCharArray()) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java index 47a886fa710f..ae688538e85c 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java @@ -1,4 +1,4 @@ - /* +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -30,7 +30,11 @@ * * @author bogdan */ -public class BladeAntlrUtils { +public final class BladeAntlrUtils { + + private BladeAntlrUtils() { + + } public static AntlrTokenSequence getTokens(Document doc) { @@ -58,10 +62,10 @@ public static Token getToken(Document doc, int offset) { Token token = tokens.next().get(); //need to move back - if ( token != null && tokens.hasPrevious() && token.getStartIndex() > offset && token.getStopIndex() > offset){ + if (token != null && tokens.hasPrevious() && token.getStartIndex() > offset && token.getStopIndex() > offset) { token = tokens.previous().get(); } - + return token; } @@ -211,7 +215,7 @@ public static Token findForward(Document doc, Token start, return null; } - + public static Token findForwardWithStop(Document doc, Token start, int tokensMatch, List stopTokens) { AntlrTokenSequence tokens = getTokens(doc); @@ -271,7 +275,7 @@ public static Token findBackward(Document doc, Token start, return null; } - + public static Token findBackwardWithStop(Document doc, Token start, int tokensMatch, List stopTokens) { AntlrTokenSequence tokens = getTokens(doc); From dcb2395c7c2ff7bdc5e67beeba420fbd3a495188 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Mon, 5 Aug 2024 07:45:51 +0300 Subject: [PATCH 05/43] fix duplicated project.xml, using new switch syntax, // NOI18N --- php/php.api.phpmodule/nbproject/project.xml | 1 - .../php/blade/csl/elements/NamedElement.java | 18 ++++++++++++------ .../blade/csl/elements/PhpFunctionElement.java | 2 -- .../php/blade/csl/elements/TagElement.java | 2 +- .../php/blade/editor/BladeBracesMatcher.java | 3 ++- 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/php/php.api.phpmodule/nbproject/project.xml b/php/php.api.phpmodule/nbproject/project.xml index 20b8466b0815..d269125fd2af 100644 --- a/php/php.api.phpmodule/nbproject/project.xml +++ b/php/php.api.phpmodule/nbproject/project.xml @@ -226,7 +226,6 @@ org.cakephp.netbeans - org.netbeans.modules.php.blade org.nbphpcouncil.modules.php.ci org.nbphpcouncil.modules.php.laravel4 org.nbphpcouncil.modules.php.yii diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java index 1660b48fffb5..b039ab821b89 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java @@ -76,16 +76,22 @@ public String getIn() { @Override public ElementKind getKind() { switch (type) { - case YIELD_ID: + case YIELD_ID -> { return ElementKind.PACKAGE; - case STACK_ID: + } + case STACK_ID -> { return ElementKind.PACKAGE; - case CUSTOM_DIRECTIVE: + } + case CUSTOM_DIRECTIVE -> { return ElementKind.METHOD; - case PHP_CLASS: + } + case PHP_CLASS -> { return ElementKind.CLASS; + } + default -> { + return ElementKind.FILE; + } } - return ElementKind.FILE; } @Override @@ -106,5 +112,5 @@ public OffsetRange getOffsetRange(ParserResult pr) { public ElementType getType() { return type; } - + } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java index f4d120fc59ea..6a2765887134 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java @@ -63,7 +63,5 @@ public String getParamsAsString() { public List getParams() { return params; } - - } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java index 1b7b2051c548..7263694e0589 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java @@ -59,7 +59,7 @@ public String getName() { @Override public String getIn() { - return ""; + return ""; // NOI18N } @Override diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java index 995f7e3bcabe..27b1f8755cf4 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -120,8 +120,9 @@ public int[] findMatches() throws InterruptedException, BadLocationException { case END_TO_START -> { return findOriginForDirectiveEnd(tokenText); } - default -> { return null;} } + + return null; } private static boolean shouldLookForBraceMatch(@NonNull Token currentToken) { From dada6ecad9227f946b0a22a29065f5ea9f1f3533 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Wed, 7 Aug 2024 08:34:15 +0300 Subject: [PATCH 06/43] batch of reviews, adding // NOI18N, refactoring the switch syntax, moving strings to constants, removing comments, removing unused images --- php/php.blade/licenseinfo.xml | 10 +--- php/php.blade/nbproject/project.properties | 1 - .../csl/elements/PhpFunctionElement.java | 2 +- .../php/blade/csl/elements/TagElement.java | 4 +- .../php/blade/editor/BladeBracesMatcher.java | 38 +++++---------- .../php/blade/editor/EditorStringUtils.java | 3 -- .../blade/editor/HyperlinkProviderImpl.java | 2 - .../blade/editor/indexing/PhpIndexUtils.java | 31 ++++++------ .../php/blade/editor/indexing/QueryUtils.java | 7 ++- .../blade/project/BladeProjectProperties.java | 46 +++++++++--------- .../php/blade/project/ComponentsSupport.java | 29 +++++------ .../modules/php/blade/resources/icons/at2.png | Bin 1212 -> 0 bytes .../modules/php/blade/resources/icons/at4.png | Bin 3264 -> 0 bytes .../blade/syntax/BladeDirectivesUtils.java | 18 ++++--- 14 files changed, 85 insertions(+), 106 deletions(-) delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/at2.png delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/at4.png diff --git a/php/php.blade/licenseinfo.xml b/php/php.blade/licenseinfo.xml index 68c1a44517b8..b832d133ad7a 100644 --- a/php/php.blade/licenseinfo.xml +++ b/php/php.blade/licenseinfo.xml @@ -29,17 +29,9 @@ tools/skeleton.netbeans src/org/netbeans/modules/php/blade/resources/icon.png src/org/netbeans/modules/php/blade/resources/icons/at.png - src/org/netbeans/modules/php/blade/resources/icons/at2.png - src/org/netbeans/modules/php/blade/resources/icons/at4.png src/org/netbeans/modules/php/blade/resources/icons/blade_file.png src/org/netbeans/modules/php/blade/resources/icons/layout.png - - - \ No newline at end of file + diff --git a/php/php.blade/nbproject/project.properties b/php/php.blade/nbproject/project.properties index d4476f1c745e..4c3b5d6a165f 100644 --- a/php/php.blade/nbproject/project.properties +++ b/php/php.blade/nbproject/project.properties @@ -15,7 +15,6 @@ # specific language governing permissions and limitations # under the License. -javac.source=1.8 javac.compilerargs=-Xlint -Xlint:-serial spec.version.base.fatal.warning=false javac.release=17 diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java index 6a2765887134..0555a9898996 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java @@ -57,7 +57,7 @@ public String getParamsAsString() { if (params == null || params.isEmpty()) { return "()"; } - return "(" + String.join(", ", params) + ")"; + return "(" + String.join(", ", params) + ")"; // NOI18N } public List getParams() { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java index 7263694e0589..522b3796e436 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java @@ -34,8 +34,8 @@ */ public class TagElement implements ElementHandle { - protected final String name; - protected final ElementType type; + private final String name; + private final ElementType type; public TagElement(String name) { this.name = name; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java index 27b1f8755cf4..a772fa38abd7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -104,35 +104,21 @@ public int[] findMatches() throws InterruptedException, BadLocationException { } String tokenText = originToken.getText(); - switch (currentDirection) { - case CURLY_START_TO_END -> { - return findCloseTag(); - } - case CURLY_END_TO_START -> { - return findOpenTag(); - } - case START_TO_END -> { - return findDirectiveEnd(tokenText); - } - case CUSTOM_START_TO_END -> { - return findCustomDirectiveEnd(tokenText); - } - case END_TO_START -> { - return findOriginForDirectiveEnd(tokenText); - } - } - - return null; + return switch (currentDirection) { + case CURLY_START_TO_END -> findCloseTag(); + case CURLY_END_TO_START -> findOpenTag(); + case START_TO_END -> findDirectiveEnd(tokenText); + case CUSTOM_START_TO_END -> findCustomDirectiveEnd(tokenText); + case END_TO_START -> findOriginForDirectiveEnd(tokenText); + default -> null; + }; } private static boolean shouldLookForBraceMatch(@NonNull Token currentToken) { - switch (currentToken.getType()) { - case HTML, PHP_EXPRESSION, AT, BLADE_COMMENT, ERROR -> { - return false; - } - } - - return true; + return switch (currentToken.getType()) { + case HTML, PHP_EXPRESSION, AT, BLADE_COMMENT, ERROR -> false; + default -> true; + }; } public BraceDirectionType findBraceDirectionType(String tokenText, Token token) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java index 3fde6c8b3ef9..0ef7c48f8d1b 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorStringUtils.java @@ -18,9 +18,6 @@ */ package org.netbeans.modules.php.blade.editor; -import java.util.Collection; -import org.openide.util.Parameters; - /** * * @author bhaidu diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java index ac8c3f343cb7..50289a746ee3 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java @@ -56,7 +56,6 @@ public class HyperlinkProviderImpl implements HyperlinkProviderExt { private String tooltipText = ""; private FileObject goToFile; private int goToOffset = 0; - private int triggeredEvent = 0; public enum DeclarationType { VIEW_PATH; @@ -164,7 +163,6 @@ public void performClickAction(Document doc, int offset, HyperlinkType type) { case "render": // NOI18N if (goToFile != null) { openDocument(goToFile, goToOffset); - triggeredEvent++; } break; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java index a363b5d8d009..534c737512ed 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java @@ -28,6 +28,8 @@ import org.netbeans.modules.csl.api.OffsetRange; import org.netbeans.modules.parsing.spi.indexing.support.IndexResult; import org.netbeans.modules.parsing.spi.indexing.support.QuerySupport; +import org.netbeans.modules.php.blade.editor.EditorStringUtils; +import static org.netbeans.modules.php.blade.editor.EditorStringUtils.NAMESPACE_SEPARATOR; import org.netbeans.modules.php.blade.editor.cache.QueryCache; import org.netbeans.modules.php.editor.api.QuerySupportFactory; import org.netbeans.modules.php.editor.index.PHPIndexer; @@ -43,6 +45,7 @@ */ public final class PhpIndexUtils { + public final static String ESCAPED_NAMESPACE_SEPARATOR = "\\\\"; // NOI18N private final static QueryCache> cache = new QueryCache(); private final static QueryCache> functionCache = new QueryCache(); @@ -102,7 +105,7 @@ public static Collection queryNamespaceClassesName(String prefix String namespace, FileObject fo) { QuerySupport phpindex = QuerySupportFactory.get(fo); Collection results = new ArrayList<>(); - String queryPrefix = prefix.toLowerCase() + ".*" + namespace.replace("\\", "\\\\") + ";.*"; + String queryPrefix = prefix.toLowerCase() + ".*" + namespace.replace(NAMESPACE_SEPARATOR, ESCAPED_NAMESPACE_SEPARATOR) + ";.*"; // NOI18N try { Collection indexResults = phpindex.query( @@ -122,7 +125,7 @@ public static Collection queryNamespaceClassesName(String prefix && classNamespace.length() > 0 && classNamespace.startsWith(namespace)) { results.add(new PhpIndexResult(fullName, - classNamespace + "\\" + fullName, indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); + classNamespace + NAMESPACE_SEPARATOR + fullName, indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); } } } @@ -156,7 +159,7 @@ public static Collection queryExactNamespaceClasses(String ident continue; } - results.add(new PhpIndexResult(namespace + "\\" + identifier, indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); + results.add(new PhpIndexResult(namespace + NAMESPACE_SEPARATOR + identifier, indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); } } catch (IOException ex) { Exceptions.printStackTrace(ex); @@ -185,7 +188,7 @@ public static Collection queryComponentClass(String identifier, String domainName = sig.string(2); FileObject indexFile = indexResult.getFile(); if (indexFile.getName().equals(identifier)) { - results.add(new PhpIndexResult(domainName + "\\" + name + "\\" + indexFile.getName(), + results.add(new PhpIndexResult(domainName + NAMESPACE_SEPARATOR + name + NAMESPACE_SEPARATOR + indexFile.getName(), indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); } } @@ -331,7 +334,7 @@ public static Collection queryExactClassMethods(FileObje classSignature = sig; if (namespace.length() > 0) { - classNamespace = namespace + "\\" + className; + classNamespace = namespace + NAMESPACE_SEPARATOR + className; } } } @@ -376,11 +379,9 @@ public static Collection queryClassMethods(FileObject fo String method, String className, String queryNamespace) { QuerySupport phpindex = QuerySupportFactory.get(fo); Collection results = new ArrayList<>(); - + String queryNamespacePath = queryNamespace; if (queryNamespace != null && queryNamespace.length() > 3) { - int startOffset = queryNamespace.startsWith("\\") ? 1 : 0; - int endOffset = queryNamespace.endsWith("\\") ? 1 : 0; - queryNamespace = queryNamespace.substring(startOffset, queryNamespace.length() - endOffset); + queryNamespacePath = EditorStringUtils.trimNamespace(queryNamespace); } //should query the class befoe //for the moment a quick hack @@ -403,7 +404,7 @@ public static Collection queryClassMethods(FileObject fo classSignature = sig; String namespace = sig.string(4); - if (queryNamespace != null && !namespace.equals(queryNamespace)) { + if (queryNamespacePath != null && !namespace.equals(queryNamespacePath)) { classSignature = null; continue; } @@ -477,11 +478,11 @@ public static Collection queryNamespace(FileObject fo, String pr //the first el is the folder String originalPrefix = prefix; - if (prefix.endsWith("\\\\")) { + if (prefix.endsWith(ESCAPED_NAMESPACE_SEPARATOR)) { return results; } - String[] queryItems = prefix.split("\\\\"); + String[] queryItems = prefix.split(ESCAPED_NAMESPACE_SEPARATOR); if (queryItems.length == 0) { return results; @@ -491,7 +492,7 @@ public static Collection queryNamespace(FileObject fo, String pr try { Collection indexResults = phpindex.query( - PHPIndexer.FIELD_TOP_LEVEL, queryPrefix + "\\", QuerySupport.Kind.PREFIX, new String[]{ + PHPIndexer.FIELD_TOP_LEVEL, queryPrefix + NAMESPACE_SEPARATOR, QuerySupport.Kind.PREFIX, new String[]{ PHPIndexer.FIELD_NAMESPACE, PHPIndexer.FIELD_TOP_LEVEL}); for (IndexResult indexResult : indexResults) { FileObject indexFile = indexResult.getFile(); @@ -507,10 +508,10 @@ public static Collection queryNamespace(FileObject fo, String pr String name = sig.string(1); String namespace = sig.string(2); - String fullNamespace = ""; + String fullNamespace = ""; // NOI18N if (!namespace.isEmpty()) { - fullNamespace = namespace + "\\"; + fullNamespace = namespace + NAMESPACE_SEPARATOR; } fullNamespace += name; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java index 777e52be6990..18e27e90c94f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/QueryUtils.java @@ -19,7 +19,6 @@ package org.netbeans.modules.php.blade.editor.indexing; import java.io.IOException; -import java.util.ArrayList; import java.util.List; import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.project.Project; @@ -40,7 +39,7 @@ private QueryUtils() { public static List findYieldReferences(String prefix, FileObject fo) { BladeIndex bladeIndex = getIndex(fo); if (bladeIndex == null) { - return new ArrayList<>(); + return List.of(); } return bladeIndex.findYieldIndexedReferences(prefix); } @@ -48,7 +47,7 @@ public static List findYieldReferences(String prefi public static List findStacksReferences(String prefix, FileObject fo) { BladeIndex bladeIndex = getIndex(fo); if (bladeIndex == null) { - return new ArrayList<>(); + return List.of(); } return bladeIndex.findStackIdIndexedReferences(prefix); } @@ -56,7 +55,7 @@ public static List findStacksReferences(String pref public static List getIncludePathReferences(String prefix, FileObject fo) { BladeIndex bladeIndex = getIndex(fo); if (bladeIndex == null) { - return new ArrayList<>(); + return List.of(); } return bladeIndex.getIncludePaths(prefix); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java index 0606a5791531..4c625962edc1 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java @@ -23,6 +23,7 @@ import java.util.prefs.PreferenceChangeListener; import java.util.prefs.Preferences; import javax.swing.DefaultListModel; +import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectUtils; import org.netbeans.modules.php.blade.editor.ui.customizer.UiOptionsUtils; @@ -38,31 +39,33 @@ public final class BladeProjectProperties { private static final Map INSTANCES = new HashMap<>(); - private static final String BLADE_VERSION = "blade.version"; // NOI18N private static final String DIRECTIVE_CUSTOMIZER_PATH_LIST = "directive_customizer.path.list"; // NOI18N private static final String VIEW_PATH_LIST = "views.path.list"; // NOI18N private static final String NON_LARAVEL_DECL_FINDER = "non_laravel.decl.finder"; // NOI18N - public Project project; + public final Project project; - DefaultListModel directiveCustomizerPathList = new DefaultListModel(); - DefaultListModel viewsPathList = new DefaultListModel(); - boolean nonLaravelDeclFinder = false; + private DefaultListModel directiveCustomizerPathList = new DefaultListModel(); + private DefaultListModel viewsPathList = new DefaultListModel(); + private boolean nonLaravelDeclFinder = false; private BladeProjectProperties(Project project) { this.project = project; initModelsFromPreferences(); } + @CheckForNull public static BladeProjectProperties getInstance(Project project) { - if (INSTANCES.containsKey(project)) { - return INSTANCES.get(project); + synchronized (INSTANCES) { + if (INSTANCES.containsKey(project)) { + return INSTANCES.get(project); + } + BladeProjectProperties instance = new BladeProjectProperties(project); + INSTANCES.put(project, instance); + return instance; } - BladeProjectProperties instance = new BladeProjectProperties(project); - INSTANCES.put(project, instance); - return instance; } - - public static void closeProject(Project project){ + + public static void closeProject(Project project) { if (INSTANCES.containsKey(project)) { INSTANCES.remove(project); } @@ -85,13 +88,12 @@ public void storeDirectiveCustomizerPaths() { String includePath = UiOptionsUtils.encodeToStrings(directiveCustomizerPathList.elements()); getPreferences().put(DIRECTIVE_CUSTOMIZER_PATH_LIST, includePath); } - - + public void storeViewsPaths() { String includePath = UiOptionsUtils.encodeToStrings(viewsPathList.elements()); getPreferences().put(VIEW_PATH_LIST, includePath); } - + public void storeNonLaravelDeclFinderFlag(boolean status) { nonLaravelDeclFinder = status; getPreferences().putBoolean(NON_LARAVEL_DECL_FINDER, status); @@ -100,7 +102,7 @@ public void storeNonLaravelDeclFinderFlag(boolean status) { public void addDirectiveCustomizerPath(String path) { directiveCustomizerPathList.addElement(path); } - + public void addViewsPath(String path) { viewsPathList.addElement(path); } @@ -108,7 +110,7 @@ public void addViewsPath(String path) { public void removeCustomizerPath(int index) { directiveCustomizerPathList.remove(index); } - + public void removeViewsPath(int index) { viewsPathList.remove(index); } @@ -121,7 +123,7 @@ public void setViewsPathList(DefaultListModel list) { public DefaultListModel createModelForDirectiveCusomizerPathList() { return creatModelFromPreferences(DIRECTIVE_CUSTOMIZER_PATH_LIST); } - + public DefaultListModel createModelForViewsPathList() { return creatModelFromPreferences(VIEW_PATH_LIST); } @@ -137,14 +139,14 @@ public DefaultListModel getModelViewsPathList() { public boolean getNonLaravelDeclFinderFlag() { return nonLaravelDeclFinder; } - + private DefaultListModel creatModelFromPreferences(String pathName) { DefaultListModel model = new DefaultListModel<>(); String encodedCompilerPathList = getPreferences().get(pathName, null); String[] paths; if (encodedCompilerPathList != null) { - paths = encodedCompilerPathList.split("\\|", -1); + paths = encodedCompilerPathList.split("\\|", -1); // NOI18N } else { return model; } @@ -163,7 +165,7 @@ public String[] getCompilerPathList() { String encodedCompilerPathList = getPreferences().get(DIRECTIVE_CUSTOMIZER_PATH_LIST, null); String[] paths = new String[]{}; if (encodedCompilerPathList != null) { - return encodedCompilerPathList.split("\\|", -1); + return encodedCompilerPathList.split("\\|", -1); // NOI18N } return paths; } @@ -172,7 +174,7 @@ public String[] getViewsPathList() { String encodedCompilerPathList = getPreferences().get(VIEW_PATH_LIST, null); String[] paths = new String[]{}; if (encodedCompilerPathList != null) { - return encodedCompilerPathList.split("\\|", -1); + return encodedCompilerPathList.split("\\|", -1); // NOI18N } return paths; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java index 3c1d7e86dc07..f6b6d6c37466 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java @@ -30,31 +30,32 @@ * @author bogdan */ @NamespaceRegister({ - @Namespace(path = "App\\View\\Components", from_app = true, relativeFilePath = "app/View/Components"), - @Namespace(path = "App\\Http\\Livewire", from_app = true, relativeFilePath = "app/Http/Livewire"), - @Namespace(path = "App\\Livewire", from_app = true, relativeFilePath = "app/Livewire"),//from 10 - @Namespace(path = "Illuminate\\Console\\View\\Components"), - @Namespace(path = "BladeUI\\Icons\\Components", packageName = "blade-ui-kit/blade-icons"), - @Namespace(path = "BladeUIKit\\Components", packageName = "blade-ui-kit/blade-ui-kit"), - }) + @Namespace(path = "App\\View\\Components", from_app = true, relativeFilePath = "app/View/Components"), // NOI18N + @Namespace(path = "App\\Http\\Livewire", from_app = true, relativeFilePath = "app/Http/Livewire"), // NOI18N + @Namespace(path = "App\\Livewire", from_app = true, relativeFilePath = "app/Livewire"), // NOI18N + @Namespace(path = "Illuminate\\Console\\View\\Components"), // NOI18N + @Namespace(path = "BladeUI\\Icons\\Components", packageName = "blade-ui-kit/blade-icons"), // NOI18N + @Namespace(path = "BladeUIKit\\Components", packageName = "blade-ui-kit/blade-ui-kit"),}) // NOI18N public class ComponentsSupport { private static final Map INSTANCES = new HashMap<>(); private final Map installedComponentNamespace = new HashMap<>(); private boolean scanned = false; - public Project project; + private final Project project; private ComponentsSupport(Project project) { this.project = project; } public static ComponentsSupport getInstance(Project project) { - if (INSTANCES.containsKey(project)) { - return INSTANCES.get(project); + synchronized (INSTANCES) { + if (INSTANCES.containsKey(project)) { + return INSTANCES.get(project); + } + ComponentsSupport instance = new ComponentsSupport(project); + INSTANCES.put(project, instance); + return instance; } - ComponentsSupport instance = new ComponentsSupport(project); - INSTANCES.put(project, instance); - return instance; } public void scanForInstalledComponents() { @@ -64,7 +65,7 @@ public void scanForInstalledComponents() { //check if folder exists fo = project.getProjectDirectory().getFileObject(namespace.relativeFilePath()); } else { - fo = project.getProjectDirectory().getFileObject("vendor/" + namespace.relativeFilePath()); + fo = project.getProjectDirectory().getFileObject("vendor/" + namespace.relativeFilePath()); // NOI18N } if (fo == null || !fo.isValid()) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/at2.png b/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/at2.png deleted file mode 100644 index 4a15be190b54b33c296a825031970194f802b4f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1212 zcmV;t1Vj6YP)EX>4Tx04R}tkv&MmKpe$iQ>7vmhh`AzkfAzR5EXHhDi*;)X)CnqU~=gfG%+M8 zE{=k0!NHHks)LKOt`4q(Aou~|=;Wm6A|?JWDYS_3;J6>}?mh0_0YbCJG^=ME&~)3( zBok7;up)(C5rlvUq7Y?f8L8|-4!+~-9s$1I#d((hxj)B%TC^AtkcelQVcNv&#M7I$ z!FiupWEEK@J|`YC>4LolWCVi75%AwfYMRn%Z3PODCeg$(T{eEh?%KTR%$Tvae~ z%wq!@WY-V=2fw?uN|O^_QaAzhzBtau2oTx@S`EkfK6aee2@re+uJn$7qY2D>lHTZO zu_It`8@RacXv!XNxdRM68L}z6Qjn%lDgp0j^i2gIatrjYdcC#xaryw{sH>$L;NTD# zEmQWI&%67&d;9lHyT2bp4sw(#%Q2Mz000JJOGiWi8vq*s8+2uukpKVy32;bRa{vG? zBLDy{BLR4&KXw2B0?kQ8K~y-)m6OeDRA&^2pZn$=@14o5om&&*#Kfjfi-Zzww0?A< zrc+!Qgr-9OfcAzA$W5Akz35fL##AVIMtVvJOl zmSyJRC7Jy3XQ}4%A|gW~f+ZqxcW=dfEg z5$f1VVf+a|2pCjAqA)#8Xj>;6yeLa|N6CG6me;=gl=wF%@ZLX!<=TX|bz*6a3OiKh z()GnB6wpuHv|GbUW=@C7!4@+x`seh1s1-q?{pim&lWZBRjs{^_efK&qz z5MwYaD_FV-?KV?dSfFs{E<7!xU6)EGi$9fOWA8ib9%vvHc`M%fZ0tU!;?umRm%`~Q zOnvqRR&xZqdk0pB%i^_RO7|ZS-uX7}8+E@(X<(!|9^ae2`Wwac9Ic5yVT2;Gp4T%hy3(BZN~?2yIx0(!BPrf)sJ#DuReSo82Df1)u-3=^yS6nuVr+7&U(r3d=8jw a4F3nS_kBWhz+Zm=0000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bxvgIZW{AU$e0z%@o91u{I9c1}wjPSX+GnJWC z<#^^AY#yRpYRPW?_2+Vb;1}2@Coz{)Q}Xypl^Plv#eaU&?&leKdH&uX*=i2Wj=;i%D~NdtE!g^dzs$he1~ zfuCoEbErYtGqLQ8R>)j=aN)ojCNqoU@Y+JpzV+EpsbJ?p7#awR5vKg><$g8bcdoV6 z10&iHlVJtBLfAaehLQJQ3VvZ%&*j(ZyDW;Ti+A-HMXUQ?AoO8)F zx57nAEUDyDN-eF1$_U9=Q_Z#1T3f@OOy4uT{vHHXHA6O$}Ej&!^ zartEpPjlW2JxkEmnYcLvV?hXv=gj~dI&97m&mv(nw>k4QASz;jk#Tb~$Tvp`6w0I! z7roqlnEP$s9I*ZsZ{c^CbDO&Vfw|x&f8*^Ztc|UN`Y?8)aAWEj(YL~Ap|sG|73{y8 z1%vOsXNe>+NvyN*)6NRjYJNV`s;8m*Da9#ul-)uW0fW!j&plH-vs=pm|4fmbu}rwR5WAL|I-5x|o}Z*iHEOSU)fVP>o9bGcjVj|Rte_O3p=1UwCq`q+P0+5R!S zbw-_uT0P?uX^H7<8{pv2PR@=T&r#HmQrpuUs-^ccRjSU|&(sW&EaL-~)@L&pXRKo) zyBI(zd&q(<0MAKhSuD!KpZ2N~sR-S(`4XRUbT(ypysb8C_`-gkQ9+l82ID=Ux2GC1 zNyXaDl_Y$o_eZw3$q1&jPIF1fo6r0@RxK%iP6q6b$2z>o0Nh3*E(6fFX^NNu;_;a$ zP>@k<`Pg#NG*55rNlxckeqw=E-z6HBpzB%4Hd<0M25VK318JHmgtLuPxlAGjJ+Ae5 zmd?)cf+--s+>-C+6HiYWqJQlGW)I6;R(+ljz?s|2Cuq8IU;NX&zZ8v}((Y29j1OR;oE@a}i zkv!3#>*n!>^Fm#P*ooIe{SKXb2Gm{s1+|t@jz9q|*H9|OVAKuRh-iN`Yc{%=&^9uf z{T*WNqn`CZ5nS1sQlkD6uH`x~4uXHC2XpGG*zoB!-&mWGt9a9d_H(zTb%_P!TnZr` z@kN-69b-mWS%)d~s8CA~eU^*x2=B1u^UiZaf81$)B`s%QBbwFDG!jju$B+2hY()(@ z(sjd0NKHW17DKzPP!D>D!Wqp?;C6_%6D
      Gg;|d{*F*bQD?ii(w!g3AU4UdqE{U z%!uJx7u4sbqrRo3`p=P~4(konzp`b+Qim+^I$mYOI)*u6mV?-xSFNa@vwiTBneE8w z!S8ZNfL+Rb@#`mO0pQ#K-Yf-uLL6BLDa}v5{0A#Dpy>AtJes8z%kH zdlM2!^SpWnh0SEop?R1>k3}X-H+fAITGgUu@-|$rScaWt%DAZnCcWVf)@G_BeUy$= z#v35@x(OnFc2lRVKi(uFwIp(~oZI(c&JViGt^}-xEsqZv6LTq+!UNT-tdDT({yKWB zW_-ly1uG>X6GY^xn;XDaEi>@ADw7+5TgYr`mx#(6`e`KgB5An`?Q=SX}aKb^5jx3s%Xs%F>XlI|$ zwl`SYE?0)}0Aa!x;W(W_y((PBJq+!vo#Lkk!)M@GAW*uchuJakMQ^wukCTb^{_rz= zCd)Z)@z-`h!*8`SP?4@+4%VQ>mfE&YMjFe#MGW$e33Dbrf^H5PvsI3&mQ?T!%SNW^ zE*nmvm0qfbXekF|R2Y7IG7QAL-vC6Oh;&7i`5e!+Ilyzh2Z&tsdy%`66(e0BniokL z^G!8~97n@I9tqGkbIAgi43-72WZ+}P^k3TctCNxxNEWq}tqQxR)t_4g@xW{-y9P7Q z-g(ATxlv)(->|EB@lAqtGynhrgK0xUP)S2WAaHVTW@&6?004NLeUUv#!$2Ix zUsI(b6^CXJ>5!p1Sr8R*lqwd%LTM|s>R@u|7c?;>DK3tJYr(;f#j1mgv#t)Vf*|+- z;^^e0=prTlFDbN$@!+^0@9sVB-T^|h#x$#E9ME*z%p?<1zOW*NUJ-WW*MpM zLJq#;>mC8V-o<&A|G7WMfLgQ|5RiyxnPJ+*>%`NWw!wLySY#DhB|aw}GwFiFk6c$g ze&bwrS>TzXnaj)(i^Nj7i)(H@N2Cnpuf1?S^e3IViXt5(;a2vR|?r6#$aJd5vJsGko zyHb#*P$~iMXY@@4AaV=zuX??;_i_3FzgPU?uj;sFFgkXHTiLCvsf)J5ioL6gwYkdTda%K8GCapjyl!3d^9T zG3`5%JWWXMAl62l%=G8uR}=El(<8&WQojQ_!VLQx4-HD4$B~_0Sh#>ljDqnC$X&?7 zfm#;G(U+;&^ArvDKi%)Ub?P0Tixcvx7m4k^uj3PC&ug+H&0!W!HX$QUhyK;Oc?qqgeGJ%D;UzXi*vP|VCw@%4cxjG0Z4oBfd01Y!=x&T z8u9Y>rc@OQru_k`dIhQ`HQo?4p%>VBU8lI1ky}Y&Zl_Va5$wS>Y@vM^S_yS!iCTXXuJB&$bspAl{z&e|2n(sqS^3xz{liI2$tHHl$4+0L!8Id_Hh)EUa^l { + return new String[]{DIRECTIVE_IF, DIRECTIVE_HAS_SECTION, DIRECTIVE_SECTION_MISSING}; + } + case DIRECTIVE_ENDSECTION, DIRECTIVE_APPEND, DIRECTIVE_STOP, DIRECTIVE_SHOW -> { return new String[]{DIRECTIVE_SECTION}; + } } DirectivesList listClass = new DirectivesList(); for (Directive directiveEl : listClass.getDirectives()){ From 2965760b549154d61ac2d349e6595d77a45dd8be Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Thu, 8 Aug 2024 07:21:49 +0300 Subject: [PATCH 07/43] batch of reviews, first set of unit tests, remove old test base --- php/php.blade/nbproject/project.xml | 57 ++++++++ .../php/blade/csl/elements/ClassElement.java | 4 +- .../php/blade/csl/elements/NamedElement.java | 25 +--- .../php/blade/project/ProjectUtils.java | 3 + .../lexer/BladeLexerTest/content_tag.pass | 5 + .../lexer/BladeLexerTest/escaped_tag.pass | 6 + .../editor/lexer/BladeLexerTest/raw_tag.pass | 5 + .../AntlrColoringLexerTest/content_tag.pass | 6 + .../AntlrColoringLexerTest/escaped_tag.pass | 7 + .../lexer/blade/content_tag.pass | 6 + .../lexer/blade/escaped_tag.pass | 7 + .../lexer/blade/raw_tag.pass | 6 + .../v10/AntlrColoringLexerTest/raw_tag.pass | 6 + .../completion/testCompletion_01.blade.php | 1 + ..._01.blade.php.testCompletion_01.completion | 96 +++++++++++++ .../lexer/blade/content_tag.blade.php | 1 + .../lexer/blade/escaped_tag.blade.php | 3 + .../blade/performance/perf_test_01.blade.php | 66 +++++++++ .../testfiles/lexer/blade/raw_tag.blade.php | 1 + .../parser/performance/perf_test_01.blade.php | 66 +++++++++ .../performance/perf_test_01.blade.php.errors | 0 .../testfiles/parser/smoke/test_01.blade.php | 9 ++ .../unopend/unopend_set_error_01.blade.php | 3 + .../unopend_set_error_01.blade.php.errors | 1 + .../issues/issue61/issue61.blade.php | 6 - .../smoke/content_tag.blade.php | 1 - .../smoke/escaped_tag.blade.php | 3 - .../coloring_lexer/smoke/fragment.blade.php | 7 - .../coloring_lexer/smoke/raw_tag.blade.php | 1 - .../blade/editor/BladeGoldenFileTestBase.java | 57 ++++++++ .../php/blade/editor/BladeTestBase.java | 43 ++++++ .../{syntax/antlr4 => editor}/BladeUtils.java | 18 ++- .../completion/BladeCompletionTest.java} | 14 +- .../lexer/BladeLexerPerformanceTest.java | 63 +++++++++ .../blade/editor/lexer/BladeLexerTest.java | 80 +++++++++++ .../editor/lexer/BladeLexerTestBase.java | 44 ++++++ .../parser/BladeParserErrorTest.java} | 16 +-- .../editor/parser/ParserPerformanceTest.java | 79 +++++++++++ .../BladeAntlrColoringLexerTestBase.java | 125 ----------------- .../antlr4/BladeAntlrLexerTestBase.java | 129 ------------------ .../antlr4/BladeAntlrParserTestBase.java | 110 --------------- .../blade/syntax/antlr4/BladeBaseTest.java | 69 ---------- .../antlr4/v10/AntlrColoringLexerTest.java | 82 +++++++++++ .../syntax/antlr4/v10/AntlrLexerTestBase.java | 44 ++++++ .../BladeAntlrParserTestBase.java} | 21 ++- .../antlr4/v10/BladeAntrlParserTest.java | 65 +++++++++ 46 files changed, 974 insertions(+), 493 deletions(-) create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/content_tag.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_tag.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/raw_tag.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/content_tag.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/escaped_tag.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/content_tag.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/escaped_tag.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/raw_tag.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/raw_tag.pass create mode 100644 php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php.testCompletion_01.completion create mode 100644 php/php.blade/test/unit/data/testfiles/lexer/blade/content_tag.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/lexer/blade/escaped_tag.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/lexer/blade/performance/perf_test_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/lexer/blade/raw_tag.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/parser/performance/perf_test_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/parser/performance/perf_test_01.blade.php.errors create mode 100644 php/php.blade/test/unit/data/testfiles/parser/smoke/test_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors delete mode 100644 php/php.blade/test/unit/src/data/testfiles/coloring_lexer/issues/issue61/issue61.blade.php delete mode 100644 php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/content_tag.blade.php delete mode 100644 php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/escaped_tag.blade.php delete mode 100644 php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/fragment.blade.php delete mode 100644 php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/raw_tag.blade.php create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeGoldenFileTestBase.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeTestBase.java rename php/php.blade/test/unit/src/org/netbeans/modules/php/blade/{syntax/antlr4 => editor}/BladeUtils.java (84%) rename php/php.blade/test/unit/src/org/netbeans/modules/php/blade/{syntax/antlr4/BladeAntrlLexerTest.java => editor/completion/BladeCompletionTest.java} (68%) create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerPerformanceTest.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTestBase.java rename php/php.blade/test/unit/src/org/netbeans/modules/php/blade/{syntax/antlr4/BladeAntrlColoringLexerTest.java => editor/parser/BladeParserErrorTest.java} (69%) create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/ParserPerformanceTest.java delete mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java delete mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java delete mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java delete mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrLexerTestBase.java rename php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/{BladeAntrlParserTest.java => v10/BladeAntlrParserTestBase.java} (65%) create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntrlParserTest.java diff --git a/php/php.blade/nbproject/project.xml b/php/php.blade/nbproject/project.xml index 68d3e31e54b9..3c38a4c6735b 100644 --- a/php/php.blade/nbproject/project.xml +++ b/php/php.blade/nbproject/project.xml @@ -402,6 +402,63 @@ org.netbeans.libs.junit4 + + org.netbeans.modules.csl.api + + + + + + org.netbeans.modules.editor.bracesmatching + + + + + org.netbeans.modules.editor.lib + + + + org.netbeans.modules.editor.mimelookup + + + + + org.netbeans.modules.editor.mimelookup.impl + + + org.netbeans.modules.editor.util + + + + + org.netbeans.modules.lexer + + + + + org.netbeans.modules.lexer.nbbridge + + + + org.netbeans.modules.nbjunit + + + + + org.openide.util.lookup + + + + + org.netbeans.modules.projectapi.nb + + + org.netbeans.modules.parsing.nb + + + org.netbeans.modules.parsing.api + + org.netbeans.modules.nbjunit diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java index 3cd671705db5..5b68135c1577 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java @@ -18,6 +18,7 @@ */ package org.netbeans.modules.php.blade.csl.elements; +import org.netbeans.api.annotations.common.NullAllowed; import org.netbeans.modules.csl.api.ElementKind; import org.openide.filesystems.FileObject; @@ -27,7 +28,8 @@ */ public class ClassElement extends NamedElement { - protected final String namespace; + @NullAllowed + private final String namespace; public ClassElement(String name, FileObject file) { super(name, file, ElementType.PHP_CLASS); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java index b039ab821b89..73b3d40ab1b1 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java @@ -75,28 +75,17 @@ public String getIn() { @Override public ElementKind getKind() { - switch (type) { - case YIELD_ID -> { - return ElementKind.PACKAGE; - } - case STACK_ID -> { - return ElementKind.PACKAGE; - } - case CUSTOM_DIRECTIVE -> { - return ElementKind.METHOD; - } - case PHP_CLASS -> { - return ElementKind.CLASS; - } - default -> { - return ElementKind.FILE; - } - } + return switch (type) { + case YIELD_ID, STACK_ID -> ElementKind.PACKAGE; + case CUSTOM_DIRECTIVE -> ElementKind.METHOD; + case PHP_CLASS -> ElementKind.CLASS; + default -> ElementKind.FILE; + }; } @Override public Set getModifiers() { - return new HashSet<>(); + return Set.of(); } @Override diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java index 773214730f9b..3f23c7382a35 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/ProjectUtils.java @@ -18,6 +18,7 @@ */ package org.netbeans.modules.php.blade.project; +import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.project.Project; import org.netbeans.spi.project.ui.support.ProjectConvertors; import org.openide.filesystems.FileObject; @@ -32,6 +33,7 @@ private ProjectUtils() { } + @CheckForNull public static Project getMainOwner(FileObject file) { Project project = ProjectConvertors.getNonConvertorOwner(file); @@ -42,6 +44,7 @@ public static Project getMainOwner(FileObject file) { return project; } + @CheckForNull public static FileObject getProjectDirectory(FileObject file) { Project project = getMainOwner(file); diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/content_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/content_tag.pass new file mode 100644 index 000000000000..39b810172f0f --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/content_tag.pass @@ -0,0 +1,5 @@ +Token #0 HTML [Hello, ] +Token #1 BLADE_ECHO_DELIMITOR [{{] +Token #2 PHP_BLADE_ECHO_EXPR [ $name ] +Token #3 BLADE_ECHO_DELIMITOR [}}] +Token #4 HTML [.\n] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_tag.pass new file mode 100644 index 000000000000..7f4a5b6cfc2c --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_tag.pass @@ -0,0 +1,6 @@ +Token #0 HTML [

      Laravel

      \n \nHello, ] +Token #1 HTML [@{{] +Token #2 HTML [ name ] +Token #3 HTML [}] +Token #4 HTML [}] +Token #5 HTML [.\n] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/raw_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/raw_tag.pass new file mode 100644 index 000000000000..71ef32ac7c0e --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/raw_tag.pass @@ -0,0 +1,5 @@ +Token #0 HTML [Hello, ] +Token #1 BLADE_ECHO_DELIMITOR [{!!] +Token #2 PHP_BLADE_ECHO_EXPR [ $name ] +Token #3 BLADE_ECHO_DELIMITOR [!!}] +Token #4 HTML [.\n] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/content_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/content_tag.pass new file mode 100644 index 000000000000..2d8358ce0466 --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/content_tag.pass @@ -0,0 +1,6 @@ +Token #6 HTML [[@0,0:6='Hello, ',<6>,1:0]] +Token #5 CONTENT_TAG [[@1,7:8='{{',<5>,1:7]] +Token #3 BLADE_PHP_ECHO_EXPR [[@2,9:15=' $name ',<3>,1:9]] +Token #5 CONTENT_TAG [[@3,16:17='}}',<5>,1:16]] +Token #6 HTML [[@4,18:19='.\n',<6>,1:18]] +Token #-1 EOF [[@5,20:19='',<-1>,2:0]] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/escaped_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/escaped_tag.pass new file mode 100644 index 000000000000..1516d27bfc42 --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/escaped_tag.pass @@ -0,0 +1,7 @@ +Token #7 HTML_TAG [[@0,0:25='

      Laravel

      \n \nHello, ',<7>,1:0]] +Token #6 HTML [[@1,26:28='@{{',<6>,3:7]] +Token #6 HTML [[@2,29:34=' name ',<6>,3:10]] +Token #6 HTML [[@3,35:35='}',<6>,3:16]] +Token #6 HTML [[@4,36:36='}',<6>,3:17]] +Token #6 HTML [[@5,37:38='.\n',<6>,3:18]] +Token #-1 EOF [[@6,39:38='',<-1>,4:0]] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/content_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/content_tag.pass new file mode 100644 index 000000000000..2d8358ce0466 --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/content_tag.pass @@ -0,0 +1,6 @@ +Token #6 HTML [[@0,0:6='Hello, ',<6>,1:0]] +Token #5 CONTENT_TAG [[@1,7:8='{{',<5>,1:7]] +Token #3 BLADE_PHP_ECHO_EXPR [[@2,9:15=' $name ',<3>,1:9]] +Token #5 CONTENT_TAG [[@3,16:17='}}',<5>,1:16]] +Token #6 HTML [[@4,18:19='.\n',<6>,1:18]] +Token #-1 EOF [[@5,20:19='',<-1>,2:0]] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/escaped_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/escaped_tag.pass new file mode 100644 index 000000000000..1516d27bfc42 --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/escaped_tag.pass @@ -0,0 +1,7 @@ +Token #7 HTML_TAG [[@0,0:25='

      Laravel

      \n \nHello, ',<7>,1:0]] +Token #6 HTML [[@1,26:28='@{{',<6>,3:7]] +Token #6 HTML [[@2,29:34=' name ',<6>,3:10]] +Token #6 HTML [[@3,35:35='}',<6>,3:16]] +Token #6 HTML [[@4,36:36='}',<6>,3:17]] +Token #6 HTML [[@5,37:38='.\n',<6>,3:18]] +Token #-1 EOF [[@6,39:38='',<-1>,4:0]] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/raw_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/raw_tag.pass new file mode 100644 index 000000000000..6b9d29e50f18 --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/raw_tag.pass @@ -0,0 +1,6 @@ +Token #6 HTML [[@0,0:6='Hello, ',<6>,1:0]] +Token #4 RAW_TAG [[@1,7:9='{!!',<4>,1:7]] +Token #3 BLADE_PHP_ECHO_EXPR [[@2,10:16=' $name ',<3>,1:10]] +Token #4 RAW_TAG [[@3,17:19='!!}',<4>,1:17]] +Token #6 HTML [[@4,20:21='.\n',<6>,1:20]] +Token #-1 EOF [[@5,22:21='',<-1>,2:0]] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/raw_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/raw_tag.pass new file mode 100644 index 000000000000..6b9d29e50f18 --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/raw_tag.pass @@ -0,0 +1,6 @@ +Token #6 HTML [[@0,0:6='Hello, ',<6>,1:0]] +Token #4 RAW_TAG [[@1,7:9='{!!',<4>,1:7]] +Token #3 BLADE_PHP_ECHO_EXPR [[@2,10:16=' $name ',<3>,1:10]] +Token #4 RAW_TAG [[@3,17:19='!!}',<4>,1:17]] +Token #6 HTML [[@4,20:21='.\n',<6>,1:20]] +Token #-1 EOF [[@5,22:21='',<-1>,2:0]] diff --git a/php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php b/php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php new file mode 100644 index 000000000000..59c227c5c811 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php @@ -0,0 +1 @@ +@ diff --git a/php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php.testCompletion_01.completion b/php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php.testCompletion_01.completion new file mode 100644 index 000000000000..977291474786 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php.testCompletion_01.completion @@ -0,0 +1,96 @@ +Code completion result for source line: +@| +(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true) +CONSTRUCTO @append +CONSTRUCTO @break +CONSTRUCTO @continue +CONSTRUCTO @csrf +CONSTRUCTO @default +CONSTRUCTO @else +CONSTRUCTO @empty v5.4 +CONSTRUCTO @endPushIf +CONSTRUCTO @endfor +CONSTRUCTO @endforeach@endforelse
      @endfragment@endif
      +CONSTRUCTO @endonce +CONSTRUCTO @endprepend@endpush +CONSTRUCTO @endsection@once +CONSTRUCTO @overwrite +CONSTRUCTO @php +CONSTRUCTO @stop +CONSTRUCTO @auth() +CONSTRUCTO @auth() ... @endauth +CONSTRUCTO @can() v5.1 +CONSTRUCTO @can() ... @endcan v5.1 +CONSTRUCTO @canany() v5.8 +CONSTRUCTO @canany() ... @endcanany v5.8 +CONSTRUCTO @cannot() v5.3 +CONSTRUCTO @cannot() ... @endcannot v5.3 +CONSTRUCTO @case() +CONSTRUCTO @checked() v9 +CONSTRUCTO @class() v8 +CONSTRUCTO @dd() +CONSTRUCTO @disabled() v9 +CONSTRUCTO @dump() +CONSTRUCTO @each() +CONSTRUCTO @elseif() +CONSTRUCTO @empty() v5.4 +CONSTRUCTO @empty() ... @endempty v5.4 +CONSTRUCTO @env() +CONSTRUCTO @env() ... @endenv +CONSTRUCTO @error() +CONSTRUCTO @error() ... @enderror +CONSTRUCTO @extends() +CONSTRUCTO @for() +CONSTRUCTO @for() ... @endfor +CONSTRUCTO @foreach() +CONSTRUCTO @foreach() ... @endforeach +CONSTRUCTO @forelse() +CONSTRUCTO @forelse() ... @endforelse +CONSTRUCTO @fragment() +CONSTRUCTO @fragment() ... @endfragment +CONSTRUCTO @guest() +CONSTRUCTO @guest() ... @endguest +CONSTRUCTO @hasSection() +CONSTRUCTO @hasSection() ... @endif +CONSTRUCTO @if() +CONSTRUCTO @if() ... @endif +CONSTRUCTO @include() +CONSTRUCTO @includeFirst() +CONSTRUCTO @includeIf() +CONSTRUCTO @includeUnless() +CONSTRUCTO @includeWhen() +CONSTRUCTO @inject() +CONSTRUCTO @isset() +CONSTRUCTO @isset() ... @endisset +CONSTRUCTO @json() +CONSTRUCTO @lang() +CONSTRUCTO @method() +CONSTRUCTO @php ... @endphp +CONSTRUCTO @prepend() +CONSTRUCTO @prepend() ... @endprepend +CONSTRUCTO @push() +CONSTRUCTO @push() ... @endpush +CONSTRUCTO @pushIf() +CONSTRUCTO @pushIf() ... @endPushIf +CONSTRUCTO @readony() v9 +CONSTRUCTO @required() v9 +CONSTRUCTO @section() +CONSTRUCTO @section() ... @endsection +CONSTRUCTO @sectionMissing() +CONSTRUCTO @sectionMissing() ... @endif +CONSTRUCTO @session() v10 +CONSTRUCTO @session() ... @endsession v10 +CONSTRUCTO @stack() +CONSTRUCTO @style() v9 +CONSTRUCTO @switch() +CONSTRUCTO @switch() ... @endswitch +CONSTRUCTO @unless() +CONSTRUCTO @unless() ... @endunless +CONSTRUCTO @use() +CONSTRUCTO @vite() v11 +CONSTRUCTO @yield() diff --git a/php/php.blade/test/unit/data/testfiles/lexer/blade/content_tag.blade.php b/php/php.blade/test/unit/data/testfiles/lexer/blade/content_tag.blade.php new file mode 100644 index 000000000000..3858bd8c876e --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/lexer/blade/content_tag.blade.php @@ -0,0 +1 @@ +Hello, {{ $name }}. diff --git a/php/php.blade/test/unit/data/testfiles/lexer/blade/escaped_tag.blade.php b/php/php.blade/test/unit/data/testfiles/lexer/blade/escaped_tag.blade.php new file mode 100644 index 000000000000..9516e7ea7e3a --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/lexer/blade/escaped_tag.blade.php @@ -0,0 +1,3 @@ +

      Laravel

      + +Hello, @{{ name }}. diff --git a/php/php.blade/test/unit/data/testfiles/lexer/blade/performance/perf_test_01.blade.php b/php/php.blade/test/unit/data/testfiles/lexer/blade/performance/perf_test_01.blade.php new file mode 100644 index 000000000000..ee323cf41bc7 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/lexer/blade/performance/perf_test_01.blade.php @@ -0,0 +1,66 @@ +@extends('layout.layout') +
      + @if (count($records) === 1) + I have one record! + @elseif (count($records) > 1) + I have multiple records! + @else + I don't have any records! + @endif +
      + +@sectionMissing('navigation') +
      + @include('default-navigation') +
      +@endif + +@for ($i = 0; $i < 10; $i++) + The current value is {{ $i }} +@endfor + +@foreach ($users as $user) +

      This is user {{ $user->id }}

      +@endforeach + +@forelse ($users as $user) +
    1. {{ $user->name }}
    2. +@empty +

      No users

      +@endforelse + +@while (true) +

      I'm looping forever.

      +@endwhile + +@php + $isActive = false; + $hasError = true; +@endphp + + $isActive, + 'text-gray-500' => ! $isActive, + 'bg-red' => $hasError, +])> + + + +
      + @include('shared.errors') + +
      + +
      +
      + +@once + @push('scripts') + + @endpush +@endonce + +@use('App\Models\Flight', 'FlightModel') diff --git a/php/php.blade/test/unit/data/testfiles/lexer/blade/raw_tag.blade.php b/php/php.blade/test/unit/data/testfiles/lexer/blade/raw_tag.blade.php new file mode 100644 index 000000000000..9f9f75fce5bc --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/lexer/blade/raw_tag.blade.php @@ -0,0 +1 @@ +Hello, {!! $name !!}. diff --git a/php/php.blade/test/unit/data/testfiles/parser/performance/perf_test_01.blade.php b/php/php.blade/test/unit/data/testfiles/parser/performance/perf_test_01.blade.php new file mode 100644 index 000000000000..ee323cf41bc7 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/parser/performance/perf_test_01.blade.php @@ -0,0 +1,66 @@ +@extends('layout.layout') +
      + @if (count($records) === 1) + I have one record! + @elseif (count($records) > 1) + I have multiple records! + @else + I don't have any records! + @endif +
      + +@sectionMissing('navigation') +
      + @include('default-navigation') +
      +@endif + +@for ($i = 0; $i < 10; $i++) + The current value is {{ $i }} +@endfor + +@foreach ($users as $user) +

      This is user {{ $user->id }}

      +@endforeach + +@forelse ($users as $user) +
    3. {{ $user->name }}
    4. +@empty +

      No users

      +@endforelse + +@while (true) +

      I'm looping forever.

      +@endwhile + +@php + $isActive = false; + $hasError = true; +@endphp + + $isActive, + 'text-gray-500' => ! $isActive, + 'bg-red' => $hasError, +])> + + + +
      + @include('shared.errors') + +
      + +
      +
      + +@once + @push('scripts') + + @endpush +@endonce + +@use('App\Models\Flight', 'FlightModel') diff --git a/php/php.blade/test/unit/data/testfiles/parser/performance/perf_test_01.blade.php.errors b/php/php.blade/test/unit/data/testfiles/parser/performance/perf_test_01.blade.php.errors new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/php/php.blade/test/unit/data/testfiles/parser/smoke/test_01.blade.php b/php/php.blade/test/unit/data/testfiles/parser/smoke/test_01.blade.php new file mode 100644 index 000000000000..5eff48815e7c --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/parser/smoke/test_01.blade.php @@ -0,0 +1,9 @@ +@extends('layout.layout') + +@section('content') +
      +@endsection + +@php +$value = $var['1'] +@endphp diff --git a/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php b/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php new file mode 100644 index 000000000000..4e4e5c319125 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php @@ -0,0 +1,3 @@ +@if($f) +@endif +@endif diff --git a/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors b/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors new file mode 100644 index 000000000000..118b39ce090f --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors @@ -0,0 +1 @@ +15-15:extraneous input '@endif' expecting {, HTML, '@if', '@else', '@switch', '@case', '@default', '@empty', D_COND_BLOCK_START, '@foreach', '@for', '@forelse', '@while', '@break', D_LOOP_ACTION, '@include', '@includeIf', '@includeWhen', '@includeFirst', '@includeUnless', '@each', '@extends', '@js', '@json', '@section', '@hasSection', '@sectionMissing', '@yield', '@once', '@stack', '@push', '@pushIf', '@prepend', '@props', '@fragment', '@csrf', '@method', '@error', '@production', '@env', D_AUTH_START, D_PERMISSION_START, D_PERMISSION_ELSE, '@class', '@style', D_HTML_ATTR_EXPR, '@aware', '@session', D_DD, '@lang', '@use', '@inject', D_PHP, '@verbatim', D_LIVEWIRE, '@vite', '@viteReactRefresh', D_CUSTOM, D_UNKNOWN_ATTR_ENC, D_UNKNOWN, '{{', '{!!', PHP_INLINE_START, HTML_COMPONENT_PREFIX, HTML_TAG_START, HTML_IDENTIFIER, '='} diff --git a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/issues/issue61/issue61.blade.php b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/issues/issue61/issue61.blade.php deleted file mode 100644 index d195ba0d8de1..000000000000 --- a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/issues/issue61/issue61.blade.php +++ /dev/null @@ -1,6 +0,0 @@ - \ No newline at end of file diff --git a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/content_tag.blade.php b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/content_tag.blade.php deleted file mode 100644 index 16532c33e245..000000000000 --- a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/content_tag.blade.php +++ /dev/null @@ -1 +0,0 @@ -Hello, {{ $name }}. \ No newline at end of file diff --git a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/escaped_tag.blade.php b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/escaped_tag.blade.php deleted file mode 100644 index 56c97d5369a5..000000000000 --- a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/escaped_tag.blade.php +++ /dev/null @@ -1,3 +0,0 @@ -

      Laravel

      - -Hello, @{{ name }}. \ No newline at end of file diff --git a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/fragment.blade.php b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/fragment.blade.php deleted file mode 100644 index c52c3f531d8e..000000000000 --- a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/fragment.blade.php +++ /dev/null @@ -1,7 +0,0 @@ -@fragment('user-list') -
        - @foreach ($users as $user) -
      • {{ $user->name }}
      • - @endforeach -
      -@endfragment \ No newline at end of file diff --git a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/raw_tag.blade.php b/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/raw_tag.blade.php deleted file mode 100644 index 4099847299d0..000000000000 --- a/php/php.blade/test/unit/src/data/testfiles/coloring_lexer/smoke/raw_tag.blade.php +++ /dev/null @@ -1 +0,0 @@ -Hello, {!! $name !!}. \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeGoldenFileTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeGoldenFileTestBase.java new file mode 100644 index 000000000000..793227b8c91e --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeGoldenFileTestBase.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import java.io.File; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; + +/** + * + * @author bogdan + */ +public abstract class BladeGoldenFileTestBase extends BladeTestBase { + + public BladeGoldenFileTestBase(String testName) { + super(testName); + } + + protected abstract String getTestResult(String filename) throws Exception; + + protected void performTest(String filename) throws Exception { + // parse the file + String result = getTestResult(filename); + String fullClassName = this.getClass().getName(); + String goldenFileDir = fullClassName.replace('.', '/'); + // try to find golden file + String goldenFolder = getDataSourceDir().getAbsolutePath() + "/goldenfiles/" + goldenFileDir + "/"; + File goldenFile = new File(goldenFolder + filename + ".pass"); + if (!goldenFile.exists()) { + // if doesn't exist, create it + FileObject goldenFO = touch(goldenFolder, filename + ".pass"); + copyStringToFileObject(goldenFO, result); + } else { + // if exist, compare it. + goldenFile = getGoldenFile(filename + ".pass"); + FileObject resultFO = touch(getWorkDir(), filename + ".result"); + copyStringToFileObject(resultFO, result); + assertFile(FileUtil.toFile(resultFO), goldenFile, getWorkDir()); + } + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeTestBase.java new file mode 100644 index 000000000000..eb069a45f111 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeTestBase.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import org.netbeans.modules.csl.api.test.CslTestBase; +import org.netbeans.modules.csl.spi.DefaultLanguageConfig; + +/** + * + * @author bogdan + */ +public abstract class BladeTestBase extends CslTestBase { + + public BladeTestBase(String testName) { + super(testName); + } + + @Override + protected DefaultLanguageConfig getPreferredLanguage() { + return new BladeLanguage(); + } + + @Override + protected String getPreferredMimeType() { + return BladeLanguage.MIME_TYPE; + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeUtils.java similarity index 84% rename from php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java rename to php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeUtils.java index a33a082e1d53..806a193a82f6 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeUtils.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeUtils.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.netbeans.modules.php.blade.syntax.antlr4; +package org.netbeans.modules.php.blade.editor; import java.io.BufferedReader; import java.io.File; @@ -31,11 +31,15 @@ * * @author bhaidu */ -public class BladeUtils { +public final class BladeUtils { + + private BladeUtils() { + + } public static String getFileContent(File file) throws Exception { StringBuffer sb = new StringBuffer(); - String lineSep = "\n";//NOI18N + String lineSep = "\n"; BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); String line = br.readLine(); while (line != null) { @@ -70,4 +74,12 @@ public static CommonTokenStream getFormatTokenStream(String content) { tokens.fill(); return tokens; } + + public static String replaceLinesAndTabs(String input) { + String escapedString = input; + escapedString = escapedString.replaceAll("\n", "\\\\n"); //NOI18N + escapedString = escapedString.replaceAll("\r", "\\\\r"); //NOI18N + escapedString = escapedString.replaceAll("\t", "\\\\t"); //NOI18N + return escapedString; + } } diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionTest.java similarity index 68% rename from php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java rename to php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionTest.java index 4ad3b7ed21c0..364729eb19fd 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlLexerTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionTest.java @@ -16,19 +16,21 @@ * specific language governing permissions and limitations * under the License. */ -package org.netbeans.modules.php.blade.syntax.antlr4; +package org.netbeans.modules.php.blade.editor.completion; -import org.junit.Test; +import org.netbeans.modules.php.blade.editor.BladeTestBase; /** * - * @author bhaidu + * @author bogdan */ -public class BladeAntrlLexerTest extends BladeAntlrLexerTestBase { +public class BladeCompletionTest extends BladeTestBase { - public BladeAntrlLexerTest(String testName) { + public BladeCompletionTest(String testName) { super(testName); } - + public void testCompletion_01() throws Exception { + checkCompletion("testfiles/completion/testCompletion_01.blade.php", "@^", false); + } } diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerPerformanceTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerPerformanceTest.java new file mode 100644 index 000000000000..81e187df6ab8 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerPerformanceTest.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.lexer; + +import java.io.File; +import java.util.Date; +import org.netbeans.modules.php.blade.editor.BladeTestBase; +import org.netbeans.api.lexer.TokenHierarchy; +import org.netbeans.api.lexer.Language; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.modules.php.blade.editor.BladeUtils; + +/** + * + * @author bogdan + */ +public class BladeLexerPerformanceTest extends BladeTestBase { + + public BladeLexerPerformanceTest(String testName) { + super(testName); + } + + public void testFile_01() throws Exception { + testFile("perf_test_01"); + } + + private void testFile(String filename) throws Exception { + Date start = new Date(); + File testFile = new File(getDataDir(), "testfiles/lexer/blade/performance/" + filename + ".blade.php"); + String content = BladeUtils.getFileContent(testFile); + BladeLanguage lang = new BladeLanguage(); + Language language = lang.getLexerLanguage(); + TokenHierarchy.create(content, language); + Date end = new Date(); + long time = end.getTime() - start.getTime(); + long fileSize = testFile.getTotalSpace() / 1024; + String output = String.format( + "Parsing of file(%s: %sKB) takes: %sms", + testFile.getName(), + fileSize, + time + ); +// + System.out.println(output); + assertTrue(time < 200); + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest.java new file mode 100644 index 000000000000..a58a52384c8e --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.lexer; + +import java.io.File; +import org.netbeans.api.lexer.TokenHierarchy; +import org.netbeans.api.lexer.Language; +import org.netbeans.api.lexer.TokenSequence; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.modules.php.blade.editor.BladeUtils; + +/** + * + * @author bogdan + */ +public class BladeLexerTest extends BladeLexerTestBase { + + public BladeLexerTest(String testName) { + super(testName); + } + + public void testRawTag_01() throws Exception { + performTest("raw_tag"); + } + + public void testContentTag_01() throws Exception { + performTest("content_tag"); + } + + public void testEscapedTag_01() throws Exception { + performTest("escaped_tag"); + } + + @Override + protected String getTestResult(String filename) throws Exception { + String content = BladeUtils.getFileContent(new File(getDataDir(), "testfiles/lexer/blade/" + filename + ".blade.php")); + BladeLanguage lang = new BladeLanguage(); + Language language = lang.getLexerLanguage(); + TokenHierarchy hierarchy = TokenHierarchy.create(content, language); + return createResult(hierarchy.tokenSequence(language)); + } + + private String createResult(TokenSequence ts) throws Exception { + StringBuilder result = new StringBuilder(); + while (ts.moveNext()) { + BladeTokenId tokenId = ts.token().id(); + CharSequence text = ts.token().text(); + result.append("Token #"); + result.append(ts.index()); + result.append(" "); + result.append(tokenId.name()); + String token = BladeUtils.replaceLinesAndTabs(text.toString()); + if (!token.isEmpty()) { + result.append(" "); + result.append("["); + result.append(token); + result.append("]"); + } + result.append("\n"); + } + + return result.toString(); + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTestBase.java new file mode 100644 index 000000000000..953c650fce66 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTestBase.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.lexer; + +import org.netbeans.modules.php.blade.editor.BladeGoldenFileTestBase; + +/** + * + * @author bogdan + */ +public abstract class BladeLexerTestBase extends BladeGoldenFileTestBase { + + public BladeLexerTestBase(String testName) { + super(testName); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + clearWorkDir(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/BladeParserErrorTest.java similarity index 69% rename from php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java rename to php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/BladeParserErrorTest.java index 885de18ce54f..3fa71b9fbc8b 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlColoringLexerTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/BladeParserErrorTest.java @@ -16,23 +16,21 @@ * specific language governing permissions and limitations * under the License. */ -package org.netbeans.modules.php.blade.syntax.antlr4; +package org.netbeans.modules.php.blade.editor.parser; -import org.junit.Test; +import org.netbeans.modules.php.blade.editor.BladeTestBase; /** * - * @author bhaidu + * @author bogdan */ -public class BladeAntrlColoringLexerTest extends BladeAntlrColoringLexerTestBase { +public class BladeParserErrorTest extends BladeTestBase { - public BladeAntrlColoringLexerTest(String testName) { + public BladeParserErrorTest(String testName) { super(testName); } - @Test - public void test_smoke_content_tag() throws Exception { - performTest("coloring_lexer/smoke/content_tag.blade.php"); + public void testUnopendSetError_01() throws Exception { + checkErrors("testfiles/parser/unopend/unopend_set_error_01.blade.php"); } - } diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/ParserPerformanceTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/ParserPerformanceTest.java new file mode 100644 index 000000000000..bfe1b0c2712a --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/ParserPerformanceTest.java @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.parser; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import static junit.framework.TestCase.assertNotNull; +import static junit.framework.TestCase.assertTrue; +import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.modules.parsing.api.ParserManager; +import org.netbeans.modules.parsing.api.ResultIterator; +import org.netbeans.modules.parsing.api.Source; +import org.netbeans.modules.parsing.api.UserTask; +import org.netbeans.modules.parsing.spi.Parser; +import org.netbeans.modules.php.blade.editor.BladeTestBase; + +/** + * + * @author bogdan + */ +public class ParserPerformanceTest extends BladeTestBase { + + public ParserPerformanceTest(String testName) { + super(testName); + } + + public void testFile_01() throws Exception { + testFile("testfiles/parser/performance/perf_test_01.blade.php"); // 1.01MB + } + + private void testFile(String filePath) throws Exception { + Source testSource = getTestSource(getTestFile(filePath)); + + Date start = new Date(); + ParserManager.parse(Collections.singleton(testSource), new UserTask() { + public @Override + void run(ResultIterator resultIterator) throws Exception { + Parser.Result r = resultIterator.getParserResult(); + assertNotNull(r); + assertTrue(r instanceof ParserResult); + + ParserResult pr = (ParserResult) r; + List diagnostics = pr.getDiagnostics(); + String annotatedSource = annotateErrors(diagnostics); + assertDescriptionMatches(filePath, annotatedSource, false, ".errors"); + } + }); + Date end = new Date(); + + long time = end.getTime() - start.getTime(); + long fileSize = testSource.getFileObject().getSize() / 1024; + String output = String.format( + "Parsing of file(%s: %sKB) takes: %sms", + testSource.getFileObject().getName(), + fileSize, + time + ); +// + System.out.println(output); + assertTrue(time < 500); + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java deleted file mode 100644 index 0b99deee6f93..000000000000 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrColoringLexerTestBase.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.syntax.antlr4; - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import org.antlr.v4.runtime.CommonTokenStream; -import org.antlr.v4.runtime.Token; -import org.netbeans.junit.NbTestCase; -import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrColoringLexer.*; -import org.openide.filesystems.FileObject; -import org.openide.filesystems.FileUtil; - -/** - * - * @author bhaidu - */ -public class BladeAntlrColoringLexerTestBase extends BladeBaseTest { - - public BladeAntlrColoringLexerTestBase(String testName) { - super(testName); - } - - public static final FileObject copyStringToFileObject(FileObject fo, String content) throws IOException { - OutputStream os = fo.getOutputStream(); - try { - InputStream is = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8)); - try { - FileUtil.copy(is, os); - return fo; - } finally { - is.close(); - } - } finally { - os.close(); - } - } - - protected void performTest(String filename) throws Exception { - String result = getTestResult(filename); - String goldenFolder = getDataDir() + "/goldenfiles/"; - File goldenFile = new File(goldenFolder + filename + ".pass"); - if (!goldenFile.exists()) { - FileObject goldenFO = touch(goldenFolder, filename + ".pass"); - copyStringToFileObject(goldenFO, result); - } else { - // if exist, compare it. - FileObject resultFO = touch(getWorkDir(), filename + ".result"); - copyStringToFileObject(resultFO, result); - assertFile(FileUtil.toFile(resultFO), goldenFile, getWorkDir()); - } - } - - protected String getTestResult(String filename) throws Exception { - String content = BladeUtils.getFileContent(new File(getDataDir(), "testfiles/" + filename)); - CommonTokenStream tokenStream = BladeUtils.getColoringTokenStream(content); - System.out.print("\n---Lexer scan for <<" + filename + ">>\n\n"); - return createResult(tokenStream); - } - - protected String createResult(CommonTokenStream tokenStream) throws Exception { - StringBuilder result = new StringBuilder(); - - for (Token token : tokenStream.getTokens()) { - switch (token.getType()) { - case HTML: - result.append("HTML "); - break; - case RAW_TAG: - result.append("RAW_TAG "); - break; - case PHP_EXPRESSION: - result.append("PHP_EXPRESSION "); - break; - case BLADE_PHP_ECHO_EXPR: - result.append("PHP_BLADE_ECHO_EXPR "); - break; - case BLADE_PHP_INLINE: - result.append("BLADE_PHP_INLINE "); - break; - default: - result.append(token.getType()); - result.append(" "); - break; - } - - String text = replaceLinesAndTabs(token.getText()); - result.append(text); - result.append(";"); - result.append("\n"); - } - - return result.toString(); - } - - public static String replaceLinesAndTabs(String input) { - String escapedString = input; - escapedString = escapedString.replaceAll("\n", "\\\\n"); //NOI18N - escapedString = escapedString.replaceAll("\r", "\\\\r"); //NOI18N - escapedString = escapedString.replaceAll("\t", "\\\\t"); //NOI18N - return escapedString; - } -} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java deleted file mode 100644 index bdef2ab6bb9b..000000000000 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrLexerTestBase.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.syntax.antlr4; - -import java.io.File; -import java.net.URISyntaxException; -import java.net.URL; -import org.antlr.v4.runtime.CommonTokenStream; -import org.antlr.v4.runtime.Token; -import org.netbeans.junit.NbTestCase; -import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; - -/** - * - * @author bhaidu - */ -public class BladeAntlrLexerTestBase extends NbTestCase { - - public BladeAntlrLexerTestBase(String testName) { - super(testName); - } - - public File getDataDir() { - URL codebase = getClass().getProtectionDomain().getCodeSource().getLocation(); - File dataDir = null; - try { - dataDir = new File(new File(codebase.toURI()), "data"); - } catch (URISyntaxException x) { - throw new Error(x); - } - return dataDir; - } - - protected void performTest(String filename) throws Exception { - performTest(filename, null); - } - - protected String getTestResult(String filename, String caretLine) throws Exception { - return getTestResult(filename); - } - - protected void performTest(String filename, String caretLine) throws Exception { - // parse the file - String result = getTestResult(filename, caretLine); - System.out.print(result); - } - - protected String getTestResult(String filename) throws Exception { - String content = BladeUtils.getFileContent(new File(getDataDir(), "testfiles/" + filename)); - CommonTokenStream tokenStream = BladeUtils.getTokenStream(content); - System.out.print("\n---Lexer scan for <<" + filename + ">>\n\n"); - return createResult(tokenStream); - } - - protected String createResult(CommonTokenStream tokenStream) throws Exception { - StringBuilder result = new StringBuilder(); - - for (Token token : tokenStream.getTokens()) { - int channel = token.getChannel(); - switch (token.getType()) { - case BL_PARAM_STRING: - result.append("BL_PARAM_STRING "); - break; - case BL_NAME_STRING: - result.append("BL_NAME_STRING "); - break; - case BL_COMMA: - result.append("BL_COMMA "); - break; - case BL_PARAM_COMMA: - result.append("BL_PARAM_COMMA "); - break; - case BLADE_PARAM_LPAREN: - result.append("BLADE_PARAM_LPAREN "); - break; - case BLADE_PARAM_RPAREN: - result.append("BLADE_PARAM_RPAREN "); - break; - case BLADE_PARAM_EXTRA: - result.append("BLADE_PARAM_EXTRA "); - break; - case D_VERBATIM: - result.append("D_VERBATIM "); - break; - case D_ENDVERBATIM: - result.append("D_ENDVERBATIM "); - break; - case HTML: - result.append("HTML "); - break; - default: - result.append(token.getType()); - result.append(" "); - break; - } - - String text = replaceLinesAndTabs(token.getText()); - result.append(text); - result.append(";"); - result.append("\n"); - } - - return result.toString(); - } - - public static String replaceLinesAndTabs(String input) { - String escapedString = input; - escapedString = escapedString.replaceAll("\n", "\\\\n"); //NOI18N - escapedString = escapedString.replaceAll("\r", "\\\\r"); //NOI18N - escapedString = escapedString.replaceAll("\t", "\\\\t"); //NOI18N - return escapedString; - } -} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java deleted file mode 100644 index 13923a4bf3f6..000000000000 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntlrParserTestBase.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.syntax.antlr4; - -import java.io.File; -import java.net.URISyntaxException; -import java.net.URL; -import org.antlr.v4.runtime.CommonTokenStream; -import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.tree.ParseTreeListener; -import org.netbeans.junit.NbTestCase; -import org.netbeans.modules.php.blade.editor.parser.ParsingUtils; -import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser; -import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParserBaseListener; - -/** - * - * @author bhaidu - */ -public class BladeAntlrParserTestBase extends NbTestCase { - - public BladeAntlrParserTestBase(String testName) { - super(testName); - } - - public File getDataDir() { - URL codebase = getClass().getProtectionDomain().getCodeSource().getLocation(); - File dataDir = null; - try { - dataDir = new File(new File(codebase.toURI()), "data"); - } catch (URISyntaxException x) { - throw new Error(x); - } - return dataDir; - } - - protected void performTest(String filename) throws Exception { - performTest(filename, null); - } - - protected String getTestResult(String filename, String caretLine) throws Exception { - return getTestResult(filename); - } - - protected void performTest(String filename, String caretLine) throws Exception { - // parse the file - String result = getTestResult(filename, caretLine); - System.out.print(result); - } - - protected String getTestResult(String filename) throws Exception { - String content = BladeUtils.getFileContent(new File(getDataDir(), "testfiles/" + filename)); - ParsingUtils parsingUtils = new ParsingUtils(); - parsingUtils.parsePhpText(content); - CommonTokenStream tokenStream = BladeUtils.getTokenStream(content); - System.out.print("\n---Psrser scan for <<" + filename + ">>\n\n"); - BladeAntlrParser parser = new BladeAntlrParser(tokenStream); - ParseTreeListener listener = new BladeAntlrParserBaseListener(){ - - }; - parser.addParseListener(listener); - parser.file(); - System.out.println(parser.getBuildParseTree()); - - return createResult(tokenStream); - } - - protected String createResult(CommonTokenStream tokenStream) throws Exception { - StringBuilder result = new StringBuilder(); - - for (Token token : tokenStream.getTokens()) { - switch (token.getType()) { -// case BLADE_ESCAPED_CONTENT: -// result.append("BLADE_ESCAPED_CONTENT "); -// break; - } - - String text = replaceLinesAndTabs(token.getText()); - result.append(text); - result.append(";"); - result.append("\n"); - } - - return result.toString(); - } - - public static String replaceLinesAndTabs(String input) { - String escapedString = input; - escapedString = escapedString.replaceAll("\n", "\\\\n"); //NOI18N - escapedString = escapedString.replaceAll("\r", "\\\\r"); //NOI18N - escapedString = escapedString.replaceAll("\t", "\\\\t"); //NOI18N - return escapedString; - } -} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java deleted file mode 100644 index 0cbd29122d83..000000000000 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeBaseTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.syntax.antlr4; - -import java.io.File; -import java.io.IOException; -import java.net.URISyntaxException; -import java.net.URL; -import static junit.framework.TestCase.assertTrue; -import org.netbeans.junit.NbTestCase; -import org.openide.filesystems.FileObject; -import org.openide.filesystems.FileUtil; - -/** - * - * @author bhaidu - */ -public abstract class BladeBaseTest extends NbTestCase { - - public BladeBaseTest(String testName) { - super(testName); - } - - protected FileObject touch(final FileObject dir, final String path) throws IOException { - return FileUtil.createData(dir, path); - } - - public File getDataDir() { - URL codebase = getClass().getProtectionDomain().getCodeSource().getLocation(); - File dataDir = null; - try { - dataDir = new File(new File(codebase.toURI()), "data"); - } catch (URISyntaxException x) { - throw new Error(x); - } - return dataDir; - } - - - protected FileObject touch(final String dir, final String path) throws IOException { - return touch(new File(dir), path); - } - - protected FileObject touch(final File dir, final String path) throws IOException { - if (!dir.isDirectory()) { - assertTrue("success to create " + dir, dir.mkdirs()); - } - FileObject dirFO = FileUtil.toFileObject(FileUtil.normalizeFile(dir)); - return touch(dirFO, path); - } - - abstract protected String getTestResult(String filename) throws Exception; -} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest.java new file mode 100644 index 000000000000..cd646c7abfb1 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +import java.io.File; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.Vocabulary; +import org.netbeans.modules.php.blade.editor.BladeUtils; + +/** + * + * @author bogdan + */ +public class AntlrColoringLexerTest extends AntlrLexerTestBase { + + public AntlrColoringLexerTest(String testName) { + super(testName); + } + + public void testRawTag_01() throws Exception { + performTest("lexer/blade/raw_tag"); + } + + public void testContentTag_01() throws Exception { + performTest("lexer/blade/content_tag"); + } + + public void testEscapedTag_01() throws Exception { + performTest("lexer/blade/escaped_tag"); + } + + @Override + protected String getTestResult(String filename) throws Exception { + String content = BladeUtils.getFileContent(new File(getDataDir(), "testfiles/" + filename + ".blade.php")); + CharStream stream = CharStreams.fromString(content); + BladeAntlrColoringLexer lexer = new BladeAntlrColoringLexer(stream); + CommonTokenStream tokens = new CommonTokenStream(lexer); + tokens.fill(); + return createResult(tokens, lexer.getVocabulary()); + } + + private String createResult(CommonTokenStream tokenStream, Vocabulary vocabulary) throws Exception { + StringBuilder result = new StringBuilder(); + for (Token token : tokenStream.getTokens()) { + int tokenId = token.getType(); + String text = token.getText(); + result.append("Token #"); + result.append(tokenId); + result.append(" "); + result.append(vocabulary.getDisplayName(tokenId)); + String tokenText = BladeUtils.replaceLinesAndTabs(text); + if (!tokenText.isEmpty()) { + result.append(" "); + result.append("["); + result.append(token); + result.append("]"); + } + result.append("\n"); + } + + return result.toString(); + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrLexerTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrLexerTestBase.java new file mode 100644 index 000000000000..573944a71e6f --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrLexerTestBase.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +import org.netbeans.modules.php.blade.editor.BladeGoldenFileTestBase; + +/** + * + * @author bogdan + */ +public abstract class AntlrLexerTestBase extends BladeGoldenFileTestBase { + + public AntlrLexerTestBase(String testName) { + super(testName); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + clearWorkDir(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserTestBase.java similarity index 65% rename from php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java rename to php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserTestBase.java index 1b9e8a885891..0b61ba9ed8fd 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/BladeAntrlParserTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserTestBase.java @@ -16,18 +16,29 @@ * specific language governing permissions and limitations * under the License. */ -package org.netbeans.modules.php.blade.syntax.antlr4; +package org.netbeans.modules.php.blade.syntax.antlr4.v10; -import org.junit.Test; +import org.netbeans.modules.php.blade.editor.BladeTestBase; /** * * @author bhaidu */ -public class BladeAntrlParserTest extends BladeAntlrParserTestBase { +public abstract class BladeAntlrParserTestBase extends BladeTestBase { - public BladeAntrlParserTest(String testName) { + public BladeAntlrParserTestBase(String testName) { super(testName); } -} + @Override + protected void setUp() throws Exception { + super.setUp(); + clearWorkDir(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + +} \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntrlParserTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntrlParserTest.java new file mode 100644 index 000000000000..09a48461b4bd --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntrlParserTest.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax.antlr4.v10; + +import java.io.File; +import java.util.Date; +import static junit.framework.TestCase.assertTrue; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; + +/** + * + * @author bhaidu + */ +public class BladeAntrlParserTest extends BladeAntlrParserTestBase { + + public BladeAntrlParserTest(String testName) { + super(testName); + } + + public void testSmokeFile_01() throws Exception { + testFile("smoke/test_01"); + } + + private void testFile(String filename) throws Exception { + Date start = new Date(); + File testFile = new File(getDataDir(), "testfiles/parser/" + filename + ".blade.php"); + String content = org.netbeans.modules.php.blade.editor.BladeUtils.getFileContent(testFile); + CharStream stream = CharStreams.fromString(content); + BladeAntlrLexer lexer = new BladeAntlrLexer(stream); + CommonTokenStream tokens = new CommonTokenStream(lexer); + BladeAntlrParser parser = new BladeAntlrParser(tokens); + parser.setBuildParseTree(false); + parser.file(); + Date end = new Date(); + long time = end.getTime() - start.getTime(); + long fileSize = testFile.getTotalSpace() / 1024; + String output = String.format( + "Parsing of file(%s: %sKB) takes: %sms", + testFile.getName(), + fileSize, + time + ); +// + System.out.println(output); + assertTrue(time < 200); + } +} From 495cc29ebb85066e8f44e899534e9c02a23228c5 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Mon, 12 Aug 2024 07:42:32 +0300 Subject: [PATCH 08/43] batch of reviews changes //NOI18N for strings, permission refactoring, switch statement refactor --- .../php/blade/csl/elements/ClassElement.java | 2 + .../php/blade/csl/elements/NamedElement.java | 6 +-- .../csl/elements/PhpFunctionElement.java | 8 +-- .../php/blade/csl/elements/TagElement.java | 2 +- .../php/blade/editor/BladeBracesMatcher.java | 25 +++++----- .../php/blade/editor/BladeCommentHandler.java | 16 +++--- .../blade/editor/BladeDeclarationFinder.java | 47 +++++++++--------- .../php/blade/editor/BladeLanguage.java | 11 ----- .../blade/editor/BladeSemanticAnalyzer.java | 5 -- .../modules/php/blade/editor/EditorUtils.java | 4 +- .../blade/editor/HyperlinkProviderImpl.java | 49 ++++++++++--------- .../php/blade/editor/ResourceUtilities.java | 2 +- .../ComponentsCompletionService.java | 40 +++++++-------- .../components/annotation/Namespace.java | 2 +- .../blade/project/BladeProjectProperties.java | 13 ++--- .../blade/project/BladeProjectSupport.java | 9 +--- .../php/blade/project/ComponentsSupport.java | 8 +-- .../modules/php/blade/editor/BladeUtils.java | 6 +-- 18 files changed, 121 insertions(+), 134 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java index 5b68135c1577..d86cfc87b880 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java @@ -18,6 +18,7 @@ */ package org.netbeans.modules.php.blade.csl.elements; +import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.annotations.common.NullAllowed; import org.netbeans.modules.csl.api.ElementKind; import org.openide.filesystems.FileObject; @@ -47,6 +48,7 @@ public ElementKind getKind() { return ElementKind.CLASS; } + @CheckForNull public String getNamespace() { return namespace; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java index 73b3d40ab1b1..2e4dc2484fb0 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java @@ -37,9 +37,9 @@ */ public class NamedElement implements ElementHandle { - protected final String name; - protected final FileObject file; - protected final ElementType type; + private final String name; + private final FileObject file; + private final ElementType type; public NamedElement(String name, FileObject file) { this.name = name; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java index 0555a9898996..c715c2fcc0d1 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java @@ -19,6 +19,7 @@ package org.netbeans.modules.php.blade.csl.elements; import java.util.List; +import org.netbeans.api.annotations.common.NullAllowed; import org.netbeans.modules.csl.api.ElementKind; import org.openide.filesystems.FileObject; @@ -28,6 +29,7 @@ */ public class PhpFunctionElement extends NamedElement { + @NullAllowed public final String namespace; private final List params; @@ -37,7 +39,7 @@ public PhpFunctionElement(String name, FileObject file, List params) { super(name, file, type); this.namespace = namespace; - this.params = params; + this.params = List.copyOf(params); } public PhpFunctionElement(String name, FileObject file, @@ -45,7 +47,7 @@ public PhpFunctionElement(String name, FileObject file, List params) { super(name, file, type); this.namespace = null; - this.params = params; + this.params = List.copyOf(params); } @Override @@ -55,7 +57,7 @@ public ElementKind getKind() { public String getParamsAsString() { if (params == null || params.isEmpty()) { - return "()"; + return "()"; // NOI18N } return "(" + String.join(", ", params) + ")"; // NOI18N } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java index 522b3796e436..63bab6ec475e 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java @@ -69,7 +69,7 @@ public ElementKind getKind() { @Override public Set getModifiers() { - return new HashSet<>(); + return Set.of(); } @Override diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java index a772fa38abd7..785185316ca8 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -23,6 +23,7 @@ import java.util.List; import javax.swing.text.BadLocationException; import org.antlr.v4.runtime.Token; +import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.annotations.common.NonNull; import org.netbeans.api.editor.mimelookup.MimeRegistration; import org.netbeans.editor.BaseDocument; @@ -44,11 +45,11 @@ public class BladeBracesMatcher implements BracesMatcher { public enum BraceDirectionType { - END_TO_START, START_TO_END, CUSTOM_START_TO_END, CURLY_END_TO_START, CURLY_START_TO_END, STOP - } + END_TO_START, START_TO_END, CUSTOM_START_TO_END, CURLY_END_TO_START, CURLY_START_TO_END, STOP, NONE + }; private final MatcherContext context; private Token originToken; - private BraceDirectionType currentDirection; + private BraceDirectionType currentDirection = BraceDirectionType.NONE; private BladeBracesMatcher(MatcherContext context) { this.context = context; @@ -102,6 +103,7 @@ public int[] findMatches() throws InterruptedException, BadLocationException { if (originToken == null) { return null; } + String tokenText = originToken.getText(); return switch (currentDirection) { @@ -121,7 +123,7 @@ private static boolean shouldLookForBraceMatch(@NonNull Token currentToken) { }; } - public BraceDirectionType findBraceDirectionType(String tokenText, Token token) { + private BraceDirectionType findBraceDirectionType(String tokenText, Token token) { boolean isCloseTag = Arrays.asList(BladeTagsUtils.outputCloseTags()).indexOf(tokenText) >= 0; if (isCloseTag) { @@ -143,7 +145,6 @@ public BraceDirectionType findBraceDirectionType(String tokenText, Token token) return BraceDirectionType.START_TO_END; } - //TODO get more directive context if (token.getType() == BladeAntlrLexer.D_CUSTOM || token.getType() == BladeAntlrLexer.D_UNKNOWN) { return BraceDirectionType.CUSTOM_START_TO_END; @@ -152,7 +153,7 @@ public BraceDirectionType findBraceDirectionType(String tokenText, Token token) return BraceDirectionType.STOP; } - public int[] findOpenTag() { + private int[] findOpenTag() { int matchTokenType = BladeAntlrUtils.getTagPairTokenType(originToken.getType()); List skipableTokenTypes = new ArrayList<>(); skipableTokenTypes.add(HTML); @@ -188,7 +189,8 @@ public int[] findCloseTag() { return null; } - public int[] findDirectiveEnd(String directive) { + @CheckForNull + private int[] findDirectiveEnd(String directive) { String[] pair = BladeDirectivesUtils.directiveStart2EndPair(directive); if (pair == null){ return null; @@ -210,7 +212,6 @@ public int[] findDirectiveEnd(String directive) { startDirectiveForBalance); if (endToken != null) { - //String text = endToken.getText(); int start = endToken.getStartIndex(); int end = endToken.getStopIndex(); return new int[]{start, end + 1}; @@ -219,8 +220,9 @@ public int[] findDirectiveEnd(String directive) { return null; } - public int[] findCustomDirectiveEnd(String directive) { - String endPrefix = "@end"; // NOI18N + @CheckForNull + private int[] findCustomDirectiveEnd(String directive) { + String endPrefix = BladeDirectivesUtils.END_DIRECTIVE_PREFIX; String[] pair = new String[]{endPrefix + directive.substring(1)}; List stopDirectives = Arrays.asList(pair); List startDirectiveForBalance = Arrays.asList(new String[]{directive}); @@ -239,7 +241,8 @@ public int[] findCustomDirectiveEnd(String directive) { return null; } - public int[] findOriginForDirectiveEnd(String directive) { + @CheckForNull + private int[] findOriginForDirectiveEnd(String directive) { String[] pair = BladeDirectivesUtils.directiveEnd2StartPair(directive); List endDirectivesForBalance = new ArrayList<>(); List openDirectives = Arrays.asList(pair); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java index 388f71f475d4..dc3964efc9f6 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java @@ -18,6 +18,7 @@ */ package org.netbeans.modules.php.blade.editor; +import java.util.logging.Logger; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import org.netbeans.api.lexer.Token; @@ -39,6 +40,8 @@ public class BladeCommentHandler extends CommentHandler.DefaultCommentHandler { private static final String COMMENT_START_DELIMITER = "{{--"; //NOI18N private static final String COMMENT_END_DELIMITER = "--}}"; //NOI18N + + private static final Logger LOGGER = Logger.getLogger(BladeCommentHandler.class.getName()); @Override public String getCommentStartDelimiter() { @@ -69,7 +72,7 @@ public void run() { if (token != null && token.id() instanceof BladeTokenId) { //handle uncomment switch ((BladeTokenId) token.id()) { - case BLADE_COMMENT_START: + case BLADE_COMMENT_START -> { bounds[0] = ts.offset(); while (ts.moveNext()) { @@ -78,12 +81,11 @@ public void run() { break; } } - break; - case BLADE_DIRECTIVE: + } + case BLADE_DIRECTIVE -> { bounds[0] = ts.offset(); - ts.moveNext(); - if (ts.token().id() == BladeTokenId.PHP_BLADE_EXPRESSION) { + if (ts.moveNext() && ts.token().id() == BladeTokenId.PHP_BLADE_EXPRESSION) { bounds[1] = ts.offset() + ts.token().length(); } @@ -94,9 +96,9 @@ public void run() { bounds[0] = 0; bounds[1] = 0; } catch (BadLocationException ex) { - Exceptions.printStackTrace(ex); + LOGGER.warning(ex.getMessage()); } - break; + } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java index a530258e7cd5..a94cc7c18cd1 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java @@ -21,6 +21,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.logging.Logger; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import org.antlr.v4.runtime.CharStreams; @@ -60,7 +61,7 @@ /** * focuses mainly on string inputs - * + * * ?? TODO implement a Extension module * * @author bhaidu @@ -69,28 +70,24 @@ public class BladeDeclarationFinder implements DeclarationFinder { private int currentTokenId; private String tokenText; + private static final Logger LOGGER = Logger.getLogger(BladeDeclarationFinder.class.getName()); @Override public OffsetRange getReferenceSpan(Document document, int caretOffset) { BaseDocument baseDoc = (BaseDocument) document; - //baseDoc.readLock(); AntlrTokenSequence tokens = null; OffsetRange offsetRange = OffsetRange.NONE; tokenText = null; int lineOffset = caretOffset; + try { - try { - String text = baseDoc.getText(0, baseDoc.getLength()); - tokens = new AntlrTokenSequence(new BladeAntlrLexer(CharStreams.fromString(text))); - } catch (BadLocationException ex) { - //Exceptions.printStackTrace(ex); - } - } finally { - //baseDoc.readUnlock(); + String text = baseDoc.getText(0, baseDoc.getLength()); + tokens = new AntlrTokenSequence(new BladeAntlrLexer(CharStreams.fromString(text))); + } catch (BadLocationException ex) { + LOGGER.warning(ex.getMessage()); } - //inside php expression context ?? if (tokens == null || tokens.isEmpty()) { return offsetRange; } @@ -101,16 +98,21 @@ public OffsetRange getReferenceSpan(Document document, int caretOffset) { org.antlr.v4.runtime.Token nt = tokens.next().get(); switch (nt.getType()) { - case D_CUSTOM: - case PHP_IDENTIFIER: - case PHP_NAMESPACE_PATH: + case D_CUSTOM, PHP_IDENTIFIER, PHP_NAMESPACE_PATH -> { return new OffsetRange(nt.getStartIndex(), nt.getStopIndex() + 1); - case HTML_COMPONENT_PREFIX: + } + case HTML_COMPONENT_PREFIX -> { //direct detection currentTokenId = HTML_COMPONENT_PREFIX; - //remove ' 3 ? nt.getText() : null; + + if (nt.getText().length() <= 3) { + return offsetRange; + } + + tokenText = nt.getText(); + return new OffsetRange(nt.getStartIndex() + 1, nt.getStopIndex() + 1); + } } if (!tokens.hasPrevious()) { @@ -199,7 +201,7 @@ public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) { FileObject sourceFolder = projectOwner.getProjectDirectory(); String referenceIdentifier = reference.identifier; - + switch (reference.type) { case EXTENDS: case INCLUDE: @@ -309,7 +311,7 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { location.addAlternative(new AlternativeLocationImpl(classLocation)); } return location; - case PHP_METHOD:{ + case PHP_METHOD: { if (reference.ownerClass == null) { return location; } @@ -322,8 +324,7 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { } Collection indexMethodResults = PhpIndexUtils.queryExactClassMethods(sourceFolder, referenceIdentifier, reference.ownerClass, queryNamespace); - - + for (PhpIndexFunctionResult indexResult : indexMethodResults) { PhpFunctionElement resultHandle = new PhpFunctionElement( referenceIdentifier, @@ -373,7 +374,7 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { return location; case USE: case INJECT: - case PHP_NAMESPACE_PATH_TYPE:{ + case PHP_NAMESPACE_PATH_TYPE: { Collection indexNamespaceResults; if (reference.namespace != null) { indexNamespaceResults = PhpIndexUtils.queryExactNamespaceClasses(reference.identifier, @@ -406,7 +407,7 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { case VITE_PATH: VitePathDeclarationService vitePathDeclService = new VitePathDeclarationService(sourceFolder); FileObject viteAssetFile = vitePathDeclService.findFileObject(referenceIdentifier); - if (viteAssetFile == null || !viteAssetFile.isValid()){ + if (viteAssetFile == null || !viteAssetFile.isValid()) { return location; } NamedElement resultHandle = new NamedElement(referenceIdentifier, viteAssetFile, ElementType.ASSET_FILE); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java index 8a8f9bf49b49..b35f4f683d10 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java @@ -168,17 +168,6 @@ public DeclarationFinder getDeclarationFinder() { public SemanticAnalyzer getSemanticAnalyzer() { return new BladeSemanticAnalyzer(); } -// -// @Override -// public boolean hasOccurrencesFinder() { -// return true; -// } -// -// @Override -// public OccurrencesFinder getOccurrencesFinder() { -// //practical just for php context -// return new BladeOcurrencesFinder(); -// } /** * flag for detecting if we are in a string context enables to select the diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeSemanticAnalyzer.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeSemanticAnalyzer.java index 30d7b88b87e8..7d69ad749b68 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeSemanticAnalyzer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeSemanticAnalyzer.java @@ -95,11 +95,6 @@ public void run(BladeParserResult parserResult, SchedulerEvent event) { highlights.put(entry.getKey(), UNDEFINED_FIELD_SET); } -// List errorList = parserResult.getDiagnostics(); -// for (org.netbeans.modules.csl.api.Error error : errorList) { -// OffsetRange range = new OffsetRange(error.getStartPosition(), error.getEndPosition()); -// highlights.put(range, UNDEFINED_FIELD_SET); -// } this.semanticHighlights = highlights; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorUtils.java index f504563d315b..820a99f603f9 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/EditorUtils.java @@ -36,7 +36,7 @@ private EditorUtils() { } @CheckForNull - public static FileObject getFileObjectFromDoc(Document doc) { + public static FileObject getFileObject(Document doc) { DataObject dObject = NbEditorUtilities.getDataObject(doc); if (dObject != null) { return dObject.getPrimaryFile().getParent(); @@ -46,7 +46,7 @@ public static FileObject getFileObjectFromDoc(Document doc) { @CheckForNull public static Project getProjectOwner(Document doc) { - FileObject file = getFileObjectFromDoc(doc); + FileObject file = getFileObject(doc); if (file == null) { return null; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java index 50289a746ee3..4edf290dbe50 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java @@ -33,6 +33,7 @@ import org.netbeans.api.lexer.TokenSequence; import org.netbeans.api.project.Project; import org.netbeans.editor.BaseDocument; +import org.netbeans.modules.php.api.util.FileUtils; import org.netbeans.modules.php.blade.editor.lexer.PHPLexerUtils; import org.netbeans.modules.php.blade.editor.path.BladePathUtils; import org.netbeans.modules.php.blade.project.BladeProjectProperties; @@ -48,12 +49,12 @@ * * @author bhaidu */ -@MimeRegistration(mimeType = "text/x-php5", service = HyperlinkProviderExt.class) +@MimeRegistration(mimeType = FileUtils.PHP_MIME_TYPE, service = HyperlinkProviderExt.class) public class HyperlinkProviderImpl implements HyperlinkProviderExt { - private String methodName; + private String methodName = ""; // NOI18N private String identifiableText; - private String tooltipText = ""; + private String tooltipText = ""; // NOI18N private FileObject goToFile; private int goToOffset = 0; @@ -102,6 +103,7 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { String focusedText = currentToken.text().toString(); //2 char config are not that relevant + //quote x 2 + min 3 length config if (focusedText.length() < 5 || !EditorStringUtils.isQuotedString(focusedText)) { return null; } @@ -121,10 +123,8 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { methodName = text; //tooltip text switch (methodName) { - case "view": - case "make": - case "render": - FileObject currentFile = EditorUtils.getFileObjectFromDoc(doc); + case "view", "make", "render" -> { + FileObject currentFile = EditorUtils.getFileObject(doc); if (currentFile == null) { return null; @@ -134,19 +134,21 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { for (FileObject includedFile : includedFiles) { goToFile = includedFile; - tooltipText = "Blade Template File : " + viewPath - + "

      " + identifiableText + ""; + tooltipText = "Blade Template File : " + viewPath // NOI18N + + "

      " + identifiableText + ""; // NOI18N goToOffset = 0; break; } return new int[]{startOffset, startOffset + currentToken.length()}; - default: + } + default -> { return null; + } } } - if (id.equals(PHPTokenId.PHP_TOKEN) && text.equals("(")) { + if (id.equals(PHPTokenId.PHP_TOKEN) && text.equals("(")) { // NOI18N prevTokenId = id; } } @@ -156,24 +158,25 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { @Override public void performClickAction(Document doc, int offset, HyperlinkType type) { switch (type) { - case GO_TO_DECLARATION: + case GO_TO_DECLARATION -> { switch (methodName) { - case "view": // NOI18N - case "make": // NOI18N - case "render": // NOI18N + case "view", "make", "render" -> // NOI18N + { if (goToFile != null) { openDocument(goToFile, goToOffset); } - break; + } + default -> { + //no-op + } } - break; - case ALT_HYPERLINK: + } + case ALT_HYPERLINK -> { JTextComponent focused = EditorRegistry.focusedComponent(); if (focused != null && focused.getDocument() == doc) { focused.setCaretPosition(offset); - //GoToImplementation.goToImplementation(focused); } - break; + } } } @@ -190,17 +193,17 @@ private void openDocument(FileObject f, int offset) { private boolean nonLaravelDeclFinderEnabled(Document doc) { Project projectOwner = EditorUtils.getProjectOwner(doc); - if (projectOwner == null){ + if (projectOwner == null) { return false; } BladeProjectProperties bladeProperties = BladeProjectProperties.getInstance(projectOwner); - + return bladeProperties.getNonLaravelDeclFinderFlag(); } @Override public String getTooltipText(Document doc, int offset, HyperlinkType type) { - return "" + tooltipText + ""; + return "" + tooltipText + ""; // NOI18N } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java index 67c5e8ee90dd..e44652dc2d6e 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java @@ -36,7 +36,7 @@ public final class ResourceUtilities { public static final String COMPONENT_TAG = "org/netbeans/modules/html/custom/resources/custom_html_element.png"; //NOI18N - private ResourceUtilities(){ + private ResourceUtilities() { } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java index 09f460f93124..ac2a2deabc01 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java @@ -22,9 +22,12 @@ import org.netbeans.modules.php.blade.editor.components.annotation.Namespace; import java.util.ArrayList; import java.util.Collection; +import java.util.Map; +import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.project.Project; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; +import org.netbeans.modules.php.blade.project.ComponentsSupport; import org.netbeans.modules.php.blade.project.ProjectUtils; import org.openide.filesystems.FileObject; @@ -33,35 +36,28 @@ * * @author bhaidu */ -@NamespaceRegister({ - @Namespace(path = "App\\View\\Components", from_app=true, relativeFilePath="app/View/Components"), // NOI18N - @Namespace(path = "App\\Http\\Livewire", from_app=true, relativeFilePath="app/Http/Livewire"), // NOI18N - @Namespace(path = "App\\Livewire", from_app=true, relativeFilePath="app/Livewire"), // NOI18N - @Namespace(path = "Illuminate\\Console\\View\\Components"), // NOI18N - @Namespace(path = "BladeUIKit\\Components\\Buttons", packageName="blade-ui-kit/blade-ui-kit"), // NOI18N - @Namespace(path = "BladeUIKit\\Components\\Layouts", packageName="blade-ui-kit/blade-ui-kit"), // NOI18N - @Namespace(path = "BladeUIKit\\Components\\Forms\\Inputs", packageName="blade-ui-kit/blade-ui-kit"), // NOI18N -}) + public class ComponentsCompletionService { + @CheckForNull public Collection queryComponents(String prefix, FileObject fo) { Collection results = new ArrayList<>(); Project project = ProjectUtils.getMainOwner(fo); - for (Namespace namespace : getNamespaces()){ - if (namespace.from_app()){ - //check if folder exists - if (project.getProjectDirectory().getFileObject(namespace.relativeFilePath()) == null){ - continue; - } - } - results.addAll(PhpIndexUtils.queryNamespaceClassesName(prefix, namespace.path(), fo)); + + if (project == null){ + return results; } - return results; - } + ComponentsSupport componentSupport = ComponentsSupport.getInstance(project); - public Namespace[] getNamespaces() { - NamespaceRegister namespaceRegister = this.getClass().getAnnotation(NamespaceRegister.class); - return namespaceRegister.value(); + if (!componentSupport.isScanned()){ + componentSupport.scanForInstalledComponents(); + } + + for (Map.Entry namespace : componentSupport.getInstalledComponentNamespace().entrySet()){ + results.addAll(PhpIndexUtils.queryNamespaceClassesName(prefix, namespace.getValue().path(), fo)); + } + + return results; } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java index 7988f90d1aa9..4fede8568c49 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/annotation/Namespace.java @@ -27,6 +27,6 @@ String relativeFilePath() default ""; String packageName() default "blade"; // NOI18N //inside App folder - boolean from_app() default false; + boolean fromApp() default false; boolean from_vendor() default true; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java index 4c625962edc1..91f5219449dd 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java @@ -20,6 +20,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.prefs.PreferenceChangeListener; import java.util.prefs.Preferences; import javax.swing.DefaultListModel; @@ -27,7 +28,6 @@ import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectUtils; import org.netbeans.modules.php.blade.editor.ui.customizer.UiOptionsUtils; -//import org.netbeans.modules.php.blade.editor.actions.ToggleBlockCommentAction; import org.openide.util.NbPreferences; /** @@ -42,11 +42,12 @@ public final class BladeProjectProperties { private static final String DIRECTIVE_CUSTOMIZER_PATH_LIST = "directive_customizer.path.list"; // NOI18N private static final String VIEW_PATH_LIST = "views.path.list"; // NOI18N private static final String NON_LARAVEL_DECL_FINDER = "non_laravel.decl.finder"; // NOI18N - public final Project project; + private final Project project; private DefaultListModel directiveCustomizerPathList = new DefaultListModel(); private DefaultListModel viewsPathList = new DefaultListModel(); - private boolean nonLaravelDeclFinder = false; + // declaration finder outside of framework plugin + private final AtomicBoolean nonLaravelDeclFinder = new AtomicBoolean(false); private BladeProjectProperties(Project project) { this.project = project; @@ -81,7 +82,7 @@ private Preferences getPreferences() { private void initModelsFromPreferences() { directiveCustomizerPathList = createModelForDirectiveCusomizerPathList(); viewsPathList = createModelForViewsPathList(); - nonLaravelDeclFinder = getPreferences().getBoolean(NON_LARAVEL_DECL_FINDER, false); + nonLaravelDeclFinder.set(getPreferences().getBoolean(NON_LARAVEL_DECL_FINDER, false)); } public void storeDirectiveCustomizerPaths() { @@ -95,7 +96,7 @@ public void storeViewsPaths() { } public void storeNonLaravelDeclFinderFlag(boolean status) { - nonLaravelDeclFinder = status; + nonLaravelDeclFinder.set(status); getPreferences().putBoolean(NON_LARAVEL_DECL_FINDER, status); } @@ -137,7 +138,7 @@ public DefaultListModel getModelViewsPathList() { } public boolean getNonLaravelDeclFinderFlag() { - return nonLaravelDeclFinder; + return nonLaravelDeclFinder.get(); } private DefaultListModel creatModelFromPreferences(String pathName) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectSupport.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectSupport.java index 847131a0f082..f8cbd7e6caae 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectSupport.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectSupport.java @@ -18,8 +18,6 @@ */ package org.netbeans.modules.php.blade.project; -import java.util.prefs.PreferenceChangeEvent; -import java.util.prefs.PreferenceChangeListener; import org.netbeans.api.project.Project; import org.netbeans.spi.project.ProjectServiceProvider; import org.netbeans.spi.project.ui.ProjectOpenedHook; @@ -27,7 +25,7 @@ * * @author bhaidu */ -public class BladeProjectSupport extends ProjectOpenedHook implements PreferenceChangeListener{ +public class BladeProjectSupport extends ProjectOpenedHook { private final Project project; public BladeProjectSupport(Project project) { @@ -54,11 +52,6 @@ public static BladeProjectSupport forPhpProject(Project project) { public static BladeProjectSupport forWebProject(Project project) { return create(project); } - - @Override - public void preferenceChange(PreferenceChangeEvent evt) { - // - } @Override protected void projectOpened() { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java index f6b6d6c37466..8d6e7b87458e 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java @@ -30,9 +30,9 @@ * @author bogdan */ @NamespaceRegister({ - @Namespace(path = "App\\View\\Components", from_app = true, relativeFilePath = "app/View/Components"), // NOI18N - @Namespace(path = "App\\Http\\Livewire", from_app = true, relativeFilePath = "app/Http/Livewire"), // NOI18N - @Namespace(path = "App\\Livewire", from_app = true, relativeFilePath = "app/Livewire"), // NOI18N + @Namespace(path = "App\\View\\Components", fromApp = true, relativeFilePath = "app/View/Components"), // NOI18N + @Namespace(path = "App\\Http\\Livewire", fromApp = true, relativeFilePath = "app/Http/Livewire"), // NOI18N + @Namespace(path = "App\\Livewire", fromApp = true, relativeFilePath = "app/Livewire"), // NOI18N @Namespace(path = "Illuminate\\Console\\View\\Components"), // NOI18N @Namespace(path = "BladeUI\\Icons\\Components", packageName = "blade-ui-kit/blade-icons"), // NOI18N @Namespace(path = "BladeUIKit\\Components", packageName = "blade-ui-kit/blade-ui-kit"),}) // NOI18N @@ -61,7 +61,7 @@ public static ComponentsSupport getInstance(Project project) { public void scanForInstalledComponents() { for (Namespace namespace : getRegisteredNamespaces()) { FileObject fo; - if (namespace.from_app()) { + if (namespace.fromApp()) { //check if folder exists fo = project.getProjectDirectory().getFileObject(namespace.relativeFilePath()); } else { diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeUtils.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeUtils.java index 806a193a82f6..b11664a72af2 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeUtils.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeUtils.java @@ -77,9 +77,9 @@ public static CommonTokenStream getFormatTokenStream(String content) { public static String replaceLinesAndTabs(String input) { String escapedString = input; - escapedString = escapedString.replaceAll("\n", "\\\\n"); //NOI18N - escapedString = escapedString.replaceAll("\r", "\\\\r"); //NOI18N - escapedString = escapedString.replaceAll("\t", "\\\\t"); //NOI18N + escapedString = escapedString.replaceAll("\n", "\\\\n"); + escapedString = escapedString.replaceAll("\r", "\\\\r"); + escapedString = escapedString.replaceAll("\t", "\\\\t"); return escapedString; } } From 6f10f8d96f9289bea3b9cf105688f12236898b84 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Mon, 12 Aug 2024 07:51:24 +0300 Subject: [PATCH 09/43] switch refacotr, // NOI18N, safe case for null pointer --- .../php/blade/editor/BladeBracesMatcher.java | 2 +- .../blade/editor/BladeDeclarationFinder.java | 52 +++++++++---------- .../blade/editor/HyperlinkProviderImpl.java | 6 ++- 3 files changed, 32 insertions(+), 28 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java index 785185316ca8..c6a5f6be4e7a 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -171,7 +171,7 @@ private int[] findOpenTag() { return null; } - public int[] findCloseTag() { + private int[] findCloseTag() { int matchTokenType = BladeAntlrUtils.getTagPairTokenType(originToken.getType()); List skipableTokenTypes = new ArrayList<>(); skipableTokenTypes.add(HTML); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java index a94cc7c18cd1..210362eb64bf 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java @@ -104,12 +104,12 @@ public OffsetRange getReferenceSpan(Document document, int caretOffset) { case HTML_COMPONENT_PREFIX -> { //direct detection currentTokenId = HTML_COMPONENT_PREFIX; - + if (nt.getText().length() <= 3) { return offsetRange; } - - tokenText = nt.getText(); + + tokenText = nt.getText(); return new OffsetRange(nt.getStartIndex() + 1, nt.getStopIndex() + 1); } @@ -170,9 +170,9 @@ public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) { if (fieldAccessReference != null) { switch (fieldAccessReference.type) { - case STATIC_FIELD_ACCESS: + case STATIC_FIELD_ACCESS -> { switch (fieldAccessReference.fieldType) { - case CONSTANT: + case CONSTANT -> { Collection indexConstantsResults = PhpIndexUtils.queryExactClassConstants(currentFile, fieldAccessReference.fieldName, fieldAccessReference.ownerClass.identifier); for (PhpIndexResult indexResult : indexConstantsResults) { NamedElement resultHandle = new NamedElement(fieldAccessReference.fieldName, indexResult.declarationFile, ElementType.PHP_CONSTANT); @@ -183,7 +183,9 @@ public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) { location.addAlternative(new AlternativeLocationImpl(constantLocation)); } return location; + } } + } } } @@ -203,11 +205,7 @@ public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) { String referenceIdentifier = reference.identifier; switch (reference.type) { - case EXTENDS: - case INCLUDE: - case INCLUDE_IF: - case EACH: - case INCLUDE_COND: + case EXTENDS, INCLUDE, INCLUDE_IF, EACH, INCLUDE_COND -> { String viewPath = referenceIdentifier; List includedFiles = BladePathUtils.findFileObjectsForBladeViewPath(currentFile, viewPath); @@ -224,9 +222,8 @@ public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) { location.addAlternative(new AlternativeLocationImpl(dln)); } return location; - case SECTION: - case HAS_SECTION: - case SECTION_MISSING: + } + case SECTION, HAS_SECTION, SECTION_MISSING -> { String yieldId = referenceIdentifier; List yields = QueryUtils.findYieldReferences(yieldId, currentFile); if (yields == null) { @@ -246,9 +243,8 @@ public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) { } return location; - case PUSH: - case PUSH_IF: - case PREPEND: + } + case PUSH, PUSH_IF, PREPEND -> { String stackId = referenceIdentifier; List stacks = QueryUtils.findStacksReferences(stackId, currentFile); @@ -268,7 +264,8 @@ public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) { } return location; - case CUSTOM_DIRECTIVE: + } + case CUSTOM_DIRECTIVE -> { String directiveNameFound = reference.identifier; DeclarationLocation dlcustomDirective = DeclarationLocation.NONE; @@ -289,7 +286,8 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { } } return dlcustomDirective; - case PHP_CLASS: + } + case PHP_CLASS -> { Collection indexClassResults; String namespace = reference.namespace; @@ -311,7 +309,8 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { location.addAlternative(new AlternativeLocationImpl(classLocation)); } return location; - case PHP_METHOD: { + } + case PHP_METHOD -> { if (reference.ownerClass == null) { return location; } @@ -343,7 +342,7 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { } return location; } - case PHP_FUNCTION: + case PHP_FUNCTION -> { Collection indexResults = PhpIndexUtils.queryExactFunctions(sourceFolder, reference.identifier); for (PhpIndexFunctionResult indexResult : indexResults) { @@ -360,7 +359,8 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { location.addAlternative(new AlternativeLocationImpl(functionLocation)); } return location; - case PHP_CONSTANT: + } + case PHP_CONSTANT -> { Collection indexConstantsResults = PhpIndexUtils.queryExactConstants(sourceFolder, reference.identifier); for (PhpIndexResult indexResult : indexConstantsResults) { @@ -372,9 +372,8 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { location.addAlternative(new AlternativeLocationImpl(constantLocation)); } return location; - case USE: - case INJECT: - case PHP_NAMESPACE_PATH_TYPE: { + } + case USE, INJECT, PHP_NAMESPACE_PATH_TYPE -> { Collection indexNamespaceResults; if (reference.namespace != null) { indexNamespaceResults = PhpIndexUtils.queryExactNamespaceClasses(reference.identifier, @@ -404,7 +403,7 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { } return location; } - case VITE_PATH: + case VITE_PATH -> { VitePathDeclarationService vitePathDeclService = new VitePathDeclarationService(sourceFolder); FileObject viteAssetFile = vitePathDeclService.findFileObject(referenceIdentifier); if (viteAssetFile == null || !viteAssetFile.isValid()) { @@ -417,6 +416,7 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { } location.addAlternative(new AlternativeLocationImpl(constantLocation)); return location; + } } return DeclarationLocation.NONE; @@ -441,7 +441,7 @@ public String getDisplayHtml(HtmlFormatter formatter) { if (el != null) { formatter.appendText(el.getName()); if (el.getFileObject() != null) { - formatter.appendText(" in "); + formatter.appendText(" in "); // NOI18N formatter.appendText(FileUtil.getFileDisplayName(el.getFileObject())); } return formatter.getText(); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java index 4edf290dbe50..bfebbd4b3557 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java @@ -123,7 +123,7 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { methodName = text; //tooltip text switch (methodName) { - case "view", "make", "render" -> { + case "view", "make", "render" -> { // NOI18N FileObject currentFile = EditorUtils.getFileObject(doc); if (currentFile == null) { @@ -198,6 +198,10 @@ private boolean nonLaravelDeclFinderEnabled(Document doc) { } BladeProjectProperties bladeProperties = BladeProjectProperties.getInstance(projectOwner); + if (bladeProperties == null){ + return false; + } + return bladeProperties.getNonLaravelDeclFinderFlag(); } From 44a03efe1163fe83147d8da42ebfaa118220baf6 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Mon, 12 Aug 2024 07:53:37 +0300 Subject: [PATCH 10/43] remove BladeLanguage commented scripts --- .../modules/php/blade/editor/BladeLanguage.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java index b35f4f683d10..f06567555346 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java @@ -80,11 +80,6 @@ @ActionReference(id = @ActionID(category = "TemplateActions", id = "org.netbeans.modules.php.blade.editor.actions.FindUsage"), path = ACTIONS, separatorBefore = 1700, position = 1800), @ActionReference(id = @ActionID(category = "System", id = "org.netbeans.modules.php.blade.editor.actions.AntlrDebug"), path = ACTIONS, position = 1900), // @ActionReference(id = @ActionID(category = "DebugAntlrActions", id = "org.netbeans.modules.php.blade.editor.actions.ViewAntlrLexerTokens"), path = ACTIONS, position = 2000), -// @ActionReference( -// path = "Editors/" + BladeLanguage.MIME_TYPE+ "/Popup", -// id = @ActionID(category = "Refactoring", id = "org.netbeans.modules.refactoring.api.ui.WhereUsedAction"), -// position = 1600 -// ), } ) public class BladeLanguage extends DefaultLanguageConfig { @@ -191,11 +186,6 @@ public boolean isIdentifierChar(char c) { || (hasQuote && c == '.') || (c == '_'); } -// @deprecated -// @Override -// public KeystrokeHandler getKeystrokeHandler() { -// return new BladeBracketCompleter(); -// } private static final Language language = new BladeLanguageHierarchy() { From c2798b034add1e53be46bf4ad22a5ff6dbb8dda0 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Mon, 12 Aug 2024 08:01:25 +0300 Subject: [PATCH 11/43] cover all possilities for some 17 syntax switch rules --- .../php/blade/csl/elements/NamedElement.java | 16 ++++++++++++---- .../php/blade/editor/BladeBracesMatcher.java | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java index 2e4dc2484fb0..9ca37d9aa0e9 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java @@ -76,10 +76,18 @@ public String getIn() { @Override public ElementKind getKind() { return switch (type) { - case YIELD_ID, STACK_ID -> ElementKind.PACKAGE; - case CUSTOM_DIRECTIVE -> ElementKind.METHOD; - case PHP_CLASS -> ElementKind.CLASS; - default -> ElementKind.FILE; + case YIELD_ID, STACK_ID, PHP_NAMESPACE, LARAVEL_COMPONENT -> + ElementKind.PACKAGE; + case CUSTOM_DIRECTIVE, DIRECTIVE, PHP_FUNCTION -> + ElementKind.METHOD; + case PHP_CLASS -> + ElementKind.CLASS; + case PHP_CONSTANT -> + ElementKind.CONSTANT; + case VARIABLE -> + ElementKind.VARIABLE; + case NA, PATH, ASSET_FILE -> + ElementKind.FILE; }; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java index c6a5f6be4e7a..18e8a1ec9605 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -112,7 +112,7 @@ public int[] findMatches() throws InterruptedException, BadLocationException { case START_TO_END -> findDirectiveEnd(tokenText); case CUSTOM_START_TO_END -> findCustomDirectiveEnd(tokenText); case END_TO_START -> findOriginForDirectiveEnd(tokenText); - default -> null; + case NONE, STOP -> null; }; } From a861ff6fc2782f726ae0ed3a416c2d5164bf97bf Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Mon, 12 Aug 2024 08:05:41 +0300 Subject: [PATCH 12/43] reviews on PhpFunctionElement - modify namespace access, use List.of for return --- .../php/blade/csl/elements/PhpFunctionElement.java | 8 ++++++-- .../modules/php/blade/editor/completion/TooltipDoc.java | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java index c715c2fcc0d1..6a0add653737 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java @@ -30,7 +30,7 @@ public class PhpFunctionElement extends NamedElement { @NullAllowed - public final String namespace; + private final String namespace; private final List params; public PhpFunctionElement(String name, FileObject file, @@ -63,7 +63,11 @@ public String getParamsAsString() { } public List getParams() { - return params; + return List.copyOf(params); + } + + public String getNamespace(){ + return namespace; } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/TooltipDoc.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/TooltipDoc.java index e55f0b8714d8..339855a4b66b 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/TooltipDoc.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/TooltipDoc.java @@ -51,8 +51,8 @@ public static Documentation generateDoc(NamedElement elementHandle) { public static Documentation generateFunctionDoc(PhpFunctionElement elementHandle) { String info = "
      " + elementHandle.getName() + elementHandle.getParamsAsString() + "
      "; - if (elementHandle.namespace != null){ - info += "
      " + elementHandle.namespace + "
      "; + if (elementHandle.getNamespace() != null){ + info += "
      " + elementHandle.getNamespace() + "
      "; } info += "
      " + elementHandle.getFileObject().getNameExt() + "
      "; info += String.format("
      %s
      ", "php function"); From bf04329b15f29f34407a287a39afa06196ddd9f8 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Tue, 20 Aug 2024 20:20:04 +0300 Subject: [PATCH 13/43] review updates for 12 august --- .../php/blade/csl/elements/PhpFunctionElement.java | 10 ++++++---- .../php/blade/editor/HyperlinkProviderImpl.java | 4 +++- .../modules/php/blade/editor/ResourceUtilities.java | 1 - 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java index 6a0add653737..8763afe80d58 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpFunctionElement.java @@ -19,6 +19,7 @@ package org.netbeans.modules.php.blade.csl.elements; import java.util.List; +import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.annotations.common.NullAllowed; import org.netbeans.modules.csl.api.ElementKind; import org.openide.filesystems.FileObject; @@ -41,7 +42,7 @@ public PhpFunctionElement(String name, FileObject file, this.namespace = namespace; this.params = List.copyOf(params); } - + public PhpFunctionElement(String name, FileObject file, ElementType type, List params) { @@ -63,10 +64,11 @@ public String getParamsAsString() { } public List getParams() { - return List.copyOf(params); + return params; } - - public String getNamespace(){ + + @CheckForNull + public String getNamespace() { return namespace; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java index bfebbd4b3557..79a10119bdb9 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java @@ -57,6 +57,7 @@ public class HyperlinkProviderImpl implements HyperlinkProviderExt { private String tooltipText = ""; // NOI18N private FileObject goToFile; private int goToOffset = 0; + public static final String FILE_TITLE = "Blade Template File"; public enum DeclarationType { VIEW_PATH; @@ -134,7 +135,8 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { for (FileObject includedFile : includedFiles) { goToFile = includedFile; - tooltipText = "Blade Template File : " + viewPath // NOI18N + tooltipText = FILE_TITLE + + " : " + viewPath // NOI18N + "

      " + identifiableText + ""; // NOI18N goToOffset = 0; break; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java index e44652dc2d6e..da54f586d1c4 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java @@ -35,7 +35,6 @@ public final class ResourceUtilities { public static final String LAYOUT_IDENTIFIER = ICON_BASE + "icons/layout.png"; //NOI18N public static final String COMPONENT_TAG = "org/netbeans/modules/html/custom/resources/custom_html_element.png"; //NOI18N - private ResourceUtilities() { } From be495c9c34df26c2287df6f78576c27e5c88fce0 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Tue, 20 Aug 2024 20:30:46 +0300 Subject: [PATCH 14/43] comment update, syncronize blade project properties cleanup --- .../modules/php/blade/project/BladeProjectProperties.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java index 91f5219449dd..43be0b7256b5 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java @@ -46,7 +46,7 @@ public final class BladeProjectProperties { private DefaultListModel directiveCustomizerPathList = new DefaultListModel(); private DefaultListModel viewsPathList = new DefaultListModel(); - // declaration finder outside of framework plugin + // enable declaration finder outside of framework plugin private final AtomicBoolean nonLaravelDeclFinder = new AtomicBoolean(false); private BladeProjectProperties(Project project) { @@ -67,8 +67,10 @@ public static BladeProjectProperties getInstance(Project project) { } public static void closeProject(Project project) { - if (INSTANCES.containsKey(project)) { - INSTANCES.remove(project); + synchronized (INSTANCES) { + if (INSTANCES.containsKey(project)) { + INSTANCES.remove(project); + } } } From 33cb2537d03c14d2b16d78f7881fe9f17c3118c2 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Wed, 4 Sep 2024 07:46:25 +0300 Subject: [PATCH 15/43] batch of java code compliance changes for hyperlinkprovider, blade completion handler, parse, blade typed text interceptor --- .../php/blade/editor/BladeCommentHandler.java | 8 +- .../blade/editor/HyperlinkProviderImpl.java | 2 +- .../completion/BladeCompletionHandler.java | 21 +--- .../php/blade/editor/parser/BladeParser.java | 21 +--- .../editor/parser/BladeParserResult.java | 5 +- .../BladeTypedTextInterceptor.java | 105 ++++++++++++------ .../blade/project/BladeProjectProperties.java | 11 +- 7 files changed, 90 insertions(+), 83 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java index dc3964efc9f6..de2a4869e7a7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java @@ -18,6 +18,7 @@ */ package org.netbeans.modules.php.blade.editor; +import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.text.BadLocationException; import javax.swing.text.Document; @@ -27,7 +28,6 @@ import org.netbeans.editor.BaseDocument; import org.netbeans.modules.csl.spi.CommentHandler; import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; -import org.openide.util.Exceptions; /** * known issues @@ -38,8 +38,8 @@ */ public class BladeCommentHandler extends CommentHandler.DefaultCommentHandler { - private static final String COMMENT_START_DELIMITER = "{{--"; //NOI18N - private static final String COMMENT_END_DELIMITER = "--}}"; //NOI18N + public static final String COMMENT_START_DELIMITER = "{{--"; //NOI18N + public static final String COMMENT_END_DELIMITER = "--}}"; //NOI18N private static final Logger LOGGER = Logger.getLogger(BladeCommentHandler.class.getName()); @@ -96,7 +96,7 @@ public void run() { bounds[0] = 0; bounds[1] = 0; } catch (BadLocationException ex) { - LOGGER.warning(ex.getMessage()); + LOGGER.log(Level.WARNING, "Invalid offset: {0}", ex.offsetRequested()); // NOI18N } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java index 79a10119bdb9..1c33ec4cd8fd 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java @@ -104,7 +104,7 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { String focusedText = currentToken.text().toString(); //2 char config are not that relevant - //quote x 2 + min 3 length config + //2 qoute char an 3 char minimum length text if (focusedText.length() < 5 || !EditorStringUtils.isQuotedString(focusedText)) { return null; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java index 84f50ae68c4f..c8b51115359d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java @@ -24,7 +24,6 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.Callable; -import java.util.logging.Level; import java.util.logging.Logger; import org.netbeans.editor.BaseDocument; import javax.swing.text.Document; @@ -113,23 +112,15 @@ public CodeCompletionResult complete(CodeCompletionContext completionContext) { return CodeCompletionResult.NONE; } switch (currentToken.getType()) { - case PHP_IDENTIFIER: - case PHP_NAMESPACE_PATH: - PhpCodeCompletionService.completePhpCode(completionProposals, parserResult, offset, prefix); - break; - case PHP_EXPRESSION: - completePhpSnippet(completionProposals, offset, currentToken); - break; - case PHP_VARIABLE: - completeScopedVariables(completionProposals, completionContext, parserResult, currentToken); - break; - case CONTENT_TAG_OPEN: - case RAW_TAG_OPEN: + case PHP_IDENTIFIER, PHP_NAMESPACE_PATH -> PhpCodeCompletionService.completePhpCode(completionProposals, parserResult, offset, prefix); + case PHP_EXPRESSION -> completePhpSnippet(completionProposals, offset, currentToken); + case PHP_VARIABLE -> completeScopedVariables(completionProposals, completionContext, parserResult, currentToken); + case CONTENT_TAG_OPEN, RAW_TAG_OPEN -> { //{{ | {!! if (!ModulePreferences.isAutoTagCompletionEnabled()) { completeBladeTags(completionProposals, completionContext, currentToken); } - break; + } } } @@ -139,7 +130,7 @@ public CodeCompletionResult complete(CodeCompletionContext completionContext) { long time = System.currentTimeMillis() - startTime; if (time > 2000){ - LOGGER.info(String.format("complete() with results took %d ms", time)); + LOGGER.info(String.format("complete() with results took %d ms", time)); // NOI18N } return new DefaultCompletionResult(completionProposals, false); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java index 09ef2be2f32e..0b30f60add97 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java @@ -18,9 +18,6 @@ */ package org.netbeans.modules.php.blade.editor.parser; -import java.lang.ref.Reference; -import java.lang.ref.WeakReference; -import java.util.WeakHashMap; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.event.ChangeListener; @@ -28,16 +25,15 @@ import org.netbeans.modules.parsing.api.Task; import org.netbeans.modules.parsing.spi.ParseException; import org.netbeans.modules.parsing.spi.SourceModificationEvent; -import org.openide.filesystems.FileObject; /** * * @author bhaidu */ public class BladeParser extends org.netbeans.modules.parsing.spi.Parser { + private static final Logger LOGGER = Logger.getLogger(BladeParser.class.getName()); - BladeParserResult lastResult; - private static final WeakHashMap> CACHE = new WeakHashMap<>(); + private BladeParserResult lastResult; @Override public void parse(Snapshot snapshot, Task task, SourceModificationEvent event) throws ParseException { @@ -45,25 +41,16 @@ public void parse(Snapshot snapshot, Task task, SourceModificationEvent event) t return; } LOGGER.info(String.format("Parsing request for for " + task.getClass().getName() + " event changed : " + event.sourceChanged())); - if (task.getClass().getName().contains("HtmlCssIndexContributor")){ + if (task.getClass().getName().contains("HtmlCssIndexContributor")) { LOGGER.log(Level.INFO, "Skipped parsing for {0}", task.getClass().getName()); return; } - long startTime = System.currentTimeMillis(); BladeParserResult parserResult = createParserResult(snapshot); BladeParserResult parsed = parserResult.get(task.getClass().getName()); - //cacheResult(snapshot.getSource().getFileObject(), parsed); lastResult = parsed; - //LOGGER.info(String.format("Finished parsing for " + task.getClass().getName() + ". Time : %d ms", System.currentTimeMillis() - startTime)); - } - - private static void cacheResult(FileObject fo, BladeParserResult result) { - synchronized (CACHE) { - CACHE.put(fo, new WeakReference<>(result)); - } } - + @Override public Result getResult(Task task) throws ParseException { assert lastResult != null; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java index d749f36849d0..c778365e5fd4 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java @@ -79,8 +79,8 @@ public class BladeParserResult extends ParserResult { public final Map> loopScopedVariables = new TreeMap<>(); public final List structure = new ArrayList<>(); public final List folds = new ArrayList<>(); - volatile boolean finished = false; - volatile boolean debugMode = false; + volatile private boolean finished = false; + volatile private boolean debugMode = false; public enum ReferenceType { YIELD, STACK, SECTION, PUSH, PUSH_IF, PREPEND, INCLUDE, INCLUDE_IF, @@ -112,7 +112,6 @@ public BladeParserResult get(String taskClass) { if (!finished) { BladeAntlrParser parser = createParser(getSnapshot()); parser.setBuildParseTree(false); - //LOGGER.info(String.format("parser created in %d ms", System.currentTimeMillis() - startTime)); parser.addErrorListener(createErrorListener()); parser.addParseListener(createDeclarationReferencesListener()); parser.addParseListener(createPhpElementsOccurencesListener()); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java index 79e201d1779e..e8f3101998b9 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java @@ -29,7 +29,10 @@ import org.netbeans.api.lexer.Token; import org.netbeans.api.lexer.TokenHierarchy; import org.netbeans.api.lexer.TokenSequence; +import org.netbeans.modules.php.blade.editor.BladeCommentHandler; import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; +import static org.netbeans.modules.php.blade.editor.lexer.BladeTokenId.HTML; +import static org.netbeans.modules.php.blade.editor.lexer.BladeTokenId.BLADE_COMMENT; import org.netbeans.modules.php.blade.editor.preferences.ModulePreferences; import org.netbeans.spi.editor.typinghooks.TypedTextInterceptor; @@ -40,13 +43,14 @@ */ public class BladeTypedTextInterceptor implements TypedTextInterceptor { - static final Map CHAR_PAIR = new WeakHashMap<>(); + private static final Map CHAR_PAIR = new WeakHashMap<>(); public static enum TagType { CONTENT, RAW, COMMENT } + /** * auto complete char pair */ @@ -75,29 +79,24 @@ public void insert(MutableContext context) throws BadLocationException { return; } - if (!isAutoTagCompletionEnabled()){ + if (!isAutoTagCompletionEnabled()) { return; } - - String typedText = context.getText(); - - Map TagParts = new WeakHashMap<>(); - TagParts.put("{", TagType.CONTENT); - TagParts.put("!", TagType.RAW); - TagParts.put("-", TagType.CONTENT); - - TagType tagType = TagParts.get(typedText); - - if (tagType == null){ + + String typedText = context.getText(); + + TagType tagType = getTagType(typedText); + + if (tagType == null) { return; } - + int offset = context.getOffset(); - - if (offset < 2){ + + if (offset < 2) { return; } - + Document document = context.getDocument(); TokenHierarchy th = TokenHierarchy.get(document); TokenSequence ts = th.tokenSequence(); @@ -105,25 +104,17 @@ public void insert(MutableContext context) throws BadLocationException { ts.moveNext(); Token token = ts.token(); - - if (token == null || !(token.id() instanceof BladeTokenId)){ + + if (token == null || !(token.id() instanceof BladeTokenId)) { return; } - + BladeTokenId bladeToken = (BladeTokenId) token.id(); - + String tokenText = token.text().toString(); - - switch (bladeToken) { - case HTML: - if (tokenText.equals("{") && tagType == TagType.CONTENT){ - context.setText("{ }}", 1); - } else if (tokenText.equals("{!") && tagType == TagType.RAW ){ - context.setText("! !!}", 1); - } else if (tokenText.equals("{{-") && tagType == TagType.COMMENT ){ - context.setText("- --}}", 1); - } - break; + + if (bladeToken.equals(HTML)) { + completeFromHtmlFragments(tokenText, context, tagType); } } @@ -151,11 +142,57 @@ public void afterInsert(Context cntxt) throws BadLocationException { public void cancelled(Context cntxt) { } - - public boolean isAutoTagCompletionEnabled(){ + + public boolean isAutoTagCompletionEnabled() { return ModulePreferences.isAutoTagCompletionEnabled(); } + private TagType getTagType(String typedText) { + + return switch (typedText) { + case "{" -> // NOI18N + TagType.CONTENT; + case "!" -> // NOI18N + TagType.RAW; + case "-" -> // NOI18N + TagType.COMMENT; + default -> + null; + }; + } + + private void completeFromHtmlFragments(String tokenText, MutableContext context, TagType tagType) { + switch (tokenText) { + case "{" -> // NOI18N + completeContentTag(context, tagType); + case "{!" -> // NOI18N + completeRawContentTag(context, tagType); + case "{{-" -> // NOI18N + completeCommenTag(context, tagType); + } + } + + private void completeContentTag(MutableContext context, TagType tagType) { + if (tagType != TagType.CONTENT) { + return; + } + context.setText("{ }}", 1);// NOI18N + } + + private void completeRawContentTag(MutableContext context, TagType tagType) { + if (tagType != TagType.RAW) { + return; + } + context.setText("! !!}", 1);// NOI18N + } + + private void completeCommenTag(MutableContext context, TagType tagType) { + if (tagType != TagType.COMMENT) { + return; + } + context.setText("- --}}", 1);// NOI18N + } + /** * register for HTML also */ diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java index 43be0b7256b5..b1d91977a230 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java @@ -57,20 +57,13 @@ private BladeProjectProperties(Project project) { @CheckForNull public static BladeProjectProperties getInstance(Project project) { synchronized (INSTANCES) { - if (INSTANCES.containsKey(project)) { - return INSTANCES.get(project); - } - BladeProjectProperties instance = new BladeProjectProperties(project); - INSTANCES.put(project, instance); - return instance; + return INSTANCES.computeIfAbsent(project, k -> new BladeProjectProperties(project)); } } public static void closeProject(Project project) { synchronized (INSTANCES) { - if (INSTANCES.containsKey(project)) { - INSTANCES.remove(project); - } + INSTANCES.remove(project); } } From 2218fa72b0147241bb603059cfb8d8bc585d927d Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Wed, 4 Sep 2024 07:56:53 +0300 Subject: [PATCH 16/43] refactor+ wip compliance code on blade parser, remove comment --- .../blade/editor/BladeDeclarationFinder.java | 3 +- .../php/blade/editor/BladeLanguage.java | 2 +- .../editor/parser/BladeParserResult.java | 88 +++++++------------ .../blade/syntax/BladeDirectivesUtils.java | 1 + 4 files changed, 36 insertions(+), 58 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java index 210362eb64bf..af247662457c 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java @@ -21,6 +21,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.text.BadLocationException; import javax.swing.text.Document; @@ -85,7 +86,7 @@ public OffsetRange getReferenceSpan(Document document, int caretOffset) { String text = baseDoc.getText(0, baseDoc.getLength()); tokens = new AntlrTokenSequence(new BladeAntlrLexer(CharStreams.fromString(text))); } catch (BadLocationException ex) { - LOGGER.warning(ex.getMessage()); + LOGGER.log(Level.WARNING, "Invalid offset: {0}", ex.offsetRequested()); // NOI18N } if (tokens == null || tokens.isEmpty()) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java index f06567555346..99cb095427ef 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java @@ -79,7 +79,7 @@ @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.PropertiesAction"), path = ACTIONS, position = 1600), @ActionReference(id = @ActionID(category = "TemplateActions", id = "org.netbeans.modules.php.blade.editor.actions.FindUsage"), path = ACTIONS, separatorBefore = 1700, position = 1800), - @ActionReference(id = @ActionID(category = "System", id = "org.netbeans.modules.php.blade.editor.actions.AntlrDebug"), path = ACTIONS, position = 1900), // @ActionReference(id = @ActionID(category = "DebugAntlrActions", id = "org.netbeans.modules.php.blade.editor.actions.ViewAntlrLexerTokens"), path = ACTIONS, position = 2000), + @ActionReference(id = @ActionID(category = "System", id = "org.netbeans.modules.php.blade.editor.actions.AntlrDebug"), path = ACTIONS, position = 1900), } ) public class BladeLanguage extends DefaultLanguageConfig { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java index c778365e5fd4..2468b5504aa1 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java @@ -51,6 +51,7 @@ import org.netbeans.modules.php.blade.editor.navigator.BladeStructureItem; import org.netbeans.modules.php.blade.editor.navigator.BladeStructureItem.DirectiveBlockStructureItem; import org.netbeans.modules.php.blade.editor.navigator.BladeStructureItem.DirectiveInlineStructureItem; +import org.netbeans.modules.php.blade.syntax.BladeDirectivesUtils; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser; @@ -107,7 +108,7 @@ protected BladeAntlrParser createParser(Snapshot snapshot) { public BladeParserResult get(String taskClass) { long startTime = System.currentTimeMillis(); if (debugMode){ - LOGGER.log(Level.INFO, "PARSER TRIGGERED BY {0}", taskClass); + LOGGER.log(Level.INFO, "PARSER TRIGGERED BY {0}", taskClass); // NOI18N } if (!finished) { BladeAntlrParser parser = createParser(getSnapshot()); @@ -116,25 +117,25 @@ public BladeParserResult get(String taskClass) { parser.addParseListener(createDeclarationReferencesListener()); parser.addParseListener(createPhpElementsOccurencesListener()); - if (taskClass.toLowerCase().contains("completion")) { + if (taskClass.toLowerCase().contains("completion")) { // NOI18N parser.addParseListener(createVariableListener()); } parser.addParseListener(createStructureListener()); - if (taskClass.toLowerCase().contains("hints")) { + if (taskClass.toLowerCase().contains("hints")) { // NOI18N parser.addParseListener(createSemanticsListener()); } evaluateParser(parser); if (debugMode){ - LOGGER.info(String.format("Parser evaluated in %d ms " + taskClass + " | " + this.getFileObject().getNameExt(), System.currentTimeMillis() - startTime)); + LOGGER.info(String.format("Parser evaluated in %d ms " + taskClass + " | " + this.getFileObject().getNameExt(), System.currentTimeMillis() - startTime)); // NOI18N } finished = true; } long time = System.currentTimeMillis() - startTime; if (debugMode){ - LOGGER.info(String.format("finished parser took %d ms " + this.getFileObject().getNameExt(), time)); + LOGGER.info(String.format("finished parser took %d ms " + this.getFileObject().getNameExt(), time)); // NOI18N } return this; } @@ -244,12 +245,8 @@ private void addIdentifiableOccurenceForDeclaration(Token directive, //used for indexing switch (directive.getType()) { - case D_STACK: - addStackReference(ReferenceType.STACK, bladeParamText, range); - break; - case D_YIELD: - addYieldReference(ReferenceType.YIELD, bladeParamText, range); - break; + case D_STACK -> addStackReference(ReferenceType.STACK, bladeParamText, range); + case D_YIELD -> addYieldReference(ReferenceType.YIELD, bladeParamText, range); } ReferenceType type = getReferenceType(directive.getType()); @@ -260,7 +257,7 @@ private void addIdentifiableOccurenceForDeclaration(Token directive, Reference ref; if (type.equals(ReferenceType.USE) || type.equals(ReferenceType.INJECT)) { - int lastSlashPos = bladeParamText.lastIndexOf("\\"); + int lastSlashPos = bladeParamText.lastIndexOf(EditorStringUtils.NAMESPACE_SEPARATOR); if (lastSlashPos < 0 || lastSlashPos >= bladeParamText.length() - 1) { return; } @@ -274,18 +271,13 @@ private void addIdentifiableOccurenceForDeclaration(Token directive, occurancesForDeclaration.put(range, ref); switch (directive.getType()) { - case D_EACH: - case D_INCLUDE_WHEN: - case D_INCLUDE_UNLESS: - case D_INCLUDE: - case D_INCLUDE_IF: - case D_INCLUDE_FIRST: - if (bladeParamText.contains("::")) { + case D_EACH, D_INCLUDE_WHEN, D_INCLUDE_UNLESS, D_INCLUDE, D_INCLUDE_IF, D_INCLUDE_FIRST -> { + if (bladeParamText.contains("::")) { // NOI18N //don't include package resources break; } markIncludeBladeOccurrence(bladeParamText, range); - break; + } } } @@ -627,7 +619,7 @@ public void exitBlock_statement(BladeAntlrParser.Block_statementContext ctx) { blockItem.nestedItems.addAll(lexerStructure); lexerStructure.clear(); - if (blockBalance > 0 && !directiveName.startsWith("@else")) { + if (blockBalance > 0 && !directiveName.startsWith(BladeDirectivesUtils.DIRECTIVE_ELSE)) { lexerStructure.add(blockItem); } else { structure.add(blockItem); @@ -648,34 +640,21 @@ public void exitBlock_statement(BladeAntlrParser.Block_statementContext ctx) { } private ReferenceType getReferenceType(int type) { - switch (type) { - case D_INCLUDE: - return ReferenceType.INCLUDE; - case D_INCLUDE_IF: - return ReferenceType.INCLUDE_IF; - case D_EXTENDS: - return ReferenceType.EXTENDS; - case D_USE: - return ReferenceType.USE; - case D_INJECT: - return ReferenceType.INJECT; - case D_SECTION: - return ReferenceType.SECTION; - case D_HAS_SECTION: - return ReferenceType.HAS_SECTION; - case D_SECTION_MISSING: - return ReferenceType.SECTION_MISSING; - case D_PUSH: - return ReferenceType.PUSH; - case D_PUSH_IF: - return ReferenceType.PUSH_IF; - case D_PREPEND: - return ReferenceType.PREPEND; - case D_EACH: - return ReferenceType.EACH; - default: - return null; - } + return switch (type) { + case D_INCLUDE -> ReferenceType.INCLUDE; + case D_INCLUDE_IF -> ReferenceType.INCLUDE_IF; + case D_EXTENDS -> ReferenceType.EXTENDS; + case D_USE -> ReferenceType.USE; + case D_INJECT -> ReferenceType.INJECT; + case D_SECTION -> ReferenceType.SECTION; + case D_HAS_SECTION -> ReferenceType.HAS_SECTION; + case D_SECTION_MISSING -> ReferenceType.SECTION_MISSING; + case D_PUSH -> ReferenceType.PUSH; + case D_PUSH_IF -> ReferenceType.PUSH_IF; + case D_PREPEND -> ReferenceType.PREPEND; + case D_EACH -> ReferenceType.EACH; + default -> null; + }; } /** @@ -899,8 +878,7 @@ protected ANTLRErrorListener createErrorListener() { @Override public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { int errorPosition = 0; - if (offendingSymbol instanceof Token) { - Token offendingToken = (Token) offendingSymbol; + if (offendingSymbol instanceof Token offendingToken) { errorPosition = offendingToken.getStartIndex(); } errors.add(new BladeError(null, msg, null, getFileObject(), errorPosition, errorPosition, Severity.ERROR)); @@ -975,13 +953,11 @@ public class ForeachVariables { public String itemVariable; } - /** - * seems that java caches only this class ? BladeError is not found in some - * occasions - */ public static class BladeError extends DefaultError implements org.netbeans.modules.csl.api.Error.Badging { - public BladeError(@NullAllowed String key, @NonNull String displayName, @NullAllowed String description, @NonNull FileObject file, @NonNull int start, @NonNull int end, @NonNull Severity severity) { + public BladeError(@NullAllowed String key, @NonNull String displayName, + @NullAllowed String description, @NonNull FileObject file, + @NonNull int start, @NonNull int end, @NonNull Severity severity) { super(key, displayName, description, file, start, end, severity); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java index 193bd15432b1..77ef049327e3 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java @@ -36,6 +36,7 @@ public final class BladeDirectivesUtils { public static final String DIRECTIVE_STOP = "@stop"; // NOI18N public static final String DIRECTIVE_APPEND = "@append"; // NOI18N public static final String DIRECTIVE_IF = "@if"; // NOI18N + public static final String DIRECTIVE_ELSE = "@else"; // NOI18N public static final String DIRECTIVE_ENDIF = "@endif"; // NOI18N public static String[] directiveStart2EndPair(String directive){ From b602a55815dc7e70b249c6b9d9407cea63d2b78a Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Fri, 13 Sep 2024 16:38:52 +0300 Subject: [PATCH 17/43] refactor, code compliance, update lexer for css at rules, embedding tests, added more lexer tests --- .../completion/BladeCompletionBuilder.java | 56 + .../completion/BladeCompletionHandler.java | 23 +- .../completion/BladeCompletionItem.java | 132 +- .../completion/BladeCompletionProposal.java | 1 - .../completion/BladeCompletionProvider.java | 55 +- .../BladePhpCompletionProvider.java | 2 +- .../DirectiveCompletionBuilder.java | 10 +- .../php/blade/editor/parser/BladeParser.java | 4 +- .../php/blade/project/ComponentsSupport.java | 2 + .../php/blade/resources/icons/icon.png | Bin 973 -> 0 bytes .../blade/syntax/BladeDirectivesUtils.java | 3 + .../php/blade/syntax/BladeVariables.java | 32 + .../antlr4/v10/BladeAntlrColoringLexer.java | 1643 ++++++------ .../syntax/antlr4/v10/BladeAntlrLexer.java | 2231 +++++++++-------- .../antlr4/v10/BladeColoringCommonLexer.g4 | 20 +- .../syntax/antlr4/v10/BladeCommonLexer.g4 | 20 +- .../lexer/BladeLexerTest/css_at_rules.pass | 65 + .../BladeLexerTest/html_javascript_01.pass | 14 + .../testCompletion_loop_endtag_01.blade.php | 3 + ...p.testCompletion_loop_endtag_01.completion | 4 + .../embedding/html_embedding_01.blade.php | 5 + ...1.blade.php.testHtmlEmbedding_01.embedding | 5 + .../embedding/php_freeze_nekudo_01.blade.php | 1 + ...01.blade.php.testFreezeNekudo_01.embedding | 1 + .../blade/content_tag_tertiary_expr.blade.php | 3 + .../lexer/blade/css_at_rules.blade.php | 34 + .../lexer/blade/escaped_directive.blade.php | 3 + .../lexer/blade/html_javascript_01.blade.php | 6 + .../lexer/blade/include_01.blade.php | 1 + .../completion/BladeCompletionTest.java | 4 + .../BladeHtmlEmbeddingProviderTest.java | 61 + .../BladePhpEmbeddingProviderTest.java | 68 + .../blade/editor/lexer/BladeLexerTest.java | 21 + 33 files changed, 2450 insertions(+), 2083 deletions(-) create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionBuilder.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/icon.png create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeVariables.java create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/html_javascript_01.pass create mode 100644 php/php.blade/test/unit/data/testfiles/completion/testCompletion_loop_endtag_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/completion/testCompletion_loop_endtag_01.blade.php.testCompletion_loop_endtag_01.completion create mode 100644 php/php.blade/test/unit/data/testfiles/embedding/html_embedding_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/embedding/html_embedding_01.blade.php.testHtmlEmbedding_01.embedding create mode 100644 php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php.testFreezeNekudo_01.embedding create mode 100644 php/php.blade/test/unit/data/testfiles/lexer/blade/content_tag_tertiary_expr.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/lexer/blade/css_at_rules.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/lexer/blade/escaped_directive.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/lexer/blade/html_javascript_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/lexer/blade/include_01.blade.php create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProviderTest.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProviderTest.java diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionBuilder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionBuilder.java new file mode 100644 index 000000000000..b16ea8e5d3e0 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionBuilder.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.completion; + +/** + * + * @author bogdan + */ +public class BladeCompletionBuilder { + + //----------- Factory methods -------------- + public static BladeCompletionItem createTag(String name, int substitutionOffset) { + return new BladeCompletionItem.BladeTag(name, substitutionOffset); + } + + public static BladeCompletionItem createViewPath(String name, + int substitutionOffset, boolean isFolder, String path) { + return new BladeCompletionItem.ViewPath(name, substitutionOffset, isFolder, path); + } + + public static BladeCompletionItem createInlineDirective(String directive, + int substitutionOffset, String description) { + return new BladeCompletionItem.InlineDirective(directive, substitutionOffset, description); + } + + public static BladeCompletionItem createDirectiveWithArg(String directive, + int substitutionOffset, String description) { + return new BladeCompletionItem.DirectiveWithArg(directive, substitutionOffset, description); + } + + public static BladeCompletionItem createBlockDirective(String directive, + String endTag, int substitutionOffset, String description) { + return new BladeCompletionItem.BlockDirective(directive, endTag, substitutionOffset, description); + } + + public static BladeCompletionItem createBlockDirectiveWithArg(String directive, + String endTag, int substitutionOffset, String description) { + return new BladeCompletionItem.BlockDirectiveWithArg(directive, endTag, substitutionOffset, description); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java index c8b51115359d..cee2cc5167f7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java @@ -52,6 +52,7 @@ import org.netbeans.modules.php.blade.editor.preferences.ModulePreferences; import org.netbeans.modules.php.blade.project.ProjectUtils; import org.netbeans.modules.php.blade.syntax.BladeTags; +import org.netbeans.modules.php.blade.syntax.BladeVariables; import org.netbeans.modules.php.blade.syntax.annotation.Directive; import org.netbeans.modules.php.blade.syntax.annotation.Tag; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrUtils; @@ -165,8 +166,8 @@ private void completeScopedVariables(final List completionPr request.anchorOffset = completionContext.getCaretOffset() - variablePrefix.length(); request.carretOffset = completionContext.getCaretOffset(); request.prefix = variablePrefix; - if ("$loop".startsWith(variablePrefix)) { - String variableName = "$loop"; // NOI18N + if (BladeVariables.LOOP_VAR.startsWith(variablePrefix)) { + String variableName = BladeVariables.LOOP_VAR; NamedElement variableElement = new NamedElement(variableName, fo, ElementType.VARIABLE); completionProposals.add(new BladeCompletionProposal.BladeVariableItem(variableElement, request, variableName)); } @@ -274,12 +275,10 @@ public CodeCompletionHandler.QueryType getAutoQuery(JTextComponent component, St char lastChar = typedText.charAt(typedText.length() - 1); - switch (lastChar) { - case '\n': - return CodeCompletionHandler.QueryType.STOP; - default: - return CodeCompletionHandler.QueryType.ALL_COMPLETION; - } + return switch (lastChar) { + case '\n' -> CodeCompletionHandler.QueryType.STOP; + default -> CodeCompletionHandler.QueryType.ALL_COMPLETION; + }; } @Override @@ -309,12 +308,12 @@ public ParameterInfo parameters(ParserResult pr, int i, CompletionProposal cp) { @Override public Documentation documentElement(ParserResult parserResult, ElementHandle elementHandle, Callable cancel) { Documentation result = null; - if (elementHandle instanceof PhpFunctionElement) { - return TooltipDoc.generateFunctionDoc((PhpFunctionElement) elementHandle); + if (elementHandle instanceof PhpFunctionElement phpFunctionElement) { + return TooltipDoc.generateFunctionDoc(phpFunctionElement); } else if (elementHandle instanceof DirectiveElement) { return result; - } else if (elementHandle instanceof NamedElement) { - return TooltipDoc.generateDoc((NamedElement) elementHandle); + } else if (elementHandle instanceof NamedElement namedElement) { + return TooltipDoc.generateDoc(namedElement); } return result; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java index be17635232b7..c3c406956285 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java @@ -26,10 +26,12 @@ import javax.swing.text.BadLocationException; import javax.swing.text.Caret; import javax.swing.text.JTextComponent; +import org.netbeans.api.annotations.common.NullAllowed; import org.netbeans.api.editor.completion.Completion; import org.netbeans.editor.BaseDocument; import org.netbeans.lib.editor.codetemplates.api.CodeTemplateManager; import org.netbeans.modules.php.blade.editor.ResourceUtilities; +import org.netbeans.modules.php.blade.syntax.BladeDirectivesUtils; import org.netbeans.spi.editor.completion.CompletionItem; import org.netbeans.spi.editor.completion.CompletionTask; import org.netbeans.spi.editor.completion.support.CompletionUtilities; @@ -39,43 +41,29 @@ * * @author bhaidu */ -public class BladeCompletionItem implements CompletionItem { +public abstract class BladeCompletionItem implements CompletionItem { protected static final int DEFAULT_SORT_PRIORITY = 20; - protected int substitutionOffset; - protected String text; - protected boolean shift; - - //----------- Factory methods -------------- - public static BladeCompletionItem createTag(String name, int substitutionOffset) { - return new BladeTag(name, substitutionOffset); - } - - public static BladeCompletionItem createViewPath(String name, - int substitutionOffset, boolean isFolder, String path) { - return new ViewPath(name, substitutionOffset, isFolder, path); - } - - public static BladeCompletionItem createInlineDirective(String directive, - int substitutionOffset, String description) { - return new InlineDirective(directive, substitutionOffset, description); + private final int substitutionOffset; + private final String name; + @NullAllowed + private final String description; + private boolean shift; + + BladeCompletionItem(String name, int substitutionOffset, String description) { + this.name = name; + this.substitutionOffset = substitutionOffset; + this.description = description; } - public static BladeCompletionItem createDirectiveWithArg(String directive, - int substitutionOffset, String description) { - return new DirectiveWithArg(directive, substitutionOffset, description); + public String getName() { + return this.name; } - public static BladeCompletionItem createBlockDirective(String directive, - String endTag, int substitutionOffset, String description) { - return new BlockDirective(directive, endTag, substitutionOffset, description); + public String getDescription() { + return this.description; } - public static BladeCompletionItem createBlockDirectiveWithArg(String directive, - String endTag, int substitutionOffset, String description) { - return new BlockDirectiveWithArg(directive, endTag, substitutionOffset, description); - } - @Override public void defaultAction(JTextComponent component) { if (component != null) { @@ -101,22 +89,11 @@ public int getPreferredWidth(Graphics grphcs, Font font) { return CompletionUtilities.getPreferredWidth(getLeftHtmlText(), getRightHtmlText(), grphcs, font); } - protected String getLeftHtmlText() { - return text; - } - - protected String getRightHtmlText() { - return null; - } - @Override public void render(Graphics g, Font defaultFont, Color defaultColor, Color backgroundColor, int width, int height, boolean selected) { CompletionUtilities.renderHtml(getIcon(), getLeftHtmlText(), getRightHtmlText(), g, defaultFont, defaultColor, width, height, selected); } - protected ImageIcon getIcon() { - return null; - } @Override public CompletionTask createDocumentationTask() { @@ -160,13 +137,25 @@ public CharSequence getSortText() { public CharSequence getInsertPrefix() { return getItemText(); } + + protected ImageIcon getIcon() { + return null; + } + + protected String getLeftHtmlText() { + return name; + } + + protected String getRightHtmlText() { + return null; + } protected String getSubstituteText() { return getItemText(); } public String getItemText() { - return text; + return name; } private boolean substituteText(JTextComponent component, int len) { @@ -222,25 +211,20 @@ protected void reindent(JTextComponent c) { public static class BladeTag extends BladeCompletionItem { public BladeTag(String name, int substitutionOffset) { - this.text = name; - this.substitutionOffset = substitutionOffset; + super(name, substitutionOffset, null); } } public static class InlineDirective extends BladeCompletionItem { - protected String description; - public InlineDirective(String directive, int substitutionOffset, String description) { - this.text = directive; - this.substitutionOffset = substitutionOffset; - this.description = description; + super(directive, substitutionOffset, description); } @Override protected String getRightHtmlText() { - return description; + return getDescription(); } @Override @@ -260,18 +244,17 @@ public DirectiveWithArg(String directive, int substitutionOffset, @Override protected String getSubstituteText() { String template = getItemText() + "($$${arg})"; // NOI18N - switch (text){ - case "@include": // NOI18N - case "@extends": // NOI18N + switch (getName()) { + case BladeDirectivesUtils.DIRECTIVE_INCLUDE, + BladeDirectivesUtils.DIRECTIVE_EXTENDS -> template = getItemText() + "('${path}')"; // NOI18N - break; } return template; } @Override protected String getLeftHtmlText() { - return text + "()"; + return getName() + "()"; // NOI18N } @Override @@ -284,30 +267,27 @@ protected void insertString(BaseDocument doc, int substitutionOffset, public static class BlockDirective extends BladeCompletionItem { - protected String description; - protected String endTag; + private final String endTag; public BlockDirective(String directive, String endTag, int substitutionOffset, String description) { - this.text = directive; - this.substitutionOffset = substitutionOffset; - this.description = description; + super(directive, substitutionOffset, description); this.endTag = endTag; } @Override protected String getSubstituteText() { - return getItemText() + "\n${selection}${cursor}\n" + endTag; + return getItemText() + "\n${selection}${cursor}\n" + endTag; // NOI18N } @Override protected String getLeftHtmlText() { - return text + " ... " + endTag; + return getName() + " ... " + endTag; // NOI18N } @Override protected String getRightHtmlText() { - return description; + return getDescription(); } @Override @@ -322,8 +302,12 @@ protected void insertString(BaseDocument doc, int substitutionOffset, ctx.setCaretPosition(substitutionOffset); CodeTemplateManager.get(doc).createTemporary(substituteText).insert(ctx); } + + public String getEndTag() { + return endTag; + } } - + public static class BlockDirectiveWithArg extends BlockDirective { public BlockDirectiveWithArg(String directive, String endTag, int substitutionOffset, String description) { @@ -332,33 +316,31 @@ public BlockDirectiveWithArg(String directive, String endTag, int substitutionOf @Override protected String getSubstituteText() { - String template = getItemText() + "($$${arg})\n\n${selection}${cursor}\n" + endTag; // NOI18N - - switch (text){ - case "@foreach": - template = getItemText() + "($$${array} as $$${item})\n${selection}${cursor}\n" + endTag; // NOI18N - break; + String template = getItemText() + "($$${arg})\n\n${selection}${cursor}\n" + getEndTag(); // NOI18N + + switch (getName()) { + case BladeDirectivesUtils.DIRECTIVE_FOREACH -> + template = getItemText() + "($$${array} as $$${item})\n${selection}${cursor}\n" + getEndTag(); // NOI18N } - + return template; } @Override protected String getLeftHtmlText() { - return text + "() ... " + endTag; + return getName() + "() ... " + getEndTag(); // NOI18N } } public static class ViewPath extends BladeCompletionItem { - protected boolean isFolder; - protected String filePath; + private final boolean isFolder; + private final String filePath; public ViewPath(String name, int substitutionOffset, boolean isFolder, String filePath) { - this.text = name; - this.substitutionOffset = substitutionOffset; + super(name, substitutionOffset, null); this.isFolder = isFolder; this.filePath = filePath; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java index b4566b493a57..1514c460a43e 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java @@ -40,7 +40,6 @@ */ public class BladeCompletionProposal implements CompletionProposal { - //@StaticResource final CompletionRequest request; protected final ElementHandle element; final String previewValue; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java index b76830d256f6..4fb960ec83bd 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java @@ -38,6 +38,7 @@ import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; import org.netbeans.modules.php.blade.editor.directives.CustomDirectives.CustomDirective; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; +import org.netbeans.modules.php.blade.project.ComponentsSupport; import org.netbeans.modules.php.blade.project.ProjectUtils; import org.netbeans.modules.php.blade.syntax.StringUtils; import org.netbeans.modules.php.blade.syntax.annotation.Directive; @@ -163,30 +164,24 @@ protected void query(CompletionResultSet resultSet, Document doc, int caretOffse } switch (currentToken.getType()) { - case HTML_IDENTIFIER: - completeAttributes(currentToken.getText(), caretOffset, resultSet); - break; - case HTML: + case HTML_IDENTIFIER -> completeAttributes(currentToken.getText(), caretOffset, resultSet); + case HTML -> { String nText = currentToken.getText(); - if ("livewire".startsWith(nText)) { - //quick implementation - //?? - addHtmlTagCompletionItem(nText, "livewire", "livewire", caretOffset, resultSet); // NOI18N + if (ComponentsSupport.LIVEWIRE_NAME.startsWith(nText)) { + addHtmlTagCompletionItem(nText, ComponentsSupport.LIVEWIRE_NAME, caretOffset, resultSet); } - break; - case HTML_COMPONENT_PREFIX: + } + case HTML_COMPONENT_PREFIX -> { String compPrefix = currentToken.getText().length() > 3 ? StringUtils.kebabToCamel(currentToken.getText().substring(3)) : ""; completeComponents(compPrefix, fo, caretOffset, resultSet); - break; - case D_UNKNOWN_ATTR_ENC: - completeDirectives(currentToken.getText(), doc, caretOffset, resultSet); - break; - default: - break; + } + case D_UNKNOWN_ATTR_ENC -> completeDirectives(currentToken.getText(), doc, caretOffset, resultSet); + default -> { + } } } finally { long time = System.currentTimeMillis() - startTime; - if (time > 2000){ + if (time > 2000) { LOGGER.log(Level.INFO, "Slow completion time detected. {0}ms", time); } resultSet.finish(); @@ -229,19 +224,21 @@ public void filterDirectiveName(CustomDirective customDirective, FileObject file if (customDirective.name.startsWith(prefix)) { resultSet.addItem(DirectiveCompletionBuilder.itemWithArg( startOffset, carretOffset, prefix, customDirective.name, - "custom directive", doc, file)); + "custom directive", doc, file)); // NOI18N } } }); } - + private void completeComponents(String prefixIdentifier, FileObject fo, int caretOffset, CompletionResultSet resultSet) { int insertOffset = caretOffset - prefixIdentifier.length(); ComponentsCompletionService componentComplervice = new ComponentsCompletionService(); Collection indexedReferences = componentComplervice.queryComponents(prefixIdentifier, fo); - + if (indexedReferences == null) { + return; + } for (PhpIndexResult indexReference : indexedReferences) { addComponentIdCompletionItem(indexReference, insertOffset, resultSet); @@ -259,8 +256,7 @@ private void completeAttributes(String prefix, int caretOffset, CompletionResult } } - //?? - private void addHtmlTagCompletionItem(String prefix, String tagName, String plugin, + private void addHtmlTagCompletionItem(String prefix, String tagName, int caretOffset, CompletionResultSet resultSet) { int insertOffset = caretOffset - prefix.length(); @@ -293,13 +289,14 @@ private void addComponentIdCompletionItem(PhpIndexResult indexReference, } private static String getReferenceIcon(CompletionType type) { - switch (type) { - case HTML_COMPONENT_TAG: - return ResourceUtilities.COMPONENT_TAG; - case YIELD_ID: - return ResourceUtilities.LAYOUT_IDENTIFIER; - } - return ResourceUtilities.DIRECTIVE_ICON; + return switch (type) { + case HTML_COMPONENT_TAG -> + ResourceUtilities.COMPONENT_TAG; + case YIELD_ID -> + ResourceUtilities.LAYOUT_IDENTIFIER; + default -> + ResourceUtilities.DIRECTIVE_ICON; + }; } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java index 92529fe16625..1234989407b6 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java @@ -333,7 +333,7 @@ private void completeBladePath(String bladePath, FileObject originFile, String filePath = originFile.getPath(); - BladeCompletionItem item = BladeCompletionItem.createViewPath( + BladeCompletionItem item = BladeCompletionBuilder.createViewPath( bladePath, caretOffset, originFile.isFolder(), filePath); resultSet.addItem(item); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionBuilder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionBuilder.java index c73236b032b3..67091496f139 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionBuilder.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionBuilder.java @@ -31,14 +31,14 @@ public class DirectiveCompletionBuilder { public static CompletionItem simpleItem(int startOffset, String directive, String description) { - return BladeCompletionItem.createInlineDirective(directive, startOffset, description); + return BladeCompletionBuilder.createInlineDirective(directive, startOffset, description); } public static CompletionItem simpleItem(int startOffset, int carretOffset, String prefix, String directive, String endtag, String description, Document doc) { - return BladeCompletionItem.createBlockDirective( + return BladeCompletionBuilder.createBlockDirective( directive, endtag, startOffset, description); } @@ -46,14 +46,14 @@ public static CompletionItem itemWithArg(int startOffset, int carretOffset, String prefix, String directive, String description, Document doc) { - return BladeCompletionItem.createDirectiveWithArg(directive, startOffset, description); + return BladeCompletionBuilder.createDirectiveWithArg(directive, startOffset, description); } public static CompletionItem itemWithArg(int startOffset, int carretOffset, String prefix, String directive, String endtag, String description, Document doc) { - return BladeCompletionItem.createBlockDirectiveWithArg( + return BladeCompletionBuilder.createBlockDirectiveWithArg( directive, endtag, startOffset, description); } @@ -61,6 +61,6 @@ public static CompletionItem itemWithArg(int startOffset, int carretOffset, String prefix, String directive, String description, Document doc, FileObject file) { - return BladeCompletionItem.createDirectiveWithArg(directive, startOffset, description); + return BladeCompletionBuilder.createDirectiveWithArg(directive, startOffset, description); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java index 0b30f60add97..49460a03eaec 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java @@ -40,8 +40,8 @@ public void parse(Snapshot snapshot, Task task, SourceModificationEvent event) t if (snapshot == null) { return; } - LOGGER.info(String.format("Parsing request for for " + task.getClass().getName() + " event changed : " + event.sourceChanged())); - if (task.getClass().getName().contains("HtmlCssIndexContributor")) { + + if (task.getClass().getName().contains("HtmlCssIndexContributor")) { // NOI18N LOGGER.log(Level.INFO, "Skipped parsing for {0}", task.getClass().getName()); return; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java index 8d6e7b87458e..4c83efd79ce4 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java @@ -38,6 +38,8 @@ @Namespace(path = "BladeUIKit\\Components", packageName = "blade-ui-kit/blade-ui-kit"),}) // NOI18N public class ComponentsSupport { + public static final String LIVEWIRE_NAME = "livewire"; // NOI18N + private static final Map INSTANCES = new HashMap<>(); private final Map installedComponentNamespace = new HashMap<>(); private boolean scanned = false; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/icon.png b/php/php.blade/src/org/netbeans/modules/php/blade/resources/icons/icon.png deleted file mode 100644 index 87ced4a74a8a75f28331705a6c368f8654294233..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 973 zcmV;;12X)HP)EX>4Tx04R}tkv&MmKpe$iQ?()$2a8B?$WWauh>AK&6^me@v=v%)FuC+YXws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;qmz@Oi`@g@7;y(1mG}v_(bAarW+RVI`Pz| zrE}gV4zZG?5T6r|8gxP8N3P2*zi}=)Ebz>bkx9)Fhls^u8_R9XN`^{2NgPpBjq-)8 z%L?Z$&T6^Jn)l={4Cb}vG}mbkA&x~Pkc0>sRcxRP3sG7%QcR?1Kjz^NJN_iOWO8kQ zkz*besE`~#_#gc4)+|hnyGg+q(D`E9AHzUk7iiRM`}^3o8z+GO8Mx9~{z@H~`6Rv8 z(jrGd-!^b@-O}Ve;Bp5Te9|RDawI=Zp-=$c&*+sb!v+DNN+{ftykfE-YZh(VB zV5CUdYaZ|JZtv~iGtK^f0HlF(yVwbOAOHXW24YJ`L;xEA8vq-0Wtfow000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j&7A76>uO0pnBv00GHKL_t(I%Z<~`i;htk$MMg3 z<{6X4Fbgzl;%?G-$z94@-eQH!Mi^PxD6DAy4SP$OW`PaL!b?e!g|{)Gn`B10MHy2g zk~GH5v6%DJ-BW|JIi1sW{m!|**Y64t^Q;T|u^jJlEfnQP|FJ^Mvp)3THeO;a_TX74 z${W?-m}ea+b|e(#SE%CvMiCmKn1{VF&+dexoQ!$aicQ#zZ`dC5>@l9y@d}r)1AXZ{ zh+eeBJPYVY2hN6~{2cRa2~MH6o?aZo6)eJK!VIzT^ENER1a`+fdy4h=f}UEX#2Nfj z$*hz#jsd*G=>&QJpKAYr921WPvqE7QuQ8m2+vYn#}kJdc3~wRVki{lRJB!&L1|BcEASi}F@$w^ vi+c@l&Arw%aa}l+x^WX%Ls5R1%PfBY;t7whDaFmg00000NkvXXu0mjfnmD{Q diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java index 77ef049327e3..40f5c037c103 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java @@ -38,6 +38,9 @@ public final class BladeDirectivesUtils { public static final String DIRECTIVE_IF = "@if"; // NOI18N public static final String DIRECTIVE_ELSE = "@else"; // NOI18N public static final String DIRECTIVE_ENDIF = "@endif"; // NOI18N + public static final String DIRECTIVE_FOREACH = "@foreach"; // NOI18N + public static final String DIRECTIVE_INCLUDE = "@include"; // NOI18N + public static final String DIRECTIVE_EXTENDS = "@extends"; // NOI18N public static String[] directiveStart2EndPair(String directive){ if (directive.equals(DIRECTIVE_SECTION)){ diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeVariables.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeVariables.java new file mode 100644 index 000000000000..331cd94dacbe --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeVariables.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax; + +/** + * + * @author bogdan + */ +public final class BladeVariables { + + public static final String LOOP_VAR = "$loop"; // NOI18N + + private BladeVariables(){ + + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java index 4fc35854e623..a38c002fd84d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java @@ -552,7 +552,7 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) } public static final String _serializedATN = - "\u0004\u0000+\u0735\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ + "\u0004\u0000+\u0742\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ @@ -715,466 +715,469 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) ".\u0001.\u0001.\u0003.\u047a\b.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ ".\u0001.\u0001.\u0005.\u0484\b.\n.\f.\u0487\t.\u0001.\u0003.\u048a\b."+ "\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0005.\u0496\b.\n.\f.\u0499\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0005.\u04a4\b.\n.\f.\u04a7\t.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0005"+ - ".\u04b5\b.\n.\f.\u04b8\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0005.\u04c5\b.\n.\f.\u04c8\t.\u0001.\u0001"+ ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0005.\u04d6\b.\n.\f.\u04d9\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0005.\u04e2\b.\n.\f.\u04e5\t.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0005.\u04f2\b.\n.\f.\u04f5"+ - "\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0005.\u04ff"+ - "\b.\n.\f.\u0502\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0005.\u050f\b.\n.\f.\u0512\t.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0005.\u051c\b.\n.\f.\u051f\t.\u0001"+ ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0005"+ - ".\u0535\b.\n.\f.\u0538\t.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0005.\u0546\b.\n.\f.\u0549\t.\u0003"+ - ".\u054b\b.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "0\u00010\u00010\u00010\u00011\u00011\u00011\u00011\u00011\u00012\u0001"+ - "2\u00012\u00012\u00012\u00012\u00013\u00013\u00013\u00014\u00014\u0003"+ - "4\u0569\b4\u00014\u00014\u00015\u00015\u00015\u00035\u0570\b5\u00015\u0001"+ - "5\u00016\u00046\u0575\b6\u000b6\f6\u0576\u00016\u00016\u00017\u00017\u0005"+ - "7\u057d\b7\n7\f7\u0580\t7\u00017\u00017\u00018\u00018\u00018\u00018\u0001"+ - "8\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001"+ - ":\u0001;\u0001;\u0003;\u0595\b;\u0001;\u0001;\u0001<\u0001<\u0001<\u0003"+ - "<\u059c\b<\u0001<\u0001<\u0001=\u0004=\u05a1\b=\u000b=\f=\u05a2\u0001"+ - "=\u0001=\u0001>\u0001>\u0005>\u05a9\b>\n>\f>\u05ac\t>\u0001>\u0001>\u0001"+ - "?\u0001?\u0001?\u0001?\u0001?\u0001@\u0004@\u05b6\b@\u000b@\f@\u05b7\u0001"+ - "@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ - "E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001"+ - "G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001"+ - "I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001"+ - "K\u0001K\u0001K\u0001L\u0001L\u0005L\u05fb\bL\nL\fL\u05fe\tL\u0001L\u0001"+ - "L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001"+ - "O\u0001O\u0001O\u0001O\u0005O\u060f\bO\nO\fO\u0612\tO\u0001O\u0001O\u0001"+ - "O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ - "Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ - "R\u0001S\u0001S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001"+ - "U\u0001U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0003.\u0550\b.\u0001.\u0005"+ + ".\u0553\b.\n.\f.\u0556\t.\u0003.\u0558\b.\u0001.\u0001.\u0001/\u0001/"+ + "\u0001/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00011\u0001"+ + "1\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u00012\u00012\u0001"+ + "3\u00013\u00013\u00014\u00014\u00034\u0576\b4\u00014\u00014\u00015\u0001"+ + "5\u00015\u00035\u057d\b5\u00015\u00015\u00016\u00046\u0582\b6\u000b6\f"+ + "6\u0583\u00016\u00016\u00017\u00017\u00057\u058a\b7\n7\f7\u058d\t7\u0001"+ + "7\u00017\u00018\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u0001"+ + "9\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0001;\u0001;\u0003;\u05a2"+ + "\b;\u0001;\u0001;\u0001<\u0001<\u0001<\u0003<\u05a9\b<\u0001<\u0001<\u0001"+ + "=\u0004=\u05ae\b=\u000b=\f=\u05af\u0001=\u0001=\u0001>\u0001>\u0005>\u05b6"+ + "\b>\n>\f>\u05b9\t>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001?\u0001?\u0001"+ + "@\u0004@\u05c3\b@\u000b@\f@\u05c4\u0001@\u0001@\u0001@\u0001@\u0001A\u0001"+ + "A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ + "E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001F\u0001"+ + "F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001"+ + "H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001"+ + "J\u0001J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0005"+ + "L\u0608\bL\nL\fL\u060b\tL\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001"+ + "M\u0001N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0005O\u061c"+ + "\bO\nO\fO\u061f\tO\u0001O\u0001O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001"+ + "P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001"+ + "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001"+ + "S\u0001T\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+ "V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ - "V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001"+ - "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001"+ - "\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001"+ - "]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0001"+ - "_\u0001`\u0001`\u0001`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001"+ - "a\u0001b\u0001b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001c\u0001"+ - "d\u0001d\u0003d\u068f\bd\u0001d\u0001d\u0001d\u0001d\u0001d\u0001e\u0001"+ - "e\u0001e\u0001e\u0001f\u0001f\u0003f\u069c\bf\u0001f\u0001f\u0003f\u06a0"+ - "\bf\u0001f\u0004f\u06a3\bf\u000bf\ff\u06a4\u0001f\u0003f\u06a8\bf\u0001"+ - "f\u0003f\u06ab\bf\u0001f\u0003f\u06ae\bf\u0001f\u0001f\u0003f\u06b2\b"+ - "f\u0001f\u0001f\u0003f\u06b6\bf\u0001f\u0004f\u06b9\bf\u000bf\ff\u06ba"+ - "\u0001f\u0003f\u06be\bf\u0001f\u0001f\u0003f\u06c2\bf\u0005f\u06c4\bf"+ - "\nf\ff\u06c7\tf\u0001f\u0003f\u06ca\bf\u0001f\u0001f\u0001f\u0001f\u0001"+ - "g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0005g\u06d9"+ - "\bg\ng\fg\u06dc\tg\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001"+ - "g\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0003h\u06ec\bh\u0001h\u0001"+ - "h\u0005h\u06f0\bh\nh\fh\u06f3\th\u0001h\u0001h\u0004h\u06f7\bh\u000bh"+ - "\fh\u06f8\u0001h\u0003h\u06fc\bh\u0001h\u0001h\u0003h\u0700\bh\u0004h"+ - "\u0702\bh\u000bh\fh\u0703\u0001h\u0001h\u0001h\u0001h\u0003h\u070a\bh"+ - "\u0001h\u0001h\u0001i\u0001i\u0001i\u0001i\u0001i\u0001j\u0001j\u0001"+ - "j\u0001j\u0001j\u0001k\u0001k\u0001k\u0001k\u0001l\u0001l\u0001l\u0001"+ - "l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001n\u0001"+ - "n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001o\u0001p\u0001p\u0001"+ - "p\u0001p\u0001p\u0006\u0183\u0198\u01a6\u0376\u0422\u0610\u0000q\f\u0000"+ - "\u000e\u0000\u0010\u0000\u0012\u0000\u0014\u0000\u0016\u0000\u0018\n\u001a"+ - "\u0000\u001c\u0000\u001e\u0000 \u0000\"\u0000$(&\u0000(\u0000*\u0000,"+ - "\u000b.\u00000\u00002\u00004\f6\r8\u000e:\u0000<\u0000>\u0000@\u0000B"+ - "\u0000D\u0006F\u0000H\u0000J\u0000L\u0000N\u0000P\u0000R\u0000T\u0000"+ - "V\u0000X\u0000Z\u0000\\\u0000^\u0000`\u0000b\u000fd\u0000f\u0000h\u0000"+ - "j\u0000l\u0000n\u0000p\u0000r\u0010t\u0011v\u0012x\u0013z\u0014|\u0000"+ - "~\u0000\u0080\u0015\u0082\u0016\u0084\u0017\u0086\u0018\u0088\u0019\u008a"+ - "\u0000\u008c\u001a\u008e\u0000\u0090\u0000\u0092\u0000\u0094\u001b\u0096"+ - "\u0000\u0098\u001c\u009a\u001d\u009c\u0000\u009e)\u00a0\u001e\u00a2\u001f"+ - "\u00a4 \u00a6!\u00a8\"\u00aa#\u00ac$\u00ae\u0000\u00b0%\u00b2&\u00b4\u0000"+ - "\u00b6\u0000\u00b8\u0000\u00ba\u0000\u00bc\u0000\u00be\u0000\u00c0\u0000"+ - "\u00c2\u0000\u00c4\u0000\u00c6*\u00c8\u0000\u00ca\u0000\u00cc\u0000\u00ce"+ - "\u0000\u00d0\u0000\u00d2\u0000\u00d4\u0000\u00d6\u0000\u00d8\u0000\u00da"+ - "\u0000\u00dc\u0000\u00de+\u00e0\u0000\u00e2\u0000\u00e4\u0000\u00e6\'"+ - "\u00e8\u0000\u00ea\u0000\u00ec\u0000\f\u0000\u0001\u0002\u0003\u0004\u0005"+ - "\u0006\u0007\b\t\n\u000b-\u0002\u0000FFff\u0002\u0000OOoo\u0002\u0000"+ - "RRrr\u0002\u0000EEee\u0002\u0000AAaa\u0002\u0000CCcc\u0002\u0000HHhh\u0002"+ - "\u0000IIii\u0002\u0000WWww\u0002\u0000LLll\u0002\u0000SSss\u0002\u0000"+ - "TTtt\u0002\u0000NNnn\u0002\u0000PPpp\u0002\u0000UUuu\u0002\u0000YYyy\u0002"+ - "\u0000GGgg\u0002\u0000DDdd\u0002\u0000MMmm\u0001\u0000::\u0004\u0000A"+ - "Z__az\u0080\u8000\ufffe\u0005\u0000-.0:AZaz\u0080\u8000\ufffe\u0002\u0000"+ - "XXxx\u0002\u0000BBbb\u0002\u0000KKkk\u0002\u0000QQqq\u0002\u0000VVvv\u0002"+ - "\u0000JJjj\u0004\u0000\n\n\r\r >>\u0003\u0000\n\n\r\r \u0002\u0000\n"+ - "\n\r\r\u0004\u0000,,..==__\u0001\u0000(;\u0002\u0000[[]]\u0002\u0000#"+ - "#..\u0003\u0000..==__\u0005\u000009AZ__az\u0080\u8000\ufffe\u0003\u0000"+ - "AZaz\u0080\u8000\ufffe\u0006\u0000..09AZ__az\u0080\u8000\ufffe\u0006\u0000"+ - "--09AZ__az\u0080\u8000\ufffe\u0002\u0000\"\"\\\\\u0002\u0000\'\'\\\\\u0001"+ - "\u0000 \u0005\u0000 \'\'::{{}}\u0005\u0000 !\'\'::{{}}\u07d1\u0000\u0018"+ - "\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c"+ - "\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001"+ - "\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000"+ - "\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000"+ - "\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000."+ - "\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001\u0000"+ - "\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000"+ - "\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<"+ - "\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001\u0000"+ - "\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000"+ - "\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000\u0000\u0000J"+ - "\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0000b\u0001\u0000"+ - "\u0000\u0000\u0000d\u0001\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000"+ - "\u0000h\u0001\u0000\u0000\u0000\u0001j\u0001\u0000\u0000\u0000\u0001l"+ - "\u0001\u0000\u0000\u0000\u0001n\u0001\u0000\u0000\u0000\u0002p\u0001\u0000"+ - "\u0000\u0000\u0002r\u0001\u0000\u0000\u0000\u0002t\u0001\u0000\u0000\u0000"+ - "\u0002v\u0001\u0000\u0000\u0000\u0002x\u0001\u0000\u0000\u0000\u0002z"+ - "\u0001\u0000\u0000\u0000\u0002|\u0001\u0000\u0000\u0000\u0003~\u0001\u0000"+ - "\u0000\u0000\u0003\u0080\u0001\u0000\u0000\u0000\u0003\u0082\u0001\u0000"+ - "\u0000\u0000\u0003\u0084\u0001\u0000\u0000\u0000\u0003\u0086\u0001\u0000"+ - "\u0000\u0000\u0003\u0088\u0001\u0000\u0000\u0000\u0003\u008a\u0001\u0000"+ - "\u0000\u0000\u0004\u008c\u0001\u0000\u0000\u0000\u0004\u008e\u0001\u0000"+ - "\u0000\u0000\u0004\u0090\u0001\u0000\u0000\u0000\u0004\u0092\u0001\u0000"+ - "\u0000\u0000\u0005\u0094\u0001\u0000\u0000\u0000\u0005\u0096\u0001\u0000"+ - "\u0000\u0000\u0005\u0098\u0001\u0000\u0000\u0000\u0005\u009a\u0001\u0000"+ - "\u0000\u0000\u0005\u009c\u0001\u0000\u0000\u0000\u0005\u009e\u0001\u0000"+ - "\u0000\u0000\u0005\u00a0\u0001\u0000\u0000\u0000\u0005\u00a2\u0001\u0000"+ - "\u0000\u0000\u0005\u00a4\u0001\u0000\u0000\u0000\u0005\u00a6\u0001\u0000"+ - "\u0000\u0000\u0005\u00a8\u0001\u0000\u0000\u0000\u0005\u00aa\u0001\u0000"+ - "\u0000\u0000\u0005\u00ac\u0001\u0000\u0000\u0000\u0005\u00ae\u0001\u0000"+ - "\u0000\u0000\u0006\u00b0\u0001\u0000\u0000\u0000\u0006\u00b2\u0001\u0000"+ - "\u0000\u0000\u0006\u00b4\u0001\u0000\u0000\u0000\u0006\u00b6\u0001\u0000"+ - "\u0000\u0000\u0007\u00b8\u0001\u0000\u0000\u0000\u0007\u00ba\u0001\u0000"+ - "\u0000\u0000\u0007\u00bc\u0001\u0000\u0000\u0000\u0007\u00be\u0001\u0000"+ - "\u0000\u0000\b\u00c0\u0001\u0000\u0000\u0000\b\u00c2\u0001\u0000\u0000"+ - "\u0000\b\u00c4\u0001\u0000\u0000\u0000\b\u00c6\u0001\u0000\u0000\u0000"+ - "\b\u00c8\u0001\u0000\u0000\u0000\b\u00ca\u0001\u0000\u0000\u0000\t\u00cc"+ - "\u0001\u0000\u0000\u0000\t\u00ce\u0001\u0000\u0000\u0000\t\u00d0\u0001"+ - "\u0000\u0000\u0000\t\u00d2\u0001\u0000\u0000\u0000\n\u00d4\u0001\u0000"+ - "\u0000\u0000\n\u00d6\u0001\u0000\u0000\u0000\n\u00d8\u0001\u0000\u0000"+ - "\u0000\n\u00da\u0001\u0000\u0000\u0000\n\u00dc\u0001\u0000\u0000\u0000"+ - "\n\u00de\u0001\u0000\u0000\u0000\n\u00e0\u0001\u0000\u0000\u0000\n\u00e2"+ - "\u0001\u0000\u0000\u0000\n\u00e4\u0001\u0000\u0000\u0000\u000b\u00e6\u0001"+ - "\u0000\u0000\u0000\u000b\u00e8\u0001\u0000\u0000\u0000\u000b\u00ea\u0001"+ - "\u0000\u0000\u0000\u000b\u00ec\u0001\u0000\u0000\u0000\f\u00f5\u0001\u0000"+ - "\u0000\u0000\u000e\u015b\u0001\u0000\u0000\u0000\u0010\u015d\u0001\u0000"+ - "\u0000\u0000\u0012\u0179\u0001\u0000\u0000\u0000\u0014\u0188\u0001\u0000"+ - "\u0000\u0000\u0016\u018f\u0001\u0000\u0000\u0000\u0018\u01ae\u0001\u0000"+ - "\u0000\u0000\u001a\u01cc\u0001\u0000\u0000\u0000\u001c\u023e\u0001\u0000"+ - "\u0000\u0000\u001e\u0259\u0001\u0000\u0000\u0000 \u0288\u0001\u0000\u0000"+ - "\u0000\"\u028c\u0001\u0000\u0000\u0000$\u0299\u0001\u0000\u0000\u0000"+ - "&\u02bf\u0001\u0000\u0000\u0000(\u02e4\u0001\u0000\u0000\u0000*\u02e8"+ - "\u0001\u0000\u0000\u0000,\u02f5\u0001\u0000\u0000\u0000.\u02fc\u0001\u0000"+ - "\u0000\u00000\u0349\u0001\u0000\u0000\u00002\u034d\u0001\u0000\u0000\u0000"+ - "4\u0356\u0001\u0000\u0000\u00006\u035c\u0001\u0000\u0000\u00008\u035f"+ - "\u0001\u0000\u0000\u0000:\u0363\u0001\u0000\u0000\u0000<\u0369\u0001\u0000"+ - "\u0000\u0000>\u037d\u0001\u0000\u0000\u0000@\u0390\u0001\u0000\u0000\u0000"+ - "B\u03a0\u0001\u0000\u0000\u0000D\u03c1\u0001\u0000\u0000\u0000F\u03e5"+ - "\u0001\u0000\u0000\u0000H\u03f5\u0001\u0000\u0000\u0000J\u03fe\u0001\u0000"+ - "\u0000\u0000L\u0402\u0001\u0000\u0000\u0000N\u0406\u0001\u0000\u0000\u0000"+ - "P\u040d\u0001\u0000\u0000\u0000R\u0414\u0001\u0000\u0000\u0000T\u041b"+ - "\u0001\u0000\u0000\u0000V\u041d\u0001\u0000\u0000\u0000X\u0427\u0001\u0000"+ - "\u0000\u0000Z\u0432\u0001\u0000\u0000\u0000\\\u043b\u0001\u0000\u0000"+ - "\u0000^\u0450\u0001\u0000\u0000\u0000`\u0452\u0001\u0000\u0000\u0000b"+ - "\u0454\u0001\u0000\u0000\u0000d\u045b\u0001\u0000\u0000\u0000f\u0461\u0001"+ - "\u0000\u0000\u0000h\u054a\u0001\u0000\u0000\u0000j\u054e\u0001\u0000\u0000"+ - "\u0000l\u0554\u0001\u0000\u0000\u0000n\u0558\u0001\u0000\u0000\u0000p"+ - "\u055d\u0001\u0000\u0000\u0000r\u0563\u0001\u0000\u0000\u0000t\u0568\u0001"+ - "\u0000\u0000\u0000v\u056f\u0001\u0000\u0000\u0000x\u0574\u0001\u0000\u0000"+ - "\u0000z\u057a\u0001\u0000\u0000\u0000|\u0583\u0001\u0000\u0000\u0000~"+ - "\u0588\u0001\u0000\u0000\u0000\u0080\u058f\u0001\u0000\u0000\u0000\u0082"+ - "\u0594\u0001\u0000\u0000\u0000\u0084\u059b\u0001\u0000\u0000\u0000\u0086"+ - "\u05a0\u0001\u0000\u0000\u0000\u0088\u05a6\u0001\u0000\u0000\u0000\u008a"+ - "\u05af\u0001\u0000\u0000\u0000\u008c\u05b5\u0001\u0000\u0000\u0000\u008e"+ - "\u05bd\u0001\u0000\u0000\u0000\u0090\u05c3\u0001\u0000\u0000\u0000\u0092"+ - "\u05c8\u0001\u0000\u0000\u0000\u0094\u05cd\u0001\u0000\u0000\u0000\u0096"+ - "\u05d2\u0001\u0000\u0000\u0000\u0098\u05d9\u0001\u0000\u0000\u0000\u009a"+ - "\u05de\u0001\u0000\u0000\u0000\u009c\u05e3\u0001\u0000\u0000\u0000\u009e"+ - "\u05e9\u0001\u0000\u0000\u0000\u00a0\u05ee\u0001\u0000\u0000\u0000\u00a2"+ - "\u05f3\u0001\u0000\u0000\u0000\u00a4\u05f8\u0001\u0000\u0000\u0000\u00a6"+ - "\u0601\u0001\u0000\u0000\u0000\u00a8\u0606\u0001\u0000\u0000\u0000\u00aa"+ - "\u060a\u0001\u0000\u0000\u0000\u00ac\u0618\u0001\u0000\u0000\u0000\u00ae"+ - "\u061b\u0001\u0000\u0000\u0000\u00b0\u0620\u0001\u0000\u0000\u0000\u00b2"+ - "\u062a\u0001\u0000\u0000\u0000\u00b4\u062f\u0001\u0000\u0000\u0000\u00b6"+ - "\u0633\u0001\u0000\u0000\u0000\u00b8\u0638\u0001\u0000\u0000\u0000\u00ba"+ - "\u0648\u0001\u0000\u0000\u0000\u00bc\u064d\u0001\u0000\u0000\u0000\u00be"+ - "\u0651\u0001\u0000\u0000\u0000\u00c0\u0656\u0001\u0000\u0000\u0000\u00c2"+ - "\u065e\u0001\u0000\u0000\u0000\u00c4\u0664\u0001\u0000\u0000\u0000\u00c6"+ - "\u066b\u0001\u0000\u0000\u0000\u00c8\u0670\u0001\u0000\u0000\u0000\u00ca"+ - "\u0674\u0001\u0000\u0000\u0000\u00cc\u0679\u0001\u0000\u0000\u0000\u00ce"+ - "\u067e\u0001\u0000\u0000\u0000\u00d0\u0683\u0001\u0000\u0000\u0000\u00d2"+ - "\u0687\u0001\u0000\u0000\u0000\u00d4\u068c\u0001\u0000\u0000\u0000\u00d6"+ - "\u0695\u0001\u0000\u0000\u0000\u00d8\u0699\u0001\u0000\u0000\u0000\u00da"+ - "\u06cf\u0001\u0000\u0000\u0000\u00dc\u0709\u0001\u0000\u0000\u0000\u00de"+ - "\u070d\u0001\u0000\u0000\u0000\u00e0\u0712\u0001\u0000\u0000\u0000\u00e2"+ - "\u0717\u0001\u0000\u0000\u0000\u00e4\u071b\u0001\u0000\u0000\u0000\u00e6"+ - "\u0720\u0001\u0000\u0000\u0000\u00e8\u0727\u0001\u0000\u0000\u0000\u00ea"+ - "\u072c\u0001\u0000\u0000\u0000\u00ec\u0730\u0001\u0000\u0000\u0000\u00ee"+ - "\u00ef\u0005:\u0000\u0000\u00ef\u00f6\u0005:\u0000\u0000\u00f0\u00f1\u0005"+ - "?\u0000\u0000\u00f1\u00f6\u0005:\u0000\u0000\u00f2\u00f3\u0005 \u0000"+ - "\u0000\u00f3\u00f4\u0005:\u0000\u0000\u00f4\u00f6\u0005 \u0000\u0000\u00f5"+ - "\u00ee\u0001\u0000\u0000\u0000\u00f5\u00f0\u0001\u0000\u0000\u0000\u00f5"+ - "\u00f2\u0001\u0000\u0000\u0000\u00f6\r\u0001\u0000\u0000\u0000\u00f7\u00f8"+ - "\u0007\u0000\u0000\u0000\u00f8\u00f9\u0007\u0001\u0000\u0000\u00f9\u00fa"+ - "\u0007\u0002\u0000\u0000\u00fa\u00ff\u0001\u0000\u0000\u0000\u00fb\u00fc"+ - "\u0007\u0003\u0000\u0000\u00fc\u00fd\u0007\u0004\u0000\u0000\u00fd\u00fe"+ - "\u0007\u0005\u0000\u0000\u00fe\u0100\u0007\u0006\u0000\u0000\u00ff\u00fb"+ - "\u0001\u0000\u0000\u0000\u00ff\u0100\u0001\u0000\u0000\u0000\u0100\u015c"+ - "\u0001\u0000\u0000\u0000\u0101\u0102\u0007\u0007\u0000\u0000\u0102\u015c"+ - "\u0007\u0000\u0000\u0000\u0103\u0104\u0007\b\u0000\u0000\u0104\u0105\u0007"+ - "\u0006\u0000\u0000\u0105\u0106\u0007\u0007\u0000\u0000\u0106\u0107\u0007"+ - "\t\u0000\u0000\u0107\u015c\u0007\u0003\u0000\u0000\u0108\u0109\u0007\n"+ - "\u0000\u0000\u0109\u010a\u0007\u0003\u0000\u0000\u010a\u010b\u0007\u0005"+ - "\u0000\u0000\u010b\u010c\u0007\u000b\u0000\u0000\u010c\u010d\u0007\u0007"+ - "\u0000\u0000\u010d\u010e\u0007\u0001\u0000\u0000\u010e\u015c\u0007\f\u0000"+ - "\u0000\u010f\u0110\u0007\n\u0000\u0000\u0110\u0111\u0007\u0003\u0000\u0000"+ - "\u0111\u0112\u0007\n\u0000\u0000\u0112\u0113\u0007\n\u0000\u0000\u0113"+ - "\u0114\u0007\u0007\u0000\u0000\u0114\u0115\u0007\u0001\u0000\u0000\u0115"+ - "\u015c\u0007\f\u0000\u0000\u0116\u0117\u0007\u0001\u0000\u0000\u0117\u0118"+ - "\u0007\f\u0000\u0000\u0118\u0119\u0007\u0005\u0000\u0000\u0119\u015c\u0007"+ - "\u0003\u0000\u0000\u011a\u011b\u0007\r\u0000\u0000\u011b\u011c\u0007\u000e"+ - "\u0000\u0000\u011c\u011d\u0007\n\u0000\u0000\u011d\u015c\u0007\u0006\u0000"+ - "\u0000\u011e\u011f\u0007\r\u0000\u0000\u011f\u0120\u0007\u000e\u0000\u0000"+ - "\u0120\u0121\u0007\n\u0000\u0000\u0121\u0122\u0007\u0006\u0000\u0000\u0122"+ - "\u0123\u0007\u0001\u0000\u0000\u0123\u0124\u0007\f\u0000\u0000\u0124\u0125"+ - "\u0007\u0005\u0000\u0000\u0125\u015c\u0007\u0003\u0000\u0000\u0126\u0127"+ - "\u0007\n\u0000\u0000\u0127\u0128\u0007\b\u0000\u0000\u0128\u0129\u0007"+ - "\u0007\u0000\u0000\u0129\u012a\u0007\u000b\u0000\u0000\u012a\u012b\u0007"+ - "\u0005\u0000\u0000\u012b\u015c\u0007\u0006\u0000\u0000\u012c\u012d\u0007"+ - "\u000e\u0000\u0000\u012d\u012e\u0007\f\u0000\u0000\u012e\u012f\u0007\t"+ - "\u0000\u0000\u012f\u0130\u0007\u0003\u0000\u0000\u0130\u0131\u0007\n\u0000"+ - "\u0000\u0131\u015c\u0007\n\u0000\u0000\u0132\u0133\u0007\u0005\u0000\u0000"+ - "\u0133\u0134\u0007\u0004\u0000\u0000\u0134\u0135\u0007\f\u0000\u0000\u0135"+ - "\u013c\u0001\u0000\u0000\u0000\u0136\u0137\u0007\u0004\u0000\u0000\u0137"+ - "\u0138\u0007\f\u0000\u0000\u0138\u013d\u0007\u000f\u0000\u0000\u0139\u013a"+ - "\u0007\f\u0000\u0000\u013a\u013b\u0007\u0001\u0000\u0000\u013b\u013d\u0007"+ - "\u000b\u0000\u0000\u013c\u0136\u0001\u0000\u0000\u0000\u013c\u0139\u0001"+ - "\u0000\u0000\u0000\u013c\u013d\u0001\u0000\u0000\u0000\u013d\u015c\u0001"+ - "\u0000\u0000\u0000\u013e\u013f\u0007\u0004\u0000\u0000\u013f\u0140\u0007"+ - "\u000e\u0000\u0000\u0140\u0141\u0007\u000b\u0000\u0000\u0141\u015c\u0007"+ - "\u0006\u0000\u0000\u0142\u0143\u0007\u0010\u0000\u0000\u0143\u0144\u0007"+ - "\u000e\u0000\u0000\u0144\u0145\u0007\u0003\u0000\u0000\u0145\u0146\u0007"+ - "\n\u0000\u0000\u0146\u015c\u0007\u000b\u0000\u0000\u0147\u0148\u0007\u0003"+ - "\u0000\u0000\u0148\u0149\u0007\u0002\u0000\u0000\u0149\u014a\u0007\u0002"+ - "\u0000\u0000\u014a\u014b\u0007\u0001\u0000\u0000\u014b\u015c\u0007\u0002"+ - "\u0000\u0000\u014c\u014d\u0007\r\u0000\u0000\u014d\u014e\u0007\u0002\u0000"+ - "\u0000\u014e\u014f\u0007\u0001\u0000\u0000\u014f\u0150\u0007\u0011\u0000"+ - "\u0000\u0150\u0151\u0007\u000e\u0000\u0000\u0151\u0152\u0007\u0005\u0000"+ - "\u0000\u0152\u0153\u0007\u000b\u0000\u0000\u0153\u0154\u0007\u0007\u0000"+ - "\u0000\u0154\u0155\u0007\u0001\u0000\u0000\u0155\u015c\u0007\f\u0000\u0000"+ - "\u0156\u0157\u0007\u0003\u0000\u0000\u0157\u0158\u0007\u0012\u0000\u0000"+ - "\u0158\u0159\u0007\r\u0000\u0000\u0159\u015a\u0007\u000b\u0000\u0000\u015a"+ - "\u015c\u0007\u000f\u0000\u0000\u015b\u00f7\u0001\u0000\u0000\u0000\u015b"+ - "\u0101\u0001\u0000\u0000\u0000\u015b\u0103\u0001\u0000\u0000\u0000\u015b"+ - "\u0108\u0001\u0000\u0000\u0000\u015b\u010f\u0001\u0000\u0000\u0000\u015b"+ - "\u0116\u0001\u0000\u0000\u0000\u015b\u011a\u0001\u0000\u0000\u0000\u015b"+ - "\u011e\u0001\u0000\u0000\u0000\u015b\u0126\u0001\u0000\u0000\u0000\u015b"+ - "\u012c\u0001\u0000\u0000\u0000\u015b\u0132\u0001\u0000\u0000\u0000\u015b"+ - "\u013e\u0001\u0000\u0000\u0000\u015b\u0142\u0001\u0000\u0000\u0000\u015b"+ - "\u0147\u0001\u0000\u0000\u0000\u015b\u014c\u0001\u0000\u0000\u0000\u015b"+ - "\u0156\u0001\u0000\u0000\u0000\u015c\u000f\u0001\u0000\u0000\u0000\u015d"+ - "\u015e\u0005@\u0000\u0000\u015e\u015f\u0007\u0007\u0000\u0000\u015f\u0160"+ - "\u0007\f\u0000\u0000\u0160\u0161\u0007\u0005\u0000\u0000\u0161\u0162\u0007"+ - "\t\u0000\u0000\u0162\u0163\u0007\u000e\u0000\u0000\u0163\u0164\u0007\u0011"+ - "\u0000\u0000\u0164\u0165\u0007\u0003\u0000\u0000\u0165\u0177\u0001\u0000"+ - "\u0000\u0000\u0166\u0167\u0007\u0007\u0000\u0000\u0167\u0178\u0007\u0000"+ - "\u0000\u0000\u0168\u0169\u0007\b\u0000\u0000\u0169\u016a\u0007\u0006\u0000"+ - "\u0000\u016a\u016b\u0007\u0003\u0000\u0000\u016b\u0178\u0007\f\u0000\u0000"+ - "\u016c\u016d\u0007\u0000\u0000\u0000\u016d\u016e\u0007\u0007\u0000\u0000"+ - "\u016e\u016f\u0007\u0002\u0000\u0000\u016f\u0170\u0007\n\u0000\u0000\u0170"+ - "\u0178\u0007\u000b\u0000\u0000\u0171\u0172\u0007\u000e\u0000\u0000\u0172"+ - "\u0173\u0007\f\u0000\u0000\u0173\u0174\u0007\t\u0000\u0000\u0174\u0175"+ - "\u0007\u0003\u0000\u0000\u0175\u0176\u0007\n\u0000\u0000\u0176\u0178\u0007"+ - "\n\u0000\u0000\u0177\u0166\u0001\u0000\u0000\u0000\u0177\u0168\u0001\u0000"+ - "\u0000\u0000\u0177\u016c\u0001\u0000\u0000\u0000\u0177\u0171\u0001\u0000"+ - "\u0000\u0000\u0177\u0178\u0001\u0000\u0000\u0000\u0178\u0011\u0001\u0000"+ - "\u0000\u0000\u0179\u0183\u0005\"\u0000\u0000\u017a\u0182\u0003T$\u0000"+ - "\u017b\u017c\u0005{\u0000\u0000\u017c\u017d\u0003\\(\u0000\u017d\u017e"+ - "\u0005}\u0000\u0000\u017e\u0182\u0001\u0000\u0000\u0000\u017f\u0182\t"+ - "\u0000\u0000\u0000\u0180\u0182\b\u0013\u0000\u0000\u0181\u017a\u0001\u0000"+ - "\u0000\u0000\u0181\u017b\u0001\u0000\u0000\u0000\u0181\u017f\u0001\u0000"+ - "\u0000\u0000\u0181\u0180\u0001\u0000\u0000\u0000\u0182\u0185\u0001\u0000"+ - "\u0000\u0000\u0183\u0184\u0001\u0000\u0000\u0000\u0183\u0181\u0001\u0000"+ - "\u0000\u0000\u0184\u0186\u0001\u0000\u0000\u0000\u0185\u0183\u0001\u0000"+ - "\u0000\u0000\u0186\u0187\u0005\"\u0000\u0000\u0187\u0013\u0001\u0000\u0000"+ - "\u0000\u0188\u018c\u0007\u0014\u0000\u0000\u0189\u018b\u0007\u0015\u0000"+ - "\u0000\u018a\u0189\u0001\u0000\u0000\u0000\u018b\u018e\u0001\u0000\u0000"+ - "\u0000\u018c\u018a\u0001\u0000\u0000\u0000\u018c\u018d\u0001\u0000\u0000"+ - "\u0000\u018d\u0015\u0001\u0000\u0000\u0000\u018e\u018c\u0001\u0000\u0000"+ - "\u0000\u018f\u0190\u0005\u00b0\u0000\u0000\u0190\u0017\u0001\u0000\u0000"+ - "\u0000\u0191\u0192\u0005<\u0000\u0000\u0192\u0193\u0005?\u0000\u0000\u0193"+ - "\u0194\u0005=\u0000\u0000\u0194\u0198\u0001\u0000\u0000\u0000\u0195\u0197"+ - "\t\u0000\u0000\u0000\u0196\u0195\u0001\u0000\u0000\u0000\u0197\u019a\u0001"+ - "\u0000\u0000\u0000\u0198\u0199\u0001\u0000\u0000\u0000\u0198\u0196\u0001"+ - "\u0000\u0000\u0000\u0199\u019b\u0001\u0000\u0000\u0000\u019a\u0198\u0001"+ - "\u0000\u0000\u0000\u019b\u019c\u0005?\u0000\u0000\u019c\u01af\u0005>\u0000"+ - "\u0000\u019d\u019e\u0005<\u0000\u0000\u019e\u019f\u0005?\u0000\u0000\u019f"+ - "\u01a0\u0007\r\u0000\u0000\u01a0\u01a1\u0007\u0006\u0000\u0000\u01a1\u01a2"+ - "\u0007\r\u0000\u0000\u01a2\u01a6\u0001\u0000\u0000\u0000\u01a3\u01a5\t"+ - "\u0000\u0000\u0000\u01a4\u01a3\u0001\u0000\u0000\u0000\u01a5\u01a8\u0001"+ - "\u0000\u0000\u0000\u01a6\u01a7\u0001\u0000\u0000\u0000\u01a6\u01a4\u0001"+ - "\u0000\u0000\u0000\u01a7\u01ac\u0001\u0000\u0000\u0000\u01a8\u01a6\u0001"+ - "\u0000\u0000\u0000\u01a9\u01aa\u0005?\u0000\u0000\u01aa\u01ad\u0005>\u0000"+ - "\u0000\u01ab\u01ad\u0005\u0000\u0000\u0001\u01ac\u01a9\u0001\u0000\u0000"+ - "\u0000\u01ac\u01ab\u0001\u0000\u0000\u0000\u01ad\u01af\u0001\u0000\u0000"+ - "\u0000\u01ae\u0191\u0001\u0000\u0000\u0000\u01ae\u019d\u0001\u0000\u0000"+ - "\u0000\u01af\u0019\u0001\u0000\u0000\u0000\u01b0\u01b1\u0005@\u0000\u0000"+ - "\u01b1\u01cd\u0003\u000e\u0001\u0000\u01b2\u01b3\u0005@\u0000\u0000\u01b3"+ - "\u01b4\u0007\n\u0000\u0000\u01b4\u01b5\u0007\u0003\u0000\u0000\u01b5\u01b6"+ - "\u0007\u0005\u0000\u0000\u01b6\u01b7\u0007\u000b\u0000\u0000\u01b7\u01b8"+ - "\u0007\u0007\u0000\u0000\u01b8\u01b9\u0007\u0001\u0000\u0000\u01b9\u01ba"+ - "\u0007\f\u0000\u0000\u01ba\u01bb\u0007\u0012\u0000\u0000\u01bb\u01bc\u0007"+ - "\u0007\u0000\u0000\u01bc\u01bd\u0007\n\u0000\u0000\u01bd\u01be\u0007\n"+ - "\u0000\u0000\u01be\u01bf\u0007\u0007\u0000\u0000\u01bf\u01c0\u0007\f\u0000"+ - "\u0000\u01c0\u01cd\u0007\u0010\u0000\u0000\u01c1\u01c2\u0005@\u0000\u0000"+ - "\u01c2\u01c3\u0007\u0006\u0000\u0000\u01c3\u01c4\u0007\u0004\u0000\u0000"+ - "\u01c4\u01c5\u0007\n\u0000\u0000\u01c5\u01c6\u0007\n\u0000\u0000\u01c6"+ - "\u01c7\u0007\u0003\u0000\u0000\u01c7\u01c8\u0007\u0005\u0000\u0000\u01c8"+ - "\u01c9\u0007\u000b\u0000\u0000\u01c9\u01ca\u0007\u0007\u0000\u0000\u01ca"+ - "\u01cb\u0007\u0001\u0000\u0000\u01cb\u01cd\u0007\f\u0000\u0000\u01cc\u01b0"+ - "\u0001\u0000\u0000\u0000\u01cc\u01b2\u0001\u0000\u0000\u0000\u01cc\u01c1"+ - "\u0001\u0000\u0000\u0000\u01cd\u01ce\u0001\u0000\u0000\u0000\u01ce\u01cf"+ - "\u0006\u0007\u0000\u0000\u01cf\u01d0\u0006\u0007\u0001\u0000\u01d0\u001b"+ - "\u0001\u0000\u0000\u0000\u01d1\u01d2\u0005@\u0000\u0000\u01d2\u01d3\u0007"+ - "\u0003\u0000\u0000\u01d3\u01d4\u0007\t\u0000\u0000\u01d4\u01d5\u0007\n"+ - "\u0000\u0000\u01d5\u01d6\u0007\u0003\u0000\u0000\u01d6\u01d7\u0007\u0007"+ - "\u0000\u0000\u01d7\u023f\u0007\u0000\u0000\u0000\u01d8\u023f\u0003\u0010"+ - "\u0002\u0000\u01d9\u01da\u0005@\u0000\u0000\u01da\u01db\u0007\u0003\u0000"+ - "\u0000\u01db\u01dc\u0007\u0016\u0000\u0000\u01dc\u01dd\u0007\u000b\u0000"+ - "\u0000\u01dd\u01de\u0007\u0003\u0000\u0000\u01de\u01df\u0007\f\u0000\u0000"+ - "\u01df\u01e0\u0007\u0011\u0000\u0000\u01e0\u023f\u0007\n\u0000\u0000\u01e1"+ - "\u01e2\u0005@\u0000\u0000\u01e2\u01e3\u0007\u0003\u0000\u0000\u01e3\u01e4"+ - "\u0007\u0004\u0000\u0000\u01e4\u01e5\u0007\u0005\u0000\u0000\u01e5\u023f"+ - "\u0007\u0006\u0000\u0000\u01e6\u01e7\u0005@\u0000\u0000\u01e7\u01e8\u0007"+ - "\u000f\u0000\u0000\u01e8\u01e9\u0007\u0007\u0000\u0000\u01e9\u01ea\u0007"+ - "\u0003\u0000\u0000\u01ea\u01eb\u0007\t\u0000\u0000\u01eb\u023f\u0007\u0011"+ - "\u0000\u0000\u01ec\u01ed\u0005@\u0000\u0000\u01ed\u01ee\u0007\r\u0000"+ - "\u0000\u01ee\u01ef\u0007\u0002\u0000\u0000\u01ef\u01f0\u0007\u0001\u0000"+ - "\u0000\u01f0\u01f1\u0007\r\u0000\u0000\u01f1\u023f\u0007\n\u0000\u0000"+ - "\u01f2\u01f3\u0005@\u0000\u0000\u01f3\u01f4\u0007\u0012\u0000\u0000\u01f4"+ - "\u01f5\u0007\u0003\u0000\u0000\u01f5\u01f6\u0007\u000b\u0000\u0000\u01f6"+ - "\u01f7\u0007\u0006\u0000\u0000\u01f7\u01f8\u0007\u0001\u0000\u0000\u01f8"+ - "\u023f\u0007\u0011\u0000\u0000\u01f9\u01fa\u0005@\u0000\u0000\u01fa\u01fb"+ - "\u0007\u0005\u0000\u0000\u01fb\u01fc\u0007\t\u0000\u0000\u01fc\u01fd\u0007"+ - "\u0004\u0000\u0000\u01fd\u01fe\u0007\n\u0000\u0000\u01fe\u023f\u0007\n"+ - "\u0000\u0000\u01ff\u0200\u0005@\u0000\u0000\u0200\u0201\u0007\n\u0000"+ - "\u0000\u0201\u0202\u0007\u000b\u0000\u0000\u0202\u0203\u0007\u000f\u0000"+ - "\u0000\u0203\u0204\u0007\t\u0000\u0000\u0204\u023f\u0007\u0003\u0000\u0000"+ - "\u0205\u0206\u0005@\u0000\u0000\u0206\u0207\u0007\u0004\u0000\u0000\u0207"+ - "\u0208\u0007\b\u0000\u0000\u0208\u0209\u0007\u0004\u0000\u0000\u0209\u020a"+ - "\u0007\u0002\u0000\u0000\u020a\u023f\u0007\u0003\u0000\u0000\u020b\u020c"+ - "\u0005@\u0000\u0000\u020c\u020d\u0007\u0017\u0000\u0000\u020d\u020e\u0007"+ - "\u0002\u0000\u0000\u020e\u020f\u0007\u0003\u0000\u0000\u020f\u0210\u0007"+ - "\u0004\u0000\u0000\u0210\u023f\u0007\u0018\u0000\u0000\u0211\u0212\u0005"+ - "@\u0000\u0000\u0212\u0213\u0007\u0005\u0000\u0000\u0213\u0214\u0007\u0001"+ - "\u0000\u0000\u0214\u0215\u0007\f\u0000\u0000\u0215\u0216\u0007\u000b\u0000"+ - "\u0000\u0216\u0217\u0007\u0007\u0000\u0000\u0217\u0218\u0007\f\u0000\u0000"+ - "\u0218\u0219\u0007\u000e\u0000\u0000\u0219\u023f\u0007\u0003\u0000\u0000"+ - "\u021a\u021b\u0005@\u0000\u0000\u021b\u021c\u0007\n\u0000\u0000\u021c"+ - "\u021d\u0007\u0003\u0000\u0000\u021d\u021e\u0007\t\u0000\u0000\u021e\u021f"+ - "\u0007\u0003\u0000\u0000\u021f\u0220\u0007\u0005\u0000\u0000\u0220\u0221"+ - "\u0007\u000b\u0000\u0000\u0221\u0222\u0007\u0003\u0000\u0000\u0222\u023f"+ - "\u0007\u0011\u0000\u0000\u0223\u0224\u0005@\u0000\u0000\u0224\u0225\u0007"+ - "\u0011\u0000\u0000\u0225\u0226\u0007\u0007\u0000\u0000\u0226\u0227\u0007"+ - "\n\u0000\u0000\u0227\u0228\u0007\u0004\u0000\u0000\u0228\u0229\u0007\u0017"+ - "\u0000\u0000\u0229\u022a\u0007\t\u0000\u0000\u022a\u022b\u0007\u0003\u0000"+ - "\u0000\u022b\u023f\u0007\u0011\u0000\u0000\u022c\u022d\u0005@\u0000\u0000"+ - "\u022d\u022e\u0007\u0002\u0000\u0000\u022e\u022f\u0007\u0003\u0000\u0000"+ - "\u022f\u0230\u0007\u0004\u0000\u0000\u0230\u0231\u0007\u0011\u0000\u0000"+ - "\u0231\u0232\u0007\u0001\u0000\u0000\u0232\u0233\u0007\f\u0000\u0000\u0233"+ - "\u0234\u0007\t\u0000\u0000\u0234\u023f\u0007\u000f\u0000\u0000\u0235\u0236"+ - "\u0005@\u0000\u0000\u0236\u0237\u0007\u0002\u0000\u0000\u0237\u0238\u0007"+ - "\u0003\u0000\u0000\u0238\u0239\u0007\u0019\u0000\u0000\u0239\u023a\u0007"+ - "\u000e\u0000\u0000\u023a\u023b\u0007\u0007\u0000\u0000\u023b\u023c\u0007"+ - "\u0002\u0000\u0000\u023c\u023d\u0007\u0003\u0000\u0000\u023d\u023f\u0007"+ - "\u0011\u0000\u0000\u023e\u01d1\u0001\u0000\u0000\u0000\u023e\u01d8\u0001"+ - "\u0000\u0000\u0000\u023e\u01d9\u0001\u0000\u0000\u0000\u023e\u01e1\u0001"+ - "\u0000\u0000\u0000\u023e\u01e6\u0001\u0000\u0000\u0000\u023e\u01ec\u0001"+ - "\u0000\u0000\u0000\u023e\u01f2\u0001\u0000\u0000\u0000\u023e\u01f9\u0001"+ - "\u0000\u0000\u0000\u023e\u01ff\u0001\u0000\u0000\u0000\u023e\u0205\u0001"+ - "\u0000\u0000\u0000\u023e\u020b\u0001\u0000\u0000\u0000\u023e\u0211\u0001"+ - "\u0000\u0000\u0000\u023e\u021a\u0001\u0000\u0000\u0000\u023e\u0223\u0001"+ - "\u0000\u0000\u0000\u023e\u022c\u0001\u0000\u0000\u0000\u023e\u0235\u0001"+ - "\u0000\u0000\u0000\u023f\u0241\u0001\u0000\u0000\u0000\u0240\u0242\u0005"+ - " \u0000\u0000\u0241\u0240\u0001\u0000\u0000\u0000\u0242\u0243\u0001\u0000"+ - "\u0000\u0000\u0243\u0241\u0001\u0000\u0000\u0000\u0243\u0244\u0001\u0000"+ - "\u0000\u0000\u0244\u0245\u0001\u0000\u0000\u0000\u0245\u0246\u0004\b\u0000"+ - "\u0000\u0246\u0247\u0001\u0000\u0000\u0000\u0247\u0248\u0006\b\u0000\u0000"+ - "\u0248\u0249\u0006\b\u0001\u0000\u0249\u001d\u0001\u0000\u0000\u0000\u024a"+ - "\u024b\u0005@\u0000\u0000\u024b\u024c\u0007\u0017\u0000\u0000\u024c\u024d"+ - "\u0007\u0002\u0000\u0000\u024d\u024e\u0007\u0003\u0000\u0000\u024e\u024f"+ - "\u0007\u0004\u0000\u0000\u024f\u025a\u0007\u0018\u0000\u0000\u0250\u0251"+ - "\u0005@\u0000\u0000\u0251\u0252\u0007\u0005\u0000\u0000\u0252\u0253\u0007"+ - "\u0001\u0000\u0000\u0253\u0254\u0007\f\u0000\u0000\u0254\u0255\u0007\u000b"+ - "\u0000\u0000\u0255\u0256\u0007\u0007\u0000\u0000\u0256\u0257\u0007\f\u0000"+ - "\u0000\u0257\u0258\u0007\u000e\u0000\u0000\u0258\u025a\u0007\u0003\u0000"+ - "\u0000\u0259\u024a\u0001\u0000\u0000\u0000\u0259\u0250\u0001\u0000\u0000"+ - "\u0000\u025a\u025b\u0001\u0000\u0000\u0000\u025b\u025c\u0006\t\u0001\u0000"+ - "\u025c\u001f\u0001\u0000\u0000\u0000\u025d\u025e\u0005@\u0000\u0000\u025e"+ - "\u025f\u0007\n\u0000\u0000\u025f\u0260\u0007\u000b\u0000\u0000\u0260\u0261"+ - "\u0007\u0001\u0000\u0000\u0261\u0289\u0007\r\u0000\u0000\u0262\u0263\u0005"+ - "@\u0000\u0000\u0263\u0264\u0007\n\u0000\u0000\u0264\u0265\u0007\u0006"+ - "\u0000\u0000\u0265\u0266\u0007\u0001\u0000\u0000\u0266\u0289\u0007\b\u0000"+ - "\u0000\u0267\u0268\u0005@\u0000\u0000\u0268\u0269\u0007\u0001\u0000\u0000"+ - "\u0269\u026a\u0007\u001a\u0000\u0000\u026a\u026b\u0007\u0003\u0000\u0000"+ - "\u026b\u026c\u0007\u0002\u0000\u0000\u026c\u026d\u0007\b\u0000\u0000\u026d"+ - "\u026e\u0007\u0002\u0000\u0000\u026e\u026f\u0007\u0007\u0000\u0000\u026f"+ - "\u0270\u0007\u000b\u0000\u0000\u0270\u0289\u0007\u0003\u0000\u0000\u0271"+ - "\u0272\u0005@\u0000\u0000\u0272\u0273\u0007\u001a\u0000\u0000\u0273\u0274"+ - "\u0007\u0007\u0000\u0000\u0274\u0275\u0007\u000b\u0000\u0000\u0275\u0276"+ - "\u0007\u0003\u0000\u0000\u0276\u0277\u0007\u0002\u0000\u0000\u0277\u0278"+ - "\u0007\u0003\u0000\u0000\u0278\u0279\u0007\u0004\u0000\u0000\u0279\u027a"+ - "\u0007\u0005\u0000\u0000\u027a\u027b\u0007\u000b\u0000\u0000\u027b\u027c"+ - "\u0007\u0002\u0000\u0000\u027c\u027d\u0007\u0003\u0000\u0000\u027d\u027e"+ - "\u0007\u0000\u0000\u0000\u027e\u027f\u0007\u0002\u0000\u0000\u027f\u0280"+ - "\u0007\u0003\u0000\u0000\u0280\u0281\u0007\n\u0000\u0000\u0281\u0289\u0007"+ - "\u0006\u0000\u0000\u0282\u0283\u0005@\u0000\u0000\u0283\u0284\u0007\u0003"+ - "\u0000\u0000\u0284\u0285\u0007\f\u0000\u0000\u0285\u0286\u0007\u0011\u0000"+ - "\u0000\u0286\u0287\u0001\u0000\u0000\u0000\u0287\u0289\u0003\u000e\u0001"+ - "\u0000\u0288\u025d\u0001\u0000\u0000\u0000\u0288\u0262\u0001\u0000\u0000"+ - "\u0000\u0288\u0267\u0001\u0000\u0000\u0000\u0288\u0271\u0001\u0000\u0000"+ - "\u0000\u0288\u0282\u0001\u0000\u0000\u0000\u0289\u028a\u0001\u0000\u0000"+ - "\u0000\u028a\u028b\u0006\n\u0001\u0000\u028b!\u0001\u0000\u0000\u0000"+ - "\u028c\u028d\u0005@\u0000\u0000\u028d\u028e\u0007\u001a\u0000\u0000\u028e"+ - "\u028f\u0007\u0003\u0000\u0000\u028f\u0290\u0007\u0002\u0000\u0000\u0290"+ - "\u0291\u0007\u0017\u0000\u0000\u0291\u0292\u0007\u0004\u0000\u0000\u0292"+ - "\u0293\u0007\u000b\u0000\u0000\u0293\u0294\u0007\u0007\u0000\u0000\u0294"+ - "\u0295\u0007\u0012\u0000\u0000\u0295\u0296\u0001\u0000\u0000\u0000\u0296"+ - "\u0297\u0006\u000b\u0002\u0000\u0297\u0298\u0006\u000b\u0001\u0000\u0298"+ - "#\u0001\u0000\u0000\u0000\u0299\u029a\u0005@\u0000\u0000\u029a\u029b\u0007"+ - "\u0003\u0000\u0000\u029b\u029c\u0007\f\u0000\u0000\u029c\u029d\u0007\u0011"+ - "\u0000\u0000\u029d\u029e\u0007\u001a\u0000\u0000\u029e\u029f\u0007\u0003"+ - "\u0000\u0000\u029f\u02a0\u0007\u0002\u0000\u0000\u02a0\u02a1\u0007\u0017"+ - "\u0000\u0000\u02a1\u02a2\u0007\u0004\u0000\u0000\u02a2\u02a3\u0007\u000b"+ - "\u0000\u0000\u02a3\u02a4\u0007\u0007\u0000\u0000\u02a4\u02a5\u0007\u0012"+ - "\u0000\u0000\u02a5\u02a6\u0001\u0000\u0000\u0000\u02a6\u02a7\u0006\f\u0001"+ - "\u0000\u02a7%\u0001\u0000\u0000\u0000\u02a8\u02a9\u0005@\u0000\u0000\u02a9"+ - "\u02aa\u0007\u0011\u0000\u0000\u02aa\u02c0\u0007\u0011\u0000\u0000\u02ab"+ - "\u02ac\u0005@\u0000\u0000\u02ac\u02ad\u0007\u0011\u0000\u0000\u02ad\u02ae"+ - "\u0007\u000e\u0000\u0000\u02ae\u02af\u0007\u0012\u0000\u0000\u02af\u02c0"+ - "\u0007\r\u0000\u0000\u02b0\u02b1\u0005@\u0000\u0000\u02b1\u02b2\u0007"+ - "\u001b\u0000\u0000\u02b2\u02c0\u0007\n\u0000\u0000\u02b3\u02b4\u0005@"+ - "\u0000\u0000\u02b4\u02b5\u0007\u001b\u0000\u0000\u02b5\u02b6\u0007\n\u0000"+ - "\u0000\u02b6\u02b7\u0007\u0001\u0000\u0000\u02b7\u02c0\u0007\f\u0000\u0000"+ - "\u02b8\u02b9\u0005@\u0000\u0000\u02b9\u02ba\u0007\u0007\u0000\u0000\u02ba"+ - "\u02bb\u0007\f\u0000\u0000\u02bb\u02bc\u0007\u001b\u0000\u0000\u02bc\u02bd"+ - "\u0007\u0003\u0000\u0000\u02bd\u02be\u0007\u0005\u0000\u0000\u02be\u02c0"+ - "\u0007\u000b\u0000\u0000\u02bf\u02a8\u0001\u0000\u0000\u0000\u02bf\u02ab"+ - "\u0001\u0000\u0000\u0000\u02bf\u02b0\u0001\u0000\u0000\u0000\u02bf\u02b3"+ - "\u0001\u0000\u0000\u0000\u02bf\u02b8\u0001\u0000\u0000\u0000\u02c0\u02c1"+ - "\u0001\u0000\u0000\u0000\u02c1\u02c2\u0006\r\u0000\u0000\u02c2\u02c3\u0006"+ - "\r\u0001\u0000\u02c3\'\u0001\u0000\u0000\u0000\u02c4\u02c5\u0005@\u0000"+ - "\u0000\u02c5\u02c6\u0007\u0003\u0000\u0000\u02c6\u02c7\u0007\t\u0000\u0000"+ - "\u02c7\u02c8\u0007\n\u0000\u0000\u02c8\u02e5\u0007\u0003\u0000\u0000\u02c9"+ - "\u02ca\u0005@\u0000\u0000\u02ca\u02cb\u0007\u0005\u0000\u0000\u02cb\u02cc"+ - "\u0007\n\u0000\u0000\u02cc\u02cd\u0007\u0002\u0000\u0000\u02cd\u02e5\u0007"+ - "\u0000\u0000\u0000\u02ce\u02cf\u0005@\u0000\u0000\u02cf\u02d0\u0007\u0011"+ - "\u0000\u0000\u02d0\u02d1\u0007\u0003\u0000\u0000\u02d1\u02d2\u0007\u0000"+ - "\u0000\u0000\u02d2\u02d3\u0007\u0004\u0000\u0000\u02d3\u02d4\u0007\u000e"+ - "\u0000\u0000\u02d4\u02d5\u0007\t\u0000\u0000\u02d5\u02e5\u0007\u000b\u0000"+ - "\u0000\u02d6\u02d7\u0005@\u0000\u0000\u02d7\u02d8\u0007\u0004\u0000\u0000"+ - "\u02d8\u02d9\u0007\r\u0000\u0000\u02d9\u02da\u0007\r\u0000\u0000\u02da"+ - "\u02db\u0007\u0003\u0000\u0000\u02db\u02dc\u0007\f\u0000\u0000\u02dc\u02e5"+ - "\u0007\u0011\u0000\u0000\u02dd\u02de\u0005@\u0000\u0000\u02de\u02df\u0007"+ - "\r\u0000\u0000\u02df\u02e0\u0007\u0004\u0000\u0000\u02e0\u02e1\u0007\u0002"+ + "V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001"+ + "W\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001"+ + "[\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\"+ + "\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001"+ + "^\u0001_\u0001_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001"+ + "`\u0001a\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001b\u0001b\u0001"+ + "c\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0003d\u069c\bd\u0001d\u0001"+ + "d\u0001d\u0001d\u0001d\u0001e\u0001e\u0001e\u0001e\u0001f\u0001f\u0003"+ + "f\u06a9\bf\u0001f\u0001f\u0003f\u06ad\bf\u0001f\u0004f\u06b0\bf\u000b"+ + "f\ff\u06b1\u0001f\u0003f\u06b5\bf\u0001f\u0003f\u06b8\bf\u0001f\u0003"+ + "f\u06bb\bf\u0001f\u0001f\u0003f\u06bf\bf\u0001f\u0001f\u0003f\u06c3\b"+ + "f\u0001f\u0004f\u06c6\bf\u000bf\ff\u06c7\u0001f\u0003f\u06cb\bf\u0001"+ + "f\u0001f\u0003f\u06cf\bf\u0005f\u06d1\bf\nf\ff\u06d4\tf\u0001f\u0003f"+ + "\u06d7\bf\u0001f\u0001f\u0001f\u0001f\u0001g\u0001g\u0001g\u0001g\u0001"+ + "g\u0001g\u0001g\u0001g\u0001g\u0005g\u06e6\bg\ng\fg\u06e9\tg\u0001g\u0001"+ + "g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001"+ + "h\u0001h\u0001h\u0003h\u06f9\bh\u0001h\u0001h\u0005h\u06fd\bh\nh\fh\u0700"+ + "\th\u0001h\u0001h\u0004h\u0704\bh\u000bh\fh\u0705\u0001h\u0003h\u0709"+ + "\bh\u0001h\u0001h\u0003h\u070d\bh\u0004h\u070f\bh\u000bh\fh\u0710\u0001"+ + "h\u0001h\u0001h\u0001h\u0003h\u0717\bh\u0001h\u0001h\u0001i\u0001i\u0001"+ + "i\u0001i\u0001i\u0001j\u0001j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001"+ + "k\u0001k\u0001l\u0001l\u0001l\u0001l\u0001l\u0001m\u0001m\u0001m\u0001"+ + "m\u0001m\u0001m\u0001m\u0001n\u0001n\u0001n\u0001n\u0001n\u0001o\u0001"+ + "o\u0001o\u0001o\u0001p\u0001p\u0001p\u0001p\u0001p\u0006\u0183\u0198\u01a6"+ + "\u0376\u0422\u061d\u0000q\f\u0000\u000e\u0000\u0010\u0000\u0012\u0000"+ + "\u0014\u0000\u0016\u0000\u0018\n\u001a\u0000\u001c\u0000\u001e\u0000 "+ + "\u0000\"\u0000$(&\u0000(\u0000*\u0000,\u000b.\u00000\u00002\u00004\f6"+ + "\r8\u000e:\u0000<\u0000>\u0000@\u0000B\u0000D\u0006F\u0000H\u0000J\u0000"+ + "L\u0000N\u0000P\u0000R\u0000T\u0000V\u0000X\u0000Z\u0000\\\u0000^\u0000"+ + "`\u0000b\u000fd\u0000f\u0000h\u0000j\u0000l\u0000n\u0000p\u0000r\u0010"+ + "t\u0011v\u0012x\u0013z\u0014|\u0000~\u0000\u0080\u0015\u0082\u0016\u0084"+ + "\u0017\u0086\u0018\u0088\u0019\u008a\u0000\u008c\u001a\u008e\u0000\u0090"+ + "\u0000\u0092\u0000\u0094\u001b\u0096\u0000\u0098\u001c\u009a\u001d\u009c"+ + "\u0000\u009e)\u00a0\u001e\u00a2\u001f\u00a4 \u00a6!\u00a8\"\u00aa#\u00ac"+ + "$\u00ae\u0000\u00b0%\u00b2&\u00b4\u0000\u00b6\u0000\u00b8\u0000\u00ba"+ + "\u0000\u00bc\u0000\u00be\u0000\u00c0\u0000\u00c2\u0000\u00c4\u0000\u00c6"+ + "*\u00c8\u0000\u00ca\u0000\u00cc\u0000\u00ce\u0000\u00d0\u0000\u00d2\u0000"+ + "\u00d4\u0000\u00d6\u0000\u00d8\u0000\u00da\u0000\u00dc\u0000\u00de+\u00e0"+ + "\u0000\u00e2\u0000\u00e4\u0000\u00e6\'\u00e8\u0000\u00ea\u0000\u00ec\u0000"+ + "\f\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b-\u0002"+ + "\u0000FFff\u0002\u0000OOoo\u0002\u0000RRrr\u0002\u0000EEee\u0002\u0000"+ + "AAaa\u0002\u0000CCcc\u0002\u0000HHhh\u0002\u0000IIii\u0002\u0000WWww\u0002"+ + "\u0000LLll\u0002\u0000SSss\u0002\u0000TTtt\u0002\u0000NNnn\u0002\u0000"+ + "PPpp\u0002\u0000UUuu\u0002\u0000YYyy\u0002\u0000GGgg\u0002\u0000DDdd\u0002"+ + "\u0000MMmm\u0001\u0000::\u0004\u0000AZ__az\u0080\u8000\ufffe\u0005\u0000"+ + "-.0:AZaz\u0080\u8000\ufffe\u0002\u0000XXxx\u0002\u0000BBbb\u0002\u0000"+ + "KKkk\u0002\u0000QQqq\u0002\u0000VVvv\u0002\u0000JJjj\u0004\u0000\n\n\r"+ + "\r >>\u0003\u0000\n\n\r\r \u0002\u0000\n\n\r\r\u0004\u0000,,..==__\u0001"+ + "\u0000(;\u0002\u0000[[]]\u0002\u0000##..\u0003\u0000..==__\u0005\u0000"+ + "09AZ__az\u0080\u8000\ufffe\u0003\u0000AZaz\u0080\u8000\ufffe\u0006\u0000"+ + "..09AZ__az\u0080\u8000\ufffe\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002"+ + "\u0000\"\"\\\\\u0002\u0000\'\'\\\\\u0001\u0000 \u0005\u0000 \'\'::{"+ + "{}}\u0005\u0000 !\'\'::{{}}\u07da\u0000\u0018\u0001\u0000\u0000\u0000"+ + "\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000"+ + "\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000"+ + "\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001"+ + "\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000"+ + "\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u0000"+ + "0\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001"+ + "\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000"+ + "\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000"+ + ">\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001"+ + "\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000"+ + "\u0000\u0000H\u0001\u0000\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000"+ + "L\u0001\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000\u0000d\u0001"+ + "\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001\u0000\u0000"+ + "\u0000\u0001j\u0001\u0000\u0000\u0000\u0001l\u0001\u0000\u0000\u0000\u0001"+ + "n\u0001\u0000\u0000\u0000\u0002p\u0001\u0000\u0000\u0000\u0002r\u0001"+ + "\u0000\u0000\u0000\u0002t\u0001\u0000\u0000\u0000\u0002v\u0001\u0000\u0000"+ + "\u0000\u0002x\u0001\u0000\u0000\u0000\u0002z\u0001\u0000\u0000\u0000\u0002"+ + "|\u0001\u0000\u0000\u0000\u0003~\u0001\u0000\u0000\u0000\u0003\u0080\u0001"+ + "\u0000\u0000\u0000\u0003\u0082\u0001\u0000\u0000\u0000\u0003\u0084\u0001"+ + "\u0000\u0000\u0000\u0003\u0086\u0001\u0000\u0000\u0000\u0003\u0088\u0001"+ + "\u0000\u0000\u0000\u0003\u008a\u0001\u0000\u0000\u0000\u0004\u008c\u0001"+ + "\u0000\u0000\u0000\u0004\u008e\u0001\u0000\u0000\u0000\u0004\u0090\u0001"+ + "\u0000\u0000\u0000\u0004\u0092\u0001\u0000\u0000\u0000\u0005\u0094\u0001"+ + "\u0000\u0000\u0000\u0005\u0096\u0001\u0000\u0000\u0000\u0005\u0098\u0001"+ + "\u0000\u0000\u0000\u0005\u009a\u0001\u0000\u0000\u0000\u0005\u009c\u0001"+ + "\u0000\u0000\u0000\u0005\u009e\u0001\u0000\u0000\u0000\u0005\u00a0\u0001"+ + "\u0000\u0000\u0000\u0005\u00a2\u0001\u0000\u0000\u0000\u0005\u00a4\u0001"+ + "\u0000\u0000\u0000\u0005\u00a6\u0001\u0000\u0000\u0000\u0005\u00a8\u0001"+ + "\u0000\u0000\u0000\u0005\u00aa\u0001\u0000\u0000\u0000\u0005\u00ac\u0001"+ + "\u0000\u0000\u0000\u0005\u00ae\u0001\u0000\u0000\u0000\u0006\u00b0\u0001"+ + "\u0000\u0000\u0000\u0006\u00b2\u0001\u0000\u0000\u0000\u0006\u00b4\u0001"+ + "\u0000\u0000\u0000\u0006\u00b6\u0001\u0000\u0000\u0000\u0007\u00b8\u0001"+ + "\u0000\u0000\u0000\u0007\u00ba\u0001\u0000\u0000\u0000\u0007\u00bc\u0001"+ + "\u0000\u0000\u0000\u0007\u00be\u0001\u0000\u0000\u0000\b\u00c0\u0001\u0000"+ + "\u0000\u0000\b\u00c2\u0001\u0000\u0000\u0000\b\u00c4\u0001\u0000\u0000"+ + "\u0000\b\u00c6\u0001\u0000\u0000\u0000\b\u00c8\u0001\u0000\u0000\u0000"+ + "\b\u00ca\u0001\u0000\u0000\u0000\t\u00cc\u0001\u0000\u0000\u0000\t\u00ce"+ + "\u0001\u0000\u0000\u0000\t\u00d0\u0001\u0000\u0000\u0000\t\u00d2\u0001"+ + "\u0000\u0000\u0000\n\u00d4\u0001\u0000\u0000\u0000\n\u00d6\u0001\u0000"+ + "\u0000\u0000\n\u00d8\u0001\u0000\u0000\u0000\n\u00da\u0001\u0000\u0000"+ + "\u0000\n\u00dc\u0001\u0000\u0000\u0000\n\u00de\u0001\u0000\u0000\u0000"+ + "\n\u00e0\u0001\u0000\u0000\u0000\n\u00e2\u0001\u0000\u0000\u0000\n\u00e4"+ + "\u0001\u0000\u0000\u0000\u000b\u00e6\u0001\u0000\u0000\u0000\u000b\u00e8"+ + "\u0001\u0000\u0000\u0000\u000b\u00ea\u0001\u0000\u0000\u0000\u000b\u00ec"+ + "\u0001\u0000\u0000\u0000\f\u00f5\u0001\u0000\u0000\u0000\u000e\u015b\u0001"+ + "\u0000\u0000\u0000\u0010\u015d\u0001\u0000\u0000\u0000\u0012\u0179\u0001"+ + "\u0000\u0000\u0000\u0014\u0188\u0001\u0000\u0000\u0000\u0016\u018f\u0001"+ + "\u0000\u0000\u0000\u0018\u01ae\u0001\u0000\u0000\u0000\u001a\u01cc\u0001"+ + "\u0000\u0000\u0000\u001c\u023e\u0001\u0000\u0000\u0000\u001e\u0259\u0001"+ + "\u0000\u0000\u0000 \u0288\u0001\u0000\u0000\u0000\"\u028c\u0001\u0000"+ + "\u0000\u0000$\u0299\u0001\u0000\u0000\u0000&\u02bf\u0001\u0000\u0000\u0000"+ + "(\u02e4\u0001\u0000\u0000\u0000*\u02e8\u0001\u0000\u0000\u0000,\u02f5"+ + "\u0001\u0000\u0000\u0000.\u02fc\u0001\u0000\u0000\u00000\u0349\u0001\u0000"+ + "\u0000\u00002\u034d\u0001\u0000\u0000\u00004\u0356\u0001\u0000\u0000\u0000"+ + "6\u035c\u0001\u0000\u0000\u00008\u035f\u0001\u0000\u0000\u0000:\u0363"+ + "\u0001\u0000\u0000\u0000<\u0369\u0001\u0000\u0000\u0000>\u037d\u0001\u0000"+ + "\u0000\u0000@\u0390\u0001\u0000\u0000\u0000B\u03a0\u0001\u0000\u0000\u0000"+ + "D\u03c1\u0001\u0000\u0000\u0000F\u03e5\u0001\u0000\u0000\u0000H\u03f5"+ + "\u0001\u0000\u0000\u0000J\u03fe\u0001\u0000\u0000\u0000L\u0402\u0001\u0000"+ + "\u0000\u0000N\u0406\u0001\u0000\u0000\u0000P\u040d\u0001\u0000\u0000\u0000"+ + "R\u0414\u0001\u0000\u0000\u0000T\u041b\u0001\u0000\u0000\u0000V\u041d"+ + "\u0001\u0000\u0000\u0000X\u0427\u0001\u0000\u0000\u0000Z\u0432\u0001\u0000"+ + "\u0000\u0000\\\u043b\u0001\u0000\u0000\u0000^\u0450\u0001\u0000\u0000"+ + "\u0000`\u0452\u0001\u0000\u0000\u0000b\u0454\u0001\u0000\u0000\u0000d"+ + "\u045b\u0001\u0000\u0000\u0000f\u0461\u0001\u0000\u0000\u0000h\u0557\u0001"+ + "\u0000\u0000\u0000j\u055b\u0001\u0000\u0000\u0000l\u0561\u0001\u0000\u0000"+ + "\u0000n\u0565\u0001\u0000\u0000\u0000p\u056a\u0001\u0000\u0000\u0000r"+ + "\u0570\u0001\u0000\u0000\u0000t\u0575\u0001\u0000\u0000\u0000v\u057c\u0001"+ + "\u0000\u0000\u0000x\u0581\u0001\u0000\u0000\u0000z\u0587\u0001\u0000\u0000"+ + "\u0000|\u0590\u0001\u0000\u0000\u0000~\u0595\u0001\u0000\u0000\u0000\u0080"+ + "\u059c\u0001\u0000\u0000\u0000\u0082\u05a1\u0001\u0000\u0000\u0000\u0084"+ + "\u05a8\u0001\u0000\u0000\u0000\u0086\u05ad\u0001\u0000\u0000\u0000\u0088"+ + "\u05b3\u0001\u0000\u0000\u0000\u008a\u05bc\u0001\u0000\u0000\u0000\u008c"+ + "\u05c2\u0001\u0000\u0000\u0000\u008e\u05ca\u0001\u0000\u0000\u0000\u0090"+ + "\u05d0\u0001\u0000\u0000\u0000\u0092\u05d5\u0001\u0000\u0000\u0000\u0094"+ + "\u05da\u0001\u0000\u0000\u0000\u0096\u05df\u0001\u0000\u0000\u0000\u0098"+ + "\u05e6\u0001\u0000\u0000\u0000\u009a\u05eb\u0001\u0000\u0000\u0000\u009c"+ + "\u05f0\u0001\u0000\u0000\u0000\u009e\u05f6\u0001\u0000\u0000\u0000\u00a0"+ + "\u05fb\u0001\u0000\u0000\u0000\u00a2\u0600\u0001\u0000\u0000\u0000\u00a4"+ + "\u0605\u0001\u0000\u0000\u0000\u00a6\u060e\u0001\u0000\u0000\u0000\u00a8"+ + "\u0613\u0001\u0000\u0000\u0000\u00aa\u0617\u0001\u0000\u0000\u0000\u00ac"+ + "\u0625\u0001\u0000\u0000\u0000\u00ae\u0628\u0001\u0000\u0000\u0000\u00b0"+ + "\u062d\u0001\u0000\u0000\u0000\u00b2\u0637\u0001\u0000\u0000\u0000\u00b4"+ + "\u063c\u0001\u0000\u0000\u0000\u00b6\u0640\u0001\u0000\u0000\u0000\u00b8"+ + "\u0645\u0001\u0000\u0000\u0000\u00ba\u0655\u0001\u0000\u0000\u0000\u00bc"+ + "\u065a\u0001\u0000\u0000\u0000\u00be\u065e\u0001\u0000\u0000\u0000\u00c0"+ + "\u0663\u0001\u0000\u0000\u0000\u00c2\u066b\u0001\u0000\u0000\u0000\u00c4"+ + "\u0671\u0001\u0000\u0000\u0000\u00c6\u0678\u0001\u0000\u0000\u0000\u00c8"+ + "\u067d\u0001\u0000\u0000\u0000\u00ca\u0681\u0001\u0000\u0000\u0000\u00cc"+ + "\u0686\u0001\u0000\u0000\u0000\u00ce\u068b\u0001\u0000\u0000\u0000\u00d0"+ + "\u0690\u0001\u0000\u0000\u0000\u00d2\u0694\u0001\u0000\u0000\u0000\u00d4"+ + "\u0699\u0001\u0000\u0000\u0000\u00d6\u06a2\u0001\u0000\u0000\u0000\u00d8"+ + "\u06a6\u0001\u0000\u0000\u0000\u00da\u06dc\u0001\u0000\u0000\u0000\u00dc"+ + "\u0716\u0001\u0000\u0000\u0000\u00de\u071a\u0001\u0000\u0000\u0000\u00e0"+ + "\u071f\u0001\u0000\u0000\u0000\u00e2\u0724\u0001\u0000\u0000\u0000\u00e4"+ + "\u0728\u0001\u0000\u0000\u0000\u00e6\u072d\u0001\u0000\u0000\u0000\u00e8"+ + "\u0734\u0001\u0000\u0000\u0000\u00ea\u0739\u0001\u0000\u0000\u0000\u00ec"+ + "\u073d\u0001\u0000\u0000\u0000\u00ee\u00ef\u0005:\u0000\u0000\u00ef\u00f6"+ + "\u0005:\u0000\u0000\u00f0\u00f1\u0005?\u0000\u0000\u00f1\u00f6\u0005:"+ + "\u0000\u0000\u00f2\u00f3\u0005 \u0000\u0000\u00f3\u00f4\u0005:\u0000\u0000"+ + "\u00f4\u00f6\u0005 \u0000\u0000\u00f5\u00ee\u0001\u0000\u0000\u0000\u00f5"+ + "\u00f0\u0001\u0000\u0000\u0000\u00f5\u00f2\u0001\u0000\u0000\u0000\u00f6"+ + "\r\u0001\u0000\u0000\u0000\u00f7\u00f8\u0007\u0000\u0000\u0000\u00f8\u00f9"+ + "\u0007\u0001\u0000\u0000\u00f9\u00fa\u0007\u0002\u0000\u0000\u00fa\u00ff"+ + "\u0001\u0000\u0000\u0000\u00fb\u00fc\u0007\u0003\u0000\u0000\u00fc\u00fd"+ + "\u0007\u0004\u0000\u0000\u00fd\u00fe\u0007\u0005\u0000\u0000\u00fe\u0100"+ + "\u0007\u0006\u0000\u0000\u00ff\u00fb\u0001\u0000\u0000\u0000\u00ff\u0100"+ + "\u0001\u0000\u0000\u0000\u0100\u015c\u0001\u0000\u0000\u0000\u0101\u0102"+ + "\u0007\u0007\u0000\u0000\u0102\u015c\u0007\u0000\u0000\u0000\u0103\u0104"+ + "\u0007\b\u0000\u0000\u0104\u0105\u0007\u0006\u0000\u0000\u0105\u0106\u0007"+ + "\u0007\u0000\u0000\u0106\u0107\u0007\t\u0000\u0000\u0107\u015c\u0007\u0003"+ + "\u0000\u0000\u0108\u0109\u0007\n\u0000\u0000\u0109\u010a\u0007\u0003\u0000"+ + "\u0000\u010a\u010b\u0007\u0005\u0000\u0000\u010b\u010c\u0007\u000b\u0000"+ + "\u0000\u010c\u010d\u0007\u0007\u0000\u0000\u010d\u010e\u0007\u0001\u0000"+ + "\u0000\u010e\u015c\u0007\f\u0000\u0000\u010f\u0110\u0007\n\u0000\u0000"+ + "\u0110\u0111\u0007\u0003\u0000\u0000\u0111\u0112\u0007\n\u0000\u0000\u0112"+ + "\u0113\u0007\n\u0000\u0000\u0113\u0114\u0007\u0007\u0000\u0000\u0114\u0115"+ + "\u0007\u0001\u0000\u0000\u0115\u015c\u0007\f\u0000\u0000\u0116\u0117\u0007"+ + "\u0001\u0000\u0000\u0117\u0118\u0007\f\u0000\u0000\u0118\u0119\u0007\u0005"+ + "\u0000\u0000\u0119\u015c\u0007\u0003\u0000\u0000\u011a\u011b\u0007\r\u0000"+ + "\u0000\u011b\u011c\u0007\u000e\u0000\u0000\u011c\u011d\u0007\n\u0000\u0000"+ + "\u011d\u015c\u0007\u0006\u0000\u0000\u011e\u011f\u0007\r\u0000\u0000\u011f"+ + "\u0120\u0007\u000e\u0000\u0000\u0120\u0121\u0007\n\u0000\u0000\u0121\u0122"+ + "\u0007\u0006\u0000\u0000\u0122\u0123\u0007\u0001\u0000\u0000\u0123\u0124"+ + "\u0007\f\u0000\u0000\u0124\u0125\u0007\u0005\u0000\u0000\u0125\u015c\u0007"+ + "\u0003\u0000\u0000\u0126\u0127\u0007\n\u0000\u0000\u0127\u0128\u0007\b"+ + "\u0000\u0000\u0128\u0129\u0007\u0007\u0000\u0000\u0129\u012a\u0007\u000b"+ + "\u0000\u0000\u012a\u012b\u0007\u0005\u0000\u0000\u012b\u015c\u0007\u0006"+ + "\u0000\u0000\u012c\u012d\u0007\u000e\u0000\u0000\u012d\u012e\u0007\f\u0000"+ + "\u0000\u012e\u012f\u0007\t\u0000\u0000\u012f\u0130\u0007\u0003\u0000\u0000"+ + "\u0130\u0131\u0007\n\u0000\u0000\u0131\u015c\u0007\n\u0000\u0000\u0132"+ + "\u0133\u0007\u0005\u0000\u0000\u0133\u0134\u0007\u0004\u0000\u0000\u0134"+ + "\u0135\u0007\f\u0000\u0000\u0135\u013c\u0001\u0000\u0000\u0000\u0136\u0137"+ + "\u0007\u0004\u0000\u0000\u0137\u0138\u0007\f\u0000\u0000\u0138\u013d\u0007"+ + "\u000f\u0000\u0000\u0139\u013a\u0007\f\u0000\u0000\u013a\u013b\u0007\u0001"+ + "\u0000\u0000\u013b\u013d\u0007\u000b\u0000\u0000\u013c\u0136\u0001\u0000"+ + "\u0000\u0000\u013c\u0139\u0001\u0000\u0000\u0000\u013c\u013d\u0001\u0000"+ + "\u0000\u0000\u013d\u015c\u0001\u0000\u0000\u0000\u013e\u013f\u0007\u0004"+ + "\u0000\u0000\u013f\u0140\u0007\u000e\u0000\u0000\u0140\u0141\u0007\u000b"+ + "\u0000\u0000\u0141\u015c\u0007\u0006\u0000\u0000\u0142\u0143\u0007\u0010"+ + "\u0000\u0000\u0143\u0144\u0007\u000e\u0000\u0000\u0144\u0145\u0007\u0003"+ + "\u0000\u0000\u0145\u0146\u0007\n\u0000\u0000\u0146\u015c\u0007\u000b\u0000"+ + "\u0000\u0147\u0148\u0007\u0003\u0000\u0000\u0148\u0149\u0007\u0002\u0000"+ + "\u0000\u0149\u014a\u0007\u0002\u0000\u0000\u014a\u014b\u0007\u0001\u0000"+ + "\u0000\u014b\u015c\u0007\u0002\u0000\u0000\u014c\u014d\u0007\r\u0000\u0000"+ + "\u014d\u014e\u0007\u0002\u0000\u0000\u014e\u014f\u0007\u0001\u0000\u0000"+ + "\u014f\u0150\u0007\u0011\u0000\u0000\u0150\u0151\u0007\u000e\u0000\u0000"+ + "\u0151\u0152\u0007\u0005\u0000\u0000\u0152\u0153\u0007\u000b\u0000\u0000"+ + "\u0153\u0154\u0007\u0007\u0000\u0000\u0154\u0155\u0007\u0001\u0000\u0000"+ + "\u0155\u015c\u0007\f\u0000\u0000\u0156\u0157\u0007\u0003\u0000\u0000\u0157"+ + "\u0158\u0007\u0012\u0000\u0000\u0158\u0159\u0007\r\u0000\u0000\u0159\u015a"+ + "\u0007\u000b\u0000\u0000\u015a\u015c\u0007\u000f\u0000\u0000\u015b\u00f7"+ + "\u0001\u0000\u0000\u0000\u015b\u0101\u0001\u0000\u0000\u0000\u015b\u0103"+ + "\u0001\u0000\u0000\u0000\u015b\u0108\u0001\u0000\u0000\u0000\u015b\u010f"+ + "\u0001\u0000\u0000\u0000\u015b\u0116\u0001\u0000\u0000\u0000\u015b\u011a"+ + "\u0001\u0000\u0000\u0000\u015b\u011e\u0001\u0000\u0000\u0000\u015b\u0126"+ + "\u0001\u0000\u0000\u0000\u015b\u012c\u0001\u0000\u0000\u0000\u015b\u0132"+ + "\u0001\u0000\u0000\u0000\u015b\u013e\u0001\u0000\u0000\u0000\u015b\u0142"+ + "\u0001\u0000\u0000\u0000\u015b\u0147\u0001\u0000\u0000\u0000\u015b\u014c"+ + "\u0001\u0000\u0000\u0000\u015b\u0156\u0001\u0000\u0000\u0000\u015c\u000f"+ + "\u0001\u0000\u0000\u0000\u015d\u015e\u0005@\u0000\u0000\u015e\u015f\u0007"+ + "\u0007\u0000\u0000\u015f\u0160\u0007\f\u0000\u0000\u0160\u0161\u0007\u0005"+ + "\u0000\u0000\u0161\u0162\u0007\t\u0000\u0000\u0162\u0163\u0007\u000e\u0000"+ + "\u0000\u0163\u0164\u0007\u0011\u0000\u0000\u0164\u0165\u0007\u0003\u0000"+ + "\u0000\u0165\u0177\u0001\u0000\u0000\u0000\u0166\u0167\u0007\u0007\u0000"+ + "\u0000\u0167\u0178\u0007\u0000\u0000\u0000\u0168\u0169\u0007\b\u0000\u0000"+ + "\u0169\u016a\u0007\u0006\u0000\u0000\u016a\u016b\u0007\u0003\u0000\u0000"+ + "\u016b\u0178\u0007\f\u0000\u0000\u016c\u016d\u0007\u0000\u0000\u0000\u016d"+ + "\u016e\u0007\u0007\u0000\u0000\u016e\u016f\u0007\u0002\u0000\u0000\u016f"+ + "\u0170\u0007\n\u0000\u0000\u0170\u0178\u0007\u000b\u0000\u0000\u0171\u0172"+ + "\u0007\u000e\u0000\u0000\u0172\u0173\u0007\f\u0000\u0000\u0173\u0174\u0007"+ + "\t\u0000\u0000\u0174\u0175\u0007\u0003\u0000\u0000\u0175\u0176\u0007\n"+ + "\u0000\u0000\u0176\u0178\u0007\n\u0000\u0000\u0177\u0166\u0001\u0000\u0000"+ + "\u0000\u0177\u0168\u0001\u0000\u0000\u0000\u0177\u016c\u0001\u0000\u0000"+ + "\u0000\u0177\u0171\u0001\u0000\u0000\u0000\u0177\u0178\u0001\u0000\u0000"+ + "\u0000\u0178\u0011\u0001\u0000\u0000\u0000\u0179\u0183\u0005\"\u0000\u0000"+ + "\u017a\u0182\u0003T$\u0000\u017b\u017c\u0005{\u0000\u0000\u017c\u017d"+ + "\u0003\\(\u0000\u017d\u017e\u0005}\u0000\u0000\u017e\u0182\u0001\u0000"+ + "\u0000\u0000\u017f\u0182\t\u0000\u0000\u0000\u0180\u0182\b\u0013\u0000"+ + "\u0000\u0181\u017a\u0001\u0000\u0000\u0000\u0181\u017b\u0001\u0000\u0000"+ + "\u0000\u0181\u017f\u0001\u0000\u0000\u0000\u0181\u0180\u0001\u0000\u0000"+ + "\u0000\u0182\u0185\u0001\u0000\u0000\u0000\u0183\u0184\u0001\u0000\u0000"+ + "\u0000\u0183\u0181\u0001\u0000\u0000\u0000\u0184\u0186\u0001\u0000\u0000"+ + "\u0000\u0185\u0183\u0001\u0000\u0000\u0000\u0186\u0187\u0005\"\u0000\u0000"+ + "\u0187\u0013\u0001\u0000\u0000\u0000\u0188\u018c\u0007\u0014\u0000\u0000"+ + "\u0189\u018b\u0007\u0015\u0000\u0000\u018a\u0189\u0001\u0000\u0000\u0000"+ + "\u018b\u018e\u0001\u0000\u0000\u0000\u018c\u018a\u0001\u0000\u0000\u0000"+ + "\u018c\u018d\u0001\u0000\u0000\u0000\u018d\u0015\u0001\u0000\u0000\u0000"+ + "\u018e\u018c\u0001\u0000\u0000\u0000\u018f\u0190\u0005\u00b0\u0000\u0000"+ + "\u0190\u0017\u0001\u0000\u0000\u0000\u0191\u0192\u0005<\u0000\u0000\u0192"+ + "\u0193\u0005?\u0000\u0000\u0193\u0194\u0005=\u0000\u0000\u0194\u0198\u0001"+ + "\u0000\u0000\u0000\u0195\u0197\t\u0000\u0000\u0000\u0196\u0195\u0001\u0000"+ + "\u0000\u0000\u0197\u019a\u0001\u0000\u0000\u0000\u0198\u0199\u0001\u0000"+ + "\u0000\u0000\u0198\u0196\u0001\u0000\u0000\u0000\u0199\u019b\u0001\u0000"+ + "\u0000\u0000\u019a\u0198\u0001\u0000\u0000\u0000\u019b\u019c\u0005?\u0000"+ + "\u0000\u019c\u01af\u0005>\u0000\u0000\u019d\u019e\u0005<\u0000\u0000\u019e"+ + "\u019f\u0005?\u0000\u0000\u019f\u01a0\u0007\r\u0000\u0000\u01a0\u01a1"+ + "\u0007\u0006\u0000\u0000\u01a1\u01a2\u0007\r\u0000\u0000\u01a2\u01a6\u0001"+ + "\u0000\u0000\u0000\u01a3\u01a5\t\u0000\u0000\u0000\u01a4\u01a3\u0001\u0000"+ + "\u0000\u0000\u01a5\u01a8\u0001\u0000\u0000\u0000\u01a6\u01a7\u0001\u0000"+ + "\u0000\u0000\u01a6\u01a4\u0001\u0000\u0000\u0000\u01a7\u01ac\u0001\u0000"+ + "\u0000\u0000\u01a8\u01a6\u0001\u0000\u0000\u0000\u01a9\u01aa\u0005?\u0000"+ + "\u0000\u01aa\u01ad\u0005>\u0000\u0000\u01ab\u01ad\u0005\u0000\u0000\u0001"+ + "\u01ac\u01a9\u0001\u0000\u0000\u0000\u01ac\u01ab\u0001\u0000\u0000\u0000"+ + "\u01ad\u01af\u0001\u0000\u0000\u0000\u01ae\u0191\u0001\u0000\u0000\u0000"+ + "\u01ae\u019d\u0001\u0000\u0000\u0000\u01af\u0019\u0001\u0000\u0000\u0000"+ + "\u01b0\u01b1\u0005@\u0000\u0000\u01b1\u01cd\u0003\u000e\u0001\u0000\u01b2"+ + "\u01b3\u0005@\u0000\u0000\u01b3\u01b4\u0007\n\u0000\u0000\u01b4\u01b5"+ + "\u0007\u0003\u0000\u0000\u01b5\u01b6\u0007\u0005\u0000\u0000\u01b6\u01b7"+ + "\u0007\u000b\u0000\u0000\u01b7\u01b8\u0007\u0007\u0000\u0000\u01b8\u01b9"+ + "\u0007\u0001\u0000\u0000\u01b9\u01ba\u0007\f\u0000\u0000\u01ba\u01bb\u0007"+ + "\u0012\u0000\u0000\u01bb\u01bc\u0007\u0007\u0000\u0000\u01bc\u01bd\u0007"+ + "\n\u0000\u0000\u01bd\u01be\u0007\n\u0000\u0000\u01be\u01bf\u0007\u0007"+ + "\u0000\u0000\u01bf\u01c0\u0007\f\u0000\u0000\u01c0\u01cd\u0007\u0010\u0000"+ + "\u0000\u01c1\u01c2\u0005@\u0000\u0000\u01c2\u01c3\u0007\u0006\u0000\u0000"+ + "\u01c3\u01c4\u0007\u0004\u0000\u0000\u01c4\u01c5\u0007\n\u0000\u0000\u01c5"+ + "\u01c6\u0007\n\u0000\u0000\u01c6\u01c7\u0007\u0003\u0000\u0000\u01c7\u01c8"+ + "\u0007\u0005\u0000\u0000\u01c8\u01c9\u0007\u000b\u0000\u0000\u01c9\u01ca"+ + "\u0007\u0007\u0000\u0000\u01ca\u01cb\u0007\u0001\u0000\u0000\u01cb\u01cd"+ + "\u0007\f\u0000\u0000\u01cc\u01b0\u0001\u0000\u0000\u0000\u01cc\u01b2\u0001"+ + "\u0000\u0000\u0000\u01cc\u01c1\u0001\u0000\u0000\u0000\u01cd\u01ce\u0001"+ + "\u0000\u0000\u0000\u01ce\u01cf\u0006\u0007\u0000\u0000\u01cf\u01d0\u0006"+ + "\u0007\u0001\u0000\u01d0\u001b\u0001\u0000\u0000\u0000\u01d1\u01d2\u0005"+ + "@\u0000\u0000\u01d2\u01d3\u0007\u0003\u0000\u0000\u01d3\u01d4\u0007\t"+ + "\u0000\u0000\u01d4\u01d5\u0007\n\u0000\u0000\u01d5\u01d6\u0007\u0003\u0000"+ + "\u0000\u01d6\u01d7\u0007\u0007\u0000\u0000\u01d7\u023f\u0007\u0000\u0000"+ + "\u0000\u01d8\u023f\u0003\u0010\u0002\u0000\u01d9\u01da\u0005@\u0000\u0000"+ + "\u01da\u01db\u0007\u0003\u0000\u0000\u01db\u01dc\u0007\u0016\u0000\u0000"+ + "\u01dc\u01dd\u0007\u000b\u0000\u0000\u01dd\u01de\u0007\u0003\u0000\u0000"+ + "\u01de\u01df\u0007\f\u0000\u0000\u01df\u01e0\u0007\u0011\u0000\u0000\u01e0"+ + "\u023f\u0007\n\u0000\u0000\u01e1\u01e2\u0005@\u0000\u0000\u01e2\u01e3"+ + "\u0007\u0003\u0000\u0000\u01e3\u01e4\u0007\u0004\u0000\u0000\u01e4\u01e5"+ + "\u0007\u0005\u0000\u0000\u01e5\u023f\u0007\u0006\u0000\u0000\u01e6\u01e7"+ + "\u0005@\u0000\u0000\u01e7\u01e8\u0007\u000f\u0000\u0000\u01e8\u01e9\u0007"+ + "\u0007\u0000\u0000\u01e9\u01ea\u0007\u0003\u0000\u0000\u01ea\u01eb\u0007"+ + "\t\u0000\u0000\u01eb\u023f\u0007\u0011\u0000\u0000\u01ec\u01ed\u0005@"+ + "\u0000\u0000\u01ed\u01ee\u0007\r\u0000\u0000\u01ee\u01ef\u0007\u0002\u0000"+ + "\u0000\u01ef\u01f0\u0007\u0001\u0000\u0000\u01f0\u01f1\u0007\r\u0000\u0000"+ + "\u01f1\u023f\u0007\n\u0000\u0000\u01f2\u01f3\u0005@\u0000\u0000\u01f3"+ + "\u01f4\u0007\u0012\u0000\u0000\u01f4\u01f5\u0007\u0003\u0000\u0000\u01f5"+ + "\u01f6\u0007\u000b\u0000\u0000\u01f6\u01f7\u0007\u0006\u0000\u0000\u01f7"+ + "\u01f8\u0007\u0001\u0000\u0000\u01f8\u023f\u0007\u0011\u0000\u0000\u01f9"+ + "\u01fa\u0005@\u0000\u0000\u01fa\u01fb\u0007\u0005\u0000\u0000\u01fb\u01fc"+ + "\u0007\t\u0000\u0000\u01fc\u01fd\u0007\u0004\u0000\u0000\u01fd\u01fe\u0007"+ + "\n\u0000\u0000\u01fe\u023f\u0007\n\u0000\u0000\u01ff\u0200\u0005@\u0000"+ + "\u0000\u0200\u0201\u0007\n\u0000\u0000\u0201\u0202\u0007\u000b\u0000\u0000"+ + "\u0202\u0203\u0007\u000f\u0000\u0000\u0203\u0204\u0007\t\u0000\u0000\u0204"+ + "\u023f\u0007\u0003\u0000\u0000\u0205\u0206\u0005@\u0000\u0000\u0206\u0207"+ + "\u0007\u0004\u0000\u0000\u0207\u0208\u0007\b\u0000\u0000\u0208\u0209\u0007"+ + "\u0004\u0000\u0000\u0209\u020a\u0007\u0002\u0000\u0000\u020a\u023f\u0007"+ + "\u0003\u0000\u0000\u020b\u020c\u0005@\u0000\u0000\u020c\u020d\u0007\u0017"+ + "\u0000\u0000\u020d\u020e\u0007\u0002\u0000\u0000\u020e\u020f\u0007\u0003"+ + "\u0000\u0000\u020f\u0210\u0007\u0004\u0000\u0000\u0210\u023f\u0007\u0018"+ + "\u0000\u0000\u0211\u0212\u0005@\u0000\u0000\u0212\u0213\u0007\u0005\u0000"+ + "\u0000\u0213\u0214\u0007\u0001\u0000\u0000\u0214\u0215\u0007\f\u0000\u0000"+ + "\u0215\u0216\u0007\u000b\u0000\u0000\u0216\u0217\u0007\u0007\u0000\u0000"+ + "\u0217\u0218\u0007\f\u0000\u0000\u0218\u0219\u0007\u000e\u0000\u0000\u0219"+ + "\u023f\u0007\u0003\u0000\u0000\u021a\u021b\u0005@\u0000\u0000\u021b\u021c"+ + "\u0007\n\u0000\u0000\u021c\u021d\u0007\u0003\u0000\u0000\u021d\u021e\u0007"+ + "\t\u0000\u0000\u021e\u021f\u0007\u0003\u0000\u0000\u021f\u0220\u0007\u0005"+ + "\u0000\u0000\u0220\u0221\u0007\u000b\u0000\u0000\u0221\u0222\u0007\u0003"+ + "\u0000\u0000\u0222\u023f\u0007\u0011\u0000\u0000\u0223\u0224\u0005@\u0000"+ + "\u0000\u0224\u0225\u0007\u0011\u0000\u0000\u0225\u0226\u0007\u0007\u0000"+ + "\u0000\u0226\u0227\u0007\n\u0000\u0000\u0227\u0228\u0007\u0004\u0000\u0000"+ + "\u0228\u0229\u0007\u0017\u0000\u0000\u0229\u022a\u0007\t\u0000\u0000\u022a"+ + "\u022b\u0007\u0003\u0000\u0000\u022b\u023f\u0007\u0011\u0000\u0000\u022c"+ + "\u022d\u0005@\u0000\u0000\u022d\u022e\u0007\u0002\u0000\u0000\u022e\u022f"+ + "\u0007\u0003\u0000\u0000\u022f\u0230\u0007\u0004\u0000\u0000\u0230\u0231"+ + "\u0007\u0011\u0000\u0000\u0231\u0232\u0007\u0001\u0000\u0000\u0232\u0233"+ + "\u0007\f\u0000\u0000\u0233\u0234\u0007\t\u0000\u0000\u0234\u023f\u0007"+ + "\u000f\u0000\u0000\u0235\u0236\u0005@\u0000\u0000\u0236\u0237\u0007\u0002"+ + "\u0000\u0000\u0237\u0238\u0007\u0003\u0000\u0000\u0238\u0239\u0007\u0019"+ + "\u0000\u0000\u0239\u023a\u0007\u000e\u0000\u0000\u023a\u023b\u0007\u0007"+ + "\u0000\u0000\u023b\u023c\u0007\u0002\u0000\u0000\u023c\u023d\u0007\u0003"+ + "\u0000\u0000\u023d\u023f\u0007\u0011\u0000\u0000\u023e\u01d1\u0001\u0000"+ + "\u0000\u0000\u023e\u01d8\u0001\u0000\u0000\u0000\u023e\u01d9\u0001\u0000"+ + "\u0000\u0000\u023e\u01e1\u0001\u0000\u0000\u0000\u023e\u01e6\u0001\u0000"+ + "\u0000\u0000\u023e\u01ec\u0001\u0000\u0000\u0000\u023e\u01f2\u0001\u0000"+ + "\u0000\u0000\u023e\u01f9\u0001\u0000\u0000\u0000\u023e\u01ff\u0001\u0000"+ + "\u0000\u0000\u023e\u0205\u0001\u0000\u0000\u0000\u023e\u020b\u0001\u0000"+ + "\u0000\u0000\u023e\u0211\u0001\u0000\u0000\u0000\u023e\u021a\u0001\u0000"+ + "\u0000\u0000\u023e\u0223\u0001\u0000\u0000\u0000\u023e\u022c\u0001\u0000"+ + "\u0000\u0000\u023e\u0235\u0001\u0000\u0000\u0000\u023f\u0241\u0001\u0000"+ + "\u0000\u0000\u0240\u0242\u0005 \u0000\u0000\u0241\u0240\u0001\u0000\u0000"+ + "\u0000\u0242\u0243\u0001\u0000\u0000\u0000\u0243\u0241\u0001\u0000\u0000"+ + "\u0000\u0243\u0244\u0001\u0000\u0000\u0000\u0244\u0245\u0001\u0000\u0000"+ + "\u0000\u0245\u0246\u0004\b\u0000\u0000\u0246\u0247\u0001\u0000\u0000\u0000"+ + "\u0247\u0248\u0006\b\u0000\u0000\u0248\u0249\u0006\b\u0001\u0000\u0249"+ + "\u001d\u0001\u0000\u0000\u0000\u024a\u024b\u0005@\u0000\u0000\u024b\u024c"+ + "\u0007\u0017\u0000\u0000\u024c\u024d\u0007\u0002\u0000\u0000\u024d\u024e"+ + "\u0007\u0003\u0000\u0000\u024e\u024f\u0007\u0004\u0000\u0000\u024f\u025a"+ + "\u0007\u0018\u0000\u0000\u0250\u0251\u0005@\u0000\u0000\u0251\u0252\u0007"+ + "\u0005\u0000\u0000\u0252\u0253\u0007\u0001\u0000\u0000\u0253\u0254\u0007"+ + "\f\u0000\u0000\u0254\u0255\u0007\u000b\u0000\u0000\u0255\u0256\u0007\u0007"+ + "\u0000\u0000\u0256\u0257\u0007\f\u0000\u0000\u0257\u0258\u0007\u000e\u0000"+ + "\u0000\u0258\u025a\u0007\u0003\u0000\u0000\u0259\u024a\u0001\u0000\u0000"+ + "\u0000\u0259\u0250\u0001\u0000\u0000\u0000\u025a\u025b\u0001\u0000\u0000"+ + "\u0000\u025b\u025c\u0006\t\u0001\u0000\u025c\u001f\u0001\u0000\u0000\u0000"+ + "\u025d\u025e\u0005@\u0000\u0000\u025e\u025f\u0007\n\u0000\u0000\u025f"+ + "\u0260\u0007\u000b\u0000\u0000\u0260\u0261\u0007\u0001\u0000\u0000\u0261"+ + "\u0289\u0007\r\u0000\u0000\u0262\u0263\u0005@\u0000\u0000\u0263\u0264"+ + "\u0007\n\u0000\u0000\u0264\u0265\u0007\u0006\u0000\u0000\u0265\u0266\u0007"+ + "\u0001\u0000\u0000\u0266\u0289\u0007\b\u0000\u0000\u0267\u0268\u0005@"+ + "\u0000\u0000\u0268\u0269\u0007\u0001\u0000\u0000\u0269\u026a\u0007\u001a"+ + "\u0000\u0000\u026a\u026b\u0007\u0003\u0000\u0000\u026b\u026c\u0007\u0002"+ + "\u0000\u0000\u026c\u026d\u0007\b\u0000\u0000\u026d\u026e\u0007\u0002\u0000"+ + "\u0000\u026e\u026f\u0007\u0007\u0000\u0000\u026f\u0270\u0007\u000b\u0000"+ + "\u0000\u0270\u0289\u0007\u0003\u0000\u0000\u0271\u0272\u0005@\u0000\u0000"+ + "\u0272\u0273\u0007\u001a\u0000\u0000\u0273\u0274\u0007\u0007\u0000\u0000"+ + "\u0274\u0275\u0007\u000b\u0000\u0000\u0275\u0276\u0007\u0003\u0000\u0000"+ + "\u0276\u0277\u0007\u0002\u0000\u0000\u0277\u0278\u0007\u0003\u0000\u0000"+ + "\u0278\u0279\u0007\u0004\u0000\u0000\u0279\u027a\u0007\u0005\u0000\u0000"+ + "\u027a\u027b\u0007\u000b\u0000\u0000\u027b\u027c\u0007\u0002\u0000\u0000"+ + "\u027c\u027d\u0007\u0003\u0000\u0000\u027d\u027e\u0007\u0000\u0000\u0000"+ + "\u027e\u027f\u0007\u0002\u0000\u0000\u027f\u0280\u0007\u0003\u0000\u0000"+ + "\u0280\u0281\u0007\n\u0000\u0000\u0281\u0289\u0007\u0006\u0000\u0000\u0282"+ + "\u0283\u0005@\u0000\u0000\u0283\u0284\u0007\u0003\u0000\u0000\u0284\u0285"+ + "\u0007\f\u0000\u0000\u0285\u0286\u0007\u0011\u0000\u0000\u0286\u0287\u0001"+ + "\u0000\u0000\u0000\u0287\u0289\u0003\u000e\u0001\u0000\u0288\u025d\u0001"+ + "\u0000\u0000\u0000\u0288\u0262\u0001\u0000\u0000\u0000\u0288\u0267\u0001"+ + "\u0000\u0000\u0000\u0288\u0271\u0001\u0000\u0000\u0000\u0288\u0282\u0001"+ + "\u0000\u0000\u0000\u0289\u028a\u0001\u0000\u0000\u0000\u028a\u028b\u0006"+ + "\n\u0001\u0000\u028b!\u0001\u0000\u0000\u0000\u028c\u028d\u0005@\u0000"+ + "\u0000\u028d\u028e\u0007\u001a\u0000\u0000\u028e\u028f\u0007\u0003\u0000"+ + "\u0000\u028f\u0290\u0007\u0002\u0000\u0000\u0290\u0291\u0007\u0017\u0000"+ + "\u0000\u0291\u0292\u0007\u0004\u0000\u0000\u0292\u0293\u0007\u000b\u0000"+ + "\u0000\u0293\u0294\u0007\u0007\u0000\u0000\u0294\u0295\u0007\u0012\u0000"+ + "\u0000\u0295\u0296\u0001\u0000\u0000\u0000\u0296\u0297\u0006\u000b\u0002"+ + "\u0000\u0297\u0298\u0006\u000b\u0001\u0000\u0298#\u0001\u0000\u0000\u0000"+ + "\u0299\u029a\u0005@\u0000\u0000\u029a\u029b\u0007\u0003\u0000\u0000\u029b"+ + "\u029c\u0007\f\u0000\u0000\u029c\u029d\u0007\u0011\u0000\u0000\u029d\u029e"+ + "\u0007\u001a\u0000\u0000\u029e\u029f\u0007\u0003\u0000\u0000\u029f\u02a0"+ + "\u0007\u0002\u0000\u0000\u02a0\u02a1\u0007\u0017\u0000\u0000\u02a1\u02a2"+ + "\u0007\u0004\u0000\u0000\u02a2\u02a3\u0007\u000b\u0000\u0000\u02a3\u02a4"+ + "\u0007\u0007\u0000\u0000\u02a4\u02a5\u0007\u0012\u0000\u0000\u02a5\u02a6"+ + "\u0001\u0000\u0000\u0000\u02a6\u02a7\u0006\f\u0001\u0000\u02a7%\u0001"+ + "\u0000\u0000\u0000\u02a8\u02a9\u0005@\u0000\u0000\u02a9\u02aa\u0007\u0011"+ + "\u0000\u0000\u02aa\u02c0\u0007\u0011\u0000\u0000\u02ab\u02ac\u0005@\u0000"+ + "\u0000\u02ac\u02ad\u0007\u0011\u0000\u0000\u02ad\u02ae\u0007\u000e\u0000"+ + "\u0000\u02ae\u02af\u0007\u0012\u0000\u0000\u02af\u02c0\u0007\r\u0000\u0000"+ + "\u02b0\u02b1\u0005@\u0000\u0000\u02b1\u02b2\u0007\u001b\u0000\u0000\u02b2"+ + "\u02c0\u0007\n\u0000\u0000\u02b3\u02b4\u0005@\u0000\u0000\u02b4\u02b5"+ + "\u0007\u001b\u0000\u0000\u02b5\u02b6\u0007\n\u0000\u0000\u02b6\u02b7\u0007"+ + "\u0001\u0000\u0000\u02b7\u02c0\u0007\f\u0000\u0000\u02b8\u02b9\u0005@"+ + "\u0000\u0000\u02b9\u02ba\u0007\u0007\u0000\u0000\u02ba\u02bb\u0007\f\u0000"+ + "\u0000\u02bb\u02bc\u0007\u001b\u0000\u0000\u02bc\u02bd\u0007\u0003\u0000"+ + "\u0000\u02bd\u02be\u0007\u0005\u0000\u0000\u02be\u02c0\u0007\u000b\u0000"+ + "\u0000\u02bf\u02a8\u0001\u0000\u0000\u0000\u02bf\u02ab\u0001\u0000\u0000"+ + "\u0000\u02bf\u02b0\u0001\u0000\u0000\u0000\u02bf\u02b3\u0001\u0000\u0000"+ + "\u0000\u02bf\u02b8\u0001\u0000\u0000\u0000\u02c0\u02c1\u0001\u0000\u0000"+ + "\u0000\u02c1\u02c2\u0006\r\u0000\u0000\u02c2\u02c3\u0006\r\u0001\u0000"+ + "\u02c3\'\u0001\u0000\u0000\u0000\u02c4\u02c5\u0005@\u0000\u0000\u02c5"+ + "\u02c6\u0007\u0003\u0000\u0000\u02c6\u02c7\u0007\t\u0000\u0000\u02c7\u02c8"+ + "\u0007\n\u0000\u0000\u02c8\u02e5\u0007\u0003\u0000\u0000\u02c9\u02ca\u0005"+ + "@\u0000\u0000\u02ca\u02cb\u0007\u0005\u0000\u0000\u02cb\u02cc\u0007\n"+ + "\u0000\u0000\u02cc\u02cd\u0007\u0002\u0000\u0000\u02cd\u02e5\u0007\u0000"+ + "\u0000\u0000\u02ce\u02cf\u0005@\u0000\u0000\u02cf\u02d0\u0007\u0011\u0000"+ + "\u0000\u02d0\u02d1\u0007\u0003\u0000\u0000\u02d1\u02d2\u0007\u0000\u0000"+ + "\u0000\u02d2\u02d3\u0007\u0004\u0000\u0000\u02d3\u02d4\u0007\u000e\u0000"+ + "\u0000\u02d4\u02d5\u0007\t\u0000\u0000\u02d5\u02e5\u0007\u000b\u0000\u0000"+ + "\u02d6\u02d7\u0005@\u0000\u0000\u02d7\u02d8\u0007\u0004\u0000\u0000\u02d8"+ + "\u02d9\u0007\r\u0000\u0000\u02d9\u02da\u0007\r\u0000\u0000\u02da\u02db"+ + "\u0007\u0003\u0000\u0000\u02db\u02dc\u0007\f\u0000\u0000\u02dc\u02e5\u0007"+ + "\u0011\u0000\u0000\u02dd\u02de\u0005@\u0000\u0000\u02de\u02df\u0007\r"+ + "\u0000\u0000\u02df\u02e0\u0007\u0004\u0000\u0000\u02e0\u02e1\u0007\u0002"+ "\u0000\u0000\u02e1\u02e2\u0007\u0003\u0000\u0000\u02e2\u02e3\u0007\f\u0000"+ "\u0000\u02e3\u02e5\u0007\u000b\u0000\u0000\u02e4\u02c4\u0001\u0000\u0000"+ "\u0000\u02e4\u02c9\u0001\u0000\u0000\u0000\u02e4\u02ce\u0001\u0000\u0000"+ @@ -1391,13 +1394,13 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "\u0001\u0000\u0000\u0000\u0468\u0469\u0001\u0000\u0000\u0000\u0469\u046a"+ "\u0001\u0000\u0000\u0000\u046a\u046b\u0006-\t\u0000\u046bg\u0001\u0000"+ "\u0000\u0000\u046c\u046d\u0005{\u0000\u0000\u046d\u046e\u0005{\u0000\u0000"+ - "\u046e\u054b\u0005{\u0000\u0000\u046f\u0470\u0005@\u0000\u0000\u0470\u0471"+ + "\u046e\u0558\u0005{\u0000\u0000\u046f\u0470\u0005@\u0000\u0000\u0470\u0471"+ "\u0005@\u0000\u0000\u0471\u0473\u0001\u0000\u0000\u0000\u0472\u0474\u0005"+ "@\u0000\u0000\u0473\u0472\u0001\u0000\u0000\u0000\u0473\u0474\u0001\u0000"+ - "\u0000\u0000\u0474\u054b\u0001\u0000\u0000\u0000\u0475\u0476\u0005@\u0000"+ + "\u0000\u0000\u0474\u0558\u0001\u0000\u0000\u0000\u0475\u0476\u0005@\u0000"+ "\u0000\u0476\u0477\u0005{\u0000\u0000\u0477\u0479\u0001\u0000\u0000\u0000"+ "\u0478\u047a\u0005{\u0000\u0000\u0479\u0478\u0001\u0000\u0000\u0000\u0479"+ - "\u047a\u0001\u0000\u0000\u0000\u047a\u054b\u0001\u0000\u0000\u0000\u047b"+ + "\u047a\u0001\u0000\u0000\u0000\u047a\u0558\u0001\u0000\u0000\u0000\u047b"+ "\u047c\u0005@\u0000\u0000\u047c\u047d\u0007\u0012\u0000\u0000\u047d\u047e"+ "\u0007\u0003\u0000\u0000\u047e\u047f\u0007\u0011\u0000\u0000\u047f\u0480"+ "\u0007\u0007\u0000\u0000\u0480\u0481\u0007\u0004\u0000\u0000\u0481\u0485"+ @@ -1406,372 +1409,374 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "\u0000\u0000\u0000\u0485\u0486\u0001\u0000\u0000\u0000\u0486\u0489\u0001"+ "\u0000\u0000\u0000\u0487\u0485\u0001\u0000\u0000\u0000\u0488\u048a\u0005"+ "(\u0000\u0000\u0489\u0488\u0001\u0000\u0000\u0000\u0489\u048a\u0001\u0000"+ - "\u0000\u0000\u048a\u054b\u0001\u0000\u0000\u0000\u048b\u048c\u0005@\u0000"+ + "\u0000\u0000\u048a\u0558\u0001\u0000\u0000\u0000\u048b\u048c\u0005@\u0000"+ "\u0000\u048c\u048d\u0007\u0005\u0000\u0000\u048d\u048e\u0007\u0006\u0000"+ "\u0000\u048e\u048f\u0007\u0004\u0000\u0000\u048f\u0490\u0007\u0002\u0000"+ "\u0000\u0490\u0491\u0007\n\u0000\u0000\u0491\u0492\u0007\u0003\u0000\u0000"+ - "\u0492\u0493\u0007\u000b\u0000\u0000\u0493\u0497\u0001\u0000\u0000\u0000"+ - "\u0494\u0496\u0007*\u0000\u0000\u0495\u0494\u0001\u0000\u0000\u0000\u0496"+ - "\u0499\u0001\u0000\u0000\u0000\u0497\u0495\u0001\u0000\u0000\u0000\u0497"+ - "\u0498\u0001\u0000\u0000\u0000\u0498\u054b\u0001\u0000\u0000\u0000\u0499"+ - "\u0497\u0001\u0000\u0000\u0000\u049a\u049b\u0005@\u0000\u0000\u049b\u049c"+ - "\u0007\u0007\u0000\u0000\u049c\u049d\u0007\u0012\u0000\u0000\u049d\u049e"+ - "\u0007\r\u0000\u0000\u049e\u049f\u0007\u0001\u0000\u0000\u049f\u04a0\u0007"+ - "\u0002\u0000\u0000\u04a0\u04a1\u0007\u000b\u0000\u0000\u04a1\u04a5\u0001"+ - "\u0000\u0000\u0000\u04a2\u04a4\u0007*\u0000\u0000\u04a3\u04a2\u0001\u0000"+ - "\u0000\u0000\u04a4\u04a7\u0001\u0000\u0000\u0000\u04a5\u04a3\u0001\u0000"+ - "\u0000\u0000\u04a5\u04a6\u0001\u0000\u0000\u0000\u04a6\u054b\u0001\u0000"+ - "\u0000\u0000\u04a7\u04a5\u0001\u0000\u0000\u0000\u04a8\u04a9\u0005@\u0000"+ - "\u0000\u04a9\u04aa\u0007\f\u0000\u0000\u04aa\u04ab\u0007\u0004\u0000\u0000"+ - "\u04ab\u04ac\u0007\u0012\u0000\u0000\u04ac\u04ad\u0007\u0003\u0000\u0000"+ - "\u04ad\u04ae\u0007\n\u0000\u0000\u04ae\u04af\u0007\r\u0000\u0000\u04af"+ - "\u04b0\u0007\u0004\u0000\u0000\u04b0\u04b1\u0007\u0005\u0000\u0000\u04b1"+ - "\u04b2\u0007\u0003\u0000\u0000\u04b2\u04b6\u0001\u0000\u0000\u0000\u04b3"+ - "\u04b5\u0007*\u0000\u0000\u04b4\u04b3\u0001\u0000\u0000\u0000\u04b5\u04b8"+ - "\u0001\u0000\u0000\u0000\u04b6\u04b4\u0001\u0000\u0000\u0000\u04b6\u04b7"+ - "\u0001\u0000\u0000\u0000\u04b7\u054b\u0001\u0000\u0000\u0000\u04b8\u04b6"+ - "\u0001\u0000\u0000\u0000\u04b9\u04ba\u0005@\u0000\u0000\u04ba\u04bb\u0007"+ - "\u0011\u0000\u0000\u04bb\u04bc\u0007\u0001\u0000\u0000\u04bc\u04bd\u0007"+ - "\u0005\u0000\u0000\u04bd\u04be\u0007\u000e\u0000\u0000\u04be\u04bf\u0007"+ - "\u0012\u0000\u0000\u04bf\u04c0\u0007\u0003\u0000\u0000\u04c0\u04c1\u0007"+ - "\f\u0000\u0000\u04c1\u04c2\u0007\u000b\u0000\u0000\u04c2\u04c6\u0001\u0000"+ - "\u0000\u0000\u04c3\u04c5\u0007*\u0000\u0000\u04c4\u04c3\u0001\u0000\u0000"+ - "\u0000\u04c5\u04c8\u0001\u0000\u0000\u0000\u04c6\u04c4\u0001\u0000\u0000"+ - "\u0000\u04c6\u04c7\u0001\u0000\u0000\u0000\u04c7\u054b\u0001\u0000\u0000"+ - "\u0000\u04c8\u04c6\u0001\u0000\u0000\u0000\u04c9\u04ca\u0005@\u0000\u0000"+ - "\u04ca\u04cb\u0007\u0000\u0000\u0000\u04cb\u04cc\u0007\u0001\u0000\u0000"+ - "\u04cc\u04cd\u0007\f\u0000\u0000\u04cd\u04ce\u0007\u000b\u0000\u0000\u04ce"+ - "\u04cf\u0005-\u0000\u0000\u04cf\u04d0\u0007\u0000\u0000\u0000\u04d0\u04d1"+ - "\u0007\u0004\u0000\u0000\u04d1\u04d2\u0007\u0005\u0000\u0000\u04d2\u04d3"+ - "\u0007\u0003\u0000\u0000\u04d3\u04d7\u0001\u0000\u0000\u0000\u04d4\u04d6"+ - "\u0007*\u0000\u0000\u04d5\u04d4\u0001\u0000\u0000\u0000\u04d6\u04d9\u0001"+ - "\u0000\u0000\u0000\u04d7\u04d5\u0001\u0000\u0000\u0000\u04d7\u04d8\u0001"+ - "\u0000\u0000\u0000\u04d8\u054b\u0001\u0000\u0000\u0000\u04d9\u04d7\u0001"+ - "\u0000\u0000\u0000\u04da\u04db\u0005@\u0000\u0000\u04db\u04dc\u0007\r"+ - "\u0000\u0000\u04dc\u04dd\u0007\u0004\u0000\u0000\u04dd\u04de\u0007\u0010"+ - "\u0000\u0000\u04de\u04df\u0007\u0003\u0000\u0000\u04df\u04e3\u0001\u0000"+ - "\u0000\u0000\u04e0\u04e2\u0007*\u0000\u0000\u04e1\u04e0\u0001\u0000\u0000"+ - "\u0000\u04e2\u04e5\u0001\u0000\u0000\u0000\u04e3\u04e1\u0001\u0000\u0000"+ - "\u0000\u04e3\u04e4\u0001\u0000\u0000\u0000\u04e4\u054b\u0001\u0000\u0000"+ - "\u0000\u04e5\u04e3\u0001\u0000\u0000\u0000\u04e6\u04e7\u0005@\u0000\u0000"+ - "\u04e7\u04e8\u0007\n\u0000\u0000\u04e8\u04e9\u0007\u000e\u0000\u0000\u04e9"+ - "\u04ea\u0007\r\u0000\u0000\u04ea\u04eb\u0007\r\u0000\u0000\u04eb\u04ec"+ - "\u0007\u0001\u0000\u0000\u04ec\u04ed\u0007\u0002\u0000\u0000\u04ed\u04ee"+ - "\u0007\u000b\u0000\u0000\u04ee\u04ef\u0007\n\u0000\u0000\u04ef\u04f3\u0001"+ - "\u0000\u0000\u0000\u04f0\u04f2\u0007*\u0000\u0000\u04f1\u04f0\u0001\u0000"+ - "\u0000\u0000\u04f2\u04f5\u0001\u0000\u0000\u0000\u04f3\u04f1\u0001\u0000"+ - "\u0000\u0000\u04f3\u04f4\u0001\u0000\u0000\u0000\u04f4\u054b\u0001\u0000"+ - "\u0000\u0000\u04f5\u04f3\u0001\u0000\u0000\u0000\u04f6\u04f7\u0005@\u0000"+ - "\u0000\u04f7\u04f8\u0007\t\u0000\u0000\u04f8\u04f9\u0007\u0004\u0000\u0000"+ - "\u04f9\u04fa\u0007\u000f\u0000\u0000\u04fa\u04fb\u0007\u0003\u0000\u0000"+ - "\u04fb\u04fc\u0007\u0002\u0000\u0000\u04fc\u0500\u0001\u0000\u0000\u0000"+ - "\u04fd\u04ff\u0007*\u0000\u0000\u04fe\u04fd\u0001\u0000\u0000\u0000\u04ff"+ - "\u0502\u0001\u0000\u0000\u0000\u0500\u04fe\u0001\u0000\u0000\u0000\u0500"+ - "\u0501\u0001\u0000\u0000\u0000\u0501\u054b\u0001\u0000\u0000\u0000\u0502"+ - "\u0500\u0001\u0000\u0000\u0000\u0503\u0504\u0005@\u0000\u0000\u0504\u0505"+ - "\u0007\u000b\u0000\u0000\u0505\u0506\u0007\u0004\u0000\u0000\u0506\u0507"+ - "\u0007\u0007\u0000\u0000\u0507\u0508\u0007\t\u0000\u0000\u0508\u0509\u0007"+ - "\b\u0000\u0000\u0509\u050a\u0007\u0007\u0000\u0000\u050a\u050b\u0007\f"+ - "\u0000\u0000\u050b\u050c\u0007\u0011\u0000\u0000\u050c\u0510\u0001\u0000"+ - "\u0000\u0000\u050d\u050f\u0007*\u0000\u0000\u050e\u050d\u0001\u0000\u0000"+ - "\u0000\u050f\u0512\u0001\u0000\u0000\u0000\u0510\u050e\u0001\u0000\u0000"+ - "\u0000\u0510\u0511\u0001\u0000\u0000\u0000\u0511\u054b\u0001\u0000\u0000"+ - "\u0000\u0512\u0510\u0001\u0000\u0000\u0000\u0513\u0514\u0005@\u0000\u0000"+ - "\u0514\u0515\u0007\u0004\u0000\u0000\u0515\u0516\u0007\r\u0000\u0000\u0516"+ - "\u0517\u0007\r\u0000\u0000\u0517\u0518\u0007\t\u0000\u0000\u0518\u0519"+ - "\u0007\u000f\u0000\u0000\u0519\u051d\u0001\u0000\u0000\u0000\u051a\u051c"+ - "\u0007*\u0000\u0000\u051b\u051a\u0001\u0000\u0000\u0000\u051c\u051f\u0001"+ - "\u0000\u0000\u0000\u051d\u051b\u0001\u0000\u0000\u0000\u051d\u051e\u0001"+ - "\u0000\u0000\u0000\u051e\u054b\u0001\u0000\u0000\u0000\u051f\u051d\u0001"+ - "\u0000\u0000\u0000\u0520\u0521\u0005@\u0000\u0000\u0521\u0522\u0005-\u0000"+ - "\u0000\u0522\u0523\u0007\b\u0000\u0000\u0523\u0524\u0007\u0003\u0000\u0000"+ - "\u0524\u0525\u0007\u0017\u0000\u0000\u0525\u0526\u0007\u0018\u0000\u0000"+ - "\u0526\u0527\u0007\u0007\u0000\u0000\u0527\u0528\u0007\u000b\u0000\u0000"+ - "\u0528\u0529\u0005-\u0000\u0000\u0529\u052a\u0007\u0018\u0000\u0000\u052a"+ - "\u052b\u0007\u0003\u0000\u0000\u052b\u052c\u0007\u000f\u0000\u0000\u052c"+ - "\u052d\u0007\u0000\u0000\u0000\u052d\u052e\u0007\u0002\u0000\u0000\u052e"+ - "\u052f\u0007\u0004\u0000\u0000\u052f\u0530\u0007\u0012\u0000\u0000\u0530"+ - "\u0531\u0007\u0003\u0000\u0000\u0531\u0532\u0007\n\u0000\u0000\u0532\u0536"+ - "\u0001\u0000\u0000\u0000\u0533\u0535\u0007*\u0000\u0000\u0534\u0533\u0001"+ - "\u0000\u0000\u0000\u0535\u0538\u0001\u0000\u0000\u0000\u0536\u0534\u0001"+ - "\u0000\u0000\u0000\u0536\u0537\u0001\u0000\u0000\u0000\u0537\u054b\u0001"+ - "\u0000\u0000\u0000\u0538\u0536\u0001\u0000\u0000\u0000\u0539\u053a\u0005"+ - "@\u0000\u0000\u053a\u053b\u0007\u0018\u0000\u0000\u053b\u053c\u0007\u0003"+ - "\u0000\u0000\u053c\u053d\u0007\u000f\u0000\u0000\u053d\u053e\u0007\u0000"+ - "\u0000\u0000\u053e\u053f\u0007\u0002\u0000\u0000\u053f\u0540\u0007\u0004"+ - "\u0000\u0000\u0540\u0541\u0007\u0012\u0000\u0000\u0541\u0542\u0007\u0003"+ - "\u0000\u0000\u0542\u0543\u0007\n\u0000\u0000\u0543\u0547\u0001\u0000\u0000"+ - "\u0000\u0544\u0546\u0007*\u0000\u0000\u0545\u0544\u0001\u0000\u0000\u0000"+ - "\u0546\u0549\u0001\u0000\u0000\u0000\u0547\u0545\u0001\u0000\u0000\u0000"+ - "\u0547\u0548\u0001\u0000\u0000\u0000\u0548\u054b\u0001\u0000\u0000\u0000"+ - "\u0549\u0547\u0001\u0000\u0000\u0000\u054a\u046c\u0001\u0000\u0000\u0000"+ - "\u054a\u046f\u0001\u0000\u0000\u0000\u054a\u0475\u0001\u0000\u0000\u0000"+ - "\u054a\u047b\u0001\u0000\u0000\u0000\u054a\u048b\u0001\u0000\u0000\u0000"+ - "\u054a\u049a\u0001\u0000\u0000\u0000\u054a\u04a8\u0001\u0000\u0000\u0000"+ - "\u054a\u04b9\u0001\u0000\u0000\u0000\u054a\u04c9\u0001\u0000\u0000\u0000"+ - "\u054a\u04da\u0001\u0000\u0000\u0000\u054a\u04e6\u0001\u0000\u0000\u0000"+ - "\u054a\u04f6\u0001\u0000\u0000\u0000\u054a\u0503\u0001\u0000\u0000\u0000"+ - "\u054a\u0513\u0001\u0000\u0000\u0000\u054a\u0520\u0001\u0000\u0000\u0000"+ - "\u054a\u0539\u0001\u0000\u0000\u0000\u054b\u054c\u0001\u0000\u0000\u0000"+ - "\u054c\u054d\u0006.\t\u0000\u054di\u0001\u0000\u0000\u0000\u054e\u054f"+ - "\t\u0000\u0000\u0000\u054f\u0550\u0004/\u0007\u0000\u0550\u0551\u0001"+ - "\u0000\u0000\u0000\u0551\u0552\u0006/\u000e\u0000\u0552\u0553\u0006/\u000f"+ - "\u0000\u0553k\u0001\u0000\u0000\u0000\u0554\u0555\t\u0000\u0000\u0000"+ - "\u0555\u0556\u0001\u0000\u0000\u0000\u0556\u0557\u00060\f\u0000\u0557"+ - "m\u0001\u0000\u0000\u0000\u0558\u0559\u0005\u0000\u0000\u0001\u0559\u055a"+ - "\u0001\u0000\u0000\u0000\u055a\u055b\u00061\u000e\u0000\u055b\u055c\u0006"+ - "1\u000f\u0000\u055co\u0001\u0000\u0000\u0000\u055d\u055e\u0005}\u0000"+ - "\u0000\u055e\u055f\u0005}\u0000\u0000\u055f\u0560\u0001\u0000\u0000\u0000"+ - "\u0560\u0561\u00062\u000f\u0000\u0561\u0562\u00062\u0006\u0000\u0562q"+ - "\u0001\u0000\u0000\u0000\u0563\u0564\u0003\f\u0000\u0000\u0564\u0565\u0006"+ - "3\u0010\u0000\u0565s\u0001\u0000\u0000\u0000\u0566\u0569\u0003X&\u0000"+ - "\u0567\u0569\u0003\u0012\u0003\u0000\u0568\u0566\u0001\u0000\u0000\u0000"+ - "\u0568\u0567\u0001\u0000\u0000\u0000\u0569\u056a\u0001\u0000\u0000\u0000"+ - "\u056a\u056b\u00064\u0011\u0000\u056bu\u0001\u0000\u0000\u0000\u056c\u056d"+ - "\u0005:\u0000\u0000\u056d\u0570\u0005)\u0000\u0000\u056e\u0570\u0005:"+ - "\u0000\u0000\u056f\u056c\u0001\u0000\u0000\u0000\u056f\u056e\u0001\u0000"+ - "\u0000\u0000\u0570\u0571\u0001\u0000\u0000\u0000\u0571\u0572\u00065\u0012"+ - "\u0000\u0572w\u0001\u0000\u0000\u0000\u0573\u0575\b+\u0000\u0000\u0574"+ - "\u0573\u0001\u0000\u0000\u0000\u0575\u0576\u0001\u0000\u0000\u0000\u0576"+ - "\u0574\u0001\u0000\u0000\u0000\u0576\u0577\u0001\u0000\u0000\u0000\u0577"+ - "\u0578\u0001\u0000\u0000\u0000\u0578\u0579\u00066\u0013\u0000\u0579y\u0001"+ - "\u0000\u0000\u0000\u057a\u057e\t\u0000\u0000\u0000\u057b\u057d\u0007*"+ - "\u0000\u0000\u057c\u057b\u0001\u0000\u0000\u0000\u057d\u0580\u0001\u0000"+ - "\u0000\u0000\u057e\u057c\u0001\u0000\u0000\u0000\u057e\u057f\u0001\u0000"+ - "\u0000\u0000\u057f\u0581\u0001\u0000\u0000\u0000\u0580\u057e\u0001\u0000"+ - "\u0000\u0000\u0581\u0582\u00067\u0014\u0000\u0582{\u0001\u0000\u0000\u0000"+ - "\u0583\u0584\u0005\u0000\u0000\u0001\u0584\u0585\u0001\u0000\u0000\u0000"+ - "\u0585\u0586\u00068\u0015\u0000\u0586\u0587\u00068\u000f\u0000\u0587}"+ - "\u0001\u0000\u0000\u0000\u0588\u0589\u0005!\u0000\u0000\u0589\u058a\u0005"+ - "!\u0000\u0000\u058a\u058b\u0005}\u0000\u0000\u058b\u058c\u0001\u0000\u0000"+ - "\u0000\u058c\u058d\u00069\u000f\u0000\u058d\u058e\u00069\b\u0000\u058e"+ - "\u007f\u0001\u0000\u0000\u0000\u058f\u0590\u0003\f\u0000\u0000\u0590\u0591"+ - "\u0006:\u0016\u0000\u0591\u0081\u0001\u0000\u0000\u0000\u0592\u0595\u0003"+ - "X&\u0000\u0593\u0595\u0003\u0012\u0003\u0000\u0594\u0592\u0001\u0000\u0000"+ - "\u0000\u0594\u0593\u0001\u0000\u0000\u0000\u0595\u0596\u0001\u0000\u0000"+ - "\u0000\u0596\u0597\u0006;\u0017\u0000\u0597\u0083\u0001\u0000\u0000\u0000"+ - "\u0598\u0599\u0005:\u0000\u0000\u0599\u059c\u0005)\u0000\u0000\u059a\u059c"+ - "\u0005:\u0000\u0000\u059b\u0598\u0001\u0000\u0000\u0000\u059b\u059a\u0001"+ - "\u0000\u0000\u0000\u059c\u059d\u0001\u0000\u0000\u0000\u059d\u059e\u0006"+ - "<\u0012\u0000\u059e\u0085\u0001\u0000\u0000\u0000\u059f\u05a1\b,\u0000"+ - "\u0000\u05a0\u059f\u0001\u0000\u0000\u0000\u05a1\u05a2\u0001\u0000\u0000"+ - "\u0000\u05a2\u05a0\u0001\u0000\u0000\u0000\u05a2\u05a3\u0001\u0000\u0000"+ - "\u0000\u05a3\u05a4\u0001\u0000\u0000\u0000\u05a4\u05a5\u0006=\u0018\u0000"+ - "\u05a5\u0087\u0001\u0000\u0000\u0000\u05a6\u05aa\t\u0000\u0000\u0000\u05a7"+ - "\u05a9\u0007*\u0000\u0000\u05a8\u05a7\u0001\u0000\u0000\u0000\u05a9\u05ac"+ - "\u0001\u0000\u0000\u0000\u05aa\u05a8\u0001\u0000\u0000\u0000\u05aa\u05ab"+ - "\u0001\u0000\u0000\u0000\u05ab\u05ad\u0001\u0000\u0000\u0000\u05ac\u05aa"+ - "\u0001\u0000\u0000\u0000\u05ad\u05ae\u0006>\u0019\u0000\u05ae\u0089\u0001"+ - "\u0000\u0000\u0000\u05af\u05b0\u0005\u0000\u0000\u0001\u05b0\u05b1\u0001"+ - "\u0000\u0000\u0000\u05b1\u05b2\u0006?\u0015\u0000\u05b2\u05b3\u0006?\u000f"+ - "\u0000\u05b3\u008b\u0001\u0000\u0000\u0000\u05b4\u05b6\u0007*\u0000\u0000"+ - "\u05b5\u05b4\u0001\u0000\u0000\u0000\u05b6\u05b7\u0001\u0000\u0000\u0000"+ - "\u05b7\u05b5\u0001\u0000\u0000\u0000\u05b7\u05b8\u0001\u0000\u0000\u0000"+ - "\u05b8\u05b9\u0001\u0000\u0000\u0000\u05b9\u05ba\u0004@\b\u0000\u05ba"+ - "\u05bb\u0001\u0000\u0000\u0000\u05bb\u05bc\u0006@\u001a\u0000\u05bc\u008d"+ - "\u0001\u0000\u0000\u0000\u05bd\u05be\u0005(\u0000\u0000\u05be\u05bf\u0006"+ - "A\u001b\u0000\u05bf\u05c0\u0001\u0000\u0000\u0000\u05c0\u05c1\u0006A\f"+ - "\u0000\u05c1\u05c2\u0006A\u001a\u0000\u05c2\u008f\u0001\u0000\u0000\u0000"+ - "\u05c3\u05c4\u0003N!\u0000\u05c4\u05c5\u0001\u0000\u0000\u0000\u05c5\u05c6"+ - "\u0006B\u0015\u0000\u05c6\u05c7\u0006B\u000f\u0000\u05c7\u0091\u0001\u0000"+ - "\u0000\u0000\u05c8\u05c9\t\u0000\u0000\u0000\u05c9\u05ca\u0001\u0000\u0000"+ - "\u0000\u05ca\u05cb\u0006C\u0015\u0000\u05cb\u05cc\u0006C\u000f\u0000\u05cc"+ - "\u0093\u0001\u0000\u0000\u0000\u05cd\u05ce\u0004D\t\u0000\u05ce\u05cf"+ - "\u0005(\u0000\u0000\u05cf\u05d0\u0006D\u001c\u0000\u05d0\u05d1\u0006D"+ - "\u001d\u0000\u05d1\u0095\u0001\u0000\u0000\u0000\u05d2\u05d3\u0004E\n"+ - "\u0000\u05d3\u05d4\u0005)\u0000\u0000\u05d4\u05d5\u0006E\u001e\u0000\u05d5"+ - "\u05d6\u0001\u0000\u0000\u0000\u05d6\u05d7\u0006E\u001f\u0000\u05d7\u05d8"+ - "\u0006E \u0000\u05d8\u0097\u0001\u0000\u0000\u0000\u05d9\u05da\u0004F"+ - "\u000b\u0000\u05da\u05db\u0005(\u0000\u0000\u05db\u05dc\u0006F!\u0000"+ - "\u05dc\u05dd\u0006F\"\u0000\u05dd\u0099\u0001\u0000\u0000\u0000\u05de"+ - "\u05df\u0004G\f\u0000\u05df\u05e0\u0005)\u0000\u0000\u05e0\u05e1\u0006"+ - "G#\u0000\u05e1\u05e2\u0006G$\u0000\u05e2\u009b\u0001\u0000\u0000\u0000"+ - "\u05e3\u05e4\u0005)\u0000\u0000\u05e4\u05e5\u0004H\r\u0000\u05e5\u05e6"+ - "\u0001\u0000\u0000\u0000\u05e6\u05e7\u0006H\u001f\u0000\u05e7\u05e8\u0006"+ - "H \u0000\u05e8\u009d\u0001\u0000\u0000\u0000\u05e9\u05ea\u0005\"\u0000"+ - "\u0000\u05ea\u05eb\u0001\u0000\u0000\u0000\u05eb\u05ec\u0006I\f\u0000"+ - "\u05ec\u05ed\u0006I%\u0000\u05ed\u009f\u0001\u0000\u0000\u0000\u05ee\u05ef"+ - "\u0005?\u0000\u0000\u05ef\u05f0\u0005:\u0000\u0000\u05f0\u05f1\u0001\u0000"+ - "\u0000\u0000\u05f1\u05f2\u0006J&\u0000\u05f2\u00a1\u0001\u0000\u0000\u0000"+ - "\u05f3\u05f4\u0005:\u0000\u0000\u05f4\u05f5\u0005:\u0000\u0000\u05f5\u05f6"+ - "\u0001\u0000\u0000\u0000\u05f6\u05f7\u0006K\'\u0000\u05f7\u00a3\u0001"+ - "\u0000\u0000\u0000\u05f8\u05fc\u0003X&\u0000\u05f9\u05fb\u0005 \u0000"+ - "\u0000\u05fa\u05f9\u0001\u0000\u0000\u0000\u05fb\u05fe\u0001\u0000\u0000"+ - "\u0000\u05fc\u05fa\u0001\u0000\u0000\u0000\u05fc\u05fd\u0001\u0000\u0000"+ - "\u0000\u05fd\u05ff\u0001\u0000\u0000\u0000\u05fe\u05fc\u0001\u0000\u0000"+ - "\u0000\u05ff\u0600\u0006L(\u0000\u0600\u00a5\u0001\u0000\u0000\u0000\u0601"+ - "\u0602\u0005:\u0000\u0000\u0602\u0603\u0004M\u000e\u0000\u0603\u0604\u0001"+ - "\u0000\u0000\u0000\u0604\u0605\u0006M\u0012\u0000\u0605\u00a7\u0001\u0000"+ - "\u0000\u0000\u0606\u0607\u0005:\u0000\u0000\u0607\u0608\u0001\u0000\u0000"+ - "\u0000\u0608\u0609\u0006N\u0012\u0000\u0609\u00a9\u0001\u0000\u0000\u0000"+ - "\u060a\u060b\u0005/\u0000\u0000\u060b\u060c\u0005*\u0000\u0000\u060c\u0610"+ - "\u0001\u0000\u0000\u0000\u060d\u060f\t\u0000\u0000\u0000\u060e\u060d\u0001"+ - "\u0000\u0000\u0000\u060f\u0612\u0001\u0000\u0000\u0000\u0610\u0611\u0001"+ - "\u0000\u0000\u0000\u0610\u060e\u0001\u0000\u0000\u0000\u0611\u0613\u0001"+ - "\u0000\u0000\u0000\u0612\u0610\u0001\u0000\u0000\u0000\u0613\u0614\u0005"+ - "*\u0000\u0000\u0614\u0615\u0005/\u0000\u0000\u0615\u0616\u0001\u0000\u0000"+ - "\u0000\u0616\u0617\u0006O\u0012\u0000\u0617\u00ab\u0001\u0000\u0000\u0000"+ - "\u0618\u0619\t\u0000\u0000\u0000\u0619\u061a\u0006P)\u0000\u061a\u00ad"+ - "\u0001\u0000\u0000\u0000\u061b\u061c\u0005\u0000\u0000\u0001\u061c\u061d"+ - "\u0001\u0000\u0000\u0000\u061d\u061e\u0006Q\u0015\u0000\u061e\u061f\u0006"+ - "Q \u0000\u061f\u00af\u0001\u0000\u0000\u0000\u0620\u0621\u0005@\u0000"+ - "\u0000\u0621\u0622\u0007\u0003\u0000\u0000\u0622\u0623\u0007\f\u0000\u0000"+ - "\u0623\u0624\u0007\u0011\u0000\u0000\u0624\u0625\u0007\r\u0000\u0000\u0625"+ - "\u0626\u0007\u0006\u0000\u0000\u0626\u0627\u0007\r\u0000\u0000\u0627\u0628"+ - "\u0001\u0000\u0000\u0000\u0628\u0629\u0006R\u000f\u0000\u0629\u00b1\u0001"+ - "\u0000\u0000\u0000\u062a\u062b\t\u0000\u0000\u0000\u062b\u062c\u0004S"+ - "\u000f\u0000\u062c\u062d\u0001\u0000\u0000\u0000\u062d\u062e\u0006S*\u0000"+ - "\u062e\u00b3\u0001\u0000\u0000\u0000\u062f\u0630\t\u0000\u0000\u0000\u0630"+ - "\u0631\u0001\u0000\u0000\u0000\u0631\u0632\u0006T\f\u0000\u0632\u00b5"+ - "\u0001\u0000\u0000\u0000\u0633\u0634\u0005\u0000\u0000\u0001\u0634\u0635"+ - "\u0001\u0000\u0000\u0000\u0635\u0636\u0006U\u0015\u0000\u0636\u0637\u0006"+ - "U\u000f\u0000\u0637\u00b7\u0001\u0000\u0000\u0000\u0638\u0639\u0005@\u0000"+ - "\u0000\u0639\u063a\u0007\u0003\u0000\u0000\u063a\u063b\u0007\f\u0000\u0000"+ - "\u063b\u063c\u0007\u0011\u0000\u0000\u063c\u063d\u0007\u001a\u0000\u0000"+ - "\u063d\u063e\u0007\u0003\u0000\u0000\u063e\u063f\u0007\u0002\u0000\u0000"+ - "\u063f\u0640\u0007\u0017\u0000\u0000\u0640\u0641\u0007\u0004\u0000\u0000"+ - "\u0641\u0642\u0007\u000b\u0000\u0000\u0642\u0643\u0007\u0007\u0000\u0000"+ - "\u0643\u0644\u0007\u0012\u0000\u0000\u0644\u0645\u0001\u0000\u0000\u0000"+ - "\u0645\u0646\u0006V\u0001\u0000\u0646\u0647\u0006V\u000f\u0000\u0647\u00b9"+ - "\u0001\u0000\u0000\u0000\u0648\u0649\t\u0000\u0000\u0000\u0649\u064a\u0004"+ - "W\u0010\u0000\u064a\u064b\u0001\u0000\u0000\u0000\u064b\u064c\u0006W\t"+ - "\u0000\u064c\u00bb\u0001\u0000\u0000\u0000\u064d\u064e\t\u0000\u0000\u0000"+ - "\u064e\u064f\u0001\u0000\u0000\u0000\u064f\u0650\u0006X\f\u0000\u0650"+ - "\u00bd\u0001\u0000\u0000\u0000\u0651\u0652\u0005\u0000\u0000\u0001\u0652"+ - "\u0653\u0001\u0000\u0000\u0000\u0653\u0654\u0006Y\u0015\u0000\u0654\u0655"+ - "\u0006Y\u000f\u0000\u0655\u00bf\u0001\u0000\u0000\u0000\u0656\u0657\u0005"+ - ":\u0000\u0000\u0657\u0658\u0003R#\u0000\u0658\u0659\u0005=\u0000\u0000"+ - "\u0659\u065a\u0005\"\u0000\u0000\u065a\u065b\u0001\u0000\u0000\u0000\u065b"+ - "\u065c\u0006Z\t\u0000\u065c\u065d\u0006Z+\u0000\u065d\u00c1\u0001\u0000"+ - "\u0000\u0000\u065e\u065f\u0005{\u0000\u0000\u065f\u0660\u0005{\u0000\u0000"+ - "\u0660\u0661\u0001\u0000\u0000\u0000\u0661\u0662\u0006[\u0005\u0000\u0662"+ - "\u0663\u0006[\u0006\u0000\u0663\u00c3\u0001\u0000\u0000\u0000\u0664\u0665"+ - "\u0005{\u0000\u0000\u0665\u0666\u0005!\u0000\u0000\u0666\u0667\u0005!"+ - "\u0000\u0000\u0667\u0668\u0001\u0000\u0000\u0000\u0668\u0669\u0006\\\u0007"+ - "\u0000\u0669\u066a\u0006\\\b\u0000\u066a\u00c5\u0001\u0000\u0000\u0000"+ - "\u066b\u066c\u0005>\u0000\u0000\u066c\u066d\u0001\u0000\u0000\u0000\u066d"+ - "\u066e\u0006]\t\u0000\u066e\u066f\u0006]\u000f\u0000\u066f\u00c7\u0001"+ - "\u0000\u0000\u0000\u0670\u0671\t\u0000\u0000\u0000\u0671\u0672\u0001\u0000"+ - "\u0000\u0000\u0672\u0673\u0006^\t\u0000\u0673\u00c9\u0001\u0000\u0000"+ - "\u0000\u0674\u0675\u0005\u0000\u0000\u0001\u0675\u0676\u0001\u0000\u0000"+ - "\u0000\u0676\u0677\u0006_\u0015\u0000\u0677\u0678\u0006_\u000f\u0000\u0678"+ - "\u00cb\u0001\u0000\u0000\u0000\u0679\u067a\u0005\"\u0000\u0000\u067a\u067b"+ - "\u0001\u0000\u0000\u0000\u067b\u067c\u0006`\t\u0000\u067c\u067d\u0006"+ - "`\u000f\u0000\u067d\u00cd\u0001\u0000\u0000\u0000\u067e\u067f\t\u0000"+ - "\u0000\u0000\u067f\u0680\u0004a\u0011\u0000\u0680\u0681\u0001\u0000\u0000"+ - "\u0000\u0681\u0682\u0006a\u001f\u0000\u0682\u00cf\u0001\u0000\u0000\u0000"+ - "\u0683\u0684\t\u0000\u0000\u0000\u0684\u0685\u0001\u0000\u0000\u0000\u0685"+ - "\u0686\u0006b\f\u0000\u0686\u00d1\u0001\u0000\u0000\u0000\u0687\u0688"+ - "\u0005\u0000\u0000\u0001\u0688\u0689\u0001\u0000\u0000\u0000\u0689\u068a"+ - "\u0006c\u0015\u0000\u068a\u068b\u0006c\u000f\u0000\u068b\u00d3\u0001\u0000"+ - "\u0000\u0000\u068c\u068e\u0003\f\u0000\u0000\u068d\u068f\u0005$\u0000"+ - "\u0000\u068e\u068d\u0001\u0000\u0000\u0000\u068e\u068f\u0001\u0000\u0000"+ - "\u0000\u068f\u0690\u0001\u0000\u0000\u0000\u0690\u0691\u0003R#\u0000\u0691"+ - "\u0692\u0005}\u0000\u0000\u0692\u0693\u0001\u0000\u0000\u0000\u0693\u0694"+ - "\u0006d\f\u0000\u0694\u00d5\u0001\u0000\u0000\u0000\u0695\u0696\u0003"+ - "\f\u0000\u0000\u0696\u0697\u0001\u0000\u0000\u0000\u0697\u0698\u0006e"+ - "\f\u0000\u0698\u00d7\u0001\u0000\u0000\u0000\u0699\u069b\u0005{\u0000"+ - "\u0000\u069a\u069c\u0007)\u0000\u0000\u069b\u069a\u0001\u0000\u0000\u0000"+ - "\u069b\u069c\u0001\u0000\u0000\u0000\u069c\u069d\u0001\u0000\u0000\u0000"+ - "\u069d\u069f\u0003R#\u0000\u069e\u06a0\u0007)\u0000\u0000\u069f\u069e"+ - "\u0001\u0000\u0000\u0000\u069f\u06a0\u0001\u0000\u0000\u0000\u06a0\u06a2"+ - "\u0001\u0000\u0000\u0000\u06a1\u06a3\u0005:\u0000\u0000\u06a2\u06a1\u0001"+ - "\u0000\u0000\u0000\u06a3\u06a4\u0001\u0000\u0000\u0000\u06a4\u06a2\u0001"+ - "\u0000\u0000\u0000\u06a4\u06a5\u0001\u0000\u0000\u0000\u06a5\u06a7\u0001"+ - "\u0000\u0000\u0000\u06a6\u06a8\u0007)\u0000\u0000\u06a7\u06a6\u0001\u0000"+ - "\u0000\u0000\u06a7\u06a8\u0001\u0000\u0000\u0000\u06a8\u06aa\u0001\u0000"+ - "\u0000\u0000\u06a9\u06ab\u0003R#\u0000\u06aa\u06a9\u0001\u0000\u0000\u0000"+ - "\u06aa\u06ab\u0001\u0000\u0000\u0000\u06ab\u06ad\u0001\u0000\u0000\u0000"+ - "\u06ac\u06ae\u0007)\u0000\u0000\u06ad\u06ac\u0001\u0000\u0000\u0000\u06ad"+ - "\u06ae\u0001\u0000\u0000\u0000\u06ae\u06c5\u0001\u0000\u0000\u0000\u06af"+ - "\u06b1\u0005,\u0000\u0000\u06b0\u06b2\u0007)\u0000\u0000\u06b1\u06b0\u0001"+ - "\u0000\u0000\u0000\u06b1\u06b2\u0001\u0000\u0000\u0000\u06b2\u06b3\u0001"+ - "\u0000\u0000\u0000\u06b3\u06b5\u0003R#\u0000\u06b4\u06b6\u0007)\u0000"+ - "\u0000\u06b5\u06b4\u0001\u0000\u0000\u0000\u06b5\u06b6\u0001\u0000\u0000"+ - "\u0000\u06b6\u06b8\u0001\u0000\u0000\u0000\u06b7\u06b9\u0005:\u0000\u0000"+ - "\u06b8\u06b7\u0001\u0000\u0000\u0000\u06b9\u06ba\u0001\u0000\u0000\u0000"+ - "\u06ba\u06b8\u0001\u0000\u0000\u0000\u06ba\u06bb\u0001\u0000\u0000\u0000"+ - "\u06bb\u06bd\u0001\u0000\u0000\u0000\u06bc\u06be\u0007)\u0000\u0000\u06bd"+ - "\u06bc\u0001\u0000\u0000\u0000\u06bd\u06be\u0001\u0000\u0000\u0000\u06be"+ - "\u06bf\u0001\u0000\u0000\u0000\u06bf\u06c1\u0003R#\u0000\u06c0\u06c2\u0007"+ - ")\u0000\u0000\u06c1\u06c0\u0001\u0000\u0000\u0000\u06c1\u06c2\u0001\u0000"+ - "\u0000\u0000\u06c2\u06c4\u0001\u0000\u0000\u0000\u06c3\u06af\u0001\u0000"+ - "\u0000\u0000\u06c4\u06c7\u0001\u0000\u0000\u0000\u06c5\u06c3\u0001\u0000"+ - "\u0000\u0000\u06c5\u06c6\u0001\u0000\u0000\u0000\u06c6\u06c9\u0001\u0000"+ - "\u0000\u0000\u06c7\u06c5\u0001\u0000\u0000\u0000\u06c8\u06ca\u0005,\u0000"+ - "\u0000\u06c9\u06c8\u0001\u0000\u0000\u0000\u06c9\u06ca\u0001\u0000\u0000"+ - "\u0000\u06ca\u06cb\u0001\u0000\u0000\u0000\u06cb\u06cc\u0005}\u0000\u0000"+ - "\u06cc\u06cd\u0001\u0000\u0000\u0000\u06cd\u06ce\u0006f\f\u0000\u06ce"+ - "\u00d9\u0001\u0000\u0000\u0000\u06cf\u06d0\u0005{\u0000\u0000\u06d0\u06d1"+ - "\u0005$\u0000\u0000\u06d1\u06da\u0003R#\u0000\u06d2\u06d3\u0005[\u0000"+ - "\u0000\u06d3\u06d4\u0007)\u0000\u0000\u06d4\u06d5\u0003R#\u0000\u06d5"+ - "\u06d6\u0007)\u0000\u0000\u06d6\u06d7\u0005]\u0000\u0000\u06d7\u06d9\u0001"+ - "\u0000\u0000\u0000\u06d8\u06d2\u0001\u0000\u0000\u0000\u06d9\u06dc\u0001"+ - "\u0000\u0000\u0000\u06da\u06d8\u0001\u0000\u0000\u0000\u06da\u06db\u0001"+ - "\u0000\u0000\u0000\u06db\u06dd\u0001\u0000\u0000\u0000\u06dc\u06da\u0001"+ - "\u0000\u0000\u0000\u06dd\u06de\u0005:\u0000\u0000\u06de\u06df\u0005:\u0000"+ - "\u0000\u06df\u06e0\u0001\u0000\u0000\u0000\u06e0\u06e1\u0003R#\u0000\u06e1"+ - "\u06e2\u0005}\u0000\u0000\u06e2\u06e3\u0001\u0000\u0000\u0000\u06e3\u06e4"+ - "\u0006g\f\u0000\u06e4\u00db\u0001\u0000\u0000\u0000\u06e5\u06e6\u0005"+ - "{\u0000\u0000\u06e6\u06e7\u0005$\u0000\u0000\u06e7\u06f1\u0003R#\u0000"+ - "\u06e8\u06e9\u0005[\u0000\u0000\u06e9\u06eb\u0007)\u0000\u0000\u06ea\u06ec"+ - "\u0003R#\u0000\u06eb\u06ea\u0001\u0000\u0000\u0000\u06eb\u06ec\u0001\u0000"+ - "\u0000\u0000\u06ec\u06ed\u0001\u0000\u0000\u0000\u06ed\u06ee\u0007)\u0000"+ - "\u0000\u06ee\u06f0\u0005]\u0000\u0000\u06ef\u06e8\u0001\u0000\u0000\u0000"+ - "\u06f0\u06f3\u0001\u0000\u0000\u0000\u06f1\u06ef\u0001\u0000\u0000\u0000"+ - "\u06f1\u06f2\u0001\u0000\u0000\u0000\u06f2\u06fb\u0001\u0000\u0000\u0000"+ - "\u06f3\u06f1\u0001\u0000\u0000\u0000\u06f4\u06f5\u0005:\u0000\u0000\u06f5"+ - "\u06f7\u0005:\u0000\u0000\u06f6\u06f4\u0001\u0000\u0000\u0000\u06f7\u06f8"+ - "\u0001\u0000\u0000\u0000\u06f8\u06f6\u0001\u0000\u0000\u0000\u06f8\u06f9"+ - "\u0001\u0000\u0000\u0000\u06f9\u06fa\u0001\u0000\u0000\u0000\u06fa\u06fc"+ - "\u0003R#\u0000\u06fb\u06f6\u0001\u0000\u0000\u0000\u06fb\u06fc\u0001\u0000"+ - "\u0000\u0000\u06fc\u0701\u0001\u0000\u0000\u0000\u06fd\u06ff\u0005:\u0000"+ - "\u0000\u06fe\u0700\u0003R#\u0000\u06ff\u06fe\u0001\u0000\u0000\u0000\u06ff"+ - "\u0700\u0001\u0000\u0000\u0000\u0700\u0702\u0001\u0000\u0000\u0000\u0701"+ - "\u06fd\u0001\u0000\u0000\u0000\u0702\u0703\u0001\u0000\u0000\u0000\u0703"+ - "\u0701\u0001\u0000\u0000\u0000\u0703\u0704\u0001\u0000\u0000\u0000\u0704"+ - "\u0705\u0001\u0000\u0000\u0000\u0705\u0706\u0005}\u0000\u0000\u0706\u070a"+ - "\u0001\u0000\u0000\u0000\u0707\u0708\u0005:\u0000\u0000\u0708\u070a\u0005"+ - "$\u0000\u0000\u0709\u06e5\u0001\u0000\u0000\u0000\u0709\u0707\u0001\u0000"+ - "\u0000\u0000\u070a\u070b\u0001\u0000\u0000\u0000\u070b\u070c\u0006h\u0015"+ - "\u0000\u070c\u00dd\u0001\u0000\u0000\u0000\u070d\u070e\u0005\\\u0000\u0000"+ - "\u070e\u070f\u0005\"\u0000\u0000\u070f\u0710\u0001\u0000\u0000\u0000\u0710"+ - "\u0711\u0006i\f\u0000\u0711\u00df\u0001\u0000\u0000\u0000\u0712\u0713"+ - "\u0005\"\u0000\u0000\u0713\u0714\u0001\u0000\u0000\u0000\u0714\u0715\u0006"+ - "j\f\u0000\u0715\u0716\u0006j\u000f\u0000\u0716\u00e1\u0001\u0000\u0000"+ - "\u0000\u0717\u0718\t\u0000\u0000\u0000\u0718\u0719\u0001\u0000\u0000\u0000"+ - "\u0719\u071a\u0006k\f\u0000\u071a\u00e3\u0001\u0000\u0000\u0000\u071b"+ - "\u071c\u0005\u0000\u0000\u0001\u071c\u071d\u0001\u0000\u0000\u0000\u071d"+ - "\u071e\u0006l\u0015\u0000\u071e\u071f\u0006l\u000f\u0000\u071f\u00e5\u0001"+ - "\u0000\u0000\u0000\u0720\u0721\u0005-\u0000\u0000\u0721\u0722\u0005-\u0000"+ - "\u0000\u0722\u0723\u0005}\u0000\u0000\u0723\u0724\u0005}\u0000\u0000\u0724"+ - "\u0725\u0001\u0000\u0000\u0000\u0725\u0726\u0006m\u000f\u0000\u0726\u00e7"+ - "\u0001\u0000\u0000\u0000\u0727\u0728\t\u0000\u0000\u0000\u0728\u0729\u0004"+ - "n\u0012\u0000\u0729\u072a\u0001\u0000\u0000\u0000\u072a\u072b\u0006n,"+ - "\u0000\u072b\u00e9\u0001\u0000\u0000\u0000\u072c\u072d\t\u0000\u0000\u0000"+ - "\u072d\u072e\u0001\u0000\u0000\u0000\u072e\u072f\u0006o\f\u0000\u072f"+ - "\u00eb\u0001\u0000\u0000\u0000\u0730\u0731\u0005\u0000\u0000\u0001\u0731"+ - "\u0732\u0001\u0000\u0000\u0000\u0732\u0733\u0006p,\u0000\u0733\u0734\u0006"+ - "p\u000f\u0000\u0734\u00ed\u0001\u0000\u0000\u0000u\u0000\u0001\u0002\u0003"+ + "\u0492\u0550\u0007\u000b\u0000\u0000\u0493\u0494\u0005@\u0000\u0000\u0494"+ + "\u0495\u0007\u0007\u0000\u0000\u0495\u0496\u0007\u0012\u0000\u0000\u0496"+ + "\u0497\u0007\r\u0000\u0000\u0497\u0498\u0007\u0001\u0000\u0000\u0498\u0499"+ + "\u0007\u0002\u0000\u0000\u0499\u0550\u0007\u000b\u0000\u0000\u049a\u049b"+ + "\u0005@\u0000\u0000\u049b\u049c\u0007\f\u0000\u0000\u049c\u049d\u0007"+ + "\u0004\u0000\u0000\u049d\u049e\u0007\u0012\u0000\u0000\u049e\u049f\u0007"+ + "\u0003\u0000\u0000\u049f\u04a0\u0007\n\u0000\u0000\u04a0\u04a1\u0007\r"+ + "\u0000\u0000\u04a1\u04a2\u0007\u0004\u0000\u0000\u04a2\u04a3\u0007\u0005"+ + "\u0000\u0000\u04a3\u0550\u0007\u0003\u0000\u0000\u04a4\u04a5\u0005@\u0000"+ + "\u0000\u04a5\u04a6\u0007\u0011\u0000\u0000\u04a6\u04a7\u0007\u0001\u0000"+ + "\u0000\u04a7\u04a8\u0007\u0005\u0000\u0000\u04a8\u04a9\u0007\u000e\u0000"+ + "\u0000\u04a9\u04aa\u0007\u0012\u0000\u0000\u04aa\u04ab\u0007\u0003\u0000"+ + "\u0000\u04ab\u04ac\u0007\f\u0000\u0000\u04ac\u0550\u0007\u000b\u0000\u0000"+ + "\u04ad\u04ae\u0005@\u0000\u0000\u04ae\u04af\u0007\u0000\u0000\u0000\u04af"+ + "\u04b0\u0007\u0001\u0000\u0000\u04b0\u04b1\u0007\f\u0000\u0000\u04b1\u04b2"+ + "\u0007\u000b\u0000\u0000\u04b2\u04b3\u0005-\u0000\u0000\u04b3\u04b4\u0007"+ + "\u0000\u0000\u0000\u04b4\u04b5\u0007\u0004\u0000\u0000\u04b5\u04b6\u0007"+ + "\u0005\u0000\u0000\u04b6\u0550\u0007\u0003\u0000\u0000\u04b7\u04b8\u0005"+ + "@\u0000\u0000\u04b8\u04b9\u0007\r\u0000\u0000\u04b9\u04ba\u0007\u0004"+ + "\u0000\u0000\u04ba\u04bb\u0007\u0010\u0000\u0000\u04bb\u0550\u0007\u0003"+ + "\u0000\u0000\u04bc\u04bd\u0005@\u0000\u0000\u04bd\u04be\u0007\t\u0000"+ + "\u0000\u04be\u04bf\u0007\u0004\u0000\u0000\u04bf\u04c0\u0007\u000f\u0000"+ + "\u0000\u04c0\u04c1\u0007\u0003\u0000\u0000\u04c1\u0550\u0007\u0002\u0000"+ + "\u0000\u04c2\u04c3\u0005@\u0000\u0000\u04c3\u04c4\u0007\n\u0000\u0000"+ + "\u04c4\u04c5\u0007\u000e\u0000\u0000\u04c5\u04c6\u0007\r\u0000\u0000\u04c6"+ + "\u04c7\u0007\r\u0000\u0000\u04c7\u04c8\u0007\u0001\u0000\u0000\u04c8\u04c9"+ + "\u0007\u0002\u0000\u0000\u04c9\u04ca\u0007\u000b\u0000\u0000\u04ca\u0550"+ + "\u0007\n\u0000\u0000\u04cb\u04cc\u0005@\u0000\u0000\u04cc\u04cd\u0007"+ + "\u000b\u0000\u0000\u04cd\u04ce\u0007\u0004\u0000\u0000\u04ce\u04cf\u0007"+ + "\u0007\u0000\u0000\u04cf\u04d0\u0007\t\u0000\u0000\u04d0\u04d1\u0007\b"+ + "\u0000\u0000\u04d1\u04d2\u0007\u0007\u0000\u0000\u04d2\u04d3\u0007\f\u0000"+ + "\u0000\u04d3\u0550\u0007\u0011\u0000\u0000\u04d4\u04d5\u0005@\u0000\u0000"+ + "\u04d5\u04d6\u0007\u0004\u0000\u0000\u04d6\u04d7\u0007\r\u0000\u0000\u04d7"+ + "\u04d8\u0007\r\u0000\u0000\u04d8\u04d9\u0007\t\u0000\u0000\u04d9\u0550"+ + "\u0007\u000f\u0000\u0000\u04da\u04db\u0005@\u0000\u0000\u04db\u04dc\u0005"+ + "-\u0000\u0000\u04dc\u04dd\u0007\b\u0000\u0000\u04dd\u04de\u0007\u0003"+ + "\u0000\u0000\u04de\u04df\u0007\u0017\u0000\u0000\u04df\u04e0\u0007\u0018"+ + "\u0000\u0000\u04e0\u04e1\u0007\u0007\u0000\u0000\u04e1\u04e2\u0007\u000b"+ + "\u0000\u0000\u04e2\u04e3\u0005-\u0000\u0000\u04e3\u04e4\u0007\u0018\u0000"+ + "\u0000\u04e4\u04e5\u0007\u0003\u0000\u0000\u04e5\u04e6\u0007\u000f\u0000"+ + "\u0000\u04e6\u04e7\u0007\u0000\u0000\u0000\u04e7\u04e8\u0007\u0002\u0000"+ + "\u0000\u04e8\u04e9\u0007\u0004\u0000\u0000\u04e9\u04ea\u0007\u0012\u0000"+ + "\u0000\u04ea\u04eb\u0007\u0003\u0000\u0000\u04eb\u0550\u0007\n\u0000\u0000"+ + "\u04ec\u04ed\u0005@\u0000\u0000\u04ed\u04ee\u0007\u0018\u0000\u0000\u04ee"+ + "\u04ef\u0007\u0003\u0000\u0000\u04ef\u04f0\u0007\u000f\u0000\u0000\u04f0"+ + "\u04f1\u0007\u0000\u0000\u0000\u04f1\u04f2\u0007\u0002\u0000\u0000\u04f2"+ + "\u04f3\u0007\u0004\u0000\u0000\u04f3\u04f4\u0007\u0012\u0000\u0000\u04f4"+ + "\u04f5\u0007\u0003\u0000\u0000\u04f5\u0550\u0007\n\u0000\u0000\u04f6\u04f7"+ + "\u0005@\u0000\u0000\u04f7\u04f8\u0007\u0005\u0000\u0000\u04f8\u04f9\u0007"+ + "\u0001\u0000\u0000\u04f9\u04fa\u0007\u000e\u0000\u0000\u04fa\u04fb\u0007"+ + "\f\u0000\u0000\u04fb\u04fc\u0007\u000b\u0000\u0000\u04fc\u04fd\u0007\u0003"+ + "\u0000\u0000\u04fd\u04fe\u0007\u0002\u0000\u0000\u04fe\u04ff\u0005-\u0000"+ + "\u0000\u04ff\u0500\u0007\n\u0000\u0000\u0500\u0501\u0007\u000b\u0000\u0000"+ + "\u0501\u0502\u0007\u000f\u0000\u0000\u0502\u0503\u0007\t\u0000\u0000\u0503"+ + "\u0550\u0007\u0003\u0000\u0000\u0504\u0505\u0005@\u0000\u0000\u0505\u0506"+ + "\u0007\u0000\u0000\u0000\u0506\u0507\u0007\u0001\u0000\u0000\u0507\u0508"+ + "\u0007\f\u0000\u0000\u0508\u0509\u0007\u000b\u0000\u0000\u0509\u050a\u0005"+ + "-\u0000\u0000\u050a\u050b\u0007\u0000\u0000\u0000\u050b\u050c\u0007\u0003"+ + "\u0000\u0000\u050c\u050d\u0007\u0004\u0000\u0000\u050d\u050e\u0007\u000b"+ + "\u0000\u0000\u050e\u050f\u0007\u000e\u0000\u0000\u050f\u0510\u0007\u0002"+ + "\u0000\u0000\u0510\u0511\u0007\u0003\u0000\u0000\u0511\u0512\u0005-\u0000"+ + "\u0000\u0512\u0513\u0007\u001a\u0000\u0000\u0513\u0514\u0007\u0004\u0000"+ + "\u0000\u0514\u0515\u0007\t\u0000\u0000\u0515\u0516\u0007\u000e\u0000\u0000"+ + "\u0516\u0517\u0007\u0003\u0000\u0000\u0517\u0550\u0007\n\u0000\u0000\u0518"+ + "\u0519\u0005@\u0000\u0000\u0519\u051a\u0007\r\u0000\u0000\u051a\u051b"+ + "\u0007\u0002\u0000\u0000\u051b\u051c\u0007\u0001\u0000\u0000\u051c\u051d"+ + "\u0007\r\u0000\u0000\u051d\u051e\u0007\u0003\u0000\u0000\u051e\u051f\u0007"+ + "\u0002\u0000\u0000\u051f\u0520\u0007\u000b\u0000\u0000\u0520\u0550\u0007"+ + "\u000f\u0000\u0000\u0521\u0522\u0005@\u0000\u0000\u0522\u0523\u0007\n"+ + "\u0000\u0000\u0523\u0524\u0007\u0005\u0000\u0000\u0524\u0525\u0007\u0001"+ + "\u0000\u0000\u0525\u0526\u0007\r\u0000\u0000\u0526\u0550\u0007\u0003\u0000"+ + "\u0000\u0527\u0528\u0005@\u0000\u0000\u0528\u0529\u0007\n\u0000\u0000"+ + "\u0529\u052a\u0007\u000b\u0000\u0000\u052a\u052b\u0007\u0004\u0000\u0000"+ + "\u052b\u052c\u0007\u0002\u0000\u0000\u052c\u052d\u0007\u000b\u0000\u0000"+ + "\u052d\u052e\u0007\u0007\u0000\u0000\u052e\u052f\u0007\f\u0000\u0000\u052f"+ + "\u0530\u0007\u0010\u0000\u0000\u0530\u0531\u0005-\u0000\u0000\u0531\u0532"+ + "\u0007\n\u0000\u0000\u0532\u0533\u0007\u000b\u0000\u0000\u0533\u0534\u0007"+ + "\u000f\u0000\u0000\u0534\u0535\u0007\t\u0000\u0000\u0535\u0550\u0007\u0003"+ + "\u0000\u0000\u0536\u0537\u0005@\u0000\u0000\u0537\u0538\u0007\n\u0000"+ + "\u0000\u0538\u0539\u0007\u000e\u0000\u0000\u0539\u053a\u0007\r\u0000\u0000"+ + "\u053a\u053b\u0007\r\u0000\u0000\u053b\u053c\u0007\u0001\u0000\u0000\u053c"+ + "\u053d\u0007\u0002\u0000\u0000\u053d\u053e\u0007\u000b\u0000\u0000\u053e"+ + "\u0550\u0007\n\u0000\u0000\u053f\u0540\u0005@\u0000\u0000\u0540\u0541"+ + "\u0007\u001a\u0000\u0000\u0541\u0542\u0007\u0007\u0000\u0000\u0542\u0543"+ + "\u0007\u0003\u0000\u0000\u0543\u0544\u0007\b\u0000\u0000\u0544\u0545\u0005"+ + "-\u0000\u0000\u0545\u0546\u0007\u000b\u0000\u0000\u0546\u0547\u0007\u0002"+ + "\u0000\u0000\u0547\u0548\u0007\u0004\u0000\u0000\u0548\u0549\u0007\f\u0000"+ + "\u0000\u0549\u054a\u0007\n\u0000\u0000\u054a\u054b\u0007\u0007\u0000\u0000"+ + "\u054b\u054c\u0007\u000b\u0000\u0000\u054c\u054d\u0007\u0007\u0000\u0000"+ + "\u054d\u054e\u0007\u0001\u0000\u0000\u054e\u0550\u0007\f\u0000\u0000\u054f"+ + "\u048b\u0001\u0000\u0000\u0000\u054f\u0493\u0001\u0000\u0000\u0000\u054f"+ + "\u049a\u0001\u0000\u0000\u0000\u054f\u04a4\u0001\u0000\u0000\u0000\u054f"+ + "\u04ad\u0001\u0000\u0000\u0000\u054f\u04b7\u0001\u0000\u0000\u0000\u054f"+ + "\u04bc\u0001\u0000\u0000\u0000\u054f\u04c2\u0001\u0000\u0000\u0000\u054f"+ + "\u04cb\u0001\u0000\u0000\u0000\u054f\u04d4\u0001\u0000\u0000\u0000\u054f"+ + "\u04da\u0001\u0000\u0000\u0000\u054f\u04ec\u0001\u0000\u0000\u0000\u054f"+ + "\u04f6\u0001\u0000\u0000\u0000\u054f\u0504\u0001\u0000\u0000\u0000\u054f"+ + "\u0518\u0001\u0000\u0000\u0000\u054f\u0521\u0001\u0000\u0000\u0000\u054f"+ + "\u0527\u0001\u0000\u0000\u0000\u054f\u0536\u0001\u0000\u0000\u0000\u054f"+ + "\u053f\u0001\u0000\u0000\u0000\u0550\u0554\u0001\u0000\u0000\u0000\u0551"+ + "\u0553\u0007*\u0000\u0000\u0552\u0551\u0001\u0000\u0000\u0000\u0553\u0556"+ + "\u0001\u0000\u0000\u0000\u0554\u0552\u0001\u0000\u0000\u0000\u0554\u0555"+ + "\u0001\u0000\u0000\u0000\u0555\u0558\u0001\u0000\u0000\u0000\u0556\u0554"+ + "\u0001\u0000\u0000\u0000\u0557\u046c\u0001\u0000\u0000\u0000\u0557\u046f"+ + "\u0001\u0000\u0000\u0000\u0557\u0475\u0001\u0000\u0000\u0000\u0557\u047b"+ + "\u0001\u0000\u0000\u0000\u0557\u054f\u0001\u0000\u0000\u0000\u0558\u0559"+ + "\u0001\u0000\u0000\u0000\u0559\u055a\u0006.\t\u0000\u055ai\u0001\u0000"+ + "\u0000\u0000\u055b\u055c\t\u0000\u0000\u0000\u055c\u055d\u0004/\u0007"+ + "\u0000\u055d\u055e\u0001\u0000\u0000\u0000\u055e\u055f\u0006/\u000e\u0000"+ + "\u055f\u0560\u0006/\u000f\u0000\u0560k\u0001\u0000\u0000\u0000\u0561\u0562"+ + "\t\u0000\u0000\u0000\u0562\u0563\u0001\u0000\u0000\u0000\u0563\u0564\u0006"+ + "0\f\u0000\u0564m\u0001\u0000\u0000\u0000\u0565\u0566\u0005\u0000\u0000"+ + "\u0001\u0566\u0567\u0001\u0000\u0000\u0000\u0567\u0568\u00061\u000e\u0000"+ + "\u0568\u0569\u00061\u000f\u0000\u0569o\u0001\u0000\u0000\u0000\u056a\u056b"+ + "\u0005}\u0000\u0000\u056b\u056c\u0005}\u0000\u0000\u056c\u056d\u0001\u0000"+ + "\u0000\u0000\u056d\u056e\u00062\u000f\u0000\u056e\u056f\u00062\u0006\u0000"+ + "\u056fq\u0001\u0000\u0000\u0000\u0570\u0571\u0003\f\u0000\u0000\u0571"+ + "\u0572\u00063\u0010\u0000\u0572s\u0001\u0000\u0000\u0000\u0573\u0576\u0003"+ + "X&\u0000\u0574\u0576\u0003\u0012\u0003\u0000\u0575\u0573\u0001\u0000\u0000"+ + "\u0000\u0575\u0574\u0001\u0000\u0000\u0000\u0576\u0577\u0001\u0000\u0000"+ + "\u0000\u0577\u0578\u00064\u0011\u0000\u0578u\u0001\u0000\u0000\u0000\u0579"+ + "\u057a\u0005:\u0000\u0000\u057a\u057d\u0005)\u0000\u0000\u057b\u057d\u0005"+ + ":\u0000\u0000\u057c\u0579\u0001\u0000\u0000\u0000\u057c\u057b\u0001\u0000"+ + "\u0000\u0000\u057d\u057e\u0001\u0000\u0000\u0000\u057e\u057f\u00065\u0012"+ + "\u0000\u057fw\u0001\u0000\u0000\u0000\u0580\u0582\b+\u0000\u0000\u0581"+ + "\u0580\u0001\u0000\u0000\u0000\u0582\u0583\u0001\u0000\u0000\u0000\u0583"+ + "\u0581\u0001\u0000\u0000\u0000\u0583\u0584\u0001\u0000\u0000\u0000\u0584"+ + "\u0585\u0001\u0000\u0000\u0000\u0585\u0586\u00066\u0013\u0000\u0586y\u0001"+ + "\u0000\u0000\u0000\u0587\u058b\t\u0000\u0000\u0000\u0588\u058a\u0007*"+ + "\u0000\u0000\u0589\u0588\u0001\u0000\u0000\u0000\u058a\u058d\u0001\u0000"+ + "\u0000\u0000\u058b\u0589\u0001\u0000\u0000\u0000\u058b\u058c\u0001\u0000"+ + "\u0000\u0000\u058c\u058e\u0001\u0000\u0000\u0000\u058d\u058b\u0001\u0000"+ + "\u0000\u0000\u058e\u058f\u00067\u0014\u0000\u058f{\u0001\u0000\u0000\u0000"+ + "\u0590\u0591\u0005\u0000\u0000\u0001\u0591\u0592\u0001\u0000\u0000\u0000"+ + "\u0592\u0593\u00068\u0015\u0000\u0593\u0594\u00068\u000f\u0000\u0594}"+ + "\u0001\u0000\u0000\u0000\u0595\u0596\u0005!\u0000\u0000\u0596\u0597\u0005"+ + "!\u0000\u0000\u0597\u0598\u0005}\u0000\u0000\u0598\u0599\u0001\u0000\u0000"+ + "\u0000\u0599\u059a\u00069\u000f\u0000\u059a\u059b\u00069\b\u0000\u059b"+ + "\u007f\u0001\u0000\u0000\u0000\u059c\u059d\u0003\f\u0000\u0000\u059d\u059e"+ + "\u0006:\u0016\u0000\u059e\u0081\u0001\u0000\u0000\u0000\u059f\u05a2\u0003"+ + "X&\u0000\u05a0\u05a2\u0003\u0012\u0003\u0000\u05a1\u059f\u0001\u0000\u0000"+ + "\u0000\u05a1\u05a0\u0001\u0000\u0000\u0000\u05a2\u05a3\u0001\u0000\u0000"+ + "\u0000\u05a3\u05a4\u0006;\u0017\u0000\u05a4\u0083\u0001\u0000\u0000\u0000"+ + "\u05a5\u05a6\u0005:\u0000\u0000\u05a6\u05a9\u0005)\u0000\u0000\u05a7\u05a9"+ + "\u0005:\u0000\u0000\u05a8\u05a5\u0001\u0000\u0000\u0000\u05a8\u05a7\u0001"+ + "\u0000\u0000\u0000\u05a9\u05aa\u0001\u0000\u0000\u0000\u05aa\u05ab\u0006"+ + "<\u0012\u0000\u05ab\u0085\u0001\u0000\u0000\u0000\u05ac\u05ae\b,\u0000"+ + "\u0000\u05ad\u05ac\u0001\u0000\u0000\u0000\u05ae\u05af\u0001\u0000\u0000"+ + "\u0000\u05af\u05ad\u0001\u0000\u0000\u0000\u05af\u05b0\u0001\u0000\u0000"+ + "\u0000\u05b0\u05b1\u0001\u0000\u0000\u0000\u05b1\u05b2\u0006=\u0018\u0000"+ + "\u05b2\u0087\u0001\u0000\u0000\u0000\u05b3\u05b7\t\u0000\u0000\u0000\u05b4"+ + "\u05b6\u0007*\u0000\u0000\u05b5\u05b4\u0001\u0000\u0000\u0000\u05b6\u05b9"+ + "\u0001\u0000\u0000\u0000\u05b7\u05b5\u0001\u0000\u0000\u0000\u05b7\u05b8"+ + "\u0001\u0000\u0000\u0000\u05b8\u05ba\u0001\u0000\u0000\u0000\u05b9\u05b7"+ + "\u0001\u0000\u0000\u0000\u05ba\u05bb\u0006>\u0019\u0000\u05bb\u0089\u0001"+ + "\u0000\u0000\u0000\u05bc\u05bd\u0005\u0000\u0000\u0001\u05bd\u05be\u0001"+ + "\u0000\u0000\u0000\u05be\u05bf\u0006?\u0015\u0000\u05bf\u05c0\u0006?\u000f"+ + "\u0000\u05c0\u008b\u0001\u0000\u0000\u0000\u05c1\u05c3\u0007*\u0000\u0000"+ + "\u05c2\u05c1\u0001\u0000\u0000\u0000\u05c3\u05c4\u0001\u0000\u0000\u0000"+ + "\u05c4\u05c2\u0001\u0000\u0000\u0000\u05c4\u05c5\u0001\u0000\u0000\u0000"+ + "\u05c5\u05c6\u0001\u0000\u0000\u0000\u05c6\u05c7\u0004@\b\u0000\u05c7"+ + "\u05c8\u0001\u0000\u0000\u0000\u05c8\u05c9\u0006@\u001a\u0000\u05c9\u008d"+ + "\u0001\u0000\u0000\u0000\u05ca\u05cb\u0005(\u0000\u0000\u05cb\u05cc\u0006"+ + "A\u001b\u0000\u05cc\u05cd\u0001\u0000\u0000\u0000\u05cd\u05ce\u0006A\f"+ + "\u0000\u05ce\u05cf\u0006A\u001a\u0000\u05cf\u008f\u0001\u0000\u0000\u0000"+ + "\u05d0\u05d1\u0003N!\u0000\u05d1\u05d2\u0001\u0000\u0000\u0000\u05d2\u05d3"+ + "\u0006B\u0015\u0000\u05d3\u05d4\u0006B\u000f\u0000\u05d4\u0091\u0001\u0000"+ + "\u0000\u0000\u05d5\u05d6\t\u0000\u0000\u0000\u05d6\u05d7\u0001\u0000\u0000"+ + "\u0000\u05d7\u05d8\u0006C\u0015\u0000\u05d8\u05d9\u0006C\u000f\u0000\u05d9"+ + "\u0093\u0001\u0000\u0000\u0000\u05da\u05db\u0004D\t\u0000\u05db\u05dc"+ + "\u0005(\u0000\u0000\u05dc\u05dd\u0006D\u001c\u0000\u05dd\u05de\u0006D"+ + "\u001d\u0000\u05de\u0095\u0001\u0000\u0000\u0000\u05df\u05e0\u0004E\n"+ + "\u0000\u05e0\u05e1\u0005)\u0000\u0000\u05e1\u05e2\u0006E\u001e\u0000\u05e2"+ + "\u05e3\u0001\u0000\u0000\u0000\u05e3\u05e4\u0006E\u001f\u0000\u05e4\u05e5"+ + "\u0006E \u0000\u05e5\u0097\u0001\u0000\u0000\u0000\u05e6\u05e7\u0004F"+ + "\u000b\u0000\u05e7\u05e8\u0005(\u0000\u0000\u05e8\u05e9\u0006F!\u0000"+ + "\u05e9\u05ea\u0006F\"\u0000\u05ea\u0099\u0001\u0000\u0000\u0000\u05eb"+ + "\u05ec\u0004G\f\u0000\u05ec\u05ed\u0005)\u0000\u0000\u05ed\u05ee\u0006"+ + "G#\u0000\u05ee\u05ef\u0006G$\u0000\u05ef\u009b\u0001\u0000\u0000\u0000"+ + "\u05f0\u05f1\u0005)\u0000\u0000\u05f1\u05f2\u0004H\r\u0000\u05f2\u05f3"+ + "\u0001\u0000\u0000\u0000\u05f3\u05f4\u0006H\u001f\u0000\u05f4\u05f5\u0006"+ + "H \u0000\u05f5\u009d\u0001\u0000\u0000\u0000\u05f6\u05f7\u0005\"\u0000"+ + "\u0000\u05f7\u05f8\u0001\u0000\u0000\u0000\u05f8\u05f9\u0006I\f\u0000"+ + "\u05f9\u05fa\u0006I%\u0000\u05fa\u009f\u0001\u0000\u0000\u0000\u05fb\u05fc"+ + "\u0005?\u0000\u0000\u05fc\u05fd\u0005:\u0000\u0000\u05fd\u05fe\u0001\u0000"+ + "\u0000\u0000\u05fe\u05ff\u0006J&\u0000\u05ff\u00a1\u0001\u0000\u0000\u0000"+ + "\u0600\u0601\u0005:\u0000\u0000\u0601\u0602\u0005:\u0000\u0000\u0602\u0603"+ + "\u0001\u0000\u0000\u0000\u0603\u0604\u0006K\'\u0000\u0604\u00a3\u0001"+ + "\u0000\u0000\u0000\u0605\u0609\u0003X&\u0000\u0606\u0608\u0005 \u0000"+ + "\u0000\u0607\u0606\u0001\u0000\u0000\u0000\u0608\u060b\u0001\u0000\u0000"+ + "\u0000\u0609\u0607\u0001\u0000\u0000\u0000\u0609\u060a\u0001\u0000\u0000"+ + "\u0000\u060a\u060c\u0001\u0000\u0000\u0000\u060b\u0609\u0001\u0000\u0000"+ + "\u0000\u060c\u060d\u0006L(\u0000\u060d\u00a5\u0001\u0000\u0000\u0000\u060e"+ + "\u060f\u0005:\u0000\u0000\u060f\u0610\u0004M\u000e\u0000\u0610\u0611\u0001"+ + "\u0000\u0000\u0000\u0611\u0612\u0006M\u0012\u0000\u0612\u00a7\u0001\u0000"+ + "\u0000\u0000\u0613\u0614\u0005:\u0000\u0000\u0614\u0615\u0001\u0000\u0000"+ + "\u0000\u0615\u0616\u0006N\u0012\u0000\u0616\u00a9\u0001\u0000\u0000\u0000"+ + "\u0617\u0618\u0005/\u0000\u0000\u0618\u0619\u0005*\u0000\u0000\u0619\u061d"+ + "\u0001\u0000\u0000\u0000\u061a\u061c\t\u0000\u0000\u0000\u061b\u061a\u0001"+ + "\u0000\u0000\u0000\u061c\u061f\u0001\u0000\u0000\u0000\u061d\u061e\u0001"+ + "\u0000\u0000\u0000\u061d\u061b\u0001\u0000\u0000\u0000\u061e\u0620\u0001"+ + "\u0000\u0000\u0000\u061f\u061d\u0001\u0000\u0000\u0000\u0620\u0621\u0005"+ + "*\u0000\u0000\u0621\u0622\u0005/\u0000\u0000\u0622\u0623\u0001\u0000\u0000"+ + "\u0000\u0623\u0624\u0006O\u0012\u0000\u0624\u00ab\u0001\u0000\u0000\u0000"+ + "\u0625\u0626\t\u0000\u0000\u0000\u0626\u0627\u0006P)\u0000\u0627\u00ad"+ + "\u0001\u0000\u0000\u0000\u0628\u0629\u0005\u0000\u0000\u0001\u0629\u062a"+ + "\u0001\u0000\u0000\u0000\u062a\u062b\u0006Q\u0015\u0000\u062b\u062c\u0006"+ + "Q \u0000\u062c\u00af\u0001\u0000\u0000\u0000\u062d\u062e\u0005@\u0000"+ + "\u0000\u062e\u062f\u0007\u0003\u0000\u0000\u062f\u0630\u0007\f\u0000\u0000"+ + "\u0630\u0631\u0007\u0011\u0000\u0000\u0631\u0632\u0007\r\u0000\u0000\u0632"+ + "\u0633\u0007\u0006\u0000\u0000\u0633\u0634\u0007\r\u0000\u0000\u0634\u0635"+ + "\u0001\u0000\u0000\u0000\u0635\u0636\u0006R\u000f\u0000\u0636\u00b1\u0001"+ + "\u0000\u0000\u0000\u0637\u0638\t\u0000\u0000\u0000\u0638\u0639\u0004S"+ + "\u000f\u0000\u0639\u063a\u0001\u0000\u0000\u0000\u063a\u063b\u0006S*\u0000"+ + "\u063b\u00b3\u0001\u0000\u0000\u0000\u063c\u063d\t\u0000\u0000\u0000\u063d"+ + "\u063e\u0001\u0000\u0000\u0000\u063e\u063f\u0006T\f\u0000\u063f\u00b5"+ + "\u0001\u0000\u0000\u0000\u0640\u0641\u0005\u0000\u0000\u0001\u0641\u0642"+ + "\u0001\u0000\u0000\u0000\u0642\u0643\u0006U\u0015\u0000\u0643\u0644\u0006"+ + "U\u000f\u0000\u0644\u00b7\u0001\u0000\u0000\u0000\u0645\u0646\u0005@\u0000"+ + "\u0000\u0646\u0647\u0007\u0003\u0000\u0000\u0647\u0648\u0007\f\u0000\u0000"+ + "\u0648\u0649\u0007\u0011\u0000\u0000\u0649\u064a\u0007\u001a\u0000\u0000"+ + "\u064a\u064b\u0007\u0003\u0000\u0000\u064b\u064c\u0007\u0002\u0000\u0000"+ + "\u064c\u064d\u0007\u0017\u0000\u0000\u064d\u064e\u0007\u0004\u0000\u0000"+ + "\u064e\u064f\u0007\u000b\u0000\u0000\u064f\u0650\u0007\u0007\u0000\u0000"+ + "\u0650\u0651\u0007\u0012\u0000\u0000\u0651\u0652\u0001\u0000\u0000\u0000"+ + "\u0652\u0653\u0006V\u0001\u0000\u0653\u0654\u0006V\u000f\u0000\u0654\u00b9"+ + "\u0001\u0000\u0000\u0000\u0655\u0656\t\u0000\u0000\u0000\u0656\u0657\u0004"+ + "W\u0010\u0000\u0657\u0658\u0001\u0000\u0000\u0000\u0658\u0659\u0006W\t"+ + "\u0000\u0659\u00bb\u0001\u0000\u0000\u0000\u065a\u065b\t\u0000\u0000\u0000"+ + "\u065b\u065c\u0001\u0000\u0000\u0000\u065c\u065d\u0006X\f\u0000\u065d"+ + "\u00bd\u0001\u0000\u0000\u0000\u065e\u065f\u0005\u0000\u0000\u0001\u065f"+ + "\u0660\u0001\u0000\u0000\u0000\u0660\u0661\u0006Y\u0015\u0000\u0661\u0662"+ + "\u0006Y\u000f\u0000\u0662\u00bf\u0001\u0000\u0000\u0000\u0663\u0664\u0005"+ + ":\u0000\u0000\u0664\u0665\u0003R#\u0000\u0665\u0666\u0005=\u0000\u0000"+ + "\u0666\u0667\u0005\"\u0000\u0000\u0667\u0668\u0001\u0000\u0000\u0000\u0668"+ + "\u0669\u0006Z\t\u0000\u0669\u066a\u0006Z+\u0000\u066a\u00c1\u0001\u0000"+ + "\u0000\u0000\u066b\u066c\u0005{\u0000\u0000\u066c\u066d\u0005{\u0000\u0000"+ + "\u066d\u066e\u0001\u0000\u0000\u0000\u066e\u066f\u0006[\u0005\u0000\u066f"+ + "\u0670\u0006[\u0006\u0000\u0670\u00c3\u0001\u0000\u0000\u0000\u0671\u0672"+ + "\u0005{\u0000\u0000\u0672\u0673\u0005!\u0000\u0000\u0673\u0674\u0005!"+ + "\u0000\u0000\u0674\u0675\u0001\u0000\u0000\u0000\u0675\u0676\u0006\\\u0007"+ + "\u0000\u0676\u0677\u0006\\\b\u0000\u0677\u00c5\u0001\u0000\u0000\u0000"+ + "\u0678\u0679\u0005>\u0000\u0000\u0679\u067a\u0001\u0000\u0000\u0000\u067a"+ + "\u067b\u0006]\t\u0000\u067b\u067c\u0006]\u000f\u0000\u067c\u00c7\u0001"+ + "\u0000\u0000\u0000\u067d\u067e\t\u0000\u0000\u0000\u067e\u067f\u0001\u0000"+ + "\u0000\u0000\u067f\u0680\u0006^\t\u0000\u0680\u00c9\u0001\u0000\u0000"+ + "\u0000\u0681\u0682\u0005\u0000\u0000\u0001\u0682\u0683\u0001\u0000\u0000"+ + "\u0000\u0683\u0684\u0006_\u0015\u0000\u0684\u0685\u0006_\u000f\u0000\u0685"+ + "\u00cb\u0001\u0000\u0000\u0000\u0686\u0687\u0005\"\u0000\u0000\u0687\u0688"+ + "\u0001\u0000\u0000\u0000\u0688\u0689\u0006`\t\u0000\u0689\u068a\u0006"+ + "`\u000f\u0000\u068a\u00cd\u0001\u0000\u0000\u0000\u068b\u068c\t\u0000"+ + "\u0000\u0000\u068c\u068d\u0004a\u0011\u0000\u068d\u068e\u0001\u0000\u0000"+ + "\u0000\u068e\u068f\u0006a\u001f\u0000\u068f\u00cf\u0001\u0000\u0000\u0000"+ + "\u0690\u0691\t\u0000\u0000\u0000\u0691\u0692\u0001\u0000\u0000\u0000\u0692"+ + "\u0693\u0006b\f\u0000\u0693\u00d1\u0001\u0000\u0000\u0000\u0694\u0695"+ + "\u0005\u0000\u0000\u0001\u0695\u0696\u0001\u0000\u0000\u0000\u0696\u0697"+ + "\u0006c\u0015\u0000\u0697\u0698\u0006c\u000f\u0000\u0698\u00d3\u0001\u0000"+ + "\u0000\u0000\u0699\u069b\u0003\f\u0000\u0000\u069a\u069c\u0005$\u0000"+ + "\u0000\u069b\u069a\u0001\u0000\u0000\u0000\u069b\u069c\u0001\u0000\u0000"+ + "\u0000\u069c\u069d\u0001\u0000\u0000\u0000\u069d\u069e\u0003R#\u0000\u069e"+ + "\u069f\u0005}\u0000\u0000\u069f\u06a0\u0001\u0000\u0000\u0000\u06a0\u06a1"+ + "\u0006d\f\u0000\u06a1\u00d5\u0001\u0000\u0000\u0000\u06a2\u06a3\u0003"+ + "\f\u0000\u0000\u06a3\u06a4\u0001\u0000\u0000\u0000\u06a4\u06a5\u0006e"+ + "\f\u0000\u06a5\u00d7\u0001\u0000\u0000\u0000\u06a6\u06a8\u0005{\u0000"+ + "\u0000\u06a7\u06a9\u0007)\u0000\u0000\u06a8\u06a7\u0001\u0000\u0000\u0000"+ + "\u06a8\u06a9\u0001\u0000\u0000\u0000\u06a9\u06aa\u0001\u0000\u0000\u0000"+ + "\u06aa\u06ac\u0003R#\u0000\u06ab\u06ad\u0007)\u0000\u0000\u06ac\u06ab"+ + "\u0001\u0000\u0000\u0000\u06ac\u06ad\u0001\u0000\u0000\u0000\u06ad\u06af"+ + "\u0001\u0000\u0000\u0000\u06ae\u06b0\u0005:\u0000\u0000\u06af\u06ae\u0001"+ + "\u0000\u0000\u0000\u06b0\u06b1\u0001\u0000\u0000\u0000\u06b1\u06af\u0001"+ + "\u0000\u0000\u0000\u06b1\u06b2\u0001\u0000\u0000\u0000\u06b2\u06b4\u0001"+ + "\u0000\u0000\u0000\u06b3\u06b5\u0007)\u0000\u0000\u06b4\u06b3\u0001\u0000"+ + "\u0000\u0000\u06b4\u06b5\u0001\u0000\u0000\u0000\u06b5\u06b7\u0001\u0000"+ + "\u0000\u0000\u06b6\u06b8\u0003R#\u0000\u06b7\u06b6\u0001\u0000\u0000\u0000"+ + "\u06b7\u06b8\u0001\u0000\u0000\u0000\u06b8\u06ba\u0001\u0000\u0000\u0000"+ + "\u06b9\u06bb\u0007)\u0000\u0000\u06ba\u06b9\u0001\u0000\u0000\u0000\u06ba"+ + "\u06bb\u0001\u0000\u0000\u0000\u06bb\u06d2\u0001\u0000\u0000\u0000\u06bc"+ + "\u06be\u0005,\u0000\u0000\u06bd\u06bf\u0007)\u0000\u0000\u06be\u06bd\u0001"+ + "\u0000\u0000\u0000\u06be\u06bf\u0001\u0000\u0000\u0000\u06bf\u06c0\u0001"+ + "\u0000\u0000\u0000\u06c0\u06c2\u0003R#\u0000\u06c1\u06c3\u0007)\u0000"+ + "\u0000\u06c2\u06c1\u0001\u0000\u0000\u0000\u06c2\u06c3\u0001\u0000\u0000"+ + "\u0000\u06c3\u06c5\u0001\u0000\u0000\u0000\u06c4\u06c6\u0005:\u0000\u0000"+ + "\u06c5\u06c4\u0001\u0000\u0000\u0000\u06c6\u06c7\u0001\u0000\u0000\u0000"+ + "\u06c7\u06c5\u0001\u0000\u0000\u0000\u06c7\u06c8\u0001\u0000\u0000\u0000"+ + "\u06c8\u06ca\u0001\u0000\u0000\u0000\u06c9\u06cb\u0007)\u0000\u0000\u06ca"+ + "\u06c9\u0001\u0000\u0000\u0000\u06ca\u06cb\u0001\u0000\u0000\u0000\u06cb"+ + "\u06cc\u0001\u0000\u0000\u0000\u06cc\u06ce\u0003R#\u0000\u06cd\u06cf\u0007"+ + ")\u0000\u0000\u06ce\u06cd\u0001\u0000\u0000\u0000\u06ce\u06cf\u0001\u0000"+ + "\u0000\u0000\u06cf\u06d1\u0001\u0000\u0000\u0000\u06d0\u06bc\u0001\u0000"+ + "\u0000\u0000\u06d1\u06d4\u0001\u0000\u0000\u0000\u06d2\u06d0\u0001\u0000"+ + "\u0000\u0000\u06d2\u06d3\u0001\u0000\u0000\u0000\u06d3\u06d6\u0001\u0000"+ + "\u0000\u0000\u06d4\u06d2\u0001\u0000\u0000\u0000\u06d5\u06d7\u0005,\u0000"+ + "\u0000\u06d6\u06d5\u0001\u0000\u0000\u0000\u06d6\u06d7\u0001\u0000\u0000"+ + "\u0000\u06d7\u06d8\u0001\u0000\u0000\u0000\u06d8\u06d9\u0005}\u0000\u0000"+ + "\u06d9\u06da\u0001\u0000\u0000\u0000\u06da\u06db\u0006f\f\u0000\u06db"+ + "\u00d9\u0001\u0000\u0000\u0000\u06dc\u06dd\u0005{\u0000\u0000\u06dd\u06de"+ + "\u0005$\u0000\u0000\u06de\u06e7\u0003R#\u0000\u06df\u06e0\u0005[\u0000"+ + "\u0000\u06e0\u06e1\u0007)\u0000\u0000\u06e1\u06e2\u0003R#\u0000\u06e2"+ + "\u06e3\u0007)\u0000\u0000\u06e3\u06e4\u0005]\u0000\u0000\u06e4\u06e6\u0001"+ + "\u0000\u0000\u0000\u06e5\u06df\u0001\u0000\u0000\u0000\u06e6\u06e9\u0001"+ + "\u0000\u0000\u0000\u06e7\u06e5\u0001\u0000\u0000\u0000\u06e7\u06e8\u0001"+ + "\u0000\u0000\u0000\u06e8\u06ea\u0001\u0000\u0000\u0000\u06e9\u06e7\u0001"+ + "\u0000\u0000\u0000\u06ea\u06eb\u0005:\u0000\u0000\u06eb\u06ec\u0005:\u0000"+ + "\u0000\u06ec\u06ed\u0001\u0000\u0000\u0000\u06ed\u06ee\u0003R#\u0000\u06ee"+ + "\u06ef\u0005}\u0000\u0000\u06ef\u06f0\u0001\u0000\u0000\u0000\u06f0\u06f1"+ + "\u0006g\f\u0000\u06f1\u00db\u0001\u0000\u0000\u0000\u06f2\u06f3\u0005"+ + "{\u0000\u0000\u06f3\u06f4\u0005$\u0000\u0000\u06f4\u06fe\u0003R#\u0000"+ + "\u06f5\u06f6\u0005[\u0000\u0000\u06f6\u06f8\u0007)\u0000\u0000\u06f7\u06f9"+ + "\u0003R#\u0000\u06f8\u06f7\u0001\u0000\u0000\u0000\u06f8\u06f9\u0001\u0000"+ + "\u0000\u0000\u06f9\u06fa\u0001\u0000\u0000\u0000\u06fa\u06fb\u0007)\u0000"+ + "\u0000\u06fb\u06fd\u0005]\u0000\u0000\u06fc\u06f5\u0001\u0000\u0000\u0000"+ + "\u06fd\u0700\u0001\u0000\u0000\u0000\u06fe\u06fc\u0001\u0000\u0000\u0000"+ + "\u06fe\u06ff\u0001\u0000\u0000\u0000\u06ff\u0708\u0001\u0000\u0000\u0000"+ + "\u0700\u06fe\u0001\u0000\u0000\u0000\u0701\u0702\u0005:\u0000\u0000\u0702"+ + "\u0704\u0005:\u0000\u0000\u0703\u0701\u0001\u0000\u0000\u0000\u0704\u0705"+ + "\u0001\u0000\u0000\u0000\u0705\u0703\u0001\u0000\u0000\u0000\u0705\u0706"+ + "\u0001\u0000\u0000\u0000\u0706\u0707\u0001\u0000\u0000\u0000\u0707\u0709"+ + "\u0003R#\u0000\u0708\u0703\u0001\u0000\u0000\u0000\u0708\u0709\u0001\u0000"+ + "\u0000\u0000\u0709\u070e\u0001\u0000\u0000\u0000\u070a\u070c\u0005:\u0000"+ + "\u0000\u070b\u070d\u0003R#\u0000\u070c\u070b\u0001\u0000\u0000\u0000\u070c"+ + "\u070d\u0001\u0000\u0000\u0000\u070d\u070f\u0001\u0000\u0000\u0000\u070e"+ + "\u070a\u0001\u0000\u0000\u0000\u070f\u0710\u0001\u0000\u0000\u0000\u0710"+ + "\u070e\u0001\u0000\u0000\u0000\u0710\u0711\u0001\u0000\u0000\u0000\u0711"+ + "\u0712\u0001\u0000\u0000\u0000\u0712\u0713\u0005}\u0000\u0000\u0713\u0717"+ + "\u0001\u0000\u0000\u0000\u0714\u0715\u0005:\u0000\u0000\u0715\u0717\u0005"+ + "$\u0000\u0000\u0716\u06f2\u0001\u0000\u0000\u0000\u0716\u0714\u0001\u0000"+ + "\u0000\u0000\u0717\u0718\u0001\u0000\u0000\u0000\u0718\u0719\u0006h\u0015"+ + "\u0000\u0719\u00dd\u0001\u0000\u0000\u0000\u071a\u071b\u0005\\\u0000\u0000"+ + "\u071b\u071c\u0005\"\u0000\u0000\u071c\u071d\u0001\u0000\u0000\u0000\u071d"+ + "\u071e\u0006i\f\u0000\u071e\u00df\u0001\u0000\u0000\u0000\u071f\u0720"+ + "\u0005\"\u0000\u0000\u0720\u0721\u0001\u0000\u0000\u0000\u0721\u0722\u0006"+ + "j\f\u0000\u0722\u0723\u0006j\u000f\u0000\u0723\u00e1\u0001\u0000\u0000"+ + "\u0000\u0724\u0725\t\u0000\u0000\u0000\u0725\u0726\u0001\u0000\u0000\u0000"+ + "\u0726\u0727\u0006k\f\u0000\u0727\u00e3\u0001\u0000\u0000\u0000\u0728"+ + "\u0729\u0005\u0000\u0000\u0001\u0729\u072a\u0001\u0000\u0000\u0000\u072a"+ + "\u072b\u0006l\u0015\u0000\u072b\u072c\u0006l\u000f\u0000\u072c\u00e5\u0001"+ + "\u0000\u0000\u0000\u072d\u072e\u0005-\u0000\u0000\u072e\u072f\u0005-\u0000"+ + "\u0000\u072f\u0730\u0005}\u0000\u0000\u0730\u0731\u0005}\u0000\u0000\u0731"+ + "\u0732\u0001\u0000\u0000\u0000\u0732\u0733\u0006m\u000f\u0000\u0733\u00e7"+ + "\u0001\u0000\u0000\u0000\u0734\u0735\t\u0000\u0000\u0000\u0735\u0736\u0004"+ + "n\u0012\u0000\u0736\u0737\u0001\u0000\u0000\u0000\u0737\u0738\u0006n,"+ + "\u0000\u0738\u00e9\u0001\u0000\u0000\u0000\u0739\u073a\t\u0000\u0000\u0000"+ + "\u073a\u073b\u0001\u0000\u0000\u0000\u073b\u073c\u0006o\f\u0000\u073c"+ + "\u00eb\u0001\u0000\u0000\u0000\u073d\u073e\u0005\u0000\u0000\u0001\u073e"+ + "\u073f\u0001\u0000\u0000\u0000\u073f\u0740\u0006p,\u0000\u0740\u0741\u0006"+ + "p\u000f\u0000\u0741\u00ed\u0001\u0000\u0000\u0000k\u0000\u0001\u0002\u0003"+ "\u0004\u0005\u0006\u0007\b\t\n\u000b\u00f5\u00ff\u013c\u015b\u0177\u0181"+ "\u0183\u018c\u0198\u01a6\u01ac\u01ae\u01cc\u023e\u0243\u0259\u0288\u02bf"+ "\u02e4\u02ee\u0346\u0349\u0361\u0376\u037d\u038e\u0390\u039d\u03a2\u03a9"+ "\u03ae\u03bc\u03bf\u03c1\u03cd\u03d2\u03d5\u03e2\u03e5\u03e7\u03ee\u03f3"+ "\u03f5\u03fe\u040a\u0411\u0418\u0420\u0422\u042b\u042d\u0438\u0450\u0464"+ - "\u0468\u0473\u0479\u0485\u0489\u0497\u04a5\u04b6\u04c6\u04d7\u04e3\u04f3"+ - "\u0500\u0510\u051d\u0536\u0547\u054a\u0568\u056f\u0576\u057e\u0594\u059b"+ - "\u05a2\u05aa\u05b7\u05fc\u0610\u068e\u069b\u069f\u06a4\u06a7\u06aa\u06ad"+ - "\u06b1\u06b5\u06ba\u06bd\u06c1\u06c5\u06c9\u06da\u06eb\u06f1\u06f8\u06fb"+ - "\u06ff\u0703\u0709-\u0005\u0004\u0000\u0007\u0001\u0000\u0005\u0007\u0000"+ - "\u0007\u000b\u0000\u0005\u0006\u0000\u0005\u0002\u0000\u0007\u0005\u0000"+ - "\u0005\u0003\u0000\u0007\u0004\u0000\u0007\u0006\u0000\u0005\b\u0000\u0005"+ - "\u0001\u0000\u0003\u0000\u0000\u0005\u000b\u0000\u0007\u0007\u0000\u0004"+ - "\u0000\u0000\u00013\u0000\u00014\u0001\u0006\u0000\u0000\u00016\u0002"+ - "\u00017\u0003\u0007\b\u0000\u0001:\u0004\u0001;\u0005\u0001=\u0006\u0001"+ - ">\u0007\u0005\u0005\u0000\u0001A\b\u0001D\t\u0001D\n\u0001E\u000b\u0007"+ - "\u0002\u0000\u0002\u0000\u0000\u0001F\f\u0001F\r\u0001G\u000e\u0001G\u000f"+ - "\u0005\n\u0000\u0001J\u0010\u0001K\u0011\u0001L\u0012\u0001P\u0013\u0000"+ - "\u0002\u0000\u0005\t\u0000\u0007\t\u0000"; + "\u0468\u0473\u0479\u0485\u0489\u054f\u0554\u0557\u0575\u057c\u0583\u058b"+ + "\u05a1\u05a8\u05af\u05b7\u05c4\u0609\u061d\u069b\u06a8\u06ac\u06b1\u06b4"+ + "\u06b7\u06ba\u06be\u06c2\u06c7\u06ca\u06ce\u06d2\u06d6\u06e7\u06f8\u06fe"+ + "\u0705\u0708\u070c\u0710\u0716-\u0005\u0004\u0000\u0007\u0001\u0000\u0005"+ + "\u0007\u0000\u0007\u000b\u0000\u0005\u0006\u0000\u0005\u0002\u0000\u0007"+ + "\u0005\u0000\u0005\u0003\u0000\u0007\u0004\u0000\u0007\u0006\u0000\u0005"+ + "\b\u0000\u0005\u0001\u0000\u0003\u0000\u0000\u0005\u000b\u0000\u0007\u0007"+ + "\u0000\u0004\u0000\u0000\u00013\u0000\u00014\u0001\u0006\u0000\u0000\u0001"+ + "6\u0002\u00017\u0003\u0007\b\u0000\u0001:\u0004\u0001;\u0005\u0001=\u0006"+ + "\u0001>\u0007\u0005\u0005\u0000\u0001A\b\u0001D\t\u0001D\n\u0001E\u000b"+ + "\u0007\u0002\u0000\u0002\u0000\u0000\u0001F\f\u0001F\r\u0001G\u000e\u0001"+ + "G\u000f\u0005\n\u0000\u0001J\u0010\u0001K\u0011\u0001L\u0012\u0001P\u0013"+ + "\u0000\u0002\u0000\u0005\t\u0000\u0007\t\u0000"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java index 352edb142fa4..3700e3d3786d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java @@ -719,7 +719,7 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) } private static final String _serializedATNSegment0 = - "\u0004\u0000\u00ab\u0b3f\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ + "\u0004\u0000\u00ab\u0b4c\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+ @@ -966,654 +966,657 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "\b~\u0001~\u0001~\u0001~\u0001~\u0003~\u07be\b~\u0001~\u0001~\u0001~\u0001"+ "~\u0001~\u0001~\u0001~\u0001~\u0005~\u07c8\b~\n~\f~\u07cb\t~\u0001~\u0003"+ "~\u07ce\b~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0005~\u07da\b~\n~\f~\u07dd\t~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0005~\u07e8\b~\n~\f~\u07eb\t~\u0001~\u0001"+ "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0005~\u07f9\b~\n~\f~\u07fc\t~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005~\u0809\b~\n~\f~\u080c\t~\u0001"+ "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0005~\u081a\b~\n~\f~\u081d\t~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0005~\u0826\b~\n~\f~\u0829\t~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005~\u0836\b~\n~"+ - "\f~\u0839\t~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005"+ - "~\u0843\b~\n~\f~\u0846\t~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0005~\u0853\b~\n~\f~\u0856\t~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005~\u0860\b~\n~\f~\u0863"+ - "\t~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0005~\u0879\b~\n~\f~\u087c\t~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005~\u088a\b~\n~\f~\u088d"+ - "\t~\u0003~\u088f\b~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f"+ - "\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0081"+ - "\u0003\u0081\u089c\b\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0004\u0081"+ - "\u08a1\b\u0081\u000b\u0081\f\u0081\u08a2\u0001\u0081\u0001\u0081\u0001"+ - "\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001"+ - "\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001"+ - "\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001"+ - "\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001"+ - "\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0088\u0001"+ - "\u0088\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001"+ - "\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001"+ - "\u008b\u0001\u008b\u0001\u008c\u0003\u008c\u08d4\b\u008c\u0001\u008c\u0001"+ - "\u008c\u0001\u008c\u0004\u008c\u08d9\b\u008c\u000b\u008c\f\u008c\u08da"+ - "\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d"+ - "\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008f"+ - "\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u0090"+ - "\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0091\u0001\u0091\u0001\u0091"+ - "\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092"+ - "\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094"+ - "\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0004\u0095\u0905\b\u0095"+ - "\u000b\u0095\f\u0095\u0906\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095"+ - "\u0001\u0095\u0001\u0096\u0004\u0096\u090f\b\u0096\u000b\u0096\f\u0096"+ - "\u0910\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001"+ - "\u0097\u0001\u0097\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001"+ - "\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001"+ - "\u0099\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001"+ - "\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001"+ - "\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001"+ - "\u009c\u0001\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001"+ - "\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001"+ - "\u009e\u0001\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ - "\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0004"+ - "\u00a1\u094e\b\u00a1\u000b\u00a1\f\u00a1\u094f\u0001\u00a1\u0001\u00a1"+ - "\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3"+ - "\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001\u00a4"+ - "\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5"+ - "\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6"+ - "\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7"+ - "\u0001\u00a8\u0001\u00a8\u0003\u00a8\u0974\b\u00a8\u0001\u00a9\u0001\u00a9"+ - "\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa"+ - "\u0001\u00ab\u0003\u00ab\u097f\b\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab"+ - "\u0004\u00ab\u0984\b\u00ab\u000b\u00ab\f\u00ab\u0985\u0001\u00ab\u0001"+ - "\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001"+ - "\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0001"+ - "\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0001\u00af\u0001"+ - "\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001"+ - "\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0004\u00b2\u09a5\b\u00b2\u000b"+ - "\u00b2\f\u00b2\u09a6\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001"+ - "\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001"+ - "\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5\u0004\u00b5\u09b7\b\u00b5\u000b"+ - "\u00b5\f\u00b5\u09b8\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001"+ - "\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001"+ - "\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001"+ - "\u00ba\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001"+ - "\u00bc\u0001\u00bc\u0001\u00bc\u0003\u00bc\u09d4\b\u00bc\u0001\u00bc\u0001"+ - "\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001"+ - "\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00bf\u0001\u00bf\u0001"+ - "\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001"+ - "\u00c0\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c2\u0001\u00c2\u0001"+ - "\u00c2\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001"+ - "\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c5\u0001"+ - "\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c6\u0001\u00c6\u0001"+ - "\u00c6\u0001\u00c7\u0001\u00c7\u0003\u00c7\u0a04\b\u00c7\u0001\u00c8\u0001"+ - "\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001"+ - "\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00cb\u0001\u00cb\u0001"+ - "\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cd\u0004\u00cd\u0a17\b\u00cd\u000b"+ - "\u00cd\f\u00cd\u0a18\u0001\u00cd\u0001\u00cd\u0001\u00ce\u0001\u00ce\u0001"+ - "\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00d0\u0001\u00d0\u0001"+ - "\u00d0\u0001\u00d0\u0001\u00d0\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001"+ - "\u00d1\u0004\u00d1\u0a2c\b\u00d1\u000b\u00d1\f\u00d1\u0a2d\u0001\u00d1"+ - "\u0001\u00d1\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0005\u00d2"+ - "\u0a36\b\u00d2\n\u00d2\f\u00d2\u0a39\t\u00d2\u0001\u00d2\u0001\u00d2\u0001"+ - "\u00d2\u0001\u00d2\u0005\u00d2\u0a3f\b\u00d2\n\u00d2\f\u00d2\u0a42\t\u00d2"+ - "\u0001\u00d2\u0001\u00d2\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3"+ - "\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3"+ - "\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d5"+ - "\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d6\u0001\u00d6\u0001\u00d6"+ - "\u0001\u00d6\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d8"+ - "\u0001\u00d8\u0001\u00d8\u0001\u00d8\u0001\u00d9\u0001\u00d9\u0003\u00d9"+ - "\u0a67\b\u00d9\u0001\u00d9\u0001\u00d9\u0001\u00da\u0001\u00da\u0001\u00da"+ - "\u0001\u00da\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db"+ - "\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00dc\u0001\u00dc\u0001\u00dc"+ - "\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dd"+ - "\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00de\u0003\u00de\u0a84\b\u00de"+ - "\u0001\u00de\u0001\u00de\u0001\u00de\u0004\u00de\u0a89\b\u00de\u000b\u00de"+ - "\f\u00de\u0a8a\u0001\u00de\u0001\u00de\u0001\u00df\u0001\u00df\u0001\u00df"+ - "\u0001\u00df\u0001\u00df\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0"+ - "\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e2"+ - "\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001\u00e3\u0001\u00e3\u0001\u00e3"+ - "\u0001\u00e3\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e5"+ - "\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e6\u0001\u00e6"+ - "\u0001\u00e6\u0001\u00e6\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7"+ - "\u0001\u00e7\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0004\u00e8"+ - "\u0abb\b\u00e8\u000b\u00e8\f\u00e8\u0abc\u0001\u00e8\u0001\u00e8\u0001"+ - "\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0005\u00e9\u0ac5\b\u00e9\n"+ - "\u00e9\f\u00e9\u0ac8\t\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001"+ - "\u00e9\u0001\u00e9\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001"+ - "\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00ec\u0001\u00ec\u0001"+ - "\u00ec\u0001\u00ec\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001"+ - "\u00ee\u0001\u00ee\u0003\u00ee\u0ae1\b\u00ee\u0001\u00ee\u0001\u00ee\u0001"+ - "\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00f0\u0001\u00f0\u0001"+ - "\u00f0\u0001\u00f0\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001"+ - "\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f3\u0001"+ - "\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f4\u0001\u00f4\u0001"+ - "\u00f4\u0001\u00f4\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001"+ - "\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f7\u0001"+ - "\u00f7\u0001\u00f7\u0001\u00f7\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ - "\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0003~\u0894\b~\u0001"+ + "~\u0005~\u0897\b~\n~\f~\u089a\t~\u0003~\u089c\b~\u0001~\u0001~\u0001\u007f"+ + "\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080"+ + "\u0001\u0080\u0001\u0081\u0003\u0081\u08a9\b\u0081\u0001\u0081\u0001\u0081"+ + "\u0001\u0081\u0004\u0081\u08ae\b\u0081\u000b\u0081\f\u0081\u08af\u0001"+ + "\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001"+ + "\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001"+ + "\u0084\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001"+ + "\u0085\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001"+ + "\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001"+ + "\u0088\u0001\u0088\u0001\u0088\u0001\u0089\u0001\u0089\u0001\u0089\u0001"+ + "\u0089\u0001\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001"+ + "\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008c\u0003\u008c\u08e1"+ + "\b\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0004\u008c\u08e6\b\u008c"+ + "\u000b\u008c\f\u008c\u08e7\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d"+ + "\u0001\u008d\u0001\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e"+ + "\u0001\u008e\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f"+ + "\u0001\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0091"+ + "\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092"+ + "\u0001\u0092\u0001\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093"+ + "\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095"+ + "\u0004\u0095\u0912\b\u0095\u000b\u0095\f\u0095\u0913\u0001\u0095\u0001"+ + "\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0004\u0096\u091c"+ + "\b\u0096\u000b\u0096\f\u0096\u091d\u0001\u0096\u0001\u0096\u0001\u0097"+ + "\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0098\u0001\u0098"+ + "\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0099\u0001\u0099"+ + "\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u009a\u0001\u009a\u0001\u009a"+ + "\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001\u009b"+ + "\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0001\u009c"+ + "\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009d\u0001\u009d"+ + "\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e"+ + "\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f\u0001\u009f"+ + "\u0001\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0"+ + "\u0001\u00a0\u0001\u00a1\u0004\u00a1\u095b\b\u00a1\u000b\u00a1\f\u00a1"+ + "\u095c\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001"+ + "\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001"+ + "\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001"+ + "\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001"+ + "\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001"+ + "\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001\u00a8\u0003\u00a8\u0981"+ + "\b\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001"+ + "\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0003\u00ab\u098c\b\u00ab\u0001"+ + "\u00ab\u0001\u00ab\u0001\u00ab\u0004\u00ab\u0991\b\u00ab\u000b\u00ab\f"+ + "\u00ab\u0992\u0001\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac"+ + "\u0001\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad"+ + "\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af"+ + "\u0001\u00af\u0001\u00af\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0"+ + "\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2"+ + "\u0004\u00b2\u09b2\b\u00b2\u000b\u00b2\f\u00b2\u09b3\u0001\u00b2\u0001"+ + "\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001"+ + "\u00b3\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001"+ + "\u00b5\u0004\u00b5\u09c4\b\u00b5\u000b\u00b5\f\u00b5\u09c5\u0001\u00b5"+ + "\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7"+ + "\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b9\u0001\u00b9"+ + "\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00bb"+ + "\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc\u0001\u00bc\u0001\u00bc"+ + "\u0003\u00bc\u09e1\b\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bd\u0001\u00bd"+ + "\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00be\u0001\u00be\u0001\u00be"+ + "\u0001\u00be\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00bf"+ + "\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c1\u0001\u00c1"+ + "\u0001\u00c1\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c3\u0001\u00c3"+ + "\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c4\u0001\u00c4\u0001\u00c4"+ + "\u0001\u00c4\u0001\u00c4\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c5"+ + "\u0001\u00c5\u0001\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c7\u0001\u00c7"+ + "\u0003\u00c7\u0a11\b\u00c7\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8"+ + "\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00ca\u0001\u00ca\u0001\u00ca"+ + "\u0001\u00ca\u0001\u00cb\u0001\u00cb\u0001\u00cc\u0001\u00cc\u0001\u00cc"+ + "\u0001\u00cd\u0004\u00cd\u0a24\b\u00cd\u000b\u00cd\f\u00cd\u0a25\u0001"+ + "\u00cd\u0001\u00cd\u0001\u00ce\u0001\u00ce\u0001\u00cf\u0001\u00cf\u0001"+ + "\u00cf\u0001\u00cf\u0001\u00d0\u0001\u00d0\u0001\u00d0\u0001\u00d0\u0001"+ + "\u00d0\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0004\u00d1\u0a39"+ + "\b\u00d1\u000b\u00d1\f\u00d1\u0a3a\u0001\u00d1\u0001\u00d1\u0001\u00d2"+ + "\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0005\u00d2\u0a43\b\u00d2\n\u00d2"+ + "\f\u00d2\u0a46\t\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2"+ + "\u0005\u00d2\u0a4c\b\u00d2\n\u00d2\f\u00d2\u0a4f\t\u00d2\u0001\u00d2\u0001"+ + "\u00d2\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001"+ + "\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d4\u0001"+ + "\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d5\u0001\u00d5\u0001"+ + "\u00d5\u0001\u00d5\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001"+ + "\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d8\u0001\u00d8\u0001"+ + "\u00d8\u0001\u00d8\u0001\u00d9\u0001\u00d9\u0003\u00d9\u0a74\b\u00d9\u0001"+ + "\u00d9\u0001\u00d9\u0001\u00da\u0001\u00da\u0001\u00da\u0001\u00da\u0001"+ + "\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001"+ + "\u00db\u0001\u00db\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001"+ + "\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dd\u0001\u00dd\u0001"+ + "\u00dd\u0001\u00dd\u0001\u00de\u0003\u00de\u0a91\b\u00de\u0001\u00de\u0001"+ + "\u00de\u0001\u00de\u0004\u00de\u0a96\b\u00de\u000b\u00de\f\u00de\u0a97"+ + "\u0001\u00de\u0001\u00de\u0001\u00df\u0001\u00df\u0001\u00df\u0001\u00df"+ + "\u0001\u00df\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e1"+ + "\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e2\u0001\u00e2"+ + "\u0001\u00e2\u0001\u00e2\u0001\u00e3\u0001\u00e3\u0001\u00e3\u0001\u00e3"+ + "\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e5\u0001\u00e5"+ + "\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e6\u0001\u00e6\u0001\u00e6"+ + "\u0001\u00e6\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7"+ + "\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0004\u00e8\u0ac8\b\u00e8"+ + "\u000b\u00e8\f\u00e8\u0ac9\u0001\u00e8\u0001\u00e8\u0001\u00e9\u0001\u00e9"+ + "\u0001\u00e9\u0001\u00e9\u0005\u00e9\u0ad2\b\u00e9\n\u00e9\f\u00e9\u0ad5"+ + "\t\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001"+ + "\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00eb\u0001\u00eb\u0001"+ + "\u00eb\u0001\u00eb\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001"+ + "\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ee\u0001\u00ee\u0003"+ + "\u00ee\u0aee\b\u00ee\u0001\u00ee\u0001\u00ee\u0001\u00ef\u0001\u00ef\u0001"+ + "\u00ef\u0001\u00ef\u0001\u00f0\u0001\u00f0\u0001\u00f0\u0001\u00f0\u0001"+ + "\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f2\u0001\u00f2\u0001"+ + "\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001"+ + "\u00f3\u0001\u00f3\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001"+ + "\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f6\u0001\u00f6\u0001"+ + "\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f7\u0001\u00f7\u0001\u00f7\u0001"+ + "\u00f7\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ "\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ - "\u00f8\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001"+ - "\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fb\u0001"+ - "\u00fb\u0001\u00fb\u0001\u00fb\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001"+ - "\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fd\u0001"+ - "\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fe\u0001\u00fe\u0001"+ - "\u00fe\u0001\u00fe\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001"+ - "\u00ff\u0003\u0765\u0a37\u0ac6\u0000\u0100\u000e\u0000\u0010\u0000\u0012"+ - "\u0000\u0014\u0000\u0016\u0000\u0018\u0000\u001a\u0019\u001c\u001a\u001e"+ - "\u001b \u001c\"\u001d$\u001e&\u001f( *!,\".#0$2%4&6\'8(:)<*>+@,B-D.F/"+ - "H0J1L2N3P4R5T6V7X8Z9\\:^;`f?h@jAlBnCpDrEtFvGxHzI|J~K\u0080L\u0082"+ - "M\u0084N\u0086O\u0088P\u008aQ\u008cR\u008eS\u0090T\u0092U\u0094V\u0096"+ - "W\u0098X\u009aY\u009cZ\u009e[\u00a0\\\u00a2]\u00a4^\u00a6_\u00a8`\u00aa"+ - "a\u00acb\u00aec\u00b0d\u00b2e\u00b4f\u00b6\u0000\u00b8g\u00bah\u00bci"+ - "\u00bej\u00c0k\u00c2l\u00c4m\u00c6n\u00c8o\u00cap\u00ccq\u00ce\u00a3\u00d0"+ - "\u00a4\u00d2r\u00d4s\u00d6\u0000\u00d8t\u00dau\u00dcv\u00de\u0000\u00e0"+ - "\u0000\u00e2w\u00e4x\u00e6y\u00e8z\u00ea{\u00ec|\u00ee}\u00f0\u0000\u00f2"+ - "\u0000\u00f4\u0000\u00f6\u0000\u00f8\u0000\u00fa\u0000\u00fc\u0000\u00fe"+ - "\u0000\u0100\u0000\u0102\u0000\u0104~\u0106\u0000\u0108\u0000\u010a\u0000"+ - "\u010c\u0000\u010e\u0000\u0110\u0000\u0112\u0000\u0114\u00a5\u0116\u007f"+ - "\u0118\u00a6\u011a\u00a7\u011c\u00a8\u011e\u0080\u0120\u0000\u0122\u0000"+ - "\u0124\u0000\u0126\u0000\u0128\u0000\u012a\u0000\u012c\u0081\u012e\u0000"+ - "\u0130\u0000\u0132\u0000\u0134\u0082\u0136\u0000\u0138\u0083\u013a\u0084"+ - "\u013c\u0000\u013e\u0000\u0140\u0000\u0142\u0000\u0144\u0000\u0146\u0000"+ - "\u0148\u0000\u014a\u0000\u014c\u0000\u014e\u0000\u0150\u0085\u0152\r\u0154"+ - "\u0000\u0156\u0000\u0158\u0000\u015a\u0000\u015c\u0000\u015e\u0086\u0160"+ - "\u0000\u0162\u0000\u0164\u0000\u0166\u0000\u0168\u0000\u016a\u0000\u016c"+ - "\u0087\u016e\u0088\u0170\u0000\u0172\u0089\u0174\u0000\u0176\u0000\u0178"+ - "\u008a\u017a\u008b\u017c\u008c\u017e\u008d\u0180\u0000\u0182\u008e\u0184"+ - "\u0000\u0186\u0000\u0188\u0000\u018a\u0000\u018c\u0000\u018e\u008f\u0190"+ - "\u000f\u0192\u0090\u0194\u0000\u0196\u0000\u0198\u0000\u019a\u0091\u019c"+ - "\u0011\u019e\u0000\u01a0\u0012\u01a2\u0000\u01a4\u0092\u01a6\u0093\u01a8"+ - "\u0094\u01aa\u0095\u01ac\u0000\u01ae\u0000\u01b0\u0096\u01b2\u0097\u01b4"+ - "\u0098\u01b6\u0000\u01b8\u0000\u01ba\u0000\u01bc\u00a9\u01be\u00aa\u01c0"+ - "\u0000\u01c2\u0000\u01c4\u0000\u01c6\u00ab\u01c8\u0000\u01ca\u0000\u01cc"+ - "\u0000\u01ce\u0000\u01d0\u0000\u01d2\u0000\u01d4\u0000\u01d6\u0099\u01d8"+ - "\u0000\u01da\u009a\u01dc\u009b\u01de\u009c\u01e0\u009d\u01e2\u0000\u01e4"+ - "\u0000\u01e6\u0000\u01e8\u0000\u01ea\u0015\u01ec\u0000\u01ee\u0000\u01f0"+ - "\u0000\u01f2\u0000\u01f4\u0000\u01f6\u0000\u01f8\u0000\u01fa\u0000\u01fc"+ - "\u0000\u01fe\u0000\u0200\u009e\u0202\u0000\u0204\u0000\u0206\u009f\u0208"+ - "\u00a0\u020a\u00a1\u020c\u00a2\u000e\u0000\u0001\u0002\u0003\u0004\u0005"+ - "\u0006\u0007\b\t\n\u000b\f\r\'\u0003\u0000AZaz\u0080\u8000\ufffe\u0006"+ - "\u0000-.0:AZ__az\u0080\u8000\ufffe\u0002\u0000##..\u0006\u0000--0:AZ_"+ - "_az\u0080\u8000\ufffe\u0002\u0000\'\'\\\\\u0002\u0000IIii\u0002\u0000"+ - "FFff\u0002\u0000EEee\u0002\u0000LLll\u0002\u0000SSss\u0002\u0000NNnn\u0002"+ - "\u0000DDdd\u0002\u0000WWww\u0002\u0000TTtt\u0002\u0000CCcc\u0002\u0000"+ - "HHhh\u0002\u0000AAaa\u0002\u0000UUuu\u0002\u0000MMmm\u0002\u0000PPpp\u0002"+ - "\u0000YYyy\u0002\u0000OOoo\u0002\u0000RRrr\u0002\u0000BBbb\u0002\u0000"+ - "KKkk\u0002\u0000XXxx\u0002\u0000JJjj\u0002\u0000GGgg\u0002\u0000VVvv\u0002"+ - "\u0000QQqq\u0003\u0000\n\n\r\r \u0002\u0000\n\n\r\r\u0004\u0000AZ__a"+ - "z\u0080\u8000\ufffe\u0005\u000009AZ__az\u0080\u8000\ufffe\u0006\u0000"+ - "..09AZ__az\u0080\u8000\ufffe\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002"+ - "\u0000\"\"\\\\\u0001\u0000 \u0003\u0000\t\n\r\r \u0ba3\u0000\u001a\u0001"+ - "\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001"+ - "\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000"+ - "\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000"+ - "\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,"+ - "\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000"+ - "\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000"+ - "\u00006\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:"+ - "\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000"+ - "\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000"+ - "\u0000D\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H"+ - "\u0001\u0000\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000"+ - "\u0000\u0000\u0000N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000"+ - "\u0000R\u0001\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V"+ - "\u0001\u0000\u0000\u0000\u0000X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000"+ - "\u0000\u0000\u0000\\\u0001\u0000\u0000\u0000\u0000^\u0001\u0000\u0000"+ - "\u0000\u0000`\u0001\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000\u0000"+ - "d\u0001\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001"+ - "\u0000\u0000\u0000\u0000j\u0001\u0000\u0000\u0000\u0000l\u0001\u0000\u0000"+ - "\u0000\u0000n\u0001\u0000\u0000\u0000\u0000p\u0001\u0000\u0000\u0000\u0000"+ - "r\u0001\u0000\u0000\u0000\u0000t\u0001\u0000\u0000\u0000\u0000v\u0001"+ - "\u0000\u0000\u0000\u0000x\u0001\u0000\u0000\u0000\u0000z\u0001\u0000\u0000"+ - "\u0000\u0000|\u0001\u0000\u0000\u0000\u0000~\u0001\u0000\u0000\u0000\u0000"+ - "\u0080\u0001\u0000\u0000\u0000\u0000\u0082\u0001\u0000\u0000\u0000\u0000"+ - "\u0084\u0001\u0000\u0000\u0000\u0000\u0086\u0001\u0000\u0000\u0000\u0000"+ - "\u0088\u0001\u0000\u0000\u0000\u0000\u008a\u0001\u0000\u0000\u0000\u0000"+ - "\u008c\u0001\u0000\u0000\u0000\u0000\u008e\u0001\u0000\u0000\u0000\u0000"+ - "\u0090\u0001\u0000\u0000\u0000\u0000\u0092\u0001\u0000\u0000\u0000\u0000"+ - "\u0094\u0001\u0000\u0000\u0000\u0000\u0096\u0001\u0000\u0000\u0000\u0000"+ - "\u0098\u0001\u0000\u0000\u0000\u0000\u009a\u0001\u0000\u0000\u0000\u0000"+ - "\u009c\u0001\u0000\u0000\u0000\u0000\u009e\u0001\u0000\u0000\u0000\u0000"+ - "\u00a0\u0001\u0000\u0000\u0000\u0000\u00a2\u0001\u0000\u0000\u0000\u0000"+ - "\u00a4\u0001\u0000\u0000\u0000\u0000\u00a6\u0001\u0000\u0000\u0000\u0000"+ - "\u00a8\u0001\u0000\u0000\u0000\u0000\u00aa\u0001\u0000\u0000\u0000\u0000"+ - "\u00ac\u0001\u0000\u0000\u0000\u0000\u00ae\u0001\u0000\u0000\u0000\u0000"+ - "\u00b0\u0001\u0000\u0000\u0000\u0000\u00b2\u0001\u0000\u0000\u0000\u0000"+ - "\u00b4\u0001\u0000\u0000\u0000\u0000\u00b6\u0001\u0000\u0000\u0000\u0000"+ - "\u00b8\u0001\u0000\u0000\u0000\u0000\u00ba\u0001\u0000\u0000\u0000\u0000"+ - "\u00bc\u0001\u0000\u0000\u0000\u0000\u00be\u0001\u0000\u0000\u0000\u0000"+ - "\u00c0\u0001\u0000\u0000\u0000\u0000\u00c2\u0001\u0000\u0000\u0000\u0000"+ - "\u00c4\u0001\u0000\u0000\u0000\u0000\u00c6\u0001\u0000\u0000\u0000\u0000"+ - "\u00c8\u0001\u0000\u0000\u0000\u0000\u00ca\u0001\u0000\u0000\u0000\u0000"+ - "\u00cc\u0001\u0000\u0000\u0000\u0000\u00ce\u0001\u0000\u0000\u0000\u0000"+ - "\u00d0\u0001\u0000\u0000\u0000\u0000\u00d2\u0001\u0000\u0000\u0000\u0000"+ - "\u00d4\u0001\u0000\u0000\u0000\u0000\u00d6\u0001\u0000\u0000\u0000\u0000"+ - "\u00d8\u0001\u0000\u0000\u0000\u0000\u00da\u0001\u0000\u0000\u0000\u0000"+ - "\u00dc\u0001\u0000\u0000\u0000\u0000\u00de\u0001\u0000\u0000\u0000\u0000"+ - "\u00e0\u0001\u0000\u0000\u0000\u0000\u00e2\u0001\u0000\u0000\u0000\u0000"+ - "\u00e4\u0001\u0000\u0000\u0000\u0000\u00e6\u0001\u0000\u0000\u0000\u0000"+ - "\u00e8\u0001\u0000\u0000\u0000\u0000\u00ea\u0001\u0000\u0000\u0000\u0000"+ - "\u00ec\u0001\u0000\u0000\u0000\u0000\u00ee\u0001\u0000\u0000\u0000\u0000"+ - "\u0104\u0001\u0000\u0000\u0000\u0000\u0106\u0001\u0000\u0000\u0000\u0000"+ - "\u0108\u0001\u0000\u0000\u0000\u0000\u010a\u0001\u0000\u0000\u0000\u0001"+ - "\u010c\u0001\u0000\u0000\u0000\u0001\u010e\u0001\u0000\u0000\u0000\u0001"+ - "\u0110\u0001\u0000\u0000\u0000\u0001\u0112\u0001\u0000\u0000\u0000\u0001"+ - "\u0114\u0001\u0000\u0000\u0000\u0001\u0116\u0001\u0000\u0000\u0000\u0001"+ - "\u0118\u0001\u0000\u0000\u0000\u0001\u011a\u0001\u0000\u0000\u0000\u0001"+ - "\u011c\u0001\u0000\u0000\u0000\u0001\u011e\u0001\u0000\u0000\u0000\u0001"+ - "\u0120\u0001\u0000\u0000\u0000\u0002\u0122\u0001\u0000\u0000\u0000\u0002"+ - "\u0124\u0001\u0000\u0000\u0000\u0002\u0126\u0001\u0000\u0000\u0000\u0002"+ - "\u0128\u0001\u0000\u0000\u0000\u0002\u012a\u0001\u0000\u0000\u0000\u0002"+ - "\u012c\u0001\u0000\u0000\u0000\u0002\u012e\u0001\u0000\u0000\u0000\u0002"+ - "\u0130\u0001\u0000\u0000\u0000\u0002\u0132\u0001\u0000\u0000\u0000\u0002"+ - "\u0134\u0001\u0000\u0000\u0000\u0002\u0136\u0001\u0000\u0000\u0000\u0003"+ - "\u0138\u0001\u0000\u0000\u0000\u0003\u013a\u0001\u0000\u0000\u0000\u0003"+ - "\u013c\u0001\u0000\u0000\u0000\u0003\u013e\u0001\u0000\u0000\u0000\u0003"+ - "\u0140\u0001\u0000\u0000\u0000\u0004\u0142\u0001\u0000\u0000\u0000\u0004"+ - "\u0144\u0001\u0000\u0000\u0000\u0004\u0146\u0001\u0000\u0000\u0000\u0004"+ - "\u0148\u0001\u0000\u0000\u0000\u0004\u014a\u0001\u0000\u0000\u0000\u0004"+ - "\u014c\u0001\u0000\u0000\u0000\u0004\u014e\u0001\u0000\u0000\u0000\u0005"+ - "\u0150\u0001\u0000\u0000\u0000\u0005\u0152\u0001\u0000\u0000\u0000\u0005"+ - "\u0154\u0001\u0000\u0000\u0000\u0006\u0156\u0001\u0000\u0000\u0000\u0006"+ - "\u0158\u0001\u0000\u0000\u0000\u0006\u015a\u0001\u0000\u0000\u0000\u0006"+ - "\u015c\u0001\u0000\u0000\u0000\u0006\u015e\u0001\u0000\u0000\u0000\u0006"+ - "\u0160\u0001\u0000\u0000\u0000\u0006\u0162\u0001\u0000\u0000\u0000\u0006"+ - "\u0164\u0001\u0000\u0000\u0000\u0006\u0166\u0001\u0000\u0000\u0000\u0006"+ - "\u0168\u0001\u0000\u0000\u0000\u0006\u016a\u0001\u0000\u0000\u0000\u0006"+ - "\u016c\u0001\u0000\u0000\u0000\u0006\u016e\u0001\u0000\u0000\u0000\u0006"+ - "\u0170\u0001\u0000\u0000\u0000\u0007\u0172\u0001\u0000\u0000\u0000\u0007"+ - "\u0174\u0001\u0000\u0000\u0000\u0007\u0176\u0001\u0000\u0000\u0000\b\u0178"+ - "\u0001\u0000\u0000\u0000\b\u017a\u0001\u0000\u0000\u0000\b\u017c\u0001"+ - "\u0000\u0000\u0000\b\u017e\u0001\u0000\u0000\u0000\b\u0180\u0001\u0000"+ - "\u0000\u0000\b\u0182\u0001\u0000\u0000\u0000\b\u0184\u0001\u0000\u0000"+ - "\u0000\b\u0186\u0001\u0000\u0000\u0000\b\u0188\u0001\u0000\u0000\u0000"+ - "\b\u018a\u0001\u0000\u0000\u0000\b\u018c\u0001\u0000\u0000\u0000\t\u018e"+ - "\u0001\u0000\u0000\u0000\t\u0190\u0001\u0000\u0000\u0000\t\u0192\u0001"+ - "\u0000\u0000\u0000\t\u0194\u0001\u0000\u0000\u0000\t\u0196\u0001\u0000"+ - "\u0000\u0000\t\u0198\u0001\u0000\u0000\u0000\t\u019a\u0001\u0000\u0000"+ - "\u0000\t\u019c\u0001\u0000\u0000\u0000\t\u019e\u0001\u0000\u0000\u0000"+ - "\t\u01a0\u0001\u0000\u0000\u0000\t\u01a2\u0001\u0000\u0000\u0000\t\u01a4"+ - "\u0001\u0000\u0000\u0000\t\u01a6\u0001\u0000\u0000\u0000\t\u01a8\u0001"+ - "\u0000\u0000\u0000\t\u01aa\u0001\u0000\u0000\u0000\t\u01ac\u0001\u0000"+ - "\u0000\u0000\t\u01ae\u0001\u0000\u0000\u0000\n\u01b0\u0001\u0000\u0000"+ - "\u0000\n\u01b2\u0001\u0000\u0000\u0000\n\u01b4\u0001\u0000\u0000\u0000"+ - "\n\u01b6\u0001\u0000\u0000\u0000\n\u01b8\u0001\u0000\u0000\u0000\n\u01ba"+ - "\u0001\u0000\u0000\u0000\n\u01bc\u0001\u0000\u0000\u0000\n\u01be\u0001"+ - "\u0000\u0000\u0000\n\u01c0\u0001\u0000\u0000\u0000\n\u01c2\u0001\u0000"+ - "\u0000\u0000\n\u01c4\u0001\u0000\u0000\u0000\n\u01c6\u0001\u0000\u0000"+ - "\u0000\n\u01c8\u0001\u0000\u0000\u0000\n\u01ca\u0001\u0000\u0000\u0000"+ - "\n\u01cc\u0001\u0000\u0000\u0000\n\u01ce\u0001\u0000\u0000\u0000\n\u01d0"+ - "\u0001\u0000\u0000\u0000\n\u01d2\u0001\u0000\u0000\u0000\n\u01d4\u0001"+ - "\u0000\u0000\u0000\n\u01d6\u0001\u0000\u0000\u0000\n\u01d8\u0001\u0000"+ - "\u0000\u0000\n\u01da\u0001\u0000\u0000\u0000\u000b\u01dc\u0001\u0000\u0000"+ - "\u0000\u000b\u01de\u0001\u0000\u0000\u0000\u000b\u01e0\u0001\u0000\u0000"+ - "\u0000\u000b\u01e2\u0001\u0000\u0000\u0000\u000b\u01e4\u0001\u0000\u0000"+ - "\u0000\u000b\u01e6\u0001\u0000\u0000\u0000\u000b\u01e8\u0001\u0000\u0000"+ - "\u0000\u000b\u01ea\u0001\u0000\u0000\u0000\u000b\u01ec\u0001\u0000\u0000"+ - "\u0000\u000b\u01ee\u0001\u0000\u0000\u0000\u000b\u01f0\u0001\u0000\u0000"+ - "\u0000\u000b\u01f2\u0001\u0000\u0000\u0000\u000b\u01f4\u0001\u0000\u0000"+ - "\u0000\u000b\u01f6\u0001\u0000\u0000\u0000\u000b\u01f8\u0001\u0000\u0000"+ - "\u0000\u000b\u01fa\u0001\u0000\u0000\u0000\u000b\u01fc\u0001\u0000\u0000"+ - "\u0000\f\u01fe\u0001\u0000\u0000\u0000\f\u0200\u0001\u0000\u0000\u0000"+ - "\f\u0202\u0001\u0000\u0000\u0000\f\u0204\u0001\u0000\u0000\u0000\r\u0206"+ - "\u0001\u0000\u0000\u0000\r\u0208\u0001\u0000\u0000\u0000\r\u020a\u0001"+ - "\u0000\u0000\u0000\r\u020c\u0001\u0000\u0000\u0000\u000e\u020e\u0001\u0000"+ - "\u0000\u0000\u0010\u0220\u0001\u0000\u0000\u0000\u0012\u0222\u0001\u0000"+ - "\u0000\u0000\u0014\u0269\u0001\u0000\u0000\u0000\u0016\u026b\u0001\u0000"+ - "\u0000\u0000\u0018\u027c\u0001\u0000\u0000\u0000\u001a\u027e\u0001\u0000"+ - "\u0000\u0000\u001c\u0284\u0001\u0000\u0000\u0000\u001e\u028e\u0001\u0000"+ - "\u0000\u0000 \u0294\u0001\u0000\u0000\u0000\"\u029b\u0001\u0000\u0000"+ - "\u0000$\u02a5\u0001\u0000\u0000\u0000&\u02ad\u0001\u0000\u0000\u0000("+ - "\u02b6\u0001\u0000\u0000\u0000*\u02c1\u0001\u0000\u0000\u0000,\u02ca\u0001"+ - "\u0000\u0000\u0000.\u02e1\u0001\u0000\u0000\u00000\u02f8\u0001\u0000\u0000"+ - "\u00002\u02fa\u0001\u0000\u0000\u00004\u0305\u0001\u0000\u0000\u00006"+ - "\u0311\u0001\u0000\u0000\u00008\u0318\u0001\u0000\u0000\u0000:\u0320\u0001"+ - "\u0000\u0000\u0000<\u032b\u0001\u0000\u0000\u0000>\u0337\u0001\u0000\u0000"+ - "\u0000@\u0340\u0001\u0000\u0000\u0000B\u034a\u0001\u0000\u0000\u0000D"+ - "\u0353\u0001\u0000\u0000\u0000F\u035f\u0001\u0000\u0000\u0000H\u036a\u0001"+ - "\u0000\u0000\u0000J\u0377\u0001\u0000\u0000\u0000L\u0386\u0001\u0000\u0000"+ - "\u0000N\u0396\u0001\u0000\u0000\u0000P\u03a7\u0001\u0000\u0000\u0000R"+ - "\u03af\u0001\u0000\u0000\u0000T\u03ba\u0001\u0000\u0000\u0000V\u03c0\u0001"+ - "\u0000\u0000\u0000X\u03c8\u0001\u0000\u0000\u0000Z\u03d3\u0001\u0000\u0000"+ - "\u0000\\\u03e1\u0001\u0000\u0000\u0000^\u03f3\u0001\u0000\u0000\u0000"+ - "`\u03ff\u0001\u0000\u0000\u0000b\u0408\u0001\u0000\u0000\u0000d\u0410"+ - "\u0001\u0000\u0000\u0000f\u0416\u0001\u0000\u0000\u0000h\u0421\u0001\u0000"+ - "\u0000\u0000j\u0427\u0001\u0000\u0000\u0000l\u042f\u0001\u0000\u0000\u0000"+ - "n\u0435\u0001\u0000\u0000\u0000p\u043e\u0001\u0000\u0000\u0000r\u0447"+ - "\u0001\u0000\u0000\u0000t\u044f\u0001\u0000\u0000\u0000v\u0458\u0001\u0000"+ - "\u0000\u0000x\u0462\u0001\u0000\u0000\u0000z\u046d\u0001\u0000\u0000\u0000"+ - "|\u0479\u0001\u0000\u0000\u0000~\u0486\u0001\u0000\u0000\u0000\u0080\u0491"+ - "\u0001\u0000\u0000\u0000\u0082\u049d\u0001\u0000\u0000\u0000\u0084\u04a6"+ - "\u0001\u0000\u0000\u0000\u0086\u04b2\u0001\u0000\u0000\u0000\u0088\u04bf"+ - "\u0001\u0000\u0000\u0000\u008a\u04c5\u0001\u0000\u0000\u0000\u008c\u04cf"+ - "\u0001\u0000\u0000\u0000\u008e\u04d8\u0001\u0000\u0000\u0000\u0090\u04e2"+ - "\u0001\u0000\u0000\u0000\u0092\u04ee\u0001\u0000\u0000\u0000\u0094\u04fd"+ - "\u0001\u0000\u0000\u0000\u0096\u0504\u0001\u0000\u0000\u0000\u0098\u0517"+ - "\u0001\u0000\u0000\u0000\u009a\u052c\u0001\u0000\u0000\u0000\u009c\u052e"+ - "\u0001\u0000\u0000\u0000\u009e\u053d\u0001\u0000\u0000\u0000\u00a0\u0550"+ - "\u0001\u0000\u0000\u0000\u00a2\u0560\u0001\u0000\u0000\u0000\u00a4\u0569"+ - "\u0001\u0000\u0000\u0000\u00a6\u059e\u0001\u0000\u0000\u0000\u00a8\u05a2"+ - "\u0001\u0000\u0000\u0000\u00aa\u05ab\u0001\u0000\u0000\u0000\u00ac\u05b6"+ - "\u0001\u0000\u0000\u0000\u00ae\u05ca\u0001\u0000\u0000\u0000\u00b0\u05ce"+ - "\u0001\u0000\u0000\u0000\u00b2\u05d6\u0001\u0000\u0000\u0000\u00b4\u05dd"+ - "\u0001\u0000\u0000\u0000\u00b6\u05e7\u0001\u0000\u0000\u0000\u00b8\u05f4"+ - "\u0001\u0000\u0000\u0000\u00ba\u05fd\u0001\u0000\u0000\u0000\u00bc\u0609"+ - "\u0001\u0000\u0000\u0000\u00be\u0653\u0001\u0000\u0000\u0000\u00c0\u0655"+ - "\u0001\u0000\u0000\u0000\u00c2\u065d\u0001\u0000\u0000\u0000\u00c4\u066f"+ - "\u0001\u0000\u0000\u0000\u00c6\u0675\u0001\u0000\u0000\u0000\u00c8\u0679"+ - "\u0001\u0000\u0000\u0000\u00ca\u067d\u0001\u0000\u0000\u0000\u00cc\u0682"+ - "\u0001\u0000\u0000\u0000\u00ce\u0688\u0001\u0000\u0000\u0000\u00d0\u068c"+ - "\u0001\u0000\u0000\u0000\u00d2\u0699\u0001\u0000\u0000\u0000\u00d4\u069d"+ - "\u0001\u0000\u0000\u0000\u00d6\u06af\u0001\u0000\u0000\u0000\u00d8\u06cb"+ - "\u0001\u0000\u0000\u0000\u00da\u06cf\u0001\u0000\u0000\u0000\u00dc\u06de"+ - "\u0001\u0000\u0000\u0000\u00de\u06e4\u0001\u0000\u0000\u0000\u00e0\u06eb"+ - "\u0001\u0000\u0000\u0000\u00e2\u06fc\u0001\u0000\u0000\u0000\u00e4\u0703"+ - "\u0001\u0000\u0000\u0000\u00e6\u0722\u0001\u0000\u0000\u0000\u00e8\u0732"+ - "\u0001\u0000\u0000\u0000\u00ea\u0735\u0001\u0000\u0000\u0000\u00ec\u0741"+ - "\u0001\u0000\u0000\u0000\u00ee\u0745\u0001\u0000\u0000\u0000\u00f0\u0749"+ - "\u0001\u0000\u0000\u0000\u00f2\u0750\u0001\u0000\u0000\u0000\u00f4\u0757"+ - "\u0001\u0000\u0000\u0000\u00f6\u075e\u0001\u0000\u0000\u0000\u00f8\u0760"+ - "\u0001\u0000\u0000\u0000\u00fa\u076a\u0001\u0000\u0000\u0000\u00fc\u0775"+ - "\u0001\u0000\u0000\u0000\u00fe\u077e\u0001\u0000\u0000\u0000\u0100\u0793"+ - "\u0001\u0000\u0000\u0000\u0102\u0795\u0001\u0000\u0000\u0000\u0104\u0797"+ - "\u0001\u0000\u0000\u0000\u0106\u079f\u0001\u0000\u0000\u0000\u0108\u07a5"+ - "\u0001\u0000\u0000\u0000\u010a\u088e\u0001\u0000\u0000\u0000\u010c\u0892"+ - "\u0001\u0000\u0000\u0000\u010e\u0896\u0001\u0000\u0000\u0000\u0110\u089b"+ - "\u0001\u0000\u0000\u0000\u0112\u08a6\u0001\u0000\u0000\u0000\u0114\u08aa"+ - "\u0001\u0000\u0000\u0000\u0116\u08af\u0001\u0000\u0000\u0000\u0118\u08b4"+ - "\u0001\u0000\u0000\u0000\u011a\u08b8\u0001\u0000\u0000\u0000\u011c\u08bc"+ - "\u0001\u0000\u0000\u0000\u011e\u08c1\u0001\u0000\u0000\u0000\u0120\u08c5"+ - "\u0001\u0000\u0000\u0000\u0122\u08ca\u0001\u0000\u0000\u0000\u0124\u08ce"+ - "\u0001\u0000\u0000\u0000\u0126\u08d3\u0001\u0000\u0000\u0000\u0128\u08de"+ - "\u0001\u0000\u0000\u0000\u012a\u08e2\u0001\u0000\u0000\u0000\u012c\u08e7"+ - "\u0001\u0000\u0000\u0000\u012e\u08ed\u0001\u0000\u0000\u0000\u0130\u08f1"+ - "\u0001\u0000\u0000\u0000\u0132\u08f5\u0001\u0000\u0000\u0000\u0134\u08fa"+ - "\u0001\u0000\u0000\u0000\u0136\u08fe\u0001\u0000\u0000\u0000\u0138\u0904"+ - "\u0001\u0000\u0000\u0000\u013a\u090e\u0001\u0000\u0000\u0000\u013c\u0914"+ - "\u0001\u0000\u0000\u0000\u013e\u0919\u0001\u0000\u0000\u0000\u0140\u091f"+ - "\u0001\u0000\u0000\u0000\u0142\u0924\u0001\u0000\u0000\u0000\u0144\u092a"+ - "\u0001\u0000\u0000\u0000\u0146\u0931\u0001\u0000\u0000\u0000\u0148\u0937"+ - "\u0001\u0000\u0000\u0000\u014a\u093d\u0001\u0000\u0000\u0000\u014c\u0943"+ - "\u0001\u0000\u0000\u0000\u014e\u0947\u0001\u0000\u0000\u0000\u0150\u094d"+ - "\u0001\u0000\u0000\u0000\u0152\u0953\u0001\u0000\u0000\u0000\u0154\u0958"+ - "\u0001\u0000\u0000\u0000\u0156\u095d\u0001\u0000\u0000\u0000\u0158\u0962"+ - "\u0001\u0000\u0000\u0000\u015a\u0967\u0001\u0000\u0000\u0000\u015c\u096c"+ - "\u0001\u0000\u0000\u0000\u015e\u0973\u0001\u0000\u0000\u0000\u0160\u0975"+ - "\u0001\u0000\u0000\u0000\u0162\u0979\u0001\u0000\u0000\u0000\u0164\u097e"+ - "\u0001\u0000\u0000\u0000\u0166\u0989\u0001\u0000\u0000\u0000\u0168\u098d"+ - "\u0001\u0000\u0000\u0000\u016a\u0992\u0001\u0000\u0000\u0000\u016c\u0997"+ - "\u0001\u0000\u0000\u0000\u016e\u099a\u0001\u0000\u0000\u0000\u0170\u099e"+ - "\u0001\u0000\u0000\u0000\u0172\u09a4\u0001\u0000\u0000\u0000\u0174\u09aa"+ - "\u0001\u0000\u0000\u0000\u0176\u09b0\u0001\u0000\u0000\u0000\u0178\u09b6"+ - "\u0001\u0000\u0000\u0000\u017a\u09bc\u0001\u0000\u0000\u0000\u017c\u09bf"+ - "\u0001\u0000\u0000\u0000\u017e\u09c2\u0001\u0000\u0000\u0000\u0180\u09c5"+ - "\u0001\u0000\u0000\u0000\u0182\u09c9\u0001\u0000\u0000\u0000\u0184\u09cc"+ - "\u0001\u0000\u0000\u0000\u0186\u09d3\u0001\u0000\u0000\u0000\u0188\u09d7"+ - "\u0001\u0000\u0000\u0000\u018a\u09dc\u0001\u0000\u0000\u0000\u018c\u09e0"+ - "\u0001\u0000\u0000\u0000\u018e\u09e5\u0001\u0000\u0000\u0000\u0190\u09e9"+ - "\u0001\u0000\u0000\u0000\u0192\u09ec\u0001\u0000\u0000\u0000\u0194\u09ef"+ - "\u0001\u0000\u0000\u0000\u0196\u09f4\u0001\u0000\u0000\u0000\u0198\u09f9"+ - "\u0001\u0000\u0000\u0000\u019a\u09fe\u0001\u0000\u0000\u0000\u019c\u0a03"+ - "\u0001\u0000\u0000\u0000\u019e\u0a05\u0001\u0000\u0000\u0000\u01a0\u0a09"+ - "\u0001\u0000\u0000\u0000\u01a2\u0a0c\u0001\u0000\u0000\u0000\u01a4\u0a10"+ - "\u0001\u0000\u0000\u0000\u01a6\u0a12\u0001\u0000\u0000\u0000\u01a8\u0a16"+ - "\u0001\u0000\u0000\u0000\u01aa\u0a1c\u0001\u0000\u0000\u0000\u01ac\u0a1e"+ - "\u0001\u0000\u0000\u0000\u01ae\u0a22\u0001\u0000\u0000\u0000\u01b0\u0a27"+ - "\u0001\u0000\u0000\u0000\u01b2\u0a31\u0001\u0000\u0000\u0000\u01b4\u0a45"+ - "\u0001\u0000\u0000\u0000\u01b6\u0a4f\u0001\u0000\u0000\u0000\u01b8\u0a54"+ - "\u0001\u0000\u0000\u0000\u01ba\u0a58\u0001\u0000\u0000\u0000\u01bc\u0a5c"+ - "\u0001\u0000\u0000\u0000\u01be\u0a60\u0001\u0000\u0000\u0000\u01c0\u0a66"+ - "\u0001\u0000\u0000\u0000\u01c2\u0a6a\u0001\u0000\u0000\u0000\u01c4\u0a6e"+ - "\u0001\u0000\u0000\u0000\u01c6\u0a76\u0001\u0000\u0000\u0000\u01c8\u0a7e"+ - "\u0001\u0000\u0000\u0000\u01ca\u0a83\u0001\u0000\u0000\u0000\u01cc\u0a8e"+ - "\u0001\u0000\u0000\u0000\u01ce\u0a93\u0001\u0000\u0000\u0000\u01d0\u0a97"+ - "\u0001\u0000\u0000\u0000\u01d2\u0a9c\u0001\u0000\u0000\u0000\u01d4\u0aa0"+ - "\u0001\u0000\u0000\u0000\u01d6\u0aa4\u0001\u0000\u0000\u0000\u01d8\u0aa8"+ - "\u0001\u0000\u0000\u0000\u01da\u0aad\u0001\u0000\u0000\u0000\u01dc\u0ab1"+ - "\u0001\u0000\u0000\u0000\u01de\u0ab6\u0001\u0000\u0000\u0000\u01e0\u0ac0"+ - "\u0001\u0000\u0000\u0000\u01e2\u0ace\u0001\u0000\u0000\u0000\u01e4\u0ad2"+ - "\u0001\u0000\u0000\u0000\u01e6\u0ad6\u0001\u0000\u0000\u0000\u01e8\u0ada"+ - "\u0001\u0000\u0000\u0000\u01ea\u0ae0\u0001\u0000\u0000\u0000\u01ec\u0ae4"+ - "\u0001\u0000\u0000\u0000\u01ee\u0ae8\u0001\u0000\u0000\u0000\u01f0\u0aec"+ - "\u0001\u0000\u0000\u0000\u01f2\u0af0\u0001\u0000\u0000\u0000\u01f4\u0af5"+ - "\u0001\u0000\u0000\u0000\u01f6\u0afa\u0001\u0000\u0000\u0000\u01f8\u0afe"+ - "\u0001\u0000\u0000\u0000\u01fa\u0b02\u0001\u0000\u0000\u0000\u01fc\u0b07"+ - "\u0001\u0000\u0000\u0000\u01fe\u0b0b\u0001\u0000\u0000\u0000\u0200\u0b1b"+ - "\u0001\u0000\u0000\u0000\u0202\u0b20\u0001\u0000\u0000\u0000\u0204\u0b25"+ - "\u0001\u0000\u0000\u0000\u0206\u0b29\u0001\u0000\u0000\u0000\u0208\u0b31"+ - "\u0001\u0000\u0000\u0000\u020a\u0b36\u0001\u0000\u0000\u0000\u020c\u0b3a"+ - "\u0001\u0000\u0000\u0000\u020e\u0212\u0007\u0000\u0000\u0000\u020f\u0211"+ - "\u0007\u0001\u0000\u0000\u0210\u020f\u0001\u0000\u0000\u0000\u0211\u0214"+ - "\u0001\u0000\u0000\u0000\u0212\u0210\u0001\u0000\u0000\u0000\u0212\u0213"+ - "\u0001\u0000\u0000\u0000\u0213\u000f\u0001\u0000\u0000\u0000\u0214\u0212"+ - "\u0001\u0000\u0000\u0000\u0215\u0217\u0007\u0002\u0000\u0000\u0216\u0215"+ - "\u0001\u0000\u0000\u0000\u0216\u0217\u0001\u0000\u0000\u0000\u0217\u0218"+ - "\u0001\u0000\u0000\u0000\u0218\u021c\u0007\u0000\u0000\u0000\u0219\u021b"+ - "\u0007\u0003\u0000\u0000\u021a\u0219\u0001\u0000\u0000\u0000\u021b\u021e"+ - "\u0001\u0000\u0000\u0000\u021c\u021a\u0001\u0000\u0000\u0000\u021c\u021d"+ - "\u0001\u0000\u0000\u0000\u021d\u0221\u0001\u0000\u0000\u0000\u021e\u021c"+ - "\u0001\u0000\u0000\u0000\u021f\u0221\u0003\u0016\u0004\u0000\u0220\u0216"+ - "\u0001\u0000\u0000\u0000\u0220\u021f\u0001\u0000\u0000\u0000\u0221\u0011"+ - "\u0001\u0000\u0000\u0000\u0222\u0223\u0003\u00f0q\u0000\u0223\u0227\u0005"+ - "(\u0000\u0000\u0224\u0226\u0003\u00f0q\u0000\u0225\u0224\u0001\u0000\u0000"+ - "\u0000\u0226\u0229\u0001\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000"+ - "\u0000\u0227\u0228\u0001\u0000\u0000\u0000\u0228\u0234\u0001\u0000\u0000"+ - "\u0000\u0229\u0227\u0001\u0000\u0000\u0000\u022a\u022e\u0005,\u0000\u0000"+ - "\u022b\u022d\u0005 \u0000\u0000\u022c\u022b\u0001\u0000\u0000\u0000\u022d"+ - "\u0230\u0001\u0000\u0000\u0000\u022e\u022c\u0001\u0000\u0000\u0000\u022e"+ - "\u022f\u0001\u0000\u0000\u0000\u022f\u0231\u0001\u0000\u0000\u0000\u0230"+ - "\u022e\u0001\u0000\u0000\u0000\u0231\u0233\u0003\u00f0q\u0000\u0232\u022a"+ - "\u0001\u0000\u0000\u0000\u0233\u0236\u0001\u0000\u0000\u0000\u0234\u0232"+ - "\u0001\u0000\u0000\u0000\u0234\u0235\u0001\u0000\u0000\u0000\u0235\u023a"+ - "\u0001\u0000\u0000\u0000\u0236\u0234\u0001\u0000\u0000\u0000\u0237\u0239"+ - "\u0005 \u0000\u0000\u0238\u0237\u0001\u0000\u0000\u0000\u0239\u023c\u0001"+ - "\u0000\u0000\u0000\u023a\u0238\u0001\u0000\u0000\u0000\u023a\u023b\u0001"+ - "\u0000\u0000\u0000\u023b\u023d\u0001\u0000\u0000\u0000\u023c\u023a\u0001"+ - "\u0000\u0000\u0000\u023d\u0241\u0005)\u0000\u0000\u023e\u0240\u0005 \u0000"+ - "\u0000\u023f\u023e\u0001\u0000\u0000\u0000\u0240\u0243\u0001\u0000\u0000"+ - "\u0000\u0241\u023f\u0001\u0000\u0000\u0000\u0241\u0242\u0001\u0000\u0000"+ - "\u0000\u0242\u0246\u0001\u0000\u0000\u0000\u0243\u0241\u0001\u0000\u0000"+ - "\u0000\u0244\u0245\u0005{\u0000\u0000\u0245\u0247\u0004\u0002\u0000\u0000"+ - "\u0246\u0244\u0001\u0000\u0000\u0000\u0246\u0247\u0001\u0000\u0000\u0000"+ - "\u0247\u0013\u0001\u0000\u0000\u0000\u0248\u0249\u0007\u0004\u0000\u0000"+ - "\u0249\u0253\u0003\u0010\u0001\u0000\u024a\u024c\u0005 \u0000\u0000\u024b"+ - "\u024a\u0001\u0000\u0000\u0000\u024c\u024f\u0001\u0000\u0000\u0000\u024d"+ - "\u024b\u0001\u0000\u0000\u0000\u024d\u024e\u0001\u0000\u0000\u0000\u024e"+ - "\u0250\u0001\u0000\u0000\u0000\u024f\u024d\u0001\u0000\u0000\u0000\u0250"+ - "\u0252\u0003\u0010\u0001\u0000\u0251\u024d\u0001\u0000\u0000\u0000\u0252"+ - "\u0255\u0001\u0000\u0000\u0000\u0253\u0251\u0001\u0000\u0000\u0000\u0253"+ - "\u0254\u0001\u0000\u0000\u0000\u0254\u0256\u0001\u0000\u0000\u0000\u0255"+ - "\u0253\u0001\u0000\u0000\u0000\u0256\u0257\u0007\u0004\u0000\u0000\u0257"+ - "\u026a\u0001\u0000\u0000\u0000\u0258\u0259\u0005\"\u0000\u0000\u0259\u0263"+ - "\u0003\u0010\u0001\u0000\u025a\u025c\u0005 \u0000\u0000\u025b\u025a\u0001"+ - "\u0000\u0000\u0000\u025c\u025f\u0001\u0000\u0000\u0000\u025d\u025b\u0001"+ - "\u0000\u0000\u0000\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u0260\u0001"+ - "\u0000\u0000\u0000\u025f\u025d\u0001\u0000\u0000\u0000\u0260\u0262\u0003"+ - "\u0010\u0001\u0000\u0261\u025d\u0001\u0000\u0000\u0000\u0262\u0265\u0001"+ - "\u0000\u0000\u0000\u0263\u0261\u0001\u0000\u0000\u0000\u0263\u0264\u0001"+ - "\u0000\u0000\u0000\u0264\u0266\u0001\u0000\u0000\u0000\u0265\u0263\u0001"+ - "\u0000\u0000\u0000\u0266\u0267\u0007\u0004\u0000\u0000\u0267\u0268\u0005"+ - "\"\u0000\u0000\u0268\u026a\u0001\u0000\u0000\u0000\u0269\u0248\u0001\u0000"+ - "\u0000\u0000\u0269\u0258\u0001\u0000\u0000\u0000\u026a\u0015\u0001\u0000"+ - "\u0000\u0000\u026b\u026c\u0005[\u0000\u0000\u026c\u0270\u0003\u00f4s\u0000"+ - "\u026d\u026e\u0003\u00ean\u0000\u026e\u026f\u0003\u0018\u0005\u0000\u026f"+ - "\u0271\u0001\u0000\u0000\u0000\u0270\u026d\u0001\u0000\u0000\u0000\u0270"+ - "\u0271\u0001\u0000\u0000\u0000\u0271\u0272\u0001\u0000\u0000\u0000\u0272"+ - "\u0273\u0005]\u0000\u0000\u0273\u0017\u0001\u0000\u0000\u0000\u0274\u0275"+ - "\u0005\"\u0000\u0000\u0275\u0276\u0003\u00f4s\u0000\u0276\u0277\u0005"+ - "\"\u0000\u0000\u0277\u027d\u0001\u0000\u0000\u0000\u0278\u0279\u0007\u0004"+ - "\u0000\u0000\u0279\u027a\u0003\u00f4s\u0000\u027a\u027b\u0007\u0004\u0000"+ - "\u0000\u027b\u027d\u0001\u0000\u0000\u0000\u027c\u0274\u0001\u0000\u0000"+ - "\u0000\u027c\u0278\u0001\u0000\u0000\u0000\u027d\u0019\u0001\u0000\u0000"+ - "\u0000\u027e\u027f\u0005@\u0000\u0000\u027f\u0280\u0007\u0005\u0000\u0000"+ - "\u0280\u0281\u0007\u0006\u0000\u0000\u0281\u0282\u0001\u0000\u0000\u0000"+ - "\u0282\u0283\u0006\u0006\u0000\u0000\u0283\u001b\u0001\u0000\u0000\u0000"+ - "\u0284\u0285\u0005@\u0000\u0000\u0285\u0286\u0007\u0007\u0000\u0000\u0286"+ - "\u0287\u0007\b\u0000\u0000\u0287\u0288\u0007\t\u0000\u0000\u0288\u0289"+ - "\u0007\u0007\u0000\u0000\u0289\u028a\u0007\u0005\u0000\u0000\u028a\u028b"+ - "\u0007\u0006\u0000\u0000\u028b\u028c\u0001\u0000\u0000\u0000\u028c\u028d"+ - "\u0006\u0007\u0000\u0000\u028d\u001d\u0001\u0000\u0000\u0000\u028e\u028f"+ - "\u0005@\u0000\u0000\u028f\u0290\u0007\u0007\u0000\u0000\u0290\u0291\u0007"+ - "\b\u0000\u0000\u0291\u0292\u0007\t\u0000\u0000\u0292\u0293\u0007\u0007"+ - "\u0000\u0000\u0293\u001f\u0001\u0000\u0000\u0000\u0294\u0295\u0005@\u0000"+ - "\u0000\u0295\u0296\u0007\u0007\u0000\u0000\u0296\u0297\u0007\n\u0000\u0000"+ - "\u0297\u0298\u0007\u000b\u0000\u0000\u0298\u0299\u0007\u0005\u0000\u0000"+ - "\u0299\u029a\u0007\u0006\u0000\u0000\u029a!\u0001\u0000\u0000\u0000\u029b"+ - "\u029c\u0005@\u0000\u0000\u029c\u029d\u0007\t\u0000\u0000\u029d\u029e"+ - "\u0007\f\u0000\u0000\u029e\u029f\u0007\u0005\u0000\u0000\u029f\u02a0\u0007"+ - "\r\u0000\u0000\u02a0\u02a1\u0007\u000e\u0000\u0000\u02a1\u02a2\u0007\u000f"+ - "\u0000\u0000\u02a2\u02a3\u0001\u0000\u0000\u0000\u02a3\u02a4\u0006\n\u0001"+ - "\u0000\u02a4#\u0001\u0000\u0000\u0000\u02a5\u02a6\u0005@\u0000\u0000\u02a6"+ - "\u02a7\u0007\u000e\u0000\u0000\u02a7\u02a8\u0007\u0010\u0000\u0000\u02a8"+ - "\u02a9\u0007\t\u0000\u0000\u02a9\u02aa\u0007\u0007\u0000\u0000\u02aa\u02ab"+ - "\u0001\u0000\u0000\u0000\u02ab\u02ac\u0006\u000b\u0001\u0000\u02ac%\u0001"+ - "\u0000\u0000\u0000\u02ad\u02ae\u0005@\u0000\u0000\u02ae\u02af\u0007\u000b"+ - "\u0000\u0000\u02af\u02b0\u0007\u0007\u0000\u0000\u02b0\u02b1\u0007\u0006"+ - "\u0000\u0000\u02b1\u02b2\u0007\u0010\u0000\u0000\u02b2\u02b3\u0007\u0011"+ - "\u0000\u0000\u02b3\u02b4\u0007\b\u0000\u0000\u02b4\u02b5\u0007\r\u0000"+ - "\u0000\u02b5\'\u0001\u0000\u0000\u0000\u02b6\u02b7\u0005@\u0000\u0000"+ - "\u02b7\u02b8\u0007\u0007\u0000\u0000\u02b8\u02b9\u0007\n\u0000\u0000\u02b9"+ - "\u02ba\u0007\u000b\u0000\u0000\u02ba\u02bb\u0007\t\u0000\u0000\u02bb\u02bc"+ - "\u0007\f\u0000\u0000\u02bc\u02bd\u0007\u0005\u0000\u0000\u02bd\u02be\u0007"+ - "\r\u0000\u0000\u02be\u02bf\u0007\u000e\u0000\u0000\u02bf\u02c0\u0007\u000f"+ - "\u0000\u0000\u02c0)\u0001\u0000\u0000\u0000\u02c1\u02c2\u0005@\u0000\u0000"+ - "\u02c2\u02c3\u0007\u0007\u0000\u0000\u02c3\u02c4\u0007\u0012\u0000\u0000"+ - "\u02c4\u02c5\u0007\u0013\u0000\u0000\u02c5\u02c6\u0007\r\u0000\u0000\u02c6"+ - "\u02c7\u0007\u0014\u0000\u0000\u02c7\u02c8\u0001\u0000\u0000\u0000\u02c8"+ - "\u02c9\u0006\u000e\u0000\u0000\u02c9+\u0001\u0000\u0000\u0000\u02ca\u02cb"+ - "\u0005@\u0000\u0000\u02cb\u02cc\u0007\u0007\u0000\u0000\u02cc\u02cd\u0007"+ - "\n\u0000\u0000\u02cd\u02ce\u0007\u000b\u0000\u0000\u02ce\u02cf\u0007\u0007"+ - "\u0000\u0000\u02cf\u02d0\u0007\u0012\u0000\u0000\u02d0\u02d1\u0007\u0013"+ - "\u0000\u0000\u02d1\u02d2\u0007\r\u0000\u0000\u02d2\u02d3\u0007\u0014\u0000"+ - "\u0000\u02d3-\u0001\u0000\u0000\u0000\u02d4\u02d5\u0005@\u0000\u0000\u02d5"+ - "\u02d6\u0007\u0011\u0000\u0000\u02d6\u02d7\u0007\n\u0000\u0000\u02d7\u02d8"+ - "\u0007\b\u0000\u0000\u02d8\u02d9\u0007\u0007\u0000\u0000\u02d9\u02da\u0007"+ - "\t\u0000\u0000\u02da\u02e2\u0007\t\u0000\u0000\u02db\u02dc\u0005@\u0000"+ - "\u0000\u02dc\u02dd\u0007\u0005\u0000\u0000\u02dd\u02de\u0007\t\u0000\u0000"+ - "\u02de\u02df\u0007\t\u0000\u0000\u02df\u02e0\u0007\u0007\u0000\u0000\u02e0"+ - "\u02e2\u0007\r\u0000\u0000\u02e1\u02d4\u0001\u0000\u0000\u0000\u02e1\u02db"+ - "\u0001\u0000\u0000\u0000\u02e2\u02e3\u0001\u0000\u0000\u0000\u02e3\u02e4"+ - "\u0006\u0010\u0000\u0000\u02e4/\u0001\u0000\u0000\u0000\u02e5\u02e6\u0005"+ - "@\u0000\u0000\u02e6\u02e7\u0007\u0007\u0000\u0000\u02e7\u02e8\u0007\n"+ - "\u0000\u0000\u02e8\u02e9\u0007\u000b\u0000\u0000\u02e9\u02ea\u0007\u0011"+ - "\u0000\u0000\u02ea\u02eb\u0007\n\u0000\u0000\u02eb\u02ec\u0007\b\u0000"+ - "\u0000\u02ec\u02ed\u0007\u0007\u0000\u0000\u02ed\u02ee\u0007\t\u0000\u0000"+ - "\u02ee\u02f9\u0007\t\u0000\u0000\u02ef\u02f0\u0005@\u0000\u0000\u02f0"+ - "\u02f1\u0007\u0007\u0000\u0000\u02f1\u02f2\u0007\n\u0000\u0000\u02f2\u02f3"+ - "\u0007\u000b\u0000\u0000\u02f3\u02f4\u0007\u0005\u0000\u0000\u02f4\u02f5"+ - "\u0007\t\u0000\u0000\u02f5\u02f6\u0007\t\u0000\u0000\u02f6\u02f7\u0007"+ - "\u0007\u0000\u0000\u02f7\u02f9\u0007\r\u0000\u0000\u02f8\u02e5\u0001\u0000"+ - "\u0000\u0000\u02f8\u02ef\u0001\u0000\u0000\u0000\u02f91\u0001\u0000\u0000"+ - "\u0000\u02fa\u02fb\u0005@\u0000\u0000\u02fb\u02fc\u0007\u0006\u0000\u0000"+ - "\u02fc\u02fd\u0007\u0015\u0000\u0000\u02fd\u02fe\u0007\u0016\u0000\u0000"+ - "\u02fe\u02ff\u0007\u0007\u0000\u0000\u02ff\u0300\u0007\u0010\u0000\u0000"+ - "\u0300\u0301\u0007\u000e\u0000\u0000\u0301\u0302\u0007\u000f\u0000\u0000"+ - "\u0302\u0303\u0001\u0000\u0000\u0000\u0303\u0304\u0006\u0012\u0002\u0000"+ - "\u03043\u0001\u0000\u0000\u0000\u0305\u0306\u0005@\u0000\u0000\u0306\u0307"+ - "\u0007\u0007\u0000\u0000\u0307\u0308\u0007\n\u0000\u0000\u0308\u0309\u0007"+ - "\u000b\u0000\u0000\u0309\u030a\u0007\u0006\u0000\u0000\u030a\u030b\u0007"+ - "\u0015\u0000\u0000\u030b\u030c\u0007\u0016\u0000\u0000\u030c\u030d\u0007"+ - "\u0007\u0000\u0000\u030d\u030e\u0007\u0010\u0000\u0000\u030e\u030f\u0007"+ - "\u000e\u0000\u0000\u030f\u0310\u0007\u000f\u0000\u0000\u03105\u0001\u0000"+ - "\u0000\u0000\u0311\u0312\u0005@\u0000\u0000\u0312\u0313\u0007\u0006\u0000"+ - "\u0000\u0313\u0314\u0007\u0015\u0000\u0000\u0314\u0315\u0007\u0016\u0000"+ - "\u0000\u0315\u0316\u0001\u0000\u0000\u0000\u0316\u0317\u0006\u0014\u0001"+ - "\u0000\u03177\u0001\u0000\u0000\u0000\u0318\u0319\u0005@\u0000\u0000\u0319"+ - "\u031a\u0007\u0007\u0000\u0000\u031a\u031b\u0007\n\u0000\u0000\u031b\u031c"+ - "\u0007\u000b\u0000\u0000\u031c\u031d\u0007\u0006\u0000\u0000\u031d\u031e"+ - "\u0007\u0015\u0000\u0000\u031e\u031f\u0007\u0016\u0000\u0000\u031f9\u0001"+ - "\u0000\u0000\u0000\u0320\u0321\u0005@\u0000\u0000\u0321\u0322\u0007\u0006"+ - "\u0000\u0000\u0322\u0323\u0007\u0015\u0000\u0000\u0323\u0324\u0007\u0016"+ - "\u0000\u0000\u0324\u0325\u0007\u0007\u0000\u0000\u0325\u0326\u0007\b\u0000"+ - "\u0000\u0326\u0327\u0007\t\u0000\u0000\u0327\u0328\u0007\u0007\u0000\u0000"+ - "\u0328\u0329\u0001\u0000\u0000\u0000\u0329\u032a\u0006\u0016\u0002\u0000"+ - "\u032a;\u0001\u0000\u0000\u0000\u032b\u032c\u0005@\u0000\u0000\u032c\u032d"+ - "\u0007\u0007\u0000\u0000\u032d\u032e\u0007\n\u0000\u0000\u032e\u032f\u0007"+ - "\u000b\u0000\u0000\u032f\u0330\u0007\u0006\u0000\u0000\u0330\u0331\u0007"+ - "\u0015\u0000\u0000\u0331\u0332\u0007\u0016\u0000\u0000\u0332\u0333\u0007"+ - "\u0007\u0000\u0000\u0333\u0334\u0007\b\u0000\u0000\u0334\u0335\u0007\t"+ - "\u0000\u0000\u0335\u0336\u0007\u0007\u0000\u0000\u0336=\u0001\u0000\u0000"+ - "\u0000\u0337\u0338\u0005@\u0000\u0000\u0338\u0339\u0007\f\u0000\u0000"+ - "\u0339\u033a\u0007\u000f\u0000\u0000\u033a\u033b\u0007\u0005\u0000\u0000"+ - "\u033b\u033c\u0007\b\u0000\u0000\u033c\u033d\u0007\u0007\u0000\u0000\u033d"+ - "\u033e\u0001\u0000\u0000\u0000\u033e\u033f\u0006\u0018\u0001\u0000\u033f"+ - "?\u0001\u0000\u0000\u0000\u0340\u0341\u0005@\u0000\u0000\u0341\u0342\u0007"+ - "\u0007\u0000\u0000\u0342\u0343\u0007\n\u0000\u0000\u0343\u0344\u0007\u000b"+ - "\u0000\u0000\u0344\u0345\u0007\f\u0000\u0000\u0345\u0346\u0007\u000f\u0000"+ - "\u0000\u0346\u0347\u0007\u0005\u0000\u0000\u0347\u0348\u0007\b\u0000\u0000"+ - "\u0348\u0349\u0007\u0007\u0000\u0000\u0349A\u0001\u0000\u0000\u0000\u034a"+ - "\u034b\u0005@\u0000\u0000\u034b\u034c\u0007\u0017\u0000\u0000\u034c\u034d"+ - "\u0007\u0016\u0000\u0000\u034d\u034e\u0007\u0007\u0000\u0000\u034e\u034f"+ - "\u0007\u0010\u0000\u0000\u034f\u0350\u0007\u0018\u0000\u0000\u0350\u0351"+ - "\u0001\u0000\u0000\u0000\u0351\u0352\u0006\u001a\u0001\u0000\u0352C\u0001"+ - "\u0000\u0000\u0000\u0353\u0354\u0005@\u0000\u0000\u0354\u0355\u0007\u000e"+ - "\u0000\u0000\u0355\u0356\u0007\u0015\u0000\u0000\u0356\u0357\u0007\n\u0000"+ - "\u0000\u0357\u0358\u0007\r\u0000\u0000\u0358\u0359\u0007\u0005\u0000\u0000"+ - "\u0359\u035a\u0007\n\u0000\u0000\u035a\u035b\u0007\u0011\u0000\u0000\u035b"+ - "\u035c\u0007\u0007\u0000\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d"+ - "\u035e\u0006\u001b\u0001\u0000\u035eE\u0001\u0000\u0000\u0000\u035f\u0360"+ - "\u0005@\u0000\u0000\u0360\u0361\u0007\u0005\u0000\u0000\u0361\u0362\u0007"+ - "\n\u0000\u0000\u0362\u0363\u0007\u000e\u0000\u0000\u0363\u0364\u0007\b"+ - "\u0000\u0000\u0364\u0365\u0007\u0011\u0000\u0000\u0365\u0366\u0007\u000b"+ - "\u0000\u0000\u0366\u0367\u0007\u0007\u0000\u0000\u0367\u0368\u0001\u0000"+ - "\u0000\u0000\u0368\u0369\u0006\u001c\u0003\u0000\u0369G\u0001\u0000\u0000"+ - "\u0000\u036a\u036b\u0005@\u0000\u0000\u036b\u036c\u0007\u0005\u0000\u0000"+ - "\u036c\u036d\u0007\n\u0000\u0000\u036d\u036e\u0007\u000e\u0000\u0000\u036e"+ - "\u036f\u0007\b\u0000\u0000\u036f\u0370\u0007\u0011\u0000\u0000\u0370\u0371"+ - "\u0007\u000b\u0000\u0000\u0371\u0372\u0007\u0007\u0000\u0000\u0372\u0373"+ - "\u0007\u0005\u0000\u0000\u0373\u0374\u0007\u0006\u0000\u0000\u0374\u0375"+ - "\u0001\u0000\u0000\u0000\u0375\u0376\u0006\u001d\u0003\u0000\u0376I\u0001"+ - "\u0000\u0000\u0000\u0377\u0378\u0005@\u0000\u0000\u0378\u0379\u0007\u0005"+ - "\u0000\u0000\u0379\u037a\u0007\n\u0000\u0000\u037a\u037b\u0007\u000e\u0000"+ - "\u0000\u037b\u037c\u0007\b\u0000\u0000\u037c\u037d\u0007\u0011\u0000\u0000"+ - "\u037d\u037e\u0007\u000b\u0000\u0000\u037e\u037f\u0007\u0007\u0000\u0000"+ - "\u037f\u0380\u0007\f\u0000\u0000\u0380\u0381\u0007\u000f\u0000\u0000\u0381"+ - "\u0382\u0007\u0007\u0000\u0000\u0382\u0383\u0007\n\u0000\u0000\u0383\u0384"+ - "\u0001\u0000\u0000\u0000\u0384\u0385\u0006\u001e\u0003\u0000\u0385K\u0001"+ - "\u0000\u0000\u0000\u0386\u0387\u0005@\u0000\u0000\u0387\u0388\u0007\u0005"+ - "\u0000\u0000\u0388\u0389\u0007\n\u0000\u0000\u0389\u038a\u0007\u000e\u0000"+ - "\u0000\u038a\u038b\u0007\b\u0000\u0000\u038b\u038c\u0007\u0011\u0000\u0000"+ - "\u038c\u038d\u0007\u000b\u0000\u0000\u038d\u038e\u0007\u0007\u0000\u0000"+ - "\u038e\u038f\u0007\u0006\u0000\u0000\u038f\u0390\u0007\u0005\u0000\u0000"+ - "\u0390\u0391\u0007\u0016\u0000\u0000\u0391\u0392\u0007\t\u0000\u0000\u0392"+ - "\u0393\u0007\r\u0000\u0000\u0393\u0394\u0001\u0000\u0000\u0000\u0394\u0395"+ - "\u0006\u001f\u0003\u0000\u0395M\u0001\u0000\u0000\u0000\u0396\u0397\u0005"+ - "@\u0000\u0000\u0397\u0398\u0007\u0005\u0000\u0000\u0398\u0399\u0007\n"+ - "\u0000\u0000\u0399\u039a\u0007\u000e\u0000\u0000\u039a\u039b\u0007\b\u0000"+ - "\u0000\u039b\u039c\u0007\u0011\u0000\u0000\u039c\u039d\u0007\u000b\u0000"+ - "\u0000\u039d\u039e\u0007\u0007\u0000\u0000\u039e\u039f\u0007\u0011\u0000"+ - "\u0000\u039f\u03a0\u0007\n\u0000\u0000\u03a0\u03a1\u0007\b\u0000\u0000"+ - "\u03a1\u03a2\u0007\u0007\u0000\u0000\u03a2\u03a3\u0007\t\u0000\u0000\u03a3"+ - "\u03a4\u0007\t\u0000\u0000\u03a4\u03a5\u0001\u0000\u0000\u0000\u03a5\u03a6"+ - "\u0006 \u0003\u0000\u03a6O\u0001\u0000\u0000\u0000\u03a7\u03a8\u0005@"+ - "\u0000\u0000\u03a8\u03a9\u0007\u0007\u0000\u0000\u03a9\u03aa\u0007\u0010"+ - "\u0000\u0000\u03aa\u03ab\u0007\u000e\u0000\u0000\u03ab\u03ac\u0007\u000f"+ - "\u0000\u0000\u03ac\u03ad\u0001\u0000\u0000\u0000\u03ad\u03ae\u0006!\u0003"+ - "\u0000\u03aeQ\u0001\u0000\u0000\u0000\u03af\u03b0\u0005@\u0000\u0000\u03b0"+ - "\u03b1\u0007\u0007\u0000\u0000\u03b1\u03b2\u0007\u0019\u0000\u0000\u03b2"+ - "\u03b3\u0007\r\u0000\u0000\u03b3\u03b4\u0007\u0007\u0000\u0000\u03b4\u03b5"+ - "\u0007\n\u0000\u0000\u03b5\u03b6\u0007\u000b\u0000\u0000\u03b6\u03b7\u0007"+ - "\t\u0000\u0000\u03b7\u03b8\u0001\u0000\u0000\u0000\u03b8\u03b9\u0006\""+ - "\u0003\u0000\u03b9S\u0001\u0000\u0000\u0000\u03ba\u03bb\u0005@\u0000\u0000"+ - "\u03bb\u03bc\u0007\u001a\u0000\u0000\u03bc\u03bd\u0007\t\u0000\u0000\u03bd"+ - "\u03be\u0001\u0000\u0000\u0000\u03be\u03bf\u0006#\u0000\u0000\u03bfU\u0001"+ - "\u0000\u0000\u0000\u03c0\u03c1\u0005@\u0000\u0000\u03c1\u03c2\u0007\u001a"+ - "\u0000\u0000\u03c2\u03c3\u0007\t\u0000\u0000\u03c3\u03c4\u0007\u0015\u0000"+ - "\u0000\u03c4\u03c5\u0007\n\u0000\u0000\u03c5\u03c6\u0001\u0000\u0000\u0000"+ - "\u03c6\u03c7\u0006$\u0000\u0000\u03c7W\u0001\u0000\u0000\u0000\u03c8\u03c9"+ - "\u0005@\u0000\u0000\u03c9\u03ca\u0007\t\u0000\u0000\u03ca\u03cb\u0007"+ - "\u0007\u0000\u0000\u03cb\u03cc\u0007\u000e\u0000\u0000\u03cc\u03cd\u0007"+ - "\r\u0000\u0000\u03cd\u03ce\u0007\u0005\u0000\u0000\u03ce\u03cf\u0007\u0015"+ - "\u0000\u0000\u03cf\u03d0\u0007\n\u0000\u0000\u03d0\u03d1\u0001\u0000\u0000"+ - "\u0000\u03d1\u03d2\u0006%\u0003\u0000\u03d2Y\u0001\u0000\u0000\u0000\u03d3"+ - "\u03d4\u0005@\u0000\u0000\u03d4\u03d5\u0007\u000f\u0000\u0000\u03d5\u03d6"+ - "\u0007\u0010\u0000\u0000\u03d6\u03d7\u0007\t\u0000\u0000\u03d7\u03d8\u0007"+ - "\t\u0000\u0000\u03d8\u03d9\u0007\u0007\u0000\u0000\u03d9\u03da\u0007\u000e"+ - "\u0000\u0000\u03da\u03db\u0007\r\u0000\u0000\u03db\u03dc\u0007\u0005\u0000"+ - "\u0000\u03dc\u03dd\u0007\u0015\u0000\u0000\u03dd\u03de\u0007\n\u0000\u0000"+ - "\u03de\u03df\u0001\u0000\u0000\u0000\u03df\u03e0\u0006&\u0003\u0000\u03e0"+ - "[\u0001\u0000\u0000\u0000\u03e1\u03e2\u0005@\u0000\u0000\u03e2\u03e3\u0007"+ - "\t\u0000\u0000\u03e3\u03e4\u0007\u0007\u0000\u0000\u03e4\u03e5\u0007\u000e"+ + "\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f9\u0001"+ + "\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00fa\u0001\u00fa\u0001"+ + "\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fb\u0001\u00fb\u0001\u00fb\u0001"+ + "\u00fb\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001"+ + "\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fd\u0001\u00fd\u0001\u00fd\u0001"+ + "\u00fd\u0001\u00fd\u0001\u00fe\u0001\u00fe\u0001\u00fe\u0001\u00fe\u0001"+ + "\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0003\u0765\u0a44"+ + "\u0ad3\u0000\u0100\u000e\u0000\u0010\u0000\u0012\u0000\u0014\u0000\u0016"+ + "\u0000\u0018\u0000\u001a\u0019\u001c\u001a\u001e\u001b \u001c\"\u001d"+ + "$\u001e&\u001f( *!,\".#0$2%4&6\'8(:)<*>+@,B-D.F/H0J1L2N3P4R5T6V7X8Z9\\"+ + ":^;`f?h@jAlBnCpDrEtFvGxHzI|J~K\u0080L\u0082M\u0084N\u0086O\u0088"+ + "P\u008aQ\u008cR\u008eS\u0090T\u0092U\u0094V\u0096W\u0098X\u009aY\u009c"+ + "Z\u009e[\u00a0\\\u00a2]\u00a4^\u00a6_\u00a8`\u00aaa\u00acb\u00aec\u00b0"+ + "d\u00b2e\u00b4f\u00b6\u0000\u00b8g\u00bah\u00bci\u00bej\u00c0k\u00c2l"+ + "\u00c4m\u00c6n\u00c8o\u00cap\u00ccq\u00ce\u00a3\u00d0\u00a4\u00d2r\u00d4"+ + "s\u00d6\u0000\u00d8t\u00dau\u00dcv\u00de\u0000\u00e0\u0000\u00e2w\u00e4"+ + "x\u00e6y\u00e8z\u00ea{\u00ec|\u00ee}\u00f0\u0000\u00f2\u0000\u00f4\u0000"+ + "\u00f6\u0000\u00f8\u0000\u00fa\u0000\u00fc\u0000\u00fe\u0000\u0100\u0000"+ + "\u0102\u0000\u0104~\u0106\u0000\u0108\u0000\u010a\u0000\u010c\u0000\u010e"+ + "\u0000\u0110\u0000\u0112\u0000\u0114\u00a5\u0116\u007f\u0118\u00a6\u011a"+ + "\u00a7\u011c\u00a8\u011e\u0080\u0120\u0000\u0122\u0000\u0124\u0000\u0126"+ + "\u0000\u0128\u0000\u012a\u0000\u012c\u0081\u012e\u0000\u0130\u0000\u0132"+ + "\u0000\u0134\u0082\u0136\u0000\u0138\u0083\u013a\u0084\u013c\u0000\u013e"+ + "\u0000\u0140\u0000\u0142\u0000\u0144\u0000\u0146\u0000\u0148\u0000\u014a"+ + "\u0000\u014c\u0000\u014e\u0000\u0150\u0085\u0152\r\u0154\u0000\u0156\u0000"+ + "\u0158\u0000\u015a\u0000\u015c\u0000\u015e\u0086\u0160\u0000\u0162\u0000"+ + "\u0164\u0000\u0166\u0000\u0168\u0000\u016a\u0000\u016c\u0087\u016e\u0088"+ + "\u0170\u0000\u0172\u0089\u0174\u0000\u0176\u0000\u0178\u008a\u017a\u008b"+ + "\u017c\u008c\u017e\u008d\u0180\u0000\u0182\u008e\u0184\u0000\u0186\u0000"+ + "\u0188\u0000\u018a\u0000\u018c\u0000\u018e\u008f\u0190\u000f\u0192\u0090"+ + "\u0194\u0000\u0196\u0000\u0198\u0000\u019a\u0091\u019c\u0011\u019e\u0000"+ + "\u01a0\u0012\u01a2\u0000\u01a4\u0092\u01a6\u0093\u01a8\u0094\u01aa\u0095"+ + "\u01ac\u0000\u01ae\u0000\u01b0\u0096\u01b2\u0097\u01b4\u0098\u01b6\u0000"+ + "\u01b8\u0000\u01ba\u0000\u01bc\u00a9\u01be\u00aa\u01c0\u0000\u01c2\u0000"+ + "\u01c4\u0000\u01c6\u00ab\u01c8\u0000\u01ca\u0000\u01cc\u0000\u01ce\u0000"+ + "\u01d0\u0000\u01d2\u0000\u01d4\u0000\u01d6\u0099\u01d8\u0000\u01da\u009a"+ + "\u01dc\u009b\u01de\u009c\u01e0\u009d\u01e2\u0000\u01e4\u0000\u01e6\u0000"+ + "\u01e8\u0000\u01ea\u0015\u01ec\u0000\u01ee\u0000\u01f0\u0000\u01f2\u0000"+ + "\u01f4\u0000\u01f6\u0000\u01f8\u0000\u01fa\u0000\u01fc\u0000\u01fe\u0000"+ + "\u0200\u009e\u0202\u0000\u0204\u0000\u0206\u009f\u0208\u00a0\u020a\u00a1"+ + "\u020c\u00a2\u000e\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t"+ + "\n\u000b\f\r\'\u0003\u0000AZaz\u0080\u8000\ufffe\u0006\u0000-.0:AZ__a"+ + "z\u0080\u8000\ufffe\u0002\u0000##..\u0006\u0000--0:AZ__az\u0080\u8000"+ + "\ufffe\u0002\u0000\'\'\\\\\u0002\u0000IIii\u0002\u0000FFff\u0002\u0000"+ + "EEee\u0002\u0000LLll\u0002\u0000SSss\u0002\u0000NNnn\u0002\u0000DDdd\u0002"+ + "\u0000WWww\u0002\u0000TTtt\u0002\u0000CCcc\u0002\u0000HHhh\u0002\u0000"+ + "AAaa\u0002\u0000UUuu\u0002\u0000MMmm\u0002\u0000PPpp\u0002\u0000YYyy\u0002"+ + "\u0000OOoo\u0002\u0000RRrr\u0002\u0000BBbb\u0002\u0000KKkk\u0002\u0000"+ + "XXxx\u0002\u0000JJjj\u0002\u0000GGgg\u0002\u0000VVvv\u0002\u0000QQqq\u0003"+ + "\u0000\n\n\r\r \u0002\u0000\n\n\r\r\u0004\u0000AZ__az\u0080\u8000\ufffe"+ + "\u0005\u000009AZ__az\u0080\u8000\ufffe\u0006\u0000..09AZ__az\u0080\u8000"+ + "\ufffe\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002\u0000\"\"\\\\\u0001"+ + "\u0000 \u0003\u0000\t\n\r\r \u0bac\u0000\u001a\u0001\u0000\u0000\u0000"+ + "\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000"+ + "\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000"+ + "$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001"+ + "\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000"+ + "\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u0000"+ + "2\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006\u0001"+ + "\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000"+ + "\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000"+ + "@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001"+ + "\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000"+ + "\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0000"+ + "N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000\u0000R\u0001"+ + "\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V\u0001\u0000\u0000"+ + "\u0000\u0000X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000"+ + "\\\u0001\u0000\u0000\u0000\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001"+ + "\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000\u0000d\u0001\u0000\u0000"+ + "\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001\u0000\u0000\u0000\u0000"+ + "j\u0001\u0000\u0000\u0000\u0000l\u0001\u0000\u0000\u0000\u0000n\u0001"+ + "\u0000\u0000\u0000\u0000p\u0001\u0000\u0000\u0000\u0000r\u0001\u0000\u0000"+ + "\u0000\u0000t\u0001\u0000\u0000\u0000\u0000v\u0001\u0000\u0000\u0000\u0000"+ + "x\u0001\u0000\u0000\u0000\u0000z\u0001\u0000\u0000\u0000\u0000|\u0001"+ + "\u0000\u0000\u0000\u0000~\u0001\u0000\u0000\u0000\u0000\u0080\u0001\u0000"+ + "\u0000\u0000\u0000\u0082\u0001\u0000\u0000\u0000\u0000\u0084\u0001\u0000"+ + "\u0000\u0000\u0000\u0086\u0001\u0000\u0000\u0000\u0000\u0088\u0001\u0000"+ + "\u0000\u0000\u0000\u008a\u0001\u0000\u0000\u0000\u0000\u008c\u0001\u0000"+ + "\u0000\u0000\u0000\u008e\u0001\u0000\u0000\u0000\u0000\u0090\u0001\u0000"+ + "\u0000\u0000\u0000\u0092\u0001\u0000\u0000\u0000\u0000\u0094\u0001\u0000"+ + "\u0000\u0000\u0000\u0096\u0001\u0000\u0000\u0000\u0000\u0098\u0001\u0000"+ + "\u0000\u0000\u0000\u009a\u0001\u0000\u0000\u0000\u0000\u009c\u0001\u0000"+ + "\u0000\u0000\u0000\u009e\u0001\u0000\u0000\u0000\u0000\u00a0\u0001\u0000"+ + "\u0000\u0000\u0000\u00a2\u0001\u0000\u0000\u0000\u0000\u00a4\u0001\u0000"+ + "\u0000\u0000\u0000\u00a6\u0001\u0000\u0000\u0000\u0000\u00a8\u0001\u0000"+ + "\u0000\u0000\u0000\u00aa\u0001\u0000\u0000\u0000\u0000\u00ac\u0001\u0000"+ + "\u0000\u0000\u0000\u00ae\u0001\u0000\u0000\u0000\u0000\u00b0\u0001\u0000"+ + "\u0000\u0000\u0000\u00b2\u0001\u0000\u0000\u0000\u0000\u00b4\u0001\u0000"+ + "\u0000\u0000\u0000\u00b6\u0001\u0000\u0000\u0000\u0000\u00b8\u0001\u0000"+ + "\u0000\u0000\u0000\u00ba\u0001\u0000\u0000\u0000\u0000\u00bc\u0001\u0000"+ + "\u0000\u0000\u0000\u00be\u0001\u0000\u0000\u0000\u0000\u00c0\u0001\u0000"+ + "\u0000\u0000\u0000\u00c2\u0001\u0000\u0000\u0000\u0000\u00c4\u0001\u0000"+ + "\u0000\u0000\u0000\u00c6\u0001\u0000\u0000\u0000\u0000\u00c8\u0001\u0000"+ + "\u0000\u0000\u0000\u00ca\u0001\u0000\u0000\u0000\u0000\u00cc\u0001\u0000"+ + "\u0000\u0000\u0000\u00ce\u0001\u0000\u0000\u0000\u0000\u00d0\u0001\u0000"+ + "\u0000\u0000\u0000\u00d2\u0001\u0000\u0000\u0000\u0000\u00d4\u0001\u0000"+ + "\u0000\u0000\u0000\u00d6\u0001\u0000\u0000\u0000\u0000\u00d8\u0001\u0000"+ + "\u0000\u0000\u0000\u00da\u0001\u0000\u0000\u0000\u0000\u00dc\u0001\u0000"+ + "\u0000\u0000\u0000\u00de\u0001\u0000\u0000\u0000\u0000\u00e0\u0001\u0000"+ + "\u0000\u0000\u0000\u00e2\u0001\u0000\u0000\u0000\u0000\u00e4\u0001\u0000"+ + "\u0000\u0000\u0000\u00e6\u0001\u0000\u0000\u0000\u0000\u00e8\u0001\u0000"+ + "\u0000\u0000\u0000\u00ea\u0001\u0000\u0000\u0000\u0000\u00ec\u0001\u0000"+ + "\u0000\u0000\u0000\u00ee\u0001\u0000\u0000\u0000\u0000\u0104\u0001\u0000"+ + "\u0000\u0000\u0000\u0106\u0001\u0000\u0000\u0000\u0000\u0108\u0001\u0000"+ + "\u0000\u0000\u0000\u010a\u0001\u0000\u0000\u0000\u0001\u010c\u0001\u0000"+ + "\u0000\u0000\u0001\u010e\u0001\u0000\u0000\u0000\u0001\u0110\u0001\u0000"+ + "\u0000\u0000\u0001\u0112\u0001\u0000\u0000\u0000\u0001\u0114\u0001\u0000"+ + "\u0000\u0000\u0001\u0116\u0001\u0000\u0000\u0000\u0001\u0118\u0001\u0000"+ + "\u0000\u0000\u0001\u011a\u0001\u0000\u0000\u0000\u0001\u011c\u0001\u0000"+ + "\u0000\u0000\u0001\u011e\u0001\u0000\u0000\u0000\u0001\u0120\u0001\u0000"+ + "\u0000\u0000\u0002\u0122\u0001\u0000\u0000\u0000\u0002\u0124\u0001\u0000"+ + "\u0000\u0000\u0002\u0126\u0001\u0000\u0000\u0000\u0002\u0128\u0001\u0000"+ + "\u0000\u0000\u0002\u012a\u0001\u0000\u0000\u0000\u0002\u012c\u0001\u0000"+ + "\u0000\u0000\u0002\u012e\u0001\u0000\u0000\u0000\u0002\u0130\u0001\u0000"+ + "\u0000\u0000\u0002\u0132\u0001\u0000\u0000\u0000\u0002\u0134\u0001\u0000"+ + "\u0000\u0000\u0002\u0136\u0001\u0000\u0000\u0000\u0003\u0138\u0001\u0000"+ + "\u0000\u0000\u0003\u013a\u0001\u0000\u0000\u0000\u0003\u013c\u0001\u0000"+ + "\u0000\u0000\u0003\u013e\u0001\u0000\u0000\u0000\u0003\u0140\u0001\u0000"+ + "\u0000\u0000\u0004\u0142\u0001\u0000\u0000\u0000\u0004\u0144\u0001\u0000"+ + "\u0000\u0000\u0004\u0146\u0001\u0000\u0000\u0000\u0004\u0148\u0001\u0000"+ + "\u0000\u0000\u0004\u014a\u0001\u0000\u0000\u0000\u0004\u014c\u0001\u0000"+ + "\u0000\u0000\u0004\u014e\u0001\u0000\u0000\u0000\u0005\u0150\u0001\u0000"+ + "\u0000\u0000\u0005\u0152\u0001\u0000\u0000\u0000\u0005\u0154\u0001\u0000"+ + "\u0000\u0000\u0006\u0156\u0001\u0000\u0000\u0000\u0006\u0158\u0001\u0000"+ + "\u0000\u0000\u0006\u015a\u0001\u0000\u0000\u0000\u0006\u015c\u0001\u0000"+ + "\u0000\u0000\u0006\u015e\u0001\u0000\u0000\u0000\u0006\u0160\u0001\u0000"+ + "\u0000\u0000\u0006\u0162\u0001\u0000\u0000\u0000\u0006\u0164\u0001\u0000"+ + "\u0000\u0000\u0006\u0166\u0001\u0000\u0000\u0000\u0006\u0168\u0001\u0000"+ + "\u0000\u0000\u0006\u016a\u0001\u0000\u0000\u0000\u0006\u016c\u0001\u0000"+ + "\u0000\u0000\u0006\u016e\u0001\u0000\u0000\u0000\u0006\u0170\u0001\u0000"+ + "\u0000\u0000\u0007\u0172\u0001\u0000\u0000\u0000\u0007\u0174\u0001\u0000"+ + "\u0000\u0000\u0007\u0176\u0001\u0000\u0000\u0000\b\u0178\u0001\u0000\u0000"+ + "\u0000\b\u017a\u0001\u0000\u0000\u0000\b\u017c\u0001\u0000\u0000\u0000"+ + "\b\u017e\u0001\u0000\u0000\u0000\b\u0180\u0001\u0000\u0000\u0000\b\u0182"+ + "\u0001\u0000\u0000\u0000\b\u0184\u0001\u0000\u0000\u0000\b\u0186\u0001"+ + "\u0000\u0000\u0000\b\u0188\u0001\u0000\u0000\u0000\b\u018a\u0001\u0000"+ + "\u0000\u0000\b\u018c\u0001\u0000\u0000\u0000\t\u018e\u0001\u0000\u0000"+ + "\u0000\t\u0190\u0001\u0000\u0000\u0000\t\u0192\u0001\u0000\u0000\u0000"+ + "\t\u0194\u0001\u0000\u0000\u0000\t\u0196\u0001\u0000\u0000\u0000\t\u0198"+ + "\u0001\u0000\u0000\u0000\t\u019a\u0001\u0000\u0000\u0000\t\u019c\u0001"+ + "\u0000\u0000\u0000\t\u019e\u0001\u0000\u0000\u0000\t\u01a0\u0001\u0000"+ + "\u0000\u0000\t\u01a2\u0001\u0000\u0000\u0000\t\u01a4\u0001\u0000\u0000"+ + "\u0000\t\u01a6\u0001\u0000\u0000\u0000\t\u01a8\u0001\u0000\u0000\u0000"+ + "\t\u01aa\u0001\u0000\u0000\u0000\t\u01ac\u0001\u0000\u0000\u0000\t\u01ae"+ + "\u0001\u0000\u0000\u0000\n\u01b0\u0001\u0000\u0000\u0000\n\u01b2\u0001"+ + "\u0000\u0000\u0000\n\u01b4\u0001\u0000\u0000\u0000\n\u01b6\u0001\u0000"+ + "\u0000\u0000\n\u01b8\u0001\u0000\u0000\u0000\n\u01ba\u0001\u0000\u0000"+ + "\u0000\n\u01bc\u0001\u0000\u0000\u0000\n\u01be\u0001\u0000\u0000\u0000"+ + "\n\u01c0\u0001\u0000\u0000\u0000\n\u01c2\u0001\u0000\u0000\u0000\n\u01c4"+ + "\u0001\u0000\u0000\u0000\n\u01c6\u0001\u0000\u0000\u0000\n\u01c8\u0001"+ + "\u0000\u0000\u0000\n\u01ca\u0001\u0000\u0000\u0000\n\u01cc\u0001\u0000"+ + "\u0000\u0000\n\u01ce\u0001\u0000\u0000\u0000\n\u01d0\u0001\u0000\u0000"+ + "\u0000\n\u01d2\u0001\u0000\u0000\u0000\n\u01d4\u0001\u0000\u0000\u0000"+ + "\n\u01d6\u0001\u0000\u0000\u0000\n\u01d8\u0001\u0000\u0000\u0000\n\u01da"+ + "\u0001\u0000\u0000\u0000\u000b\u01dc\u0001\u0000\u0000\u0000\u000b\u01de"+ + "\u0001\u0000\u0000\u0000\u000b\u01e0\u0001\u0000\u0000\u0000\u000b\u01e2"+ + "\u0001\u0000\u0000\u0000\u000b\u01e4\u0001\u0000\u0000\u0000\u000b\u01e6"+ + "\u0001\u0000\u0000\u0000\u000b\u01e8\u0001\u0000\u0000\u0000\u000b\u01ea"+ + "\u0001\u0000\u0000\u0000\u000b\u01ec\u0001\u0000\u0000\u0000\u000b\u01ee"+ + "\u0001\u0000\u0000\u0000\u000b\u01f0\u0001\u0000\u0000\u0000\u000b\u01f2"+ + "\u0001\u0000\u0000\u0000\u000b\u01f4\u0001\u0000\u0000\u0000\u000b\u01f6"+ + "\u0001\u0000\u0000\u0000\u000b\u01f8\u0001\u0000\u0000\u0000\u000b\u01fa"+ + "\u0001\u0000\u0000\u0000\u000b\u01fc\u0001\u0000\u0000\u0000\f\u01fe\u0001"+ + "\u0000\u0000\u0000\f\u0200\u0001\u0000\u0000\u0000\f\u0202\u0001\u0000"+ + "\u0000\u0000\f\u0204\u0001\u0000\u0000\u0000\r\u0206\u0001\u0000\u0000"+ + "\u0000\r\u0208\u0001\u0000\u0000\u0000\r\u020a\u0001\u0000\u0000\u0000"+ + "\r\u020c\u0001\u0000\u0000\u0000\u000e\u020e\u0001\u0000\u0000\u0000\u0010"+ + "\u0220\u0001\u0000\u0000\u0000\u0012\u0222\u0001\u0000\u0000\u0000\u0014"+ + "\u0269\u0001\u0000\u0000\u0000\u0016\u026b\u0001\u0000\u0000\u0000\u0018"+ + "\u027c\u0001\u0000\u0000\u0000\u001a\u027e\u0001\u0000\u0000\u0000\u001c"+ + "\u0284\u0001\u0000\u0000\u0000\u001e\u028e\u0001\u0000\u0000\u0000 \u0294"+ + "\u0001\u0000\u0000\u0000\"\u029b\u0001\u0000\u0000\u0000$\u02a5\u0001"+ + "\u0000\u0000\u0000&\u02ad\u0001\u0000\u0000\u0000(\u02b6\u0001\u0000\u0000"+ + "\u0000*\u02c1\u0001\u0000\u0000\u0000,\u02ca\u0001\u0000\u0000\u0000."+ + "\u02e1\u0001\u0000\u0000\u00000\u02f8\u0001\u0000\u0000\u00002\u02fa\u0001"+ + "\u0000\u0000\u00004\u0305\u0001\u0000\u0000\u00006\u0311\u0001\u0000\u0000"+ + "\u00008\u0318\u0001\u0000\u0000\u0000:\u0320\u0001\u0000\u0000\u0000<"+ + "\u032b\u0001\u0000\u0000\u0000>\u0337\u0001\u0000\u0000\u0000@\u0340\u0001"+ + "\u0000\u0000\u0000B\u034a\u0001\u0000\u0000\u0000D\u0353\u0001\u0000\u0000"+ + "\u0000F\u035f\u0001\u0000\u0000\u0000H\u036a\u0001\u0000\u0000\u0000J"+ + "\u0377\u0001\u0000\u0000\u0000L\u0386\u0001\u0000\u0000\u0000N\u0396\u0001"+ + "\u0000\u0000\u0000P\u03a7\u0001\u0000\u0000\u0000R\u03af\u0001\u0000\u0000"+ + "\u0000T\u03ba\u0001\u0000\u0000\u0000V\u03c0\u0001\u0000\u0000\u0000X"+ + "\u03c8\u0001\u0000\u0000\u0000Z\u03d3\u0001\u0000\u0000\u0000\\\u03e1"+ + "\u0001\u0000\u0000\u0000^\u03f3\u0001\u0000\u0000\u0000`\u03ff\u0001\u0000"+ + "\u0000\u0000b\u0408\u0001\u0000\u0000\u0000d\u0410\u0001\u0000\u0000\u0000"+ + "f\u0416\u0001\u0000\u0000\u0000h\u0421\u0001\u0000\u0000\u0000j\u0427"+ + "\u0001\u0000\u0000\u0000l\u042f\u0001\u0000\u0000\u0000n\u0435\u0001\u0000"+ + "\u0000\u0000p\u043e\u0001\u0000\u0000\u0000r\u0447\u0001\u0000\u0000\u0000"+ + "t\u044f\u0001\u0000\u0000\u0000v\u0458\u0001\u0000\u0000\u0000x\u0462"+ + "\u0001\u0000\u0000\u0000z\u046d\u0001\u0000\u0000\u0000|\u0479\u0001\u0000"+ + "\u0000\u0000~\u0486\u0001\u0000\u0000\u0000\u0080\u0491\u0001\u0000\u0000"+ + "\u0000\u0082\u049d\u0001\u0000\u0000\u0000\u0084\u04a6\u0001\u0000\u0000"+ + "\u0000\u0086\u04b2\u0001\u0000\u0000\u0000\u0088\u04bf\u0001\u0000\u0000"+ + "\u0000\u008a\u04c5\u0001\u0000\u0000\u0000\u008c\u04cf\u0001\u0000\u0000"+ + "\u0000\u008e\u04d8\u0001\u0000\u0000\u0000\u0090\u04e2\u0001\u0000\u0000"+ + "\u0000\u0092\u04ee\u0001\u0000\u0000\u0000\u0094\u04fd\u0001\u0000\u0000"+ + "\u0000\u0096\u0504\u0001\u0000\u0000\u0000\u0098\u0517\u0001\u0000\u0000"+ + "\u0000\u009a\u052c\u0001\u0000\u0000\u0000\u009c\u052e\u0001\u0000\u0000"+ + "\u0000\u009e\u053d\u0001\u0000\u0000\u0000\u00a0\u0550\u0001\u0000\u0000"+ + "\u0000\u00a2\u0560\u0001\u0000\u0000\u0000\u00a4\u0569\u0001\u0000\u0000"+ + "\u0000\u00a6\u059e\u0001\u0000\u0000\u0000\u00a8\u05a2\u0001\u0000\u0000"+ + "\u0000\u00aa\u05ab\u0001\u0000\u0000\u0000\u00ac\u05b6\u0001\u0000\u0000"+ + "\u0000\u00ae\u05ca\u0001\u0000\u0000\u0000\u00b0\u05ce\u0001\u0000\u0000"+ + "\u0000\u00b2\u05d6\u0001\u0000\u0000\u0000\u00b4\u05dd\u0001\u0000\u0000"+ + "\u0000\u00b6\u05e7\u0001\u0000\u0000\u0000\u00b8\u05f4\u0001\u0000\u0000"+ + "\u0000\u00ba\u05fd\u0001\u0000\u0000\u0000\u00bc\u0609\u0001\u0000\u0000"+ + "\u0000\u00be\u0653\u0001\u0000\u0000\u0000\u00c0\u0655\u0001\u0000\u0000"+ + "\u0000\u00c2\u065d\u0001\u0000\u0000\u0000\u00c4\u066f\u0001\u0000\u0000"+ + "\u0000\u00c6\u0675\u0001\u0000\u0000\u0000\u00c8\u0679\u0001\u0000\u0000"+ + "\u0000\u00ca\u067d\u0001\u0000\u0000\u0000\u00cc\u0682\u0001\u0000\u0000"+ + "\u0000\u00ce\u0688\u0001\u0000\u0000\u0000\u00d0\u068c\u0001\u0000\u0000"+ + "\u0000\u00d2\u0699\u0001\u0000\u0000\u0000\u00d4\u069d\u0001\u0000\u0000"+ + "\u0000\u00d6\u06af\u0001\u0000\u0000\u0000\u00d8\u06cb\u0001\u0000\u0000"+ + "\u0000\u00da\u06cf\u0001\u0000\u0000\u0000\u00dc\u06de\u0001\u0000\u0000"+ + "\u0000\u00de\u06e4\u0001\u0000\u0000\u0000\u00e0\u06eb\u0001\u0000\u0000"+ + "\u0000\u00e2\u06fc\u0001\u0000\u0000\u0000\u00e4\u0703\u0001\u0000\u0000"+ + "\u0000\u00e6\u0722\u0001\u0000\u0000\u0000\u00e8\u0732\u0001\u0000\u0000"+ + "\u0000\u00ea\u0735\u0001\u0000\u0000\u0000\u00ec\u0741\u0001\u0000\u0000"+ + "\u0000\u00ee\u0745\u0001\u0000\u0000\u0000\u00f0\u0749\u0001\u0000\u0000"+ + "\u0000\u00f2\u0750\u0001\u0000\u0000\u0000\u00f4\u0757\u0001\u0000\u0000"+ + "\u0000\u00f6\u075e\u0001\u0000\u0000\u0000\u00f8\u0760\u0001\u0000\u0000"+ + "\u0000\u00fa\u076a\u0001\u0000\u0000\u0000\u00fc\u0775\u0001\u0000\u0000"+ + "\u0000\u00fe\u077e\u0001\u0000\u0000\u0000\u0100\u0793\u0001\u0000\u0000"+ + "\u0000\u0102\u0795\u0001\u0000\u0000\u0000\u0104\u0797\u0001\u0000\u0000"+ + "\u0000\u0106\u079f\u0001\u0000\u0000\u0000\u0108\u07a5\u0001\u0000\u0000"+ + "\u0000\u010a\u089b\u0001\u0000\u0000\u0000\u010c\u089f\u0001\u0000\u0000"+ + "\u0000\u010e\u08a3\u0001\u0000\u0000\u0000\u0110\u08a8\u0001\u0000\u0000"+ + "\u0000\u0112\u08b3\u0001\u0000\u0000\u0000\u0114\u08b7\u0001\u0000\u0000"+ + "\u0000\u0116\u08bc\u0001\u0000\u0000\u0000\u0118\u08c1\u0001\u0000\u0000"+ + "\u0000\u011a\u08c5\u0001\u0000\u0000\u0000\u011c\u08c9\u0001\u0000\u0000"+ + "\u0000\u011e\u08ce\u0001\u0000\u0000\u0000\u0120\u08d2\u0001\u0000\u0000"+ + "\u0000\u0122\u08d7\u0001\u0000\u0000\u0000\u0124\u08db\u0001\u0000\u0000"+ + "\u0000\u0126\u08e0\u0001\u0000\u0000\u0000\u0128\u08eb\u0001\u0000\u0000"+ + "\u0000\u012a\u08ef\u0001\u0000\u0000\u0000\u012c\u08f4\u0001\u0000\u0000"+ + "\u0000\u012e\u08fa\u0001\u0000\u0000\u0000\u0130\u08fe\u0001\u0000\u0000"+ + "\u0000\u0132\u0902\u0001\u0000\u0000\u0000\u0134\u0907\u0001\u0000\u0000"+ + "\u0000\u0136\u090b\u0001\u0000\u0000\u0000\u0138\u0911\u0001\u0000\u0000"+ + "\u0000\u013a\u091b\u0001\u0000\u0000\u0000\u013c\u0921\u0001\u0000\u0000"+ + "\u0000\u013e\u0926\u0001\u0000\u0000\u0000\u0140\u092c\u0001\u0000\u0000"+ + "\u0000\u0142\u0931\u0001\u0000\u0000\u0000\u0144\u0937\u0001\u0000\u0000"+ + "\u0000\u0146\u093e\u0001\u0000\u0000\u0000\u0148\u0944\u0001\u0000\u0000"+ + "\u0000\u014a\u094a\u0001\u0000\u0000\u0000\u014c\u0950\u0001\u0000\u0000"+ + "\u0000\u014e\u0954\u0001\u0000\u0000\u0000\u0150\u095a\u0001\u0000\u0000"+ + "\u0000\u0152\u0960\u0001\u0000\u0000\u0000\u0154\u0965\u0001\u0000\u0000"+ + "\u0000\u0156\u096a\u0001\u0000\u0000\u0000\u0158\u096f\u0001\u0000\u0000"+ + "\u0000\u015a\u0974\u0001\u0000\u0000\u0000\u015c\u0979\u0001\u0000\u0000"+ + "\u0000\u015e\u0980\u0001\u0000\u0000\u0000\u0160\u0982\u0001\u0000\u0000"+ + "\u0000\u0162\u0986\u0001\u0000\u0000\u0000\u0164\u098b\u0001\u0000\u0000"+ + "\u0000\u0166\u0996\u0001\u0000\u0000\u0000\u0168\u099a\u0001\u0000\u0000"+ + "\u0000\u016a\u099f\u0001\u0000\u0000\u0000\u016c\u09a4\u0001\u0000\u0000"+ + "\u0000\u016e\u09a7\u0001\u0000\u0000\u0000\u0170\u09ab\u0001\u0000\u0000"+ + "\u0000\u0172\u09b1\u0001\u0000\u0000\u0000\u0174\u09b7\u0001\u0000\u0000"+ + "\u0000\u0176\u09bd\u0001\u0000\u0000\u0000\u0178\u09c3\u0001\u0000\u0000"+ + "\u0000\u017a\u09c9\u0001\u0000\u0000\u0000\u017c\u09cc\u0001\u0000\u0000"+ + "\u0000\u017e\u09cf\u0001\u0000\u0000\u0000\u0180\u09d2\u0001\u0000\u0000"+ + "\u0000\u0182\u09d6\u0001\u0000\u0000\u0000\u0184\u09d9\u0001\u0000\u0000"+ + "\u0000\u0186\u09e0\u0001\u0000\u0000\u0000\u0188\u09e4\u0001\u0000\u0000"+ + "\u0000\u018a\u09e9\u0001\u0000\u0000\u0000\u018c\u09ed\u0001\u0000\u0000"+ + "\u0000\u018e\u09f2\u0001\u0000\u0000\u0000\u0190\u09f6\u0001\u0000\u0000"+ + "\u0000\u0192\u09f9\u0001\u0000\u0000\u0000\u0194\u09fc\u0001\u0000\u0000"+ + "\u0000\u0196\u0a01\u0001\u0000\u0000\u0000\u0198\u0a06\u0001\u0000\u0000"+ + "\u0000\u019a\u0a0b\u0001\u0000\u0000\u0000\u019c\u0a10\u0001\u0000\u0000"+ + "\u0000\u019e\u0a12\u0001\u0000\u0000\u0000\u01a0\u0a16\u0001\u0000\u0000"+ + "\u0000\u01a2\u0a19\u0001\u0000\u0000\u0000\u01a4\u0a1d\u0001\u0000\u0000"+ + "\u0000\u01a6\u0a1f\u0001\u0000\u0000\u0000\u01a8\u0a23\u0001\u0000\u0000"+ + "\u0000\u01aa\u0a29\u0001\u0000\u0000\u0000\u01ac\u0a2b\u0001\u0000\u0000"+ + "\u0000\u01ae\u0a2f\u0001\u0000\u0000\u0000\u01b0\u0a34\u0001\u0000\u0000"+ + "\u0000\u01b2\u0a3e\u0001\u0000\u0000\u0000\u01b4\u0a52\u0001\u0000\u0000"+ + "\u0000\u01b6\u0a5c\u0001\u0000\u0000\u0000\u01b8\u0a61\u0001\u0000\u0000"+ + "\u0000\u01ba\u0a65\u0001\u0000\u0000\u0000\u01bc\u0a69\u0001\u0000\u0000"+ + "\u0000\u01be\u0a6d\u0001\u0000\u0000\u0000\u01c0\u0a73\u0001\u0000\u0000"+ + "\u0000\u01c2\u0a77\u0001\u0000\u0000\u0000\u01c4\u0a7b\u0001\u0000\u0000"+ + "\u0000\u01c6\u0a83\u0001\u0000\u0000\u0000\u01c8\u0a8b\u0001\u0000\u0000"+ + "\u0000\u01ca\u0a90\u0001\u0000\u0000\u0000\u01cc\u0a9b\u0001\u0000\u0000"+ + "\u0000\u01ce\u0aa0\u0001\u0000\u0000\u0000\u01d0\u0aa4\u0001\u0000\u0000"+ + "\u0000\u01d2\u0aa9\u0001\u0000\u0000\u0000\u01d4\u0aad\u0001\u0000\u0000"+ + "\u0000\u01d6\u0ab1\u0001\u0000\u0000\u0000\u01d8\u0ab5\u0001\u0000\u0000"+ + "\u0000\u01da\u0aba\u0001\u0000\u0000\u0000\u01dc\u0abe\u0001\u0000\u0000"+ + "\u0000\u01de\u0ac3\u0001\u0000\u0000\u0000\u01e0\u0acd\u0001\u0000\u0000"+ + "\u0000\u01e2\u0adb\u0001\u0000\u0000\u0000\u01e4\u0adf\u0001\u0000\u0000"+ + "\u0000\u01e6\u0ae3\u0001\u0000\u0000\u0000\u01e8\u0ae7\u0001\u0000\u0000"+ + "\u0000\u01ea\u0aed\u0001\u0000\u0000\u0000\u01ec\u0af1\u0001\u0000\u0000"+ + "\u0000\u01ee\u0af5\u0001\u0000\u0000\u0000\u01f0\u0af9\u0001\u0000\u0000"+ + "\u0000\u01f2\u0afd\u0001\u0000\u0000\u0000\u01f4\u0b02\u0001\u0000\u0000"+ + "\u0000\u01f6\u0b07\u0001\u0000\u0000\u0000\u01f8\u0b0b\u0001\u0000\u0000"+ + "\u0000\u01fa\u0b0f\u0001\u0000\u0000\u0000\u01fc\u0b14\u0001\u0000\u0000"+ + "\u0000\u01fe\u0b18\u0001\u0000\u0000\u0000\u0200\u0b28\u0001\u0000\u0000"+ + "\u0000\u0202\u0b2d\u0001\u0000\u0000\u0000\u0204\u0b32\u0001\u0000\u0000"+ + "\u0000\u0206\u0b36\u0001\u0000\u0000\u0000\u0208\u0b3e\u0001\u0000\u0000"+ + "\u0000\u020a\u0b43\u0001\u0000\u0000\u0000\u020c\u0b47\u0001\u0000\u0000"+ + "\u0000\u020e\u0212\u0007\u0000\u0000\u0000\u020f\u0211\u0007\u0001\u0000"+ + "\u0000\u0210\u020f\u0001\u0000\u0000\u0000\u0211\u0214\u0001\u0000\u0000"+ + "\u0000\u0212\u0210\u0001\u0000\u0000\u0000\u0212\u0213\u0001\u0000\u0000"+ + "\u0000\u0213\u000f\u0001\u0000\u0000\u0000\u0214\u0212\u0001\u0000\u0000"+ + "\u0000\u0215\u0217\u0007\u0002\u0000\u0000\u0216\u0215\u0001\u0000\u0000"+ + "\u0000\u0216\u0217\u0001\u0000\u0000\u0000\u0217\u0218\u0001\u0000\u0000"+ + "\u0000\u0218\u021c\u0007\u0000\u0000\u0000\u0219\u021b\u0007\u0003\u0000"+ + "\u0000\u021a\u0219\u0001\u0000\u0000\u0000\u021b\u021e\u0001\u0000\u0000"+ + "\u0000\u021c\u021a\u0001\u0000\u0000\u0000\u021c\u021d\u0001\u0000\u0000"+ + "\u0000\u021d\u0221\u0001\u0000\u0000\u0000\u021e\u021c\u0001\u0000\u0000"+ + "\u0000\u021f\u0221\u0003\u0016\u0004\u0000\u0220\u0216\u0001\u0000\u0000"+ + "\u0000\u0220\u021f\u0001\u0000\u0000\u0000\u0221\u0011\u0001\u0000\u0000"+ + "\u0000\u0222\u0223\u0003\u00f0q\u0000\u0223\u0227\u0005(\u0000\u0000\u0224"+ + "\u0226\u0003\u00f0q\u0000\u0225\u0224\u0001\u0000\u0000\u0000\u0226\u0229"+ + "\u0001\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000\u0000\u0227\u0228"+ + "\u0001\u0000\u0000\u0000\u0228\u0234\u0001\u0000\u0000\u0000\u0229\u0227"+ + "\u0001\u0000\u0000\u0000\u022a\u022e\u0005,\u0000\u0000\u022b\u022d\u0005"+ + " \u0000\u0000\u022c\u022b\u0001\u0000\u0000\u0000\u022d\u0230\u0001\u0000"+ + "\u0000\u0000\u022e\u022c\u0001\u0000\u0000\u0000\u022e\u022f\u0001\u0000"+ + "\u0000\u0000\u022f\u0231\u0001\u0000\u0000\u0000\u0230\u022e\u0001\u0000"+ + "\u0000\u0000\u0231\u0233\u0003\u00f0q\u0000\u0232\u022a\u0001\u0000\u0000"+ + "\u0000\u0233\u0236\u0001\u0000\u0000\u0000\u0234\u0232\u0001\u0000\u0000"+ + "\u0000\u0234\u0235\u0001\u0000\u0000\u0000\u0235\u023a\u0001\u0000\u0000"+ + "\u0000\u0236\u0234\u0001\u0000\u0000\u0000\u0237\u0239\u0005 \u0000\u0000"+ + "\u0238\u0237\u0001\u0000\u0000\u0000\u0239\u023c\u0001\u0000\u0000\u0000"+ + "\u023a\u0238\u0001\u0000\u0000\u0000\u023a\u023b\u0001\u0000\u0000\u0000"+ + "\u023b\u023d\u0001\u0000\u0000\u0000\u023c\u023a\u0001\u0000\u0000\u0000"+ + "\u023d\u0241\u0005)\u0000\u0000\u023e\u0240\u0005 \u0000\u0000\u023f\u023e"+ + "\u0001\u0000\u0000\u0000\u0240\u0243\u0001\u0000\u0000\u0000\u0241\u023f"+ + "\u0001\u0000\u0000\u0000\u0241\u0242\u0001\u0000\u0000\u0000\u0242\u0246"+ + "\u0001\u0000\u0000\u0000\u0243\u0241\u0001\u0000\u0000\u0000\u0244\u0245"+ + "\u0005{\u0000\u0000\u0245\u0247\u0004\u0002\u0000\u0000\u0246\u0244\u0001"+ + "\u0000\u0000\u0000\u0246\u0247\u0001\u0000\u0000\u0000\u0247\u0013\u0001"+ + "\u0000\u0000\u0000\u0248\u0249\u0007\u0004\u0000\u0000\u0249\u0253\u0003"+ + "\u0010\u0001\u0000\u024a\u024c\u0005 \u0000\u0000\u024b\u024a\u0001\u0000"+ + "\u0000\u0000\u024c\u024f\u0001\u0000\u0000\u0000\u024d\u024b\u0001\u0000"+ + "\u0000\u0000\u024d\u024e\u0001\u0000\u0000\u0000\u024e\u0250\u0001\u0000"+ + "\u0000\u0000\u024f\u024d\u0001\u0000\u0000\u0000\u0250\u0252\u0003\u0010"+ + "\u0001\u0000\u0251\u024d\u0001\u0000\u0000\u0000\u0252\u0255\u0001\u0000"+ + "\u0000\u0000\u0253\u0251\u0001\u0000\u0000\u0000\u0253\u0254\u0001\u0000"+ + "\u0000\u0000\u0254\u0256\u0001\u0000\u0000\u0000\u0255\u0253\u0001\u0000"+ + "\u0000\u0000\u0256\u0257\u0007\u0004\u0000\u0000\u0257\u026a\u0001\u0000"+ + "\u0000\u0000\u0258\u0259\u0005\"\u0000\u0000\u0259\u0263\u0003\u0010\u0001"+ + "\u0000\u025a\u025c\u0005 \u0000\u0000\u025b\u025a\u0001\u0000\u0000\u0000"+ + "\u025c\u025f\u0001\u0000\u0000\u0000\u025d\u025b\u0001\u0000\u0000\u0000"+ + "\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u0260\u0001\u0000\u0000\u0000"+ + "\u025f\u025d\u0001\u0000\u0000\u0000\u0260\u0262\u0003\u0010\u0001\u0000"+ + "\u0261\u025d\u0001\u0000\u0000\u0000\u0262\u0265\u0001\u0000\u0000\u0000"+ + "\u0263\u0261\u0001\u0000\u0000\u0000\u0263\u0264\u0001\u0000\u0000\u0000"+ + "\u0264\u0266\u0001\u0000\u0000\u0000\u0265\u0263\u0001\u0000\u0000\u0000"+ + "\u0266\u0267\u0007\u0004\u0000\u0000\u0267\u0268\u0005\"\u0000\u0000\u0268"+ + "\u026a\u0001\u0000\u0000\u0000\u0269\u0248\u0001\u0000\u0000\u0000\u0269"+ + "\u0258\u0001\u0000\u0000\u0000\u026a\u0015\u0001\u0000\u0000\u0000\u026b"+ + "\u026c\u0005[\u0000\u0000\u026c\u0270\u0003\u00f4s\u0000\u026d\u026e\u0003"+ + "\u00ean\u0000\u026e\u026f\u0003\u0018\u0005\u0000\u026f\u0271\u0001\u0000"+ + "\u0000\u0000\u0270\u026d\u0001\u0000\u0000\u0000\u0270\u0271\u0001\u0000"+ + "\u0000\u0000\u0271\u0272\u0001\u0000\u0000\u0000\u0272\u0273\u0005]\u0000"+ + "\u0000\u0273\u0017\u0001\u0000\u0000\u0000\u0274\u0275\u0005\"\u0000\u0000"+ + "\u0275\u0276\u0003\u00f4s\u0000\u0276\u0277\u0005\"\u0000\u0000\u0277"+ + "\u027d\u0001\u0000\u0000\u0000\u0278\u0279\u0007\u0004\u0000\u0000\u0279"+ + "\u027a\u0003\u00f4s\u0000\u027a\u027b\u0007\u0004\u0000\u0000\u027b\u027d"+ + "\u0001\u0000\u0000\u0000\u027c\u0274\u0001\u0000\u0000\u0000\u027c\u0278"+ + "\u0001\u0000\u0000\u0000\u027d\u0019\u0001\u0000\u0000\u0000\u027e\u027f"+ + "\u0005@\u0000\u0000\u027f\u0280\u0007\u0005\u0000\u0000\u0280\u0281\u0007"+ + "\u0006\u0000\u0000\u0281\u0282\u0001\u0000\u0000\u0000\u0282\u0283\u0006"+ + "\u0006\u0000\u0000\u0283\u001b\u0001\u0000\u0000\u0000\u0284\u0285\u0005"+ + "@\u0000\u0000\u0285\u0286\u0007\u0007\u0000\u0000\u0286\u0287\u0007\b"+ + "\u0000\u0000\u0287\u0288\u0007\t\u0000\u0000\u0288\u0289\u0007\u0007\u0000"+ + "\u0000\u0289\u028a\u0007\u0005\u0000\u0000\u028a\u028b\u0007\u0006\u0000"+ + "\u0000\u028b\u028c\u0001\u0000\u0000\u0000\u028c\u028d\u0006\u0007\u0000"+ + "\u0000\u028d\u001d\u0001\u0000\u0000\u0000\u028e\u028f\u0005@\u0000\u0000"+ + "\u028f\u0290\u0007\u0007\u0000\u0000\u0290\u0291\u0007\b\u0000\u0000\u0291"+ + "\u0292\u0007\t\u0000\u0000\u0292\u0293\u0007\u0007\u0000\u0000\u0293\u001f"+ + "\u0001\u0000\u0000\u0000\u0294\u0295\u0005@\u0000\u0000\u0295\u0296\u0007"+ + "\u0007\u0000\u0000\u0296\u0297\u0007\n\u0000\u0000\u0297\u0298\u0007\u000b"+ + "\u0000\u0000\u0298\u0299\u0007\u0005\u0000\u0000\u0299\u029a\u0007\u0006"+ + "\u0000\u0000\u029a!\u0001\u0000\u0000\u0000\u029b\u029c\u0005@\u0000\u0000"+ + "\u029c\u029d\u0007\t\u0000\u0000\u029d\u029e\u0007\f\u0000\u0000\u029e"+ + "\u029f\u0007\u0005\u0000\u0000\u029f\u02a0\u0007\r\u0000\u0000\u02a0\u02a1"+ + "\u0007\u000e\u0000\u0000\u02a1\u02a2\u0007\u000f\u0000\u0000\u02a2\u02a3"+ + "\u0001\u0000\u0000\u0000\u02a3\u02a4\u0006\n\u0001\u0000\u02a4#\u0001"+ + "\u0000\u0000\u0000\u02a5\u02a6\u0005@\u0000\u0000\u02a6\u02a7\u0007\u000e"+ + "\u0000\u0000\u02a7\u02a8\u0007\u0010\u0000\u0000\u02a8\u02a9\u0007\t\u0000"+ + "\u0000\u02a9\u02aa\u0007\u0007\u0000\u0000\u02aa\u02ab\u0001\u0000\u0000"+ + "\u0000\u02ab\u02ac\u0006\u000b\u0001\u0000\u02ac%\u0001\u0000\u0000\u0000"+ + "\u02ad\u02ae\u0005@\u0000\u0000\u02ae\u02af\u0007\u000b\u0000\u0000\u02af"+ + "\u02b0\u0007\u0007\u0000\u0000\u02b0\u02b1\u0007\u0006\u0000\u0000\u02b1"+ + "\u02b2\u0007\u0010\u0000\u0000\u02b2\u02b3\u0007\u0011\u0000\u0000\u02b3"+ + "\u02b4\u0007\b\u0000\u0000\u02b4\u02b5\u0007\r\u0000\u0000\u02b5\'\u0001"+ + "\u0000\u0000\u0000\u02b6\u02b7\u0005@\u0000\u0000\u02b7\u02b8\u0007\u0007"+ + "\u0000\u0000\u02b8\u02b9\u0007\n\u0000\u0000\u02b9\u02ba\u0007\u000b\u0000"+ + "\u0000\u02ba\u02bb\u0007\t\u0000\u0000\u02bb\u02bc\u0007\f\u0000\u0000"+ + "\u02bc\u02bd\u0007\u0005\u0000\u0000\u02bd\u02be\u0007\r\u0000\u0000\u02be"+ + "\u02bf\u0007\u000e\u0000\u0000\u02bf\u02c0\u0007\u000f\u0000\u0000\u02c0"+ + ")\u0001\u0000\u0000\u0000\u02c1\u02c2\u0005@\u0000\u0000\u02c2\u02c3\u0007"+ + "\u0007\u0000\u0000\u02c3\u02c4\u0007\u0012\u0000\u0000\u02c4\u02c5\u0007"+ + "\u0013\u0000\u0000\u02c5\u02c6\u0007\r\u0000\u0000\u02c6\u02c7\u0007\u0014"+ + "\u0000\u0000\u02c7\u02c8\u0001\u0000\u0000\u0000\u02c8\u02c9\u0006\u000e"+ + "\u0000\u0000\u02c9+\u0001\u0000\u0000\u0000\u02ca\u02cb\u0005@\u0000\u0000"+ + "\u02cb\u02cc\u0007\u0007\u0000\u0000\u02cc\u02cd\u0007\n\u0000\u0000\u02cd"+ + "\u02ce\u0007\u000b\u0000\u0000\u02ce\u02cf\u0007\u0007\u0000\u0000\u02cf"+ + "\u02d0\u0007\u0012\u0000\u0000\u02d0\u02d1\u0007\u0013\u0000\u0000\u02d1"+ + "\u02d2\u0007\r\u0000\u0000\u02d2\u02d3\u0007\u0014\u0000\u0000\u02d3-"+ + "\u0001\u0000\u0000\u0000\u02d4\u02d5\u0005@\u0000\u0000\u02d5\u02d6\u0007"+ + "\u0011\u0000\u0000\u02d6\u02d7\u0007\n\u0000\u0000\u02d7\u02d8\u0007\b"+ + "\u0000\u0000\u02d8\u02d9\u0007\u0007\u0000\u0000\u02d9\u02da\u0007\t\u0000"+ + "\u0000\u02da\u02e2\u0007\t\u0000\u0000\u02db\u02dc\u0005@\u0000\u0000"+ + "\u02dc\u02dd\u0007\u0005\u0000\u0000\u02dd\u02de\u0007\t\u0000\u0000\u02de"+ + "\u02df\u0007\t\u0000\u0000\u02df\u02e0\u0007\u0007\u0000\u0000\u02e0\u02e2"+ + "\u0007\r\u0000\u0000\u02e1\u02d4\u0001\u0000\u0000\u0000\u02e1\u02db\u0001"+ + "\u0000\u0000\u0000\u02e2\u02e3\u0001\u0000\u0000\u0000\u02e3\u02e4\u0006"+ + "\u0010\u0000\u0000\u02e4/\u0001\u0000\u0000\u0000\u02e5\u02e6\u0005@\u0000"+ + "\u0000\u02e6\u02e7\u0007\u0007\u0000\u0000\u02e7\u02e8\u0007\n\u0000\u0000"+ + "\u02e8\u02e9\u0007\u000b\u0000\u0000\u02e9\u02ea\u0007\u0011\u0000\u0000"+ + "\u02ea\u02eb\u0007\n\u0000\u0000\u02eb\u02ec\u0007\b\u0000\u0000\u02ec"+ + "\u02ed\u0007\u0007\u0000\u0000\u02ed\u02ee\u0007\t\u0000\u0000\u02ee\u02f9"+ + "\u0007\t\u0000\u0000\u02ef\u02f0\u0005@\u0000\u0000\u02f0\u02f1\u0007"+ + "\u0007\u0000\u0000\u02f1\u02f2\u0007\n\u0000\u0000\u02f2\u02f3\u0007\u000b"+ + "\u0000\u0000\u02f3\u02f4\u0007\u0005\u0000\u0000\u02f4\u02f5\u0007\t\u0000"+ + "\u0000\u02f5\u02f6\u0007\t\u0000\u0000\u02f6\u02f7\u0007\u0007\u0000\u0000"+ + "\u02f7\u02f9\u0007\r\u0000\u0000\u02f8\u02e5\u0001\u0000\u0000\u0000\u02f8"+ + "\u02ef\u0001\u0000\u0000\u0000\u02f91\u0001\u0000\u0000\u0000\u02fa\u02fb"+ + "\u0005@\u0000\u0000\u02fb\u02fc\u0007\u0006\u0000\u0000\u02fc\u02fd\u0007"+ + "\u0015\u0000\u0000\u02fd\u02fe\u0007\u0016\u0000\u0000\u02fe\u02ff\u0007"+ + "\u0007\u0000\u0000\u02ff\u0300\u0007\u0010\u0000\u0000\u0300\u0301\u0007"+ + "\u000e\u0000\u0000\u0301\u0302\u0007\u000f\u0000\u0000\u0302\u0303\u0001"+ + "\u0000\u0000\u0000\u0303\u0304\u0006\u0012\u0002\u0000\u03043\u0001\u0000"+ + "\u0000\u0000\u0305\u0306\u0005@\u0000\u0000\u0306\u0307\u0007\u0007\u0000"+ + "\u0000\u0307\u0308\u0007\n\u0000\u0000\u0308\u0309\u0007\u000b\u0000\u0000"+ + "\u0309\u030a\u0007\u0006\u0000\u0000\u030a\u030b\u0007\u0015\u0000\u0000"+ + "\u030b\u030c\u0007\u0016\u0000\u0000\u030c\u030d\u0007\u0007\u0000\u0000"+ + "\u030d\u030e\u0007\u0010\u0000\u0000\u030e\u030f\u0007\u000e\u0000\u0000"+ + "\u030f\u0310\u0007\u000f\u0000\u0000\u03105\u0001\u0000\u0000\u0000\u0311"+ + "\u0312\u0005@\u0000\u0000\u0312\u0313\u0007\u0006\u0000\u0000\u0313\u0314"+ + "\u0007\u0015\u0000\u0000\u0314\u0315\u0007\u0016\u0000\u0000\u0315\u0316"+ + "\u0001\u0000\u0000\u0000\u0316\u0317\u0006\u0014\u0001\u0000\u03177\u0001"+ + "\u0000\u0000\u0000\u0318\u0319\u0005@\u0000\u0000\u0319\u031a\u0007\u0007"+ + "\u0000\u0000\u031a\u031b\u0007\n\u0000\u0000\u031b\u031c\u0007\u000b\u0000"+ + "\u0000\u031c\u031d\u0007\u0006\u0000\u0000\u031d\u031e\u0007\u0015\u0000"+ + "\u0000\u031e\u031f\u0007\u0016\u0000\u0000\u031f9\u0001\u0000\u0000\u0000"+ + "\u0320\u0321\u0005@\u0000\u0000\u0321\u0322\u0007\u0006\u0000\u0000\u0322"+ + "\u0323\u0007\u0015\u0000\u0000\u0323\u0324\u0007\u0016\u0000\u0000\u0324"+ + "\u0325\u0007\u0007\u0000\u0000\u0325\u0326\u0007\b\u0000\u0000\u0326\u0327"+ + "\u0007\t\u0000\u0000\u0327\u0328\u0007\u0007\u0000\u0000\u0328\u0329\u0001"+ + "\u0000\u0000\u0000\u0329\u032a\u0006\u0016\u0002\u0000\u032a;\u0001\u0000"+ + "\u0000\u0000\u032b\u032c\u0005@\u0000\u0000\u032c\u032d\u0007\u0007\u0000"+ + "\u0000\u032d\u032e\u0007\n\u0000\u0000\u032e\u032f\u0007\u000b\u0000\u0000"+ + "\u032f\u0330\u0007\u0006\u0000\u0000\u0330\u0331\u0007\u0015\u0000\u0000"+ + "\u0331\u0332\u0007\u0016\u0000\u0000\u0332\u0333\u0007\u0007\u0000\u0000"+ + "\u0333\u0334\u0007\b\u0000\u0000\u0334\u0335\u0007\t\u0000\u0000\u0335"+ + "\u0336\u0007\u0007\u0000\u0000\u0336=\u0001\u0000\u0000\u0000\u0337\u0338"+ + "\u0005@\u0000\u0000\u0338\u0339\u0007\f\u0000\u0000\u0339\u033a\u0007"+ + "\u000f\u0000\u0000\u033a\u033b\u0007\u0005\u0000\u0000\u033b\u033c\u0007"+ + "\b\u0000\u0000\u033c\u033d\u0007\u0007\u0000\u0000\u033d\u033e\u0001\u0000"+ + "\u0000\u0000\u033e\u033f\u0006\u0018\u0001\u0000\u033f?\u0001\u0000\u0000"+ + "\u0000\u0340\u0341\u0005@\u0000\u0000\u0341\u0342\u0007\u0007\u0000\u0000"+ + "\u0342\u0343\u0007\n\u0000\u0000\u0343\u0344\u0007\u000b\u0000\u0000\u0344"+ + "\u0345\u0007\f\u0000\u0000\u0345\u0346\u0007\u000f\u0000\u0000\u0346\u0347"+ + "\u0007\u0005\u0000\u0000\u0347\u0348\u0007\b\u0000\u0000\u0348\u0349\u0007"+ + "\u0007\u0000\u0000\u0349A\u0001\u0000\u0000\u0000\u034a\u034b\u0005@\u0000"+ + "\u0000\u034b\u034c\u0007\u0017\u0000\u0000\u034c\u034d\u0007\u0016\u0000"+ + "\u0000\u034d\u034e\u0007\u0007\u0000\u0000\u034e\u034f\u0007\u0010\u0000"+ + "\u0000\u034f\u0350\u0007\u0018\u0000\u0000\u0350\u0351\u0001\u0000\u0000"+ + "\u0000\u0351\u0352\u0006\u001a\u0001\u0000\u0352C\u0001\u0000\u0000\u0000"+ + "\u0353\u0354\u0005@\u0000\u0000\u0354\u0355\u0007\u000e\u0000\u0000\u0355"+ + "\u0356\u0007\u0015\u0000\u0000\u0356\u0357\u0007\n\u0000\u0000\u0357\u0358"+ + "\u0007\r\u0000\u0000\u0358\u0359\u0007\u0005\u0000\u0000\u0359\u035a\u0007"+ + "\n\u0000\u0000\u035a\u035b\u0007\u0011\u0000\u0000\u035b\u035c\u0007\u0007"+ + "\u0000\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d\u035e\u0006\u001b"+ + "\u0001\u0000\u035eE\u0001\u0000\u0000\u0000\u035f\u0360\u0005@\u0000\u0000"+ + "\u0360\u0361\u0007\u0005\u0000\u0000\u0361\u0362\u0007\n\u0000\u0000\u0362"+ + "\u0363\u0007\u000e\u0000\u0000\u0363\u0364\u0007\b\u0000\u0000\u0364\u0365"+ + "\u0007\u0011\u0000\u0000\u0365\u0366\u0007\u000b\u0000\u0000\u0366\u0367"+ + "\u0007\u0007\u0000\u0000\u0367\u0368\u0001\u0000\u0000\u0000\u0368\u0369"+ + "\u0006\u001c\u0003\u0000\u0369G\u0001\u0000\u0000\u0000\u036a\u036b\u0005"+ + "@\u0000\u0000\u036b\u036c\u0007\u0005\u0000\u0000\u036c\u036d\u0007\n"+ + "\u0000\u0000\u036d\u036e\u0007\u000e\u0000\u0000\u036e\u036f\u0007\b\u0000"+ + "\u0000\u036f\u0370\u0007\u0011\u0000\u0000\u0370\u0371\u0007\u000b\u0000"+ + "\u0000\u0371\u0372\u0007\u0007\u0000\u0000\u0372\u0373\u0007\u0005\u0000"+ + "\u0000\u0373\u0374\u0007\u0006\u0000\u0000\u0374\u0375\u0001\u0000\u0000"+ + "\u0000\u0375\u0376\u0006\u001d\u0003\u0000\u0376I\u0001\u0000\u0000\u0000"+ + "\u0377\u0378\u0005@\u0000\u0000\u0378\u0379\u0007\u0005\u0000\u0000\u0379"+ + "\u037a\u0007\n\u0000\u0000\u037a\u037b\u0007\u000e\u0000\u0000\u037b\u037c"+ + "\u0007\b\u0000\u0000\u037c\u037d\u0007\u0011\u0000\u0000\u037d\u037e\u0007"+ + "\u000b\u0000\u0000\u037e\u037f\u0007\u0007\u0000\u0000\u037f\u0380\u0007"+ + "\f\u0000\u0000\u0380\u0381\u0007\u000f\u0000\u0000\u0381\u0382\u0007\u0007"+ + "\u0000\u0000\u0382\u0383\u0007\n\u0000\u0000\u0383\u0384\u0001\u0000\u0000"+ + "\u0000\u0384\u0385\u0006\u001e\u0003\u0000\u0385K\u0001\u0000\u0000\u0000"+ + "\u0386\u0387\u0005@\u0000\u0000\u0387\u0388\u0007\u0005\u0000\u0000\u0388"+ + "\u0389\u0007\n\u0000\u0000\u0389\u038a\u0007\u000e\u0000\u0000\u038a\u038b"+ + "\u0007\b\u0000\u0000\u038b\u038c\u0007\u0011\u0000\u0000\u038c\u038d\u0007"+ + "\u000b\u0000\u0000\u038d\u038e\u0007\u0007\u0000\u0000\u038e\u038f\u0007"+ + "\u0006\u0000\u0000\u038f\u0390\u0007\u0005\u0000\u0000\u0390\u0391\u0007"+ + "\u0016\u0000\u0000\u0391\u0392\u0007\t\u0000\u0000\u0392\u0393\u0007\r"+ + "\u0000\u0000\u0393\u0394\u0001\u0000\u0000\u0000\u0394\u0395\u0006\u001f"+ + "\u0003\u0000\u0395M\u0001\u0000\u0000\u0000\u0396\u0397\u0005@\u0000\u0000"+ + "\u0397\u0398\u0007\u0005\u0000\u0000\u0398\u0399\u0007\n\u0000\u0000\u0399"+ + "\u039a\u0007\u000e\u0000\u0000\u039a\u039b\u0007\b\u0000\u0000\u039b\u039c"+ + "\u0007\u0011\u0000\u0000\u039c\u039d\u0007\u000b\u0000\u0000\u039d\u039e"+ + "\u0007\u0007\u0000\u0000\u039e\u039f\u0007\u0011\u0000\u0000\u039f\u03a0"+ + "\u0007\n\u0000\u0000\u03a0\u03a1\u0007\b\u0000\u0000\u03a1\u03a2\u0007"+ + "\u0007\u0000\u0000\u03a2\u03a3\u0007\t\u0000\u0000\u03a3\u03a4\u0007\t"+ + "\u0000\u0000\u03a4\u03a5\u0001\u0000\u0000\u0000\u03a5\u03a6\u0006 \u0003"+ + "\u0000\u03a6O\u0001\u0000\u0000\u0000\u03a7\u03a8\u0005@\u0000\u0000\u03a8"+ + "\u03a9\u0007\u0007\u0000\u0000\u03a9\u03aa\u0007\u0010\u0000\u0000\u03aa"+ + "\u03ab\u0007\u000e\u0000\u0000\u03ab\u03ac\u0007\u000f\u0000\u0000\u03ac"+ + "\u03ad\u0001\u0000\u0000\u0000\u03ad\u03ae\u0006!\u0003\u0000\u03aeQ\u0001"+ + "\u0000\u0000\u0000\u03af\u03b0\u0005@\u0000\u0000\u03b0\u03b1\u0007\u0007"+ + "\u0000\u0000\u03b1\u03b2\u0007\u0019\u0000\u0000\u03b2\u03b3\u0007\r\u0000"+ + "\u0000\u03b3\u03b4\u0007\u0007\u0000\u0000\u03b4\u03b5\u0007\n\u0000\u0000"+ + "\u03b5\u03b6\u0007\u000b\u0000\u0000\u03b6\u03b7\u0007\t\u0000\u0000\u03b7"+ + "\u03b8\u0001\u0000\u0000\u0000\u03b8\u03b9\u0006\"\u0003\u0000\u03b9S"+ + "\u0001\u0000\u0000\u0000\u03ba\u03bb\u0005@\u0000\u0000\u03bb\u03bc\u0007"+ + "\u001a\u0000\u0000\u03bc\u03bd\u0007\t\u0000\u0000\u03bd\u03be\u0001\u0000"+ + "\u0000\u0000\u03be\u03bf\u0006#\u0000\u0000\u03bfU\u0001\u0000\u0000\u0000"+ + "\u03c0\u03c1\u0005@\u0000\u0000\u03c1\u03c2\u0007\u001a\u0000\u0000\u03c2"+ + "\u03c3\u0007\t\u0000\u0000\u03c3\u03c4\u0007\u0015\u0000\u0000\u03c4\u03c5"+ + "\u0007\n\u0000\u0000\u03c5\u03c6\u0001\u0000\u0000\u0000\u03c6\u03c7\u0006"+ + "$\u0000\u0000\u03c7W\u0001\u0000\u0000\u0000\u03c8\u03c9\u0005@\u0000"+ + "\u0000\u03c9\u03ca\u0007\t\u0000\u0000\u03ca\u03cb\u0007\u0007\u0000\u0000"+ + "\u03cb\u03cc\u0007\u000e\u0000\u0000\u03cc\u03cd\u0007\r\u0000\u0000\u03cd"+ + "\u03ce\u0007\u0005\u0000\u0000\u03ce\u03cf\u0007\u0015\u0000\u0000\u03cf"+ + "\u03d0\u0007\n\u0000\u0000\u03d0\u03d1\u0001\u0000\u0000\u0000\u03d1\u03d2"+ + "\u0006%\u0003\u0000\u03d2Y\u0001\u0000\u0000\u0000\u03d3\u03d4\u0005@"+ + "\u0000\u0000\u03d4\u03d5\u0007\u000f\u0000\u0000\u03d5\u03d6\u0007\u0010"+ + "\u0000\u0000\u03d6\u03d7\u0007\t\u0000\u0000\u03d7\u03d8\u0007\t\u0000"+ + "\u0000\u03d8\u03d9\u0007\u0007\u0000\u0000\u03d9\u03da\u0007\u000e\u0000"+ + "\u0000\u03da\u03db\u0007\r\u0000\u0000\u03db\u03dc\u0007\u0005\u0000\u0000"+ + "\u03dc\u03dd\u0007\u0015\u0000\u0000\u03dd\u03de\u0007\n\u0000\u0000\u03de"+ + "\u03df\u0001\u0000\u0000\u0000\u03df\u03e0\u0006&\u0003\u0000\u03e0[\u0001"+ + "\u0000\u0000\u0000\u03e1\u03e2\u0005@\u0000\u0000\u03e2\u03e3\u0007\t"+ + "\u0000\u0000\u03e3\u03e4\u0007\u0007\u0000\u0000\u03e4\u03e5\u0007\u000e"+ "\u0000\u0000\u03e5\u03e6\u0007\r\u0000\u0000\u03e6\u03e7\u0007\u0005\u0000"+ "\u0000\u03e7\u03e8\u0007\u0015\u0000\u0000\u03e8\u03e9\u0007\n\u0000\u0000"+ "\u03e9\u03ea\u0007\u0012\u0000\u0000\u03ea\u03eb\u0007\u0005\u0000\u0000"+ @@ -2100,13 +2103,13 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "\u0000\u0000\u07ac\u07ad\u0001\u0000\u0000\u0000\u07ad\u07ae\u0001\u0000"+ "\u0000\u0000\u07ae\u07af\u0006}\t\u0000\u07af\u0109\u0001\u0000\u0000"+ "\u0000\u07b0\u07b1\u0005{\u0000\u0000\u07b1\u07b2\u0005{\u0000\u0000\u07b2"+ - "\u088f\u0005{\u0000\u0000\u07b3\u07b4\u0005@\u0000\u0000\u07b4\u07b5\u0005"+ + "\u089c\u0005{\u0000\u0000\u07b3\u07b4\u0005@\u0000\u0000\u07b4\u07b5\u0005"+ "@\u0000\u0000\u07b5\u07b7\u0001\u0000\u0000\u0000\u07b6\u07b8\u0005@\u0000"+ "\u0000\u07b7\u07b6\u0001\u0000\u0000\u0000\u07b7\u07b8\u0001\u0000\u0000"+ - "\u0000\u07b8\u088f\u0001\u0000\u0000\u0000\u07b9\u07ba\u0005@\u0000\u0000"+ + "\u0000\u07b8\u089c\u0001\u0000\u0000\u0000\u07b9\u07ba\u0005@\u0000\u0000"+ "\u07ba\u07bb\u0005{\u0000\u0000\u07bb\u07bd\u0001\u0000\u0000\u0000\u07bc"+ "\u07be\u0005{\u0000\u0000\u07bd\u07bc\u0001\u0000\u0000\u0000\u07bd\u07be"+ - "\u0001\u0000\u0000\u0000\u07be\u088f\u0001\u0000\u0000\u0000\u07bf\u07c0"+ + "\u0001\u0000\u0000\u0000\u07be\u089c\u0001\u0000\u0000\u0000\u07bf\u07c0"+ "\u0005@\u0000\u0000\u07c0\u07c1\u0007\u0012\u0000\u0000\u07c1\u07c2\u0007"+ "\u0007\u0000\u0000\u07c2\u07c3\u0007\u000b\u0000\u0000\u07c3\u07c4\u0007"+ "\u0005\u0000\u0000\u07c4\u07c5\u0007\u0010\u0000\u0000\u07c5\u07c9\u0001"+ @@ -2115,475 +2118,477 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "\u0000\u0000\u07c9\u07ca\u0001\u0000\u0000\u0000\u07ca\u07cd\u0001\u0000"+ "\u0000\u0000\u07cb\u07c9\u0001\u0000\u0000\u0000\u07cc\u07ce\u0005(\u0000"+ "\u0000\u07cd\u07cc\u0001\u0000\u0000\u0000\u07cd\u07ce\u0001\u0000\u0000"+ - "\u0000\u07ce\u088f\u0001\u0000\u0000\u0000\u07cf\u07d0\u0005@\u0000\u0000"+ + "\u0000\u07ce\u089c\u0001\u0000\u0000\u0000\u07cf\u07d0\u0005@\u0000\u0000"+ "\u07d0\u07d1\u0007\u000e\u0000\u0000\u07d1\u07d2\u0007\u000f\u0000\u0000"+ "\u07d2\u07d3\u0007\u0010\u0000\u0000\u07d3\u07d4\u0007\u0016\u0000\u0000"+ "\u07d4\u07d5\u0007\t\u0000\u0000\u07d5\u07d6\u0007\u0007\u0000\u0000\u07d6"+ - "\u07d7\u0007\r\u0000\u0000\u07d7\u07db\u0001\u0000\u0000\u0000\u07d8\u07da"+ - "\u0007%\u0000\u0000\u07d9\u07d8\u0001\u0000\u0000\u0000\u07da\u07dd\u0001"+ - "\u0000\u0000\u0000\u07db\u07d9\u0001\u0000\u0000\u0000\u07db\u07dc\u0001"+ - "\u0000\u0000\u0000\u07dc\u088f\u0001\u0000\u0000\u0000\u07dd\u07db\u0001"+ - "\u0000\u0000\u0000\u07de\u07df\u0005@\u0000\u0000\u07df\u07e0\u0007\u0005"+ - "\u0000\u0000\u07e0\u07e1\u0007\u0012\u0000\u0000\u07e1\u07e2\u0007\u0013"+ - "\u0000\u0000\u07e2\u07e3\u0007\u0015\u0000\u0000\u07e3\u07e4\u0007\u0016"+ - "\u0000\u0000\u07e4\u07e5\u0007\r\u0000\u0000\u07e5\u07e9\u0001\u0000\u0000"+ - "\u0000\u07e6\u07e8\u0007%\u0000\u0000\u07e7\u07e6\u0001\u0000\u0000\u0000"+ - "\u07e8\u07eb\u0001\u0000\u0000\u0000\u07e9\u07e7\u0001\u0000\u0000\u0000"+ - "\u07e9\u07ea\u0001\u0000\u0000\u0000\u07ea\u088f\u0001\u0000\u0000\u0000"+ - "\u07eb\u07e9\u0001\u0000\u0000\u0000\u07ec\u07ed\u0005@\u0000\u0000\u07ed"+ - "\u07ee\u0007\n\u0000\u0000\u07ee\u07ef\u0007\u0010\u0000\u0000\u07ef\u07f0"+ - "\u0007\u0012\u0000\u0000\u07f0\u07f1\u0007\u0007\u0000\u0000\u07f1\u07f2"+ - "\u0007\t\u0000\u0000\u07f2\u07f3\u0007\u0013\u0000\u0000\u07f3\u07f4\u0007"+ - "\u0010\u0000\u0000\u07f4\u07f5\u0007\u000e\u0000\u0000\u07f5\u07f6\u0007"+ - "\u0007\u0000\u0000\u07f6\u07fa\u0001\u0000\u0000\u0000\u07f7\u07f9\u0007"+ - "%\u0000\u0000\u07f8\u07f7\u0001\u0000\u0000\u0000\u07f9\u07fc\u0001\u0000"+ - "\u0000\u0000\u07fa\u07f8\u0001\u0000\u0000\u0000\u07fa\u07fb\u0001\u0000"+ - "\u0000\u0000\u07fb\u088f\u0001\u0000\u0000\u0000\u07fc\u07fa\u0001\u0000"+ - "\u0000\u0000\u07fd\u07fe\u0005@\u0000\u0000\u07fe\u07ff\u0007\u000b\u0000"+ - "\u0000\u07ff\u0800\u0007\u0015\u0000\u0000\u0800\u0801\u0007\u000e\u0000"+ - "\u0000\u0801\u0802\u0007\u0011\u0000\u0000\u0802\u0803\u0007\u0012\u0000"+ - "\u0000\u0803\u0804\u0007\u0007\u0000\u0000\u0804\u0805\u0007\n\u0000\u0000"+ - "\u0805\u0806\u0007\r\u0000\u0000\u0806\u080a\u0001\u0000\u0000\u0000\u0807"+ - "\u0809\u0007%\u0000\u0000\u0808\u0807\u0001\u0000\u0000\u0000\u0809\u080c"+ - "\u0001\u0000\u0000\u0000\u080a\u0808\u0001\u0000\u0000\u0000\u080a\u080b"+ - "\u0001\u0000\u0000\u0000\u080b\u088f\u0001\u0000\u0000\u0000\u080c\u080a"+ - "\u0001\u0000\u0000\u0000\u080d\u080e\u0005@\u0000\u0000\u080e\u080f\u0007"+ - "\u0006\u0000\u0000\u080f\u0810\u0007\u0015\u0000\u0000\u0810\u0811\u0007"+ - "\n\u0000\u0000\u0811\u0812\u0007\r\u0000\u0000\u0812\u0813\u0005-\u0000"+ - "\u0000\u0813\u0814\u0007\u0006\u0000\u0000\u0814\u0815\u0007\u0010\u0000"+ - "\u0000\u0815\u0816\u0007\u000e\u0000\u0000\u0816\u0817\u0007\u0007\u0000"+ - "\u0000\u0817\u081b\u0001\u0000\u0000\u0000\u0818\u081a\u0007%\u0000\u0000"+ - "\u0819\u0818\u0001\u0000\u0000\u0000\u081a\u081d\u0001\u0000\u0000\u0000"+ - "\u081b\u0819\u0001\u0000\u0000\u0000\u081b\u081c\u0001\u0000\u0000\u0000"+ - "\u081c\u088f\u0001\u0000\u0000\u0000\u081d\u081b\u0001\u0000\u0000\u0000"+ - "\u081e\u081f\u0005@\u0000\u0000\u081f\u0820\u0007\u0013\u0000\u0000\u0820"+ - "\u0821\u0007\u0010\u0000\u0000\u0821\u0822\u0007\u001b\u0000\u0000\u0822"+ - "\u0823\u0007\u0007\u0000\u0000\u0823\u0827\u0001\u0000\u0000\u0000\u0824"+ - "\u0826\u0007%\u0000\u0000\u0825\u0824\u0001\u0000\u0000\u0000\u0826\u0829"+ - "\u0001\u0000\u0000\u0000\u0827\u0825\u0001\u0000\u0000\u0000\u0827\u0828"+ - "\u0001\u0000\u0000\u0000\u0828\u088f\u0001\u0000\u0000\u0000\u0829\u0827"+ - "\u0001\u0000\u0000\u0000\u082a\u082b\u0005@\u0000\u0000\u082b\u082c\u0007"+ - "\t\u0000\u0000\u082c\u082d\u0007\u0011\u0000\u0000\u082d\u082e\u0007\u0013"+ - "\u0000\u0000\u082e\u082f\u0007\u0013\u0000\u0000\u082f\u0830\u0007\u0015"+ - "\u0000\u0000\u0830\u0831\u0007\u0016\u0000\u0000\u0831\u0832\u0007\r\u0000"+ - "\u0000\u0832\u0833\u0007\t\u0000\u0000\u0833\u0837\u0001\u0000\u0000\u0000"+ - "\u0834\u0836\u0007%\u0000\u0000\u0835\u0834\u0001\u0000\u0000\u0000\u0836"+ - "\u0839\u0001\u0000\u0000\u0000\u0837\u0835\u0001\u0000\u0000\u0000\u0837"+ - "\u0838\u0001\u0000\u0000\u0000\u0838\u088f\u0001\u0000\u0000\u0000\u0839"+ - "\u0837\u0001\u0000\u0000\u0000\u083a\u083b\u0005@\u0000\u0000\u083b\u083c"+ - "\u0007\b\u0000\u0000\u083c\u083d\u0007\u0010\u0000\u0000\u083d\u083e\u0007"+ - "\u0014\u0000\u0000\u083e\u083f\u0007\u0007\u0000\u0000\u083f\u0840\u0007"+ - "\u0016\u0000\u0000\u0840\u0844\u0001\u0000\u0000\u0000\u0841\u0843\u0007"+ - "%\u0000\u0000\u0842\u0841\u0001\u0000\u0000\u0000\u0843\u0846\u0001\u0000"+ - "\u0000\u0000\u0844\u0842\u0001\u0000\u0000\u0000\u0844\u0845\u0001\u0000"+ - "\u0000\u0000\u0845\u088f\u0001\u0000\u0000\u0000\u0846\u0844\u0001\u0000"+ - "\u0000\u0000\u0847\u0848\u0005@\u0000\u0000\u0848\u0849\u0007\r\u0000"+ - "\u0000\u0849\u084a\u0007\u0010\u0000\u0000\u084a\u084b\u0007\u0005\u0000"+ - "\u0000\u084b\u084c\u0007\b\u0000\u0000\u084c\u084d\u0007\f\u0000\u0000"+ - "\u084d\u084e\u0007\u0005\u0000\u0000\u084e\u084f\u0007\n\u0000\u0000\u084f"+ - "\u0850\u0007\u000b\u0000\u0000\u0850\u0854\u0001\u0000\u0000\u0000\u0851"+ - "\u0853\u0007%\u0000\u0000\u0852\u0851\u0001\u0000\u0000\u0000\u0853\u0856"+ - "\u0001\u0000\u0000\u0000\u0854\u0852\u0001\u0000\u0000\u0000\u0854\u0855"+ - "\u0001\u0000\u0000\u0000\u0855\u088f\u0001\u0000\u0000\u0000\u0856\u0854"+ - "\u0001\u0000\u0000\u0000\u0857\u0858\u0005@\u0000\u0000\u0858\u0859\u0007"+ - "\u0010\u0000\u0000\u0859\u085a\u0007\u0013\u0000\u0000\u085a\u085b\u0007"+ - "\u0013\u0000\u0000\u085b\u085c\u0007\b\u0000\u0000\u085c\u085d\u0007\u0014"+ - "\u0000\u0000\u085d\u0861\u0001\u0000\u0000\u0000\u085e\u0860\u0007%\u0000"+ - "\u0000\u085f\u085e\u0001\u0000\u0000\u0000\u0860\u0863\u0001\u0000\u0000"+ - "\u0000\u0861\u085f\u0001\u0000\u0000\u0000\u0861\u0862\u0001\u0000\u0000"+ - "\u0000\u0862\u088f\u0001\u0000\u0000\u0000\u0863\u0861\u0001\u0000\u0000"+ - "\u0000\u0864\u0865\u0005@\u0000\u0000\u0865\u0866\u0005-\u0000\u0000\u0866"+ - "\u0867\u0007\f\u0000\u0000\u0867\u0868\u0007\u0007\u0000\u0000\u0868\u0869"+ - "\u0007\u0017\u0000\u0000\u0869\u086a\u0007\u0018\u0000\u0000\u086a\u086b"+ - "\u0007\u0005\u0000\u0000\u086b\u086c\u0007\r\u0000\u0000\u086c\u086d\u0005"+ - "-\u0000\u0000\u086d\u086e\u0007\u0018\u0000\u0000\u086e\u086f\u0007\u0007"+ - "\u0000\u0000\u086f\u0870\u0007\u0014\u0000\u0000\u0870\u0871\u0007\u0006"+ - "\u0000\u0000\u0871\u0872\u0007\u0016\u0000\u0000\u0872\u0873\u0007\u0010"+ - "\u0000\u0000\u0873\u0874\u0007\u0012\u0000\u0000\u0874\u0875\u0007\u0007"+ - "\u0000\u0000\u0875\u0876\u0007\t\u0000\u0000\u0876\u087a\u0001\u0000\u0000"+ - "\u0000\u0877\u0879\u0007%\u0000\u0000\u0878\u0877\u0001\u0000\u0000\u0000"+ - "\u0879\u087c\u0001\u0000\u0000\u0000\u087a\u0878\u0001\u0000\u0000\u0000"+ - "\u087a\u087b\u0001\u0000\u0000\u0000\u087b\u088f\u0001\u0000\u0000\u0000"+ - "\u087c\u087a\u0001\u0000\u0000\u0000\u087d\u087e\u0005@\u0000\u0000\u087e"+ - "\u087f\u0007\u0018\u0000\u0000\u087f\u0880\u0007\u0007\u0000\u0000\u0880"+ - "\u0881\u0007\u0014\u0000\u0000\u0881\u0882\u0007\u0006\u0000\u0000\u0882"+ - "\u0883\u0007\u0016\u0000\u0000\u0883\u0884\u0007\u0010\u0000\u0000\u0884"+ - "\u0885\u0007\u0012\u0000\u0000\u0885\u0886\u0007\u0007\u0000\u0000\u0886"+ - "\u0887\u0007\t\u0000\u0000\u0887\u088b\u0001\u0000\u0000\u0000\u0888\u088a"+ - "\u0007%\u0000\u0000\u0889\u0888\u0001\u0000\u0000\u0000\u088a\u088d\u0001"+ - "\u0000\u0000\u0000\u088b\u0889\u0001\u0000\u0000\u0000\u088b\u088c\u0001"+ - "\u0000\u0000\u0000\u088c\u088f\u0001\u0000\u0000\u0000\u088d\u088b\u0001"+ - "\u0000\u0000\u0000\u088e\u07b0\u0001\u0000\u0000\u0000\u088e\u07b3\u0001"+ - "\u0000\u0000\u0000\u088e\u07b9\u0001\u0000\u0000\u0000\u088e\u07bf\u0001"+ - "\u0000\u0000\u0000\u088e\u07cf\u0001\u0000\u0000\u0000\u088e\u07de\u0001"+ - "\u0000\u0000\u0000\u088e\u07ec\u0001\u0000\u0000\u0000\u088e\u07fd\u0001"+ - "\u0000\u0000\u0000\u088e\u080d\u0001\u0000\u0000\u0000\u088e\u081e\u0001"+ - "\u0000\u0000\u0000\u088e\u082a\u0001\u0000\u0000\u0000\u088e\u083a\u0001"+ - "\u0000\u0000\u0000\u088e\u0847\u0001\u0000\u0000\u0000\u088e\u0857\u0001"+ - "\u0000\u0000\u0000\u088e\u0864\u0001\u0000\u0000\u0000\u088e\u087d\u0001"+ - "\u0000\u0000\u0000\u088f\u0890\u0001\u0000\u0000\u0000\u0890\u0891\u0006"+ - "~\t\u0000\u0891\u010b\u0001\u0000\u0000\u0000\u0892\u0893\u0003\u00fe"+ - "x\u0000\u0893\u0894\u0001\u0000\u0000\u0000\u0894\u0895\u0006\u007f\u0012"+ - "\u0000\u0895\u010d\u0001\u0000\u0000\u0000\u0896\u0897\u0003\u0100y\u0000"+ - "\u0897\u0898\u0001\u0000\u0000\u0000\u0898\u0899\u0006\u0080\u0013\u0000"+ - "\u0899\u010f\u0001\u0000\u0000\u0000\u089a\u089c\u0005\\\u0000\u0000\u089b"+ - "\u089a\u0001\u0000\u0000\u0000\u089b\u089c\u0001\u0000\u0000\u0000\u089c"+ - "\u08a0\u0001\u0000\u0000\u0000\u089d\u089e\u0003\u00f0q\u0000\u089e\u089f"+ - "\u0005\\\u0000\u0000\u089f\u08a1\u0001\u0000\u0000\u0000\u08a0\u089d\u0001"+ - "\u0000\u0000\u0000\u08a1\u08a2\u0001\u0000\u0000\u0000\u08a2\u08a0\u0001"+ - "\u0000\u0000\u0000\u08a2\u08a3\u0001\u0000\u0000\u0000\u08a3\u08a4\u0001"+ - "\u0000\u0000\u0000\u08a4\u08a5\u0006\u0081\u0014\u0000\u08a5\u0111\u0001"+ - "\u0000\u0000\u0000\u08a6\u08a7\u0003\u00f0q\u0000\u08a7\u08a8\u0001\u0000"+ - "\u0000\u0000\u08a8\u08a9\u0006\u0082\u0015\u0000\u08a9\u0113\u0001\u0000"+ - "\u0000\u0000\u08aa\u08ab\u0005:\u0000\u0000\u08ab\u08ac\u0005:\u0000\u0000"+ - "\u08ac\u08ad\u0001\u0000\u0000\u0000\u08ad\u08ae\u0006\u0083\u0016\u0000"+ - "\u08ae\u0115\u0001\u0000\u0000\u0000\u08af\u08b0\u0005}\u0000\u0000\u08b0"+ - "\u08b1\u0005}\u0000\u0000\u08b1\u08b2\u0001\u0000\u0000\u0000\u08b2\u08b3"+ - "\u0006\u0084\u0017\u0000\u08b3\u0117\u0001\u0000\u0000\u0000\u08b4\u08b5"+ - "\u0005(\u0000\u0000\u08b5\u08b6\u0001\u0000\u0000\u0000\u08b6\u08b7\u0006"+ - "\u0085\u0018\u0000\u08b7\u0119\u0001\u0000\u0000\u0000\u08b8\u08b9\u0005"+ - ")\u0000\u0000\u08b9\u08ba\u0001\u0000\u0000\u0000\u08ba\u08bb\u0006\u0086"+ - "\u0019\u0000\u08bb\u011b\u0001\u0000\u0000\u0000\u08bc\u08bd\u0005-\u0000"+ - "\u0000\u08bd\u08be\u0005>\u0000\u0000\u08be\u08bf\u0001\u0000\u0000\u0000"+ - "\u08bf\u08c0\u0006\u0087\u001a\u0000\u08c0\u011d\u0001\u0000\u0000\u0000"+ - "\u08c1\u08c2\t\u0000\u0000\u0000\u08c2\u08c3\u0001\u0000\u0000\u0000\u08c3"+ - "\u08c4\u0006\u0088\r\u0000\u08c4\u011f\u0001\u0000\u0000\u0000\u08c5\u08c6"+ - "\u0005\u0000\u0000\u0001\u08c6\u08c7\u0001\u0000\u0000\u0000\u08c7\u08c8"+ - "\u0006\u0089\u001b\u0000\u08c8\u08c9\u0006\u0089\u0017\u0000\u08c9\u0121"+ - "\u0001\u0000\u0000\u0000\u08ca\u08cb\u0003\u00fex\u0000\u08cb\u08cc\u0001"+ - "\u0000\u0000\u0000\u08cc\u08cd\u0006\u008a\u0012\u0000\u08cd\u0123\u0001"+ - "\u0000\u0000\u0000\u08ce\u08cf\u0003\u0100y\u0000\u08cf\u08d0\u0001\u0000"+ - "\u0000\u0000\u08d0\u08d1\u0006\u008b\u0013\u0000\u08d1\u0125\u0001\u0000"+ - "\u0000\u0000\u08d2\u08d4\u0005\\\u0000\u0000\u08d3\u08d2\u0001\u0000\u0000"+ - "\u0000\u08d3\u08d4\u0001\u0000\u0000\u0000\u08d4\u08d8\u0001\u0000\u0000"+ - "\u0000\u08d5\u08d6\u0003\u00f0q\u0000\u08d6\u08d7\u0005\\\u0000\u0000"+ - "\u08d7\u08d9\u0001\u0000\u0000\u0000\u08d8\u08d5\u0001\u0000\u0000\u0000"+ - "\u08d9\u08da\u0001\u0000\u0000\u0000\u08da\u08d8\u0001\u0000\u0000\u0000"+ - "\u08da\u08db\u0001\u0000\u0000\u0000\u08db\u08dc\u0001\u0000\u0000\u0000"+ - "\u08dc\u08dd\u0006\u008c\u0014\u0000\u08dd\u0127\u0001\u0000\u0000\u0000"+ - "\u08de\u08df\u0003\u00f0q\u0000\u08df\u08e0\u0001\u0000\u0000\u0000\u08e0"+ - "\u08e1\u0006\u008d\u0015\u0000\u08e1\u0129\u0001\u0000\u0000\u0000\u08e2"+ - "\u08e3\u0005:\u0000\u0000\u08e3\u08e4\u0005:\u0000\u0000\u08e4\u08e5\u0001"+ - "\u0000\u0000\u0000\u08e5\u08e6\u0006\u008e\u0016\u0000\u08e6\u012b\u0001"+ - "\u0000\u0000\u0000\u08e7\u08e8\u0005!\u0000\u0000\u08e8\u08e9\u0005!\u0000"+ - "\u0000\u08e9\u08ea\u0005}\u0000\u0000\u08ea\u08eb\u0001\u0000\u0000\u0000"+ - "\u08eb\u08ec\u0006\u008f\u0017\u0000\u08ec\u012d\u0001\u0000\u0000\u0000"+ - "\u08ed\u08ee\u0005(\u0000\u0000\u08ee\u08ef\u0001\u0000\u0000\u0000\u08ef"+ - "\u08f0\u0006\u0090\u0018\u0000\u08f0\u012f\u0001\u0000\u0000\u0000\u08f1"+ - "\u08f2\u0005)\u0000\u0000\u08f2\u08f3\u0001\u0000\u0000\u0000\u08f3\u08f4"+ - "\u0006\u0091\u0019\u0000\u08f4\u0131\u0001\u0000\u0000\u0000\u08f5\u08f6"+ - "\u0005-\u0000\u0000\u08f6\u08f7\u0005>\u0000\u0000\u08f7\u08f8\u0001\u0000"+ - "\u0000\u0000\u08f8\u08f9\u0006\u0092\u001a\u0000\u08f9\u0133\u0001\u0000"+ - "\u0000\u0000\u08fa\u08fb\t\u0000\u0000\u0000\u08fb\u08fc\u0001\u0000\u0000"+ - "\u0000\u08fc\u08fd\u0006\u0093\r\u0000\u08fd\u0135\u0001\u0000\u0000\u0000"+ - "\u08fe\u08ff\u0005\u0000\u0000\u0001\u08ff\u0900\u0001\u0000\u0000\u0000"+ - "\u0900\u0901\u0006\u0094\u001b\u0000\u0901\u0902\u0006\u0094\u0017\u0000"+ - "\u0902\u0137\u0001\u0000\u0000\u0000\u0903\u0905\u0007%\u0000\u0000\u0904"+ - "\u0903\u0001\u0000\u0000\u0000\u0905\u0906\u0001\u0000\u0000\u0000\u0906"+ - "\u0904\u0001\u0000\u0000\u0000\u0906\u0907\u0001\u0000\u0000\u0000\u0907"+ - "\u0908\u0001\u0000\u0000\u0000\u0908\u0909\u0004\u0095\u0007\u0000\u0909"+ - "\u090a\u0001\u0000\u0000\u0000\u090a\u090b\u0006\u0095\r\u0000\u090b\u090c"+ - "\u0006\u0095\u0017\u0000\u090c\u0139\u0001\u0000\u0000\u0000\u090d\u090f"+ - "\u0007%\u0000\u0000\u090e\u090d\u0001\u0000\u0000\u0000\u090f\u0910\u0001"+ - "\u0000\u0000\u0000\u0910\u090e\u0001\u0000\u0000\u0000\u0910\u0911\u0001"+ - "\u0000\u0000\u0000\u0911\u0912\u0001\u0000\u0000\u0000\u0912\u0913\u0006"+ - "\u0096\r\u0000\u0913\u013b\u0001\u0000\u0000\u0000\u0914\u0915\u0005("+ - "\u0000\u0000\u0915\u0916\u0001\u0000\u0000\u0000\u0916\u0917\u0006\u0097"+ - "\u001c\u0000\u0917\u0918\u0006\u0097\u001d\u0000\u0918\u013d\u0001\u0000"+ - "\u0000\u0000\u0919\u091a\t\u0000\u0000\u0000\u091a\u091b\u0004\u0098\b"+ - "\u0000\u091b\u091c\u0001\u0000\u0000\u0000\u091c\u091d\u0006\u0098\t\u0000"+ - "\u091d\u091e\u0006\u0098\u0017\u0000\u091e\u013f\u0001\u0000\u0000\u0000"+ - "\u091f\u0920\t\u0000\u0000\u0000\u0920\u0921\u0001\u0000\u0000\u0000\u0921"+ - "\u0922\u0006\u0099\t\u0000\u0922\u0923\u0006\u0099\u0017\u0000\u0923\u0141"+ - "\u0001\u0000\u0000\u0000\u0924\u0925\u0004\u009a\t\u0000\u0925\u0926\u0005"+ - "(\u0000\u0000\u0926\u0927\u0006\u009a\u001e\u0000\u0927\u0928\u0001\u0000"+ - "\u0000\u0000\u0928\u0929\u0006\u009a\u001c\u0000\u0929\u0143\u0001\u0000"+ - "\u0000\u0000\u092a\u092b\u0004\u009b\n\u0000\u092b\u092c\u0005)\u0000"+ - "\u0000\u092c\u092d\u0006\u009b\u001f\u0000\u092d\u092e\u0001\u0000\u0000"+ - "\u0000\u092e\u092f\u0006\u009b \u0000\u092f\u0930\u0006\u009b!\u0000\u0930"+ - "\u0145\u0001\u0000\u0000\u0000\u0931\u0932\u0004\u009c\u000b\u0000\u0932"+ - "\u0933\u0005(\u0000\u0000\u0933\u0934\u0006\u009c\"\u0000\u0934\u0935"+ - "\u0001\u0000\u0000\u0000\u0935\u0936\u0006\u009c\u001c\u0000\u0936\u0147"+ - "\u0001\u0000\u0000\u0000\u0937\u0938\u0004\u009d\f\u0000\u0938\u0939\u0005"+ - ")\u0000\u0000\u0939\u093a\u0006\u009d#\u0000\u093a\u093b\u0001\u0000\u0000"+ - "\u0000\u093b\u093c\u0006\u009d\u001c\u0000\u093c\u0149\u0001\u0000\u0000"+ - "\u0000\u093d\u093e\u0005)\u0000\u0000\u093e\u093f\u0004\u009e\r\u0000"+ - "\u093f\u0940\u0001\u0000\u0000\u0000\u0940\u0941\u0006\u009e \u0000\u0941"+ - "\u0942\u0006\u009e!\u0000\u0942\u014b\u0001\u0000\u0000\u0000\u0943\u0944"+ - "\t\u0000\u0000\u0000\u0944\u0945\u0001\u0000\u0000\u0000\u0945\u0946\u0006"+ - "\u009f\u001c\u0000\u0946\u014d\u0001\u0000\u0000\u0000\u0947\u0948\u0005"+ - "\u0000\u0000\u0001\u0948\u0949\u0001\u0000\u0000\u0000\u0949\u094a\u0006"+ - "\u00a0\u001b\u0000\u094a\u094b\u0006\u00a0\u0017\u0000\u094b\u014f\u0001"+ - "\u0000\u0000\u0000\u094c\u094e\u0007%\u0000\u0000\u094d\u094c\u0001\u0000"+ - "\u0000\u0000\u094e\u094f\u0001\u0000\u0000\u0000\u094f\u094d\u0001\u0000"+ - "\u0000\u0000\u094f\u0950\u0001\u0000\u0000\u0000\u0950\u0951\u0001\u0000"+ - "\u0000\u0000\u0951\u0952\u0006\u00a1\r\u0000\u0952\u0151\u0001\u0000\u0000"+ - "\u0000\u0953\u0954\u0005(\u0000\u0000\u0954\u0955\u0006\u00a2$\u0000\u0955"+ - "\u0956\u0001\u0000\u0000\u0000\u0956\u0957\u0006\u00a2%\u0000\u0957\u0153"+ - "\u0001\u0000\u0000\u0000\u0958\u0959\t\u0000\u0000\u0000\u0959\u095a\u0001"+ - "\u0000\u0000\u0000\u095a\u095b\u0006\u00a3\t\u0000\u095b\u095c\u0006\u00a3"+ - "\u0017\u0000\u095c\u0155\u0001\u0000\u0000\u0000\u095d\u095e\u0005[\u0000"+ - "\u0000\u095e\u095f\u0006\u00a4&\u0000\u095f\u0960\u0001\u0000\u0000\u0000"+ - "\u0960\u0961\u0006\u00a4\'\u0000\u0961\u0157\u0001\u0000\u0000\u0000\u0962"+ - "\u0963\u0005]\u0000\u0000\u0963\u0964\u0006\u00a5(\u0000\u0964\u0965\u0001"+ - "\u0000\u0000\u0000\u0965\u0966\u0006\u00a5)\u0000\u0966\u0159\u0001\u0000"+ - "\u0000\u0000\u0967\u0968\u0005{\u0000\u0000\u0968\u0969\u0006\u00a6*\u0000"+ - "\u0969\u096a\u0001\u0000\u0000\u0000\u096a\u096b\u0006\u00a6 \u0000\u096b"+ - "\u015b\u0001\u0000\u0000\u0000\u096c\u096d\u0005}\u0000\u0000\u096d\u096e"+ - "\u0006\u00a7+\u0000\u096e\u096f\u0001\u0000\u0000\u0000\u096f\u0970\u0006"+ - "\u00a7 \u0000\u0970\u015d\u0001\u0000\u0000\u0000\u0971\u0974\u0003\u00f8"+ - "u\u0000\u0972\u0974\u0003\u00fav\u0000\u0973\u0971\u0001\u0000\u0000\u0000"+ - "\u0973\u0972\u0001\u0000\u0000\u0000\u0974\u015f\u0001\u0000\u0000\u0000"+ - "\u0975\u0976\u0003\u00fex\u0000\u0976\u0977\u0001\u0000\u0000\u0000\u0977"+ - "\u0978\u0006\u00a9\u0012\u0000\u0978\u0161\u0001\u0000\u0000\u0000\u0979"+ - "\u097a\u0003\u0100y\u0000\u097a\u097b\u0001\u0000\u0000\u0000\u097b\u097c"+ - "\u0006\u00aa\u0013\u0000\u097c\u0163\u0001\u0000\u0000\u0000\u097d\u097f"+ - "\u0005\\\u0000\u0000\u097e\u097d\u0001\u0000\u0000\u0000\u097e\u097f\u0001"+ - "\u0000"; + "\u0894\u0007\r\u0000\u0000\u07d7\u07d8\u0005@\u0000\u0000\u07d8\u07d9"+ + "\u0007\u0005\u0000\u0000\u07d9\u07da\u0007\u0012\u0000\u0000\u07da\u07db"+ + "\u0007\u0013\u0000\u0000\u07db\u07dc\u0007\u0015\u0000\u0000\u07dc\u07dd"+ + "\u0007\u0016\u0000\u0000\u07dd\u0894\u0007\r\u0000\u0000\u07de\u07df\u0005"+ + "@\u0000\u0000\u07df\u07e0\u0007\n\u0000\u0000\u07e0\u07e1\u0007\u0010"+ + "\u0000\u0000\u07e1\u07e2\u0007\u0012\u0000\u0000\u07e2\u07e3\u0007\u0007"+ + "\u0000\u0000\u07e3\u07e4\u0007\t\u0000\u0000\u07e4\u07e5\u0007\u0013\u0000"+ + "\u0000\u07e5\u07e6\u0007\u0010\u0000\u0000\u07e6\u07e7\u0007\u000e\u0000"+ + "\u0000\u07e7\u0894\u0007\u0007\u0000\u0000\u07e8\u07e9\u0005@\u0000\u0000"+ + "\u07e9\u07ea\u0007\u000b\u0000\u0000\u07ea\u07eb\u0007\u0015\u0000\u0000"+ + "\u07eb\u07ec\u0007\u000e\u0000\u0000\u07ec\u07ed\u0007\u0011\u0000\u0000"+ + "\u07ed\u07ee\u0007\u0012\u0000\u0000\u07ee\u07ef\u0007\u0007\u0000\u0000"+ + "\u07ef\u07f0\u0007\n\u0000\u0000\u07f0\u0894\u0007\r\u0000\u0000\u07f1"+ + "\u07f2\u0005@\u0000\u0000\u07f2\u07f3\u0007\u0006\u0000\u0000\u07f3\u07f4"+ + "\u0007\u0015\u0000\u0000\u07f4\u07f5\u0007\n\u0000\u0000\u07f5\u07f6\u0007"+ + "\r\u0000\u0000\u07f6\u07f7\u0005-\u0000\u0000\u07f7\u07f8\u0007\u0006"+ + "\u0000\u0000\u07f8\u07f9\u0007\u0010\u0000\u0000\u07f9\u07fa\u0007\u000e"+ + "\u0000\u0000\u07fa\u0894\u0007\u0007\u0000\u0000\u07fb\u07fc\u0005@\u0000"+ + "\u0000\u07fc\u07fd\u0007\u0013\u0000\u0000\u07fd\u07fe\u0007\u0010\u0000"+ + "\u0000\u07fe\u07ff\u0007\u001b\u0000\u0000\u07ff\u0894\u0007\u0007\u0000"+ + "\u0000\u0800\u0801\u0005@\u0000\u0000\u0801\u0802\u0007\b\u0000\u0000"+ + "\u0802\u0803\u0007\u0010\u0000\u0000\u0803\u0804\u0007\u0014\u0000\u0000"+ + "\u0804\u0805\u0007\u0007\u0000\u0000\u0805\u0894\u0007\u0016\u0000\u0000"+ + "\u0806\u0807\u0005@\u0000\u0000\u0807\u0808\u0007\t\u0000\u0000\u0808"+ + "\u0809\u0007\u0011\u0000\u0000\u0809\u080a\u0007\u0013\u0000\u0000\u080a"+ + "\u080b\u0007\u0013\u0000\u0000\u080b\u080c\u0007\u0015\u0000\u0000\u080c"+ + "\u080d\u0007\u0016\u0000\u0000\u080d\u080e\u0007\r\u0000\u0000\u080e\u0894"+ + "\u0007\t\u0000\u0000\u080f\u0810\u0005@\u0000\u0000\u0810\u0811\u0007"+ + "\r\u0000\u0000\u0811\u0812\u0007\u0010\u0000\u0000\u0812\u0813\u0007\u0005"+ + "\u0000\u0000\u0813\u0814\u0007\b\u0000\u0000\u0814\u0815\u0007\f\u0000"+ + "\u0000\u0815\u0816\u0007\u0005\u0000\u0000\u0816\u0817\u0007\n\u0000\u0000"+ + "\u0817\u0894\u0007\u000b\u0000\u0000\u0818\u0819\u0005@\u0000\u0000\u0819"+ + "\u081a\u0007\u0010\u0000\u0000\u081a\u081b\u0007\u0013\u0000\u0000\u081b"+ + "\u081c\u0007\u0013\u0000\u0000\u081c\u081d\u0007\b\u0000\u0000\u081d\u0894"+ + "\u0007\u0014\u0000\u0000\u081e\u081f\u0005@\u0000\u0000\u081f\u0820\u0005"+ + "-\u0000\u0000\u0820\u0821\u0007\f\u0000\u0000\u0821\u0822\u0007\u0007"+ + "\u0000\u0000\u0822\u0823\u0007\u0017\u0000\u0000\u0823\u0824\u0007\u0018"+ + "\u0000\u0000\u0824\u0825\u0007\u0005\u0000\u0000\u0825\u0826\u0007\r\u0000"+ + "\u0000\u0826\u0827\u0005-\u0000\u0000\u0827\u0828\u0007\u0018\u0000\u0000"+ + "\u0828\u0829\u0007\u0007\u0000\u0000\u0829\u082a\u0007\u0014\u0000\u0000"+ + "\u082a\u082b\u0007\u0006\u0000\u0000\u082b\u082c\u0007\u0016\u0000\u0000"+ + "\u082c\u082d\u0007\u0010\u0000\u0000\u082d\u082e\u0007\u0012\u0000\u0000"+ + "\u082e\u082f\u0007\u0007\u0000\u0000\u082f\u0894\u0007\t\u0000\u0000\u0830"+ + "\u0831\u0005@\u0000\u0000\u0831\u0832\u0007\u0018\u0000\u0000\u0832\u0833"+ + "\u0007\u0007\u0000\u0000\u0833\u0834\u0007\u0014\u0000\u0000\u0834\u0835"+ + "\u0007\u0006\u0000\u0000\u0835\u0836\u0007\u0016\u0000\u0000\u0836\u0837"+ + "\u0007\u0010\u0000\u0000\u0837\u0838\u0007\u0012\u0000\u0000\u0838\u0839"+ + "\u0007\u0007\u0000\u0000\u0839\u0894\u0007\t\u0000\u0000\u083a\u083b\u0005"+ + "@\u0000\u0000\u083b\u083c\u0007\u000e\u0000\u0000\u083c\u083d\u0007\u0015"+ + "\u0000\u0000\u083d\u083e\u0007\u0011\u0000\u0000\u083e\u083f\u0007\n\u0000"+ + "\u0000\u083f\u0840\u0007\r\u0000\u0000\u0840\u0841\u0007\u0007\u0000\u0000"+ + "\u0841\u0842\u0007\u0016\u0000\u0000\u0842\u0843\u0005-\u0000\u0000\u0843"+ + "\u0844\u0007\t\u0000\u0000\u0844\u0845\u0007\r\u0000\u0000\u0845\u0846"+ + "\u0007\u0014\u0000\u0000\u0846\u0847\u0007\b\u0000\u0000\u0847\u0894\u0007"+ + "\u0007\u0000\u0000\u0848\u0849\u0005@\u0000\u0000\u0849\u084a\u0007\u0006"+ + "\u0000\u0000\u084a\u084b\u0007\u0015\u0000\u0000\u084b\u084c\u0007\n\u0000"+ + "\u0000\u084c\u084d\u0007\r\u0000\u0000\u084d\u084e\u0005-\u0000\u0000"+ + "\u084e\u084f\u0007\u0006\u0000\u0000\u084f\u0850\u0007\u0007\u0000\u0000"+ + "\u0850\u0851\u0007\u0010\u0000\u0000\u0851\u0852\u0007\r\u0000\u0000\u0852"+ + "\u0853\u0007\u0011\u0000\u0000\u0853\u0854\u0007\u0016\u0000\u0000\u0854"+ + "\u0855\u0007\u0007\u0000\u0000\u0855\u0856\u0005-\u0000\u0000\u0856\u0857"+ + "\u0007\u001c\u0000\u0000\u0857\u0858\u0007\u0010\u0000\u0000\u0858\u0859"+ + "\u0007\b\u0000\u0000\u0859\u085a\u0007\u0011\u0000\u0000\u085a\u085b\u0007"+ + "\u0007\u0000\u0000\u085b\u0894\u0007\t\u0000\u0000\u085c\u085d\u0005@"+ + "\u0000\u0000\u085d\u085e\u0007\u0013\u0000\u0000\u085e\u085f\u0007\u0016"+ + "\u0000\u0000\u085f\u0860\u0007\u0015\u0000\u0000\u0860\u0861\u0007\u0013"+ + "\u0000\u0000\u0861\u0862\u0007\u0007\u0000\u0000\u0862\u0863\u0007\u0016"+ + "\u0000\u0000\u0863\u0864\u0007\r\u0000\u0000\u0864\u0894\u0007\u0014\u0000"+ + "\u0000\u0865\u0866\u0005@\u0000\u0000\u0866\u0867\u0007\t\u0000\u0000"+ + "\u0867\u0868\u0007\u000e\u0000\u0000\u0868\u0869\u0007\u0015\u0000\u0000"+ + "\u0869\u086a\u0007\u0013\u0000\u0000\u086a\u0894\u0007\u0007\u0000\u0000"+ + "\u086b\u086c\u0005@\u0000\u0000\u086c\u086d\u0007\t\u0000\u0000\u086d"+ + "\u086e\u0007\r\u0000\u0000\u086e\u086f\u0007\u0010\u0000\u0000\u086f\u0870"+ + "\u0007\u0016\u0000\u0000\u0870\u0871\u0007\r\u0000\u0000\u0871\u0872\u0007"+ + "\u0005\u0000\u0000\u0872\u0873\u0007\n\u0000\u0000\u0873\u0874\u0007\u001b"+ + "\u0000\u0000\u0874\u0875\u0005-\u0000\u0000\u0875\u0876\u0007\t\u0000"+ + "\u0000\u0876\u0877\u0007\r\u0000\u0000\u0877\u0878\u0007\u0014\u0000\u0000"+ + "\u0878\u0879\u0007\b\u0000\u0000\u0879\u0894\u0007\u0007\u0000\u0000\u087a"+ + "\u087b\u0005@\u0000\u0000\u087b\u087c\u0007\t\u0000\u0000\u087c\u087d"+ + "\u0007\u0011\u0000\u0000\u087d\u087e\u0007\u0013\u0000\u0000\u087e\u087f"+ + "\u0007\u0013\u0000\u0000\u087f\u0880\u0007\u0015\u0000\u0000\u0880\u0881"+ + "\u0007\u0016\u0000\u0000\u0881\u0882\u0007\r\u0000\u0000\u0882\u0894\u0007"+ + "\t\u0000\u0000\u0883\u0884\u0005@\u0000\u0000\u0884\u0885\u0007\u001c"+ + "\u0000\u0000\u0885\u0886\u0007\u0005\u0000\u0000\u0886\u0887\u0007\u0007"+ + "\u0000\u0000\u0887\u0888\u0007\f\u0000\u0000\u0888\u0889\u0005-\u0000"+ + "\u0000\u0889\u088a\u0007\r\u0000\u0000\u088a\u088b\u0007\u0016\u0000\u0000"+ + "\u088b\u088c\u0007\u0010\u0000\u0000\u088c\u088d\u0007\n\u0000\u0000\u088d"+ + "\u088e\u0007\t\u0000\u0000\u088e\u088f\u0007\u0005\u0000\u0000\u088f\u0890"+ + "\u0007\r\u0000\u0000\u0890\u0891\u0007\u0005\u0000\u0000\u0891\u0892\u0007"+ + "\u0015\u0000\u0000\u0892\u0894\u0007\n\u0000\u0000\u0893\u07cf\u0001\u0000"+ + "\u0000\u0000\u0893\u07d7\u0001\u0000\u0000\u0000\u0893\u07de\u0001\u0000"+ + "\u0000\u0000\u0893\u07e8\u0001\u0000\u0000\u0000\u0893\u07f1\u0001\u0000"+ + "\u0000\u0000\u0893\u07fb\u0001\u0000\u0000\u0000\u0893\u0800\u0001\u0000"+ + "\u0000\u0000\u0893\u0806\u0001\u0000\u0000\u0000\u0893\u080f\u0001\u0000"+ + "\u0000\u0000\u0893\u0818\u0001\u0000\u0000\u0000\u0893\u081e\u0001\u0000"+ + "\u0000\u0000\u0893\u0830\u0001\u0000\u0000\u0000\u0893\u083a\u0001\u0000"+ + "\u0000\u0000\u0893\u0848\u0001\u0000\u0000\u0000\u0893\u085c\u0001\u0000"+ + "\u0000\u0000\u0893\u0865\u0001\u0000\u0000\u0000\u0893\u086b\u0001\u0000"+ + "\u0000\u0000\u0893\u087a\u0001\u0000\u0000\u0000\u0893\u0883\u0001\u0000"+ + "\u0000\u0000\u0894\u0898\u0001\u0000\u0000\u0000\u0895\u0897\u0007%\u0000"+ + "\u0000\u0896\u0895\u0001\u0000\u0000\u0000\u0897\u089a\u0001\u0000\u0000"+ + "\u0000\u0898\u0896\u0001\u0000\u0000\u0000\u0898\u0899\u0001\u0000\u0000"+ + "\u0000\u0899\u089c\u0001\u0000\u0000\u0000\u089a\u0898\u0001\u0000\u0000"+ + "\u0000\u089b\u07b0\u0001\u0000\u0000\u0000\u089b\u07b3\u0001\u0000\u0000"+ + "\u0000\u089b\u07b9\u0001\u0000\u0000\u0000\u089b\u07bf\u0001\u0000\u0000"+ + "\u0000\u089b\u0893\u0001\u0000\u0000\u0000\u089c\u089d\u0001\u0000\u0000"+ + "\u0000\u089d\u089e\u0006~\t\u0000\u089e\u010b\u0001\u0000\u0000\u0000"+ + "\u089f\u08a0\u0003\u00fex\u0000\u08a0\u08a1\u0001\u0000\u0000\u0000\u08a1"+ + "\u08a2\u0006\u007f\u0012\u0000\u08a2\u010d\u0001\u0000\u0000\u0000\u08a3"+ + "\u08a4\u0003\u0100y\u0000\u08a4\u08a5\u0001\u0000\u0000\u0000\u08a5\u08a6"+ + "\u0006\u0080\u0013\u0000\u08a6\u010f\u0001\u0000\u0000\u0000\u08a7\u08a9"+ + "\u0005\\\u0000\u0000\u08a8\u08a7\u0001\u0000\u0000\u0000\u08a8\u08a9\u0001"+ + "\u0000\u0000\u0000\u08a9\u08ad\u0001\u0000\u0000\u0000\u08aa\u08ab\u0003"+ + "\u00f0q\u0000\u08ab\u08ac\u0005\\\u0000\u0000\u08ac\u08ae\u0001\u0000"+ + "\u0000\u0000\u08ad\u08aa\u0001\u0000\u0000\u0000\u08ae\u08af\u0001\u0000"+ + "\u0000\u0000\u08af\u08ad\u0001\u0000\u0000\u0000\u08af\u08b0\u0001\u0000"+ + "\u0000\u0000\u08b0\u08b1\u0001\u0000\u0000\u0000\u08b1\u08b2\u0006\u0081"+ + "\u0014\u0000\u08b2\u0111\u0001\u0000\u0000\u0000\u08b3\u08b4\u0003\u00f0"+ + "q\u0000\u08b4\u08b5\u0001\u0000\u0000\u0000\u08b5\u08b6\u0006\u0082\u0015"+ + "\u0000\u08b6\u0113\u0001\u0000\u0000\u0000\u08b7\u08b8\u0005:\u0000\u0000"+ + "\u08b8\u08b9\u0005:\u0000\u0000\u08b9\u08ba\u0001\u0000\u0000\u0000\u08ba"+ + "\u08bb\u0006\u0083\u0016\u0000\u08bb\u0115\u0001\u0000\u0000\u0000\u08bc"+ + "\u08bd\u0005}\u0000\u0000\u08bd\u08be\u0005}\u0000\u0000\u08be\u08bf\u0001"+ + "\u0000\u0000\u0000\u08bf\u08c0\u0006\u0084\u0017\u0000\u08c0\u0117\u0001"+ + "\u0000\u0000\u0000\u08c1\u08c2\u0005(\u0000\u0000\u08c2\u08c3\u0001\u0000"+ + "\u0000\u0000\u08c3\u08c4\u0006\u0085\u0018\u0000\u08c4\u0119\u0001\u0000"+ + "\u0000\u0000\u08c5\u08c6\u0005)\u0000\u0000\u08c6\u08c7\u0001\u0000\u0000"+ + "\u0000\u08c7\u08c8\u0006\u0086\u0019\u0000\u08c8\u011b\u0001\u0000\u0000"+ + "\u0000\u08c9\u08ca\u0005-\u0000\u0000\u08ca\u08cb\u0005>\u0000\u0000\u08cb"+ + "\u08cc\u0001\u0000\u0000\u0000\u08cc\u08cd\u0006\u0087\u001a\u0000\u08cd"+ + "\u011d\u0001\u0000\u0000\u0000\u08ce\u08cf\t\u0000\u0000\u0000\u08cf\u08d0"+ + "\u0001\u0000\u0000\u0000\u08d0\u08d1\u0006\u0088\r\u0000\u08d1\u011f\u0001"+ + "\u0000\u0000\u0000\u08d2\u08d3\u0005\u0000\u0000\u0001\u08d3\u08d4\u0001"+ + "\u0000\u0000\u0000\u08d4\u08d5\u0006\u0089\u001b\u0000\u08d5\u08d6\u0006"+ + "\u0089\u0017\u0000\u08d6\u0121\u0001\u0000\u0000\u0000\u08d7\u08d8\u0003"+ + "\u00fex\u0000\u08d8\u08d9\u0001\u0000\u0000\u0000\u08d9\u08da\u0006\u008a"+ + "\u0012\u0000\u08da\u0123\u0001\u0000\u0000\u0000\u08db\u08dc\u0003\u0100"+ + "y\u0000\u08dc\u08dd\u0001\u0000\u0000\u0000\u08dd\u08de\u0006\u008b\u0013"+ + "\u0000\u08de\u0125\u0001\u0000\u0000\u0000\u08df\u08e1\u0005\\\u0000\u0000"+ + "\u08e0\u08df\u0001\u0000\u0000\u0000\u08e0\u08e1\u0001\u0000\u0000\u0000"+ + "\u08e1\u08e5\u0001\u0000\u0000\u0000\u08e2\u08e3\u0003\u00f0q\u0000\u08e3"+ + "\u08e4\u0005\\\u0000\u0000\u08e4\u08e6\u0001\u0000\u0000\u0000\u08e5\u08e2"+ + "\u0001\u0000\u0000\u0000\u08e6\u08e7\u0001\u0000\u0000\u0000\u08e7\u08e5"+ + "\u0001\u0000\u0000\u0000\u08e7\u08e8\u0001\u0000\u0000\u0000\u08e8\u08e9"+ + "\u0001\u0000\u0000\u0000\u08e9\u08ea\u0006\u008c\u0014\u0000\u08ea\u0127"+ + "\u0001\u0000\u0000\u0000\u08eb\u08ec\u0003\u00f0q\u0000\u08ec\u08ed\u0001"+ + "\u0000\u0000\u0000\u08ed\u08ee\u0006\u008d\u0015\u0000\u08ee\u0129\u0001"+ + "\u0000\u0000\u0000\u08ef\u08f0\u0005:\u0000\u0000\u08f0\u08f1\u0005:\u0000"+ + "\u0000\u08f1\u08f2\u0001\u0000\u0000\u0000\u08f2\u08f3\u0006\u008e\u0016"+ + "\u0000\u08f3\u012b\u0001\u0000\u0000\u0000\u08f4\u08f5\u0005!\u0000\u0000"+ + "\u08f5\u08f6\u0005!\u0000\u0000\u08f6\u08f7\u0005}\u0000\u0000\u08f7\u08f8"+ + "\u0001\u0000\u0000\u0000\u08f8\u08f9\u0006\u008f\u0017\u0000\u08f9\u012d"+ + "\u0001\u0000\u0000\u0000\u08fa\u08fb\u0005(\u0000\u0000\u08fb\u08fc\u0001"+ + "\u0000\u0000\u0000\u08fc\u08fd\u0006\u0090\u0018\u0000\u08fd\u012f\u0001"+ + "\u0000\u0000\u0000\u08fe\u08ff\u0005)\u0000\u0000\u08ff\u0900\u0001\u0000"+ + "\u0000\u0000\u0900\u0901\u0006\u0091\u0019\u0000\u0901\u0131\u0001\u0000"+ + "\u0000\u0000\u0902\u0903\u0005-\u0000\u0000\u0903\u0904\u0005>\u0000\u0000"+ + "\u0904\u0905\u0001\u0000\u0000\u0000\u0905\u0906\u0006\u0092\u001a\u0000"+ + "\u0906\u0133\u0001\u0000\u0000\u0000\u0907\u0908\t\u0000\u0000\u0000\u0908"+ + "\u0909\u0001\u0000\u0000\u0000\u0909\u090a\u0006\u0093\r\u0000\u090a\u0135"+ + "\u0001\u0000\u0000\u0000\u090b\u090c\u0005\u0000\u0000\u0001\u090c\u090d"+ + "\u0001\u0000\u0000\u0000\u090d\u090e\u0006\u0094\u001b\u0000\u090e\u090f"+ + "\u0006\u0094\u0017\u0000\u090f\u0137\u0001\u0000\u0000\u0000\u0910\u0912"+ + "\u0007%\u0000\u0000\u0911\u0910\u0001\u0000\u0000\u0000\u0912\u0913\u0001"+ + "\u0000\u0000\u0000\u0913\u0911\u0001\u0000\u0000\u0000\u0913\u0914\u0001"+ + "\u0000\u0000\u0000\u0914\u0915\u0001\u0000\u0000\u0000\u0915\u0916\u0004"+ + "\u0095\u0007\u0000\u0916\u0917\u0001\u0000\u0000\u0000\u0917\u0918\u0006"+ + "\u0095\r\u0000\u0918\u0919\u0006\u0095\u0017\u0000\u0919\u0139\u0001\u0000"+ + "\u0000\u0000\u091a\u091c\u0007%\u0000\u0000\u091b\u091a\u0001\u0000\u0000"+ + "\u0000\u091c\u091d\u0001\u0000\u0000\u0000\u091d\u091b\u0001\u0000\u0000"+ + "\u0000\u091d\u091e\u0001\u0000\u0000\u0000\u091e\u091f\u0001\u0000\u0000"+ + "\u0000\u091f\u0920\u0006\u0096\r\u0000\u0920\u013b\u0001\u0000\u0000\u0000"+ + "\u0921\u0922\u0005(\u0000\u0000\u0922\u0923\u0001\u0000\u0000\u0000\u0923"+ + "\u0924\u0006\u0097\u001c\u0000\u0924\u0925\u0006\u0097\u001d\u0000\u0925"+ + "\u013d\u0001\u0000\u0000\u0000\u0926\u0927\t\u0000\u0000\u0000\u0927\u0928"+ + "\u0004\u0098\b\u0000\u0928\u0929\u0001\u0000\u0000\u0000\u0929\u092a\u0006"+ + "\u0098\t\u0000\u092a\u092b\u0006\u0098\u0017\u0000\u092b\u013f\u0001\u0000"+ + "\u0000\u0000\u092c\u092d\t\u0000\u0000\u0000\u092d\u092e\u0001\u0000\u0000"+ + "\u0000\u092e\u092f\u0006\u0099\t\u0000\u092f\u0930\u0006\u0099\u0017\u0000"+ + "\u0930\u0141\u0001\u0000\u0000\u0000\u0931\u0932\u0004\u009a\t\u0000\u0932"+ + "\u0933\u0005(\u0000\u0000\u0933\u0934\u0006\u009a\u001e\u0000\u0934\u0935"+ + "\u0001\u0000\u0000\u0000\u0935\u0936\u0006\u009a\u001c\u0000\u0936\u0143"+ + "\u0001\u0000\u0000\u0000\u0937\u0938\u0004\u009b\n\u0000\u0938\u0939\u0005"+ + ")\u0000\u0000\u0939\u093a\u0006\u009b\u001f\u0000\u093a\u093b\u0001\u0000"+ + "\u0000\u0000\u093b\u093c\u0006\u009b \u0000\u093c\u093d\u0006\u009b!\u0000"+ + "\u093d\u0145\u0001\u0000\u0000\u0000\u093e\u093f\u0004\u009c\u000b\u0000"+ + "\u093f\u0940\u0005(\u0000\u0000\u0940\u0941\u0006\u009c\"\u0000\u0941"+ + "\u0942\u0001\u0000\u0000\u0000\u0942\u0943\u0006\u009c\u001c\u0000\u0943"+ + "\u0147\u0001\u0000\u0000\u0000\u0944\u0945\u0004\u009d\f\u0000\u0945\u0946"+ + "\u0005)\u0000\u0000\u0946\u0947\u0006\u009d#\u0000\u0947\u0948\u0001\u0000"+ + "\u0000\u0000\u0948\u0949\u0006\u009d\u001c\u0000\u0949\u0149\u0001\u0000"+ + "\u0000\u0000\u094a\u094b\u0005)\u0000\u0000\u094b\u094c\u0004\u009e\r"+ + "\u0000\u094c\u094d\u0001\u0000\u0000\u0000\u094d\u094e\u0006\u009e \u0000"+ + "\u094e\u094f\u0006\u009e!\u0000\u094f\u014b\u0001\u0000\u0000\u0000\u0950"+ + "\u0951\t\u0000\u0000\u0000\u0951\u0952\u0001\u0000\u0000\u0000\u0952\u0953"+ + "\u0006\u009f\u001c\u0000\u0953\u014d\u0001\u0000\u0000\u0000\u0954\u0955"+ + "\u0005\u0000\u0000\u0001\u0955\u0956\u0001\u0000\u0000\u0000\u0956\u0957"+ + "\u0006\u00a0\u001b\u0000\u0957\u0958\u0006\u00a0\u0017\u0000\u0958\u014f"+ + "\u0001\u0000\u0000\u0000\u0959\u095b\u0007%\u0000\u0000\u095a\u0959\u0001"+ + "\u0000\u0000\u0000\u095b\u095c\u0001\u0000\u0000\u0000\u095c\u095a\u0001"+ + "\u0000\u0000\u0000\u095c\u095d\u0001\u0000\u0000\u0000\u095d\u095e\u0001"+ + "\u0000\u0000\u0000\u095e\u095f\u0006\u00a1\r\u0000\u095f\u0151\u0001\u0000"+ + "\u0000\u0000\u0960\u0961\u0005(\u0000\u0000\u0961\u0962\u0006\u00a2$\u0000"+ + "\u0962\u0963\u0001\u0000\u0000\u0000\u0963\u0964\u0006\u00a2%\u0000\u0964"+ + "\u0153\u0001\u0000\u0000\u0000\u0965\u0966\t\u0000\u0000\u0000\u0966\u0967"+ + "\u0001\u0000\u0000\u0000\u0967\u0968\u0006\u00a3\t\u0000\u0968\u0969\u0006"+ + "\u00a3\u0017\u0000\u0969\u0155\u0001\u0000\u0000\u0000\u096a\u096b\u0005"+ + "[\u0000\u0000\u096b\u096c\u0006\u00a4&\u0000\u096c\u096d\u0001\u0000\u0000"+ + "\u0000\u096d\u096e\u0006\u00a4\'\u0000\u096e\u0157\u0001\u0000\u0000\u0000"+ + "\u096f\u0970\u0005]\u0000\u0000\u0970\u0971\u0006\u00a5(\u0000\u0971\u0972"+ + "\u0001\u0000\u0000\u0000\u0972\u0973\u0006\u00a5)\u0000\u0973\u0159\u0001"+ + "\u0000\u0000\u0000\u0974\u0975\u0005{\u0000\u0000\u0975\u0976\u0006\u00a6"+ + "*\u0000\u0976\u0977\u0001\u0000\u0000\u0000\u0977\u0978\u0006\u00a6 \u0000"+ + "\u0978\u015b\u0001\u0000\u0000\u0000\u0979\u097a\u0005}\u0000\u0000\u097a"+ + "\u097b\u0006\u00a7+\u0000\u097b\u097c\u0001\u0000\u0000\u0000\u097c\u097d"+ + "\u0006\u00a7 \u0000\u097d\u015d\u0001\u0000\u0000\u0000\u097e\u0981\u0003"+ + "\u00f8u\u0000\u097f\u0981\u0003\u00fav\u0000\u0980\u097e\u0001\u0000\u0000"+ + "\u0000\u0980\u097f\u0001\u0000\u0000\u0000\u0981\u015f\u0001\u0000\u0000"+ + "\u0000\u0982\u0983\u0003\u00fex"; private static final String _serializedATNSegment1 = - "\u0000\u0000\u097f\u0983\u0001\u0000\u0000\u0000\u0980\u0981\u0003\u00f0"+ - "q\u0000\u0981\u0982\u0005\\\u0000\u0000\u0982\u0984\u0001\u0000\u0000"+ - "\u0000\u0983\u0980\u0001\u0000\u0000\u0000\u0984\u0985\u0001\u0000\u0000"+ - "\u0000\u0985\u0983\u0001\u0000\u0000\u0000\u0985\u0986\u0001\u0000\u0000"+ - "\u0000\u0986\u0987\u0001\u0000\u0000\u0000\u0987\u0988\u0006\u00ab\u0014"+ - "\u0000\u0988\u0165\u0001\u0000\u0000\u0000\u0989\u098a\u0003\u00f0q\u0000"+ - "\u098a\u098b\u0001\u0000\u0000\u0000\u098b\u098c\u0006\u00ac\u0015\u0000"+ - "\u098c\u0167\u0001\u0000\u0000\u0000\u098d\u098e\u0005:\u0000\u0000\u098e"+ - "\u098f\u0005:\u0000\u0000\u098f\u0990\u0001\u0000\u0000\u0000\u0990\u0991"+ - "\u0006\u00ad\u0016\u0000\u0991\u0169\u0001\u0000\u0000\u0000\u0992\u0993"+ - "\u0005(\u0000\u0000\u0993\u0994\u0006\u00ae,\u0000\u0994\u0995\u0001\u0000"+ - "\u0000\u0000\u0995\u0996\u0006\u00ae\u0018\u0000\u0996\u016b\u0001\u0000"+ - "\u0000\u0000\u0997\u0998\u0005)\u0000\u0000\u0998\u0999\u0006\u00af-\u0000"+ - "\u0999\u016d\u0001\u0000\u0000\u0000\u099a\u099b\t\u0000\u0000\u0000\u099b"+ - "\u099c\u0001\u0000\u0000\u0000\u099c\u099d\u0006\u00b0\r\u0000\u099d\u016f"+ - "\u0001\u0000\u0000\u0000\u099e\u099f\u0005\u0000\u0000\u0001\u099f\u09a0"+ - "\u0001\u0000\u0000\u0000\u09a0\u09a1\u0006\u00b1\u001b\u0000\u09a1\u09a2"+ - "\u0006\u00b1\u0017\u0000\u09a2\u0171\u0001\u0000\u0000\u0000\u09a3\u09a5"+ - "\u0007%\u0000\u0000\u09a4\u09a3\u0001\u0000\u0000\u0000\u09a5\u09a6\u0001"+ - "\u0000\u0000\u0000\u09a6\u09a4\u0001\u0000\u0000\u0000\u09a6\u09a7\u0001"+ - "\u0000\u0000\u0000\u09a7\u09a8\u0001\u0000\u0000\u0000\u09a8\u09a9\u0006"+ - "\u00b2\r\u0000\u09a9\u0173\u0001\u0000\u0000\u0000\u09aa\u09ab\u0005("+ - "\u0000\u0000\u09ab\u09ac\u0006\u00b3.\u0000\u09ac\u09ad\u0001\u0000\u0000"+ - "\u0000\u09ad\u09ae\u0006\u00b3/\u0000\u09ae\u09af\u0006\u00b30\u0000\u09af"+ - "\u0175\u0001\u0000\u0000\u0000\u09b0\u09b1\t\u0000\u0000\u0000\u09b1\u09b2"+ - "\u0001\u0000\u0000\u0000\u09b2\u09b3\u0006\u00b4\t\u0000\u09b3\u09b4\u0006"+ - "\u00b4\u0017\u0000\u09b4\u0177\u0001\u0000\u0000\u0000\u09b5\u09b7\u0007"+ - "%\u0000\u0000\u09b6\u09b5\u0001\u0000\u0000\u0000\u09b7\u09b8\u0001\u0000"+ - "\u0000\u0000\u09b8\u09b6\u0001\u0000\u0000\u0000\u09b8\u09b9\u0001\u0000"+ - "\u0000\u0000\u09b9\u09ba\u0001\u0000\u0000\u0000\u09ba\u09bb\u0006\u00b5"+ - "\r\u0000\u09bb\u0179\u0001\u0000\u0000\u0000\u09bc\u09bd\u0005(\u0000"+ - "\u0000\u09bd\u09be\u0006\u00b61\u0000\u09be\u017b\u0001\u0000\u0000\u0000"+ - "\u09bf\u09c0\u0005)\u0000\u0000\u09c0\u09c1\u0006\u00b72\u0000\u09c1\u017d"+ - "\u0001\u0000\u0000\u0000\u09c2\u09c3\u0007\u0010\u0000\u0000\u09c3\u09c4"+ - "\u0007\t\u0000\u0000\u09c4\u017f\u0001\u0000\u0000\u0000\u09c5\u09c6\u0003"+ - "\u00fex\u0000\u09c6\u09c7\u0001\u0000\u0000\u0000\u09c7\u09c8\u0006\u00b9"+ - "\u0012\u0000\u09c8\u0181\u0001\u0000\u0000\u0000\u09c9\u09ca\u0005=\u0000"+ - "\u0000\u09ca\u09cb\u0005>\u0000\u0000\u09cb\u0183\u0001\u0000\u0000\u0000"+ - "\u09cc\u09cd\u0003\u0100y\u0000\u09cd\u09ce\u0001\u0000\u0000\u0000\u09ce"+ - "\u09cf\u0006\u00bb \u0000\u09cf\u0185\u0001\u0000\u0000\u0000\u09d0\u09d4"+ - "\u0003\u00f8u\u0000\u09d1\u09d4\u0003\u00fav\u0000\u09d2\u09d4\u0003\u00f0"+ - "q\u0000\u09d3\u09d0\u0001\u0000\u0000\u0000\u09d3\u09d1\u0001\u0000\u0000"+ - "\u0000\u09d3\u09d2\u0001\u0000\u0000\u0000\u09d4\u09d5\u0001\u0000\u0000"+ - "\u0000\u09d5\u09d6\u0006\u00bc \u0000\u09d6\u0187\u0001\u0000\u0000\u0000"+ - "\u09d7\u09d8\u0005:\u0000\u0000\u09d8\u09d9\u0005:\u0000\u0000\u09d9\u09da"+ - "\u0001\u0000\u0000\u0000\u09da\u09db\u0006\u00bd \u0000\u09db\u0189\u0001"+ - "\u0000\u0000\u0000\u09dc\u09dd\t\u0000\u0000\u0000\u09dd\u09de\u0001\u0000"+ - "\u0000\u0000\u09de\u09df\u0006\u00be \u0000\u09df\u018b\u0001\u0000\u0000"+ - "\u0000\u09e0\u09e1\u0005\u0000\u0000\u0001\u09e1\u09e2\u0001\u0000\u0000"+ - "\u0000\u09e2\u09e3\u0006\u00bf\u001b\u0000\u09e3\u09e4\u0006\u00bf\u0017"+ - "\u0000\u09e4\u018d\u0001\u0000\u0000\u0000\u09e5\u09e6\u0003\u00fcw\u0000"+ - "\u09e6\u09e7\u0001\u0000\u0000\u0000\u09e7\u09e8\u0006\u00c03\u0000\u09e8"+ - "\u018f\u0001\u0000\u0000\u0000\u09e9\u09ea\u0005[\u0000\u0000\u09ea\u09eb"+ - "\u0006\u00c14\u0000\u09eb\u0191\u0001\u0000\u0000\u0000\u09ec\u09ed\u0005"+ - "]\u0000\u0000\u09ed\u09ee\u0006\u00c25\u0000\u09ee\u0193\u0001\u0000\u0000"+ - "\u0000\u09ef\u09f0\u0005{\u0000\u0000\u09f0\u09f1\u0006\u00c36\u0000\u09f1"+ - "\u09f2\u0001\u0000\u0000\u0000\u09f2\u09f3\u0006\u00c37\u0000\u09f3\u0195"+ - "\u0001\u0000\u0000\u0000\u09f4\u09f5\u0005}\u0000\u0000\u09f5\u09f6\u0006"+ - "\u00c48\u0000\u09f6\u09f7\u0001\u0000\u0000\u0000\u09f7\u09f8\u0006\u00c4"+ - "7\u0000\u09f8\u0197\u0001\u0000\u0000\u0000\u09f9\u09fa\u0005(\u0000\u0000"+ - "\u09fa\u09fb\u0006\u00c59\u0000\u09fb\u09fc\u0001\u0000\u0000\u0000\u09fc"+ - "\u09fd\u0006\u00c57\u0000\u09fd\u0199\u0001\u0000\u0000\u0000\u09fe\u09ff"+ - "\u0005)\u0000\u0000\u09ff\u0a00\u0006\u00c6:\u0000\u0a00\u019b\u0001\u0000"+ - "\u0000\u0000\u0a01\u0a04\u0003\u00f8u\u0000\u0a02\u0a04\u0003\u00fav\u0000"+ - "\u0a03\u0a01\u0001\u0000\u0000\u0000\u0a03\u0a02\u0001\u0000\u0000\u0000"+ - "\u0a04\u019d\u0001\u0000\u0000\u0000\u0a05\u0a06\u0003\u00fex\u0000\u0a06"+ - "\u0a07\u0001\u0000\u0000\u0000\u0a07\u0a08\u0006\u00c8\u0012\u0000\u0a08"+ - "\u019f\u0001\u0000\u0000\u0000\u0a09\u0a0a\u0005=\u0000\u0000\u0a0a\u0a0b"+ - "\u0005>\u0000\u0000\u0a0b\u01a1\u0001\u0000\u0000\u0000\u0a0c\u0a0d\u0003"+ - "\u0100y\u0000\u0a0d\u0a0e\u0001\u0000\u0000\u0000\u0a0e\u0a0f\u0006\u00ca"+ - "\u0013\u0000\u0a0f\u01a3\u0001\u0000\u0000\u0000\u0a10\u0a11\u0005.\u0000"+ - "\u0000\u0a11\u01a5\u0001\u0000\u0000\u0000\u0a12\u0a13\u0005,\u0000\u0000"+ - "\u0a13\u0a14\u0006\u00cc;\u0000\u0a14\u01a7\u0001\u0000\u0000\u0000\u0a15"+ - "\u0a17\u0007&\u0000\u0000\u0a16\u0a15\u0001\u0000\u0000\u0000\u0a17\u0a18"+ - "\u0001\u0000\u0000\u0000\u0a18\u0a16\u0001\u0000\u0000\u0000\u0a18\u0a19"+ - "\u0001\u0000\u0000\u0000\u0a19\u0a1a\u0001\u0000\u0000\u0000\u0a1a\u0a1b"+ - "\u0006\u00cd\r\u0000\u0a1b\u01a9\u0001\u0000\u0000\u0000\u0a1c\u0a1d\u0003"+ - "\u00f0q\u0000\u0a1d\u01ab\u0001\u0000\u0000\u0000\u0a1e\u0a1f\t\u0000"+ - "\u0000\u0000\u0a1f\u0a20\u0001\u0000\u0000\u0000\u0a20\u0a21\u0006\u00cf"+ - "7\u0000\u0a21\u01ad\u0001\u0000\u0000\u0000\u0a22\u0a23\u0005\u0000\u0000"+ - "\u0001\u0a23\u0a24\u0001\u0000\u0000\u0000\u0a24\u0a25\u0006\u00d0\u001b"+ - "\u0000\u0a25\u0a26\u0006\u00d0\u0017\u0000\u0a26\u01af\u0001\u0000\u0000"+ - "\u0000\u0a27\u0a28\u0005/\u0000\u0000\u0a28\u0a29\u0005/\u0000\u0000\u0a29"+ - "\u0a2b\u0001\u0000\u0000\u0000\u0a2a\u0a2c\b\u001f\u0000\u0000\u0a2b\u0a2a"+ - "\u0001\u0000\u0000\u0000\u0a2c\u0a2d\u0001\u0000\u0000\u0000\u0a2d\u0a2b"+ - "\u0001\u0000\u0000\u0000\u0a2d\u0a2e\u0001\u0000\u0000\u0000\u0a2e\u0a2f"+ - "\u0001\u0000\u0000\u0000\u0a2f\u0a30\u0006\u00d1\r\u0000\u0a30\u01b1\u0001"+ - "\u0000\u0000\u0000\u0a31\u0a32\u0005/\u0000\u0000\u0a32\u0a33\u0005*\u0000"+ - "\u0000\u0a33\u0a37\u0001\u0000\u0000\u0000\u0a34\u0a36\t\u0000\u0000\u0000"+ - "\u0a35\u0a34\u0001\u0000\u0000\u0000\u0a36\u0a39\u0001\u0000\u0000\u0000"+ - "\u0a37\u0a38\u0001\u0000\u0000\u0000\u0a37\u0a35\u0001\u0000\u0000\u0000"+ - "\u0a38\u0a3a\u0001\u0000\u0000\u0000\u0a39\u0a37\u0001\u0000\u0000\u0000"+ - "\u0a3a\u0a3b\u0005*\u0000\u0000\u0a3b\u0a3c\u0005/\u0000\u0000\u0a3c\u0a40"+ - "\u0001\u0000\u0000\u0000\u0a3d\u0a3f\u0007\u001f\u0000\u0000\u0a3e\u0a3d"+ - "\u0001\u0000\u0000\u0000\u0a3f\u0a42\u0001\u0000\u0000\u0000\u0a40\u0a3e"+ - "\u0001\u0000\u0000\u0000\u0a40\u0a41\u0001\u0000\u0000\u0000\u0a41\u0a43"+ - "\u0001\u0000\u0000\u0000\u0a42\u0a40\u0001\u0000\u0000\u0000\u0a43\u0a44"+ - "\u0006\u00d2\r\u0000\u0a44\u01b3\u0001\u0000\u0000\u0000\u0a45\u0a46\u0005"+ - "@\u0000\u0000\u0a46\u0a47\u0007\u0007\u0000\u0000\u0a47\u0a48\u0007\n"+ - "\u0000\u0000\u0a48\u0a49\u0007\u000b\u0000\u0000\u0a49\u0a4a\u0007\u0013"+ - "\u0000\u0000\u0a4a\u0a4b\u0007\u000f\u0000\u0000\u0a4b\u0a4c\u0007\u0013"+ - "\u0000\u0000\u0a4c\u0a4d\u0001\u0000\u0000\u0000\u0a4d\u0a4e\u0006\u00d3"+ - "\u0017\u0000\u0a4e\u01b5\u0001\u0000\u0000\u0000\u0a4f\u0a50\u0005@\u0000"+ - "\u0000\u0a50\u0a51\u0001\u0000\u0000\u0000\u0a51\u0a52\u0006\u00d4\t\u0000"+ - "\u0a52\u0a53\u0006\u00d4\u0017\u0000\u0a53\u01b7\u0001\u0000\u0000\u0000"+ - "\u0a54\u0a55\u0005[\u0000\u0000\u0a55\u0a56\u0001\u0000\u0000\u0000\u0a56"+ - "\u0a57\u0006\u00d5 \u0000\u0a57\u01b9\u0001\u0000\u0000\u0000\u0a58\u0a59"+ - "\u0005]\u0000\u0000\u0a59\u0a5a\u0001\u0000\u0000\u0000\u0a5a\u0a5b\u0006"+ - "\u00d6 \u0000\u0a5b\u01bb\u0001\u0000\u0000\u0000\u0a5c\u0a5d\u0005{\u0000"+ - "\u0000\u0a5d\u0a5e\u0001\u0000\u0000\u0000\u0a5e\u0a5f\u0006\u00d7 \u0000"+ - "\u0a5f\u01bd\u0001\u0000\u0000\u0000\u0a60\u0a61\u0005}\u0000\u0000\u0a61"+ - "\u0a62\u0001\u0000\u0000\u0000\u0a62\u0a63\u0006\u00d8 \u0000\u0a63\u01bf"+ - "\u0001\u0000\u0000\u0000\u0a64\u0a67\u0003\u00f8u\u0000\u0a65\u0a67\u0003"+ - "\u00fav\u0000\u0a66\u0a64\u0001\u0000\u0000\u0000\u0a66\u0a65\u0001\u0000"+ - "\u0000\u0000\u0a67\u0a68\u0001\u0000\u0000\u0000\u0a68\u0a69\u0006\u00d9"+ - "<\u0000\u0a69\u01c1\u0001\u0000\u0000\u0000\u0a6a\u0a6b\u0003\u00fex\u0000"+ - "\u0a6b\u0a6c\u0001\u0000\u0000\u0000\u0a6c\u0a6d\u0006\u00da\u0012\u0000"+ - "\u0a6d\u01c3\u0001\u0000\u0000\u0000\u0a6e\u0a6f\u0007\n\u0000\u0000\u0a6f"+ - "\u0a70\u0007\u0007\u0000\u0000\u0a70\u0a71\u0007\f\u0000\u0000\u0a71\u0a72"+ - "\u0001\u0000\u0000\u0000\u0a72\u0a73\u0004\u00db\u000e\u0000\u0a73\u0a74"+ - "\u0001\u0000\u0000\u0000\u0a74\u0a75\u0006\u00db=\u0000\u0a75\u01c5\u0001"+ - "\u0000\u0000\u0000\u0a76\u0a77\u0007\u000e\u0000\u0000\u0a77\u0a78\u0007"+ - "\b\u0000\u0000\u0a78\u0a79\u0007\u0010\u0000\u0000\u0a79\u0a7a\u0007\t"+ - "\u0000\u0000\u0a7a\u0a7b\u0007\t\u0000\u0000\u0a7b\u0a7c\u0001\u0000\u0000"+ - "\u0000\u0a7c\u0a7d\u0006\u00dc>\u0000\u0a7d\u01c7\u0001\u0000\u0000\u0000"+ - "\u0a7e\u0a7f\u0003\u0100y\u0000\u0a7f\u0a80\u0001\u0000\u0000\u0000\u0a80"+ - "\u0a81\u0006\u00dd\u0013\u0000\u0a81\u01c9\u0001\u0000\u0000\u0000\u0a82"+ - "\u0a84\u0005\\\u0000\u0000\u0a83\u0a82\u0001\u0000\u0000\u0000\u0a83\u0a84"+ - "\u0001\u0000\u0000\u0000\u0a84\u0a88\u0001\u0000\u0000\u0000\u0a85\u0a86"+ - "\u0003\u00f0q\u0000\u0a86\u0a87\u0005\\\u0000\u0000\u0a87\u0a89\u0001"+ - "\u0000\u0000\u0000\u0a88\u0a85\u0001\u0000\u0000\u0000\u0a89\u0a8a\u0001"+ - "\u0000\u0000\u0000\u0a8a\u0a88\u0001\u0000\u0000\u0000\u0a8a\u0a8b\u0001"+ - "\u0000\u0000\u0000\u0a8b\u0a8c\u0001\u0000\u0000\u0000\u0a8c\u0a8d\u0006"+ - "\u00de\u0014\u0000\u0a8d\u01cb\u0001\u0000\u0000\u0000\u0a8e\u0a8f\u0005"+ - "\\\u0000\u0000\u0a8f\u0a90\u0003\u00f0q\u0000\u0a90\u0a91\u0001\u0000"+ - "\u0000\u0000\u0a91\u0a92\u0006\u00df\u0015\u0000\u0a92\u01cd\u0001\u0000"+ - "\u0000\u0000\u0a93\u0a94\u0003\u00f0q\u0000\u0a94\u0a95\u0001\u0000\u0000"+ - "\u0000\u0a95\u0a96\u0006\u00e0\u0015\u0000\u0a96\u01cf\u0001\u0000\u0000"+ - "\u0000\u0a97\u0a98\u0005:\u0000\u0000\u0a98\u0a99\u0005:\u0000\u0000\u0a99"+ - "\u0a9a\u0001\u0000\u0000\u0000\u0a9a\u0a9b\u0006\u00e1\u0016\u0000\u0a9b"+ - "\u01d1\u0001\u0000\u0000\u0000\u0a9c\u0a9d\u0005(\u0000\u0000\u0a9d\u0a9e"+ - "\u0001\u0000\u0000\u0000\u0a9e\u0a9f\u0006\u00e2\u0018\u0000\u0a9f\u01d3"+ - "\u0001\u0000\u0000\u0000\u0aa0\u0aa1\u0005)\u0000\u0000\u0aa1\u0aa2\u0001"+ - "\u0000\u0000\u0000\u0aa2\u0aa3\u0006\u00e3\u0019\u0000\u0aa3\u01d5\u0001"+ - "\u0000\u0000\u0000\u0aa4\u0aa5\u0005 \u0000\u0000\u0aa5\u0aa6\u0001\u0000"+ - "\u0000\u0000\u0aa6\u0aa7\u0006\u00e4\r\u0000\u0aa7\u01d7\u0001\u0000\u0000"+ - "\u0000\u0aa8\u0aa9\u0005\u0000\u0000\u0001\u0aa9\u0aaa\u0001\u0000\u0000"+ - "\u0000\u0aaa\u0aab\u0006\u00e5\u001b\u0000\u0aab\u0aac\u0006\u00e5\u0017"+ - "\u0000\u0aac\u01d9\u0001\u0000\u0000\u0000\u0aad\u0aae\t\u0000\u0000\u0000"+ - "\u0aae\u0aaf\u0001\u0000\u0000\u0000\u0aaf\u0ab0\u0006\u00e6\r\u0000\u0ab0"+ - "\u01db\u0001\u0000\u0000\u0000\u0ab1\u0ab2\u0005?\u0000\u0000\u0ab2\u0ab3"+ - "\u0005>\u0000\u0000\u0ab3\u0ab4\u0001\u0000\u0000\u0000\u0ab4\u0ab5\u0006"+ - "\u00e7\u0017\u0000\u0ab5\u01dd\u0001\u0000\u0000\u0000\u0ab6\u0ab7\u0005"+ - "/\u0000\u0000\u0ab7\u0ab8\u0005/\u0000\u0000\u0ab8\u0aba\u0001\u0000\u0000"+ - "\u0000\u0ab9\u0abb\b\u001f\u0000\u0000\u0aba\u0ab9\u0001\u0000\u0000\u0000"+ - "\u0abb\u0abc\u0001\u0000\u0000\u0000\u0abc\u0aba\u0001\u0000\u0000\u0000"+ - "\u0abc\u0abd\u0001\u0000\u0000\u0000\u0abd\u0abe\u0001\u0000\u0000\u0000"+ - "\u0abe\u0abf\u0006\u00e8\r\u0000\u0abf\u01df\u0001\u0000\u0000\u0000\u0ac0"+ - "\u0ac1\u0005/\u0000\u0000\u0ac1\u0ac2\u0005*\u0000\u0000\u0ac2\u0ac6\u0001"+ - "\u0000\u0000\u0000\u0ac3\u0ac5\t\u0000\u0000\u0000\u0ac4\u0ac3\u0001\u0000"+ - "\u0000\u0000\u0ac5\u0ac8\u0001\u0000\u0000\u0000\u0ac6\u0ac7\u0001\u0000"+ - "\u0000\u0000\u0ac6\u0ac4\u0001\u0000\u0000\u0000\u0ac7\u0ac9\u0001\u0000"+ - "\u0000\u0000\u0ac8\u0ac6\u0001\u0000\u0000\u0000\u0ac9\u0aca\u0005*\u0000"+ - "\u0000\u0aca\u0acb\u0005/\u0000\u0000\u0acb\u0acc\u0001\u0000\u0000\u0000"+ - "\u0acc\u0acd\u0006\u00e9\r\u0000\u0acd\u01e1\u0001\u0000\u0000\u0000\u0ace"+ - "\u0acf\u0005[\u0000\u0000\u0acf\u0ad0\u0001\u0000\u0000\u0000\u0ad0\u0ad1"+ - "\u0006\u00ea \u0000\u0ad1\u01e3\u0001\u0000\u0000\u0000\u0ad2\u0ad3\u0005"+ - "]\u0000\u0000\u0ad3\u0ad4\u0001\u0000\u0000\u0000\u0ad4\u0ad5\u0006\u00eb"+ - " \u0000\u0ad5\u01e5\u0001\u0000\u0000\u0000\u0ad6\u0ad7\u0005{\u0000\u0000"+ - "\u0ad7\u0ad8\u0001\u0000\u0000\u0000\u0ad8\u0ad9\u0006\u00ec \u0000\u0ad9"+ - "\u01e7\u0001\u0000\u0000\u0000\u0ada\u0adb\u0005}\u0000\u0000\u0adb\u0adc"+ - "\u0001\u0000\u0000\u0000\u0adc\u0add\u0006\u00ed \u0000\u0add\u01e9\u0001"+ - "\u0000\u0000\u0000\u0ade\u0ae1\u0003\u00f8u\u0000\u0adf\u0ae1\u0003\u00fa"+ - "v\u0000\u0ae0\u0ade\u0001\u0000\u0000\u0000\u0ae0\u0adf\u0001\u0000\u0000"+ - "\u0000\u0ae1\u0ae2\u0001\u0000\u0000\u0000\u0ae2\u0ae3\u0006\u00ee<\u0000"+ - "\u0ae3\u01eb\u0001\u0000\u0000\u0000\u0ae4\u0ae5\u0003\u00fex\u0000\u0ae5"+ - "\u0ae6\u0001\u0000\u0000\u0000\u0ae6\u0ae7\u0006\u00ef\u0012\u0000\u0ae7"+ - "\u01ed\u0001\u0000\u0000\u0000\u0ae8\u0ae9\u0003\u0100y\u0000\u0ae9\u0aea"+ - "\u0001\u0000\u0000\u0000\u0aea\u0aeb\u0006\u00f0\u0013\u0000\u0aeb\u01ef"+ - "\u0001\u0000\u0000\u0000\u0aec\u0aed\u0003\u00f0q\u0000\u0aed\u0aee\u0001"+ - "\u0000\u0000\u0000\u0aee\u0aef\u0006\u00f1\u0015\u0000\u0aef\u01f1\u0001"+ - "\u0000\u0000\u0000\u0af0\u0af1\u0005:\u0000\u0000\u0af1\u0af2\u0005:\u0000"+ - "\u0000\u0af2\u0af3\u0001\u0000\u0000\u0000\u0af3\u0af4\u0006\u00f2\u0016"+ - "\u0000\u0af4\u01f3\u0001\u0000\u0000\u0000\u0af5\u0af6\u0005-\u0000\u0000"+ - "\u0af6\u0af7\u0005>\u0000\u0000\u0af7\u0af8\u0001\u0000\u0000\u0000\u0af8"+ - "\u0af9\u0006\u00f3\u001a\u0000\u0af9\u01f5\u0001\u0000\u0000\u0000\u0afa"+ - "\u0afb\u0005(\u0000\u0000\u0afb\u0afc\u0001\u0000\u0000\u0000\u0afc\u0afd"+ - "\u0006\u00f4\u0018\u0000\u0afd\u01f7\u0001\u0000\u0000\u0000\u0afe\u0aff"+ - "\u0005)\u0000\u0000\u0aff\u0b00\u0001\u0000\u0000\u0000\u0b00\u0b01\u0006"+ - "\u00f5\u0019\u0000\u0b01\u01f9\u0001\u0000\u0000\u0000\u0b02\u0b03\u0005"+ - "\u0000\u0000\u0001\u0b03\u0b04\u0001\u0000\u0000\u0000\u0b04\u0b05\u0006"+ - "\u00f6 \u0000\u0b05\u0b06\u0006\u00f6\u0017\u0000\u0b06\u01fb\u0001\u0000"+ - "\u0000\u0000\u0b07\u0b08\t\u0000\u0000\u0000\u0b08\u0b09\u0001\u0000\u0000"+ - "\u0000\u0b09\u0b0a\u0006\u00f7 \u0000\u0b0a\u01fd\u0001\u0000\u0000\u0000"+ - "\u0b0b\u0b0c\u0005@\u0000\u0000\u0b0c\u0b0d\u0007\u0007\u0000\u0000\u0b0d"+ - "\u0b0e\u0007\n\u0000\u0000\u0b0e\u0b0f\u0007\u000b\u0000\u0000\u0b0f\u0b10"+ - "\u0007\u001c\u0000\u0000\u0b10\u0b11\u0007\u0007\u0000\u0000\u0b11\u0b12"+ - "\u0007\u0016\u0000\u0000\u0b12\u0b13\u0007\u0017\u0000\u0000\u0b13\u0b14"+ - "\u0007\u0010\u0000\u0000\u0b14\u0b15\u0007\r\u0000\u0000\u0b15\u0b16\u0007"+ - "\u0005\u0000\u0000\u0b16\u0b17\u0007\u0012\u0000\u0000\u0b17\u0b18\u0001"+ - "\u0000\u0000\u0000\u0b18\u0b19\u0006\u00f8?\u0000\u0b19\u0b1a\u0006\u00f8"+ - "!\u0000\u0b1a\u01ff\u0001\u0000\u0000\u0000\u0b1b\u0b1c\t\u0000\u0000"+ - "\u0000\u0b1c\u0b1d\u0004\u00f9\u000f\u0000\u0b1d\u0b1e\u0001\u0000\u0000"+ - "\u0000\u0b1e\u0b1f\u0006\u00f9\r\u0000\u0b1f\u0201\u0001\u0000\u0000\u0000"+ - "\u0b20\u0b21\u0005\u0000\u0000\u0001\u0b21\u0b22\u0001\u0000\u0000\u0000"+ - "\u0b22\u0b23\u0006\u00fa\u001b\u0000\u0b23\u0b24\u0006\u00fa!\u0000\u0b24"+ - "\u0203\u0001\u0000\u0000\u0000\u0b25\u0b26\t\u0000\u0000\u0000\u0b26\u0b27"+ - "\u0001\u0000\u0000\u0000\u0b27\u0b28\u0006\u00fb\u001c\u0000\u0b28\u0205"+ - "\u0001\u0000\u0000\u0000\u0b29\u0b2a\u0005-\u0000\u0000\u0b2a\u0b2b\u0005"+ - "-\u0000\u0000\u0b2b\u0b2c\u0005}\u0000\u0000\u0b2c\u0b2d\u0005}\u0000"+ - "\u0000\u0b2d\u0b2e\u0001\u0000\u0000\u0000\u0b2e\u0b2f\u0006\u00fc\u0017"+ - "\u0000\u0b2f\u0b30\u0006\u00fc\r\u0000\u0b30\u0207\u0001\u0000\u0000\u0000"+ - "\u0b31\u0b32\t\u0000\u0000\u0000\u0b32\u0b33\u0004\u00fd\u0010\u0000\u0b33"+ - "\u0b34\u0001\u0000\u0000\u0000\u0b34\u0b35\u0006\u00fd\r\u0000\u0b35\u0209"+ - "\u0001\u0000\u0000\u0000\u0b36\u0b37\t\u0000\u0000\u0000\u0b37\u0b38\u0001"+ - "\u0000\u0000\u0000\u0b38\u0b39\u0006\u00fe\r\u0000\u0b39\u020b\u0001\u0000"+ - "\u0000\u0000\u0b3a\u0b3b\u0005\u0000\u0000\u0001\u0b3b\u0b3c\u0001\u0000"+ - "\u0000\u0000\u0b3c\u0b3d\u0006\u00ff\u0017\u0000\u0b3d\u0b3e\u0006\u00ff"+ - "\r\u0000\u0b3e\u020d\u0001\u0000\u0000\u0000t\u0000\u0001\u0002\u0003"+ - "\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u0212\u0216\u021c\u0220\u0227"+ - "\u022e\u0234\u023a\u0241\u0246\u024d\u0253\u025d\u0263\u0269\u0270\u027c"+ - "\u02e1\u02f8\u0517\u052c\u0539\u054c\u055e\u059e\u05ca\u05ed\u0653\u0699"+ - "\u06a9\u06ab\u06b9\u06c1\u06c8\u06cb\u06d9\u06e0\u06f4\u06fc\u0703\u070b"+ - "\u070f\u0718\u071b\u0722\u0729\u072e\u073a\u073f\u0741\u074d\u0754\u075b"+ - "\u0763\u0765\u076e\u0770\u077b\u0793\u07a8\u07ac\u07b7\u07bd\u07c9\u07cd"+ - "\u07db\u07e9\u07fa\u080a\u081b\u0827\u0837\u0844\u0854\u0861\u087a\u088b"+ - "\u088e\u089b\u08a2\u08d3\u08da\u0906\u0910\u094f\u0973\u097e\u0985\u09a6"+ - "\u09b8\u09d3\u0a03\u0a18\u0a2d\u0a37\u0a40\u0a66\u0a83\u0a8a\u0abc\u0ac6"+ - "\u0ae0@\u0005\u0005\u0000\u0005\u0003\u0000\u0005\b\u0000\u0005\u0007"+ - "\u0000\u0007g\u0000\u0005\n\u0000\u0005\f\u0000\u0005\u0001\u0000\u0005"+ - "\u0002\u0000\u0007\u0017\u0000\u0005\u000b\u0000\u0001c\u0000\u0007s\u0000"+ - "\u0006\u0000\u0000\u0001h\u0001\u0001i\u0002\u0001m\u0003\u0005\r\u0000"+ - "\u0007\u0002\u0000\u0007\u0003\u0000\u0007\u0006\u0000\u0007\u0005\u0000"+ - "\u0007\u0007\u0000\u0004\u0000\u0000\u0007\r\u0000\u0007\u000e\u0000\u0007"+ - "\t\u0000\u0007\u0016\u0000\u0003\u0000\u0000\u0005\u0004\u0000\u0001\u009a"+ - "\u0004\u0001\u009b\u0005\u0007\u0001\u0000\u0002\u0000\u0000\u0001\u009c"+ - "\u0006\u0001\u009d\u0007\u0001\u00a2\b\u0005\u0006\u0000\u0001\u00a4\t"+ - "\u0007\u000f\u0000\u0001\u00a5\n\u0007\u0090\u0000\u0001\u00a6\u000b\u0001"+ - "\u00a7\f\u0001\u00ae\r\u0001\u00af\u000e\u0001\u00b3\u000f\u0007\u000b"+ - "\u0000\u0005\t\u0000\u0001\u00b6\u0010\u0001\u00b7\u0011\u0000\u0002\u0000"+ - "\u0001\u00c1\u0012\u0001\u00c2\u0013\u0001\u00c3\u0014\u0007\n\u0000\u0001"+ - "\u00c4\u0015\u0001\u00c5\u0016\u0001\u00c6\u0017\u0001\u00cc\u0018\u0007"+ - "\u0015\u0000\u0007\u0004\u0000\u0007\b\u0000\u0007i\u0000"; + "\u0000\u0983\u0984\u0001\u0000\u0000\u0000\u0984\u0985\u0006\u00a9\u0012"+ + "\u0000\u0985\u0161\u0001\u0000\u0000\u0000\u0986\u0987\u0003\u0100y\u0000"+ + "\u0987\u0988\u0001\u0000\u0000\u0000\u0988\u0989\u0006\u00aa\u0013\u0000"+ + "\u0989\u0163\u0001\u0000\u0000\u0000\u098a\u098c\u0005\\\u0000\u0000\u098b"+ + "\u098a\u0001\u0000\u0000\u0000\u098b\u098c\u0001\u0000\u0000\u0000\u098c"+ + "\u0990\u0001\u0000\u0000\u0000\u098d\u098e\u0003\u00f0q\u0000\u098e\u098f"+ + "\u0005\\\u0000\u0000\u098f\u0991\u0001\u0000\u0000\u0000\u0990\u098d\u0001"+ + "\u0000\u0000\u0000\u0991\u0992\u0001\u0000\u0000\u0000\u0992\u0990\u0001"+ + "\u0000\u0000\u0000\u0992\u0993\u0001\u0000\u0000\u0000\u0993\u0994\u0001"+ + "\u0000\u0000\u0000\u0994\u0995\u0006\u00ab\u0014\u0000\u0995\u0165\u0001"+ + "\u0000\u0000\u0000\u0996\u0997\u0003\u00f0q\u0000\u0997\u0998\u0001\u0000"+ + "\u0000\u0000\u0998\u0999\u0006\u00ac\u0015\u0000\u0999\u0167\u0001\u0000"+ + "\u0000\u0000\u099a\u099b\u0005:\u0000\u0000\u099b\u099c\u0005:\u0000\u0000"+ + "\u099c\u099d\u0001\u0000\u0000\u0000\u099d\u099e\u0006\u00ad\u0016\u0000"+ + "\u099e\u0169\u0001\u0000\u0000\u0000\u099f\u09a0\u0005(\u0000\u0000\u09a0"+ + "\u09a1\u0006\u00ae,\u0000\u09a1\u09a2\u0001\u0000\u0000\u0000\u09a2\u09a3"+ + "\u0006\u00ae\u0018\u0000\u09a3\u016b\u0001\u0000\u0000\u0000\u09a4\u09a5"+ + "\u0005)\u0000\u0000\u09a5\u09a6\u0006\u00af-\u0000\u09a6\u016d\u0001\u0000"+ + "\u0000\u0000\u09a7\u09a8\t\u0000\u0000\u0000\u09a8\u09a9\u0001\u0000\u0000"+ + "\u0000\u09a9\u09aa\u0006\u00b0\r\u0000\u09aa\u016f\u0001\u0000\u0000\u0000"+ + "\u09ab\u09ac\u0005\u0000\u0000\u0001\u09ac\u09ad\u0001\u0000\u0000\u0000"+ + "\u09ad\u09ae\u0006\u00b1\u001b\u0000\u09ae\u09af\u0006\u00b1\u0017\u0000"+ + "\u09af\u0171\u0001\u0000\u0000\u0000\u09b0\u09b2\u0007%\u0000\u0000\u09b1"+ + "\u09b0\u0001\u0000\u0000\u0000\u09b2\u09b3\u0001\u0000\u0000\u0000\u09b3"+ + "\u09b1\u0001\u0000\u0000\u0000\u09b3\u09b4\u0001\u0000\u0000\u0000\u09b4"+ + "\u09b5\u0001\u0000\u0000\u0000\u09b5\u09b6\u0006\u00b2\r\u0000\u09b6\u0173"+ + "\u0001\u0000\u0000\u0000\u09b7\u09b8\u0005(\u0000\u0000\u09b8\u09b9\u0006"+ + "\u00b3.\u0000\u09b9\u09ba\u0001\u0000\u0000\u0000\u09ba\u09bb\u0006\u00b3"+ + "/\u0000\u09bb\u09bc\u0006\u00b30\u0000\u09bc\u0175\u0001\u0000\u0000\u0000"+ + "\u09bd\u09be\t\u0000\u0000\u0000\u09be\u09bf\u0001\u0000\u0000\u0000\u09bf"+ + "\u09c0\u0006\u00b4\t\u0000\u09c0\u09c1\u0006\u00b4\u0017\u0000\u09c1\u0177"+ + "\u0001\u0000\u0000\u0000\u09c2\u09c4\u0007%\u0000\u0000\u09c3\u09c2\u0001"+ + "\u0000\u0000\u0000\u09c4\u09c5\u0001\u0000\u0000\u0000\u09c5\u09c3\u0001"+ + "\u0000\u0000\u0000\u09c5\u09c6\u0001\u0000\u0000\u0000\u09c6\u09c7\u0001"+ + "\u0000\u0000\u0000\u09c7\u09c8\u0006\u00b5\r\u0000\u09c8\u0179\u0001\u0000"+ + "\u0000\u0000\u09c9\u09ca\u0005(\u0000\u0000\u09ca\u09cb\u0006\u00b61\u0000"+ + "\u09cb\u017b\u0001\u0000\u0000\u0000\u09cc\u09cd\u0005)\u0000\u0000\u09cd"+ + "\u09ce\u0006\u00b72\u0000\u09ce\u017d\u0001\u0000\u0000\u0000\u09cf\u09d0"+ + "\u0007\u0010\u0000\u0000\u09d0\u09d1\u0007\t\u0000\u0000\u09d1\u017f\u0001"+ + "\u0000\u0000\u0000\u09d2\u09d3\u0003\u00fex\u0000\u09d3\u09d4\u0001\u0000"+ + "\u0000\u0000\u09d4\u09d5\u0006\u00b9\u0012\u0000\u09d5\u0181\u0001\u0000"+ + "\u0000\u0000\u09d6\u09d7\u0005=\u0000\u0000\u09d7\u09d8\u0005>\u0000\u0000"+ + "\u09d8\u0183\u0001\u0000\u0000\u0000\u09d9\u09da\u0003\u0100y\u0000\u09da"+ + "\u09db\u0001\u0000\u0000\u0000\u09db\u09dc\u0006\u00bb \u0000\u09dc\u0185"+ + "\u0001\u0000\u0000\u0000\u09dd\u09e1\u0003\u00f8u\u0000\u09de\u09e1\u0003"+ + "\u00fav\u0000\u09df\u09e1\u0003\u00f0q\u0000\u09e0\u09dd\u0001\u0000\u0000"+ + "\u0000\u09e0\u09de\u0001\u0000\u0000\u0000\u09e0\u09df\u0001\u0000\u0000"+ + "\u0000\u09e1\u09e2\u0001\u0000\u0000\u0000\u09e2\u09e3\u0006\u00bc \u0000"+ + "\u09e3\u0187\u0001\u0000\u0000\u0000\u09e4\u09e5\u0005:\u0000\u0000\u09e5"+ + "\u09e6\u0005:\u0000\u0000\u09e6\u09e7\u0001\u0000\u0000\u0000\u09e7\u09e8"+ + "\u0006\u00bd \u0000\u09e8\u0189\u0001\u0000\u0000\u0000\u09e9\u09ea\t"+ + "\u0000\u0000\u0000\u09ea\u09eb\u0001\u0000\u0000\u0000\u09eb\u09ec\u0006"+ + "\u00be \u0000\u09ec\u018b\u0001\u0000\u0000\u0000\u09ed\u09ee\u0005\u0000"+ + "\u0000\u0001\u09ee\u09ef\u0001\u0000\u0000\u0000\u09ef\u09f0\u0006\u00bf"+ + "\u001b\u0000\u09f0\u09f1\u0006\u00bf\u0017\u0000\u09f1\u018d\u0001\u0000"+ + "\u0000\u0000\u09f2\u09f3\u0003\u00fcw\u0000\u09f3\u09f4\u0001\u0000\u0000"+ + "\u0000\u09f4\u09f5\u0006\u00c03\u0000\u09f5\u018f\u0001\u0000\u0000\u0000"+ + "\u09f6\u09f7\u0005[\u0000\u0000\u09f7\u09f8\u0006\u00c14\u0000\u09f8\u0191"+ + "\u0001\u0000\u0000\u0000\u09f9\u09fa\u0005]\u0000\u0000\u09fa\u09fb\u0006"+ + "\u00c25\u0000\u09fb\u0193\u0001\u0000\u0000\u0000\u09fc\u09fd\u0005{\u0000"+ + "\u0000\u09fd\u09fe\u0006\u00c36\u0000\u09fe\u09ff\u0001\u0000\u0000\u0000"+ + "\u09ff\u0a00\u0006\u00c37\u0000\u0a00\u0195\u0001\u0000\u0000\u0000\u0a01"+ + "\u0a02\u0005}\u0000\u0000\u0a02\u0a03\u0006\u00c48\u0000\u0a03\u0a04\u0001"+ + "\u0000\u0000\u0000\u0a04\u0a05\u0006\u00c47\u0000\u0a05\u0197\u0001\u0000"+ + "\u0000\u0000\u0a06\u0a07\u0005(\u0000\u0000\u0a07\u0a08\u0006\u00c59\u0000"+ + "\u0a08\u0a09\u0001\u0000\u0000\u0000\u0a09\u0a0a\u0006\u00c57\u0000\u0a0a"+ + "\u0199\u0001\u0000\u0000\u0000\u0a0b\u0a0c\u0005)\u0000\u0000\u0a0c\u0a0d"+ + "\u0006\u00c6:\u0000\u0a0d\u019b\u0001\u0000\u0000\u0000\u0a0e\u0a11\u0003"+ + "\u00f8u\u0000\u0a0f\u0a11\u0003\u00fav\u0000\u0a10\u0a0e\u0001\u0000\u0000"+ + "\u0000\u0a10\u0a0f\u0001\u0000\u0000\u0000\u0a11\u019d\u0001\u0000\u0000"+ + "\u0000\u0a12\u0a13\u0003\u00fex\u0000\u0a13\u0a14\u0001\u0000\u0000\u0000"+ + "\u0a14\u0a15\u0006\u00c8\u0012\u0000\u0a15\u019f\u0001\u0000\u0000\u0000"+ + "\u0a16\u0a17\u0005=\u0000\u0000\u0a17\u0a18\u0005>\u0000\u0000\u0a18\u01a1"+ + "\u0001\u0000\u0000\u0000\u0a19\u0a1a\u0003\u0100y\u0000\u0a1a\u0a1b\u0001"+ + "\u0000\u0000\u0000\u0a1b\u0a1c\u0006\u00ca\u0013\u0000\u0a1c\u01a3\u0001"+ + "\u0000\u0000\u0000\u0a1d\u0a1e\u0005.\u0000\u0000\u0a1e\u01a5\u0001\u0000"+ + "\u0000\u0000\u0a1f\u0a20\u0005,\u0000\u0000\u0a20\u0a21\u0006\u00cc;\u0000"+ + "\u0a21\u01a7\u0001\u0000\u0000\u0000\u0a22\u0a24\u0007&\u0000\u0000\u0a23"+ + "\u0a22\u0001\u0000\u0000\u0000\u0a24\u0a25\u0001\u0000\u0000\u0000\u0a25"+ + "\u0a23\u0001\u0000\u0000\u0000\u0a25\u0a26\u0001\u0000\u0000\u0000\u0a26"+ + "\u0a27\u0001\u0000\u0000\u0000\u0a27\u0a28\u0006\u00cd\r\u0000\u0a28\u01a9"+ + "\u0001\u0000\u0000\u0000\u0a29\u0a2a\u0003\u00f0q\u0000\u0a2a\u01ab\u0001"+ + "\u0000\u0000\u0000\u0a2b\u0a2c\t\u0000\u0000\u0000\u0a2c\u0a2d\u0001\u0000"+ + "\u0000\u0000\u0a2d\u0a2e\u0006\u00cf7\u0000\u0a2e\u01ad\u0001\u0000\u0000"+ + "\u0000\u0a2f\u0a30\u0005\u0000\u0000\u0001\u0a30\u0a31\u0001\u0000\u0000"+ + "\u0000\u0a31\u0a32\u0006\u00d0\u001b\u0000\u0a32\u0a33\u0006\u00d0\u0017"+ + "\u0000\u0a33\u01af\u0001\u0000\u0000\u0000\u0a34\u0a35\u0005/\u0000\u0000"+ + "\u0a35\u0a36\u0005/\u0000\u0000\u0a36\u0a38\u0001\u0000\u0000\u0000\u0a37"+ + "\u0a39\b\u001f\u0000\u0000\u0a38\u0a37\u0001\u0000\u0000\u0000\u0a39\u0a3a"+ + "\u0001\u0000\u0000\u0000\u0a3a\u0a38\u0001\u0000\u0000\u0000\u0a3a\u0a3b"+ + "\u0001\u0000\u0000\u0000\u0a3b\u0a3c\u0001\u0000\u0000\u0000\u0a3c\u0a3d"+ + "\u0006\u00d1\r\u0000\u0a3d\u01b1\u0001\u0000\u0000\u0000\u0a3e\u0a3f\u0005"+ + "/\u0000\u0000\u0a3f\u0a40\u0005*\u0000\u0000\u0a40\u0a44\u0001\u0000\u0000"+ + "\u0000\u0a41\u0a43\t\u0000\u0000\u0000\u0a42\u0a41\u0001\u0000\u0000\u0000"+ + "\u0a43\u0a46\u0001\u0000\u0000\u0000\u0a44\u0a45\u0001\u0000\u0000\u0000"+ + "\u0a44\u0a42\u0001\u0000\u0000\u0000\u0a45\u0a47\u0001\u0000\u0000\u0000"+ + "\u0a46\u0a44\u0001\u0000\u0000\u0000\u0a47\u0a48\u0005*\u0000\u0000\u0a48"+ + "\u0a49\u0005/\u0000\u0000\u0a49\u0a4d\u0001\u0000\u0000\u0000\u0a4a\u0a4c"+ + "\u0007\u001f\u0000\u0000\u0a4b\u0a4a\u0001\u0000\u0000\u0000\u0a4c\u0a4f"+ + "\u0001\u0000\u0000\u0000\u0a4d\u0a4b\u0001\u0000\u0000\u0000\u0a4d\u0a4e"+ + "\u0001\u0000\u0000\u0000\u0a4e\u0a50\u0001\u0000\u0000\u0000\u0a4f\u0a4d"+ + "\u0001\u0000\u0000\u0000\u0a50\u0a51\u0006\u00d2\r\u0000\u0a51\u01b3\u0001"+ + "\u0000\u0000\u0000\u0a52\u0a53\u0005@\u0000\u0000\u0a53\u0a54\u0007\u0007"+ + "\u0000\u0000\u0a54\u0a55\u0007\n\u0000\u0000\u0a55\u0a56\u0007\u000b\u0000"+ + "\u0000\u0a56\u0a57\u0007\u0013\u0000\u0000\u0a57\u0a58\u0007\u000f\u0000"+ + "\u0000\u0a58\u0a59\u0007\u0013\u0000\u0000\u0a59\u0a5a\u0001\u0000\u0000"+ + "\u0000\u0a5a\u0a5b\u0006\u00d3\u0017\u0000\u0a5b\u01b5\u0001\u0000\u0000"+ + "\u0000\u0a5c\u0a5d\u0005@\u0000\u0000\u0a5d\u0a5e\u0001\u0000\u0000\u0000"+ + "\u0a5e\u0a5f\u0006\u00d4\t\u0000\u0a5f\u0a60\u0006\u00d4\u0017\u0000\u0a60"+ + "\u01b7\u0001\u0000\u0000\u0000\u0a61\u0a62\u0005[\u0000\u0000\u0a62\u0a63"+ + "\u0001\u0000\u0000\u0000\u0a63\u0a64\u0006\u00d5 \u0000\u0a64\u01b9\u0001"+ + "\u0000\u0000\u0000\u0a65\u0a66\u0005]\u0000\u0000\u0a66\u0a67\u0001\u0000"+ + "\u0000\u0000\u0a67\u0a68\u0006\u00d6 \u0000\u0a68\u01bb\u0001\u0000\u0000"+ + "\u0000\u0a69\u0a6a\u0005{\u0000\u0000\u0a6a\u0a6b\u0001\u0000\u0000\u0000"+ + "\u0a6b\u0a6c\u0006\u00d7 \u0000\u0a6c\u01bd\u0001\u0000\u0000\u0000\u0a6d"+ + "\u0a6e\u0005}\u0000\u0000\u0a6e\u0a6f\u0001\u0000\u0000\u0000\u0a6f\u0a70"+ + "\u0006\u00d8 \u0000\u0a70\u01bf\u0001\u0000\u0000\u0000\u0a71\u0a74\u0003"+ + "\u00f8u\u0000\u0a72\u0a74\u0003\u00fav\u0000\u0a73\u0a71\u0001\u0000\u0000"+ + "\u0000\u0a73\u0a72\u0001\u0000\u0000\u0000\u0a74\u0a75\u0001\u0000\u0000"+ + "\u0000\u0a75\u0a76\u0006\u00d9<\u0000\u0a76\u01c1\u0001\u0000\u0000\u0000"+ + "\u0a77\u0a78\u0003\u00fex\u0000\u0a78\u0a79\u0001\u0000\u0000\u0000\u0a79"+ + "\u0a7a\u0006\u00da\u0012\u0000\u0a7a\u01c3\u0001\u0000\u0000\u0000\u0a7b"+ + "\u0a7c\u0007\n\u0000\u0000\u0a7c\u0a7d\u0007\u0007\u0000\u0000\u0a7d\u0a7e"+ + "\u0007\f\u0000\u0000\u0a7e\u0a7f\u0001\u0000\u0000\u0000\u0a7f\u0a80\u0004"+ + "\u00db\u000e\u0000\u0a80\u0a81\u0001\u0000\u0000\u0000\u0a81\u0a82\u0006"+ + "\u00db=\u0000\u0a82\u01c5\u0001\u0000\u0000\u0000\u0a83\u0a84\u0007\u000e"+ + "\u0000\u0000\u0a84\u0a85\u0007\b\u0000\u0000\u0a85\u0a86\u0007\u0010\u0000"+ + "\u0000\u0a86\u0a87\u0007\t\u0000\u0000\u0a87\u0a88\u0007\t\u0000\u0000"+ + "\u0a88\u0a89\u0001\u0000\u0000\u0000\u0a89\u0a8a\u0006\u00dc>\u0000\u0a8a"+ + "\u01c7\u0001\u0000\u0000\u0000\u0a8b\u0a8c\u0003\u0100y\u0000\u0a8c\u0a8d"+ + "\u0001\u0000\u0000\u0000\u0a8d\u0a8e\u0006\u00dd\u0013\u0000\u0a8e\u01c9"+ + "\u0001\u0000\u0000\u0000\u0a8f\u0a91\u0005\\\u0000\u0000\u0a90\u0a8f\u0001"+ + "\u0000\u0000\u0000\u0a90\u0a91\u0001\u0000\u0000\u0000\u0a91\u0a95\u0001"+ + "\u0000\u0000\u0000\u0a92\u0a93\u0003\u00f0q\u0000\u0a93\u0a94\u0005\\"+ + "\u0000\u0000\u0a94\u0a96\u0001\u0000\u0000\u0000\u0a95\u0a92\u0001\u0000"+ + "\u0000\u0000\u0a96\u0a97\u0001\u0000\u0000\u0000\u0a97\u0a95\u0001\u0000"+ + "\u0000\u0000\u0a97\u0a98\u0001\u0000\u0000\u0000\u0a98\u0a99\u0001\u0000"+ + "\u0000\u0000\u0a99\u0a9a\u0006\u00de\u0014\u0000\u0a9a\u01cb\u0001\u0000"+ + "\u0000\u0000\u0a9b\u0a9c\u0005\\\u0000\u0000\u0a9c\u0a9d\u0003\u00f0q"+ + "\u0000\u0a9d\u0a9e\u0001\u0000\u0000\u0000\u0a9e\u0a9f\u0006\u00df\u0015"+ + "\u0000\u0a9f\u01cd\u0001\u0000\u0000\u0000\u0aa0\u0aa1\u0003\u00f0q\u0000"+ + "\u0aa1\u0aa2\u0001\u0000\u0000\u0000\u0aa2\u0aa3\u0006\u00e0\u0015\u0000"+ + "\u0aa3\u01cf\u0001\u0000\u0000\u0000\u0aa4\u0aa5\u0005:\u0000\u0000\u0aa5"+ + "\u0aa6\u0005:\u0000\u0000\u0aa6\u0aa7\u0001\u0000\u0000\u0000\u0aa7\u0aa8"+ + "\u0006\u00e1\u0016\u0000\u0aa8\u01d1\u0001\u0000\u0000\u0000\u0aa9\u0aaa"+ + "\u0005(\u0000\u0000\u0aaa\u0aab\u0001\u0000\u0000\u0000\u0aab\u0aac\u0006"+ + "\u00e2\u0018\u0000\u0aac\u01d3\u0001\u0000\u0000\u0000\u0aad\u0aae\u0005"+ + ")\u0000\u0000\u0aae\u0aaf\u0001\u0000\u0000\u0000\u0aaf\u0ab0\u0006\u00e3"+ + "\u0019\u0000\u0ab0\u01d5\u0001\u0000\u0000\u0000\u0ab1\u0ab2\u0005 \u0000"+ + "\u0000\u0ab2\u0ab3\u0001\u0000\u0000\u0000\u0ab3\u0ab4\u0006\u00e4\r\u0000"+ + "\u0ab4\u01d7\u0001\u0000\u0000\u0000\u0ab5\u0ab6\u0005\u0000\u0000\u0001"+ + "\u0ab6\u0ab7\u0001\u0000\u0000\u0000\u0ab7\u0ab8\u0006\u00e5\u001b\u0000"+ + "\u0ab8\u0ab9\u0006\u00e5\u0017\u0000\u0ab9\u01d9\u0001\u0000\u0000\u0000"+ + "\u0aba\u0abb\t\u0000\u0000\u0000\u0abb\u0abc\u0001\u0000\u0000\u0000\u0abc"+ + "\u0abd\u0006\u00e6\r\u0000\u0abd\u01db\u0001\u0000\u0000\u0000\u0abe\u0abf"+ + "\u0005?\u0000\u0000\u0abf\u0ac0\u0005>\u0000\u0000\u0ac0\u0ac1\u0001\u0000"+ + "\u0000\u0000\u0ac1\u0ac2\u0006\u00e7\u0017\u0000\u0ac2\u01dd\u0001\u0000"+ + "\u0000\u0000\u0ac3\u0ac4\u0005/\u0000\u0000\u0ac4\u0ac5\u0005/\u0000\u0000"+ + "\u0ac5\u0ac7\u0001\u0000\u0000\u0000\u0ac6\u0ac8\b\u001f\u0000\u0000\u0ac7"+ + "\u0ac6\u0001\u0000\u0000\u0000\u0ac8\u0ac9\u0001\u0000\u0000\u0000\u0ac9"+ + "\u0ac7\u0001\u0000\u0000\u0000\u0ac9\u0aca\u0001\u0000\u0000\u0000\u0aca"+ + "\u0acb\u0001\u0000\u0000\u0000\u0acb\u0acc\u0006\u00e8\r\u0000\u0acc\u01df"+ + "\u0001\u0000\u0000\u0000\u0acd\u0ace\u0005/\u0000\u0000\u0ace\u0acf\u0005"+ + "*\u0000\u0000\u0acf\u0ad3\u0001\u0000\u0000\u0000\u0ad0\u0ad2\t\u0000"+ + "\u0000\u0000\u0ad1\u0ad0\u0001\u0000\u0000\u0000\u0ad2\u0ad5\u0001\u0000"+ + "\u0000\u0000\u0ad3\u0ad4\u0001\u0000\u0000\u0000\u0ad3\u0ad1\u0001\u0000"+ + "\u0000\u0000\u0ad4\u0ad6\u0001\u0000\u0000\u0000\u0ad5\u0ad3\u0001\u0000"+ + "\u0000\u0000\u0ad6\u0ad7\u0005*\u0000\u0000\u0ad7\u0ad8\u0005/\u0000\u0000"+ + "\u0ad8\u0ad9\u0001\u0000\u0000\u0000\u0ad9\u0ada\u0006\u00e9\r\u0000\u0ada"+ + "\u01e1\u0001\u0000\u0000\u0000\u0adb\u0adc\u0005[\u0000\u0000\u0adc\u0add"+ + "\u0001\u0000\u0000\u0000\u0add\u0ade\u0006\u00ea \u0000\u0ade\u01e3\u0001"+ + "\u0000\u0000\u0000\u0adf\u0ae0\u0005]\u0000\u0000\u0ae0\u0ae1\u0001\u0000"+ + "\u0000\u0000\u0ae1\u0ae2\u0006\u00eb \u0000\u0ae2\u01e5\u0001\u0000\u0000"+ + "\u0000\u0ae3\u0ae4\u0005{\u0000\u0000\u0ae4\u0ae5\u0001\u0000\u0000\u0000"+ + "\u0ae5\u0ae6\u0006\u00ec \u0000\u0ae6\u01e7\u0001\u0000\u0000\u0000\u0ae7"+ + "\u0ae8\u0005}\u0000\u0000\u0ae8\u0ae9\u0001\u0000\u0000\u0000\u0ae9\u0aea"+ + "\u0006\u00ed \u0000\u0aea\u01e9\u0001\u0000\u0000\u0000\u0aeb\u0aee\u0003"+ + "\u00f8u\u0000\u0aec\u0aee\u0003\u00fav\u0000\u0aed\u0aeb\u0001\u0000\u0000"+ + "\u0000\u0aed\u0aec\u0001\u0000\u0000\u0000\u0aee\u0aef\u0001\u0000\u0000"+ + "\u0000\u0aef\u0af0\u0006\u00ee<\u0000\u0af0\u01eb\u0001\u0000\u0000\u0000"+ + "\u0af1\u0af2\u0003\u00fex\u0000\u0af2\u0af3\u0001\u0000\u0000\u0000\u0af3"+ + "\u0af4\u0006\u00ef\u0012\u0000\u0af4\u01ed\u0001\u0000\u0000\u0000\u0af5"+ + "\u0af6\u0003\u0100y\u0000\u0af6\u0af7\u0001\u0000\u0000\u0000\u0af7\u0af8"+ + "\u0006\u00f0\u0013\u0000\u0af8\u01ef\u0001\u0000\u0000\u0000\u0af9\u0afa"+ + "\u0003\u00f0q\u0000\u0afa\u0afb\u0001\u0000\u0000\u0000\u0afb\u0afc\u0006"+ + "\u00f1\u0015\u0000\u0afc\u01f1\u0001\u0000\u0000\u0000\u0afd\u0afe\u0005"+ + ":\u0000\u0000\u0afe\u0aff\u0005:\u0000\u0000\u0aff\u0b00\u0001\u0000\u0000"+ + "\u0000\u0b00\u0b01\u0006\u00f2\u0016\u0000\u0b01\u01f3\u0001\u0000\u0000"+ + "\u0000\u0b02\u0b03\u0005-\u0000\u0000\u0b03\u0b04\u0005>\u0000\u0000\u0b04"+ + "\u0b05\u0001\u0000\u0000\u0000\u0b05\u0b06\u0006\u00f3\u001a\u0000\u0b06"+ + "\u01f5\u0001\u0000\u0000\u0000\u0b07\u0b08\u0005(\u0000\u0000\u0b08\u0b09"+ + "\u0001\u0000\u0000\u0000\u0b09\u0b0a\u0006\u00f4\u0018\u0000\u0b0a\u01f7"+ + "\u0001\u0000\u0000\u0000\u0b0b\u0b0c\u0005)\u0000\u0000\u0b0c\u0b0d\u0001"+ + "\u0000\u0000\u0000\u0b0d\u0b0e\u0006\u00f5\u0019\u0000\u0b0e\u01f9\u0001"+ + "\u0000\u0000\u0000\u0b0f\u0b10\u0005\u0000\u0000\u0001\u0b10\u0b11\u0001"+ + "\u0000\u0000\u0000\u0b11\u0b12\u0006\u00f6 \u0000\u0b12\u0b13\u0006\u00f6"+ + "\u0017\u0000\u0b13\u01fb\u0001\u0000\u0000\u0000\u0b14\u0b15\t\u0000\u0000"+ + "\u0000\u0b15\u0b16\u0001\u0000\u0000\u0000\u0b16\u0b17\u0006\u00f7 \u0000"+ + "\u0b17\u01fd\u0001\u0000\u0000\u0000\u0b18\u0b19\u0005@\u0000\u0000\u0b19"+ + "\u0b1a\u0007\u0007\u0000\u0000\u0b1a\u0b1b\u0007\n\u0000\u0000\u0b1b\u0b1c"+ + "\u0007\u000b\u0000\u0000\u0b1c\u0b1d\u0007\u001c\u0000\u0000\u0b1d\u0b1e"+ + "\u0007\u0007\u0000\u0000\u0b1e\u0b1f\u0007\u0016\u0000\u0000\u0b1f\u0b20"+ + "\u0007\u0017\u0000\u0000\u0b20\u0b21\u0007\u0010\u0000\u0000\u0b21\u0b22"+ + "\u0007\r\u0000\u0000\u0b22\u0b23\u0007\u0005\u0000\u0000\u0b23\u0b24\u0007"+ + "\u0012\u0000\u0000\u0b24\u0b25\u0001\u0000\u0000\u0000\u0b25\u0b26\u0006"+ + "\u00f8?\u0000\u0b26\u0b27\u0006\u00f8!\u0000\u0b27\u01ff\u0001\u0000\u0000"+ + "\u0000\u0b28\u0b29\t\u0000\u0000\u0000\u0b29\u0b2a\u0004\u00f9\u000f\u0000"+ + "\u0b2a\u0b2b\u0001\u0000\u0000\u0000\u0b2b\u0b2c\u0006\u00f9\r\u0000\u0b2c"+ + "\u0201\u0001\u0000\u0000\u0000\u0b2d\u0b2e\u0005\u0000\u0000\u0001\u0b2e"+ + "\u0b2f\u0001\u0000\u0000\u0000\u0b2f\u0b30\u0006\u00fa\u001b\u0000\u0b30"+ + "\u0b31\u0006\u00fa!\u0000\u0b31\u0203\u0001\u0000\u0000\u0000\u0b32\u0b33"+ + "\t\u0000\u0000\u0000\u0b33\u0b34\u0001\u0000\u0000\u0000\u0b34\u0b35\u0006"+ + "\u00fb\u001c\u0000\u0b35\u0205\u0001\u0000\u0000\u0000\u0b36\u0b37\u0005"+ + "-\u0000\u0000\u0b37\u0b38\u0005-\u0000\u0000\u0b38\u0b39\u0005}\u0000"+ + "\u0000\u0b39\u0b3a\u0005}\u0000\u0000\u0b3a\u0b3b\u0001\u0000\u0000\u0000"+ + "\u0b3b\u0b3c\u0006\u00fc\u0017\u0000\u0b3c\u0b3d\u0006\u00fc\r\u0000\u0b3d"+ + "\u0207\u0001\u0000\u0000\u0000\u0b3e\u0b3f\t\u0000\u0000\u0000\u0b3f\u0b40"+ + "\u0004\u00fd\u0010\u0000\u0b40\u0b41\u0001\u0000\u0000\u0000\u0b41\u0b42"+ + "\u0006\u00fd\r\u0000\u0b42\u0209\u0001\u0000\u0000\u0000\u0b43\u0b44\t"+ + "\u0000\u0000\u0000\u0b44\u0b45\u0001\u0000\u0000\u0000\u0b45\u0b46\u0006"+ + "\u00fe\r\u0000\u0b46\u020b\u0001\u0000\u0000\u0000\u0b47\u0b48\u0005\u0000"+ + "\u0000\u0001\u0b48\u0b49\u0001\u0000\u0000\u0000\u0b49\u0b4a\u0006\u00ff"+ + "\u0017\u0000\u0b4a\u0b4b\u0006\u00ff\r\u0000\u0b4b\u020d\u0001\u0000\u0000"+ + "\u0000j\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f"+ + "\r\u0212\u0216\u021c\u0220\u0227\u022e\u0234\u023a\u0241\u0246\u024d\u0253"+ + "\u025d\u0263\u0269\u0270\u027c\u02e1\u02f8\u0517\u052c\u0539\u054c\u055e"+ + "\u059e\u05ca\u05ed\u0653\u0699\u06a9\u06ab\u06b9\u06c1\u06c8\u06cb\u06d9"+ + "\u06e0\u06f4\u06fc\u0703\u070b\u070f\u0718\u071b\u0722\u0729\u072e\u073a"+ + "\u073f\u0741\u074d\u0754\u075b\u0763\u0765\u076e\u0770\u077b\u0793\u07a8"+ + "\u07ac\u07b7\u07bd\u07c9\u07cd\u0893\u0898\u089b\u08a8\u08af\u08e0\u08e7"+ + "\u0913\u091d\u095c\u0980\u098b\u0992\u09b3\u09c5\u09e0\u0a10\u0a25\u0a3a"+ + "\u0a44\u0a4d\u0a73\u0a90\u0a97\u0ac9\u0ad3\u0aed@\u0005\u0005\u0000\u0005"+ + "\u0003\u0000\u0005\b\u0000\u0005\u0007\u0000\u0007g\u0000\u0005\n\u0000"+ + "\u0005\f\u0000\u0005\u0001\u0000\u0005\u0002\u0000\u0007\u0017\u0000\u0005"+ + "\u000b\u0000\u0001c\u0000\u0007s\u0000\u0006\u0000\u0000\u0001h\u0001"+ + "\u0001i\u0002\u0001m\u0003\u0005\r\u0000\u0007\u0002\u0000\u0007\u0003"+ + "\u0000\u0007\u0006\u0000\u0007\u0005\u0000\u0007\u0007\u0000\u0004\u0000"+ + "\u0000\u0007\r\u0000\u0007\u000e\u0000\u0007\t\u0000\u0007\u0016\u0000"+ + "\u0003\u0000\u0000\u0005\u0004\u0000\u0001\u009a\u0004\u0001\u009b\u0005"+ + "\u0007\u0001\u0000\u0002\u0000\u0000\u0001\u009c\u0006\u0001\u009d\u0007"+ + "\u0001\u00a2\b\u0005\u0006\u0000\u0001\u00a4\t\u0007\u000f\u0000\u0001"+ + "\u00a5\n\u0007\u0090\u0000\u0001\u00a6\u000b\u0001\u00a7\f\u0001\u00ae"+ + "\r\u0001\u00af\u000e\u0001\u00b3\u000f\u0007\u000b\u0000\u0005\t\u0000"+ + "\u0001\u00b6\u0010\u0001\u00b7\u0011\u0000\u0002\u0000\u0001\u00c1\u0012"+ + "\u0001\u00c2\u0013\u0001\u00c3\u0014\u0007\n\u0000\u0001\u00c4\u0015\u0001"+ + "\u00c5\u0016\u0001\u00c6\u0017\u0001\u00cc\u0018\u0007\u0015\u0000\u0007"+ + "\u0004\u0000\u0007\b\u0000\u0007i\u0000"; public static final String _serializedATN = Utils.join( new String[] { _serializedATNSegment0, diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 index 5fe43ce485d2..fdbbb0e423a0 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 @@ -66,19 +66,13 @@ D_ESCAPES '{{{' | '@@' '@'? | '@{' '{'? - | '@media' [ ]* '('? - | '@charset' [ ]* - | '@import' [ ]* - | '@namespace' [ ]* - | '@document' [ ]* - | '@font-face' [ ]* - | '@page' [ ]* - | '@supports' [ ]* - | '@layer' [ ]* - | '@tailwind' [ ]* - | '@apply' [ ]* - | '@-webkit-keyframes' [ ]* - | '@keyframes' [ ]* + | '@media' [ ]+ ('screen' [ ]+ 'and'?)? + | ( '@charset' | '@import' | '@namespace' | '@document' | '@font-face' + | '@page' | '@layer' | '@supports' | '@tailwind' | '@apply' | '@-webkit-keyframes' + | '@keyframes' | '@counter-style' | '@font-feature-values' | '@property' + | '@scope' | '@starting-style' | '@supports' | '@view-transition' + | '@container' | '@color-profile' | '@styleset' | '@font-palette-values' | '@media' + ) [ ]* )->type(HTML); mode INSIDE_BLADE_COMMENT; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 index e54c30072a04..2187e993a73a 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 @@ -66,19 +66,13 @@ D_ESCAPES '{{{' | '@@' '@'? | '@{' '{'? - | '@media' [ ]* '('? - | '@charset' [ ]* - | '@import' [ ]* - | '@namespace' [ ]* - | '@document' [ ]* - | '@font-face' [ ]* - | '@page' [ ]* - | '@supports' [ ]* - | '@layer' [ ]* - | '@tailwind' [ ]* - | '@apply' [ ]* - | '@-webkit-keyframes' [ ]* - | '@keyframes' [ ]* + | '@media' [ ]+ ('screen' [ ]+ 'and'?)? + | ( '@charset' | '@import' | '@namespace' | '@document' | '@font-face' + | '@page' | '@layer' | '@supports' | '@tailwind' | '@apply' | '@-webkit-keyframes' + | '@keyframes' | '@counter-style' | '@font-feature-values' | '@property' + | '@scope' | '@starting-style' | '@supports' | '@view-transition' + | '@container' | '@color-profile' | '@styleset' | '@font-palette-values' | '@media' + ) [ ]* )->type(HTML); mode INSIDE_BLADE_COMMENT; diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass new file mode 100644 index 000000000000..92bccf4919c8 --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass @@ -0,0 +1,65 @@ +Token #0 HTML [\n] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/html_javascript_01.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/html_javascript_01.pass new file mode 100644 index 000000000000..6b24efbaf2bd --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/html_javascript_01.pass @@ -0,0 +1,14 @@ +Token #0 HTML [\n] diff --git a/php/php.blade/test/unit/data/testfiles/completion/testCompletion_loop_endtag_01.blade.php b/php/php.blade/test/unit/data/testfiles/completion/testCompletion_loop_endtag_01.blade.php new file mode 100644 index 000000000000..8cae35352261 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/completion/testCompletion_loop_endtag_01.blade.php @@ -0,0 +1,3 @@ +@foreach($array as $key => $item) + +@endforeach \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/completion/testCompletion_loop_endtag_01.blade.php.testCompletion_loop_endtag_01.completion b/php/php.blade/test/unit/data/testfiles/completion/testCompletion_loop_endtag_01.blade.php.testCompletion_loop_endtag_01.completion new file mode 100644 index 000000000000..6b2aed7586db --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/completion/testCompletion_loop_endtag_01.blade.php.testCompletion_loop_endtag_01.completion @@ -0,0 +1,4 @@ +Code completion result for source line: +@endfor|each +(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true) +CONSTRUCTO @endforeach + {{ $variable }} + +@endsection diff --git a/php/php.blade/test/unit/data/testfiles/embedding/html_embedding_01.blade.php.testHtmlEmbedding_01.embedding b/php/php.blade/test/unit/data/testfiles/embedding/html_embedding_01.blade.php.testHtmlEmbedding_01.embedding new file mode 100644 index 000000000000..c25eb44b044c --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/embedding/html_embedding_01.blade.php.testHtmlEmbedding_01.embedding @@ -0,0 +1,5 @@ + +
      + +
      + diff --git a/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php b/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php new file mode 100644 index 000000000000..e88b2e19617f --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php @@ -0,0 +1 @@ +@test($test ?: $default) diff --git a/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php.testFreezeNekudo_01.embedding b/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php.testFreezeNekudo_01.embedding new file mode 100644 index 000000000000..c4a12f80a96a --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php.testFreezeNekudo_01.embedding @@ -0,0 +1 @@ +@@@@@@@@@@@@@@@@@@@@@@@@@ \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/lexer/blade/content_tag_tertiary_expr.blade.php b/php/php.blade/test/unit/data/testfiles/lexer/blade/content_tag_tertiary_expr.blade.php new file mode 100644 index 000000000000..59cdf28239f7 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/lexer/blade/content_tag_tertiary_expr.blade.php @@ -0,0 +1,3 @@ +
      + {{ $isTrue ? 'x' : 'z' }} +
      \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/lexer/blade/css_at_rules.blade.php b/php/php.blade/test/unit/data/testfiles/lexer/blade/css_at_rules.blade.php new file mode 100644 index 000000000000..53b7eccd67fc --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/lexer/blade/css_at_rules.blade.php @@ -0,0 +1,34 @@ + diff --git a/php/php.blade/test/unit/data/testfiles/lexer/blade/escaped_directive.blade.php b/php/php.blade/test/unit/data/testfiles/lexer/blade/escaped_directive.blade.php new file mode 100644 index 000000000000..3f8b5b71ac71 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/lexer/blade/escaped_directive.blade.php @@ -0,0 +1,3 @@ +
      + @@escapedDirective +
      diff --git a/php/php.blade/test/unit/data/testfiles/lexer/blade/html_javascript_01.blade.php b/php/php.blade/test/unit/data/testfiles/lexer/blade/html_javascript_01.blade.php new file mode 100644 index 000000000000..d195ba0d8de1 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/lexer/blade/html_javascript_01.blade.php @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/lexer/blade/include_01.blade.php b/php/php.blade/test/unit/data/testfiles/lexer/blade/include_01.blade.php new file mode 100644 index 000000000000..7b441c67f4b2 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/lexer/blade/include_01.blade.php @@ -0,0 +1 @@ +@include('path', ['key' => 'value']) diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionTest.java index 364729eb19fd..ed9d9048a18f 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionTest.java @@ -33,4 +33,8 @@ public BladeCompletionTest(String testName) { public void testCompletion_01() throws Exception { checkCompletion("testfiles/completion/testCompletion_01.blade.php", "@^", false); } + + public void testCompletion_loop_endtag_01() throws Exception { + checkCompletion("testfiles/completion/testCompletion_loop_endtag_01.blade.php", "@endfor^", false); + } } diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProviderTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProviderTest.java new file mode 100644 index 000000000000..56e8e8ac1ca7 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProviderTest.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.embedding; + +import java.util.List; +import org.netbeans.modules.parsing.api.Embedding; +import org.netbeans.modules.parsing.api.Source; +import org.netbeans.modules.parsing.spi.EmbeddingProvider; +import org.netbeans.modules.php.blade.editor.BladeTestBase; + +/** + * + * @author Ondrej Brejla + */ +public class BladeHtmlEmbeddingProviderTest extends BladeTestBase { + + public BladeHtmlEmbeddingProviderTest(String testName) { + super(testName); + } + + private void checkPhpEmbedding(final String relFilePath) throws Exception { + checkEmbedding(relFilePath, new BladeHtmlEmbeddingProvider()); + } + + private void checkEmbedding(final String relFilePath, EmbeddingProvider embeddingProvider) throws Exception { + assertNotNull(embeddingProvider); + String testedFilePath = "testfiles/embedding/" + relFilePath + ".blade.php"; + Source testSource = getTestSource(getTestFile(testedFilePath)); + List embeddings = embeddingProvider.getEmbeddings(testSource.createSnapshot()); + assertDescriptionMatches(testedFilePath, serializableEmbeddings(embeddings), true, ".embedding"); + } + + private String serializableEmbeddings(List embeddings) { + StringBuilder sb = new StringBuilder(); + for (Embedding embedding : embeddings) { + sb.append(embedding.getSnapshot().getText()); + } + return sb.toString(); + } + + public void testHtmlEmbedding_01() throws Exception { + checkPhpEmbedding("html_embedding_01"); + } + +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProviderTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProviderTest.java new file mode 100644 index 000000000000..37eab8eb00df --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProviderTest.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.embedding; + +import java.util.List; +import org.netbeans.modules.parsing.api.Embedding; +import org.netbeans.modules.parsing.api.Source; +import org.netbeans.modules.parsing.spi.EmbeddingProvider; +import org.netbeans.modules.php.blade.editor.BladeTestBase; + +/** + * + * @author Ondrej Brejla + */ +public class BladePhpEmbeddingProviderTest extends BladeTestBase { + + public BladePhpEmbeddingProviderTest(String testName) { + super(testName); + } + + private void checkPhpEmbedding(final String relFilePath) throws Exception { + checkEmbedding(relFilePath, new BladePhpEmbeddingProvider()); + } + + private void checkEmbedding(final String relFilePath, EmbeddingProvider embeddingProvider) throws Exception { + assertNotNull(embeddingProvider); + String testedFilePath = "testfiles/embedding/" + relFilePath + ".blade.php"; + Source testSource = getTestSource(getTestFile(testedFilePath)); + List embeddings = embeddingProvider.getEmbeddings(testSource.createSnapshot()); + assertDescriptionMatches(testedFilePath, serializableEmbeddings(embeddings), true, ".embedding"); + } + + private String serializableEmbeddings(List embeddings) { + StringBuilder sb = new StringBuilder(); + for (Embedding embedding : embeddings) { + sb.append(embedding.getSnapshot().getText()); + } + return sb.toString(); + } + + /** + * php embeddings freezes for syntax like $var:test or tertiary operation ?: + * + * solution is to skip full php embedd or hide ":" characters + * + * @throws Exception + */ + public void testFreezeNekudo_01() throws Exception { + checkPhpEmbedding("php_freeze_nekudo_01"); + } + +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest.java index a58a52384c8e..1b71690ffeb7 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest.java @@ -42,11 +42,32 @@ public void testRawTag_01() throws Exception { public void testContentTag_01() throws Exception { performTest("content_tag"); } + + public void testContentTag_tertiary_expr() throws Exception { + performTest("content_tag_tertiary_expr"); + } public void testEscapedTag_01() throws Exception { performTest("escaped_tag"); } + + public void testEscapedDirective() throws Exception { + performTest("escaped_directive"); + } + + public void testInclude_01() throws Exception { + performTest("include_01"); + } + + + public void testCssAtRules_01() throws Exception { + performTest("css_at_rules"); + } + public void testHtmlJavascript_01() throws Exception { + performTest("html_javascript_01"); + } + @Override protected String getTestResult(String filename) throws Exception { String content = BladeUtils.getFileContent(new File(getDataDir(), "testfiles/lexer/blade/" + filename + ".blade.php")); From 52f12ce03df694bbcf8908ef30b38728bd1f0dc8 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Fri, 27 Sep 2024 07:38:00 +0300 Subject: [PATCH 18/43] improve embedded php brace matcher freeze issue, remove hyperlink, php embedded test --- .../blade/editor/HyperlinkProviderImpl.java | 1 + .../embedding/BladePhpEmbeddingProvider.java | 8 +- .../php/blade/editor/lexer/BladeTokenId.java | 81 +- .../resources/FlatLafDark-FlatLafDark.xml | 2 +- .../php/blade/resources/FontAndColors.xml | 2 +- .../antlr4/v10/BladeAntlrColoringLexer.g4 | 52 +- .../antlr4/v10/BladeAntlrColoringLexer.java | 2630 ++++++++--------- .../syntax/antlr4/v10/BladeAntlrLexer.java | 2272 +++++++------- .../antlr4/v10/ColoringLexerAdaptor.java | 34 +- .../content_tag_tertiary_expr.pass | 5 + .../lexer/BladeLexerTest/css_at_rules.pass | 8 +- .../BladeLexerTest/escaped_directive.pass | 3 + .../lexer/BladeLexerTest/include_01.pass | 3 + .../embedding/php_freeze_nekudo_01.blade.php | 1 - ...01.blade.php.testFreezeNekudo_01.embedding | 1 - .../php_inline_embedding_01.blade.php | 5 + ...de.php.testPhpInlineEmbedding_01.embedding | 3 + .../php_inline_embedding_02.blade.php | 5 + ...de.php.testPhpInlineEmbedding_02.embedding | 4 + .../BladeHtmlEmbeddingProviderTest.java | 4 +- .../BladePhpEmbeddingProviderTest.java | 15 +- 21 files changed, 2543 insertions(+), 2596 deletions(-) create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/content_tag_tertiary_expr.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_directive.pass create mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/include_01.pass delete mode 100644 php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php delete mode 100644 php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php.testFreezeNekudo_01.embedding create mode 100644 php/php.blade/test/unit/data/testfiles/embedding/php_inline_embedding_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/embedding/php_inline_embedding_01.blade.php.testPhpInlineEmbedding_01.embedding create mode 100644 php/php.blade/test/unit/data/testfiles/embedding/php_inline_embedding_02.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/embedding/php_inline_embedding_02.blade.php.testPhpInlineEmbedding_02.embedding diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java index 1c33ec4cd8fd..a8cc5b2fda94 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java @@ -46,6 +46,7 @@ /** * Similar to a declaration finder + * causes ordinal error * * @author bhaidu */ diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java index d7df7529180f..7d88ddc83b16 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java @@ -30,11 +30,9 @@ import org.netbeans.modules.parsing.spi.EmbeddingProvider; import org.netbeans.modules.php.blade.editor.BladeLanguage; import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; - /** - * this will enable braces matches of html elements - * - * @author bhaidu + * + * @author bogdan */ @EmbeddingProvider.Registration( mimeType = BladeLanguage.MIME_TYPE, @@ -88,6 +86,6 @@ public int getPriority() { @Override public void cancel() { - //TODO see html implementation + } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java index 795605937553..a69f39d90e80 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java @@ -76,19 +76,72 @@ protected LanguageEmbedding embedding(Token tok LanguagePath languagePath, InputAttributes inputAttributes) { boolean joinHtml = true; switch (token.id()) { - case PHP_INLINE: + case PHP_BLADE_INLINE_CODE, PHP_BLADE_EXPRESSION -> { + Language phpLanguage = PHPTokenId.languageInPHP(); + if (phpLanguage == null || token.text() == null){ + return null; + } + + //php brace matcher freeze issue patch + String tokenText = token.text().toString(); + int startOffset = 1; + int endOffset = 1; + + if (tokenText.startsWith("((") && tokenText.endsWith("))")){ //NOI18N + startOffset = 2; + endOffset = 2; + } else if (tokenText.startsWith("([") && tokenText.endsWith("])")){ //NOI18N + startOffset = 2; + endOffset = 2; + } else if (tokenText.startsWith("([")){ //NOI18N + startOffset = 2; + } + return LanguageEmbedding.create(phpLanguage, startOffset, endOffset, false); + } + case PHP_BLADE_ECHO_EXPR -> { + Language phpLanguage = PHPTokenId.languageInPHP(); + if (phpLanguage == null || token.text() == null){ + return null; + } + String tokenText = token.text().toString(); + int startOffset = 0; + int endOffset = 0; + + if (!tokenText.startsWith("(") && !tokenText.startsWith("[")){ + return LanguageEmbedding.create(phpLanguage, startOffset, endOffset, false); + } + + //php brace matcher freeze issue patch + if (tokenText.startsWith("((") && tokenText.endsWith("))")){ //NOI18N + startOffset = 2; + endOffset = 2; + } else if (tokenText.startsWith("[[") && tokenText.endsWith("]]")){ //NOI18N + startOffset = 2; + endOffset = 2; + } else if (tokenText.startsWith("([") && tokenText.endsWith("])")){ //NOI18N + startOffset = 2; + endOffset = 2; + } else if (tokenText.startsWith("[(") && tokenText.endsWith(")]")){ //NOI18N + startOffset = 2; + endOffset = 2; + } else if (tokenText.startsWith("([") || tokenText.startsWith("[(")){ //NOI18N + startOffset = 2; + } else if (tokenText.startsWith("(") && tokenText.endsWith(")")){ //NOI18N + startOffset = 1; + endOffset = 1; + } else if (tokenText.startsWith("[") && tokenText.endsWith("]")){ //NOI18N + startOffset = 1; + endOffset = 1; + } else if (tokenText.startsWith("(") || tokenText.startsWith("[")){ //NOI18N + startOffset = 1; + } + return LanguageEmbedding.create(phpLanguage, startOffset, endOffset, false); + } + case PHP_INLINE -> { Language phpLanguageCode = PHPTokenId.language(); return phpLanguageCode != null ? LanguageEmbedding.create(phpLanguageCode, 0, 0, false) : null; - case PHP_BLADE_EXPRESSION: - case PHP_BLADE_ECHO_EXPR: - case PHP_BLADE_INLINE_CODE: - /** - * troubleshooting php embedding freeze (?:, ::) - * force a return null; - */ - Language phpLanguage = PHPTokenId.languageInPHP(); - return phpLanguage != null ? LanguageEmbedding.create(phpLanguage, 0, 0, false) : null; - case HTML: + } + case HTML -> { LanguageEmbedding lang; if (tokenLangCache.containsKey(token.id())) { @@ -97,7 +150,7 @@ protected LanguageEmbedding embedding(Token tok Language htmlLanguage = null; @SuppressWarnings("unchecked") - Collection providers = (Collection) Lookup.getDefault().lookupAll(LanguageProvider.class); + Collection providers = (Collection) Lookup.getDefault().lookupAll(LanguageProvider.class); for (LanguageProvider provider : providers) { htmlLanguage = (Language) provider.findLanguage("text/html"); //NOI18N if (htmlLanguage != null) { @@ -110,8 +163,10 @@ protected LanguageEmbedding embedding(Token tok } return lang; - default: + } + default -> { return null; + } } } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/FlatLafDark-FlatLafDark.xml b/php/php.blade/src/org/netbeans/modules/php/blade/resources/FlatLafDark-FlatLafDark.xml index 8533ed78b169..9a2984df1644 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/resources/FlatLafDark-FlatLafDark.xml +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/FlatLafDark-FlatLafDark.xml @@ -22,7 +22,7 @@ - + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/FontAndColors.xml b/php/php.blade/src/org/netbeans/modules/php/blade/resources/FontAndColors.xml index 18c86c64419a..5a2bc684ff0a 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/resources/FontAndColors.xml +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/FontAndColors.xml @@ -22,7 +22,7 @@ - + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 index 0955308d73e5..be75c6f37770 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 @@ -59,8 +59,6 @@ tokens { ERROR } -fragment NekudoWithelistMatch : '::' | '?:' | ' : '; - fragment DirectivesWithEndTag : 'for' ('each')? | 'if' | 'while' | 'section' | 'session' | 'once' | 'push' | 'PushOnce' | 'switch' | 'unless' | 'can' ('any' | 'not')? @@ -69,10 +67,6 @@ fragment DirectivesWithEndTag : 'for' ('each')? | 'if' | 'while' fragment Include : '@include' ('If' | 'When' | 'First' | 'Unless')?; -//to remove -fragment DOUBLE_QUOTED_STRING_FRAGMENT_WITH_PHP - : '"' (ESC_DOUBLE_QUOTED_STRING | '{' PhpVariable '}' | . | ~[:])*? '"'; - fragment ComponentTagIdentifier : [a-z_\u0080-\ufffe][a-z0-9.:\u0080-\ufffe-]*; @@ -84,7 +78,7 @@ PHP_INLINE : '' | '' | EOF); D_GENERIC_BLOCK_DIRECTIVES : ('@' DirectivesWithEndTag | '@sectionMissing' | '@hasSection')->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); D_GENERIC_INLINE_DIRECTIVES : ('@elseif' | Include | '@extends' | '@each' | '@yield' | '@props' | '@method' - | '@class' | '@style' | '@aware' | '@break' | '@continue' | '@selected' | '@disabled' | '@readonly' | '@required') (' ')+ {this._input.LA(1) == '('}? ->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); + | '@class' | '@style' | '@aware' | '@break' | '@continue' | '@selected' | '@disabled' | '@readonly' | '@required') (' ')* {this._input.LA(1) == '('}? ->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); D_GENERIC_INLINE_MIXED_DIRECTIVES : ('@break' | '@continue')->type(DIRECTIVE); @@ -154,12 +148,8 @@ HTML_EOF : EOF->type(HTML_TAG),popMode; mode INSIDE_REGULAR_ECHO; CONTENT_TAG_CLOSE : ('}}')->popMode,type(CONTENT_TAG); -//hack due to a netbeans php embedding issue when adding or deleting ':' chars -ECHO_DOUBLE_NEKODU : NekudoWithelistMatch {this.consumeEscapedEchoToken();}; -ECHO_STRING_LITERAL : (SINGLE_QUOTED_STRING_FRAGMENT | DOUBLE_QUOTED_STRING_FRAGMENT_WITH_PHP) {this.consumeEscapedEchoToken();}; -ECHO_PHP_FREEZE_SYNTAX : (':)' | ':') ->skip; -GREEDY_REGULAR_ECHO_EXPR : ~[ ':{}]+ {this.consumeEscapedEchoToken();}; +GREEDY_REGULAR_ECHO_EXPR : ~[ {}]+ {this.consumeEscapedEchoToken();}; ESCAPED_ECHO_EXPR : . [ ]* {this.consumeEscapedEchoToken();}; EXIT_ECHO_EOF : EOF->type(ERROR),popMode; @@ -168,11 +158,8 @@ EXIT_ECHO_EOF : EOF->type(ERROR),popMode; mode INSIDE_RAW_ECHO; RAW_TAG_CLOSE : ('!!}')->popMode, type(RAW_TAG); -//hack due to a netbeans php embedding issue when adding or deleting ':' chars -RAW_ECHO_DOUBLE_NEKODU : NekudoWithelistMatch {this.consumeNotEscapedEchoToken();}; -RAW_ECHO_STRING_LITERAL : (SINGLE_QUOTED_STRING_FRAGMENT | DOUBLE_QUOTED_STRING_FRAGMENT_WITH_PHP) {this.consumeNotEscapedEchoToken();}; -RAW_ECHO_PHP_FREEZE_SYNTAX : (':)' | ':') ->skip; -RAW_ECHO_EXPR : ~[ ':!{}]+ {this.consumeNotEscapedEchoToken();}; + +RAW_ECHO_EXPR : ~[ !{}]+ {this.consumeNotEscapedEchoToken();}; RAW_ECHO_EXPR_MORE : . [ ]* {this.consumeNotEscapedEchoToken();}; EXIT_RAW_ECHO_EOF : EOF->type(ERROR),popMode; @@ -188,31 +175,15 @@ L_OTHER : . ->type(ERROR), popMode; // @directive (?) mode INSIDE_PHP_EXPRESSION; -OPEN_EXPR_PAREN : {this.roundParenBalance == 0}? '(' {this.increaseRoundParenBalance();} {this.consumeExprToken();}; -CLOSE_EXPR_PAREN : {this.roundParenBalance == 1}? ')' +OPEN_EXPR_PAREN : {this.getRoundParenBalance() == 0}? '(' {this.increaseRoundParenBalance();} {this.consumeExprToken();}; +CLOSE_EXPR_PAREN : {this.getRoundParenBalance() == 1}? ')' {this.decreaseRoundParenBalance();}->type(PHP_EXPRESSION),mode(DEFAULT_MODE); -LPAREN : {this.roundParenBalance > 0}? '(' {this.increaseRoundParenBalance();} {this.consumeExprToken();}; -RPAREN : {this.roundParenBalance > 0}? ')' {this.decreaseRoundParenBalance();} {this.consumeExprToken();}; +LPAREN : {this.getRoundParenBalance() > 0}? '(' {this.increaseRoundParenBalance();} {this.consumeExprToken();}; +RPAREN : {this.getRoundParenBalance() > 0}? ')' {this.decreaseRoundParenBalance();} {this.consumeExprToken();}; //in case of lexer restart context -EXIT_RPAREN : ')' {this.roundParenBalance == 0}?->type(PHP_EXPRESSION),mode(DEFAULT_MODE); - -DB_STRING_OPEN : '"' ->more,pushMode(DB_STRING_MODE); -//hack due to a netbeans php embedding issue when adding or deleting ':' chars - -SHORT_IF_EXPR_ERR : ('?:') {this.testForFreezeCombination();}; - -DOUBLE_NEKODU : ('::') {this.consumeExprToken();}; - - -EXPR_STRING_LITERAL : (SINGLE_QUOTED_STRING_FRAGMENT (' ')*) {this.consumeExprToken();}; - -//STATIC_STRING : //check if start of token ... check if bracket and - -FREEZE_NEKUDO_GREEDY : ':' {this._input.LA(1) != ':'}?->skip; - -FREEZE_NEKUDO : ':'->skip; +EXIT_RPAREN : ')' {this.getRoundParenBalance() == 0}?->type(PHP_EXPRESSION),mode(DEFAULT_MODE); PHP_EXPRESSION_COMMENT : ('/*' .*? '*/')->skip; @@ -279,11 +250,6 @@ COMPONENT_PHP_EXPRESSION : . ->more; EXIT_COMPONENT_PHP_EXPRESSION_EOF : EOF->type(ERROR),popMode; -mode DB_STRING_MODE; - -DB_STRING_NEKUDO_GREEDY : NekudoWithelistMatch '$'? FullIdentifier '}' ->more; - -DB_STRING_NEKUDO : NekudoWithelistMatch ->more; //TODO numeric DB_JSON_PAIR : '{' [\\']? FullIdentifier [\\']? ':'+ [\\']? FullIdentifier? [\\']? (',' ( [\\']? FullIdentifier [\\']? ':'+ [\\']? FullIdentifier [\\']? ))* ','? '}' ->more; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java index a38c002fd84d..365fae37718d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java @@ -39,21 +39,17 @@ public class BladeAntlrColoringLexer extends ColoringLexerAdaptor { public static final int DIRECTIVE=1, PHP_EXPRESSION=2, BLADE_PHP_ECHO_EXPR=3, RAW_TAG=4, CONTENT_TAG=5, HTML=6, HTML_TAG=7, ERROR=8, BLADE_COMMENT=9, PHP_INLINE=10, D_PHP=11, - D_CUSTOM=12, D_UNKNOWN=13, D_AT=14, BLADE_COMMENT_START=15, ECHO_DOUBLE_NEKODU=16, - ECHO_STRING_LITERAL=17, ECHO_PHP_FREEZE_SYNTAX=18, GREEDY_REGULAR_ECHO_EXPR=19, - ESCAPED_ECHO_EXPR=20, RAW_ECHO_DOUBLE_NEKODU=21, RAW_ECHO_STRING_LITERAL=22, - RAW_ECHO_PHP_FREEZE_SYNTAX=23, RAW_ECHO_EXPR=24, RAW_ECHO_EXPR_MORE=25, - WS_EXPR=26, OPEN_EXPR_PAREN=27, LPAREN=28, RPAREN=29, SHORT_IF_EXPR_ERR=30, - DOUBLE_NEKODU=31, EXPR_STRING_LITERAL=32, FREEZE_NEKUDO_GREEDY=33, FREEZE_NEKUDO=34, - PHP_EXPRESSION_COMMENT=35, PHP_EXPRESSION_MORE=36, D_ENDPHP=37, BLADE_PHP_INLINE=38, - BLADE_COMMENT_END=39, D_ENDVERBATIM=40, DB_STRING_OPEN=41, EXIT_HTML_COMPONENT=42, - DB_QUOTE_MORE=43; + D_CUSTOM=12, D_UNKNOWN=13, D_AT=14, BLADE_COMMENT_START=15, GREEDY_REGULAR_ECHO_EXPR=16, + ESCAPED_ECHO_EXPR=17, RAW_ECHO_EXPR=18, RAW_ECHO_EXPR_MORE=19, WS_EXPR=20, + OPEN_EXPR_PAREN=21, LPAREN=22, RPAREN=23, PHP_EXPRESSION_COMMENT=24, PHP_EXPRESSION_MORE=25, + D_ENDPHP=26, BLADE_PHP_INLINE=27, BLADE_COMMENT_END=28, D_ENDVERBATIM=29, + EXIT_HTML_COMPONENT=30, EXIT_COMPONENT_PHP_EXPRESSION=31, DB_QUOTE_MORE=32; public static final int PHP_CODE=2; public static final int INSIDE_HTML_TAG=1, INSIDE_REGULAR_ECHO=2, INSIDE_RAW_ECHO=3, LOOK_FOR_PHP_EXPRESSION=4, INSIDE_PHP_EXPRESSION=5, BLADE_INLINE_PHP=6, VERBATIM_MODE=7, INSIDE_HTML_COMPONENT_TAG=8, - COMPONENT_PHP_EXPRESSION=9, DB_STRING_MODE=10, INSIDE_BLADE_COMMENT=11; + COMPONENT_PHP_EXPRESSION=9, INSIDE_BLADE_COMMENT=10; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN", "PHP_CODE" }; @@ -62,39 +58,35 @@ public class BladeAntlrColoringLexer extends ColoringLexerAdaptor { "DEFAULT_MODE", "INSIDE_HTML_TAG", "INSIDE_REGULAR_ECHO", "INSIDE_RAW_ECHO", "LOOK_FOR_PHP_EXPRESSION", "INSIDE_PHP_EXPRESSION", "BLADE_INLINE_PHP", "VERBATIM_MODE", "INSIDE_HTML_COMPONENT_TAG", "COMPONENT_PHP_EXPRESSION", - "DB_STRING_MODE", "INSIDE_BLADE_COMMENT" + "INSIDE_BLADE_COMMENT" }; private static String[] makeRuleNames() { return new String[] { - "NekudoWithelistMatch", "DirectivesWithEndTag", "Include", "DOUBLE_QUOTED_STRING_FRAGMENT_WITH_PHP", - "ComponentTagIdentifier", "SpecialChars", "PHP_INLINE", "D_GENERIC_BLOCK_DIRECTIVES", - "D_GENERIC_INLINE_DIRECTIVES", "D_GENERIC_INLINE_MIXED_DIRECTIVES", "D_GENERIC_END_TAGS", - "D_VERBATIM", "D_ENDVERBATIM", "D_MISC", "D_SIMPLE", "D_PHP_SHORT", "D_PHP", - "D_END", "D_LIVEWIRE", "D_ASSET_BUNDLER", "D_CUSTOM", "D_UNKNOWN", "D_AT", - "CONTENT_TAG_OPEN", "RAW_TAG_OPEN", "CSS_COMMENT", "HTML_X", "CLOSE_TAG", - "HTML", "HTML_MISC", "HTML_WS", "INCOMPLETE_BLADE_TAG", "OTHER", "NameString", - "BladeLabel", "FullIdentifier", "ESC_DOUBLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING_FRAGMENT", + "DirectivesWithEndTag", "Include", "ComponentTagIdentifier", "SpecialChars", + "PHP_INLINE", "D_GENERIC_BLOCK_DIRECTIVES", "D_GENERIC_INLINE_DIRECTIVES", + "D_GENERIC_INLINE_MIXED_DIRECTIVES", "D_GENERIC_END_TAGS", "D_VERBATIM", + "D_ENDVERBATIM", "D_MISC", "D_SIMPLE", "D_PHP_SHORT", "D_PHP", "D_END", + "D_LIVEWIRE", "D_ASSET_BUNDLER", "D_CUSTOM", "D_UNKNOWN", "D_AT", "CONTENT_TAG_OPEN", + "RAW_TAG_OPEN", "CSS_COMMENT", "HTML_X", "CLOSE_TAG", "HTML", "HTML_MISC", + "HTML_WS", "INCOMPLETE_BLADE_TAG", "OTHER", "NameString", "BladeLabel", + "FullIdentifier", "ESC_DOUBLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING_FRAGMENT", "SINGLE_QUOTED_STRING_FRAGMENT", "LineComment", "PhpVariable", "PhpKeyword", "Digit", "BLADE_COMMENT_START", "EMAIL_SUBSTRING", "VERSION_WITH_AT", "D_ESCAPES", "OTHER_HTML_POP", "OTHER_HTML", "HTML_EOF", "CONTENT_TAG_CLOSE", - "ECHO_DOUBLE_NEKODU", "ECHO_STRING_LITERAL", "ECHO_PHP_FREEZE_SYNTAX", "GREEDY_REGULAR_ECHO_EXPR", "ESCAPED_ECHO_EXPR", "EXIT_ECHO_EOF", "RAW_TAG_CLOSE", - "RAW_ECHO_DOUBLE_NEKODU", "RAW_ECHO_STRING_LITERAL", "RAW_ECHO_PHP_FREEZE_SYNTAX", "RAW_ECHO_EXPR", "RAW_ECHO_EXPR_MORE", "EXIT_RAW_ECHO_EOF", "WS_EXPR", "OPEN_EXPR_PAREN_MORE", "AFTER_DIRECTIVE", "L_OTHER", "OPEN_EXPR_PAREN", - "CLOSE_EXPR_PAREN", "LPAREN", "RPAREN", "EXIT_RPAREN", "DB_STRING_OPEN", - "SHORT_IF_EXPR_ERR", "DOUBLE_NEKODU", "EXPR_STRING_LITERAL", "FREEZE_NEKUDO_GREEDY", - "FREEZE_NEKUDO", "PHP_EXPRESSION_COMMENT", "PHP_EXPRESSION_MORE", "EXIT_EOF", - "D_ENDPHP", "BLADE_PHP_INLINE", "BLADE_PHP_INLINE_MORE", "EXIT_INLINE_PHP_EOF", - "D_ENDVERBATIM_IN_MODE", "VERBATIM_HTML", "VERBATIM_HTML_MORE", "EXIT_VERBATIM_MOD_EOF", - "COMPONENT_ATTRIBUTE", "COMPONENT_CONTENT_TAG_OPEN", "COMPONENT_RAW_TAG_OPEN", - "EXIT_HTML_COMPONENT", "HTML_COMPONENT_ANY", "EXIT_HTML_COMPONENT_EOF", - "EXIT_COMPONENT_PHP_EXPRESSION", "COMPONENT_PHP_EXPRESSION_LAST", "COMPONENT_PHP_EXPRESSION", - "EXIT_COMPONENT_PHP_EXPRESSION_EOF", "DB_STRING_NEKUDO_GREEDY", "DB_STRING_NEKUDO", - "DB_JSON_PAIR", "PHP_INTERCALATED", "DB_POINT", "DB_QUOTE_MORE", "DB_QUOTE_EXIT", - "DB_QUOTE_ANY", "DB_QUOTE_EOF", "BLADE_COMMENT_END", "BLADE_COMMENT_PEEK", - "BLADE_COMMENT_MORE", "BLADE_COMMENT_EOF" + "CLOSE_EXPR_PAREN", "LPAREN", "RPAREN", "EXIT_RPAREN", "PHP_EXPRESSION_COMMENT", + "PHP_EXPRESSION_MORE", "EXIT_EOF", "D_ENDPHP", "BLADE_PHP_INLINE", "BLADE_PHP_INLINE_MORE", + "EXIT_INLINE_PHP_EOF", "D_ENDVERBATIM_IN_MODE", "VERBATIM_HTML", "VERBATIM_HTML_MORE", + "EXIT_VERBATIM_MOD_EOF", "COMPONENT_ATTRIBUTE", "COMPONENT_CONTENT_TAG_OPEN", + "COMPONENT_RAW_TAG_OPEN", "EXIT_HTML_COMPONENT", "HTML_COMPONENT_ANY", + "EXIT_HTML_COMPONENT_EOF", "EXIT_COMPONENT_PHP_EXPRESSION", "COMPONENT_PHP_EXPRESSION_LAST", + "COMPONENT_PHP_EXPRESSION", "EXIT_COMPONENT_PHP_EXPRESSION_EOF", "DB_JSON_PAIR", + "PHP_INTERCALATED", "DB_POINT", "DB_QUOTE_MORE", "DB_QUOTE_EXIT", "DB_QUOTE_ANY", + "DB_QUOTE_EOF", "BLADE_COMMENT_END", "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", + "BLADE_COMMENT_EOF" }; } public static final String[] ruleNames = makeRuleNames(); @@ -103,8 +95,7 @@ private static String[] makeLiteralNames() { return new String[] { null, null, null, null, null, null, null, null, null, null, null, "'@php'", null, null, null, "'{{--'", null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, "':'", - null, null, "'@endphp'", null, "'--}}'", null, null, "'>'", "'\\\"'" + null, null, null, "'@endphp'", null, "'--}}'", null, "'>'", null, "'\\\"'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -112,15 +103,11 @@ private static String[] makeSymbolicNames() { return new String[] { null, "DIRECTIVE", "PHP_EXPRESSION", "BLADE_PHP_ECHO_EXPR", "RAW_TAG", "CONTENT_TAG", "HTML", "HTML_TAG", "ERROR", "BLADE_COMMENT", "PHP_INLINE", - "D_PHP", "D_CUSTOM", "D_UNKNOWN", "D_AT", "BLADE_COMMENT_START", "ECHO_DOUBLE_NEKODU", - "ECHO_STRING_LITERAL", "ECHO_PHP_FREEZE_SYNTAX", "GREEDY_REGULAR_ECHO_EXPR", - "ESCAPED_ECHO_EXPR", "RAW_ECHO_DOUBLE_NEKODU", "RAW_ECHO_STRING_LITERAL", - "RAW_ECHO_PHP_FREEZE_SYNTAX", "RAW_ECHO_EXPR", "RAW_ECHO_EXPR_MORE", - "WS_EXPR", "OPEN_EXPR_PAREN", "LPAREN", "RPAREN", "SHORT_IF_EXPR_ERR", - "DOUBLE_NEKODU", "EXPR_STRING_LITERAL", "FREEZE_NEKUDO_GREEDY", "FREEZE_NEKUDO", - "PHP_EXPRESSION_COMMENT", "PHP_EXPRESSION_MORE", "D_ENDPHP", "BLADE_PHP_INLINE", - "BLADE_COMMENT_END", "D_ENDVERBATIM", "DB_STRING_OPEN", "EXIT_HTML_COMPONENT", - "DB_QUOTE_MORE" + "D_PHP", "D_CUSTOM", "D_UNKNOWN", "D_AT", "BLADE_COMMENT_START", "GREEDY_REGULAR_ECHO_EXPR", + "ESCAPED_ECHO_EXPR", "RAW_ECHO_EXPR", "RAW_ECHO_EXPR_MORE", "WS_EXPR", + "OPEN_EXPR_PAREN", "LPAREN", "RPAREN", "PHP_EXPRESSION_COMMENT", "PHP_EXPRESSION_MORE", + "D_ENDPHP", "BLADE_PHP_INLINE", "BLADE_COMMENT_END", "D_ENDVERBATIM", + "EXIT_HTML_COMPONENT", "EXIT_COMPONENT_PHP_EXPRESSION", "DB_QUOTE_MORE" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -184,183 +171,113 @@ public BladeAntlrColoringLexer(CharStream input) { @Override public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { switch (ruleIndex) { - case 51: - ECHO_DOUBLE_NEKODU_action((RuleContext)_localctx, actionIndex); - break; - case 52: - ECHO_STRING_LITERAL_action((RuleContext)_localctx, actionIndex); - break; - case 54: + case 49: GREEDY_REGULAR_ECHO_EXPR_action((RuleContext)_localctx, actionIndex); break; - case 55: + case 50: ESCAPED_ECHO_EXPR_action((RuleContext)_localctx, actionIndex); break; - case 58: - RAW_ECHO_DOUBLE_NEKODU_action((RuleContext)_localctx, actionIndex); - break; - case 59: - RAW_ECHO_STRING_LITERAL_action((RuleContext)_localctx, actionIndex); - break; - case 61: + case 53: RAW_ECHO_EXPR_action((RuleContext)_localctx, actionIndex); break; - case 62: + case 54: RAW_ECHO_EXPR_MORE_action((RuleContext)_localctx, actionIndex); break; - case 65: + case 57: OPEN_EXPR_PAREN_MORE_action((RuleContext)_localctx, actionIndex); break; - case 68: + case 60: OPEN_EXPR_PAREN_action((RuleContext)_localctx, actionIndex); break; - case 69: + case 61: CLOSE_EXPR_PAREN_action((RuleContext)_localctx, actionIndex); break; - case 70: + case 62: LPAREN_action((RuleContext)_localctx, actionIndex); break; - case 71: + case 63: RPAREN_action((RuleContext)_localctx, actionIndex); break; - case 74: - SHORT_IF_EXPR_ERR_action((RuleContext)_localctx, actionIndex); - break; - case 75: - DOUBLE_NEKODU_action((RuleContext)_localctx, actionIndex); - break; - case 76: - EXPR_STRING_LITERAL_action((RuleContext)_localctx, actionIndex); - break; - case 80: + case 66: PHP_EXPRESSION_MORE_action((RuleContext)_localctx, actionIndex); break; } } - private void ECHO_DOUBLE_NEKODU_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 0: - this.consumeEscapedEchoToken(); - break; - } - } - private void ECHO_STRING_LITERAL_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 1: - this.consumeEscapedEchoToken(); - break; - } - } private void GREEDY_REGULAR_ECHO_EXPR_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 2: + case 0: this.consumeEscapedEchoToken(); break; } } private void ESCAPED_ECHO_EXPR_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 3: + case 1: this.consumeEscapedEchoToken(); break; } } - private void RAW_ECHO_DOUBLE_NEKODU_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 4: - this.consumeNotEscapedEchoToken(); - break; - } - } - private void RAW_ECHO_STRING_LITERAL_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 5: - this.consumeNotEscapedEchoToken(); - break; - } - } private void RAW_ECHO_EXPR_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 6: + case 2: this.consumeNotEscapedEchoToken(); break; } } private void RAW_ECHO_EXPR_MORE_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 7: + case 3: this.consumeNotEscapedEchoToken(); break; } } private void OPEN_EXPR_PAREN_MORE_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 8: + case 4: this.increaseRoundParenBalance(); break; } } private void OPEN_EXPR_PAREN_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 9: + case 5: this.increaseRoundParenBalance(); break; - case 10: + case 6: this.consumeExprToken(); break; } } private void CLOSE_EXPR_PAREN_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 11: + case 7: this.decreaseRoundParenBalance(); break; } } private void LPAREN_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 12: + case 8: this.increaseRoundParenBalance(); break; - case 13: + case 9: this.consumeExprToken(); break; } } private void RPAREN_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 14: + case 10: this.decreaseRoundParenBalance(); break; - case 15: - this.consumeExprToken(); - break; - } - } - private void SHORT_IF_EXPR_ERR_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 16: - this.testForFreezeCombination(); - break; - } - } - private void DOUBLE_NEKODU_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 17: - this.consumeExprToken(); - break; - } - } - private void EXPR_STRING_LITERAL_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 18: + case 11: this.consumeExprToken(); break; } } private void PHP_EXPRESSION_MORE_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { - case 19: + case 12: this.consumeExprToken(); break; } @@ -368,39 +285,37 @@ private void PHP_EXPRESSION_MORE_action(RuleContext _localctx, int actionIndex) @Override public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { - case 8: + case 6: return D_GENERIC_INLINE_DIRECTIVES_sempred((RuleContext)_localctx, predIndex); - case 15: + case 13: return D_PHP_SHORT_sempred((RuleContext)_localctx, predIndex); - case 20: + case 18: return D_CUSTOM_sempred((RuleContext)_localctx, predIndex); - case 28: + case 26: return HTML_sempred((RuleContext)_localctx, predIndex); - case 29: + case 27: return HTML_MISC_sempred((RuleContext)_localctx, predIndex); - case 47: + case 45: return OTHER_HTML_POP_sempred((RuleContext)_localctx, predIndex); - case 64: + case 56: return WS_EXPR_sempred((RuleContext)_localctx, predIndex); - case 68: + case 60: return OPEN_EXPR_PAREN_sempred((RuleContext)_localctx, predIndex); - case 69: + case 61: return CLOSE_EXPR_PAREN_sempred((RuleContext)_localctx, predIndex); - case 70: + case 62: return LPAREN_sempred((RuleContext)_localctx, predIndex); - case 71: + case 63: return RPAREN_sempred((RuleContext)_localctx, predIndex); - case 72: + case 64: return EXIT_RPAREN_sempred((RuleContext)_localctx, predIndex); - case 77: - return FREEZE_NEKUDO_GREEDY_sempred((RuleContext)_localctx, predIndex); - case 83: + case 69: return BLADE_PHP_INLINE_sempred((RuleContext)_localctx, predIndex); - case 87: + case 73: return VERBATIM_HTML_sempred((RuleContext)_localctx, predIndex); - case 97: + case 83: return COMPONENT_PHP_EXPRESSION_LAST_sempred((RuleContext)_localctx, predIndex); - case 110: + case 94: return BLADE_COMMENT_PEEK_sempred((RuleContext)_localctx, predIndex); } return true; @@ -462,48 +377,41 @@ private boolean WS_EXPR_sempred(RuleContext _localctx, int predIndex) { private boolean OPEN_EXPR_PAREN_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 9: - return this.roundParenBalance == 0; + return this.getRoundParenBalance() == 0; } return true; } private boolean CLOSE_EXPR_PAREN_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 10: - return this.roundParenBalance == 1; + return this.getRoundParenBalance() == 1; } return true; } private boolean LPAREN_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 11: - return this.roundParenBalance > 0; + return this.getRoundParenBalance() > 0; } return true; } private boolean RPAREN_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 12: - return this.roundParenBalance > 0; + return this.getRoundParenBalance() > 0; } return true; } private boolean EXIT_RPAREN_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 13: - return this.roundParenBalance == 0; - } - return true; - } - private boolean FREEZE_NEKUDO_GREEDY_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 14: - return this._input.LA(1) != ':'; + return this.getRoundParenBalance() == 0; } return true; } private boolean BLADE_PHP_INLINE_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { - case 15: + case 14: return this._input.LA(1) == '@' && this._input.LA(2) == 'e' && @@ -518,7 +426,7 @@ private boolean BLADE_PHP_INLINE_sempred(RuleContext _localctx, int predIndex) { } private boolean VERBATIM_HTML_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { - case 16: + case 15: return this._input.LA(1) == '@' && this._input.LA(2) == 'e' && @@ -533,14 +441,14 @@ private boolean VERBATIM_HTML_sempred(RuleContext _localctx, int predIndex) { } private boolean COMPONENT_PHP_EXPRESSION_LAST_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { - case 17: + case 16: return this._input.LA(1) == '"'; } return true; } private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { - case 18: + case 17: return this._input.LA(1) == '-' && this._input.LA(2) == '-' && @@ -552,1231 +460,1199 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) } public static final String _serializedATN = - "\u0004\u0000+\u0742\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ + "\u0004\u0000 \u0706\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ - "\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ - "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ - "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ - "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ - "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"+ - "\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012"+ - "\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015"+ - "\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018"+ - "\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007\u001b"+ - "\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007\u001e"+ - "\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002"+ - "#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002"+ - "(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002"+ - "-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u00071\u0002"+ - "2\u00072\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u00076\u0002"+ - "7\u00077\u00028\u00078\u00029\u00079\u0002:\u0007:\u0002;\u0007;\u0002"+ - "<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007?\u0002@\u0007@\u0002"+ - "A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007D\u0002E\u0007E\u0002"+ - "F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007I\u0002J\u0007J\u0002"+ - "K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007N\u0002O\u0007O\u0002"+ - "P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007S\u0002T\u0007T\u0002"+ - "U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007X\u0002Y\u0007Y\u0002"+ - "Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007]\u0002^\u0007^\u0002"+ - "_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002b\u0007b\u0002c\u0007c\u0002"+ - "d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002g\u0007g\u0002h\u0007h\u0002"+ - "i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002l\u0007l\u0002m\u0007m\u0002"+ - "n\u0007n\u0002o\u0007o\u0002p\u0007p\u0001\u0000\u0001\u0000\u0001\u0000"+ - "\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0003\u0000\u00f6\b\u0000"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0003\u0001\u0100\b\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002"+ + "\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005"+ + "\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002"+ + "\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007\f\u0002"+ + "\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f\u0002\u0010"+ + "\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012\u0002\u0013"+ + "\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015\u0002\u0016"+ + "\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018\u0002\u0019"+ + "\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007\u001b\u0002\u001c"+ + "\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007\u001e\u0002\u001f"+ + "\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002#\u0007"+ + "#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002(\u0007"+ + "(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002-\u0007"+ + "-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u00071\u00022\u0007"+ + "2\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u00076\u00027\u0007"+ + "7\u00028\u00078\u00029\u00079\u0002:\u0007:\u0002;\u0007;\u0002<\u0007"+ + "<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007?\u0002@\u0007@\u0002A\u0007"+ + "A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007D\u0002E\u0007E\u0002F\u0007"+ + "F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007I\u0002J\u0007J\u0002K\u0007"+ + "K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007N\u0002O\u0007O\u0002P\u0007"+ + "P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007S\u0002T\u0007T\u0002U\u0007"+ + "U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007X\u0002Y\u0007Y\u0002Z\u0007"+ + "Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007]\u0002^\u0007^\u0002_\u0007"+ + "_\u0002`\u0007`\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0003\u0000\u00d6\b\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0003\u0000\u0113"+ + "\b\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0003"+ + "\u0000\u0132\b\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u013d\b\u0001\u0001\u0001"+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u015c\b\u0001"+ - "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ - "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ - "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ - "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ - "\u0001\u0002\u0001\u0002\u0003\u0002\u0178\b\u0002\u0001\u0003\u0001\u0003"+ - "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ - "\u0005\u0003\u0182\b\u0003\n\u0003\f\u0003\u0185\t\u0003\u0001\u0003\u0001"+ - "\u0003\u0001\u0004\u0001\u0004\u0005\u0004\u018b\b\u0004\n\u0004\f\u0004"+ - "\u018e\t\u0004\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006"+ - "\u0001\u0006\u0001\u0006\u0005\u0006\u0197\b\u0006\n\u0006\f\u0006\u019a"+ - "\t\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0005\u0006\u01a5\b\u0006\n"+ - "\u0006\f\u0006\u01a8\t\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003"+ - "\u0006\u01ad\b\u0006\u0003\u0006\u01af\b\u0006\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0003\u0007\u01cd\b\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u014e\b\u0001\u0001"+ + "\u0002\u0001\u0002\u0005\u0002\u0152\b\u0002\n\u0002\f\u0002\u0155\t\u0002"+ + "\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ + "\u0001\u0004\u0005\u0004\u015e\b\u0004\n\u0004\f\u0004\u0161\t\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0005\u0004\u016c\b\u0004\n\u0004\f\u0004"+ + "\u016f\t\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0003\u0004\u0174\b"+ + "\u0004\u0003\u0004\u0176\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0003\u0005\u0194\b\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0003\u0006\u0206\b\u0006\u0001\u0006\u0005\u0006\u0209\b\u0006"+ + "\n\u0006\f\u0006\u020c\t\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0003\u0007\u0222"+ + "\b\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0003\b\u023f\b\b\u0001\b\u0004\b\u0242\b\b\u000b\b"+ - "\f\b\u0243\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001"+ + "\b\u0001\b\u0001\b\u0003\b\u0251\b\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001"+ "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ - "\t\u0001\t\u0001\t\u0001\t\u0003\t\u025a\b\t\u0001\t\u0001\t\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0003\n\u0289\b\n\u0001\n\u0001"+ - "\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\u000b"+ "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0003\r\u02c0\b\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b\u0288\b\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0003\f\u02ad\b\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0003\r\u02b7\b\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000e\u0003\u000e\u02e5\b\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0003"+ - "\u000f\u02ef\b\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ - "\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ + "\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ + "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u030f\b\u0010\u0001\u0010\u0003"+ + "\u0010\u0312\b\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001"+ "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u0347\b\u0012\u0001"+ - "\u0012\u0003\u0012\u034a\b\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001"+ - "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ - "\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ - "\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001"+ - "\u0016\u0003\u0016\u0362\b\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001"+ - "\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001"+ - "\u0019\u0001\u0019\u0005\u0019\u0375\b\u0019\n\u0019\f\u0019\u0378\t\u0019"+ - "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0003\u0019\u037e\b\u0019"+ - "\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ - "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ - "\u0001\u001a\u0004\u001a\u038d\b\u001a\u000b\u001a\f\u001a\u038e\u0003"+ - "\u001a\u0391\b\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001"+ - "\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0005\u001b\u039c"+ - "\b\u001b\n\u001b\f\u001b\u039f\t\u001b\u0004\u001b\u03a1\b\u001b\u000b"+ - "\u001b\f\u001b\u03a2\u0001\u001b\u0001\u001b\u0001\u001c\u0004\u001c\u03a8"+ - "\b\u001c\u000b\u001c\f\u001c\u03a9\u0001\u001c\u0004\u001c\u03ad\b\u001c"+ - "\u000b\u001c\f\u001c\u03ae\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ - "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ - "\u0004\u001c\u03bb\b\u001c\u000b\u001c\f\u001c\u03bc\u0001\u001c\u0005"+ - "\u001c\u03c0\b\u001c\n\u001c\f\u001c\u03c3\t\u001c\u0001\u001c\u0001\u001c"+ - "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0004\u001d"+ - "\u03cc\b\u001d\u000b\u001d\f\u001d\u03cd\u0001\u001d\u0004\u001d\u03d1"+ - "\b\u001d\u000b\u001d\f\u001d\u03d2\u0001\u001d\u0003\u001d\u03d6\b\u001d"+ - "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ - "\u0001\u001d\u0001\u001d\u0001\u001d\u0004\u001d\u03e1\b\u001d\u000b\u001d"+ - "\f\u001d\u03e2\u0001\u001d\u0004\u001d\u03e6\b\u001d\u000b\u001d\f\u001d"+ - "\u03e7\u0001\u001d\u0001\u001d\u0001\u001e\u0004\u001e\u03ed\b\u001e\u000b"+ - "\u001e\f\u001e\u03ee\u0001\u001e\u0004\u001e\u03f2\b\u001e\u000b\u001e"+ - "\f\u001e\u03f3\u0003\u001e\u03f6\b\u001e\u0001\u001e\u0001\u001e\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0003\u001f\u03ff"+ - "\b\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001!\u0001"+ - "!\u0005!\u0409\b!\n!\f!\u040c\t!\u0001\"\u0001\"\u0005\"\u0410\b\"\n\""+ - "\f\"\u0413\t\"\u0001#\u0001#\u0005#\u0417\b#\n#\f#\u041a\t#\u0001$\u0001"+ - "$\u0001%\u0001%\u0001%\u0005%\u0421\b%\n%\f%\u0424\t%\u0001%\u0001%\u0001"+ - "&\u0001&\u0001&\u0001&\u0005&\u042c\b&\n&\f&\u042f\t&\u0001&\u0001&\u0001"+ - "\'\u0001\'\u0001\'\u0001\'\u0005\'\u0437\b\'\n\'\f\'\u043a\t\'\u0001("+ - "\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001"+ - ")\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001"+ - ")\u0003)\u0451\b)\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001"+ - "+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001"+ - "-\u0003-\u0465\b-\u0004-\u0467\b-\u000b-\f-\u0468\u0001-\u0001-\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0003.\u0474\b.\u0001.\u0001"+ - ".\u0001.\u0001.\u0003.\u047a\b.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0005.\u0484\b.\n.\f.\u0487\t.\u0001.\u0003.\u048a\b."+ - "\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0003.\u0550\b.\u0001.\u0005"+ - ".\u0553\b.\n.\f.\u0556\t.\u0003.\u0558\b.\u0001.\u0001.\u0001/\u0001/"+ - "\u0001/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00011\u0001"+ - "1\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u00012\u00012\u0001"+ - "3\u00013\u00013\u00014\u00014\u00034\u0576\b4\u00014\u00014\u00015\u0001"+ - "5\u00015\u00035\u057d\b5\u00015\u00015\u00016\u00046\u0582\b6\u000b6\f"+ - "6\u0583\u00016\u00016\u00017\u00017\u00057\u058a\b7\n7\f7\u058d\t7\u0001"+ - "7\u00017\u00018\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u0001"+ - "9\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0001;\u0001;\u0003;\u05a2"+ - "\b;\u0001;\u0001;\u0001<\u0001<\u0001<\u0003<\u05a9\b<\u0001<\u0001<\u0001"+ - "=\u0004=\u05ae\b=\u000b=\f=\u05af\u0001=\u0001=\u0001>\u0001>\u0005>\u05b6"+ - "\b>\n>\f>\u05b9\t>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001?\u0001?\u0001"+ - "@\u0004@\u05c3\b@\u000b@\f@\u05c4\u0001@\u0001@\u0001@\u0001@\u0001A\u0001"+ - "A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ - "E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001F\u0001"+ - "F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001"+ - "H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001"+ - "J\u0001J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0005"+ - "L\u0608\bL\nL\fL\u060b\tL\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001"+ - "M\u0001N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0005O\u061c"+ - "\bO\nO\fO\u061f\tO\u0001O\u0001O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001"+ - "P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001"+ - "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001"+ + "\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0003"+ + "\u0014\u032a\b\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+ + "\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ + "\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001"+ + "\u0017\u0005\u0017\u033d\b\u0017\n\u0017\f\u0017\u0340\t\u0017\u0001\u0017"+ + "\u0001\u0017\u0001\u0017\u0001\u0017\u0003\u0017\u0346\b\u0017\u0001\u0017"+ + "\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0004\u0018\u0355\b\u0018\u000b\u0018\f\u0018\u0356\u0003\u0018\u0359"+ + "\b\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0005\u0019\u0364\b\u0019\n"+ + "\u0019\f\u0019\u0367\t\u0019\u0004\u0019\u0369\b\u0019\u000b\u0019\f\u0019"+ + "\u036a\u0001\u0019\u0001\u0019\u0001\u001a\u0004\u001a\u0370\b\u001a\u000b"+ + "\u001a\f\u001a\u0371\u0001\u001a\u0004\u001a\u0375\b\u001a\u000b\u001a"+ + "\f\u001a\u0376\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0004\u001a"+ + "\u0383\b\u001a\u000b\u001a\f\u001a\u0384\u0001\u001a\u0005\u001a\u0388"+ + "\b\u001a\n\u001a\f\u001a\u038b\t\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0004\u001b\u0394\b\u001b"+ + "\u000b\u001b\f\u001b\u0395\u0001\u001b\u0004\u001b\u0399\b\u001b\u000b"+ + "\u001b\f\u001b\u039a\u0001\u001b\u0003\u001b\u039e\b\u001b\u0001\u001b"+ + "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+ + "\u0001\u001b\u0001\u001b\u0004\u001b\u03a9\b\u001b\u000b\u001b\f\u001b"+ + "\u03aa\u0001\u001b\u0004\u001b\u03ae\b\u001b\u000b\u001b\f\u001b\u03af"+ + "\u0001\u001b\u0001\u001b\u0001\u001c\u0004\u001c\u03b5\b\u001c\u000b\u001c"+ + "\f\u001c\u03b6\u0001\u001c\u0004\u001c\u03ba\b\u001c\u000b\u001c\f\u001c"+ + "\u03bb\u0003\u001c\u03be\b\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001"+ + "\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0003\u001d\u03c7\b\u001d\u0001"+ + "\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001"+ + "\u001f\u0001\u001f\u0005\u001f\u03d1\b\u001f\n\u001f\f\u001f\u03d4\t\u001f"+ + "\u0001 \u0001 \u0005 \u03d8\b \n \f \u03db\t \u0001!\u0001!\u0005!\u03df"+ + "\b!\n!\f!\u03e2\t!\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0005#\u03e9\b"+ + "#\n#\f#\u03ec\t#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0005$\u03f4"+ + "\b$\n$\f$\u03f7\t$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0005%\u03ff"+ + "\b%\n%\f%\u0402\t%\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001"+ + "\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ + "\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0003\'\u0419\b\'\u0001(\u0001"+ + "(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0001"+ + "*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0003+\u042d\b+\u0004+\u042f"+ + "\b+\u000b+\f+\u0430\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0003,\u043c\b,\u0001,\u0001,\u0001,\u0001,\u0003,\u0442\b,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0004,\u044c\b,\u000b"+ + ",\f,\u044d\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0004"+ + ",\u0458\b,\u000b,\f,\u0459\u0001,\u0001,\u0001,\u0003,\u045f\b,\u0003"+ + ",\u0461\b,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0003,\u0562\b,\u0001,\u0005"+ + ",\u0565\b,\n,\f,\u0568\t,\u0003,\u056a\b,\u0001,\u0001,\u0001-\u0001-"+ + "\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u0001"+ + "1\u00041\u0584\b1\u000b1\f1\u0585\u00011\u00011\u00012\u00012\u00052\u058c"+ + "\b2\n2\f2\u058f\t2\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u0001"+ + "4\u00014\u00014\u00014\u00014\u00014\u00014\u00015\u00045\u05a0\b5\u000b"+ + "5\f5\u05a1\u00015\u00015\u00016\u00016\u00056\u05a8\b6\n6\f6\u05ab\t6"+ + "\u00016\u00016\u00017\u00017\u00017\u00017\u00017\u00018\u00048\u05b5"+ + "\b8\u000b8\f8\u05b6\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u0001"+ + "9\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001"+ + ";\u0001;\u0001;\u0001<\u0001<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001"+ + "=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001>\u0001"+ + "?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ + "@\u0001A\u0001A\u0001A\u0001A\u0005A\u05ed\bA\nA\fA\u05f0\tA\u0001A\u0001"+ + "A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ + "D\u0001D\u0001E\u0001E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001F\u0001"+ + "F\u0001G\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001"+ + "H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001"+ + "H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001"+ + "J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001"+ + "L\u0001L\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001"+ + "N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001"+ + "O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001"+ "S\u0001T\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+ - "V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ - "V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001"+ - "W\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001"+ - "[\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\"+ - "\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001"+ - "^\u0001_\u0001_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001"+ - "`\u0001a\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001b\u0001b\u0001"+ - "c\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0003d\u069c\bd\u0001d\u0001"+ - "d\u0001d\u0001d\u0001d\u0001e\u0001e\u0001e\u0001e\u0001f\u0001f\u0003"+ - "f\u06a9\bf\u0001f\u0001f\u0003f\u06ad\bf\u0001f\u0004f\u06b0\bf\u000b"+ - "f\ff\u06b1\u0001f\u0003f\u06b5\bf\u0001f\u0003f\u06b8\bf\u0001f\u0003"+ - "f\u06bb\bf\u0001f\u0001f\u0003f\u06bf\bf\u0001f\u0001f\u0003f\u06c3\b"+ - "f\u0001f\u0004f\u06c6\bf\u000bf\ff\u06c7\u0001f\u0003f\u06cb\bf\u0001"+ - "f\u0001f\u0003f\u06cf\bf\u0005f\u06d1\bf\nf\ff\u06d4\tf\u0001f\u0003f"+ - "\u06d7\bf\u0001f\u0001f\u0001f\u0001f\u0001g\u0001g\u0001g\u0001g\u0001"+ - "g\u0001g\u0001g\u0001g\u0001g\u0005g\u06e6\bg\ng\fg\u06e9\tg\u0001g\u0001"+ - "g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001"+ - "h\u0001h\u0001h\u0003h\u06f9\bh\u0001h\u0001h\u0005h\u06fd\bh\nh\fh\u0700"+ - "\th\u0001h\u0001h\u0004h\u0704\bh\u000bh\fh\u0705\u0001h\u0003h\u0709"+ - "\bh\u0001h\u0001h\u0003h\u070d\bh\u0004h\u070f\bh\u000bh\fh\u0710\u0001"+ - "h\u0001h\u0001h\u0001h\u0003h\u0717\bh\u0001h\u0001h\u0001i\u0001i\u0001"+ - "i\u0001i\u0001i\u0001j\u0001j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001"+ - "k\u0001k\u0001l\u0001l\u0001l\u0001l\u0001l\u0001m\u0001m\u0001m\u0001"+ - "m\u0001m\u0001m\u0001m\u0001n\u0001n\u0001n\u0001n\u0001n\u0001o\u0001"+ - "o\u0001o\u0001o\u0001p\u0001p\u0001p\u0001p\u0001p\u0006\u0183\u0198\u01a6"+ - "\u0376\u0422\u061d\u0000q\f\u0000\u000e\u0000\u0010\u0000\u0012\u0000"+ - "\u0014\u0000\u0016\u0000\u0018\n\u001a\u0000\u001c\u0000\u001e\u0000 "+ - "\u0000\"\u0000$(&\u0000(\u0000*\u0000,\u000b.\u00000\u00002\u00004\f6"+ - "\r8\u000e:\u0000<\u0000>\u0000@\u0000B\u0000D\u0006F\u0000H\u0000J\u0000"+ - "L\u0000N\u0000P\u0000R\u0000T\u0000V\u0000X\u0000Z\u0000\\\u0000^\u0000"+ - "`\u0000b\u000fd\u0000f\u0000h\u0000j\u0000l\u0000n\u0000p\u0000r\u0010"+ - "t\u0011v\u0012x\u0013z\u0014|\u0000~\u0000\u0080\u0015\u0082\u0016\u0084"+ - "\u0017\u0086\u0018\u0088\u0019\u008a\u0000\u008c\u001a\u008e\u0000\u0090"+ - "\u0000\u0092\u0000\u0094\u001b\u0096\u0000\u0098\u001c\u009a\u001d\u009c"+ - "\u0000\u009e)\u00a0\u001e\u00a2\u001f\u00a4 \u00a6!\u00a8\"\u00aa#\u00ac"+ - "$\u00ae\u0000\u00b0%\u00b2&\u00b4\u0000\u00b6\u0000\u00b8\u0000\u00ba"+ - "\u0000\u00bc\u0000\u00be\u0000\u00c0\u0000\u00c2\u0000\u00c4\u0000\u00c6"+ - "*\u00c8\u0000\u00ca\u0000\u00cc\u0000\u00ce\u0000\u00d0\u0000\u00d2\u0000"+ - "\u00d4\u0000\u00d6\u0000\u00d8\u0000\u00da\u0000\u00dc\u0000\u00de+\u00e0"+ - "\u0000\u00e2\u0000\u00e4\u0000\u00e6\'\u00e8\u0000\u00ea\u0000\u00ec\u0000"+ - "\f\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b-\u0002"+ - "\u0000FFff\u0002\u0000OOoo\u0002\u0000RRrr\u0002\u0000EEee\u0002\u0000"+ - "AAaa\u0002\u0000CCcc\u0002\u0000HHhh\u0002\u0000IIii\u0002\u0000WWww\u0002"+ - "\u0000LLll\u0002\u0000SSss\u0002\u0000TTtt\u0002\u0000NNnn\u0002\u0000"+ - "PPpp\u0002\u0000UUuu\u0002\u0000YYyy\u0002\u0000GGgg\u0002\u0000DDdd\u0002"+ - "\u0000MMmm\u0001\u0000::\u0004\u0000AZ__az\u0080\u8000\ufffe\u0005\u0000"+ - "-.0:AZaz\u0080\u8000\ufffe\u0002\u0000XXxx\u0002\u0000BBbb\u0002\u0000"+ + "V\u0001V\u0003V\u066d\bV\u0001V\u0001V\u0003V\u0671\bV\u0001V\u0004V\u0674"+ + "\bV\u000bV\fV\u0675\u0001V\u0003V\u0679\bV\u0001V\u0003V\u067c\bV\u0001"+ + "V\u0003V\u067f\bV\u0001V\u0001V\u0003V\u0683\bV\u0001V\u0001V\u0003V\u0687"+ + "\bV\u0001V\u0004V\u068a\bV\u000bV\fV\u068b\u0001V\u0003V\u068f\bV\u0001"+ + "V\u0001V\u0003V\u0693\bV\u0005V\u0695\bV\nV\fV\u0698\tV\u0001V\u0003V"+ + "\u069b\bV\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001"+ + "W\u0001W\u0001W\u0001W\u0001W\u0005W\u06aa\bW\nW\fW\u06ad\tW\u0001W\u0001"+ + "W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0003X\u06bd\bX\u0001X\u0001X\u0005X\u06c1\bX\nX\fX\u06c4"+ + "\tX\u0001X\u0001X\u0004X\u06c8\bX\u000bX\fX\u06c9\u0001X\u0003X\u06cd"+ + "\bX\u0001X\u0001X\u0003X\u06d1\bX\u0004X\u06d3\bX\u000bX\fX\u06d4\u0001"+ + "X\u0001X\u0001X\u0001X\u0003X\u06db\bX\u0001X\u0001X\u0001Y\u0001Y\u0001"+ + "Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001"+ + "[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]"+ + "\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001^\u0001"+ + "_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001`\u0005\u015f"+ + "\u016d\u033e\u03ea\u05ee\u0000a\u000b\u0000\r\u0000\u000f\u0000\u0011"+ + "\u0000\u0013\n\u0015\u0000\u0017\u0000\u0019\u0000\u001b\u0000\u001d\u0000"+ + "\u001f\u001d!\u0000#\u0000%\u0000\'\u000b)\u0000+\u0000-\u0000/\f1\r3"+ + "\u000e5\u00007\u00009\u0000;\u0000=\u0000?\u0006A\u0000C\u0000E\u0000"+ + "G\u0000I\u0000K\u0000M\u0000O\u0000Q\u0000S\u0000U\u0000W\u0000Y\u0000"+ + "[\u0000]\u000f_\u0000a\u0000c\u0000e\u0000g\u0000i\u0000k\u0000m\u0010"+ + "o\u0011q\u0000s\u0000u\u0012w\u0013y\u0000{\u0014}\u0000\u007f\u0000\u0081"+ + "\u0000\u0083\u0015\u0085\u0000\u0087\u0016\u0089\u0017\u008b\u0000\u008d"+ + "\u0018\u008f\u0019\u0091\u0000\u0093\u001a\u0095\u001b\u0097\u0000\u0099"+ + "\u0000\u009b\u0000\u009d\u0000\u009f\u0000\u00a1\u0000\u00a3\u0000\u00a5"+ + "\u0000\u00a7\u0000\u00a9\u001e\u00ab\u0000\u00ad\u0000\u00af\u001f\u00b1"+ + "\u0000\u00b3\u0000\u00b5\u0000\u00b7\u0000\u00b9\u0000\u00bb\u0000\u00bd"+ + " \u00bf\u0000\u00c1\u0000\u00c3\u0000\u00c5\u001c\u00c7\u0000\u00c9\u0000"+ + "\u00cb\u0000\u000b\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t"+ + "\n,\u0002\u0000FFff\u0002\u0000OOoo\u0002\u0000RRrr\u0002\u0000EEee\u0002"+ + "\u0000AAaa\u0002\u0000CCcc\u0002\u0000HHhh\u0002\u0000IIii\u0002\u0000"+ + "WWww\u0002\u0000LLll\u0002\u0000SSss\u0002\u0000TTtt\u0002\u0000NNnn\u0002"+ + "\u0000PPpp\u0002\u0000UUuu\u0002\u0000YYyy\u0002\u0000GGgg\u0002\u0000"+ + "DDdd\u0002\u0000MMmm\u0004\u0000AZ__az\u0080\u8000\ufffe\u0005\u0000-"+ + ".0:AZaz\u0080\u8000\ufffe\u0002\u0000XXxx\u0002\u0000BBbb\u0002\u0000"+ "KKkk\u0002\u0000QQqq\u0002\u0000VVvv\u0002\u0000JJjj\u0004\u0000\n\n\r"+ "\r >>\u0003\u0000\n\n\r\r \u0002\u0000\n\n\r\r\u0004\u0000,,..==__\u0001"+ "\u0000(;\u0002\u0000[[]]\u0002\u0000##..\u0003\u0000..==__\u0005\u0000"+ "09AZ__az\u0080\u8000\ufffe\u0003\u0000AZaz\u0080\u8000\ufffe\u0006\u0000"+ "..09AZ__az\u0080\u8000\ufffe\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002"+ - "\u0000\"\"\\\\\u0002\u0000\'\'\\\\\u0001\u0000 \u0005\u0000 \'\'::{"+ - "{}}\u0005\u0000 !\'\'::{{}}\u07da\u0000\u0018\u0001\u0000\u0000\u0000"+ - "\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000"+ - "\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000"+ - "\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001"+ - "\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000"+ - "\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u0000"+ - "0\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001"+ - "\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000"+ - "\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000"+ - ">\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001"+ - "\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000"+ - "\u0000\u0000H\u0001\u0000\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000"+ - "L\u0001\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000\u0000d\u0001"+ - "\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001\u0000\u0000"+ - "\u0000\u0001j\u0001\u0000\u0000\u0000\u0001l\u0001\u0000\u0000\u0000\u0001"+ - "n\u0001\u0000\u0000\u0000\u0002p\u0001\u0000\u0000\u0000\u0002r\u0001"+ - "\u0000\u0000\u0000\u0002t\u0001\u0000\u0000\u0000\u0002v\u0001\u0000\u0000"+ - "\u0000\u0002x\u0001\u0000\u0000\u0000\u0002z\u0001\u0000\u0000\u0000\u0002"+ - "|\u0001\u0000\u0000\u0000\u0003~\u0001\u0000\u0000\u0000\u0003\u0080\u0001"+ - "\u0000\u0000\u0000\u0003\u0082\u0001\u0000\u0000\u0000\u0003\u0084\u0001"+ - "\u0000\u0000\u0000\u0003\u0086\u0001\u0000\u0000\u0000\u0003\u0088\u0001"+ - "\u0000\u0000\u0000\u0003\u008a\u0001\u0000\u0000\u0000\u0004\u008c\u0001"+ - "\u0000\u0000\u0000\u0004\u008e\u0001\u0000\u0000\u0000\u0004\u0090\u0001"+ - "\u0000\u0000\u0000\u0004\u0092\u0001\u0000\u0000\u0000\u0005\u0094\u0001"+ - "\u0000\u0000\u0000\u0005\u0096\u0001\u0000\u0000\u0000\u0005\u0098\u0001"+ - "\u0000\u0000\u0000\u0005\u009a\u0001\u0000\u0000\u0000\u0005\u009c\u0001"+ - "\u0000\u0000\u0000\u0005\u009e\u0001\u0000\u0000\u0000\u0005\u00a0\u0001"+ - "\u0000\u0000\u0000\u0005\u00a2\u0001\u0000\u0000\u0000\u0005\u00a4\u0001"+ - "\u0000\u0000\u0000\u0005\u00a6\u0001\u0000\u0000\u0000\u0005\u00a8\u0001"+ - "\u0000\u0000\u0000\u0005\u00aa\u0001\u0000\u0000\u0000\u0005\u00ac\u0001"+ - "\u0000\u0000\u0000\u0005\u00ae\u0001\u0000\u0000\u0000\u0006\u00b0\u0001"+ - "\u0000\u0000\u0000\u0006\u00b2\u0001\u0000\u0000\u0000\u0006\u00b4\u0001"+ - "\u0000\u0000\u0000\u0006\u00b6\u0001\u0000\u0000\u0000\u0007\u00b8\u0001"+ - "\u0000\u0000\u0000\u0007\u00ba\u0001\u0000\u0000\u0000\u0007\u00bc\u0001"+ - "\u0000\u0000\u0000\u0007\u00be\u0001\u0000\u0000\u0000\b\u00c0\u0001\u0000"+ - "\u0000\u0000\b\u00c2\u0001\u0000\u0000\u0000\b\u00c4\u0001\u0000\u0000"+ - "\u0000\b\u00c6\u0001\u0000\u0000\u0000\b\u00c8\u0001\u0000\u0000\u0000"+ - "\b\u00ca\u0001\u0000\u0000\u0000\t\u00cc\u0001\u0000\u0000\u0000\t\u00ce"+ - "\u0001\u0000\u0000\u0000\t\u00d0\u0001\u0000\u0000\u0000\t\u00d2\u0001"+ - "\u0000\u0000\u0000\n\u00d4\u0001\u0000\u0000\u0000\n\u00d6\u0001\u0000"+ - "\u0000\u0000\n\u00d8\u0001\u0000\u0000\u0000\n\u00da\u0001\u0000\u0000"+ - "\u0000\n\u00dc\u0001\u0000\u0000\u0000\n\u00de\u0001\u0000\u0000\u0000"+ - "\n\u00e0\u0001\u0000\u0000\u0000\n\u00e2\u0001\u0000\u0000\u0000\n\u00e4"+ - "\u0001\u0000\u0000\u0000\u000b\u00e6\u0001\u0000\u0000\u0000\u000b\u00e8"+ - "\u0001\u0000\u0000\u0000\u000b\u00ea\u0001\u0000\u0000\u0000\u000b\u00ec"+ - "\u0001\u0000\u0000\u0000\f\u00f5\u0001\u0000\u0000\u0000\u000e\u015b\u0001"+ - "\u0000\u0000\u0000\u0010\u015d\u0001\u0000\u0000\u0000\u0012\u0179\u0001"+ - "\u0000\u0000\u0000\u0014\u0188\u0001\u0000\u0000\u0000\u0016\u018f\u0001"+ - "\u0000\u0000\u0000\u0018\u01ae\u0001\u0000\u0000\u0000\u001a\u01cc\u0001"+ - "\u0000\u0000\u0000\u001c\u023e\u0001\u0000\u0000\u0000\u001e\u0259\u0001"+ - "\u0000\u0000\u0000 \u0288\u0001\u0000\u0000\u0000\"\u028c\u0001\u0000"+ - "\u0000\u0000$\u0299\u0001\u0000\u0000\u0000&\u02bf\u0001\u0000\u0000\u0000"+ - "(\u02e4\u0001\u0000\u0000\u0000*\u02e8\u0001\u0000\u0000\u0000,\u02f5"+ - "\u0001\u0000\u0000\u0000.\u02fc\u0001\u0000\u0000\u00000\u0349\u0001\u0000"+ - "\u0000\u00002\u034d\u0001\u0000\u0000\u00004\u0356\u0001\u0000\u0000\u0000"+ - "6\u035c\u0001\u0000\u0000\u00008\u035f\u0001\u0000\u0000\u0000:\u0363"+ - "\u0001\u0000\u0000\u0000<\u0369\u0001\u0000\u0000\u0000>\u037d\u0001\u0000"+ - "\u0000\u0000@\u0390\u0001\u0000\u0000\u0000B\u03a0\u0001\u0000\u0000\u0000"+ - "D\u03c1\u0001\u0000\u0000\u0000F\u03e5\u0001\u0000\u0000\u0000H\u03f5"+ - "\u0001\u0000\u0000\u0000J\u03fe\u0001\u0000\u0000\u0000L\u0402\u0001\u0000"+ - "\u0000\u0000N\u0406\u0001\u0000\u0000\u0000P\u040d\u0001\u0000\u0000\u0000"+ - "R\u0414\u0001\u0000\u0000\u0000T\u041b\u0001\u0000\u0000\u0000V\u041d"+ - "\u0001\u0000\u0000\u0000X\u0427\u0001\u0000\u0000\u0000Z\u0432\u0001\u0000"+ - "\u0000\u0000\\\u043b\u0001\u0000\u0000\u0000^\u0450\u0001\u0000\u0000"+ - "\u0000`\u0452\u0001\u0000\u0000\u0000b\u0454\u0001\u0000\u0000\u0000d"+ - "\u045b\u0001\u0000\u0000\u0000f\u0461\u0001\u0000\u0000\u0000h\u0557\u0001"+ - "\u0000\u0000\u0000j\u055b\u0001\u0000\u0000\u0000l\u0561\u0001\u0000\u0000"+ - "\u0000n\u0565\u0001\u0000\u0000\u0000p\u056a\u0001\u0000\u0000\u0000r"+ - "\u0570\u0001\u0000\u0000\u0000t\u0575\u0001\u0000\u0000\u0000v\u057c\u0001"+ - "\u0000\u0000\u0000x\u0581\u0001\u0000\u0000\u0000z\u0587\u0001\u0000\u0000"+ - "\u0000|\u0590\u0001\u0000\u0000\u0000~\u0595\u0001\u0000\u0000\u0000\u0080"+ - "\u059c\u0001\u0000\u0000\u0000\u0082\u05a1\u0001\u0000\u0000\u0000\u0084"+ - "\u05a8\u0001\u0000\u0000\u0000\u0086\u05ad\u0001\u0000\u0000\u0000\u0088"+ - "\u05b3\u0001\u0000\u0000\u0000\u008a\u05bc\u0001\u0000\u0000\u0000\u008c"+ - "\u05c2\u0001\u0000\u0000\u0000\u008e\u05ca\u0001\u0000\u0000\u0000\u0090"+ - "\u05d0\u0001\u0000\u0000\u0000\u0092\u05d5\u0001\u0000\u0000\u0000\u0094"+ - "\u05da\u0001\u0000\u0000\u0000\u0096\u05df\u0001\u0000\u0000\u0000\u0098"+ - "\u05e6\u0001\u0000\u0000\u0000\u009a\u05eb\u0001\u0000\u0000\u0000\u009c"+ - "\u05f0\u0001\u0000\u0000\u0000\u009e\u05f6\u0001\u0000\u0000\u0000\u00a0"+ - "\u05fb\u0001\u0000\u0000\u0000\u00a2\u0600\u0001\u0000\u0000\u0000\u00a4"+ - "\u0605\u0001\u0000\u0000\u0000\u00a6\u060e\u0001\u0000\u0000\u0000\u00a8"+ - "\u0613\u0001\u0000\u0000\u0000\u00aa\u0617\u0001\u0000\u0000\u0000\u00ac"+ - "\u0625\u0001\u0000\u0000\u0000\u00ae\u0628\u0001\u0000\u0000\u0000\u00b0"+ - "\u062d\u0001\u0000\u0000\u0000\u00b2\u0637\u0001\u0000\u0000\u0000\u00b4"+ - "\u063c\u0001\u0000\u0000\u0000\u00b6\u0640\u0001\u0000\u0000\u0000\u00b8"+ - "\u0645\u0001\u0000\u0000\u0000\u00ba\u0655\u0001\u0000\u0000\u0000\u00bc"+ - "\u065a\u0001\u0000\u0000\u0000\u00be\u065e\u0001\u0000\u0000\u0000\u00c0"+ - "\u0663\u0001\u0000\u0000\u0000\u00c2\u066b\u0001\u0000\u0000\u0000\u00c4"+ - "\u0671\u0001\u0000\u0000\u0000\u00c6\u0678\u0001\u0000\u0000\u0000\u00c8"+ - "\u067d\u0001\u0000\u0000\u0000\u00ca\u0681\u0001\u0000\u0000\u0000\u00cc"+ - "\u0686\u0001\u0000\u0000\u0000\u00ce\u068b\u0001\u0000\u0000\u0000\u00d0"+ - "\u0690\u0001\u0000\u0000\u0000\u00d2\u0694\u0001\u0000\u0000\u0000\u00d4"+ - "\u0699\u0001\u0000\u0000\u0000\u00d6\u06a2\u0001\u0000\u0000\u0000\u00d8"+ - "\u06a6\u0001\u0000\u0000\u0000\u00da\u06dc\u0001\u0000\u0000\u0000\u00dc"+ - "\u0716\u0001\u0000\u0000\u0000\u00de\u071a\u0001\u0000\u0000\u0000\u00e0"+ - "\u071f\u0001\u0000\u0000\u0000\u00e2\u0724\u0001\u0000\u0000\u0000\u00e4"+ - "\u0728\u0001\u0000\u0000\u0000\u00e6\u072d\u0001\u0000\u0000\u0000\u00e8"+ - "\u0734\u0001\u0000\u0000\u0000\u00ea\u0739\u0001\u0000\u0000\u0000\u00ec"+ - "\u073d\u0001\u0000\u0000\u0000\u00ee\u00ef\u0005:\u0000\u0000\u00ef\u00f6"+ - "\u0005:\u0000\u0000\u00f0\u00f1\u0005?\u0000\u0000\u00f1\u00f6\u0005:"+ - "\u0000\u0000\u00f2\u00f3\u0005 \u0000\u0000\u00f3\u00f4\u0005:\u0000\u0000"+ - "\u00f4\u00f6\u0005 \u0000\u0000\u00f5\u00ee\u0001\u0000\u0000\u0000\u00f5"+ - "\u00f0\u0001\u0000\u0000\u0000\u00f5\u00f2\u0001\u0000\u0000\u0000\u00f6"+ - "\r\u0001\u0000\u0000\u0000\u00f7\u00f8\u0007\u0000\u0000\u0000\u00f8\u00f9"+ - "\u0007\u0001\u0000\u0000\u00f9\u00fa\u0007\u0002\u0000\u0000\u00fa\u00ff"+ - "\u0001\u0000\u0000\u0000\u00fb\u00fc\u0007\u0003\u0000\u0000\u00fc\u00fd"+ - "\u0007\u0004\u0000\u0000\u00fd\u00fe\u0007\u0005\u0000\u0000\u00fe\u0100"+ - "\u0007\u0006\u0000\u0000\u00ff\u00fb\u0001\u0000\u0000\u0000\u00ff\u0100"+ - "\u0001\u0000\u0000\u0000\u0100\u015c\u0001\u0000\u0000\u0000\u0101\u0102"+ - "\u0007\u0007\u0000\u0000\u0102\u015c\u0007\u0000\u0000\u0000\u0103\u0104"+ - "\u0007\b\u0000\u0000\u0104\u0105\u0007\u0006\u0000\u0000\u0105\u0106\u0007"+ - "\u0007\u0000\u0000\u0106\u0107\u0007\t\u0000\u0000\u0107\u015c\u0007\u0003"+ - "\u0000\u0000\u0108\u0109\u0007\n\u0000\u0000\u0109\u010a\u0007\u0003\u0000"+ - "\u0000\u010a\u010b\u0007\u0005\u0000\u0000\u010b\u010c\u0007\u000b\u0000"+ - "\u0000\u010c\u010d\u0007\u0007\u0000\u0000\u010d\u010e\u0007\u0001\u0000"+ - "\u0000\u010e\u015c\u0007\f\u0000\u0000\u010f\u0110\u0007\n\u0000\u0000"+ - "\u0110\u0111\u0007\u0003\u0000\u0000\u0111\u0112\u0007\n\u0000\u0000\u0112"+ - "\u0113\u0007\n\u0000\u0000\u0113\u0114\u0007\u0007\u0000\u0000\u0114\u0115"+ - "\u0007\u0001\u0000\u0000\u0115\u015c\u0007\f\u0000\u0000\u0116\u0117\u0007"+ - "\u0001\u0000\u0000\u0117\u0118\u0007\f\u0000\u0000\u0118\u0119\u0007\u0005"+ - "\u0000\u0000\u0119\u015c\u0007\u0003\u0000\u0000\u011a\u011b\u0007\r\u0000"+ - "\u0000\u011b\u011c\u0007\u000e\u0000\u0000\u011c\u011d\u0007\n\u0000\u0000"+ - "\u011d\u015c\u0007\u0006\u0000\u0000\u011e\u011f\u0007\r\u0000\u0000\u011f"+ - "\u0120\u0007\u000e\u0000\u0000\u0120\u0121\u0007\n\u0000\u0000\u0121\u0122"+ - "\u0007\u0006\u0000\u0000\u0122\u0123\u0007\u0001\u0000\u0000\u0123\u0124"+ - "\u0007\f\u0000\u0000\u0124\u0125\u0007\u0005\u0000\u0000\u0125\u015c\u0007"+ - "\u0003\u0000\u0000\u0126\u0127\u0007\n\u0000\u0000\u0127\u0128\u0007\b"+ - "\u0000\u0000\u0128\u0129\u0007\u0007\u0000\u0000\u0129\u012a\u0007\u000b"+ - "\u0000\u0000\u012a\u012b\u0007\u0005\u0000\u0000\u012b\u015c\u0007\u0006"+ - "\u0000\u0000\u012c\u012d\u0007\u000e\u0000\u0000\u012d\u012e\u0007\f\u0000"+ - "\u0000\u012e\u012f\u0007\t\u0000\u0000\u012f\u0130\u0007\u0003\u0000\u0000"+ - "\u0130\u0131\u0007\n\u0000\u0000\u0131\u015c\u0007\n\u0000\u0000\u0132"+ - "\u0133\u0007\u0005\u0000\u0000\u0133\u0134\u0007\u0004\u0000\u0000\u0134"+ - "\u0135\u0007\f\u0000\u0000\u0135\u013c\u0001\u0000\u0000\u0000\u0136\u0137"+ - "\u0007\u0004\u0000\u0000\u0137\u0138\u0007\f\u0000\u0000\u0138\u013d\u0007"+ - "\u000f\u0000\u0000\u0139\u013a\u0007\f\u0000\u0000\u013a\u013b\u0007\u0001"+ - "\u0000\u0000\u013b\u013d\u0007\u000b\u0000\u0000\u013c\u0136\u0001\u0000"+ - "\u0000\u0000\u013c\u0139\u0001\u0000\u0000\u0000\u013c\u013d\u0001\u0000"+ - "\u0000\u0000\u013d\u015c\u0001\u0000\u0000\u0000\u013e\u013f\u0007\u0004"+ - "\u0000\u0000\u013f\u0140\u0007\u000e\u0000\u0000\u0140\u0141\u0007\u000b"+ - "\u0000\u0000\u0141\u015c\u0007\u0006\u0000\u0000\u0142\u0143\u0007\u0010"+ - "\u0000\u0000\u0143\u0144\u0007\u000e\u0000\u0000\u0144\u0145\u0007\u0003"+ - "\u0000\u0000\u0145\u0146\u0007\n\u0000\u0000\u0146\u015c\u0007\u000b\u0000"+ - "\u0000\u0147\u0148\u0007\u0003\u0000\u0000\u0148\u0149\u0007\u0002\u0000"+ - "\u0000\u0149\u014a\u0007\u0002\u0000\u0000\u014a\u014b\u0007\u0001\u0000"+ - "\u0000\u014b\u015c\u0007\u0002\u0000\u0000\u014c\u014d\u0007\r\u0000\u0000"+ - "\u014d\u014e\u0007\u0002\u0000\u0000\u014e\u014f\u0007\u0001\u0000\u0000"+ - "\u014f\u0150\u0007\u0011\u0000\u0000\u0150\u0151\u0007\u000e\u0000\u0000"+ - "\u0151\u0152\u0007\u0005\u0000\u0000\u0152\u0153\u0007\u000b\u0000\u0000"+ - "\u0153\u0154\u0007\u0007\u0000\u0000\u0154\u0155\u0007\u0001\u0000\u0000"+ - "\u0155\u015c\u0007\f\u0000\u0000\u0156\u0157\u0007\u0003\u0000\u0000\u0157"+ - "\u0158\u0007\u0012\u0000\u0000\u0158\u0159\u0007\r\u0000\u0000\u0159\u015a"+ - "\u0007\u000b\u0000\u0000\u015a\u015c\u0007\u000f\u0000\u0000\u015b\u00f7"+ - "\u0001\u0000\u0000\u0000\u015b\u0101\u0001\u0000\u0000\u0000\u015b\u0103"+ - "\u0001\u0000\u0000\u0000\u015b\u0108\u0001\u0000\u0000\u0000\u015b\u010f"+ - "\u0001\u0000\u0000\u0000\u015b\u0116\u0001\u0000\u0000\u0000\u015b\u011a"+ - "\u0001\u0000\u0000\u0000\u015b\u011e\u0001\u0000\u0000\u0000\u015b\u0126"+ - "\u0001\u0000\u0000\u0000\u015b\u012c\u0001\u0000\u0000\u0000\u015b\u0132"+ - "\u0001\u0000\u0000\u0000\u015b\u013e\u0001\u0000\u0000\u0000\u015b\u0142"+ - "\u0001\u0000\u0000\u0000\u015b\u0147\u0001\u0000\u0000\u0000\u015b\u014c"+ - "\u0001\u0000\u0000\u0000\u015b\u0156\u0001\u0000\u0000\u0000\u015c\u000f"+ - "\u0001\u0000\u0000\u0000\u015d\u015e\u0005@\u0000\u0000\u015e\u015f\u0007"+ - "\u0007\u0000\u0000\u015f\u0160\u0007\f\u0000\u0000\u0160\u0161\u0007\u0005"+ - "\u0000\u0000\u0161\u0162\u0007\t\u0000\u0000\u0162\u0163\u0007\u000e\u0000"+ - "\u0000\u0163\u0164\u0007\u0011\u0000\u0000\u0164\u0165\u0007\u0003\u0000"+ - "\u0000\u0165\u0177\u0001\u0000\u0000\u0000\u0166\u0167\u0007\u0007\u0000"+ - "\u0000\u0167\u0178\u0007\u0000\u0000\u0000\u0168\u0169\u0007\b\u0000\u0000"+ - "\u0169\u016a\u0007\u0006\u0000\u0000\u016a\u016b\u0007\u0003\u0000\u0000"+ - "\u016b\u0178\u0007\f\u0000\u0000\u016c\u016d\u0007\u0000\u0000\u0000\u016d"+ - "\u016e\u0007\u0007\u0000\u0000\u016e\u016f\u0007\u0002\u0000\u0000\u016f"+ - "\u0170\u0007\n\u0000\u0000\u0170\u0178\u0007\u000b\u0000\u0000\u0171\u0172"+ - "\u0007\u000e\u0000\u0000\u0172\u0173\u0007\f\u0000\u0000\u0173\u0174\u0007"+ - "\t\u0000\u0000\u0174\u0175\u0007\u0003\u0000\u0000\u0175\u0176\u0007\n"+ - "\u0000\u0000\u0176\u0178\u0007\n\u0000\u0000\u0177\u0166\u0001\u0000\u0000"+ - "\u0000\u0177\u0168\u0001\u0000\u0000\u0000\u0177\u016c\u0001\u0000\u0000"+ - "\u0000\u0177\u0171\u0001\u0000\u0000\u0000\u0177\u0178\u0001\u0000\u0000"+ - "\u0000\u0178\u0011\u0001\u0000\u0000\u0000\u0179\u0183\u0005\"\u0000\u0000"+ - "\u017a\u0182\u0003T$\u0000\u017b\u017c\u0005{\u0000\u0000\u017c\u017d"+ - "\u0003\\(\u0000\u017d\u017e\u0005}\u0000\u0000\u017e\u0182\u0001\u0000"+ - "\u0000\u0000\u017f\u0182\t\u0000\u0000\u0000\u0180\u0182\b\u0013\u0000"+ - "\u0000\u0181\u017a\u0001\u0000\u0000\u0000\u0181\u017b\u0001\u0000\u0000"+ - "\u0000\u0181\u017f\u0001\u0000\u0000\u0000\u0181\u0180\u0001\u0000\u0000"+ - "\u0000\u0182\u0185\u0001\u0000\u0000\u0000\u0183\u0184\u0001\u0000\u0000"+ - "\u0000\u0183\u0181\u0001\u0000\u0000\u0000\u0184\u0186\u0001\u0000\u0000"+ - "\u0000\u0185\u0183\u0001\u0000\u0000\u0000\u0186\u0187\u0005\"\u0000\u0000"+ - "\u0187\u0013\u0001\u0000\u0000\u0000\u0188\u018c\u0007\u0014\u0000\u0000"+ - "\u0189\u018b\u0007\u0015\u0000\u0000\u018a\u0189\u0001\u0000\u0000\u0000"+ - "\u018b\u018e\u0001\u0000\u0000\u0000\u018c\u018a\u0001\u0000\u0000\u0000"+ - "\u018c\u018d\u0001\u0000\u0000\u0000\u018d\u0015\u0001\u0000\u0000\u0000"+ - "\u018e\u018c\u0001\u0000\u0000\u0000\u018f\u0190\u0005\u00b0\u0000\u0000"+ - "\u0190\u0017\u0001\u0000\u0000\u0000\u0191\u0192\u0005<\u0000\u0000\u0192"+ - "\u0193\u0005?\u0000\u0000\u0193\u0194\u0005=\u0000\u0000\u0194\u0198\u0001"+ - "\u0000\u0000\u0000\u0195\u0197\t\u0000\u0000\u0000\u0196\u0195\u0001\u0000"+ - "\u0000\u0000\u0197\u019a\u0001\u0000\u0000\u0000\u0198\u0199\u0001\u0000"+ - "\u0000\u0000\u0198\u0196\u0001\u0000\u0000\u0000\u0199\u019b\u0001\u0000"+ - "\u0000\u0000\u019a\u0198\u0001\u0000\u0000\u0000\u019b\u019c\u0005?\u0000"+ - "\u0000\u019c\u01af\u0005>\u0000\u0000\u019d\u019e\u0005<\u0000\u0000\u019e"+ - "\u019f\u0005?\u0000\u0000\u019f\u01a0\u0007\r\u0000\u0000\u01a0\u01a1"+ - "\u0007\u0006\u0000\u0000\u01a1\u01a2\u0007\r\u0000\u0000\u01a2\u01a6\u0001"+ - "\u0000\u0000\u0000\u01a3\u01a5\t\u0000\u0000\u0000\u01a4\u01a3\u0001\u0000"+ - "\u0000\u0000\u01a5\u01a8\u0001\u0000\u0000\u0000\u01a6\u01a7\u0001\u0000"+ - "\u0000\u0000\u01a6\u01a4\u0001\u0000\u0000\u0000\u01a7\u01ac\u0001\u0000"+ - "\u0000\u0000\u01a8\u01a6\u0001\u0000\u0000\u0000\u01a9\u01aa\u0005?\u0000"+ - "\u0000\u01aa\u01ad\u0005>\u0000\u0000\u01ab\u01ad\u0005\u0000\u0000\u0001"+ - "\u01ac\u01a9\u0001\u0000\u0000\u0000\u01ac\u01ab\u0001\u0000\u0000\u0000"+ - "\u01ad\u01af\u0001\u0000\u0000\u0000\u01ae\u0191\u0001\u0000\u0000\u0000"+ - "\u01ae\u019d\u0001\u0000\u0000\u0000\u01af\u0019\u0001\u0000\u0000\u0000"+ - "\u01b0\u01b1\u0005@\u0000\u0000\u01b1\u01cd\u0003\u000e\u0001\u0000\u01b2"+ - "\u01b3\u0005@\u0000\u0000\u01b3\u01b4\u0007\n\u0000\u0000\u01b4\u01b5"+ - "\u0007\u0003\u0000\u0000\u01b5\u01b6\u0007\u0005\u0000\u0000\u01b6\u01b7"+ - "\u0007\u000b\u0000\u0000\u01b7\u01b8\u0007\u0007\u0000\u0000\u01b8\u01b9"+ - "\u0007\u0001\u0000\u0000\u01b9\u01ba\u0007\f\u0000\u0000\u01ba\u01bb\u0007"+ - "\u0012\u0000\u0000\u01bb\u01bc\u0007\u0007\u0000\u0000\u01bc\u01bd\u0007"+ - "\n\u0000\u0000\u01bd\u01be\u0007\n\u0000\u0000\u01be\u01bf\u0007\u0007"+ - "\u0000\u0000\u01bf\u01c0\u0007\f\u0000\u0000\u01c0\u01cd\u0007\u0010\u0000"+ - "\u0000\u01c1\u01c2\u0005@\u0000\u0000\u01c2\u01c3\u0007\u0006\u0000\u0000"+ - "\u01c3\u01c4\u0007\u0004\u0000\u0000\u01c4\u01c5\u0007\n\u0000\u0000\u01c5"+ - "\u01c6\u0007\n\u0000\u0000\u01c6\u01c7\u0007\u0003\u0000\u0000\u01c7\u01c8"+ - "\u0007\u0005\u0000\u0000\u01c8\u01c9\u0007\u000b\u0000\u0000\u01c9\u01ca"+ - "\u0007\u0007\u0000\u0000\u01ca\u01cb\u0007\u0001\u0000\u0000\u01cb\u01cd"+ - "\u0007\f\u0000\u0000\u01cc\u01b0\u0001\u0000\u0000\u0000\u01cc\u01b2\u0001"+ - "\u0000\u0000\u0000\u01cc\u01c1\u0001\u0000\u0000\u0000\u01cd\u01ce\u0001"+ - "\u0000\u0000\u0000\u01ce\u01cf\u0006\u0007\u0000\u0000\u01cf\u01d0\u0006"+ - "\u0007\u0001\u0000\u01d0\u001b\u0001\u0000\u0000\u0000\u01d1\u01d2\u0005"+ - "@\u0000\u0000\u01d2\u01d3\u0007\u0003\u0000\u0000\u01d3\u01d4\u0007\t"+ - "\u0000\u0000\u01d4\u01d5\u0007\n\u0000\u0000\u01d5\u01d6\u0007\u0003\u0000"+ - "\u0000\u01d6\u01d7\u0007\u0007\u0000\u0000\u01d7\u023f\u0007\u0000\u0000"+ - "\u0000\u01d8\u023f\u0003\u0010\u0002\u0000\u01d9\u01da\u0005@\u0000\u0000"+ - "\u01da\u01db\u0007\u0003\u0000\u0000\u01db\u01dc\u0007\u0016\u0000\u0000"+ - "\u01dc\u01dd\u0007\u000b\u0000\u0000\u01dd\u01de\u0007\u0003\u0000\u0000"+ - "\u01de\u01df\u0007\f\u0000\u0000\u01df\u01e0\u0007\u0011\u0000\u0000\u01e0"+ - "\u023f\u0007\n\u0000\u0000\u01e1\u01e2\u0005@\u0000\u0000\u01e2\u01e3"+ - "\u0007\u0003\u0000\u0000\u01e3\u01e4\u0007\u0004\u0000\u0000\u01e4\u01e5"+ - "\u0007\u0005\u0000\u0000\u01e5\u023f\u0007\u0006\u0000\u0000\u01e6\u01e7"+ - "\u0005@\u0000\u0000\u01e7\u01e8\u0007\u000f\u0000\u0000\u01e8\u01e9\u0007"+ - "\u0007\u0000\u0000\u01e9\u01ea\u0007\u0003\u0000\u0000\u01ea\u01eb\u0007"+ - "\t\u0000\u0000\u01eb\u023f\u0007\u0011\u0000\u0000\u01ec\u01ed\u0005@"+ - "\u0000\u0000\u01ed\u01ee\u0007\r\u0000\u0000\u01ee\u01ef\u0007\u0002\u0000"+ - "\u0000\u01ef\u01f0\u0007\u0001\u0000\u0000\u01f0\u01f1\u0007\r\u0000\u0000"+ - "\u01f1\u023f\u0007\n\u0000\u0000\u01f2\u01f3\u0005@\u0000\u0000\u01f3"+ - "\u01f4\u0007\u0012\u0000\u0000\u01f4\u01f5\u0007\u0003\u0000\u0000\u01f5"+ - "\u01f6\u0007\u000b\u0000\u0000\u01f6\u01f7\u0007\u0006\u0000\u0000\u01f7"+ - "\u01f8\u0007\u0001\u0000\u0000\u01f8\u023f\u0007\u0011\u0000\u0000\u01f9"+ - "\u01fa\u0005@\u0000\u0000\u01fa\u01fb\u0007\u0005\u0000\u0000\u01fb\u01fc"+ - "\u0007\t\u0000\u0000\u01fc\u01fd\u0007\u0004\u0000\u0000\u01fd\u01fe\u0007"+ - "\n\u0000\u0000\u01fe\u023f\u0007\n\u0000\u0000\u01ff\u0200\u0005@\u0000"+ - "\u0000\u0200\u0201\u0007\n\u0000\u0000\u0201\u0202\u0007\u000b\u0000\u0000"+ - "\u0202\u0203\u0007\u000f\u0000\u0000\u0203\u0204\u0007\t\u0000\u0000\u0204"+ - "\u023f\u0007\u0003\u0000\u0000\u0205\u0206\u0005@\u0000\u0000\u0206\u0207"+ - "\u0007\u0004\u0000\u0000\u0207\u0208\u0007\b\u0000\u0000\u0208\u0209\u0007"+ - "\u0004\u0000\u0000\u0209\u020a\u0007\u0002\u0000\u0000\u020a\u023f\u0007"+ - "\u0003\u0000\u0000\u020b\u020c\u0005@\u0000\u0000\u020c\u020d\u0007\u0017"+ - "\u0000\u0000\u020d\u020e\u0007\u0002\u0000\u0000\u020e\u020f\u0007\u0003"+ - "\u0000\u0000\u020f\u0210\u0007\u0004\u0000\u0000\u0210\u023f\u0007\u0018"+ - "\u0000\u0000\u0211\u0212\u0005@\u0000\u0000\u0212\u0213\u0007\u0005\u0000"+ - "\u0000\u0213\u0214\u0007\u0001\u0000\u0000\u0214\u0215\u0007\f\u0000\u0000"+ - "\u0215\u0216\u0007\u000b\u0000\u0000\u0216\u0217\u0007\u0007\u0000\u0000"+ - "\u0217\u0218\u0007\f\u0000\u0000\u0218\u0219\u0007\u000e\u0000\u0000\u0219"+ - "\u023f\u0007\u0003\u0000\u0000\u021a\u021b\u0005@\u0000\u0000\u021b\u021c"+ - "\u0007\n\u0000\u0000\u021c\u021d\u0007\u0003\u0000\u0000\u021d\u021e\u0007"+ - "\t\u0000\u0000\u021e\u021f\u0007\u0003\u0000\u0000\u021f\u0220\u0007\u0005"+ - "\u0000\u0000\u0220\u0221\u0007\u000b\u0000\u0000\u0221\u0222\u0007\u0003"+ - "\u0000\u0000\u0222\u023f\u0007\u0011\u0000\u0000\u0223\u0224\u0005@\u0000"+ - "\u0000\u0224\u0225\u0007\u0011\u0000\u0000\u0225\u0226\u0007\u0007\u0000"+ - "\u0000\u0226\u0227\u0007\n\u0000\u0000\u0227\u0228\u0007\u0004\u0000\u0000"+ - "\u0228\u0229\u0007\u0017\u0000\u0000\u0229\u022a\u0007\t\u0000\u0000\u022a"+ - "\u022b\u0007\u0003\u0000\u0000\u022b\u023f\u0007\u0011\u0000\u0000\u022c"+ - "\u022d\u0005@\u0000\u0000\u022d\u022e\u0007\u0002\u0000\u0000\u022e\u022f"+ - "\u0007\u0003\u0000\u0000\u022f\u0230\u0007\u0004\u0000\u0000\u0230\u0231"+ - "\u0007\u0011\u0000\u0000\u0231\u0232\u0007\u0001\u0000\u0000\u0232\u0233"+ - "\u0007\f\u0000\u0000\u0233\u0234\u0007\t\u0000\u0000\u0234\u023f\u0007"+ - "\u000f\u0000\u0000\u0235\u0236\u0005@\u0000\u0000\u0236\u0237\u0007\u0002"+ - "\u0000\u0000\u0237\u0238\u0007\u0003\u0000\u0000\u0238\u0239\u0007\u0019"+ - "\u0000\u0000\u0239\u023a\u0007\u000e\u0000\u0000\u023a\u023b\u0007\u0007"+ - "\u0000\u0000\u023b\u023c\u0007\u0002\u0000\u0000\u023c\u023d\u0007\u0003"+ - "\u0000\u0000\u023d\u023f\u0007\u0011\u0000\u0000\u023e\u01d1\u0001\u0000"+ - "\u0000\u0000\u023e\u01d8\u0001\u0000\u0000\u0000\u023e\u01d9\u0001\u0000"+ - "\u0000\u0000\u023e\u01e1\u0001\u0000\u0000\u0000\u023e\u01e6\u0001\u0000"+ - "\u0000\u0000\u023e\u01ec\u0001\u0000\u0000\u0000\u023e\u01f2\u0001\u0000"+ - "\u0000\u0000\u023e\u01f9\u0001\u0000\u0000\u0000\u023e\u01ff\u0001\u0000"+ - "\u0000\u0000\u023e\u0205\u0001\u0000\u0000\u0000\u023e\u020b\u0001\u0000"+ - "\u0000\u0000\u023e\u0211\u0001\u0000\u0000\u0000\u023e\u021a\u0001\u0000"+ - "\u0000\u0000\u023e\u0223\u0001\u0000\u0000\u0000\u023e\u022c\u0001\u0000"+ - "\u0000\u0000\u023e\u0235\u0001\u0000\u0000\u0000\u023f\u0241\u0001\u0000"+ - "\u0000\u0000\u0240\u0242\u0005 \u0000\u0000\u0241\u0240\u0001\u0000\u0000"+ - "\u0000\u0242\u0243\u0001\u0000\u0000\u0000\u0243\u0241\u0001\u0000\u0000"+ - "\u0000\u0243\u0244\u0001\u0000\u0000\u0000\u0244\u0245\u0001\u0000\u0000"+ - "\u0000\u0245\u0246\u0004\b\u0000\u0000\u0246\u0247\u0001\u0000\u0000\u0000"+ - "\u0247\u0248\u0006\b\u0000\u0000\u0248\u0249\u0006\b\u0001\u0000\u0249"+ - "\u001d\u0001\u0000\u0000\u0000\u024a\u024b\u0005@\u0000\u0000\u024b\u024c"+ - "\u0007\u0017\u0000\u0000\u024c\u024d\u0007\u0002\u0000\u0000\u024d\u024e"+ - "\u0007\u0003\u0000\u0000\u024e\u024f\u0007\u0004\u0000\u0000\u024f\u025a"+ - "\u0007\u0018\u0000\u0000\u0250\u0251\u0005@\u0000\u0000\u0251\u0252\u0007"+ - "\u0005\u0000\u0000\u0252\u0253\u0007\u0001\u0000\u0000\u0253\u0254\u0007"+ - "\f\u0000\u0000\u0254\u0255\u0007\u000b\u0000\u0000\u0255\u0256\u0007\u0007"+ - "\u0000\u0000\u0256\u0257\u0007\f\u0000\u0000\u0257\u0258\u0007\u000e\u0000"+ - "\u0000\u0258\u025a\u0007\u0003\u0000\u0000\u0259\u024a\u0001\u0000\u0000"+ - "\u0000\u0259\u0250\u0001\u0000\u0000\u0000\u025a\u025b\u0001\u0000\u0000"+ - "\u0000\u025b\u025c\u0006\t\u0001\u0000\u025c\u001f\u0001\u0000\u0000\u0000"+ - "\u025d\u025e\u0005@\u0000\u0000\u025e\u025f\u0007\n\u0000\u0000\u025f"+ - "\u0260\u0007\u000b\u0000\u0000\u0260\u0261\u0007\u0001\u0000\u0000\u0261"+ - "\u0289\u0007\r\u0000\u0000\u0262\u0263\u0005@\u0000\u0000\u0263\u0264"+ - "\u0007\n\u0000\u0000\u0264\u0265\u0007\u0006\u0000\u0000\u0265\u0266\u0007"+ - "\u0001\u0000\u0000\u0266\u0289\u0007\b\u0000\u0000\u0267\u0268\u0005@"+ - "\u0000\u0000\u0268\u0269\u0007\u0001\u0000\u0000\u0269\u026a\u0007\u001a"+ - "\u0000\u0000\u026a\u026b\u0007\u0003\u0000\u0000\u026b\u026c\u0007\u0002"+ - "\u0000\u0000\u026c\u026d\u0007\b\u0000\u0000\u026d\u026e\u0007\u0002\u0000"+ - "\u0000\u026e\u026f\u0007\u0007\u0000\u0000\u026f\u0270\u0007\u000b\u0000"+ - "\u0000\u0270\u0289\u0007\u0003\u0000\u0000\u0271\u0272\u0005@\u0000\u0000"+ - "\u0272\u0273\u0007\u001a\u0000\u0000\u0273\u0274\u0007\u0007\u0000\u0000"+ - "\u0274\u0275\u0007\u000b\u0000\u0000\u0275\u0276\u0007\u0003\u0000\u0000"+ - "\u0276\u0277\u0007\u0002\u0000\u0000\u0277\u0278\u0007\u0003\u0000\u0000"+ - "\u0278\u0279\u0007\u0004\u0000\u0000\u0279\u027a\u0007\u0005\u0000\u0000"+ - "\u027a\u027b\u0007\u000b\u0000\u0000\u027b\u027c\u0007\u0002\u0000\u0000"+ - "\u027c\u027d\u0007\u0003\u0000\u0000\u027d\u027e\u0007\u0000\u0000\u0000"+ - "\u027e\u027f\u0007\u0002\u0000\u0000\u027f\u0280\u0007\u0003\u0000\u0000"+ - "\u0280\u0281\u0007\n\u0000\u0000\u0281\u0289\u0007\u0006\u0000\u0000\u0282"+ - "\u0283\u0005@\u0000\u0000\u0283\u0284\u0007\u0003\u0000\u0000\u0284\u0285"+ - "\u0007\f\u0000\u0000\u0285\u0286\u0007\u0011\u0000\u0000\u0286\u0287\u0001"+ - "\u0000\u0000\u0000\u0287\u0289\u0003\u000e\u0001\u0000\u0288\u025d\u0001"+ - "\u0000\u0000\u0000\u0288\u0262\u0001\u0000\u0000\u0000\u0288\u0267\u0001"+ - "\u0000\u0000\u0000\u0288\u0271\u0001\u0000\u0000\u0000\u0288\u0282\u0001"+ - "\u0000\u0000\u0000\u0289\u028a\u0001\u0000\u0000\u0000\u028a\u028b\u0006"+ - "\n\u0001\u0000\u028b!\u0001\u0000\u0000\u0000\u028c\u028d\u0005@\u0000"+ - "\u0000\u028d\u028e\u0007\u001a\u0000\u0000\u028e\u028f\u0007\u0003\u0000"+ - "\u0000\u028f\u0290\u0007\u0002\u0000\u0000\u0290\u0291\u0007\u0017\u0000"+ - "\u0000\u0291\u0292\u0007\u0004\u0000\u0000\u0292\u0293\u0007\u000b\u0000"+ - "\u0000\u0293\u0294\u0007\u0007\u0000\u0000\u0294\u0295\u0007\u0012\u0000"+ - "\u0000\u0295\u0296\u0001\u0000\u0000\u0000\u0296\u0297\u0006\u000b\u0002"+ - "\u0000\u0297\u0298\u0006\u000b\u0001\u0000\u0298#\u0001\u0000\u0000\u0000"+ - "\u0299\u029a\u0005@\u0000\u0000\u029a\u029b\u0007\u0003\u0000\u0000\u029b"+ - "\u029c\u0007\f\u0000\u0000\u029c\u029d\u0007\u0011\u0000\u0000\u029d\u029e"+ - "\u0007\u001a\u0000\u0000\u029e\u029f\u0007\u0003\u0000\u0000\u029f\u02a0"+ - "\u0007\u0002\u0000\u0000\u02a0\u02a1\u0007\u0017\u0000\u0000\u02a1\u02a2"+ - "\u0007\u0004\u0000\u0000\u02a2\u02a3\u0007\u000b\u0000\u0000\u02a3\u02a4"+ - "\u0007\u0007\u0000\u0000\u02a4\u02a5\u0007\u0012\u0000\u0000\u02a5\u02a6"+ - "\u0001\u0000\u0000\u0000\u02a6\u02a7\u0006\f\u0001\u0000\u02a7%\u0001"+ - "\u0000\u0000\u0000\u02a8\u02a9\u0005@\u0000\u0000\u02a9\u02aa\u0007\u0011"+ - "\u0000\u0000\u02aa\u02c0\u0007\u0011\u0000\u0000\u02ab\u02ac\u0005@\u0000"+ - "\u0000\u02ac\u02ad\u0007\u0011\u0000\u0000\u02ad\u02ae\u0007\u000e\u0000"+ - "\u0000\u02ae\u02af\u0007\u0012\u0000\u0000\u02af\u02c0\u0007\r\u0000\u0000"+ - "\u02b0\u02b1\u0005@\u0000\u0000\u02b1\u02b2\u0007\u001b\u0000\u0000\u02b2"+ - "\u02c0\u0007\n\u0000\u0000\u02b3\u02b4\u0005@\u0000\u0000\u02b4\u02b5"+ - "\u0007\u001b\u0000\u0000\u02b5\u02b6\u0007\n\u0000\u0000\u02b6\u02b7\u0007"+ - "\u0001\u0000\u0000\u02b7\u02c0\u0007\f\u0000\u0000\u02b8\u02b9\u0005@"+ - "\u0000\u0000\u02b9\u02ba\u0007\u0007\u0000\u0000\u02ba\u02bb\u0007\f\u0000"+ - "\u0000\u02bb\u02bc\u0007\u001b\u0000\u0000\u02bc\u02bd\u0007\u0003\u0000"+ - "\u0000\u02bd\u02be\u0007\u0005\u0000\u0000\u02be\u02c0\u0007\u000b\u0000"+ - "\u0000\u02bf\u02a8\u0001\u0000\u0000\u0000\u02bf\u02ab\u0001\u0000\u0000"+ - "\u0000\u02bf\u02b0\u0001\u0000\u0000\u0000\u02bf\u02b3\u0001\u0000\u0000"+ - "\u0000\u02bf\u02b8\u0001\u0000\u0000\u0000\u02c0\u02c1\u0001\u0000\u0000"+ - "\u0000\u02c1\u02c2\u0006\r\u0000\u0000\u02c2\u02c3\u0006\r\u0001\u0000"+ - "\u02c3\'\u0001\u0000\u0000\u0000\u02c4\u02c5\u0005@\u0000\u0000\u02c5"+ - "\u02c6\u0007\u0003\u0000\u0000\u02c6\u02c7\u0007\t\u0000\u0000\u02c7\u02c8"+ - "\u0007\n\u0000\u0000\u02c8\u02e5\u0007\u0003\u0000\u0000\u02c9\u02ca\u0005"+ - "@\u0000\u0000\u02ca\u02cb\u0007\u0005\u0000\u0000\u02cb\u02cc\u0007\n"+ - "\u0000\u0000\u02cc\u02cd\u0007\u0002\u0000\u0000\u02cd\u02e5\u0007\u0000"+ - "\u0000\u0000\u02ce\u02cf\u0005@\u0000\u0000\u02cf\u02d0\u0007\u0011\u0000"+ - "\u0000\u02d0\u02d1\u0007\u0003\u0000\u0000\u02d1\u02d2\u0007\u0000\u0000"+ - "\u0000\u02d2\u02d3\u0007\u0004\u0000\u0000\u02d3\u02d4\u0007\u000e\u0000"+ - "\u0000\u02d4\u02d5\u0007\t\u0000\u0000\u02d5\u02e5\u0007\u000b\u0000\u0000"+ - "\u02d6\u02d7\u0005@\u0000\u0000\u02d7\u02d8\u0007\u0004\u0000\u0000\u02d8"+ - "\u02d9\u0007\r\u0000\u0000\u02d9\u02da\u0007\r\u0000\u0000\u02da\u02db"+ - "\u0007\u0003\u0000\u0000\u02db\u02dc\u0007\f\u0000\u0000\u02dc\u02e5\u0007"+ - "\u0011\u0000\u0000\u02dd\u02de\u0005@\u0000\u0000\u02de\u02df\u0007\r"+ - "\u0000\u0000\u02df\u02e0\u0007\u0004\u0000\u0000\u02e0\u02e1\u0007\u0002"+ - "\u0000\u0000\u02e1\u02e2\u0007\u0003\u0000\u0000\u02e2\u02e3\u0007\f\u0000"+ - "\u0000\u02e3\u02e5\u0007\u000b\u0000\u0000\u02e4\u02c4\u0001\u0000\u0000"+ - "\u0000\u02e4\u02c9\u0001\u0000\u0000\u0000\u02e4\u02ce\u0001\u0000\u0000"+ - "\u0000\u02e4\u02d6\u0001\u0000\u0000\u0000\u02e4\u02dd\u0001\u0000\u0000"+ - "\u0000\u02e5\u02e6\u0001\u0000\u0000\u0000\u02e6\u02e7\u0006\u000e\u0001"+ - "\u0000\u02e7)\u0001\u0000\u0000\u0000\u02e8\u02e9\u0005@\u0000\u0000\u02e9"+ - "\u02ea\u0007\r\u0000\u0000\u02ea\u02eb\u0007\u0006\u0000\u0000\u02eb\u02ec"+ - "\u0007\r\u0000\u0000\u02ec\u02ee\u0001\u0000\u0000\u0000\u02ed\u02ef\u0005"+ - " \u0000\u0000\u02ee\u02ed\u0001\u0000\u0000\u0000\u02ee\u02ef\u0001\u0000"+ - "\u0000\u0000\u02ef\u02f0\u0001\u0000\u0000\u0000\u02f0\u02f1\u0004\u000f"+ - "\u0001\u0000\u02f1\u02f2\u0001\u0000\u0000\u0000\u02f2\u02f3\u0006\u000f"+ - "\u0003\u0000\u02f3\u02f4\u0006\u000f\u0000\u0000\u02f4+\u0001\u0000\u0000"+ - "\u0000\u02f5\u02f6\u0005@\u0000\u0000\u02f6\u02f7\u0007\r\u0000\u0000"+ - "\u02f7\u02f8\u0007\u0006\u0000\u0000\u02f8\u02f9\u0007\r\u0000\u0000\u02f9"+ - "\u02fa\u0001\u0000\u0000\u0000\u02fa\u02fb\u0006\u0010\u0004\u0000\u02fb"+ - "-\u0001\u0000\u0000\u0000\u02fc\u02fd\u0005@\u0000\u0000\u02fd\u02fe\u0007"+ - "\u0003\u0000\u0000\u02fe\u02ff\u0007\f\u0000\u0000\u02ff\u0300\u0007\u0011"+ - "\u0000\u0000\u0300\u0301\u0001\u0000\u0000\u0000\u0301\u0302\u0003N!\u0000"+ - "\u0302\u0303\u0001\u0000\u0000\u0000\u0303\u0304\u0006\u0011\u0000\u0000"+ - "\u0304\u0305\u0006\u0011\u0001\u0000\u0305/\u0001\u0000\u0000\u0000\u0306"+ - "\u0307\u0005@\u0000\u0000\u0307\u0308\u0007\t\u0000\u0000\u0308\u0309"+ - "\u0007\u0007\u0000\u0000\u0309\u030a\u0007\u001a\u0000\u0000\u030a\u030b"+ - "\u0007\u0003\u0000\u0000\u030b\u030c\u0007\b\u0000\u0000\u030c\u030d\u0007"+ - "\u0007\u0000\u0000\u030d\u030e\u0007\u0002\u0000\u0000\u030e\u030f\u0007"+ - "\u0003\u0000\u0000\u030f\u0310\u0007\n\u0000\u0000\u0310\u0311\u0007\u000b"+ - "\u0000\u0000\u0311\u0312\u0007\u000f\u0000\u0000\u0312\u0313\u0007\t\u0000"+ - "\u0000\u0313\u0314\u0007\u0003\u0000\u0000\u0314\u034a\u0007\n\u0000\u0000"+ - "\u0315\u0316\u0005@\u0000\u0000\u0316\u0317\u0007\u0017\u0000\u0000\u0317"+ - "\u0318\u0007\u000e\u0000\u0000\u0318\u0319\u0007\u0018\u0000\u0000\u0319"+ - "\u031a\u0007\n\u0000\u0000\u031a\u031b\u0007\u000b\u0000\u0000\u031b\u031c"+ - "\u0007\u000f\u0000\u0000\u031c\u031d\u0007\t\u0000\u0000\u031d\u031e\u0007"+ - "\u0003\u0000\u0000\u031e\u034a\u0007\n\u0000\u0000\u031f\u0320\u0005@"+ - "\u0000\u0000\u0320\u0321\u0007\t\u0000\u0000\u0321\u0322\u0007\u0007\u0000"+ - "\u0000\u0322\u0323\u0007\u001a\u0000\u0000\u0323\u0324\u0007\u0003\u0000"+ - "\u0000\u0324\u0325\u0007\b\u0000\u0000\u0325\u0326\u0007\u0007\u0000\u0000"+ - "\u0326\u0327\u0007\u0002\u0000\u0000\u0327\u0328\u0007\u0003\u0000\u0000"+ - "\u0328\u0329\u0007\n\u0000\u0000\u0329\u032a\u0007\u0005\u0000\u0000\u032a"+ - "\u032b\u0007\u0002\u0000\u0000\u032b\u032c\u0007\u0007\u0000\u0000\u032c"+ - "\u032d\u0007\r\u0000\u0000\u032d\u032e\u0007\u000b\u0000\u0000\u032e\u034a"+ - "\u0007\n\u0000\u0000\u032f\u0330\u0005@\u0000\u0000\u0330\u0331\u0007"+ - "\u0017\u0000\u0000\u0331\u0332\u0007\u000e\u0000\u0000\u0332\u0333\u0007"+ - "\u0018\u0000\u0000\u0333\u0334\u0007\n\u0000\u0000\u0334\u0335\u0007\u0005"+ - "\u0000\u0000\u0335\u0336\u0007\u0002\u0000\u0000\u0336\u0337\u0007\u0007"+ - "\u0000\u0000\u0337\u0338\u0007\r\u0000\u0000\u0338\u0339\u0007\u000b\u0000"+ - "\u0000\u0339\u034a\u0007\n\u0000\u0000\u033a\u033b\u0005@\u0000\u0000"+ - "\u033b\u033c\u0007\u0005\u0000\u0000\u033c\u033d\u0007\t\u0000\u0000\u033d"+ - "\u033e\u0007\u0007\u0000\u0000\u033e\u033f\u0007\u0005\u0000\u0000\u033f"+ - "\u0340\u0007\u0018\u0000\u0000\u0340\u0346\u0001\u0000\u0000\u0000\u0341"+ - "\u0342\u0005.\u0000\u0000\u0342\u0343\u0007\u0004\u0000\u0000\u0343\u0344"+ - "\u0007\b\u0000\u0000\u0344\u0345\u0007\u0004\u0000\u0000\u0345\u0347\u0007"+ - "\u000f\u0000\u0000\u0346\u0341\u0001\u0000\u0000\u0000\u0346\u0347\u0001"+ - "\u0000\u0000\u0000\u0347\u0348\u0001\u0000\u0000\u0000\u0348\u034a\u0005"+ - "=\u0000\u0000\u0349\u0306\u0001\u0000\u0000\u0000\u0349\u0315\u0001\u0000"+ - "\u0000\u0000\u0349\u031f\u0001\u0000\u0000\u0000\u0349\u032f\u0001\u0000"+ - "\u0000\u0000\u0349\u033a\u0001\u0000\u0000\u0000\u034a\u034b\u0001\u0000"+ - "\u0000\u0000\u034b\u034c\u0006\u0012\u0001\u0000\u034c1\u0001\u0000\u0000"+ - "\u0000\u034d\u034e\u0005@\u0000\u0000\u034e\u034f\u0007\u001a\u0000\u0000"+ - "\u034f\u0350\u0007\u0007\u0000\u0000\u0350\u0351\u0007\u000b\u0000\u0000"+ - "\u0351\u0352\u0007\u0003\u0000\u0000\u0352\u0353\u0001\u0000\u0000\u0000"+ - "\u0353\u0354\u0006\u0013\u0000\u0000\u0354\u0355\u0006\u0013\u0001\u0000"+ - "\u03553\u0001\u0000\u0000\u0000\u0356\u0357\u0005@\u0000\u0000\u0357\u0358"+ - "\u0003N!\u0000\u0358\u0359\u0004\u0014\u0002\u0000\u0359\u035a\u0001\u0000"+ - "\u0000\u0000\u035a\u035b\u0006\u0014\u0000\u0000\u035b5\u0001\u0000\u0000"+ - "\u0000\u035c\u035d\u0005@\u0000\u0000\u035d\u035e\u0003N!\u0000\u035e"+ - "7\u0001\u0000\u0000\u0000\u035f\u0361\u0005@\u0000\u0000\u0360\u0362\u0007"+ - "\u001c\u0000\u0000\u0361\u0360\u0001\u0000\u0000\u0000\u0361\u0362\u0001"+ - "\u0000\u0000\u0000\u03629\u0001\u0000\u0000\u0000\u0363\u0364\u0005{\u0000"+ - "\u0000\u0364\u0365\u0005{\u0000\u0000\u0365\u0366\u0001\u0000\u0000\u0000"+ - "\u0366\u0367\u0006\u0017\u0005\u0000\u0367\u0368\u0006\u0017\u0006\u0000"+ - "\u0368;\u0001\u0000\u0000\u0000\u0369\u036a\u0005{\u0000\u0000\u036a\u036b"+ - "\u0005!\u0000\u0000\u036b\u036c\u0005!\u0000\u0000\u036c\u036d\u0001\u0000"+ - "\u0000\u0000\u036d\u036e\u0006\u0018\u0007\u0000\u036e\u036f\u0006\u0018"+ - "\b\u0000\u036f=\u0001\u0000\u0000\u0000\u0370\u0371\u0005/\u0000\u0000"+ - "\u0371\u0372\u0005*\u0000\u0000\u0372\u0376\u0001\u0000\u0000\u0000\u0373"+ - "\u0375\t\u0000\u0000\u0000\u0374\u0373\u0001\u0000\u0000\u0000\u0375\u0378"+ - "\u0001\u0000\u0000\u0000\u0376\u0377\u0001\u0000\u0000\u0000\u0376\u0374"+ - "\u0001\u0000\u0000\u0000\u0377\u0379\u0001\u0000\u0000\u0000\u0378\u0376"+ - "\u0001\u0000\u0000\u0000\u0379\u037a\u0005*\u0000\u0000\u037a\u037e\u0005"+ - "/\u0000\u0000\u037b\u037c\u0005/\u0000\u0000\u037c\u037e\u0005/\u0000"+ - "\u0000\u037d\u0370\u0001\u0000\u0000\u0000\u037d\u037b\u0001\u0000\u0000"+ - "\u0000\u037e\u037f\u0001\u0000\u0000\u0000\u037f\u0380\u0006\u0019\t\u0000"+ - "\u0380?\u0001\u0000\u0000\u0000\u0381\u0382\u0005<\u0000\u0000\u0382\u0383"+ - "\u0007\u0016\u0000\u0000\u0383\u0384\u0005-\u0000\u0000\u0384\u0385\u0001"+ - "\u0000\u0000\u0000\u0385\u0391\u0003\u0014\u0004\u0000\u0386\u0387\u0005"+ - "<\u0000\u0000\u0387\u038c\u0003\u0014\u0004\u0000\u0388\u0389\u0005:\u0000"+ - "\u0000\u0389\u038a\u0005:\u0000\u0000\u038a\u038b\u0001\u0000\u0000\u0000"+ - "\u038b\u038d\u0003\u0014\u0004\u0000\u038c\u0388\u0001\u0000\u0000\u0000"+ - "\u038d\u038e\u0001\u0000\u0000\u0000\u038e\u038c\u0001\u0000\u0000\u0000"+ - "\u038e\u038f\u0001\u0000\u0000\u0000\u038f\u0391\u0001\u0000\u0000\u0000"+ - "\u0390\u0381\u0001\u0000\u0000\u0000\u0390\u0386\u0001\u0000\u0000\u0000"+ - "\u0391\u0392\u0001\u0000\u0000\u0000\u0392\u0393\u0006\u001a\t\u0000\u0393"+ - "\u0394\u0006\u001a\n\u0000\u0394A\u0001\u0000\u0000\u0000\u0395\u0396"+ - "\u0005<\u0000\u0000\u0396\u0397\u0005/\u0000\u0000\u0397\u0398\u0001\u0000"+ - "\u0000\u0000\u0398\u0399\u0003R#\u0000\u0399\u039d\u0005>\u0000\u0000"+ - "\u039a\u039c\u0007\u001d\u0000\u0000\u039b\u039a\u0001\u0000\u0000\u0000"+ - "\u039c\u039f\u0001\u0000\u0000\u0000\u039d\u039b\u0001\u0000\u0000\u0000"+ - "\u039d\u039e\u0001\u0000\u0000\u0000\u039e\u03a1\u0001\u0000\u0000\u0000"+ - "\u039f\u039d\u0001\u0000\u0000\u0000\u03a0\u0395\u0001\u0000\u0000\u0000"+ - "\u03a1\u03a2\u0001\u0000\u0000\u0000\u03a2\u03a0\u0001\u0000\u0000\u0000"+ - "\u03a2\u03a3\u0001\u0000\u0000\u0000\u03a3\u03a4\u0001\u0000\u0000\u0000"+ - "\u03a4\u03a5\u0006\u001b\t\u0000\u03a5C\u0001\u0000\u0000\u0000\u03a6"+ - "\u03a8\u0005 \u0000\u0000\u03a7\u03a6\u0001\u0000\u0000\u0000\u03a8\u03a9"+ - "\u0001\u0000\u0000\u0000\u03a9\u03a7\u0001\u0000\u0000\u0000\u03a9\u03aa"+ - "\u0001\u0000\u0000\u0000\u03aa\u03c0\u0001\u0000\u0000\u0000\u03ab\u03ad"+ - "\u0007\u001e\u0000\u0000\u03ac\u03ab\u0001\u0000\u0000\u0000\u03ad\u03ae"+ - "\u0001\u0000\u0000\u0000\u03ae\u03ac\u0001\u0000\u0000\u0000\u03ae\u03af"+ - "\u0001\u0000\u0000\u0000\u03af\u03c0\u0001\u0000\u0000\u0000\u03b0\u03c0"+ - "\u0003\u0014\u0004\u0000\u03b1\u03c0\u0003\u0016\u0005\u0000\u03b2\u03b3"+ - "\u0005\"\u0000\u0000\u03b3\u03c0\u0004\u001c\u0003\u0000\u03b4\u03b5\u0005"+ - "\\\u0000\u0000\u03b5\u03b6\u0005\'\u0000\u0000\u03b6\u03b7\u0001\u0000"+ - "\u0000\u0000\u03b7\u03c0\u0004\u001c\u0004\u0000\u03b8\u03c0\u0007\u001f"+ - "\u0000\u0000\u03b9\u03bb\u0007 \u0000\u0000\u03ba\u03b9\u0001\u0000\u0000"+ - "\u0000\u03bb\u03bc\u0001\u0000\u0000\u0000\u03bc\u03ba\u0001\u0000\u0000"+ - "\u0000\u03bc\u03bd\u0001\u0000\u0000\u0000\u03bd\u03c0\u0001\u0000\u0000"+ - "\u0000\u03be\u03c0\u0007!\u0000\u0000\u03bf\u03a7\u0001\u0000\u0000\u0000"+ - "\u03bf\u03ac\u0001\u0000\u0000\u0000\u03bf\u03b0\u0001\u0000\u0000\u0000"+ - "\u03bf\u03b1\u0001\u0000\u0000\u0000\u03bf\u03b2\u0001\u0000\u0000\u0000"+ - "\u03bf\u03b4\u0001\u0000\u0000\u0000\u03bf\u03b8\u0001\u0000\u0000\u0000"+ - "\u03bf\u03ba\u0001\u0000\u0000\u0000\u03bf\u03be\u0001\u0000\u0000\u0000"+ - "\u03c0\u03c3\u0001\u0000\u0000\u0000\u03c1\u03bf\u0001\u0000\u0000\u0000"+ - "\u03c1\u03c2\u0001\u0000\u0000\u0000\u03c2\u03c4\u0001\u0000\u0000\u0000"+ - "\u03c3\u03c1\u0001\u0000\u0000\u0000\u03c4\u03c5\u0005<\u0000\u0000\u03c5"+ - "\u03c6\u0004\u001c\u0005\u0000\u03c6\u03c7\u0001\u0000\u0000\u0000\u03c7"+ - "\u03c8\u0006\u001c\u000b\u0000\u03c8\u03c9\u0006\u001c\f\u0000\u03c9E"+ - "\u0001\u0000\u0000\u0000\u03ca\u03cc\u0005 \u0000\u0000\u03cb\u03ca\u0001"+ - "\u0000\u0000\u0000\u03cc\u03cd\u0001\u0000\u0000\u0000\u03cd\u03cb\u0001"+ - "\u0000\u0000\u0000\u03cd\u03ce\u0001\u0000\u0000\u0000\u03ce\u03e6\u0001"+ - "\u0000\u0000\u0000\u03cf\u03d1\u0007\u001e\u0000\u0000\u03d0\u03cf\u0001"+ - "\u0000\u0000\u0000\u03d1\u03d2\u0001\u0000\u0000\u0000\u03d2\u03d0\u0001"+ - "\u0000\u0000\u0000\u03d2\u03d3\u0001\u0000\u0000\u0000\u03d3\u03e6\u0001"+ - "\u0000\u0000\u0000\u03d4\u03d6\u0007\"\u0000\u0000\u03d5\u03d4\u0001\u0000"+ - "\u0000\u0000\u03d5\u03d6\u0001\u0000\u0000\u0000\u03d6\u03d7\u0001\u0000"+ - "\u0000\u0000\u03d7\u03e6\u0003\u0014\u0004\u0000\u03d8\u03e6\u0003\u0016"+ - "\u0005\u0000\u03d9\u03da\u0005\"\u0000\u0000\u03da\u03e6\u0004\u001d\u0006"+ - "\u0000\u03db\u03e6\u0005,\u0000\u0000\u03dc\u03dd\u0005\\\u0000\u0000"+ - "\u03dd\u03e6\u0005\'\u0000\u0000\u03de\u03e6\u0007#\u0000\u0000\u03df"+ - "\u03e1\u0007 \u0000\u0000\u03e0\u03df\u0001\u0000\u0000\u0000\u03e1\u03e2"+ - "\u0001\u0000\u0000\u0000\u03e2\u03e0\u0001\u0000\u0000\u0000\u03e2\u03e3"+ - "\u0001\u0000\u0000\u0000\u03e3\u03e6\u0001\u0000\u0000\u0000\u03e4\u03e6"+ - "\u0007!\u0000\u0000\u03e5\u03cb\u0001\u0000\u0000\u0000\u03e5\u03d0\u0001"+ - "\u0000\u0000\u0000\u03e5\u03d5\u0001\u0000\u0000\u0000\u03e5\u03d8\u0001"+ - "\u0000\u0000\u0000\u03e5\u03d9\u0001\u0000\u0000\u0000\u03e5\u03db\u0001"+ - "\u0000\u0000\u0000\u03e5\u03dc\u0001\u0000\u0000\u0000\u03e5\u03de\u0001"+ - "\u0000\u0000\u0000\u03e5\u03e0\u0001\u0000\u0000\u0000\u03e5\u03e4\u0001"+ - "\u0000\u0000\u0000\u03e6\u03e7\u0001\u0000\u0000\u0000\u03e7\u03e5\u0001"+ - "\u0000\u0000\u0000\u03e7\u03e8\u0001\u0000\u0000\u0000\u03e8\u03e9\u0001"+ - "\u0000\u0000\u0000\u03e9\u03ea\u0006\u001d\t\u0000\u03eaG\u0001\u0000"+ - "\u0000\u0000\u03eb\u03ed\u0005 \u0000\u0000\u03ec\u03eb\u0001\u0000\u0000"+ - "\u0000\u03ed\u03ee\u0001\u0000\u0000\u0000\u03ee\u03ec\u0001\u0000\u0000"+ - "\u0000\u03ee\u03ef\u0001\u0000\u0000\u0000\u03ef\u03f6\u0001\u0000\u0000"+ - "\u0000\u03f0\u03f2\u0007\u001e\u0000\u0000\u03f1\u03f0\u0001\u0000\u0000"+ - "\u0000\u03f2\u03f3\u0001\u0000\u0000\u0000\u03f3\u03f1\u0001\u0000\u0000"+ - "\u0000\u03f3\u03f4\u0001\u0000\u0000\u0000\u03f4\u03f6\u0001\u0000\u0000"+ - "\u0000\u03f5\u03ec\u0001\u0000\u0000\u0000\u03f5\u03f1\u0001\u0000\u0000"+ - "\u0000\u03f6\u03f7\u0001\u0000\u0000\u0000\u03f7\u03f8\u0006\u001e\t\u0000"+ - "\u03f8I\u0001\u0000\u0000\u0000\u03f9\u03fa\u0005{\u0000\u0000\u03fa\u03ff"+ - "\u0005!\u0000\u0000\u03fb\u03fc\u0005{\u0000\u0000\u03fc\u03fd\u0005{"+ - "\u0000\u0000\u03fd\u03ff\u0005-\u0000\u0000\u03fe\u03f9\u0001\u0000\u0000"+ - "\u0000\u03fe\u03fb\u0001\u0000\u0000\u0000\u03ff\u0400\u0001\u0000\u0000"+ - "\u0000\u0400\u0401\u0006\u001f\t\u0000\u0401K\u0001\u0000\u0000\u0000"+ - "\u0402\u0403\t\u0000\u0000\u0000\u0403\u0404\u0001\u0000\u0000\u0000\u0404"+ - "\u0405\u0006 \t\u0000\u0405M\u0001\u0000\u0000\u0000\u0406\u040a\u0007"+ - "\u0014\u0000\u0000\u0407\u0409\u0007$\u0000\u0000\u0408\u0407\u0001\u0000"+ - "\u0000\u0000\u0409\u040c\u0001\u0000\u0000\u0000\u040a\u0408\u0001\u0000"+ - "\u0000\u0000\u040a\u040b\u0001\u0000\u0000\u0000\u040bO\u0001\u0000\u0000"+ - "\u0000\u040c\u040a\u0001\u0000\u0000\u0000\u040d\u0411\u0007%\u0000\u0000"+ - "\u040e\u0410\u0007&\u0000\u0000\u040f\u040e\u0001\u0000\u0000\u0000\u0410"+ - "\u0413\u0001\u0000\u0000\u0000\u0411\u040f\u0001\u0000\u0000\u0000\u0411"+ - "\u0412\u0001\u0000\u0000\u0000\u0412Q\u0001\u0000\u0000\u0000\u0413\u0411"+ - "\u0001\u0000\u0000\u0000\u0414\u0418\u0007\u0014\u0000\u0000\u0415\u0417"+ - "\u0007\'\u0000\u0000\u0416\u0415\u0001\u0000\u0000\u0000\u0417\u041a\u0001"+ - "\u0000\u0000\u0000\u0418\u0416\u0001\u0000\u0000\u0000\u0418\u0419\u0001"+ - "\u0000\u0000\u0000\u0419S\u0001\u0000\u0000\u0000\u041a\u0418\u0001\u0000"+ - "\u0000\u0000\u041b\u041c\u0007(\u0000\u0000\u041cU\u0001\u0000\u0000\u0000"+ - "\u041d\u0422\u0005\"\u0000\u0000\u041e\u0421\u0003T$\u0000\u041f\u0421"+ - "\t\u0000\u0000\u0000\u0420\u041e\u0001\u0000\u0000\u0000\u0420\u041f\u0001"+ - "\u0000\u0000\u0000\u0421\u0424\u0001\u0000\u0000\u0000\u0422\u0423\u0001"+ - "\u0000\u0000\u0000\u0422\u0420\u0001\u0000\u0000\u0000\u0423\u0425\u0001"+ - "\u0000\u0000\u0000\u0424\u0422\u0001\u0000\u0000\u0000\u0425\u0426\u0005"+ - "\"\u0000\u0000\u0426W\u0001\u0000\u0000\u0000\u0427\u042d\u0005\'\u0000"+ - "\u0000\u0428\u042c\b)\u0000\u0000\u0429\u042a\u0005\\\u0000\u0000\u042a"+ - "\u042c\t\u0000\u0000\u0000\u042b\u0428\u0001\u0000\u0000\u0000\u042b\u0429"+ - "\u0001\u0000\u0000\u0000\u042c\u042f\u0001\u0000\u0000\u0000\u042d\u042b"+ - "\u0001\u0000\u0000\u0000\u042d\u042e\u0001\u0000\u0000\u0000\u042e\u0430"+ - "\u0001\u0000\u0000\u0000\u042f\u042d\u0001\u0000\u0000\u0000\u0430\u0431"+ - "\u0005\'\u0000\u0000\u0431Y\u0001\u0000\u0000\u0000\u0432\u0433\u0005"+ - "/\u0000\u0000\u0433\u0434\u0005/\u0000\u0000\u0434\u0438\u0001\u0000\u0000"+ - "\u0000\u0435\u0437\b\u001e\u0000\u0000\u0436\u0435\u0001\u0000\u0000\u0000"+ - "\u0437\u043a\u0001\u0000\u0000\u0000\u0438\u0436\u0001\u0000\u0000\u0000"+ - "\u0438\u0439\u0001\u0000\u0000\u0000\u0439[\u0001\u0000\u0000\u0000\u043a"+ - "\u0438\u0001\u0000\u0000\u0000\u043b\u043c\u0005$\u0000\u0000\u043c\u043d"+ - "\u0003N!\u0000\u043d]\u0001\u0000\u0000\u0000\u043e\u043f\u0007\u0004"+ - "\u0000\u0000\u043f\u0440\u0007\u0002\u0000\u0000\u0440\u0441\u0007\u0002"+ - "\u0000\u0000\u0441\u0442\u0007\u0004\u0000\u0000\u0442\u0451\u0007\u000f"+ - "\u0000\u0000\u0443\u0444\u0007\u0005\u0000\u0000\u0444\u0445\u0007\t\u0000"+ - "\u0000\u0445\u0446\u0007\u0004\u0000\u0000\u0446\u0447\u0007\n\u0000\u0000"+ - "\u0447\u0451\u0007\n\u0000\u0000\u0448\u0449\u0007\u0003\u0000\u0000\u0449"+ - "\u044a\u0007\u0012\u0000\u0000\u044a\u044b\u0007\r\u0000\u0000\u044b\u044c"+ - "\u0007\u000b\u0000\u0000\u044c\u0451\u0007\u000f\u0000\u0000\u044d\u044e"+ - "\u0007\u000e\u0000\u0000\u044e\u044f\u0007\n\u0000\u0000\u044f\u0451\u0007"+ - "\u0003\u0000\u0000\u0450\u043e\u0001\u0000\u0000\u0000\u0450\u0443\u0001"+ - "\u0000\u0000\u0000\u0450\u0448\u0001\u0000\u0000\u0000\u0450\u044d\u0001"+ - "\u0000\u0000\u0000\u0451_\u0001\u0000\u0000\u0000\u0452\u0453\u000209"+ - "\u0000\u0453a\u0001\u0000\u0000\u0000\u0454\u0455\u0005{\u0000\u0000\u0455"+ - "\u0456\u0005{\u0000\u0000\u0456\u0457\u0005-\u0000\u0000\u0457\u0458\u0005"+ - "-\u0000\u0000\u0458\u0459\u0001\u0000\u0000\u0000\u0459\u045a\u0006+\r"+ - "\u0000\u045ac\u0001\u0000\u0000\u0000\u045b\u045c\u0005@\u0000\u0000\u045c"+ - "\u045d\u0003R#\u0000\u045d\u045e\u0005.\u0000\u0000\u045e\u045f\u0001"+ - "\u0000\u0000\u0000\u045f\u0460\u0006,\t\u0000\u0460e\u0001\u0000\u0000"+ - "\u0000\u0461\u0466\u0005@\u0000\u0000\u0462\u0464\u0003`*\u0000\u0463"+ - "\u0465\u0005.\u0000\u0000\u0464\u0463\u0001\u0000\u0000\u0000\u0464\u0465"+ - "\u0001\u0000\u0000\u0000\u0465\u0467\u0001\u0000\u0000\u0000\u0466\u0462"+ - "\u0001\u0000\u0000\u0000\u0467\u0468\u0001\u0000\u0000\u0000\u0468\u0466"+ - "\u0001\u0000\u0000\u0000\u0468\u0469\u0001\u0000\u0000\u0000\u0469\u046a"+ - "\u0001\u0000\u0000\u0000\u046a\u046b\u0006-\t\u0000\u046bg\u0001\u0000"+ - "\u0000\u0000\u046c\u046d\u0005{\u0000\u0000\u046d\u046e\u0005{\u0000\u0000"+ - "\u046e\u0558\u0005{\u0000\u0000\u046f\u0470\u0005@\u0000\u0000\u0470\u0471"+ - "\u0005@\u0000\u0000\u0471\u0473\u0001\u0000\u0000\u0000\u0472\u0474\u0005"+ - "@\u0000\u0000\u0473\u0472\u0001\u0000\u0000\u0000\u0473\u0474\u0001\u0000"+ - "\u0000\u0000\u0474\u0558\u0001\u0000\u0000\u0000\u0475\u0476\u0005@\u0000"+ - "\u0000\u0476\u0477\u0005{\u0000\u0000\u0477\u0479\u0001\u0000\u0000\u0000"+ - "\u0478\u047a\u0005{\u0000\u0000\u0479\u0478\u0001\u0000\u0000\u0000\u0479"+ - "\u047a\u0001\u0000\u0000\u0000\u047a\u0558\u0001\u0000\u0000\u0000\u047b"+ - "\u047c\u0005@\u0000\u0000\u047c\u047d\u0007\u0012\u0000\u0000\u047d\u047e"+ - "\u0007\u0003\u0000\u0000\u047e\u047f\u0007\u0011\u0000\u0000\u047f\u0480"+ - "\u0007\u0007\u0000\u0000\u0480\u0481\u0007\u0004\u0000\u0000\u0481\u0485"+ - "\u0001\u0000\u0000\u0000\u0482\u0484\u0007*\u0000\u0000\u0483\u0482\u0001"+ - "\u0000\u0000\u0000\u0484\u0487\u0001\u0000\u0000\u0000\u0485\u0483\u0001"+ - "\u0000\u0000\u0000\u0485\u0486\u0001\u0000\u0000\u0000\u0486\u0489\u0001"+ - "\u0000\u0000\u0000\u0487\u0485\u0001\u0000\u0000\u0000\u0488\u048a\u0005"+ - "(\u0000\u0000\u0489\u0488\u0001\u0000\u0000\u0000\u0489\u048a\u0001\u0000"+ - "\u0000\u0000\u048a\u0558\u0001\u0000\u0000\u0000\u048b\u048c\u0005@\u0000"+ - "\u0000\u048c\u048d\u0007\u0005\u0000\u0000\u048d\u048e\u0007\u0006\u0000"+ - "\u0000\u048e\u048f\u0007\u0004\u0000\u0000\u048f\u0490\u0007\u0002\u0000"+ - "\u0000\u0490\u0491\u0007\n\u0000\u0000\u0491\u0492\u0007\u0003\u0000\u0000"+ - "\u0492\u0550\u0007\u000b\u0000\u0000\u0493\u0494\u0005@\u0000\u0000\u0494"+ - "\u0495\u0007\u0007\u0000\u0000\u0495\u0496\u0007\u0012\u0000\u0000\u0496"+ - "\u0497\u0007\r\u0000\u0000\u0497\u0498\u0007\u0001\u0000\u0000\u0498\u0499"+ - "\u0007\u0002\u0000\u0000\u0499\u0550\u0007\u000b\u0000\u0000\u049a\u049b"+ - "\u0005@\u0000\u0000\u049b\u049c\u0007\f\u0000\u0000\u049c\u049d\u0007"+ - "\u0004\u0000\u0000\u049d\u049e\u0007\u0012\u0000\u0000\u049e\u049f\u0007"+ - "\u0003\u0000\u0000\u049f\u04a0\u0007\n\u0000\u0000\u04a0\u04a1\u0007\r"+ - "\u0000\u0000\u04a1\u04a2\u0007\u0004\u0000\u0000\u04a2\u04a3\u0007\u0005"+ - "\u0000\u0000\u04a3\u0550\u0007\u0003\u0000\u0000\u04a4\u04a5\u0005@\u0000"+ - "\u0000\u04a5\u04a6\u0007\u0011\u0000\u0000\u04a6\u04a7\u0007\u0001\u0000"+ - "\u0000\u04a7\u04a8\u0007\u0005\u0000\u0000\u04a8\u04a9\u0007\u000e\u0000"+ - "\u0000\u04a9\u04aa\u0007\u0012\u0000\u0000\u04aa\u04ab\u0007\u0003\u0000"+ - "\u0000\u04ab\u04ac\u0007\f\u0000\u0000\u04ac\u0550\u0007\u000b\u0000\u0000"+ - "\u04ad\u04ae\u0005@\u0000\u0000\u04ae\u04af\u0007\u0000\u0000\u0000\u04af"+ - "\u04b0\u0007\u0001\u0000\u0000\u04b0\u04b1\u0007\f\u0000\u0000\u04b1\u04b2"+ - "\u0007\u000b\u0000\u0000\u04b2\u04b3\u0005-\u0000\u0000\u04b3\u04b4\u0007"+ - "\u0000\u0000\u0000\u04b4\u04b5\u0007\u0004\u0000\u0000\u04b5\u04b6\u0007"+ - "\u0005\u0000\u0000\u04b6\u0550\u0007\u0003\u0000\u0000\u04b7\u04b8\u0005"+ - "@\u0000\u0000\u04b8\u04b9\u0007\r\u0000\u0000\u04b9\u04ba\u0007\u0004"+ - "\u0000\u0000\u04ba\u04bb\u0007\u0010\u0000\u0000\u04bb\u0550\u0007\u0003"+ - "\u0000\u0000\u04bc\u04bd\u0005@\u0000\u0000\u04bd\u04be\u0007\t\u0000"+ - "\u0000\u04be\u04bf\u0007\u0004\u0000\u0000\u04bf\u04c0\u0007\u000f\u0000"+ - "\u0000\u04c0\u04c1\u0007\u0003\u0000\u0000\u04c1\u0550\u0007\u0002\u0000"+ - "\u0000\u04c2\u04c3\u0005@\u0000\u0000\u04c3\u04c4\u0007\n\u0000\u0000"+ - "\u04c4\u04c5\u0007\u000e\u0000\u0000\u04c5\u04c6\u0007\r\u0000\u0000\u04c6"+ - "\u04c7\u0007\r\u0000\u0000\u04c7\u04c8\u0007\u0001\u0000\u0000\u04c8\u04c9"+ - "\u0007\u0002\u0000\u0000\u04c9\u04ca\u0007\u000b\u0000\u0000\u04ca\u0550"+ - "\u0007\n\u0000\u0000\u04cb\u04cc\u0005@\u0000\u0000\u04cc\u04cd\u0007"+ - "\u000b\u0000\u0000\u04cd\u04ce\u0007\u0004\u0000\u0000\u04ce\u04cf\u0007"+ - "\u0007\u0000\u0000\u04cf\u04d0\u0007\t\u0000\u0000\u04d0\u04d1\u0007\b"+ - "\u0000\u0000\u04d1\u04d2\u0007\u0007\u0000\u0000\u04d2\u04d3\u0007\f\u0000"+ - "\u0000\u04d3\u0550\u0007\u0011\u0000\u0000\u04d4\u04d5\u0005@\u0000\u0000"+ - "\u04d5\u04d6\u0007\u0004\u0000\u0000\u04d6\u04d7\u0007\r\u0000\u0000\u04d7"+ - "\u04d8\u0007\r\u0000\u0000\u04d8\u04d9\u0007\t\u0000\u0000\u04d9\u0550"+ - "\u0007\u000f\u0000\u0000\u04da\u04db\u0005@\u0000\u0000\u04db\u04dc\u0005"+ - "-\u0000\u0000\u04dc\u04dd\u0007\b\u0000\u0000\u04dd\u04de\u0007\u0003"+ - "\u0000\u0000\u04de\u04df\u0007\u0017\u0000\u0000\u04df\u04e0\u0007\u0018"+ - "\u0000\u0000\u04e0\u04e1\u0007\u0007\u0000\u0000\u04e1\u04e2\u0007\u000b"+ - "\u0000\u0000\u04e2\u04e3\u0005-\u0000\u0000\u04e3\u04e4\u0007\u0018\u0000"+ - "\u0000\u04e4\u04e5\u0007\u0003\u0000\u0000\u04e5\u04e6\u0007\u000f\u0000"+ - "\u0000\u04e6\u04e7\u0007\u0000\u0000\u0000\u04e7\u04e8\u0007\u0002\u0000"+ - "\u0000\u04e8\u04e9\u0007\u0004\u0000\u0000\u04e9\u04ea\u0007\u0012\u0000"+ - "\u0000\u04ea\u04eb\u0007\u0003\u0000\u0000\u04eb\u0550\u0007\n\u0000\u0000"+ - "\u04ec\u04ed\u0005@\u0000\u0000\u04ed\u04ee\u0007\u0018\u0000\u0000\u04ee"+ - "\u04ef\u0007\u0003\u0000\u0000\u04ef\u04f0\u0007\u000f\u0000\u0000\u04f0"+ - "\u04f1\u0007\u0000\u0000\u0000\u04f1\u04f2\u0007\u0002\u0000\u0000\u04f2"+ - "\u04f3\u0007\u0004\u0000\u0000\u04f3\u04f4\u0007\u0012\u0000\u0000\u04f4"+ - "\u04f5\u0007\u0003\u0000\u0000\u04f5\u0550\u0007\n\u0000\u0000\u04f6\u04f7"+ - "\u0005@\u0000\u0000\u04f7\u04f8\u0007\u0005\u0000\u0000\u04f8\u04f9\u0007"+ - "\u0001\u0000\u0000\u04f9\u04fa\u0007\u000e\u0000\u0000\u04fa\u04fb\u0007"+ - "\f\u0000\u0000\u04fb\u04fc\u0007\u000b\u0000\u0000\u04fc\u04fd\u0007\u0003"+ - "\u0000\u0000\u04fd\u04fe\u0007\u0002\u0000\u0000\u04fe\u04ff\u0005-\u0000"+ - "\u0000\u04ff\u0500\u0007\n\u0000\u0000\u0500\u0501\u0007\u000b\u0000\u0000"+ - "\u0501\u0502\u0007\u000f\u0000\u0000\u0502\u0503\u0007\t\u0000\u0000\u0503"+ - "\u0550\u0007\u0003\u0000\u0000\u0504\u0505\u0005@\u0000\u0000\u0505\u0506"+ - "\u0007\u0000\u0000\u0000\u0506\u0507\u0007\u0001\u0000\u0000\u0507\u0508"+ - "\u0007\f\u0000\u0000\u0508\u0509\u0007\u000b\u0000\u0000\u0509\u050a\u0005"+ - "-\u0000\u0000\u050a\u050b\u0007\u0000\u0000\u0000\u050b\u050c\u0007\u0003"+ - "\u0000\u0000\u050c\u050d\u0007\u0004\u0000\u0000\u050d\u050e\u0007\u000b"+ - "\u0000\u0000\u050e\u050f\u0007\u000e\u0000\u0000\u050f\u0510\u0007\u0002"+ - "\u0000\u0000\u0510\u0511\u0007\u0003\u0000\u0000\u0511\u0512\u0005-\u0000"+ - "\u0000\u0512\u0513\u0007\u001a\u0000\u0000\u0513\u0514\u0007\u0004\u0000"+ - "\u0000\u0514\u0515\u0007\t\u0000\u0000\u0515\u0516\u0007\u000e\u0000\u0000"+ - "\u0516\u0517\u0007\u0003\u0000\u0000\u0517\u0550\u0007\n\u0000\u0000\u0518"+ - "\u0519\u0005@\u0000\u0000\u0519\u051a\u0007\r\u0000\u0000\u051a\u051b"+ - "\u0007\u0002\u0000\u0000\u051b\u051c\u0007\u0001\u0000\u0000\u051c\u051d"+ - "\u0007\r\u0000\u0000\u051d\u051e\u0007\u0003\u0000\u0000\u051e\u051f\u0007"+ - "\u0002\u0000\u0000\u051f\u0520\u0007\u000b\u0000\u0000\u0520\u0550\u0007"+ - "\u000f\u0000\u0000\u0521\u0522\u0005@\u0000\u0000\u0522\u0523\u0007\n"+ - "\u0000\u0000\u0523\u0524\u0007\u0005\u0000\u0000\u0524\u0525\u0007\u0001"+ - "\u0000\u0000\u0525\u0526\u0007\r\u0000\u0000\u0526\u0550\u0007\u0003\u0000"+ - "\u0000\u0527\u0528\u0005@\u0000\u0000\u0528\u0529\u0007\n\u0000\u0000"+ - "\u0529\u052a\u0007\u000b\u0000\u0000\u052a\u052b\u0007\u0004\u0000\u0000"+ - "\u052b\u052c\u0007\u0002\u0000\u0000\u052c\u052d\u0007\u000b\u0000\u0000"+ - "\u052d\u052e\u0007\u0007\u0000\u0000\u052e\u052f\u0007\f\u0000\u0000\u052f"+ - "\u0530\u0007\u0010\u0000\u0000\u0530\u0531\u0005-\u0000\u0000\u0531\u0532"+ - "\u0007\n\u0000\u0000\u0532\u0533\u0007\u000b\u0000\u0000\u0533\u0534\u0007"+ - "\u000f\u0000\u0000\u0534\u0535\u0007\t\u0000\u0000\u0535\u0550\u0007\u0003"+ - "\u0000\u0000\u0536\u0537\u0005@\u0000\u0000\u0537\u0538\u0007\n\u0000"+ - "\u0000\u0538\u0539\u0007\u000e\u0000\u0000\u0539\u053a\u0007\r\u0000\u0000"+ - "\u053a\u053b\u0007\r\u0000\u0000\u053b\u053c\u0007\u0001\u0000\u0000\u053c"+ - "\u053d\u0007\u0002\u0000\u0000\u053d\u053e\u0007\u000b\u0000\u0000\u053e"+ - "\u0550\u0007\n\u0000\u0000\u053f\u0540\u0005@\u0000\u0000\u0540\u0541"+ - "\u0007\u001a\u0000\u0000\u0541\u0542\u0007\u0007\u0000\u0000\u0542\u0543"+ - "\u0007\u0003\u0000\u0000\u0543\u0544\u0007\b\u0000\u0000\u0544\u0545\u0005"+ - "-\u0000\u0000\u0545\u0546\u0007\u000b\u0000\u0000\u0546\u0547\u0007\u0002"+ - "\u0000\u0000\u0547\u0548\u0007\u0004\u0000\u0000\u0548\u0549\u0007\f\u0000"+ - "\u0000\u0549\u054a\u0007\n\u0000\u0000\u054a\u054b\u0007\u0007\u0000\u0000"+ - "\u054b\u054c\u0007\u000b\u0000\u0000\u054c\u054d\u0007\u0007\u0000\u0000"+ - "\u054d\u054e\u0007\u0001\u0000\u0000\u054e\u0550\u0007\f\u0000\u0000\u054f"+ - "\u048b\u0001\u0000\u0000\u0000\u054f\u0493\u0001\u0000\u0000\u0000\u054f"+ - "\u049a\u0001\u0000\u0000\u0000\u054f\u04a4\u0001\u0000\u0000\u0000\u054f"+ - "\u04ad\u0001\u0000\u0000\u0000\u054f\u04b7\u0001\u0000\u0000\u0000\u054f"+ - "\u04bc\u0001\u0000\u0000\u0000\u054f\u04c2\u0001\u0000\u0000\u0000\u054f"+ - "\u04cb\u0001\u0000\u0000\u0000\u054f\u04d4\u0001\u0000\u0000\u0000\u054f"+ - "\u04da\u0001\u0000\u0000\u0000\u054f\u04ec\u0001\u0000\u0000\u0000\u054f"+ - "\u04f6\u0001\u0000\u0000\u0000\u054f\u0504\u0001\u0000\u0000\u0000\u054f"+ - "\u0518\u0001\u0000\u0000\u0000\u054f\u0521\u0001\u0000\u0000\u0000\u054f"+ - "\u0527\u0001\u0000\u0000\u0000\u054f\u0536\u0001\u0000\u0000\u0000\u054f"+ - "\u053f\u0001\u0000\u0000\u0000\u0550\u0554\u0001\u0000\u0000\u0000\u0551"+ - "\u0553\u0007*\u0000\u0000\u0552\u0551\u0001\u0000\u0000\u0000\u0553\u0556"+ - "\u0001\u0000\u0000\u0000\u0554\u0552\u0001\u0000\u0000\u0000\u0554\u0555"+ - "\u0001\u0000\u0000\u0000\u0555\u0558\u0001\u0000\u0000\u0000\u0556\u0554"+ - "\u0001\u0000\u0000\u0000\u0557\u046c\u0001\u0000\u0000\u0000\u0557\u046f"+ - "\u0001\u0000\u0000\u0000\u0557\u0475\u0001\u0000\u0000\u0000\u0557\u047b"+ - "\u0001\u0000\u0000\u0000\u0557\u054f\u0001\u0000\u0000\u0000\u0558\u0559"+ - "\u0001\u0000\u0000\u0000\u0559\u055a\u0006.\t\u0000\u055ai\u0001\u0000"+ - "\u0000\u0000\u055b\u055c\t\u0000\u0000\u0000\u055c\u055d\u0004/\u0007"+ - "\u0000\u055d\u055e\u0001\u0000\u0000\u0000\u055e\u055f\u0006/\u000e\u0000"+ - "\u055f\u0560\u0006/\u000f\u0000\u0560k\u0001\u0000\u0000\u0000\u0561\u0562"+ - "\t\u0000\u0000\u0000\u0562\u0563\u0001\u0000\u0000\u0000\u0563\u0564\u0006"+ - "0\f\u0000\u0564m\u0001\u0000\u0000\u0000\u0565\u0566\u0005\u0000\u0000"+ - "\u0001\u0566\u0567\u0001\u0000\u0000\u0000\u0567\u0568\u00061\u000e\u0000"+ - "\u0568\u0569\u00061\u000f\u0000\u0569o\u0001\u0000\u0000\u0000\u056a\u056b"+ - "\u0005}\u0000\u0000\u056b\u056c\u0005}\u0000\u0000\u056c\u056d\u0001\u0000"+ - "\u0000\u0000\u056d\u056e\u00062\u000f\u0000\u056e\u056f\u00062\u0006\u0000"+ - "\u056fq\u0001\u0000\u0000\u0000\u0570\u0571\u0003\f\u0000\u0000\u0571"+ - "\u0572\u00063\u0010\u0000\u0572s\u0001\u0000\u0000\u0000\u0573\u0576\u0003"+ - "X&\u0000\u0574\u0576\u0003\u0012\u0003\u0000\u0575\u0573\u0001\u0000\u0000"+ - "\u0000\u0575\u0574\u0001\u0000\u0000\u0000\u0576\u0577\u0001\u0000\u0000"+ - "\u0000\u0577\u0578\u00064\u0011\u0000\u0578u\u0001\u0000\u0000\u0000\u0579"+ - "\u057a\u0005:\u0000\u0000\u057a\u057d\u0005)\u0000\u0000\u057b\u057d\u0005"+ - ":\u0000\u0000\u057c\u0579\u0001\u0000\u0000\u0000\u057c\u057b\u0001\u0000"+ - "\u0000\u0000\u057d\u057e\u0001\u0000\u0000\u0000\u057e\u057f\u00065\u0012"+ - "\u0000\u057fw\u0001\u0000\u0000\u0000\u0580\u0582\b+\u0000\u0000\u0581"+ - "\u0580\u0001\u0000\u0000\u0000\u0582\u0583\u0001\u0000\u0000\u0000\u0583"+ - "\u0581\u0001\u0000\u0000\u0000\u0583\u0584\u0001\u0000\u0000\u0000\u0584"+ - "\u0585\u0001\u0000\u0000\u0000\u0585\u0586\u00066\u0013\u0000\u0586y\u0001"+ - "\u0000\u0000\u0000\u0587\u058b\t\u0000\u0000\u0000\u0588\u058a\u0007*"+ - "\u0000\u0000\u0589\u0588\u0001\u0000\u0000\u0000\u058a\u058d\u0001\u0000"+ - "\u0000\u0000\u058b\u0589\u0001\u0000\u0000\u0000\u058b\u058c\u0001\u0000"+ - "\u0000\u0000\u058c\u058e\u0001\u0000\u0000\u0000\u058d\u058b\u0001\u0000"+ - "\u0000\u0000\u058e\u058f\u00067\u0014\u0000\u058f{\u0001\u0000\u0000\u0000"+ - "\u0590\u0591\u0005\u0000\u0000\u0001\u0591\u0592\u0001\u0000\u0000\u0000"+ - "\u0592\u0593\u00068\u0015\u0000\u0593\u0594\u00068\u000f\u0000\u0594}"+ - "\u0001\u0000\u0000\u0000\u0595\u0596\u0005!\u0000\u0000\u0596\u0597\u0005"+ - "!\u0000\u0000\u0597\u0598\u0005}\u0000\u0000\u0598\u0599\u0001\u0000\u0000"+ - "\u0000\u0599\u059a\u00069\u000f\u0000\u059a\u059b\u00069\b\u0000\u059b"+ - "\u007f\u0001\u0000\u0000\u0000\u059c\u059d\u0003\f\u0000\u0000\u059d\u059e"+ - "\u0006:\u0016\u0000\u059e\u0081\u0001\u0000\u0000\u0000\u059f\u05a2\u0003"+ - "X&\u0000\u05a0\u05a2\u0003\u0012\u0003\u0000\u05a1\u059f\u0001\u0000\u0000"+ - "\u0000\u05a1\u05a0\u0001\u0000\u0000\u0000\u05a2\u05a3\u0001\u0000\u0000"+ - "\u0000\u05a3\u05a4\u0006;\u0017\u0000\u05a4\u0083\u0001\u0000\u0000\u0000"+ - "\u05a5\u05a6\u0005:\u0000\u0000\u05a6\u05a9\u0005)\u0000\u0000\u05a7\u05a9"+ - "\u0005:\u0000\u0000\u05a8\u05a5\u0001\u0000\u0000\u0000\u05a8\u05a7\u0001"+ - "\u0000\u0000\u0000\u05a9\u05aa\u0001\u0000\u0000\u0000\u05aa\u05ab\u0006"+ - "<\u0012\u0000\u05ab\u0085\u0001\u0000\u0000\u0000\u05ac\u05ae\b,\u0000"+ - "\u0000\u05ad\u05ac\u0001\u0000\u0000\u0000\u05ae\u05af\u0001\u0000\u0000"+ - "\u0000\u05af\u05ad\u0001\u0000\u0000\u0000\u05af\u05b0\u0001\u0000\u0000"+ - "\u0000\u05b0\u05b1\u0001\u0000\u0000\u0000\u05b1\u05b2\u0006=\u0018\u0000"+ - "\u05b2\u0087\u0001\u0000\u0000\u0000\u05b3\u05b7\t\u0000\u0000\u0000\u05b4"+ - "\u05b6\u0007*\u0000\u0000\u05b5\u05b4\u0001\u0000\u0000\u0000\u05b6\u05b9"+ - "\u0001\u0000\u0000\u0000\u05b7\u05b5\u0001\u0000\u0000\u0000\u05b7\u05b8"+ - "\u0001\u0000\u0000\u0000\u05b8\u05ba\u0001\u0000\u0000\u0000\u05b9\u05b7"+ - "\u0001\u0000\u0000\u0000\u05ba\u05bb\u0006>\u0019\u0000\u05bb\u0089\u0001"+ - "\u0000\u0000\u0000\u05bc\u05bd\u0005\u0000\u0000\u0001\u05bd\u05be\u0001"+ - "\u0000\u0000\u0000\u05be\u05bf\u0006?\u0015\u0000\u05bf\u05c0\u0006?\u000f"+ - "\u0000\u05c0\u008b\u0001\u0000\u0000\u0000\u05c1\u05c3\u0007*\u0000\u0000"+ - "\u05c2\u05c1\u0001\u0000\u0000\u0000\u05c3\u05c4\u0001\u0000\u0000\u0000"+ - "\u05c4\u05c2\u0001\u0000\u0000\u0000\u05c4\u05c5\u0001\u0000\u0000\u0000"+ - "\u05c5\u05c6\u0001\u0000\u0000\u0000\u05c6\u05c7\u0004@\b\u0000\u05c7"+ - "\u05c8\u0001\u0000\u0000\u0000\u05c8\u05c9\u0006@\u001a\u0000\u05c9\u008d"+ - "\u0001\u0000\u0000\u0000\u05ca\u05cb\u0005(\u0000\u0000\u05cb\u05cc\u0006"+ - "A\u001b\u0000\u05cc\u05cd\u0001\u0000\u0000\u0000\u05cd\u05ce\u0006A\f"+ - "\u0000\u05ce\u05cf\u0006A\u001a\u0000\u05cf\u008f\u0001\u0000\u0000\u0000"+ - "\u05d0\u05d1\u0003N!\u0000\u05d1\u05d2\u0001\u0000\u0000\u0000\u05d2\u05d3"+ - "\u0006B\u0015\u0000\u05d3\u05d4\u0006B\u000f\u0000\u05d4\u0091\u0001\u0000"+ - "\u0000\u0000\u05d5\u05d6\t\u0000\u0000\u0000\u05d6\u05d7\u0001\u0000\u0000"+ - "\u0000\u05d7\u05d8\u0006C\u0015\u0000\u05d8\u05d9\u0006C\u000f\u0000\u05d9"+ - "\u0093\u0001\u0000\u0000\u0000\u05da\u05db\u0004D\t\u0000\u05db\u05dc"+ - "\u0005(\u0000\u0000\u05dc\u05dd\u0006D\u001c\u0000\u05dd\u05de\u0006D"+ - "\u001d\u0000\u05de\u0095\u0001\u0000\u0000\u0000\u05df\u05e0\u0004E\n"+ - "\u0000\u05e0\u05e1\u0005)\u0000\u0000\u05e1\u05e2\u0006E\u001e\u0000\u05e2"+ - "\u05e3\u0001\u0000\u0000\u0000\u05e3\u05e4\u0006E\u001f\u0000\u05e4\u05e5"+ - "\u0006E \u0000\u05e5\u0097\u0001\u0000\u0000\u0000\u05e6\u05e7\u0004F"+ - "\u000b\u0000\u05e7\u05e8\u0005(\u0000\u0000\u05e8\u05e9\u0006F!\u0000"+ - "\u05e9\u05ea\u0006F\"\u0000\u05ea\u0099\u0001\u0000\u0000\u0000\u05eb"+ - "\u05ec\u0004G\f\u0000\u05ec\u05ed\u0005)\u0000\u0000\u05ed\u05ee\u0006"+ - "G#\u0000\u05ee\u05ef\u0006G$\u0000\u05ef\u009b\u0001\u0000\u0000\u0000"+ - "\u05f0\u05f1\u0005)\u0000\u0000\u05f1\u05f2\u0004H\r\u0000\u05f2\u05f3"+ - "\u0001\u0000\u0000\u0000\u05f3\u05f4\u0006H\u001f\u0000\u05f4\u05f5\u0006"+ - "H \u0000\u05f5\u009d\u0001\u0000\u0000\u0000\u05f6\u05f7\u0005\"\u0000"+ - "\u0000\u05f7\u05f8\u0001\u0000\u0000\u0000\u05f8\u05f9\u0006I\f\u0000"+ - "\u05f9\u05fa\u0006I%\u0000\u05fa\u009f\u0001\u0000\u0000\u0000\u05fb\u05fc"+ - "\u0005?\u0000\u0000\u05fc\u05fd\u0005:\u0000\u0000\u05fd\u05fe\u0001\u0000"+ - "\u0000\u0000\u05fe\u05ff\u0006J&\u0000\u05ff\u00a1\u0001\u0000\u0000\u0000"+ - "\u0600\u0601\u0005:\u0000\u0000\u0601\u0602\u0005:\u0000\u0000\u0602\u0603"+ - "\u0001\u0000\u0000\u0000\u0603\u0604\u0006K\'\u0000\u0604\u00a3\u0001"+ - "\u0000\u0000\u0000\u0605\u0609\u0003X&\u0000\u0606\u0608\u0005 \u0000"+ - "\u0000\u0607\u0606\u0001\u0000\u0000\u0000\u0608\u060b\u0001\u0000\u0000"+ - "\u0000\u0609\u0607\u0001\u0000\u0000\u0000\u0609\u060a\u0001\u0000\u0000"+ - "\u0000\u060a\u060c\u0001\u0000\u0000\u0000\u060b\u0609\u0001\u0000\u0000"+ - "\u0000\u060c\u060d\u0006L(\u0000\u060d\u00a5\u0001\u0000\u0000\u0000\u060e"+ - "\u060f\u0005:\u0000\u0000\u060f\u0610\u0004M\u000e\u0000\u0610\u0611\u0001"+ - "\u0000\u0000\u0000\u0611\u0612\u0006M\u0012\u0000\u0612\u00a7\u0001\u0000"+ - "\u0000\u0000\u0613\u0614\u0005:\u0000\u0000\u0614\u0615\u0001\u0000\u0000"+ - "\u0000\u0615\u0616\u0006N\u0012\u0000\u0616\u00a9\u0001\u0000\u0000\u0000"+ - "\u0617\u0618\u0005/\u0000\u0000\u0618\u0619\u0005*\u0000\u0000\u0619\u061d"+ - "\u0001\u0000\u0000\u0000\u061a\u061c\t\u0000\u0000\u0000\u061b\u061a\u0001"+ - "\u0000\u0000\u0000\u061c\u061f\u0001\u0000\u0000\u0000\u061d\u061e\u0001"+ - "\u0000\u0000\u0000\u061d\u061b\u0001\u0000\u0000\u0000\u061e\u0620\u0001"+ - "\u0000\u0000\u0000\u061f\u061d\u0001\u0000\u0000\u0000\u0620\u0621\u0005"+ - "*\u0000\u0000\u0621\u0622\u0005/\u0000\u0000\u0622\u0623\u0001\u0000\u0000"+ - "\u0000\u0623\u0624\u0006O\u0012\u0000\u0624\u00ab\u0001\u0000\u0000\u0000"+ - "\u0625\u0626\t\u0000\u0000\u0000\u0626\u0627\u0006P)\u0000\u0627\u00ad"+ - "\u0001\u0000\u0000\u0000\u0628\u0629\u0005\u0000\u0000\u0001\u0629\u062a"+ - "\u0001\u0000\u0000\u0000\u062a\u062b\u0006Q\u0015\u0000\u062b\u062c\u0006"+ - "Q \u0000\u062c\u00af\u0001\u0000\u0000\u0000\u062d\u062e\u0005@\u0000"+ - "\u0000\u062e\u062f\u0007\u0003\u0000\u0000\u062f\u0630\u0007\f\u0000\u0000"+ - "\u0630\u0631\u0007\u0011\u0000\u0000\u0631\u0632\u0007\r\u0000\u0000\u0632"+ - "\u0633\u0007\u0006\u0000\u0000\u0633\u0634\u0007\r\u0000\u0000\u0634\u0635"+ - "\u0001\u0000\u0000\u0000\u0635\u0636\u0006R\u000f\u0000\u0636\u00b1\u0001"+ - "\u0000\u0000\u0000\u0637\u0638\t\u0000\u0000\u0000\u0638\u0639\u0004S"+ - "\u000f\u0000\u0639\u063a\u0001\u0000\u0000\u0000\u063a\u063b\u0006S*\u0000"+ - "\u063b\u00b3\u0001\u0000\u0000\u0000\u063c\u063d\t\u0000\u0000\u0000\u063d"+ - "\u063e\u0001\u0000\u0000\u0000\u063e\u063f\u0006T\f\u0000\u063f\u00b5"+ - "\u0001\u0000\u0000\u0000\u0640\u0641\u0005\u0000\u0000\u0001\u0641\u0642"+ - "\u0001\u0000\u0000\u0000\u0642\u0643\u0006U\u0015\u0000\u0643\u0644\u0006"+ - "U\u000f\u0000\u0644\u00b7\u0001\u0000\u0000\u0000\u0645\u0646\u0005@\u0000"+ - "\u0000\u0646\u0647\u0007\u0003\u0000\u0000\u0647\u0648\u0007\f\u0000\u0000"+ - "\u0648\u0649\u0007\u0011\u0000\u0000\u0649\u064a\u0007\u001a\u0000\u0000"+ - "\u064a\u064b\u0007\u0003\u0000\u0000\u064b\u064c\u0007\u0002\u0000\u0000"+ - "\u064c\u064d\u0007\u0017\u0000\u0000\u064d\u064e\u0007\u0004\u0000\u0000"+ - "\u064e\u064f\u0007\u000b\u0000\u0000\u064f\u0650\u0007\u0007\u0000\u0000"+ - "\u0650\u0651\u0007\u0012\u0000\u0000\u0651\u0652\u0001\u0000\u0000\u0000"+ - "\u0652\u0653\u0006V\u0001\u0000\u0653\u0654\u0006V\u000f\u0000\u0654\u00b9"+ - "\u0001\u0000\u0000\u0000\u0655\u0656\t\u0000\u0000\u0000\u0656\u0657\u0004"+ - "W\u0010\u0000\u0657\u0658\u0001\u0000\u0000\u0000\u0658\u0659\u0006W\t"+ - "\u0000\u0659\u00bb\u0001\u0000\u0000\u0000\u065a\u065b\t\u0000\u0000\u0000"+ - "\u065b\u065c\u0001\u0000\u0000\u0000\u065c\u065d\u0006X\f\u0000\u065d"+ - "\u00bd\u0001\u0000\u0000\u0000\u065e\u065f\u0005\u0000\u0000\u0001\u065f"+ - "\u0660\u0001\u0000\u0000\u0000\u0660\u0661\u0006Y\u0015\u0000\u0661\u0662"+ - "\u0006Y\u000f\u0000\u0662\u00bf\u0001\u0000\u0000\u0000\u0663\u0664\u0005"+ - ":\u0000\u0000\u0664\u0665\u0003R#\u0000\u0665\u0666\u0005=\u0000\u0000"+ - "\u0666\u0667\u0005\"\u0000\u0000\u0667\u0668\u0001\u0000\u0000\u0000\u0668"+ - "\u0669\u0006Z\t\u0000\u0669\u066a\u0006Z+\u0000\u066a\u00c1\u0001\u0000"+ - "\u0000\u0000\u066b\u066c\u0005{\u0000\u0000\u066c\u066d\u0005{\u0000\u0000"+ - "\u066d\u066e\u0001\u0000\u0000\u0000\u066e\u066f\u0006[\u0005\u0000\u066f"+ - "\u0670\u0006[\u0006\u0000\u0670\u00c3\u0001\u0000\u0000\u0000\u0671\u0672"+ - "\u0005{\u0000\u0000\u0672\u0673\u0005!\u0000\u0000\u0673\u0674\u0005!"+ - "\u0000\u0000\u0674\u0675\u0001\u0000\u0000\u0000\u0675\u0676\u0006\\\u0007"+ - "\u0000\u0676\u0677\u0006\\\b\u0000\u0677\u00c5\u0001\u0000\u0000\u0000"+ - "\u0678\u0679\u0005>\u0000\u0000\u0679\u067a\u0001\u0000\u0000\u0000\u067a"+ - "\u067b\u0006]\t\u0000\u067b\u067c\u0006]\u000f\u0000\u067c\u00c7\u0001"+ - "\u0000\u0000\u0000\u067d\u067e\t\u0000\u0000\u0000\u067e\u067f\u0001\u0000"+ - "\u0000\u0000\u067f\u0680\u0006^\t\u0000\u0680\u00c9\u0001\u0000\u0000"+ - "\u0000\u0681\u0682\u0005\u0000\u0000\u0001\u0682\u0683\u0001\u0000\u0000"+ - "\u0000\u0683\u0684\u0006_\u0015\u0000\u0684\u0685\u0006_\u000f\u0000\u0685"+ - "\u00cb\u0001\u0000\u0000\u0000\u0686\u0687\u0005\"\u0000\u0000\u0687\u0688"+ - "\u0001\u0000\u0000\u0000\u0688\u0689\u0006`\t\u0000\u0689\u068a\u0006"+ - "`\u000f\u0000\u068a\u00cd\u0001\u0000\u0000\u0000\u068b\u068c\t\u0000"+ - "\u0000\u0000\u068c\u068d\u0004a\u0011\u0000\u068d\u068e\u0001\u0000\u0000"+ - "\u0000\u068e\u068f\u0006a\u001f\u0000\u068f\u00cf\u0001\u0000\u0000\u0000"+ - "\u0690\u0691\t\u0000\u0000\u0000\u0691\u0692\u0001\u0000\u0000\u0000\u0692"+ - "\u0693\u0006b\f\u0000\u0693\u00d1\u0001\u0000\u0000\u0000\u0694\u0695"+ - "\u0005\u0000\u0000\u0001\u0695\u0696\u0001\u0000\u0000\u0000\u0696\u0697"+ - "\u0006c\u0015\u0000\u0697\u0698\u0006c\u000f\u0000\u0698\u00d3\u0001\u0000"+ - "\u0000\u0000\u0699\u069b\u0003\f\u0000\u0000\u069a\u069c\u0005$\u0000"+ - "\u0000\u069b\u069a\u0001\u0000\u0000\u0000\u069b\u069c\u0001\u0000\u0000"+ - "\u0000\u069c\u069d\u0001\u0000\u0000\u0000\u069d\u069e\u0003R#\u0000\u069e"+ - "\u069f\u0005}\u0000\u0000\u069f\u06a0\u0001\u0000\u0000\u0000\u06a0\u06a1"+ - "\u0006d\f\u0000\u06a1\u00d5\u0001\u0000\u0000\u0000\u06a2\u06a3\u0003"+ - "\f\u0000\u0000\u06a3\u06a4\u0001\u0000\u0000\u0000\u06a4\u06a5\u0006e"+ - "\f\u0000\u06a5\u00d7\u0001\u0000\u0000\u0000\u06a6\u06a8\u0005{\u0000"+ - "\u0000\u06a7\u06a9\u0007)\u0000\u0000\u06a8\u06a7\u0001\u0000\u0000\u0000"+ - "\u06a8\u06a9\u0001\u0000\u0000\u0000\u06a9\u06aa\u0001\u0000\u0000\u0000"+ - "\u06aa\u06ac\u0003R#\u0000\u06ab\u06ad\u0007)\u0000\u0000\u06ac\u06ab"+ - "\u0001\u0000\u0000\u0000\u06ac\u06ad\u0001\u0000\u0000\u0000\u06ad\u06af"+ - "\u0001\u0000\u0000\u0000\u06ae\u06b0\u0005:\u0000\u0000\u06af\u06ae\u0001"+ - "\u0000\u0000\u0000\u06b0\u06b1\u0001\u0000\u0000\u0000\u06b1\u06af\u0001"+ - "\u0000\u0000\u0000\u06b1\u06b2\u0001\u0000\u0000\u0000\u06b2\u06b4\u0001"+ - "\u0000\u0000\u0000\u06b3\u06b5\u0007)\u0000\u0000\u06b4\u06b3\u0001\u0000"+ - "\u0000\u0000\u06b4\u06b5\u0001\u0000\u0000\u0000\u06b5\u06b7\u0001\u0000"+ - "\u0000\u0000\u06b6\u06b8\u0003R#\u0000\u06b7\u06b6\u0001\u0000\u0000\u0000"+ - "\u06b7\u06b8\u0001\u0000\u0000\u0000\u06b8\u06ba\u0001\u0000\u0000\u0000"+ - "\u06b9\u06bb\u0007)\u0000\u0000\u06ba\u06b9\u0001\u0000\u0000\u0000\u06ba"+ - "\u06bb\u0001\u0000\u0000\u0000\u06bb\u06d2\u0001\u0000\u0000\u0000\u06bc"+ - "\u06be\u0005,\u0000\u0000\u06bd\u06bf\u0007)\u0000\u0000\u06be\u06bd\u0001"+ - "\u0000\u0000\u0000\u06be\u06bf\u0001\u0000\u0000\u0000\u06bf\u06c0\u0001"+ - "\u0000\u0000\u0000\u06c0\u06c2\u0003R#\u0000\u06c1\u06c3\u0007)\u0000"+ - "\u0000\u06c2\u06c1\u0001\u0000\u0000\u0000\u06c2\u06c3\u0001\u0000\u0000"+ - "\u0000\u06c3\u06c5\u0001\u0000\u0000\u0000\u06c4\u06c6\u0005:\u0000\u0000"+ - "\u06c5\u06c4\u0001\u0000\u0000\u0000\u06c6\u06c7\u0001\u0000\u0000\u0000"+ - "\u06c7\u06c5\u0001\u0000\u0000\u0000\u06c7\u06c8\u0001\u0000\u0000\u0000"+ - "\u06c8\u06ca\u0001\u0000\u0000\u0000\u06c9\u06cb\u0007)\u0000\u0000\u06ca"+ - "\u06c9\u0001\u0000\u0000\u0000\u06ca\u06cb\u0001\u0000\u0000\u0000\u06cb"+ - "\u06cc\u0001\u0000\u0000\u0000\u06cc\u06ce\u0003R#\u0000\u06cd\u06cf\u0007"+ - ")\u0000\u0000\u06ce\u06cd\u0001\u0000\u0000\u0000\u06ce\u06cf\u0001\u0000"+ - "\u0000\u0000\u06cf\u06d1\u0001\u0000\u0000\u0000\u06d0\u06bc\u0001\u0000"+ - "\u0000\u0000\u06d1\u06d4\u0001\u0000\u0000\u0000\u06d2\u06d0\u0001\u0000"+ - "\u0000\u0000\u06d2\u06d3\u0001\u0000\u0000\u0000\u06d3\u06d6\u0001\u0000"+ - "\u0000\u0000\u06d4\u06d2\u0001\u0000\u0000\u0000\u06d5\u06d7\u0005,\u0000"+ - "\u0000\u06d6\u06d5\u0001\u0000\u0000\u0000\u06d6\u06d7\u0001\u0000\u0000"+ - "\u0000\u06d7\u06d8\u0001\u0000\u0000\u0000\u06d8\u06d9\u0005}\u0000\u0000"+ - "\u06d9\u06da\u0001\u0000\u0000\u0000\u06da\u06db\u0006f\f\u0000\u06db"+ - "\u00d9\u0001\u0000\u0000\u0000\u06dc\u06dd\u0005{\u0000\u0000\u06dd\u06de"+ - "\u0005$\u0000\u0000\u06de\u06e7\u0003R#\u0000\u06df\u06e0\u0005[\u0000"+ - "\u0000\u06e0\u06e1\u0007)\u0000\u0000\u06e1\u06e2\u0003R#\u0000\u06e2"+ - "\u06e3\u0007)\u0000\u0000\u06e3\u06e4\u0005]\u0000\u0000\u06e4\u06e6\u0001"+ - "\u0000\u0000\u0000\u06e5\u06df\u0001\u0000\u0000\u0000\u06e6\u06e9\u0001"+ - "\u0000\u0000\u0000\u06e7\u06e5\u0001\u0000\u0000\u0000\u06e7\u06e8\u0001"+ - "\u0000\u0000\u0000\u06e8\u06ea\u0001\u0000\u0000\u0000\u06e9\u06e7\u0001"+ - "\u0000\u0000\u0000\u06ea\u06eb\u0005:\u0000\u0000\u06eb\u06ec\u0005:\u0000"+ - "\u0000\u06ec\u06ed\u0001\u0000\u0000\u0000\u06ed\u06ee\u0003R#\u0000\u06ee"+ - "\u06ef\u0005}\u0000\u0000\u06ef\u06f0\u0001\u0000\u0000\u0000\u06f0\u06f1"+ - "\u0006g\f\u0000\u06f1\u00db\u0001\u0000\u0000\u0000\u06f2\u06f3\u0005"+ - "{\u0000\u0000\u06f3\u06f4\u0005$\u0000\u0000\u06f4\u06fe\u0003R#\u0000"+ - "\u06f5\u06f6\u0005[\u0000\u0000\u06f6\u06f8\u0007)\u0000\u0000\u06f7\u06f9"+ - "\u0003R#\u0000\u06f8\u06f7\u0001\u0000\u0000\u0000\u06f8\u06f9\u0001\u0000"+ - "\u0000\u0000\u06f9\u06fa\u0001\u0000\u0000\u0000\u06fa\u06fb\u0007)\u0000"+ - "\u0000\u06fb\u06fd\u0005]\u0000\u0000\u06fc\u06f5\u0001\u0000\u0000\u0000"+ - "\u06fd\u0700\u0001\u0000\u0000\u0000\u06fe\u06fc\u0001\u0000\u0000\u0000"+ - "\u06fe\u06ff\u0001\u0000\u0000\u0000\u06ff\u0708\u0001\u0000\u0000\u0000"+ - "\u0700\u06fe\u0001\u0000\u0000\u0000\u0701\u0702\u0005:\u0000\u0000\u0702"+ - "\u0704\u0005:\u0000\u0000\u0703\u0701\u0001\u0000\u0000\u0000\u0704\u0705"+ - "\u0001\u0000\u0000\u0000\u0705\u0703\u0001\u0000\u0000\u0000\u0705\u0706"+ - "\u0001\u0000\u0000\u0000\u0706\u0707\u0001\u0000\u0000\u0000\u0707\u0709"+ - "\u0003R#\u0000\u0708\u0703\u0001\u0000\u0000\u0000\u0708\u0709\u0001\u0000"+ - "\u0000\u0000\u0709\u070e\u0001\u0000\u0000\u0000\u070a\u070c\u0005:\u0000"+ - "\u0000\u070b\u070d\u0003R#\u0000\u070c\u070b\u0001\u0000\u0000\u0000\u070c"+ - "\u070d\u0001\u0000\u0000\u0000\u070d\u070f\u0001\u0000\u0000\u0000\u070e"+ - "\u070a\u0001\u0000\u0000\u0000\u070f\u0710\u0001\u0000\u0000\u0000\u0710"+ - "\u070e\u0001\u0000\u0000\u0000\u0710\u0711\u0001\u0000\u0000\u0000\u0711"+ - "\u0712\u0001\u0000\u0000\u0000\u0712\u0713\u0005}\u0000\u0000\u0713\u0717"+ - "\u0001\u0000\u0000\u0000\u0714\u0715\u0005:\u0000\u0000\u0715\u0717\u0005"+ - "$\u0000\u0000\u0716\u06f2\u0001\u0000\u0000\u0000\u0716\u0714\u0001\u0000"+ - "\u0000\u0000\u0717\u0718\u0001\u0000\u0000\u0000\u0718\u0719\u0006h\u0015"+ - "\u0000\u0719\u00dd\u0001\u0000\u0000\u0000\u071a\u071b\u0005\\\u0000\u0000"+ - "\u071b\u071c\u0005\"\u0000\u0000\u071c\u071d\u0001\u0000\u0000\u0000\u071d"+ - "\u071e\u0006i\f\u0000\u071e\u00df\u0001\u0000\u0000\u0000\u071f\u0720"+ - "\u0005\"\u0000\u0000\u0720\u0721\u0001\u0000\u0000\u0000\u0721\u0722\u0006"+ - "j\f\u0000\u0722\u0723\u0006j\u000f\u0000\u0723\u00e1\u0001\u0000\u0000"+ - "\u0000\u0724\u0725\t\u0000\u0000\u0000\u0725\u0726\u0001\u0000\u0000\u0000"+ - "\u0726\u0727\u0006k\f\u0000\u0727\u00e3\u0001\u0000\u0000\u0000\u0728"+ - "\u0729\u0005\u0000\u0000\u0001\u0729\u072a\u0001\u0000\u0000\u0000\u072a"+ - "\u072b\u0006l\u0015\u0000\u072b\u072c\u0006l\u000f\u0000\u072c\u00e5\u0001"+ - "\u0000\u0000\u0000\u072d\u072e\u0005-\u0000\u0000\u072e\u072f\u0005-\u0000"+ - "\u0000\u072f\u0730\u0005}\u0000\u0000\u0730\u0731\u0005}\u0000\u0000\u0731"+ - "\u0732\u0001\u0000\u0000\u0000\u0732\u0733\u0006m\u000f\u0000\u0733\u00e7"+ - "\u0001\u0000\u0000\u0000\u0734\u0735\t\u0000\u0000\u0000\u0735\u0736\u0004"+ - "n\u0012\u0000\u0736\u0737\u0001\u0000\u0000\u0000\u0737\u0738\u0006n,"+ - "\u0000\u0738\u00e9\u0001\u0000\u0000\u0000\u0739\u073a\t\u0000\u0000\u0000"+ - "\u073a\u073b\u0001\u0000\u0000\u0000\u073b\u073c\u0006o\f\u0000\u073c"+ - "\u00eb\u0001\u0000\u0000\u0000\u073d\u073e\u0005\u0000\u0000\u0001\u073e"+ - "\u073f\u0001\u0000\u0000\u0000\u073f\u0740\u0006p,\u0000\u0740\u0741\u0006"+ - "p\u000f\u0000\u0741\u00ed\u0001\u0000\u0000\u0000k\u0000\u0001\u0002\u0003"+ - "\u0004\u0005\u0006\u0007\b\t\n\u000b\u00f5\u00ff\u013c\u015b\u0177\u0181"+ - "\u0183\u018c\u0198\u01a6\u01ac\u01ae\u01cc\u023e\u0243\u0259\u0288\u02bf"+ - "\u02e4\u02ee\u0346\u0349\u0361\u0376\u037d\u038e\u0390\u039d\u03a2\u03a9"+ - "\u03ae\u03bc\u03bf\u03c1\u03cd\u03d2\u03d5\u03e2\u03e5\u03e7\u03ee\u03f3"+ - "\u03f5\u03fe\u040a\u0411\u0418\u0420\u0422\u042b\u042d\u0438\u0450\u0464"+ - "\u0468\u0473\u0479\u0485\u0489\u054f\u0554\u0557\u0575\u057c\u0583\u058b"+ - "\u05a1\u05a8\u05af\u05b7\u05c4\u0609\u061d\u069b\u06a8\u06ac\u06b1\u06b4"+ - "\u06b7\u06ba\u06be\u06c2\u06c7\u06ca\u06ce\u06d2\u06d6\u06e7\u06f8\u06fe"+ - "\u0705\u0708\u070c\u0710\u0716-\u0005\u0004\u0000\u0007\u0001\u0000\u0005"+ - "\u0007\u0000\u0007\u000b\u0000\u0005\u0006\u0000\u0005\u0002\u0000\u0007"+ - "\u0005\u0000\u0005\u0003\u0000\u0007\u0004\u0000\u0007\u0006\u0000\u0005"+ - "\b\u0000\u0005\u0001\u0000\u0003\u0000\u0000\u0005\u000b\u0000\u0007\u0007"+ - "\u0000\u0004\u0000\u0000\u00013\u0000\u00014\u0001\u0006\u0000\u0000\u0001"+ - "6\u0002\u00017\u0003\u0007\b\u0000\u0001:\u0004\u0001;\u0005\u0001=\u0006"+ - "\u0001>\u0007\u0005\u0005\u0000\u0001A\b\u0001D\t\u0001D\n\u0001E\u000b"+ - "\u0007\u0002\u0000\u0002\u0000\u0000\u0001F\f\u0001F\r\u0001G\u000e\u0001"+ - "G\u000f\u0005\n\u0000\u0001J\u0010\u0001K\u0011\u0001L\u0012\u0001P\u0013"+ - "\u0000\u0002\u0000\u0005\t\u0000\u0007\t\u0000"; + "\u0000\"\"\\\\\u0002\u0000\'\'\\\\\u0001\u0000 \u0003\u0000 {{}}\u0003"+ + "\u0000 !{{}}\u079c\u0000\u0013\u0001\u0000\u0000\u0000\u0000\u0015\u0001"+ + "\u0000\u0000\u0000\u0000\u0017\u0001\u0000\u0000\u0000\u0000\u0019\u0001"+ + "\u0000\u0000\u0000\u0000\u001b\u0001\u0000\u0000\u0000\u0000\u001d\u0001"+ + "\u0000\u0000\u0000\u0000\u001f\u0001\u0000\u0000\u0000\u0000!\u0001\u0000"+ + "\u0000\u0000\u0000#\u0001\u0000\u0000\u0000\u0000%\u0001\u0000\u0000\u0000"+ + "\u0000\'\u0001\u0000\u0000\u0000\u0000)\u0001\u0000\u0000\u0000\u0000"+ + "+\u0001\u0000\u0000\u0000\u0000-\u0001\u0000\u0000\u0000\u0000/\u0001"+ + "\u0000\u0000\u0000\u00001\u0001\u0000\u0000\u0000\u00003\u0001\u0000\u0000"+ + "\u0000\u00005\u0001\u0000\u0000\u0000\u00007\u0001\u0000\u0000\u0000\u0000"+ + "9\u0001\u0000\u0000\u0000\u0000;\u0001\u0000\u0000\u0000\u0000=\u0001"+ + "\u0000\u0000\u0000\u0000?\u0001\u0000\u0000\u0000\u0000A\u0001\u0000\u0000"+ + "\u0000\u0000C\u0001\u0000\u0000\u0000\u0000E\u0001\u0000\u0000\u0000\u0000"+ + "G\u0001\u0000\u0000\u0000\u0000]\u0001\u0000\u0000\u0000\u0000_\u0001"+ + "\u0000\u0000\u0000\u0000a\u0001\u0000\u0000\u0000\u0000c\u0001\u0000\u0000"+ + "\u0000\u0001e\u0001\u0000\u0000\u0000\u0001g\u0001\u0000\u0000\u0000\u0001"+ + "i\u0001\u0000\u0000\u0000\u0002k\u0001\u0000\u0000\u0000\u0002m\u0001"+ + "\u0000\u0000\u0000\u0002o\u0001\u0000\u0000\u0000\u0002q\u0001\u0000\u0000"+ + "\u0000\u0003s\u0001\u0000\u0000\u0000\u0003u\u0001\u0000\u0000\u0000\u0003"+ + "w\u0001\u0000\u0000\u0000\u0003y\u0001\u0000\u0000\u0000\u0004{\u0001"+ + "\u0000\u0000\u0000\u0004}\u0001\u0000\u0000\u0000\u0004\u007f\u0001\u0000"+ + "\u0000\u0000\u0004\u0081\u0001\u0000\u0000\u0000\u0005\u0083\u0001\u0000"+ + "\u0000\u0000\u0005\u0085\u0001\u0000\u0000\u0000\u0005\u0087\u0001\u0000"+ + "\u0000\u0000\u0005\u0089\u0001\u0000\u0000\u0000\u0005\u008b\u0001\u0000"+ + "\u0000\u0000\u0005\u008d\u0001\u0000\u0000\u0000\u0005\u008f\u0001\u0000"+ + "\u0000\u0000\u0005\u0091\u0001\u0000\u0000\u0000\u0006\u0093\u0001\u0000"+ + "\u0000\u0000\u0006\u0095\u0001\u0000\u0000\u0000\u0006\u0097\u0001\u0000"+ + "\u0000\u0000\u0006\u0099\u0001\u0000\u0000\u0000\u0007\u009b\u0001\u0000"+ + "\u0000\u0000\u0007\u009d\u0001\u0000\u0000\u0000\u0007\u009f\u0001\u0000"+ + "\u0000\u0000\u0007\u00a1\u0001\u0000\u0000\u0000\b\u00a3\u0001\u0000\u0000"+ + "\u0000\b\u00a5\u0001\u0000\u0000\u0000\b\u00a7\u0001\u0000\u0000\u0000"+ + "\b\u00a9\u0001\u0000\u0000\u0000\b\u00ab\u0001\u0000\u0000\u0000\b\u00ad"+ + "\u0001\u0000\u0000\u0000\t\u00af\u0001\u0000\u0000\u0000\t\u00b1\u0001"+ + "\u0000\u0000\u0000\t\u00b3\u0001\u0000\u0000\u0000\t\u00b5\u0001\u0000"+ + "\u0000\u0000\t\u00b7\u0001\u0000\u0000\u0000\t\u00b9\u0001\u0000\u0000"+ + "\u0000\t\u00bb\u0001\u0000\u0000\u0000\t\u00bd\u0001\u0000\u0000\u0000"+ + "\t\u00bf\u0001\u0000\u0000\u0000\t\u00c1\u0001\u0000\u0000\u0000\t\u00c3"+ + "\u0001\u0000\u0000\u0000\n\u00c5\u0001\u0000\u0000\u0000\n\u00c7\u0001"+ + "\u0000\u0000\u0000\n\u00c9\u0001\u0000\u0000\u0000\n\u00cb\u0001\u0000"+ + "\u0000\u0000\u000b\u0131\u0001\u0000\u0000\u0000\r\u0133\u0001\u0000\u0000"+ + "\u0000\u000f\u014f\u0001\u0000\u0000\u0000\u0011\u0156\u0001\u0000\u0000"+ + "\u0000\u0013\u0175\u0001\u0000\u0000\u0000\u0015\u0193\u0001\u0000\u0000"+ + "\u0000\u0017\u0205\u0001\u0000\u0000\u0000\u0019\u0221\u0001\u0000\u0000"+ + "\u0000\u001b\u0250\u0001\u0000\u0000\u0000\u001d\u0254\u0001\u0000\u0000"+ + "\u0000\u001f\u0261\u0001\u0000\u0000\u0000!\u0287\u0001\u0000\u0000\u0000"+ + "#\u02ac\u0001\u0000\u0000\u0000%\u02b0\u0001\u0000\u0000\u0000\'\u02bd"+ + "\u0001\u0000\u0000\u0000)\u02c4\u0001\u0000\u0000\u0000+\u0311\u0001\u0000"+ + "\u0000\u0000-\u0315\u0001\u0000\u0000\u0000/\u031e\u0001\u0000\u0000\u0000"+ + "1\u0324\u0001\u0000\u0000\u00003\u0327\u0001\u0000\u0000\u00005\u032b"+ + "\u0001\u0000\u0000\u00007\u0331\u0001\u0000\u0000\u00009\u0345\u0001\u0000"+ + "\u0000\u0000;\u0358\u0001\u0000\u0000\u0000=\u0368\u0001\u0000\u0000\u0000"+ + "?\u0389\u0001\u0000\u0000\u0000A\u03ad\u0001\u0000\u0000\u0000C\u03bd"+ + "\u0001\u0000\u0000\u0000E\u03c6\u0001\u0000\u0000\u0000G\u03ca\u0001\u0000"+ + "\u0000\u0000I\u03ce\u0001\u0000\u0000\u0000K\u03d5\u0001\u0000\u0000\u0000"+ + "M\u03dc\u0001\u0000\u0000\u0000O\u03e3\u0001\u0000\u0000\u0000Q\u03e5"+ + "\u0001\u0000\u0000\u0000S\u03ef\u0001\u0000\u0000\u0000U\u03fa\u0001\u0000"+ + "\u0000\u0000W\u0403\u0001\u0000\u0000\u0000Y\u0418\u0001\u0000\u0000\u0000"+ + "[\u041a\u0001\u0000\u0000\u0000]\u041c\u0001\u0000\u0000\u0000_\u0423"+ + "\u0001\u0000\u0000\u0000a\u0429\u0001\u0000\u0000\u0000c\u0569\u0001\u0000"+ + "\u0000\u0000e\u056d\u0001\u0000\u0000\u0000g\u0573\u0001\u0000\u0000\u0000"+ + "i\u0577\u0001\u0000\u0000\u0000k\u057c\u0001\u0000\u0000\u0000m\u0583"+ + "\u0001\u0000\u0000\u0000o\u0589\u0001\u0000\u0000\u0000q\u0592\u0001\u0000"+ + "\u0000\u0000s\u0597\u0001\u0000\u0000\u0000u\u059f\u0001\u0000\u0000\u0000"+ + "w\u05a5\u0001\u0000\u0000\u0000y\u05ae\u0001\u0000\u0000\u0000{\u05b4"+ + "\u0001\u0000\u0000\u0000}\u05bc\u0001\u0000\u0000\u0000\u007f\u05c2\u0001"+ + "\u0000\u0000\u0000\u0081\u05c7\u0001\u0000\u0000\u0000\u0083\u05cc\u0001"+ + "\u0000\u0000\u0000\u0085\u05d1\u0001\u0000\u0000\u0000\u0087\u05d8\u0001"+ + "\u0000\u0000\u0000\u0089\u05dd\u0001\u0000\u0000\u0000\u008b\u05e2\u0001"+ + "\u0000\u0000\u0000\u008d\u05e8\u0001\u0000\u0000\u0000\u008f\u05f6\u0001"+ + "\u0000\u0000\u0000\u0091\u05f9\u0001\u0000\u0000\u0000\u0093\u05fe\u0001"+ + "\u0000\u0000\u0000\u0095\u0608\u0001\u0000\u0000\u0000\u0097\u060d\u0001"+ + "\u0000\u0000\u0000\u0099\u0611\u0001\u0000\u0000\u0000\u009b\u0616\u0001"+ + "\u0000\u0000\u0000\u009d\u0626\u0001\u0000\u0000\u0000\u009f\u062b\u0001"+ + "\u0000\u0000\u0000\u00a1\u062f\u0001\u0000\u0000\u0000\u00a3\u0634\u0001"+ + "\u0000\u0000\u0000\u00a5\u063c\u0001\u0000\u0000\u0000\u00a7\u0642\u0001"+ + "\u0000\u0000\u0000\u00a9\u0649\u0001\u0000\u0000\u0000\u00ab\u064e\u0001"+ + "\u0000\u0000\u0000\u00ad\u0652\u0001\u0000\u0000\u0000\u00af\u0657\u0001"+ + "\u0000\u0000\u0000\u00b1\u065c\u0001\u0000\u0000\u0000\u00b3\u0661\u0001"+ + "\u0000\u0000\u0000\u00b5\u0665\u0001\u0000\u0000\u0000\u00b7\u066a\u0001"+ + "\u0000\u0000\u0000\u00b9\u06a0\u0001\u0000\u0000\u0000\u00bb\u06da\u0001"+ + "\u0000\u0000\u0000\u00bd\u06de\u0001\u0000\u0000\u0000\u00bf\u06e3\u0001"+ + "\u0000\u0000\u0000\u00c1\u06e8\u0001\u0000\u0000\u0000\u00c3\u06ec\u0001"+ + "\u0000\u0000\u0000\u00c5\u06f1\u0001\u0000\u0000\u0000\u00c7\u06f8\u0001"+ + "\u0000\u0000\u0000\u00c9\u06fd\u0001\u0000\u0000\u0000\u00cb\u0701\u0001"+ + "\u0000\u0000\u0000\u00cd\u00ce\u0007\u0000\u0000\u0000\u00ce\u00cf\u0007"+ + "\u0001\u0000\u0000\u00cf\u00d0\u0007\u0002\u0000\u0000\u00d0\u00d5\u0001"+ + "\u0000\u0000\u0000\u00d1\u00d2\u0007\u0003\u0000\u0000\u00d2\u00d3\u0007"+ + "\u0004\u0000\u0000\u00d3\u00d4\u0007\u0005\u0000\u0000\u00d4\u00d6\u0007"+ + "\u0006\u0000\u0000\u00d5\u00d1\u0001\u0000\u0000\u0000\u00d5\u00d6\u0001"+ + "\u0000\u0000\u0000\u00d6\u0132\u0001\u0000\u0000\u0000\u00d7\u00d8\u0007"+ + "\u0007\u0000\u0000\u00d8\u0132\u0007\u0000\u0000\u0000\u00d9\u00da\u0007"+ + "\b\u0000\u0000\u00da\u00db\u0007\u0006\u0000\u0000\u00db\u00dc\u0007\u0007"+ + "\u0000\u0000\u00dc\u00dd\u0007\t\u0000\u0000\u00dd\u0132\u0007\u0003\u0000"+ + "\u0000\u00de\u00df\u0007\n\u0000\u0000\u00df\u00e0\u0007\u0003\u0000\u0000"+ + "\u00e0\u00e1\u0007\u0005\u0000\u0000\u00e1\u00e2\u0007\u000b\u0000\u0000"+ + "\u00e2\u00e3\u0007\u0007\u0000\u0000\u00e3\u00e4\u0007\u0001\u0000\u0000"+ + "\u00e4\u0132\u0007\f\u0000\u0000\u00e5\u00e6\u0007\n\u0000\u0000\u00e6"+ + "\u00e7\u0007\u0003\u0000\u0000\u00e7\u00e8\u0007\n\u0000\u0000\u00e8\u00e9"+ + "\u0007\n\u0000\u0000\u00e9\u00ea\u0007\u0007\u0000\u0000\u00ea\u00eb\u0007"+ + "\u0001\u0000\u0000\u00eb\u0132\u0007\f\u0000\u0000\u00ec\u00ed\u0007\u0001"+ + "\u0000\u0000\u00ed\u00ee\u0007\f\u0000\u0000\u00ee\u00ef\u0007\u0005\u0000"+ + "\u0000\u00ef\u0132\u0007\u0003\u0000\u0000\u00f0\u00f1\u0007\r\u0000\u0000"+ + "\u00f1\u00f2\u0007\u000e\u0000\u0000\u00f2\u00f3\u0007\n\u0000\u0000\u00f3"+ + "\u0132\u0007\u0006\u0000\u0000\u00f4\u00f5\u0007\r\u0000\u0000\u00f5\u00f6"+ + "\u0007\u000e\u0000\u0000\u00f6\u00f7\u0007\n\u0000\u0000\u00f7\u00f8\u0007"+ + "\u0006\u0000\u0000\u00f8\u00f9\u0007\u0001\u0000\u0000\u00f9\u00fa\u0007"+ + "\f\u0000\u0000\u00fa\u00fb\u0007\u0005\u0000\u0000\u00fb\u0132\u0007\u0003"+ + "\u0000\u0000\u00fc\u00fd\u0007\n\u0000\u0000\u00fd\u00fe\u0007\b\u0000"+ + "\u0000\u00fe\u00ff\u0007\u0007\u0000\u0000\u00ff\u0100\u0007\u000b\u0000"+ + "\u0000\u0100\u0101\u0007\u0005\u0000\u0000\u0101\u0132\u0007\u0006\u0000"+ + "\u0000\u0102\u0103\u0007\u000e\u0000\u0000\u0103\u0104\u0007\f\u0000\u0000"+ + "\u0104\u0105\u0007\t\u0000\u0000\u0105\u0106\u0007\u0003\u0000\u0000\u0106"+ + "\u0107\u0007\n\u0000\u0000\u0107\u0132\u0007\n\u0000\u0000\u0108\u0109"+ + "\u0007\u0005\u0000\u0000\u0109\u010a\u0007\u0004\u0000\u0000\u010a\u010b"+ + "\u0007\f\u0000\u0000\u010b\u0112\u0001\u0000\u0000\u0000\u010c\u010d\u0007"+ + "\u0004\u0000\u0000\u010d\u010e\u0007\f\u0000\u0000\u010e\u0113\u0007\u000f"+ + "\u0000\u0000\u010f\u0110\u0007\f\u0000\u0000\u0110\u0111\u0007\u0001\u0000"+ + "\u0000\u0111\u0113\u0007\u000b\u0000\u0000\u0112\u010c\u0001\u0000\u0000"+ + "\u0000\u0112\u010f\u0001\u0000\u0000\u0000\u0112\u0113\u0001\u0000\u0000"+ + "\u0000\u0113\u0132\u0001\u0000\u0000\u0000\u0114\u0115\u0007\u0004\u0000"+ + "\u0000\u0115\u0116\u0007\u000e\u0000\u0000\u0116\u0117\u0007\u000b\u0000"+ + "\u0000\u0117\u0132\u0007\u0006\u0000\u0000\u0118\u0119\u0007\u0010\u0000"+ + "\u0000\u0119\u011a\u0007\u000e\u0000\u0000\u011a\u011b\u0007\u0003\u0000"+ + "\u0000\u011b\u011c\u0007\n\u0000\u0000\u011c\u0132\u0007\u000b\u0000\u0000"+ + "\u011d\u011e\u0007\u0003\u0000\u0000\u011e\u011f\u0007\u0002\u0000\u0000"+ + "\u011f\u0120\u0007\u0002\u0000\u0000\u0120\u0121\u0007\u0001\u0000\u0000"+ + "\u0121\u0132\u0007\u0002\u0000\u0000\u0122\u0123\u0007\r\u0000\u0000\u0123"+ + "\u0124\u0007\u0002\u0000\u0000\u0124\u0125\u0007\u0001\u0000\u0000\u0125"+ + "\u0126\u0007\u0011\u0000\u0000\u0126\u0127\u0007\u000e\u0000\u0000\u0127"+ + "\u0128\u0007\u0005\u0000\u0000\u0128\u0129\u0007\u000b\u0000\u0000\u0129"+ + "\u012a\u0007\u0007\u0000\u0000\u012a\u012b\u0007\u0001\u0000\u0000\u012b"+ + "\u0132\u0007\f\u0000\u0000\u012c\u012d\u0007\u0003\u0000\u0000\u012d\u012e"+ + "\u0007\u0012\u0000\u0000\u012e\u012f\u0007\r\u0000\u0000\u012f\u0130\u0007"+ + "\u000b\u0000\u0000\u0130\u0132\u0007\u000f\u0000\u0000\u0131\u00cd\u0001"+ + "\u0000\u0000\u0000\u0131\u00d7\u0001\u0000\u0000\u0000\u0131\u00d9\u0001"+ + "\u0000\u0000\u0000\u0131\u00de\u0001\u0000\u0000\u0000\u0131\u00e5\u0001"+ + "\u0000\u0000\u0000\u0131\u00ec\u0001\u0000\u0000\u0000\u0131\u00f0\u0001"+ + "\u0000\u0000\u0000\u0131\u00f4\u0001\u0000\u0000\u0000\u0131\u00fc\u0001"+ + "\u0000\u0000\u0000\u0131\u0102\u0001\u0000\u0000\u0000\u0131\u0108\u0001"+ + "\u0000\u0000\u0000\u0131\u0114\u0001\u0000\u0000\u0000\u0131\u0118\u0001"+ + "\u0000\u0000\u0000\u0131\u011d\u0001\u0000\u0000\u0000\u0131\u0122\u0001"+ + "\u0000\u0000\u0000\u0131\u012c\u0001\u0000\u0000\u0000\u0132\f\u0001\u0000"+ + "\u0000\u0000\u0133\u0134\u0005@\u0000\u0000\u0134\u0135\u0007\u0007\u0000"+ + "\u0000\u0135\u0136\u0007\f\u0000\u0000\u0136\u0137\u0007\u0005\u0000\u0000"+ + "\u0137\u0138\u0007\t\u0000\u0000\u0138\u0139\u0007\u000e\u0000\u0000\u0139"+ + "\u013a\u0007\u0011\u0000\u0000\u013a\u013b\u0007\u0003\u0000\u0000\u013b"+ + "\u014d\u0001\u0000\u0000\u0000\u013c\u013d\u0007\u0007\u0000\u0000\u013d"+ + "\u014e\u0007\u0000\u0000\u0000\u013e\u013f\u0007\b\u0000\u0000\u013f\u0140"+ + "\u0007\u0006\u0000\u0000\u0140\u0141\u0007\u0003\u0000\u0000\u0141\u014e"+ + "\u0007\f\u0000\u0000\u0142\u0143\u0007\u0000\u0000\u0000\u0143\u0144\u0007"+ + "\u0007\u0000\u0000\u0144\u0145\u0007\u0002\u0000\u0000\u0145\u0146\u0007"+ + "\n\u0000\u0000\u0146\u014e\u0007\u000b\u0000\u0000\u0147\u0148\u0007\u000e"+ + "\u0000\u0000\u0148\u0149\u0007\f\u0000\u0000\u0149\u014a\u0007\t\u0000"+ + "\u0000\u014a\u014b\u0007\u0003\u0000\u0000\u014b\u014c\u0007\n\u0000\u0000"+ + "\u014c\u014e\u0007\n\u0000\u0000\u014d\u013c\u0001\u0000\u0000\u0000\u014d"+ + "\u013e\u0001\u0000\u0000\u0000\u014d\u0142\u0001\u0000\u0000\u0000\u014d"+ + "\u0147\u0001\u0000\u0000\u0000\u014d\u014e\u0001\u0000\u0000\u0000\u014e"+ + "\u000e\u0001\u0000\u0000\u0000\u014f\u0153\u0007\u0013\u0000\u0000\u0150"+ + "\u0152\u0007\u0014\u0000\u0000\u0151\u0150\u0001\u0000\u0000\u0000\u0152"+ + "\u0155\u0001\u0000\u0000\u0000\u0153\u0151\u0001\u0000\u0000\u0000\u0153"+ + "\u0154\u0001\u0000\u0000\u0000\u0154\u0010\u0001\u0000\u0000\u0000\u0155"+ + "\u0153\u0001\u0000\u0000\u0000\u0156\u0157\u0005\u00b0\u0000\u0000\u0157"+ + "\u0012\u0001\u0000\u0000\u0000\u0158\u0159\u0005<\u0000\u0000\u0159\u015a"+ + "\u0005?\u0000\u0000\u015a\u015b\u0005=\u0000\u0000\u015b\u015f\u0001\u0000"+ + "\u0000\u0000\u015c\u015e\t\u0000\u0000\u0000\u015d\u015c\u0001\u0000\u0000"+ + "\u0000\u015e\u0161\u0001\u0000\u0000\u0000\u015f\u0160\u0001\u0000\u0000"+ + "\u0000\u015f\u015d\u0001\u0000\u0000\u0000\u0160\u0162\u0001\u0000\u0000"+ + "\u0000\u0161\u015f\u0001\u0000\u0000\u0000\u0162\u0163\u0005?\u0000\u0000"+ + "\u0163\u0176\u0005>\u0000\u0000\u0164\u0165\u0005<\u0000\u0000\u0165\u0166"+ + "\u0005?\u0000\u0000\u0166\u0167\u0007\r\u0000\u0000\u0167\u0168\u0007"+ + "\u0006\u0000\u0000\u0168\u0169\u0007\r\u0000\u0000\u0169\u016d\u0001\u0000"+ + "\u0000\u0000\u016a\u016c\t\u0000\u0000\u0000\u016b\u016a\u0001\u0000\u0000"+ + "\u0000\u016c\u016f\u0001\u0000\u0000\u0000\u016d\u016e\u0001\u0000\u0000"+ + "\u0000\u016d\u016b\u0001\u0000\u0000\u0000\u016e\u0173\u0001\u0000\u0000"+ + "\u0000\u016f\u016d\u0001\u0000\u0000\u0000\u0170\u0171\u0005?\u0000\u0000"+ + "\u0171\u0174\u0005>\u0000\u0000\u0172\u0174\u0005\u0000\u0000\u0001\u0173"+ + "\u0170\u0001\u0000\u0000\u0000\u0173\u0172\u0001\u0000\u0000\u0000\u0174"+ + "\u0176\u0001\u0000\u0000\u0000\u0175\u0158\u0001\u0000\u0000\u0000\u0175"+ + "\u0164\u0001\u0000\u0000\u0000\u0176\u0014\u0001\u0000\u0000\u0000\u0177"+ + "\u0178\u0005@\u0000\u0000\u0178\u0194\u0003\u000b\u0000\u0000\u0179\u017a"+ + "\u0005@\u0000\u0000\u017a\u017b\u0007\n\u0000\u0000\u017b\u017c\u0007"+ + "\u0003\u0000\u0000\u017c\u017d\u0007\u0005\u0000\u0000\u017d\u017e\u0007"+ + "\u000b\u0000\u0000\u017e\u017f\u0007\u0007\u0000\u0000\u017f\u0180\u0007"+ + "\u0001\u0000\u0000\u0180\u0181\u0007\f\u0000\u0000\u0181\u0182\u0007\u0012"+ + "\u0000\u0000\u0182\u0183\u0007\u0007\u0000\u0000\u0183\u0184\u0007\n\u0000"+ + "\u0000\u0184\u0185\u0007\n\u0000\u0000\u0185\u0186\u0007\u0007\u0000\u0000"+ + "\u0186\u0187\u0007\f\u0000\u0000\u0187\u0194\u0007\u0010\u0000\u0000\u0188"+ + "\u0189\u0005@\u0000\u0000\u0189\u018a\u0007\u0006\u0000\u0000\u018a\u018b"+ + "\u0007\u0004\u0000\u0000\u018b\u018c\u0007\n\u0000\u0000\u018c\u018d\u0007"+ + "\n\u0000\u0000\u018d\u018e\u0007\u0003\u0000\u0000\u018e\u018f\u0007\u0005"+ + "\u0000\u0000\u018f\u0190\u0007\u000b\u0000\u0000\u0190\u0191\u0007\u0007"+ + "\u0000\u0000\u0191\u0192\u0007\u0001\u0000\u0000\u0192\u0194\u0007\f\u0000"+ + "\u0000\u0193\u0177\u0001\u0000\u0000\u0000\u0193\u0179\u0001\u0000\u0000"+ + "\u0000\u0193\u0188\u0001\u0000\u0000\u0000\u0194\u0195\u0001\u0000\u0000"+ + "\u0000\u0195\u0196\u0006\u0005\u0000\u0000\u0196\u0197\u0006\u0005\u0001"+ + "\u0000\u0197\u0016\u0001\u0000\u0000\u0000\u0198\u0199\u0005@\u0000\u0000"+ + "\u0199\u019a\u0007\u0003\u0000\u0000\u019a\u019b\u0007\t\u0000\u0000\u019b"+ + "\u019c\u0007\n\u0000\u0000\u019c\u019d\u0007\u0003\u0000\u0000\u019d\u019e"+ + "\u0007\u0007\u0000\u0000\u019e\u0206\u0007\u0000\u0000\u0000\u019f\u0206"+ + "\u0003\r\u0001\u0000\u01a0\u01a1\u0005@\u0000\u0000\u01a1\u01a2\u0007"+ + "\u0003\u0000\u0000\u01a2\u01a3\u0007\u0015\u0000\u0000\u01a3\u01a4\u0007"+ + "\u000b\u0000\u0000\u01a4\u01a5\u0007\u0003\u0000\u0000\u01a5\u01a6\u0007"+ + "\f\u0000\u0000\u01a6\u01a7\u0007\u0011\u0000\u0000\u01a7\u0206\u0007\n"+ + "\u0000\u0000\u01a8\u01a9\u0005@\u0000\u0000\u01a9\u01aa\u0007\u0003\u0000"+ + "\u0000\u01aa\u01ab\u0007\u0004\u0000\u0000\u01ab\u01ac\u0007\u0005\u0000"+ + "\u0000\u01ac\u0206\u0007\u0006\u0000\u0000\u01ad\u01ae\u0005@\u0000\u0000"+ + "\u01ae\u01af\u0007\u000f\u0000\u0000\u01af\u01b0\u0007\u0007\u0000\u0000"+ + "\u01b0\u01b1\u0007\u0003\u0000\u0000\u01b1\u01b2\u0007\t\u0000\u0000\u01b2"+ + "\u0206\u0007\u0011\u0000\u0000\u01b3\u01b4\u0005@\u0000\u0000\u01b4\u01b5"+ + "\u0007\r\u0000\u0000\u01b5\u01b6\u0007\u0002\u0000\u0000\u01b6\u01b7\u0007"+ + "\u0001\u0000\u0000\u01b7\u01b8\u0007\r\u0000\u0000\u01b8\u0206\u0007\n"+ + "\u0000\u0000\u01b9\u01ba\u0005@\u0000\u0000\u01ba\u01bb\u0007\u0012\u0000"+ + "\u0000\u01bb\u01bc\u0007\u0003\u0000\u0000\u01bc\u01bd\u0007\u000b\u0000"+ + "\u0000\u01bd\u01be\u0007\u0006\u0000\u0000\u01be\u01bf\u0007\u0001\u0000"+ + "\u0000\u01bf\u0206\u0007\u0011\u0000\u0000\u01c0\u01c1\u0005@\u0000\u0000"+ + "\u01c1\u01c2\u0007\u0005\u0000\u0000\u01c2\u01c3\u0007\t\u0000\u0000\u01c3"+ + "\u01c4\u0007\u0004\u0000\u0000\u01c4\u01c5\u0007\n\u0000\u0000\u01c5\u0206"+ + "\u0007\n\u0000\u0000\u01c6\u01c7\u0005@\u0000\u0000\u01c7\u01c8\u0007"+ + "\n\u0000\u0000\u01c8\u01c9\u0007\u000b\u0000\u0000\u01c9\u01ca\u0007\u000f"+ + "\u0000\u0000\u01ca\u01cb\u0007\t\u0000\u0000\u01cb\u0206\u0007\u0003\u0000"+ + "\u0000\u01cc\u01cd\u0005@\u0000\u0000\u01cd\u01ce\u0007\u0004\u0000\u0000"+ + "\u01ce\u01cf\u0007\b\u0000\u0000\u01cf\u01d0\u0007\u0004\u0000\u0000\u01d0"+ + "\u01d1\u0007\u0002\u0000\u0000\u01d1\u0206\u0007\u0003\u0000\u0000\u01d2"+ + "\u01d3\u0005@\u0000\u0000\u01d3\u01d4\u0007\u0016\u0000\u0000\u01d4\u01d5"+ + "\u0007\u0002\u0000\u0000\u01d5\u01d6\u0007\u0003\u0000\u0000\u01d6\u01d7"+ + "\u0007\u0004\u0000\u0000\u01d7\u0206\u0007\u0017\u0000\u0000\u01d8\u01d9"+ + "\u0005@\u0000\u0000\u01d9\u01da\u0007\u0005\u0000\u0000\u01da\u01db\u0007"+ + "\u0001\u0000\u0000\u01db\u01dc\u0007\f\u0000\u0000\u01dc\u01dd\u0007\u000b"+ + "\u0000\u0000\u01dd\u01de\u0007\u0007\u0000\u0000\u01de\u01df\u0007\f\u0000"+ + "\u0000\u01df\u01e0\u0007\u000e\u0000\u0000\u01e0\u0206\u0007\u0003\u0000"+ + "\u0000\u01e1\u01e2\u0005@\u0000\u0000\u01e2\u01e3\u0007\n\u0000\u0000"+ + "\u01e3\u01e4\u0007\u0003\u0000\u0000\u01e4\u01e5\u0007\t\u0000\u0000\u01e5"+ + "\u01e6\u0007\u0003\u0000\u0000\u01e6\u01e7\u0007\u0005\u0000\u0000\u01e7"+ + "\u01e8\u0007\u000b\u0000\u0000\u01e8\u01e9\u0007\u0003\u0000\u0000\u01e9"+ + "\u0206\u0007\u0011\u0000\u0000\u01ea\u01eb\u0005@\u0000\u0000\u01eb\u01ec"+ + "\u0007\u0011\u0000\u0000\u01ec\u01ed\u0007\u0007\u0000\u0000\u01ed\u01ee"+ + "\u0007\n\u0000\u0000\u01ee\u01ef\u0007\u0004\u0000\u0000\u01ef\u01f0\u0007"+ + "\u0016\u0000\u0000\u01f0\u01f1\u0007\t\u0000\u0000\u01f1\u01f2\u0007\u0003"+ + "\u0000\u0000\u01f2\u0206\u0007\u0011\u0000\u0000\u01f3\u01f4\u0005@\u0000"+ + "\u0000\u01f4\u01f5\u0007\u0002\u0000\u0000\u01f5\u01f6\u0007\u0003\u0000"+ + "\u0000\u01f6\u01f7\u0007\u0004\u0000\u0000\u01f7\u01f8\u0007\u0011\u0000"+ + "\u0000\u01f8\u01f9\u0007\u0001\u0000\u0000\u01f9\u01fa\u0007\f\u0000\u0000"+ + "\u01fa\u01fb\u0007\t\u0000\u0000\u01fb\u0206\u0007\u000f\u0000\u0000\u01fc"+ + "\u01fd\u0005@\u0000\u0000\u01fd\u01fe\u0007\u0002\u0000\u0000\u01fe\u01ff"+ + "\u0007\u0003\u0000\u0000\u01ff\u0200\u0007\u0018\u0000\u0000\u0200\u0201"+ + "\u0007\u000e\u0000\u0000\u0201\u0202\u0007\u0007\u0000\u0000\u0202\u0203"+ + "\u0007\u0002\u0000\u0000\u0203\u0204\u0007\u0003\u0000\u0000\u0204\u0206"+ + "\u0007\u0011\u0000\u0000\u0205\u0198\u0001\u0000\u0000\u0000\u0205\u019f"+ + "\u0001\u0000\u0000\u0000\u0205\u01a0\u0001\u0000\u0000\u0000\u0205\u01a8"+ + "\u0001\u0000\u0000\u0000\u0205\u01ad\u0001\u0000\u0000\u0000\u0205\u01b3"+ + "\u0001\u0000\u0000\u0000\u0205\u01b9\u0001\u0000\u0000\u0000\u0205\u01c0"+ + "\u0001\u0000\u0000\u0000\u0205\u01c6\u0001\u0000\u0000\u0000\u0205\u01cc"+ + "\u0001\u0000\u0000\u0000\u0205\u01d2\u0001\u0000\u0000\u0000\u0205\u01d8"+ + "\u0001\u0000\u0000\u0000\u0205\u01e1\u0001\u0000\u0000\u0000\u0205\u01ea"+ + "\u0001\u0000\u0000\u0000\u0205\u01f3\u0001\u0000\u0000\u0000\u0205\u01fc"+ + "\u0001\u0000\u0000\u0000\u0206\u020a\u0001\u0000\u0000\u0000\u0207\u0209"+ + "\u0005 \u0000\u0000\u0208\u0207\u0001\u0000\u0000\u0000\u0209\u020c\u0001"+ + "\u0000\u0000\u0000\u020a\u0208\u0001\u0000\u0000\u0000\u020a\u020b\u0001"+ + "\u0000\u0000\u0000\u020b\u020d\u0001\u0000\u0000\u0000\u020c\u020a\u0001"+ + "\u0000\u0000\u0000\u020d\u020e\u0004\u0006\u0000\u0000\u020e\u020f\u0001"+ + "\u0000\u0000\u0000\u020f\u0210\u0006\u0006\u0000\u0000\u0210\u0211\u0006"+ + "\u0006\u0001\u0000\u0211\u0018\u0001\u0000\u0000\u0000\u0212\u0213\u0005"+ + "@\u0000\u0000\u0213\u0214\u0007\u0016\u0000\u0000\u0214\u0215\u0007\u0002"+ + "\u0000\u0000\u0215\u0216\u0007\u0003\u0000\u0000\u0216\u0217\u0007\u0004"+ + "\u0000\u0000\u0217\u0222\u0007\u0017\u0000\u0000\u0218\u0219\u0005@\u0000"+ + "\u0000\u0219\u021a\u0007\u0005\u0000\u0000\u021a\u021b\u0007\u0001\u0000"+ + "\u0000\u021b\u021c\u0007\f\u0000\u0000\u021c\u021d\u0007\u000b\u0000\u0000"+ + "\u021d\u021e\u0007\u0007\u0000\u0000\u021e\u021f\u0007\f\u0000\u0000\u021f"+ + "\u0220\u0007\u000e\u0000\u0000\u0220\u0222\u0007\u0003\u0000\u0000\u0221"+ + "\u0212\u0001\u0000\u0000\u0000\u0221\u0218\u0001\u0000\u0000\u0000\u0222"+ + "\u0223\u0001\u0000\u0000\u0000\u0223\u0224\u0006\u0007\u0001\u0000\u0224"+ + "\u001a\u0001\u0000\u0000\u0000\u0225\u0226\u0005@\u0000\u0000\u0226\u0227"+ + "\u0007\n\u0000\u0000\u0227\u0228\u0007\u000b\u0000\u0000\u0228\u0229\u0007"+ + "\u0001\u0000\u0000\u0229\u0251\u0007\r\u0000\u0000\u022a\u022b\u0005@"+ + "\u0000\u0000\u022b\u022c\u0007\n\u0000\u0000\u022c\u022d\u0007\u0006\u0000"+ + "\u0000\u022d\u022e\u0007\u0001\u0000\u0000\u022e\u0251\u0007\b\u0000\u0000"+ + "\u022f\u0230\u0005@\u0000\u0000\u0230\u0231\u0007\u0001\u0000\u0000\u0231"+ + "\u0232\u0007\u0019\u0000\u0000\u0232\u0233\u0007\u0003\u0000\u0000\u0233"+ + "\u0234\u0007\u0002\u0000\u0000\u0234\u0235\u0007\b\u0000\u0000\u0235\u0236"+ + "\u0007\u0002\u0000\u0000\u0236\u0237\u0007\u0007\u0000\u0000\u0237\u0238"+ + "\u0007\u000b\u0000\u0000\u0238\u0251\u0007\u0003\u0000\u0000\u0239\u023a"+ + "\u0005@\u0000\u0000\u023a\u023b\u0007\u0019\u0000\u0000\u023b\u023c\u0007"+ + "\u0007\u0000\u0000\u023c\u023d\u0007\u000b\u0000\u0000\u023d\u023e\u0007"+ + "\u0003\u0000\u0000\u023e\u023f\u0007\u0002\u0000\u0000\u023f\u0240\u0007"+ + "\u0003\u0000\u0000\u0240\u0241\u0007\u0004\u0000\u0000\u0241\u0242\u0007"+ + "\u0005\u0000\u0000\u0242\u0243\u0007\u000b\u0000\u0000\u0243\u0244\u0007"+ + "\u0002\u0000\u0000\u0244\u0245\u0007\u0003\u0000\u0000\u0245\u0246\u0007"+ + "\u0000\u0000\u0000\u0246\u0247\u0007\u0002\u0000\u0000\u0247\u0248\u0007"+ + "\u0003\u0000\u0000\u0248\u0249\u0007\n\u0000\u0000\u0249\u0251\u0007\u0006"+ + "\u0000\u0000\u024a\u024b\u0005@\u0000\u0000\u024b\u024c\u0007\u0003\u0000"+ + "\u0000\u024c\u024d\u0007\f\u0000\u0000\u024d\u024e\u0007\u0011\u0000\u0000"+ + "\u024e\u024f\u0001\u0000\u0000\u0000\u024f\u0251\u0003\u000b\u0000\u0000"+ + "\u0250\u0225\u0001\u0000\u0000\u0000\u0250\u022a\u0001\u0000\u0000\u0000"+ + "\u0250\u022f\u0001\u0000\u0000\u0000\u0250\u0239\u0001\u0000\u0000\u0000"+ + "\u0250\u024a\u0001\u0000\u0000\u0000\u0251\u0252\u0001\u0000\u0000\u0000"+ + "\u0252\u0253\u0006\b\u0001\u0000\u0253\u001c\u0001\u0000\u0000\u0000\u0254"+ + "\u0255\u0005@\u0000\u0000\u0255\u0256\u0007\u0019\u0000\u0000\u0256\u0257"+ + "\u0007\u0003\u0000\u0000\u0257\u0258\u0007\u0002\u0000\u0000\u0258\u0259"+ + "\u0007\u0016\u0000\u0000\u0259\u025a\u0007\u0004\u0000\u0000\u025a\u025b"+ + "\u0007\u000b\u0000\u0000\u025b\u025c\u0007\u0007\u0000\u0000\u025c\u025d"+ + "\u0007\u0012\u0000\u0000\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u025f"+ + "\u0006\t\u0002\u0000\u025f\u0260\u0006\t\u0001\u0000\u0260\u001e\u0001"+ + "\u0000\u0000\u0000\u0261\u0262\u0005@\u0000\u0000\u0262\u0263\u0007\u0003"+ + "\u0000\u0000\u0263\u0264\u0007\f\u0000\u0000\u0264\u0265\u0007\u0011\u0000"+ + "\u0000\u0265\u0266\u0007\u0019\u0000\u0000\u0266\u0267\u0007\u0003\u0000"+ + "\u0000\u0267\u0268\u0007\u0002\u0000\u0000\u0268\u0269\u0007\u0016\u0000"+ + "\u0000\u0269\u026a\u0007\u0004\u0000\u0000\u026a\u026b\u0007\u000b\u0000"+ + "\u0000\u026b\u026c\u0007\u0007\u0000\u0000\u026c\u026d\u0007\u0012\u0000"+ + "\u0000\u026d\u026e\u0001\u0000\u0000\u0000\u026e\u026f\u0006\n\u0001\u0000"+ + "\u026f \u0001\u0000\u0000\u0000\u0270\u0271\u0005@\u0000\u0000\u0271\u0272"+ + "\u0007\u0011\u0000\u0000\u0272\u0288\u0007\u0011\u0000\u0000\u0273\u0274"+ + "\u0005@\u0000\u0000\u0274\u0275\u0007\u0011\u0000\u0000\u0275\u0276\u0007"+ + "\u000e\u0000\u0000\u0276\u0277\u0007\u0012\u0000\u0000\u0277\u0288\u0007"+ + "\r\u0000\u0000\u0278\u0279\u0005@\u0000\u0000\u0279\u027a\u0007\u001a"+ + "\u0000\u0000\u027a\u0288\u0007\n\u0000\u0000\u027b\u027c\u0005@\u0000"+ + "\u0000\u027c\u027d\u0007\u001a\u0000\u0000\u027d\u027e\u0007\n\u0000\u0000"+ + "\u027e\u027f\u0007\u0001\u0000\u0000\u027f\u0288\u0007\f\u0000\u0000\u0280"+ + "\u0281\u0005@\u0000\u0000\u0281\u0282\u0007\u0007\u0000\u0000\u0282\u0283"+ + "\u0007\f\u0000\u0000\u0283\u0284\u0007\u001a\u0000\u0000\u0284\u0285\u0007"+ + "\u0003\u0000\u0000\u0285\u0286\u0007\u0005\u0000\u0000\u0286\u0288\u0007"+ + "\u000b\u0000\u0000\u0287\u0270\u0001\u0000\u0000\u0000\u0287\u0273\u0001"+ + "\u0000\u0000\u0000\u0287\u0278\u0001\u0000\u0000\u0000\u0287\u027b\u0001"+ + "\u0000\u0000\u0000\u0287\u0280\u0001\u0000\u0000\u0000\u0288\u0289\u0001"+ + "\u0000\u0000\u0000\u0289\u028a\u0006\u000b\u0000\u0000\u028a\u028b\u0006"+ + "\u000b\u0001\u0000\u028b\"\u0001\u0000\u0000\u0000\u028c\u028d\u0005@"+ + "\u0000\u0000\u028d\u028e\u0007\u0003\u0000\u0000\u028e\u028f\u0007\t\u0000"+ + "\u0000\u028f\u0290\u0007\n\u0000\u0000\u0290\u02ad\u0007\u0003\u0000\u0000"+ + "\u0291\u0292\u0005@\u0000\u0000\u0292\u0293\u0007\u0005\u0000\u0000\u0293"+ + "\u0294\u0007\n\u0000\u0000\u0294\u0295\u0007\u0002\u0000\u0000\u0295\u02ad"+ + "\u0007\u0000\u0000\u0000\u0296\u0297\u0005@\u0000\u0000\u0297\u0298\u0007"+ + "\u0011\u0000\u0000\u0298\u0299\u0007\u0003\u0000\u0000\u0299\u029a\u0007"+ + "\u0000\u0000\u0000\u029a\u029b\u0007\u0004\u0000\u0000\u029b\u029c\u0007"+ + "\u000e\u0000\u0000\u029c\u029d\u0007\t\u0000\u0000\u029d\u02ad\u0007\u000b"+ + "\u0000\u0000\u029e\u029f\u0005@\u0000\u0000\u029f\u02a0\u0007\u0004\u0000"+ + "\u0000\u02a0\u02a1\u0007\r\u0000\u0000\u02a1\u02a2\u0007\r\u0000\u0000"+ + "\u02a2\u02a3\u0007\u0003\u0000\u0000\u02a3\u02a4\u0007\f\u0000\u0000\u02a4"+ + "\u02ad\u0007\u0011\u0000\u0000\u02a5\u02a6\u0005@\u0000\u0000\u02a6\u02a7"+ + "\u0007\r\u0000\u0000\u02a7\u02a8\u0007\u0004\u0000\u0000\u02a8\u02a9\u0007"+ + "\u0002\u0000\u0000\u02a9\u02aa\u0007\u0003\u0000\u0000\u02aa\u02ab\u0007"+ + "\f\u0000\u0000\u02ab\u02ad\u0007\u000b\u0000\u0000\u02ac\u028c\u0001\u0000"+ + "\u0000\u0000\u02ac\u0291\u0001\u0000\u0000\u0000\u02ac\u0296\u0001\u0000"+ + "\u0000\u0000\u02ac\u029e\u0001\u0000\u0000\u0000\u02ac\u02a5\u0001\u0000"+ + "\u0000\u0000\u02ad\u02ae\u0001\u0000\u0000\u0000\u02ae\u02af\u0006\f\u0001"+ + "\u0000\u02af$\u0001\u0000\u0000\u0000\u02b0\u02b1\u0005@\u0000\u0000\u02b1"+ + "\u02b2\u0007\r\u0000\u0000\u02b2\u02b3\u0007\u0006\u0000\u0000\u02b3\u02b4"+ + "\u0007\r\u0000\u0000\u02b4\u02b6\u0001\u0000\u0000\u0000\u02b5\u02b7\u0005"+ + " \u0000\u0000\u02b6\u02b5\u0001\u0000\u0000\u0000\u02b6\u02b7\u0001\u0000"+ + "\u0000\u0000\u02b7\u02b8\u0001\u0000\u0000\u0000\u02b8\u02b9\u0004\r\u0001"+ + "\u0000\u02b9\u02ba\u0001\u0000\u0000\u0000\u02ba\u02bb\u0006\r\u0003\u0000"+ + "\u02bb\u02bc\u0006\r\u0000\u0000\u02bc&\u0001\u0000\u0000\u0000\u02bd"+ + "\u02be\u0005@\u0000\u0000\u02be\u02bf\u0007\r\u0000\u0000\u02bf\u02c0"+ + "\u0007\u0006\u0000\u0000\u02c0\u02c1\u0007\r\u0000\u0000\u02c1\u02c2\u0001"+ + "\u0000\u0000\u0000\u02c2\u02c3\u0006\u000e\u0004\u0000\u02c3(\u0001\u0000"+ + "\u0000\u0000\u02c4\u02c5\u0005@\u0000\u0000\u02c5\u02c6\u0007\u0003\u0000"+ + "\u0000\u02c6\u02c7\u0007\f\u0000\u0000\u02c7\u02c8\u0007\u0011\u0000\u0000"+ + "\u02c8\u02c9\u0001\u0000\u0000\u0000\u02c9\u02ca\u0003I\u001f\u0000\u02ca"+ + "\u02cb\u0001\u0000\u0000\u0000\u02cb\u02cc\u0006\u000f\u0000\u0000\u02cc"+ + "\u02cd\u0006\u000f\u0001\u0000\u02cd*\u0001\u0000\u0000\u0000\u02ce\u02cf"+ + "\u0005@\u0000\u0000\u02cf\u02d0\u0007\t\u0000\u0000\u02d0\u02d1\u0007"+ + "\u0007\u0000\u0000\u02d1\u02d2\u0007\u0019\u0000\u0000\u02d2\u02d3\u0007"+ + "\u0003\u0000\u0000\u02d3\u02d4\u0007\b\u0000\u0000\u02d4\u02d5\u0007\u0007"+ + "\u0000\u0000\u02d5\u02d6\u0007\u0002\u0000\u0000\u02d6\u02d7\u0007\u0003"+ + "\u0000\u0000\u02d7\u02d8\u0007\n\u0000\u0000\u02d8\u02d9\u0007\u000b\u0000"+ + "\u0000\u02d9\u02da\u0007\u000f\u0000\u0000\u02da\u02db\u0007\t\u0000\u0000"+ + "\u02db\u02dc\u0007\u0003\u0000\u0000\u02dc\u0312\u0007\n\u0000\u0000\u02dd"+ + "\u02de\u0005@\u0000\u0000\u02de\u02df\u0007\u0016\u0000\u0000\u02df\u02e0"+ + "\u0007\u000e\u0000\u0000\u02e0\u02e1\u0007\u0017\u0000\u0000\u02e1\u02e2"+ + "\u0007\n\u0000\u0000\u02e2\u02e3\u0007\u000b\u0000\u0000\u02e3\u02e4\u0007"+ + "\u000f\u0000\u0000\u02e4\u02e5\u0007\t\u0000\u0000\u02e5\u02e6\u0007\u0003"+ + "\u0000\u0000\u02e6\u0312\u0007\n\u0000\u0000\u02e7\u02e8\u0005@\u0000"+ + "\u0000\u02e8\u02e9\u0007\t\u0000\u0000\u02e9\u02ea\u0007\u0007\u0000\u0000"+ + "\u02ea\u02eb\u0007\u0019\u0000\u0000\u02eb\u02ec\u0007\u0003\u0000\u0000"+ + "\u02ec\u02ed\u0007\b\u0000\u0000\u02ed\u02ee\u0007\u0007\u0000\u0000\u02ee"+ + "\u02ef\u0007\u0002\u0000\u0000\u02ef\u02f0\u0007\u0003\u0000\u0000\u02f0"+ + "\u02f1\u0007\n\u0000\u0000\u02f1\u02f2\u0007\u0005\u0000\u0000\u02f2\u02f3"+ + "\u0007\u0002\u0000\u0000\u02f3\u02f4\u0007\u0007\u0000\u0000\u02f4\u02f5"+ + "\u0007\r\u0000\u0000\u02f5\u02f6\u0007\u000b\u0000\u0000\u02f6\u0312\u0007"+ + "\n\u0000\u0000\u02f7\u02f8\u0005@\u0000\u0000\u02f8\u02f9\u0007\u0016"+ + "\u0000\u0000\u02f9\u02fa\u0007\u000e\u0000\u0000\u02fa\u02fb\u0007\u0017"+ + "\u0000\u0000\u02fb\u02fc\u0007\n\u0000\u0000\u02fc\u02fd\u0007\u0005\u0000"+ + "\u0000\u02fd\u02fe\u0007\u0002\u0000\u0000\u02fe\u02ff\u0007\u0007\u0000"+ + "\u0000\u02ff\u0300\u0007\r\u0000\u0000\u0300\u0301\u0007\u000b\u0000\u0000"+ + "\u0301\u0312\u0007\n\u0000\u0000\u0302\u0303\u0005@\u0000\u0000\u0303"+ + "\u0304\u0007\u0005\u0000\u0000\u0304\u0305\u0007\t\u0000\u0000\u0305\u0306"+ + "\u0007\u0007\u0000\u0000\u0306\u0307\u0007\u0005\u0000\u0000\u0307\u0308"+ + "\u0007\u0017\u0000\u0000\u0308\u030e\u0001\u0000\u0000\u0000\u0309\u030a"+ + "\u0005.\u0000\u0000\u030a\u030b\u0007\u0004\u0000\u0000\u030b\u030c\u0007"+ + "\b\u0000\u0000\u030c\u030d\u0007\u0004\u0000\u0000\u030d\u030f\u0007\u000f"+ + "\u0000\u0000\u030e\u0309\u0001\u0000\u0000\u0000\u030e\u030f\u0001\u0000"+ + "\u0000\u0000\u030f\u0310\u0001\u0000\u0000\u0000\u0310\u0312\u0005=\u0000"+ + "\u0000\u0311\u02ce\u0001\u0000\u0000\u0000\u0311\u02dd\u0001\u0000\u0000"+ + "\u0000\u0311\u02e7\u0001\u0000\u0000\u0000\u0311\u02f7\u0001\u0000\u0000"+ + "\u0000\u0311\u0302\u0001\u0000\u0000\u0000\u0312\u0313\u0001\u0000\u0000"+ + "\u0000\u0313\u0314\u0006\u0010\u0001\u0000\u0314,\u0001\u0000\u0000\u0000"+ + "\u0315\u0316\u0005@\u0000\u0000\u0316\u0317\u0007\u0019\u0000\u0000\u0317"+ + "\u0318\u0007\u0007\u0000\u0000\u0318\u0319\u0007\u000b\u0000\u0000\u0319"+ + "\u031a\u0007\u0003\u0000\u0000\u031a\u031b\u0001\u0000\u0000\u0000\u031b"+ + "\u031c\u0006\u0011\u0000\u0000\u031c\u031d\u0006\u0011\u0001\u0000\u031d"+ + ".\u0001\u0000\u0000\u0000\u031e\u031f\u0005@\u0000\u0000\u031f\u0320\u0003"+ + "I\u001f\u0000\u0320\u0321\u0004\u0012\u0002\u0000\u0321\u0322\u0001\u0000"+ + "\u0000\u0000\u0322\u0323\u0006\u0012\u0000\u0000\u03230\u0001\u0000\u0000"+ + "\u0000\u0324\u0325\u0005@\u0000\u0000\u0325\u0326\u0003I\u001f\u0000\u0326"+ + "2\u0001\u0000\u0000\u0000\u0327\u0329\u0005@\u0000\u0000\u0328\u032a\u0007"+ + "\u001b\u0000\u0000\u0329\u0328\u0001\u0000\u0000\u0000\u0329\u032a\u0001"+ + "\u0000\u0000\u0000\u032a4\u0001\u0000\u0000\u0000\u032b\u032c\u0005{\u0000"+ + "\u0000\u032c\u032d\u0005{\u0000\u0000\u032d\u032e\u0001\u0000\u0000\u0000"+ + "\u032e\u032f\u0006\u0015\u0005\u0000\u032f\u0330\u0006\u0015\u0006\u0000"+ + "\u03306\u0001\u0000\u0000\u0000\u0331\u0332\u0005{\u0000\u0000\u0332\u0333"+ + "\u0005!\u0000\u0000\u0333\u0334\u0005!\u0000\u0000\u0334\u0335\u0001\u0000"+ + "\u0000\u0000\u0335\u0336\u0006\u0016\u0007\u0000\u0336\u0337\u0006\u0016"+ + "\b\u0000\u03378\u0001\u0000\u0000\u0000\u0338\u0339\u0005/\u0000\u0000"+ + "\u0339\u033a\u0005*\u0000\u0000\u033a\u033e\u0001\u0000\u0000\u0000\u033b"+ + "\u033d\t\u0000\u0000\u0000\u033c\u033b\u0001\u0000\u0000\u0000\u033d\u0340"+ + "\u0001\u0000\u0000\u0000\u033e\u033f\u0001\u0000\u0000\u0000\u033e\u033c"+ + "\u0001\u0000\u0000\u0000\u033f\u0341\u0001\u0000\u0000\u0000\u0340\u033e"+ + "\u0001\u0000\u0000\u0000\u0341\u0342\u0005*\u0000\u0000\u0342\u0346\u0005"+ + "/\u0000\u0000\u0343\u0344\u0005/\u0000\u0000\u0344\u0346\u0005/\u0000"+ + "\u0000\u0345\u0338\u0001\u0000\u0000\u0000\u0345\u0343\u0001\u0000\u0000"+ + "\u0000\u0346\u0347\u0001\u0000\u0000\u0000\u0347\u0348\u0006\u0017\t\u0000"+ + "\u0348:\u0001\u0000\u0000\u0000\u0349\u034a\u0005<\u0000\u0000\u034a\u034b"+ + "\u0007\u0015\u0000\u0000\u034b\u034c\u0005-\u0000\u0000\u034c\u034d\u0001"+ + "\u0000\u0000\u0000\u034d\u0359\u0003\u000f\u0002\u0000\u034e\u034f\u0005"+ + "<\u0000\u0000\u034f\u0354\u0003\u000f\u0002\u0000\u0350\u0351\u0005:\u0000"+ + "\u0000\u0351\u0352\u0005:\u0000\u0000\u0352\u0353\u0001\u0000\u0000\u0000"+ + "\u0353\u0355\u0003\u000f\u0002\u0000\u0354\u0350\u0001\u0000\u0000\u0000"+ + "\u0355\u0356\u0001\u0000\u0000\u0000\u0356\u0354\u0001\u0000\u0000\u0000"+ + "\u0356\u0357\u0001\u0000\u0000\u0000\u0357\u0359\u0001\u0000\u0000\u0000"+ + "\u0358\u0349\u0001\u0000\u0000\u0000\u0358\u034e\u0001\u0000\u0000\u0000"+ + "\u0359\u035a\u0001\u0000\u0000\u0000\u035a\u035b\u0006\u0018\t\u0000\u035b"+ + "\u035c\u0006\u0018\n\u0000\u035c<\u0001\u0000\u0000\u0000\u035d\u035e"+ + "\u0005<\u0000\u0000\u035e\u035f\u0005/\u0000\u0000\u035f\u0360\u0001\u0000"+ + "\u0000\u0000\u0360\u0361\u0003M!\u0000\u0361\u0365\u0005>\u0000\u0000"+ + "\u0362\u0364\u0007\u001c\u0000\u0000\u0363\u0362\u0001\u0000\u0000\u0000"+ + "\u0364\u0367\u0001\u0000\u0000\u0000\u0365\u0363\u0001\u0000\u0000\u0000"+ + "\u0365\u0366\u0001\u0000\u0000\u0000\u0366\u0369\u0001\u0000\u0000\u0000"+ + "\u0367\u0365\u0001\u0000\u0000\u0000\u0368\u035d\u0001\u0000\u0000\u0000"+ + "\u0369\u036a\u0001\u0000\u0000\u0000\u036a\u0368\u0001\u0000\u0000\u0000"+ + "\u036a\u036b\u0001\u0000\u0000\u0000\u036b\u036c\u0001\u0000\u0000\u0000"+ + "\u036c\u036d\u0006\u0019\t\u0000\u036d>\u0001\u0000\u0000\u0000\u036e"+ + "\u0370\u0005 \u0000\u0000\u036f\u036e\u0001\u0000\u0000\u0000\u0370\u0371"+ + "\u0001\u0000\u0000\u0000\u0371\u036f\u0001\u0000\u0000\u0000\u0371\u0372"+ + "\u0001\u0000\u0000\u0000\u0372\u0388\u0001\u0000\u0000\u0000\u0373\u0375"+ + "\u0007\u001d\u0000\u0000\u0374\u0373\u0001\u0000\u0000\u0000\u0375\u0376"+ + "\u0001\u0000\u0000\u0000\u0376\u0374\u0001\u0000\u0000\u0000\u0376\u0377"+ + "\u0001\u0000\u0000\u0000\u0377\u0388\u0001\u0000\u0000\u0000\u0378\u0388"+ + "\u0003\u000f\u0002\u0000\u0379\u0388\u0003\u0011\u0003\u0000\u037a\u037b"+ + "\u0005\"\u0000\u0000\u037b\u0388\u0004\u001a\u0003\u0000\u037c\u037d\u0005"+ + "\\\u0000\u0000\u037d\u037e\u0005\'\u0000\u0000\u037e\u037f\u0001\u0000"+ + "\u0000\u0000\u037f\u0388\u0004\u001a\u0004\u0000\u0380\u0388\u0007\u001e"+ + "\u0000\u0000\u0381\u0383\u0007\u001f\u0000\u0000\u0382\u0381\u0001\u0000"+ + "\u0000\u0000\u0383\u0384\u0001\u0000\u0000\u0000\u0384\u0382\u0001\u0000"+ + "\u0000\u0000\u0384\u0385\u0001\u0000\u0000\u0000\u0385\u0388\u0001\u0000"+ + "\u0000\u0000\u0386\u0388\u0007 \u0000\u0000\u0387\u036f\u0001\u0000\u0000"+ + "\u0000\u0387\u0374\u0001\u0000\u0000\u0000\u0387\u0378\u0001\u0000\u0000"+ + "\u0000\u0387\u0379\u0001\u0000\u0000\u0000\u0387\u037a\u0001\u0000\u0000"+ + "\u0000\u0387\u037c\u0001\u0000\u0000\u0000\u0387\u0380\u0001\u0000\u0000"+ + "\u0000\u0387\u0382\u0001\u0000\u0000\u0000\u0387\u0386\u0001\u0000\u0000"+ + "\u0000\u0388\u038b\u0001\u0000\u0000\u0000\u0389\u0387\u0001\u0000\u0000"+ + "\u0000\u0389\u038a\u0001\u0000\u0000\u0000\u038a\u038c\u0001\u0000\u0000"+ + "\u0000\u038b\u0389\u0001\u0000\u0000\u0000\u038c\u038d\u0005<\u0000\u0000"+ + "\u038d\u038e\u0004\u001a\u0005\u0000\u038e\u038f\u0001\u0000\u0000\u0000"+ + "\u038f\u0390\u0006\u001a\u000b\u0000\u0390\u0391\u0006\u001a\f\u0000\u0391"+ + "@\u0001\u0000\u0000\u0000\u0392\u0394\u0005 \u0000\u0000\u0393\u0392\u0001"+ + "\u0000\u0000\u0000\u0394\u0395\u0001\u0000\u0000\u0000\u0395\u0393\u0001"+ + "\u0000\u0000\u0000\u0395\u0396\u0001\u0000\u0000\u0000\u0396\u03ae\u0001"+ + "\u0000\u0000\u0000\u0397\u0399\u0007\u001d\u0000\u0000\u0398\u0397\u0001"+ + "\u0000\u0000\u0000\u0399\u039a\u0001\u0000\u0000\u0000\u039a\u0398\u0001"+ + "\u0000\u0000\u0000\u039a\u039b\u0001\u0000\u0000\u0000\u039b\u03ae\u0001"+ + "\u0000\u0000\u0000\u039c\u039e\u0007!\u0000\u0000\u039d\u039c\u0001\u0000"+ + "\u0000\u0000\u039d\u039e\u0001\u0000\u0000\u0000\u039e\u039f\u0001\u0000"+ + "\u0000\u0000\u039f\u03ae\u0003\u000f\u0002\u0000\u03a0\u03ae\u0003\u0011"+ + "\u0003\u0000\u03a1\u03a2\u0005\"\u0000\u0000\u03a2\u03ae\u0004\u001b\u0006"+ + "\u0000\u03a3\u03ae\u0005,\u0000\u0000\u03a4\u03a5\u0005\\\u0000\u0000"+ + "\u03a5\u03ae\u0005\'\u0000\u0000\u03a6\u03ae\u0007\"\u0000\u0000\u03a7"+ + "\u03a9\u0007\u001f\u0000\u0000\u03a8\u03a7\u0001\u0000\u0000\u0000\u03a9"+ + "\u03aa\u0001\u0000\u0000\u0000\u03aa\u03a8\u0001\u0000\u0000\u0000\u03aa"+ + "\u03ab\u0001\u0000\u0000\u0000\u03ab\u03ae\u0001\u0000\u0000\u0000\u03ac"+ + "\u03ae\u0007 \u0000\u0000\u03ad\u0393\u0001\u0000\u0000\u0000\u03ad\u0398"+ + "\u0001\u0000\u0000\u0000\u03ad\u039d\u0001\u0000\u0000\u0000\u03ad\u03a0"+ + "\u0001\u0000\u0000\u0000\u03ad\u03a1\u0001\u0000\u0000\u0000\u03ad\u03a3"+ + "\u0001\u0000\u0000\u0000\u03ad\u03a4\u0001\u0000\u0000\u0000\u03ad\u03a6"+ + "\u0001\u0000\u0000\u0000\u03ad\u03a8\u0001\u0000\u0000\u0000\u03ad\u03ac"+ + "\u0001\u0000\u0000\u0000\u03ae\u03af\u0001\u0000\u0000\u0000\u03af\u03ad"+ + "\u0001\u0000\u0000\u0000\u03af\u03b0\u0001\u0000\u0000\u0000\u03b0\u03b1"+ + "\u0001\u0000\u0000\u0000\u03b1\u03b2\u0006\u001b\t\u0000\u03b2B\u0001"+ + "\u0000\u0000\u0000\u03b3\u03b5\u0005 \u0000\u0000\u03b4\u03b3\u0001\u0000"+ + "\u0000\u0000\u03b5\u03b6\u0001\u0000\u0000\u0000\u03b6\u03b4\u0001\u0000"+ + "\u0000\u0000\u03b6\u03b7\u0001\u0000\u0000\u0000\u03b7\u03be\u0001\u0000"+ + "\u0000\u0000\u03b8\u03ba\u0007\u001d\u0000\u0000\u03b9\u03b8\u0001\u0000"+ + "\u0000\u0000\u03ba\u03bb\u0001\u0000\u0000\u0000\u03bb\u03b9\u0001\u0000"+ + "\u0000\u0000\u03bb\u03bc\u0001\u0000\u0000\u0000\u03bc\u03be\u0001\u0000"+ + "\u0000\u0000\u03bd\u03b4\u0001\u0000\u0000\u0000\u03bd\u03b9\u0001\u0000"+ + "\u0000\u0000\u03be\u03bf\u0001\u0000\u0000\u0000\u03bf\u03c0\u0006\u001c"+ + "\t\u0000\u03c0D\u0001\u0000\u0000\u0000\u03c1\u03c2\u0005{\u0000\u0000"+ + "\u03c2\u03c7\u0005!\u0000\u0000\u03c3\u03c4\u0005{\u0000\u0000\u03c4\u03c5"+ + "\u0005{\u0000\u0000\u03c5\u03c7\u0005-\u0000\u0000\u03c6\u03c1\u0001\u0000"+ + "\u0000\u0000\u03c6\u03c3\u0001\u0000\u0000\u0000\u03c7\u03c8\u0001\u0000"+ + "\u0000\u0000\u03c8\u03c9\u0006\u001d\t\u0000\u03c9F\u0001\u0000\u0000"+ + "\u0000\u03ca\u03cb\t\u0000\u0000\u0000\u03cb\u03cc\u0001\u0000\u0000\u0000"+ + "\u03cc\u03cd\u0006\u001e\t\u0000\u03cdH\u0001\u0000\u0000\u0000\u03ce"+ + "\u03d2\u0007\u0013\u0000\u0000\u03cf\u03d1\u0007#\u0000\u0000\u03d0\u03cf"+ + "\u0001\u0000\u0000\u0000\u03d1\u03d4\u0001\u0000\u0000\u0000\u03d2\u03d0"+ + "\u0001\u0000\u0000\u0000\u03d2\u03d3\u0001\u0000\u0000\u0000\u03d3J\u0001"+ + "\u0000\u0000\u0000\u03d4\u03d2\u0001\u0000\u0000\u0000\u03d5\u03d9\u0007"+ + "$\u0000\u0000\u03d6\u03d8\u0007%\u0000\u0000\u03d7\u03d6\u0001\u0000\u0000"+ + "\u0000\u03d8\u03db\u0001\u0000\u0000\u0000\u03d9\u03d7\u0001\u0000\u0000"+ + "\u0000\u03d9\u03da\u0001\u0000\u0000\u0000\u03daL\u0001\u0000\u0000\u0000"+ + "\u03db\u03d9\u0001\u0000\u0000\u0000\u03dc\u03e0\u0007\u0013\u0000\u0000"+ + "\u03dd\u03df\u0007&\u0000\u0000\u03de\u03dd\u0001\u0000\u0000\u0000\u03df"+ + "\u03e2\u0001\u0000\u0000\u0000\u03e0\u03de\u0001\u0000\u0000\u0000\u03e0"+ + "\u03e1\u0001\u0000\u0000\u0000\u03e1N\u0001\u0000\u0000\u0000\u03e2\u03e0"+ + "\u0001\u0000\u0000\u0000\u03e3\u03e4\u0007\'\u0000\u0000\u03e4P\u0001"+ + "\u0000\u0000\u0000\u03e5\u03ea\u0005\"\u0000\u0000\u03e6\u03e9\u0003O"+ + "\"\u0000\u03e7\u03e9\t\u0000\u0000\u0000\u03e8\u03e6\u0001\u0000\u0000"+ + "\u0000\u03e8\u03e7\u0001\u0000\u0000\u0000\u03e9\u03ec\u0001\u0000\u0000"+ + "\u0000\u03ea\u03eb\u0001\u0000\u0000\u0000\u03ea\u03e8\u0001\u0000\u0000"+ + "\u0000\u03eb\u03ed\u0001\u0000\u0000\u0000\u03ec\u03ea\u0001\u0000\u0000"+ + "\u0000\u03ed\u03ee\u0005\"\u0000\u0000\u03eeR\u0001\u0000\u0000\u0000"+ + "\u03ef\u03f5\u0005\'\u0000\u0000\u03f0\u03f4\b(\u0000\u0000\u03f1\u03f2"+ + "\u0005\\\u0000\u0000\u03f2\u03f4\t\u0000\u0000\u0000\u03f3\u03f0\u0001"+ + "\u0000\u0000\u0000\u03f3\u03f1\u0001\u0000\u0000\u0000\u03f4\u03f7\u0001"+ + "\u0000\u0000\u0000\u03f5\u03f3\u0001\u0000\u0000\u0000\u03f5\u03f6\u0001"+ + "\u0000\u0000\u0000\u03f6\u03f8\u0001\u0000\u0000\u0000\u03f7\u03f5\u0001"+ + "\u0000\u0000\u0000\u03f8\u03f9\u0005\'\u0000\u0000\u03f9T\u0001\u0000"+ + "\u0000\u0000\u03fa\u03fb\u0005/\u0000\u0000\u03fb\u03fc\u0005/\u0000\u0000"+ + "\u03fc\u0400\u0001\u0000\u0000\u0000\u03fd\u03ff\b\u001d\u0000\u0000\u03fe"+ + "\u03fd\u0001\u0000\u0000\u0000\u03ff\u0402\u0001\u0000\u0000\u0000\u0400"+ + "\u03fe\u0001\u0000\u0000\u0000\u0400\u0401\u0001\u0000\u0000\u0000\u0401"+ + "V\u0001\u0000\u0000\u0000\u0402\u0400\u0001\u0000\u0000\u0000\u0403\u0404"+ + "\u0005$\u0000\u0000\u0404\u0405\u0003I\u001f\u0000\u0405X\u0001\u0000"+ + "\u0000\u0000\u0406\u0407\u0007\u0004\u0000\u0000\u0407\u0408\u0007\u0002"+ + "\u0000\u0000\u0408\u0409\u0007\u0002\u0000\u0000\u0409\u040a\u0007\u0004"+ + "\u0000\u0000\u040a\u0419\u0007\u000f\u0000\u0000\u040b\u040c\u0007\u0005"+ + "\u0000\u0000\u040c\u040d\u0007\t\u0000\u0000\u040d\u040e\u0007\u0004\u0000"+ + "\u0000\u040e\u040f\u0007\n\u0000\u0000\u040f\u0419\u0007\n\u0000\u0000"+ + "\u0410\u0411\u0007\u0003\u0000\u0000\u0411\u0412\u0007\u0012\u0000\u0000"+ + "\u0412\u0413\u0007\r\u0000\u0000\u0413\u0414\u0007\u000b\u0000\u0000\u0414"+ + "\u0419\u0007\u000f\u0000\u0000\u0415\u0416\u0007\u000e\u0000\u0000\u0416"+ + "\u0417\u0007\n\u0000\u0000\u0417\u0419\u0007\u0003\u0000\u0000\u0418\u0406"+ + "\u0001\u0000\u0000\u0000\u0418\u040b\u0001\u0000\u0000\u0000\u0418\u0410"+ + "\u0001\u0000\u0000\u0000\u0418\u0415\u0001\u0000\u0000\u0000\u0419Z\u0001"+ + "\u0000\u0000\u0000\u041a\u041b\u000209\u0000\u041b\\\u0001\u0000\u0000"+ + "\u0000\u041c\u041d\u0005{\u0000\u0000\u041d\u041e\u0005{\u0000\u0000\u041e"+ + "\u041f\u0005-\u0000\u0000\u041f\u0420\u0005-\u0000\u0000\u0420\u0421\u0001"+ + "\u0000\u0000\u0000\u0421\u0422\u0006)\r\u0000\u0422^\u0001\u0000\u0000"+ + "\u0000\u0423\u0424\u0005@\u0000\u0000\u0424\u0425\u0003M!\u0000\u0425"+ + "\u0426\u0005.\u0000\u0000\u0426\u0427\u0001\u0000\u0000\u0000\u0427\u0428"+ + "\u0006*\t\u0000\u0428`\u0001\u0000\u0000\u0000\u0429\u042e\u0005@\u0000"+ + "\u0000\u042a\u042c\u0003[(\u0000\u042b\u042d\u0005.\u0000\u0000\u042c"+ + "\u042b\u0001\u0000\u0000\u0000\u042c\u042d\u0001\u0000\u0000\u0000\u042d"+ + "\u042f\u0001\u0000\u0000\u0000\u042e\u042a\u0001\u0000\u0000\u0000\u042f"+ + "\u0430\u0001\u0000\u0000\u0000\u0430\u042e\u0001\u0000\u0000\u0000\u0430"+ + "\u0431\u0001\u0000\u0000\u0000\u0431\u0432\u0001\u0000\u0000\u0000\u0432"+ + "\u0433\u0006+\t\u0000\u0433b\u0001\u0000\u0000\u0000\u0434\u0435\u0005"+ + "{\u0000\u0000\u0435\u0436\u0005{\u0000\u0000\u0436\u056a\u0005{\u0000"+ + "\u0000\u0437\u0438\u0005@\u0000\u0000\u0438\u0439\u0005@\u0000\u0000\u0439"+ + "\u043b\u0001\u0000\u0000\u0000\u043a\u043c\u0005@\u0000\u0000\u043b\u043a"+ + "\u0001\u0000\u0000\u0000\u043b\u043c\u0001\u0000\u0000\u0000\u043c\u056a"+ + "\u0001\u0000\u0000\u0000\u043d\u043e\u0005@\u0000\u0000\u043e\u043f\u0005"+ + "{\u0000\u0000\u043f\u0441\u0001\u0000\u0000\u0000\u0440\u0442\u0005{\u0000"+ + "\u0000\u0441\u0440\u0001\u0000\u0000\u0000\u0441\u0442\u0001\u0000\u0000"+ + "\u0000\u0442\u056a\u0001\u0000\u0000\u0000\u0443\u0444\u0005@\u0000\u0000"+ + "\u0444\u0445\u0007\u0012\u0000\u0000\u0445\u0446\u0007\u0003\u0000\u0000"+ + "\u0446\u0447\u0007\u0011\u0000\u0000\u0447\u0448\u0007\u0007\u0000\u0000"+ + "\u0448\u0449\u0007\u0004\u0000\u0000\u0449\u044b\u0001\u0000\u0000\u0000"+ + "\u044a\u044c\u0007)\u0000\u0000\u044b\u044a\u0001\u0000\u0000\u0000\u044c"+ + "\u044d\u0001\u0000\u0000\u0000\u044d\u044b\u0001\u0000\u0000\u0000\u044d"+ + "\u044e\u0001\u0000\u0000\u0000\u044e\u0460\u0001\u0000\u0000\u0000\u044f"+ + "\u0450\u0007\n\u0000\u0000\u0450\u0451\u0007\u0005\u0000\u0000\u0451\u0452"+ + "\u0007\u0002\u0000\u0000\u0452\u0453\u0007\u0003\u0000\u0000\u0453\u0454"+ + "\u0007\u0003\u0000\u0000\u0454\u0455\u0007\f\u0000\u0000\u0455\u0457\u0001"+ + "\u0000\u0000\u0000\u0456\u0458\u0007)\u0000\u0000\u0457\u0456\u0001\u0000"+ + "\u0000\u0000\u0458\u0459\u0001\u0000\u0000\u0000\u0459\u0457\u0001\u0000"+ + "\u0000\u0000\u0459\u045a\u0001\u0000\u0000\u0000\u045a\u045e\u0001\u0000"+ + "\u0000\u0000\u045b\u045c\u0007\u0004\u0000\u0000\u045c\u045d\u0007\f\u0000"+ + "\u0000\u045d\u045f\u0007\u0011\u0000\u0000\u045e\u045b\u0001\u0000\u0000"+ + "\u0000\u045e\u045f\u0001\u0000\u0000\u0000\u045f\u0461\u0001\u0000\u0000"+ + "\u0000\u0460\u044f\u0001\u0000\u0000\u0000\u0460\u0461\u0001\u0000\u0000"+ + "\u0000\u0461\u056a\u0001\u0000\u0000\u0000\u0462\u0463\u0005@\u0000\u0000"+ + "\u0463\u0464\u0007\u0005\u0000\u0000\u0464\u0465\u0007\u0006\u0000\u0000"+ + "\u0465\u0466\u0007\u0004\u0000\u0000\u0466\u0467\u0007\u0002\u0000\u0000"+ + "\u0467\u0468\u0007\n\u0000\u0000\u0468\u0469\u0007\u0003\u0000\u0000\u0469"+ + "\u0562\u0007\u000b\u0000\u0000\u046a\u046b\u0005@\u0000\u0000\u046b\u046c"+ + "\u0007\u0007\u0000\u0000\u046c\u046d\u0007\u0012\u0000\u0000\u046d\u046e"+ + "\u0007\r\u0000\u0000\u046e\u046f\u0007\u0001\u0000\u0000\u046f\u0470\u0007"+ + "\u0002\u0000\u0000\u0470\u0562\u0007\u000b\u0000\u0000\u0471\u0472\u0005"+ + "@\u0000\u0000\u0472\u0473\u0007\f\u0000\u0000\u0473\u0474\u0007\u0004"+ + "\u0000\u0000\u0474\u0475\u0007\u0012\u0000\u0000\u0475\u0476\u0007\u0003"+ + "\u0000\u0000\u0476\u0477\u0007\n\u0000\u0000\u0477\u0478\u0007\r\u0000"+ + "\u0000\u0478\u0479\u0007\u0004\u0000\u0000\u0479\u047a\u0007\u0005\u0000"+ + "\u0000\u047a\u0562\u0007\u0003\u0000\u0000\u047b\u047c\u0005@\u0000\u0000"+ + "\u047c\u047d\u0007\u0011\u0000\u0000\u047d\u047e\u0007\u0001\u0000\u0000"+ + "\u047e\u047f\u0007\u0005\u0000\u0000\u047f\u0480\u0007\u000e\u0000\u0000"+ + "\u0480\u0481\u0007\u0012\u0000\u0000\u0481\u0482\u0007\u0003\u0000\u0000"+ + "\u0482\u0483\u0007\f\u0000\u0000\u0483\u0562\u0007\u000b\u0000\u0000\u0484"+ + "\u0485\u0005@\u0000\u0000\u0485\u0486\u0007\u0000\u0000\u0000\u0486\u0487"+ + "\u0007\u0001\u0000\u0000\u0487\u0488\u0007\f\u0000\u0000\u0488\u0489\u0007"+ + "\u000b\u0000\u0000\u0489\u048a\u0005-\u0000\u0000\u048a\u048b\u0007\u0000"+ + "\u0000\u0000\u048b\u048c\u0007\u0004\u0000\u0000\u048c\u048d\u0007\u0005"+ + "\u0000\u0000\u048d\u0562\u0007\u0003\u0000\u0000\u048e\u048f\u0005@\u0000"+ + "\u0000\u048f\u0490\u0007\r\u0000\u0000\u0490\u0491\u0007\u0004\u0000\u0000"+ + "\u0491\u0492\u0007\u0010\u0000\u0000\u0492\u0562\u0007\u0003\u0000\u0000"+ + "\u0493\u0494\u0005@\u0000\u0000\u0494\u0495\u0007\t\u0000\u0000\u0495"+ + "\u0496\u0007\u0004\u0000\u0000\u0496\u0497\u0007\u000f\u0000\u0000\u0497"+ + "\u0498\u0007\u0003\u0000\u0000\u0498\u0562\u0007\u0002\u0000\u0000\u0499"+ + "\u049a\u0005@\u0000\u0000\u049a\u049b\u0007\n\u0000\u0000\u049b\u049c"+ + "\u0007\u000e\u0000\u0000\u049c\u049d\u0007\r\u0000\u0000\u049d\u049e\u0007"+ + "\r\u0000\u0000\u049e\u049f\u0007\u0001\u0000\u0000\u049f\u04a0\u0007\u0002"+ + "\u0000\u0000\u04a0\u04a1\u0007\u000b\u0000\u0000\u04a1\u0562\u0007\n\u0000"+ + "\u0000\u04a2\u04a3\u0005@\u0000\u0000\u04a3\u04a4\u0007\u000b\u0000\u0000"+ + "\u04a4\u04a5\u0007\u0004\u0000\u0000\u04a5\u04a6\u0007\u0007\u0000\u0000"+ + "\u04a6\u04a7\u0007\t\u0000\u0000\u04a7\u04a8\u0007\b\u0000\u0000\u04a8"+ + "\u04a9\u0007\u0007\u0000\u0000\u04a9\u04aa\u0007\f\u0000\u0000\u04aa\u0562"+ + "\u0007\u0011\u0000\u0000\u04ab\u04ac\u0005@\u0000\u0000\u04ac\u04ad\u0007"+ + "\u0004\u0000\u0000\u04ad\u04ae\u0007\r\u0000\u0000\u04ae\u04af\u0007\r"+ + "\u0000\u0000\u04af\u04b0\u0007\t\u0000\u0000\u04b0\u0562\u0007\u000f\u0000"+ + "\u0000\u04b1\u04b2\u0005@\u0000\u0000\u04b2\u04b3\u0005-\u0000\u0000\u04b3"+ + "\u04b4\u0007\b\u0000\u0000\u04b4\u04b5\u0007\u0003\u0000\u0000\u04b5\u04b6"+ + "\u0007\u0016\u0000\u0000\u04b6\u04b7\u0007\u0017\u0000\u0000\u04b7\u04b8"+ + "\u0007\u0007\u0000\u0000\u04b8\u04b9\u0007\u000b\u0000\u0000\u04b9\u04ba"+ + "\u0005-\u0000\u0000\u04ba\u04bb\u0007\u0017\u0000\u0000\u04bb\u04bc\u0007"+ + "\u0003\u0000\u0000\u04bc\u04bd\u0007\u000f\u0000\u0000\u04bd\u04be\u0007"+ + "\u0000\u0000\u0000\u04be\u04bf\u0007\u0002\u0000\u0000\u04bf\u04c0\u0007"+ + "\u0004\u0000\u0000\u04c0\u04c1\u0007\u0012\u0000\u0000\u04c1\u04c2\u0007"+ + "\u0003\u0000\u0000\u04c2\u0562\u0007\n\u0000\u0000\u04c3\u04c4\u0005@"+ + "\u0000\u0000\u04c4\u04c5\u0007\u0017\u0000\u0000\u04c5\u04c6\u0007\u0003"+ + "\u0000\u0000\u04c6\u04c7\u0007\u000f\u0000\u0000\u04c7\u04c8\u0007\u0000"+ + "\u0000\u0000\u04c8\u04c9\u0007\u0002\u0000\u0000\u04c9\u04ca\u0007\u0004"+ + "\u0000\u0000\u04ca\u04cb\u0007\u0012\u0000\u0000\u04cb\u04cc\u0007\u0003"+ + "\u0000\u0000\u04cc\u0562\u0007\n\u0000\u0000\u04cd\u04ce\u0005@\u0000"+ + "\u0000\u04ce\u04cf\u0007\u0005\u0000\u0000\u04cf\u04d0\u0007\u0001\u0000"+ + "\u0000\u04d0\u04d1\u0007\u000e\u0000\u0000\u04d1\u04d2\u0007\f\u0000\u0000"+ + "\u04d2\u04d3\u0007\u000b\u0000\u0000\u04d3\u04d4\u0007\u0003\u0000\u0000"+ + "\u04d4\u04d5\u0007\u0002\u0000\u0000\u04d5\u04d6\u0005-\u0000\u0000\u04d6"+ + "\u04d7\u0007\n\u0000\u0000\u04d7\u04d8\u0007\u000b\u0000\u0000\u04d8\u04d9"+ + "\u0007\u000f\u0000\u0000\u04d9\u04da\u0007\t\u0000\u0000\u04da\u0562\u0007"+ + "\u0003\u0000\u0000\u04db\u04dc\u0005@\u0000\u0000\u04dc\u04dd\u0007\u0000"+ + "\u0000\u0000\u04dd\u04de\u0007\u0001\u0000\u0000\u04de\u04df\u0007\f\u0000"+ + "\u0000\u04df\u04e0\u0007\u000b\u0000\u0000\u04e0\u04e1\u0005-\u0000\u0000"+ + "\u04e1\u04e2\u0007\u0000\u0000\u0000\u04e2\u04e3\u0007\u0003\u0000\u0000"+ + "\u04e3\u04e4\u0007\u0004\u0000\u0000\u04e4\u04e5\u0007\u000b\u0000\u0000"+ + "\u04e5\u04e6\u0007\u000e\u0000\u0000\u04e6\u04e7\u0007\u0002\u0000\u0000"+ + "\u04e7\u04e8\u0007\u0003\u0000\u0000\u04e8\u04e9\u0005-\u0000\u0000\u04e9"+ + "\u04ea\u0007\u0019\u0000\u0000\u04ea\u04eb\u0007\u0004\u0000\u0000\u04eb"+ + "\u04ec\u0007\t\u0000\u0000\u04ec\u04ed\u0007\u000e\u0000\u0000\u04ed\u04ee"+ + "\u0007\u0003\u0000\u0000\u04ee\u0562\u0007\n\u0000\u0000\u04ef\u04f0\u0005"+ + "@\u0000\u0000\u04f0\u04f1\u0007\r\u0000\u0000\u04f1\u04f2\u0007\u0002"+ + "\u0000\u0000\u04f2\u04f3\u0007\u0001\u0000\u0000\u04f3\u04f4\u0007\r\u0000"+ + "\u0000\u04f4\u04f5\u0007\u0003\u0000\u0000\u04f5\u04f6\u0007\u0002\u0000"+ + "\u0000\u04f6\u04f7\u0007\u000b\u0000\u0000\u04f7\u0562\u0007\u000f\u0000"+ + "\u0000\u04f8\u04f9\u0005@\u0000\u0000\u04f9\u04fa\u0007\n\u0000\u0000"+ + "\u04fa\u04fb\u0007\u0005\u0000\u0000\u04fb\u04fc\u0007\u0001\u0000\u0000"+ + "\u04fc\u04fd\u0007\r\u0000\u0000\u04fd\u0562\u0007\u0003\u0000\u0000\u04fe"+ + "\u04ff\u0005@\u0000\u0000\u04ff\u0500\u0007\n\u0000\u0000\u0500\u0501"+ + "\u0007\u000b\u0000\u0000\u0501\u0502\u0007\u0004\u0000\u0000\u0502\u0503"+ + "\u0007\u0002\u0000\u0000\u0503\u0504\u0007\u000b\u0000\u0000\u0504\u0505"+ + "\u0007\u0007\u0000\u0000\u0505\u0506\u0007\f\u0000\u0000\u0506\u0507\u0007"+ + "\u0010\u0000\u0000\u0507\u0508\u0005-\u0000\u0000\u0508\u0509\u0007\n"+ + "\u0000\u0000\u0509\u050a\u0007\u000b\u0000\u0000\u050a\u050b\u0007\u000f"+ + "\u0000\u0000\u050b\u050c\u0007\t\u0000\u0000\u050c\u0562\u0007\u0003\u0000"+ + "\u0000\u050d\u050e\u0005@\u0000\u0000\u050e\u050f\u0007\n\u0000\u0000"+ + "\u050f\u0510\u0007\u000e\u0000\u0000\u0510\u0511\u0007\r\u0000\u0000\u0511"+ + "\u0512\u0007\r\u0000\u0000\u0512\u0513\u0007\u0001\u0000\u0000\u0513\u0514"+ + "\u0007\u0002\u0000\u0000\u0514\u0515\u0007\u000b\u0000\u0000\u0515\u0562"+ + "\u0007\n\u0000\u0000\u0516\u0517\u0005@\u0000\u0000\u0517\u0518\u0007"+ + "\u0019\u0000\u0000\u0518\u0519\u0007\u0007\u0000\u0000\u0519\u051a\u0007"+ + "\u0003\u0000\u0000\u051a\u051b\u0007\b\u0000\u0000\u051b\u051c\u0005-"+ + "\u0000\u0000\u051c\u051d\u0007\u000b\u0000\u0000\u051d\u051e\u0007\u0002"+ + "\u0000\u0000\u051e\u051f\u0007\u0004\u0000\u0000\u051f\u0520\u0007\f\u0000"+ + "\u0000\u0520\u0521\u0007\n\u0000\u0000\u0521\u0522\u0007\u0007\u0000\u0000"+ + "\u0522\u0523\u0007\u000b\u0000\u0000\u0523\u0524\u0007\u0007\u0000\u0000"+ + "\u0524\u0525\u0007\u0001\u0000\u0000\u0525\u0562\u0007\f\u0000\u0000\u0526"+ + "\u0527\u0005@\u0000\u0000\u0527\u0528\u0007\u0005\u0000\u0000\u0528\u0529"+ + "\u0007\u0001\u0000\u0000\u0529\u052a\u0007\f\u0000\u0000\u052a\u052b\u0007"+ + "\u000b\u0000\u0000\u052b\u052c\u0007\u0004\u0000\u0000\u052c\u052d\u0007"+ + "\u0007\u0000\u0000\u052d\u052e\u0007\f\u0000\u0000\u052e\u052f\u0007\u0003"+ + "\u0000\u0000\u052f\u0562\u0007\u0002\u0000\u0000\u0530\u0531\u0005@\u0000"+ + "\u0000\u0531\u0532\u0007\u0005\u0000\u0000\u0532\u0533\u0007\u0001\u0000"+ + "\u0000\u0533\u0534\u0007\t\u0000\u0000\u0534\u0535\u0007\u0001\u0000\u0000"+ + "\u0535\u0536\u0007\u0002\u0000\u0000\u0536\u0537\u0005-\u0000\u0000\u0537"+ + "\u0538\u0007\r\u0000\u0000\u0538\u0539\u0007\u0002\u0000\u0000\u0539\u053a"+ + "\u0007\u0001\u0000\u0000\u053a\u053b\u0007\u0000\u0000\u0000\u053b\u053c"+ + "\u0007\u0007\u0000\u0000\u053c\u053d\u0007\t\u0000\u0000\u053d\u0562\u0007"+ + "\u0003\u0000\u0000\u053e\u053f\u0005@\u0000\u0000\u053f\u0540\u0007\n"+ + "\u0000\u0000\u0540\u0541\u0007\u000b\u0000\u0000\u0541\u0542\u0007\u000f"+ + "\u0000\u0000\u0542\u0543\u0007\t\u0000\u0000\u0543\u0544\u0007\u0003\u0000"+ + "\u0000\u0544\u0545\u0007\n\u0000\u0000\u0545\u0546\u0007\u0003\u0000\u0000"+ + "\u0546\u0562\u0007\u000b\u0000\u0000\u0547\u0548\u0005@\u0000\u0000\u0548"+ + "\u0549\u0007\u0000\u0000\u0000\u0549\u054a\u0007\u0001\u0000\u0000\u054a"+ + "\u054b\u0007\f\u0000\u0000\u054b\u054c\u0007\u000b\u0000\u0000\u054c\u054d"+ + "\u0005-\u0000\u0000\u054d\u054e\u0007\r\u0000\u0000\u054e\u054f\u0007"+ + "\u0004\u0000\u0000\u054f\u0550\u0007\t\u0000\u0000\u0550\u0551\u0007\u0003"+ + "\u0000\u0000\u0551\u0552\u0007\u000b\u0000\u0000\u0552\u0553\u0007\u000b"+ + "\u0000\u0000\u0553\u0554\u0007\u0003\u0000\u0000\u0554\u0555\u0005-\u0000"+ + "\u0000\u0555\u0556\u0007\u0019\u0000\u0000\u0556\u0557\u0007\u0004\u0000"+ + "\u0000\u0557\u0558\u0007\t\u0000\u0000\u0558\u0559\u0007\u000e\u0000\u0000"+ + "\u0559\u055a\u0007\u0003\u0000\u0000\u055a\u0562\u0007\n\u0000\u0000\u055b"+ + "\u055c\u0005@\u0000\u0000\u055c\u055d\u0007\u0012\u0000\u0000\u055d\u055e"+ + "\u0007\u0003\u0000\u0000\u055e\u055f\u0007\u0011\u0000\u0000\u055f\u0560"+ + "\u0007\u0007\u0000\u0000\u0560\u0562\u0007\u0004\u0000\u0000\u0561\u0462"+ + "\u0001\u0000\u0000\u0000\u0561\u046a\u0001\u0000\u0000\u0000\u0561\u0471"+ + "\u0001\u0000\u0000\u0000\u0561\u047b\u0001\u0000\u0000\u0000\u0561\u0484"+ + "\u0001\u0000\u0000\u0000\u0561\u048e\u0001\u0000\u0000\u0000\u0561\u0493"+ + "\u0001\u0000\u0000\u0000\u0561\u0499\u0001\u0000\u0000\u0000\u0561\u04a2"+ + "\u0001\u0000\u0000\u0000\u0561\u04ab\u0001\u0000\u0000\u0000\u0561\u04b1"+ + "\u0001\u0000\u0000\u0000\u0561\u04c3\u0001\u0000\u0000\u0000\u0561\u04cd"+ + "\u0001\u0000\u0000\u0000\u0561\u04db\u0001\u0000\u0000\u0000\u0561\u04ef"+ + "\u0001\u0000\u0000\u0000\u0561\u04f8\u0001\u0000\u0000\u0000\u0561\u04fe"+ + "\u0001\u0000\u0000\u0000\u0561\u050d\u0001\u0000\u0000\u0000\u0561\u0516"+ + "\u0001\u0000\u0000\u0000\u0561\u0526\u0001\u0000\u0000\u0000\u0561\u0530"+ + "\u0001\u0000\u0000\u0000\u0561\u053e\u0001\u0000\u0000\u0000\u0561\u0547"+ + "\u0001\u0000\u0000\u0000\u0561\u055b\u0001\u0000\u0000\u0000\u0562\u0566"+ + "\u0001\u0000\u0000\u0000\u0563\u0565\u0007)\u0000\u0000\u0564\u0563\u0001"+ + "\u0000\u0000\u0000\u0565\u0568\u0001\u0000\u0000\u0000\u0566\u0564\u0001"+ + "\u0000\u0000\u0000\u0566\u0567\u0001\u0000\u0000\u0000\u0567\u056a\u0001"+ + "\u0000\u0000\u0000\u0568\u0566\u0001\u0000\u0000\u0000\u0569\u0434\u0001"+ + "\u0000\u0000\u0000\u0569\u0437\u0001\u0000\u0000\u0000\u0569\u043d\u0001"+ + "\u0000\u0000\u0000\u0569\u0443\u0001\u0000\u0000\u0000\u0569\u0561\u0001"+ + "\u0000\u0000\u0000\u056a\u056b\u0001\u0000\u0000\u0000\u056b\u056c\u0006"+ + ",\t\u0000\u056cd\u0001\u0000\u0000\u0000\u056d\u056e\t\u0000\u0000\u0000"+ + "\u056e\u056f\u0004-\u0007\u0000\u056f\u0570\u0001\u0000\u0000\u0000\u0570"+ + "\u0571\u0006-\u000e\u0000\u0571\u0572\u0006-\u000f\u0000\u0572f\u0001"+ + "\u0000\u0000\u0000\u0573\u0574\t\u0000\u0000\u0000\u0574\u0575\u0001\u0000"+ + "\u0000\u0000\u0575\u0576\u0006.\f\u0000\u0576h\u0001\u0000\u0000\u0000"+ + "\u0577\u0578\u0005\u0000\u0000\u0001\u0578\u0579\u0001\u0000\u0000\u0000"+ + "\u0579\u057a\u0006/\u000e\u0000\u057a\u057b\u0006/\u000f\u0000\u057bj"+ + "\u0001\u0000\u0000\u0000\u057c\u057d\u0005}\u0000\u0000\u057d\u057e\u0005"+ + "}\u0000\u0000\u057e\u057f\u0001\u0000\u0000\u0000\u057f\u0580\u00060\u000f"+ + "\u0000\u0580\u0581\u00060\u0006\u0000\u0581l\u0001\u0000\u0000\u0000\u0582"+ + "\u0584\b*\u0000\u0000\u0583\u0582\u0001\u0000\u0000\u0000\u0584\u0585"+ + "\u0001\u0000\u0000\u0000\u0585\u0583\u0001\u0000\u0000\u0000\u0585\u0586"+ + "\u0001\u0000\u0000\u0000\u0586\u0587\u0001\u0000\u0000\u0000\u0587\u0588"+ + "\u00061\u0010\u0000\u0588n\u0001\u0000\u0000\u0000\u0589\u058d\t\u0000"+ + "\u0000\u0000\u058a\u058c\u0007)\u0000\u0000\u058b\u058a\u0001\u0000\u0000"+ + "\u0000\u058c\u058f\u0001\u0000\u0000\u0000\u058d\u058b\u0001\u0000\u0000"+ + "\u0000\u058d\u058e\u0001\u0000\u0000\u0000\u058e\u0590\u0001\u0000\u0000"+ + "\u0000\u058f\u058d\u0001\u0000\u0000\u0000\u0590\u0591\u00062\u0011\u0000"+ + "\u0591p\u0001\u0000\u0000\u0000\u0592\u0593\u0005\u0000\u0000\u0001\u0593"+ + "\u0594\u0001\u0000\u0000\u0000\u0594\u0595\u00063\u0012\u0000\u0595\u0596"+ + "\u00063\u000f\u0000\u0596r\u0001\u0000\u0000\u0000\u0597\u0598\u0005!"+ + "\u0000\u0000\u0598\u0599\u0005!\u0000\u0000\u0599\u059a\u0005}\u0000\u0000"+ + "\u059a\u059b\u0001\u0000\u0000\u0000\u059b\u059c\u00064\u000f\u0000\u059c"+ + "\u059d\u00064\b\u0000\u059dt\u0001\u0000\u0000\u0000\u059e\u05a0\b+\u0000"+ + "\u0000\u059f\u059e\u0001\u0000\u0000\u0000\u05a0\u05a1\u0001\u0000\u0000"+ + "\u0000\u05a1\u059f\u0001\u0000\u0000\u0000\u05a1\u05a2\u0001\u0000\u0000"+ + "\u0000\u05a2\u05a3\u0001\u0000\u0000\u0000\u05a3\u05a4\u00065\u0013\u0000"+ + "\u05a4v\u0001\u0000\u0000\u0000\u05a5\u05a9\t\u0000\u0000\u0000\u05a6"+ + "\u05a8\u0007)\u0000\u0000\u05a7\u05a6\u0001\u0000\u0000\u0000\u05a8\u05ab"+ + "\u0001\u0000\u0000\u0000\u05a9\u05a7\u0001\u0000\u0000\u0000\u05a9\u05aa"+ + "\u0001\u0000\u0000\u0000\u05aa\u05ac\u0001\u0000\u0000\u0000\u05ab\u05a9"+ + "\u0001\u0000\u0000\u0000\u05ac\u05ad\u00066\u0014\u0000\u05adx\u0001\u0000"+ + "\u0000\u0000\u05ae\u05af\u0005\u0000\u0000\u0001\u05af\u05b0\u0001\u0000"+ + "\u0000\u0000\u05b0\u05b1\u00067\u0012\u0000\u05b1\u05b2\u00067\u000f\u0000"+ + "\u05b2z\u0001\u0000\u0000\u0000\u05b3\u05b5\u0007)\u0000\u0000\u05b4\u05b3"+ + "\u0001\u0000\u0000\u0000\u05b5\u05b6\u0001\u0000\u0000\u0000\u05b6\u05b4"+ + "\u0001\u0000\u0000\u0000\u05b6\u05b7\u0001\u0000\u0000\u0000\u05b7\u05b8"+ + "\u0001\u0000\u0000\u0000\u05b8\u05b9\u00048\b\u0000\u05b9\u05ba\u0001"+ + "\u0000\u0000\u0000\u05ba\u05bb\u00068\u0015\u0000\u05bb|\u0001\u0000\u0000"+ + "\u0000\u05bc\u05bd\u0005(\u0000\u0000\u05bd\u05be\u00069\u0016\u0000\u05be"+ + "\u05bf\u0001\u0000\u0000\u0000\u05bf\u05c0\u00069\f\u0000\u05c0\u05c1"+ + "\u00069\u0015\u0000\u05c1~\u0001\u0000\u0000\u0000\u05c2\u05c3\u0003I"+ + "\u001f\u0000\u05c3\u05c4\u0001\u0000\u0000\u0000\u05c4\u05c5\u0006:\u0012"+ + "\u0000\u05c5\u05c6\u0006:\u000f\u0000\u05c6\u0080\u0001\u0000\u0000\u0000"+ + "\u05c7\u05c8\t\u0000\u0000\u0000\u05c8\u05c9\u0001\u0000\u0000\u0000\u05c9"+ + "\u05ca\u0006;\u0012\u0000\u05ca\u05cb\u0006;\u000f\u0000\u05cb\u0082\u0001"+ + "\u0000\u0000\u0000\u05cc\u05cd\u0004<\t\u0000\u05cd\u05ce\u0005(\u0000"+ + "\u0000\u05ce\u05cf\u0006<\u0017\u0000\u05cf\u05d0\u0006<\u0018\u0000\u05d0"+ + "\u0084\u0001\u0000\u0000\u0000\u05d1\u05d2\u0004=\n\u0000\u05d2\u05d3"+ + "\u0005)\u0000\u0000\u05d3\u05d4\u0006=\u0019\u0000\u05d4\u05d5\u0001\u0000"+ + "\u0000\u0000\u05d5\u05d6\u0006=\u001a\u0000\u05d6\u05d7\u0006=\u001b\u0000"+ + "\u05d7\u0086\u0001\u0000\u0000\u0000\u05d8\u05d9\u0004>\u000b\u0000\u05d9"+ + "\u05da\u0005(\u0000\u0000\u05da\u05db\u0006>\u001c\u0000\u05db\u05dc\u0006"+ + ">\u001d\u0000\u05dc\u0088\u0001\u0000\u0000\u0000\u05dd\u05de\u0004?\f"+ + "\u0000\u05de\u05df\u0005)\u0000\u0000\u05df\u05e0\u0006?\u001e\u0000\u05e0"+ + "\u05e1\u0006?\u001f\u0000\u05e1\u008a\u0001\u0000\u0000\u0000\u05e2\u05e3"+ + "\u0005)\u0000\u0000\u05e3\u05e4\u0004@\r\u0000\u05e4\u05e5\u0001\u0000"+ + "\u0000\u0000\u05e5\u05e6\u0006@\u001a\u0000\u05e6\u05e7\u0006@\u001b\u0000"+ + "\u05e7\u008c\u0001\u0000\u0000\u0000\u05e8\u05e9\u0005/\u0000\u0000\u05e9"+ + "\u05ea\u0005*\u0000\u0000\u05ea\u05ee\u0001\u0000\u0000\u0000\u05eb\u05ed"+ + "\t\u0000\u0000\u0000\u05ec\u05eb\u0001\u0000\u0000\u0000\u05ed\u05f0\u0001"+ + "\u0000\u0000\u0000\u05ee\u05ef\u0001\u0000\u0000\u0000\u05ee\u05ec\u0001"+ + "\u0000\u0000\u0000\u05ef\u05f1\u0001\u0000\u0000\u0000\u05f0\u05ee\u0001"+ + "\u0000\u0000\u0000\u05f1\u05f2\u0005*\u0000\u0000\u05f2\u05f3\u0005/\u0000"+ + "\u0000\u05f3\u05f4\u0001\u0000\u0000\u0000\u05f4\u05f5\u0006A \u0000\u05f5"+ + "\u008e\u0001\u0000\u0000\u0000\u05f6\u05f7\t\u0000\u0000\u0000\u05f7\u05f8"+ + "\u0006B!\u0000\u05f8\u0090\u0001\u0000\u0000\u0000\u05f9\u05fa\u0005\u0000"+ + "\u0000\u0001\u05fa\u05fb\u0001\u0000\u0000\u0000\u05fb\u05fc\u0006C\u0012"+ + "\u0000\u05fc\u05fd\u0006C\u001b\u0000\u05fd\u0092\u0001\u0000\u0000\u0000"+ + "\u05fe\u05ff\u0005@\u0000\u0000\u05ff\u0600\u0007\u0003\u0000\u0000\u0600"+ + "\u0601\u0007\f\u0000\u0000\u0601\u0602\u0007\u0011\u0000\u0000\u0602\u0603"+ + "\u0007\r\u0000\u0000\u0603\u0604\u0007\u0006\u0000\u0000\u0604\u0605\u0007"+ + "\r\u0000\u0000\u0605\u0606\u0001\u0000\u0000\u0000\u0606\u0607\u0006D"+ + "\u000f\u0000\u0607\u0094\u0001\u0000\u0000\u0000\u0608\u0609\t\u0000\u0000"+ + "\u0000\u0609\u060a\u0004E\u000e\u0000\u060a\u060b\u0001\u0000\u0000\u0000"+ + "\u060b\u060c\u0006E\"\u0000\u060c\u0096\u0001\u0000\u0000\u0000\u060d"+ + "\u060e\t\u0000\u0000\u0000\u060e\u060f\u0001\u0000\u0000\u0000\u060f\u0610"+ + "\u0006F\f\u0000\u0610\u0098\u0001\u0000\u0000\u0000\u0611\u0612\u0005"+ + "\u0000\u0000\u0001\u0612\u0613\u0001\u0000\u0000\u0000\u0613\u0614\u0006"+ + "G\u0012\u0000\u0614\u0615\u0006G\u000f\u0000\u0615\u009a\u0001\u0000\u0000"+ + "\u0000\u0616\u0617\u0005@\u0000\u0000\u0617\u0618\u0007\u0003\u0000\u0000"+ + "\u0618\u0619\u0007\f\u0000\u0000\u0619\u061a\u0007\u0011\u0000\u0000\u061a"+ + "\u061b\u0007\u0019\u0000\u0000\u061b\u061c\u0007\u0003\u0000\u0000\u061c"+ + "\u061d\u0007\u0002\u0000\u0000\u061d\u061e\u0007\u0016\u0000\u0000\u061e"+ + "\u061f\u0007\u0004\u0000\u0000\u061f\u0620\u0007\u000b\u0000\u0000\u0620"+ + "\u0621\u0007\u0007\u0000\u0000\u0621\u0622\u0007\u0012\u0000\u0000\u0622"+ + "\u0623\u0001\u0000\u0000\u0000\u0623\u0624\u0006H\u0001\u0000\u0624\u0625"+ + "\u0006H\u000f\u0000\u0625\u009c\u0001\u0000\u0000\u0000\u0626\u0627\t"+ + "\u0000\u0000\u0000\u0627\u0628\u0004I\u000f\u0000\u0628\u0629\u0001\u0000"+ + "\u0000\u0000\u0629\u062a\u0006I\t\u0000\u062a\u009e\u0001\u0000\u0000"+ + "\u0000\u062b\u062c\t\u0000\u0000\u0000\u062c\u062d\u0001\u0000\u0000\u0000"+ + "\u062d\u062e\u0006J\f\u0000\u062e\u00a0\u0001\u0000\u0000\u0000\u062f"+ + "\u0630\u0005\u0000\u0000\u0001\u0630\u0631\u0001\u0000\u0000\u0000\u0631"+ + "\u0632\u0006K\u0012\u0000\u0632\u0633\u0006K\u000f\u0000\u0633\u00a2\u0001"+ + "\u0000\u0000\u0000\u0634\u0635\u0005:\u0000\u0000\u0635\u0636\u0003M!"+ + "\u0000\u0636\u0637\u0005=\u0000\u0000\u0637\u0638\u0005\"\u0000\u0000"+ + "\u0638\u0639\u0001\u0000\u0000\u0000\u0639\u063a\u0006L\t\u0000\u063a"+ + "\u063b\u0006L#\u0000\u063b\u00a4\u0001\u0000\u0000\u0000\u063c\u063d\u0005"+ + "{\u0000\u0000\u063d\u063e\u0005{\u0000\u0000\u063e\u063f\u0001\u0000\u0000"+ + "\u0000\u063f\u0640\u0006M\u0005\u0000\u0640\u0641\u0006M\u0006\u0000\u0641"+ + "\u00a6\u0001\u0000\u0000\u0000\u0642\u0643\u0005{\u0000\u0000\u0643\u0644"+ + "\u0005!\u0000\u0000\u0644\u0645\u0005!\u0000\u0000\u0645\u0646\u0001\u0000"+ + "\u0000\u0000\u0646\u0647\u0006N\u0007\u0000\u0647\u0648\u0006N\b\u0000"+ + "\u0648\u00a8\u0001\u0000\u0000\u0000\u0649\u064a\u0005>\u0000\u0000\u064a"+ + "\u064b\u0001\u0000\u0000\u0000\u064b\u064c\u0006O\t\u0000\u064c\u064d"+ + "\u0006O\u000f\u0000\u064d\u00aa\u0001\u0000\u0000\u0000\u064e\u064f\t"+ + "\u0000\u0000\u0000\u064f\u0650\u0001\u0000\u0000\u0000\u0650\u0651\u0006"+ + "P\t\u0000\u0651\u00ac\u0001\u0000\u0000\u0000\u0652\u0653\u0005\u0000"+ + "\u0000\u0001\u0653\u0654\u0001\u0000\u0000\u0000\u0654\u0655\u0006Q\u0012"+ + "\u0000\u0655\u0656\u0006Q\u000f\u0000\u0656\u00ae\u0001\u0000\u0000\u0000"+ + "\u0657\u0658\u0005\"\u0000\u0000\u0658\u0659\u0001\u0000\u0000\u0000\u0659"+ + "\u065a\u0006R\t\u0000\u065a\u065b\u0006R\u000f\u0000\u065b\u00b0\u0001"+ + "\u0000\u0000\u0000\u065c\u065d\t\u0000\u0000\u0000\u065d\u065e\u0004S"+ + "\u0010\u0000\u065e\u065f\u0001\u0000\u0000\u0000\u065f\u0660\u0006S\u001a"+ + "\u0000\u0660\u00b2\u0001\u0000\u0000\u0000\u0661\u0662\t\u0000\u0000\u0000"+ + "\u0662\u0663\u0001\u0000\u0000\u0000\u0663\u0664\u0006T\f\u0000\u0664"+ + "\u00b4\u0001\u0000\u0000\u0000\u0665\u0666\u0005\u0000\u0000\u0001\u0666"+ + "\u0667\u0001\u0000\u0000\u0000\u0667\u0668\u0006U\u0012\u0000\u0668\u0669"+ + "\u0006U\u000f\u0000\u0669\u00b6\u0001\u0000\u0000\u0000\u066a\u066c\u0005"+ + "{\u0000\u0000\u066b\u066d\u0007(\u0000\u0000\u066c\u066b\u0001\u0000\u0000"+ + "\u0000\u066c\u066d\u0001\u0000\u0000\u0000\u066d\u066e\u0001\u0000\u0000"+ + "\u0000\u066e\u0670\u0003M!\u0000\u066f\u0671\u0007(\u0000\u0000\u0670"+ + "\u066f\u0001\u0000\u0000\u0000\u0670\u0671\u0001\u0000\u0000\u0000\u0671"+ + "\u0673\u0001\u0000\u0000\u0000\u0672\u0674\u0005:\u0000\u0000\u0673\u0672"+ + "\u0001\u0000\u0000\u0000\u0674\u0675\u0001\u0000\u0000\u0000\u0675\u0673"+ + "\u0001\u0000\u0000\u0000\u0675\u0676\u0001\u0000\u0000\u0000\u0676\u0678"+ + "\u0001\u0000\u0000\u0000\u0677\u0679\u0007(\u0000\u0000\u0678\u0677\u0001"+ + "\u0000\u0000\u0000\u0678\u0679\u0001\u0000\u0000\u0000\u0679\u067b\u0001"+ + "\u0000\u0000\u0000\u067a\u067c\u0003M!\u0000\u067b\u067a\u0001\u0000\u0000"+ + "\u0000\u067b\u067c\u0001\u0000\u0000\u0000\u067c\u067e\u0001\u0000\u0000"+ + "\u0000\u067d\u067f\u0007(\u0000\u0000\u067e\u067d\u0001\u0000\u0000\u0000"+ + "\u067e\u067f\u0001\u0000\u0000\u0000\u067f\u0696\u0001\u0000\u0000\u0000"+ + "\u0680\u0682\u0005,\u0000\u0000\u0681\u0683\u0007(\u0000\u0000\u0682\u0681"+ + "\u0001\u0000\u0000\u0000\u0682\u0683\u0001\u0000\u0000\u0000\u0683\u0684"+ + "\u0001\u0000\u0000\u0000\u0684\u0686\u0003M!\u0000\u0685\u0687\u0007("+ + "\u0000\u0000\u0686\u0685\u0001\u0000\u0000\u0000\u0686\u0687\u0001\u0000"+ + "\u0000\u0000\u0687\u0689\u0001\u0000\u0000\u0000\u0688\u068a\u0005:\u0000"+ + "\u0000\u0689\u0688\u0001\u0000\u0000\u0000\u068a\u068b\u0001\u0000\u0000"+ + "\u0000\u068b\u0689\u0001\u0000\u0000\u0000\u068b\u068c\u0001\u0000\u0000"+ + "\u0000\u068c\u068e\u0001\u0000\u0000\u0000\u068d\u068f\u0007(\u0000\u0000"+ + "\u068e\u068d\u0001\u0000\u0000\u0000\u068e\u068f\u0001\u0000\u0000\u0000"+ + "\u068f\u0690\u0001\u0000\u0000\u0000\u0690\u0692\u0003M!\u0000\u0691\u0693"+ + "\u0007(\u0000\u0000\u0692\u0691\u0001\u0000\u0000\u0000\u0692\u0693\u0001"+ + "\u0000\u0000\u0000\u0693\u0695\u0001\u0000\u0000\u0000\u0694\u0680\u0001"+ + "\u0000\u0000\u0000\u0695\u0698\u0001\u0000\u0000\u0000\u0696\u0694\u0001"+ + "\u0000\u0000\u0000\u0696\u0697\u0001\u0000\u0000\u0000\u0697\u069a\u0001"+ + "\u0000\u0000\u0000\u0698\u0696\u0001\u0000\u0000\u0000\u0699\u069b\u0005"+ + ",\u0000\u0000\u069a\u0699\u0001\u0000\u0000\u0000\u069a\u069b\u0001\u0000"+ + "\u0000\u0000\u069b\u069c\u0001\u0000\u0000\u0000\u069c\u069d\u0005}\u0000"+ + "\u0000\u069d\u069e\u0001\u0000\u0000\u0000\u069e\u069f\u0006V\f\u0000"+ + "\u069f\u00b8\u0001\u0000\u0000\u0000\u06a0\u06a1\u0005{\u0000\u0000\u06a1"+ + "\u06a2\u0005$\u0000\u0000\u06a2\u06ab\u0003M!\u0000\u06a3\u06a4\u0005"+ + "[\u0000\u0000\u06a4\u06a5\u0007(\u0000\u0000\u06a5\u06a6\u0003M!\u0000"+ + "\u06a6\u06a7\u0007(\u0000\u0000\u06a7\u06a8\u0005]\u0000\u0000\u06a8\u06aa"+ + "\u0001\u0000\u0000\u0000\u06a9\u06a3\u0001\u0000\u0000\u0000\u06aa\u06ad"+ + "\u0001\u0000\u0000\u0000\u06ab\u06a9\u0001\u0000\u0000\u0000\u06ab\u06ac"+ + "\u0001\u0000\u0000\u0000\u06ac\u06ae\u0001\u0000\u0000\u0000\u06ad\u06ab"+ + "\u0001\u0000\u0000\u0000\u06ae\u06af\u0005:\u0000\u0000\u06af\u06b0\u0005"+ + ":\u0000\u0000\u06b0\u06b1\u0001\u0000\u0000\u0000\u06b1\u06b2\u0003M!"+ + "\u0000\u06b2\u06b3\u0005}\u0000\u0000\u06b3\u06b4\u0001\u0000\u0000\u0000"+ + "\u06b4\u06b5\u0006W\f\u0000\u06b5\u00ba\u0001\u0000\u0000\u0000\u06b6"+ + "\u06b7\u0005{\u0000\u0000\u06b7\u06b8\u0005$\u0000\u0000\u06b8\u06c2\u0003"+ + "M!\u0000\u06b9\u06ba\u0005[\u0000\u0000\u06ba\u06bc\u0007(\u0000\u0000"+ + "\u06bb\u06bd\u0003M!\u0000\u06bc\u06bb\u0001\u0000\u0000\u0000\u06bc\u06bd"+ + "\u0001\u0000\u0000\u0000\u06bd\u06be\u0001\u0000\u0000\u0000\u06be\u06bf"+ + "\u0007(\u0000\u0000\u06bf\u06c1\u0005]\u0000\u0000\u06c0\u06b9\u0001\u0000"+ + "\u0000\u0000\u06c1\u06c4\u0001\u0000\u0000\u0000\u06c2\u06c0\u0001\u0000"+ + "\u0000\u0000\u06c2\u06c3\u0001\u0000\u0000\u0000\u06c3\u06cc\u0001\u0000"+ + "\u0000\u0000\u06c4\u06c2\u0001\u0000\u0000\u0000\u06c5\u06c6\u0005:\u0000"+ + "\u0000\u06c6\u06c8\u0005:\u0000\u0000\u06c7\u06c5\u0001\u0000\u0000\u0000"+ + "\u06c8\u06c9\u0001\u0000\u0000\u0000\u06c9\u06c7\u0001\u0000\u0000\u0000"+ + "\u06c9\u06ca\u0001\u0000\u0000\u0000\u06ca\u06cb\u0001\u0000\u0000\u0000"+ + "\u06cb\u06cd\u0003M!\u0000\u06cc\u06c7\u0001\u0000\u0000\u0000\u06cc\u06cd"+ + "\u0001\u0000\u0000\u0000\u06cd\u06d2\u0001\u0000\u0000\u0000\u06ce\u06d0"+ + "\u0005:\u0000\u0000\u06cf\u06d1\u0003M!\u0000\u06d0\u06cf\u0001\u0000"+ + "\u0000\u0000\u06d0\u06d1\u0001\u0000\u0000\u0000\u06d1\u06d3\u0001\u0000"+ + "\u0000\u0000\u06d2\u06ce\u0001\u0000\u0000\u0000\u06d3\u06d4\u0001\u0000"+ + "\u0000\u0000\u06d4\u06d2\u0001\u0000\u0000\u0000\u06d4\u06d5\u0001\u0000"+ + "\u0000\u0000\u06d5\u06d6\u0001\u0000\u0000\u0000\u06d6\u06d7\u0005}\u0000"+ + "\u0000\u06d7\u06db\u0001\u0000\u0000\u0000\u06d8\u06d9\u0005:\u0000\u0000"+ + "\u06d9\u06db\u0005$\u0000\u0000\u06da\u06b6\u0001\u0000\u0000\u0000\u06da"+ + "\u06d8\u0001\u0000\u0000\u0000\u06db\u06dc\u0001\u0000\u0000\u0000\u06dc"+ + "\u06dd\u0006X\u0012\u0000\u06dd\u00bc\u0001\u0000\u0000\u0000\u06de\u06df"+ + "\u0005\\\u0000\u0000\u06df\u06e0\u0005\"\u0000\u0000\u06e0\u06e1\u0001"+ + "\u0000\u0000\u0000\u06e1\u06e2\u0006Y\f\u0000\u06e2\u00be\u0001\u0000"+ + "\u0000\u0000\u06e3\u06e4\u0005\"\u0000\u0000\u06e4\u06e5\u0001\u0000\u0000"+ + "\u0000\u06e5\u06e6\u0006Z\f\u0000\u06e6\u06e7\u0006Z\u000f\u0000\u06e7"+ + "\u00c0\u0001\u0000\u0000\u0000\u06e8\u06e9\t\u0000\u0000\u0000\u06e9\u06ea"+ + "\u0001\u0000\u0000\u0000\u06ea\u06eb\u0006[\f\u0000\u06eb\u00c2\u0001"+ + "\u0000\u0000\u0000\u06ec\u06ed\u0005\u0000\u0000\u0001\u06ed\u06ee\u0001"+ + "\u0000\u0000\u0000\u06ee\u06ef\u0006\\\u0012\u0000\u06ef\u06f0\u0006\\"+ + "\u000f\u0000\u06f0\u00c4\u0001\u0000\u0000\u0000\u06f1\u06f2\u0005-\u0000"+ + "\u0000\u06f2\u06f3\u0005-\u0000\u0000\u06f3\u06f4\u0005}\u0000\u0000\u06f4"+ + "\u06f5\u0005}\u0000\u0000\u06f5\u06f6\u0001\u0000\u0000\u0000\u06f6\u06f7"+ + "\u0006]\u000f\u0000\u06f7\u00c6\u0001\u0000\u0000\u0000\u06f8\u06f9\t"+ + "\u0000\u0000\u0000\u06f9\u06fa\u0004^\u0011\u0000\u06fa\u06fb\u0001\u0000"+ + "\u0000\u0000\u06fb\u06fc\u0006^$\u0000\u06fc\u00c8\u0001\u0000\u0000\u0000"+ + "\u06fd\u06fe\t\u0000\u0000\u0000\u06fe\u06ff\u0001\u0000\u0000\u0000\u06ff"+ + "\u0700\u0006_\f\u0000\u0700\u00ca\u0001\u0000\u0000\u0000\u0701\u0702"+ + "\u0005\u0000\u0000\u0001\u0702\u0703\u0001\u0000\u0000\u0000\u0703\u0704"+ + "\u0006`$\u0000\u0704\u0705\u0006`\u000f\u0000\u0705\u00cc\u0001\u0000"+ + "\u0000\u0000c\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u00d5"+ + "\u0112\u0131\u014d\u0153\u015f\u016d\u0173\u0175\u0193\u0205\u020a\u0221"+ + "\u0250\u0287\u02ac\u02b6\u030e\u0311\u0329\u033e\u0345\u0356\u0358\u0365"+ + "\u036a\u0371\u0376\u0384\u0387\u0389\u0395\u039a\u039d\u03aa\u03ad\u03af"+ + "\u03b6\u03bb\u03bd\u03c6\u03d2\u03d9\u03e0\u03e8\u03ea\u03f3\u03f5\u0400"+ + "\u0418\u042c\u0430\u043b\u0441\u044d\u0459\u045e\u0460\u0561\u0566\u0569"+ + "\u0585\u058d\u05a1\u05a9\u05b6\u05ee\u066c\u0670\u0675\u0678\u067b\u067e"+ + "\u0682\u0686\u068b\u068e\u0692\u0696\u069a\u06ab\u06bc\u06c2\u06c9\u06cc"+ + "\u06d0\u06d4\u06da%\u0005\u0004\u0000\u0007\u0001\u0000\u0005\u0007\u0000"+ + "\u0007\u000b\u0000\u0005\u0006\u0000\u0005\u0002\u0000\u0007\u0005\u0000"+ + "\u0005\u0003\u0000\u0007\u0004\u0000\u0007\u0006\u0000\u0005\b\u0000\u0005"+ + "\u0001\u0000\u0003\u0000\u0000\u0005\n\u0000\u0007\u0007\u0000\u0004\u0000"+ + "\u0000\u00011\u0000\u00012\u0001\u0007\b\u0000\u00015\u0002\u00016\u0003"+ + "\u0005\u0005\u0000\u00019\u0004\u0001<\u0005\u0001<\u0006\u0001=\u0007"+ + "\u0007\u0002\u0000\u0002\u0000\u0000\u0001>\b\u0001>\t\u0001?\n\u0001"+ + "?\u000b\u0006\u0000\u0000\u0001B\f\u0000\u0002\u0000\u0005\t\u0000\u0007"+ + "\t\u0000"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java index 3700e3d3786d..fa2bf4287735 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java @@ -719,7 +719,7 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) } private static final String _serializedATNSegment0 = - "\u0004\u0000\u00ab\u0b4c\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ + "\u0004\u0000\u00ab\u0b96\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+ @@ -964,8 +964,9 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "}\u0001}\u0001}\u0003}\u07a9\b}\u0004}\u07ab\b}\u000b}\f}\u07ac\u0001"+ "}\u0001}\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0003~\u07b8"+ "\b~\u0001~\u0001~\u0001~\u0001~\u0003~\u07be\b~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0005~\u07c8\b~\n~\f~\u07cb\t~\u0001~\u0003"+ - "~\u07ce\b~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0004~\u07c8\b~\u000b~\f~\u07c9\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0004~\u07d4\b~\u000b~\f~"+ + "\u07d5\u0001~\u0001~\u0001~\u0003~\u07db\b~\u0003~\u07dd\b~\u0001~\u0001"+ "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ @@ -984,639 +985,645 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0003~\u0894\b~\u0001"+ - "~\u0005~\u0897\b~\n~\f~\u089a\t~\u0003~\u089c\b~\u0001~\u0001~\u0001\u007f"+ - "\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080"+ - "\u0001\u0080\u0001\u0081\u0003\u0081\u08a9\b\u0081\u0001\u0081\u0001\u0081"+ - "\u0001\u0081\u0004\u0081\u08ae\b\u0081\u000b\u0081\f\u0081\u08af\u0001"+ - "\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001"+ - "\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001"+ - "\u0084\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001"+ - "\u0085\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001"+ - "\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001"+ - "\u0088\u0001\u0088\u0001\u0088\u0001\u0089\u0001\u0089\u0001\u0089\u0001"+ - "\u0089\u0001\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001"+ - "\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008c\u0003\u008c\u08e1"+ - "\b\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0004\u008c\u08e6\b\u008c"+ - "\u000b\u008c\f\u008c\u08e7\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d"+ - "\u0001\u008d\u0001\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e"+ - "\u0001\u008e\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f"+ - "\u0001\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0091"+ - "\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092"+ - "\u0001\u0092\u0001\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093"+ - "\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095"+ - "\u0004\u0095\u0912\b\u0095\u000b\u0095\f\u0095\u0913\u0001\u0095\u0001"+ - "\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0004\u0096\u091c"+ - "\b\u0096\u000b\u0096\f\u0096\u091d\u0001\u0096\u0001\u0096\u0001\u0097"+ - "\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0098\u0001\u0098"+ - "\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0099\u0001\u0099"+ - "\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u009a\u0001\u009a\u0001\u009a"+ - "\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001\u009b"+ - "\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0001\u009c"+ - "\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009d\u0001\u009d"+ - "\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e"+ - "\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f\u0001\u009f"+ - "\u0001\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0"+ - "\u0001\u00a0\u0001\u00a1\u0004\u00a1\u095b\b\u00a1\u000b\u00a1\f\u00a1"+ - "\u095c\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001"+ - "\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001"+ - "\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001"+ - "\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001"+ - "\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001"+ - "\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001\u00a8\u0003\u00a8\u0981"+ - "\b\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001"+ - "\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0003\u00ab\u098c\b\u00ab\u0001"+ - "\u00ab\u0001\u00ab\u0001\u00ab\u0004\u00ab\u0991\b\u00ab\u000b\u00ab\f"+ - "\u00ab\u0992\u0001\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac"+ - "\u0001\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad"+ - "\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af"+ - "\u0001\u00af\u0001\u00af\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0"+ - "\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2"+ - "\u0004\u00b2\u09b2\b\u00b2\u000b\u00b2\f\u00b2\u09b3\u0001\u00b2\u0001"+ - "\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001"+ - "\u00b3\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001"+ - "\u00b5\u0004\u00b5\u09c4\b\u00b5\u000b\u00b5\f\u00b5\u09c5\u0001\u00b5"+ - "\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7"+ - "\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b9\u0001\u00b9"+ - "\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00bb"+ - "\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc\u0001\u00bc\u0001\u00bc"+ - "\u0003\u00bc\u09e1\b\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bd\u0001\u00bd"+ - "\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00be\u0001\u00be\u0001\u00be"+ - "\u0001\u00be\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00bf"+ - "\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c1\u0001\u00c1"+ - "\u0001\u00c1\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c3\u0001\u00c3"+ - "\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c4\u0001\u00c4\u0001\u00c4"+ - "\u0001\u00c4\u0001\u00c4\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c5"+ - "\u0001\u00c5\u0001\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c7\u0001\u00c7"+ - "\u0003\u00c7\u0a11\b\u00c7\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8"+ - "\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00ca\u0001\u00ca\u0001\u00ca"+ - "\u0001\u00ca\u0001\u00cb\u0001\u00cb\u0001\u00cc\u0001\u00cc\u0001\u00cc"+ - "\u0001\u00cd\u0004\u00cd\u0a24\b\u00cd\u000b\u00cd\f\u00cd\u0a25\u0001"+ - "\u00cd\u0001\u00cd\u0001\u00ce\u0001\u00ce\u0001\u00cf\u0001\u00cf\u0001"+ - "\u00cf\u0001\u00cf\u0001\u00d0\u0001\u00d0\u0001\u00d0\u0001\u00d0\u0001"+ - "\u00d0\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0004\u00d1\u0a39"+ - "\b\u00d1\u000b\u00d1\f\u00d1\u0a3a\u0001\u00d1\u0001\u00d1\u0001\u00d2"+ - "\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0005\u00d2\u0a43\b\u00d2\n\u00d2"+ - "\f\u00d2\u0a46\t\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2"+ - "\u0005\u00d2\u0a4c\b\u00d2\n\u00d2\f\u00d2\u0a4f\t\u00d2\u0001\u00d2\u0001"+ - "\u00d2\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001"+ - "\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d4\u0001"+ - "\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d5\u0001\u00d5\u0001"+ - "\u00d5\u0001\u00d5\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001"+ - "\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d8\u0001\u00d8\u0001"+ - "\u00d8\u0001\u00d8\u0001\u00d9\u0001\u00d9\u0003\u00d9\u0a74\b\u00d9\u0001"+ - "\u00d9\u0001\u00d9\u0001\u00da\u0001\u00da\u0001\u00da\u0001\u00da\u0001"+ - "\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001"+ - "\u00db\u0001\u00db\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001"+ - "\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dd\u0001\u00dd\u0001"+ - "\u00dd\u0001\u00dd\u0001\u00de\u0003\u00de\u0a91\b\u00de\u0001\u00de\u0001"+ - "\u00de\u0001\u00de\u0004\u00de\u0a96\b\u00de\u000b\u00de\f\u00de\u0a97"+ - "\u0001\u00de\u0001\u00de\u0001\u00df\u0001\u00df\u0001\u00df\u0001\u00df"+ - "\u0001\u00df\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e1"+ - "\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e2\u0001\u00e2"+ - "\u0001\u00e2\u0001\u00e2\u0001\u00e3\u0001\u00e3\u0001\u00e3\u0001\u00e3"+ - "\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e5\u0001\u00e5"+ - "\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e6\u0001\u00e6\u0001\u00e6"+ - "\u0001\u00e6\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7"+ - "\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0004\u00e8\u0ac8\b\u00e8"+ - "\u000b\u00e8\f\u00e8\u0ac9\u0001\u00e8\u0001\u00e8\u0001\u00e9\u0001\u00e9"+ - "\u0001\u00e9\u0001\u00e9\u0005\u00e9\u0ad2\b\u00e9\n\u00e9\f\u00e9\u0ad5"+ - "\t\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001"+ - "\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00eb\u0001\u00eb\u0001"+ - "\u00eb\u0001\u00eb\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001"+ - "\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ee\u0001\u00ee\u0003"+ - "\u00ee\u0aee\b\u00ee\u0001\u00ee\u0001\u00ee\u0001\u00ef\u0001\u00ef\u0001"+ - "\u00ef\u0001\u00ef\u0001\u00f0\u0001\u00f0\u0001\u00f0\u0001\u00f0\u0001"+ - "\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f2\u0001\u00f2\u0001"+ - "\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001"+ - "\u00f3\u0001\u00f3\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001"+ - "\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f6\u0001\u00f6\u0001"+ - "\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f7\u0001\u00f7\u0001\u00f7\u0001"+ - "\u00f7\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0003~\u08de\b~\u0001~\u0005~\u08e1\b~\n~\f~\u08e4"+ + "\t~\u0003~\u08e6\b~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f"+ + "\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0081"+ + "\u0003\u0081\u08f3\b\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0004\u0081"+ + "\u08f8\b\u0081\u000b\u0081\f\u0081\u08f9\u0001\u0081\u0001\u0081\u0001"+ + "\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001"+ + "\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001"+ + "\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001"+ + "\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001"+ + "\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0088\u0001"+ + "\u0088\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001"+ + "\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001"+ + "\u008b\u0001\u008b\u0001\u008c\u0003\u008c\u092b\b\u008c\u0001\u008c\u0001"+ + "\u008c\u0001\u008c\u0004\u008c\u0930\b\u008c\u000b\u008c\f\u008c\u0931"+ + "\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d"+ + "\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008f"+ + "\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u0090"+ + "\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0091\u0001\u0091\u0001\u0091"+ + "\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092"+ + "\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094"+ + "\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0004\u0095\u095c\b\u0095"+ + "\u000b\u0095\f\u0095\u095d\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095"+ + "\u0001\u0095\u0001\u0096\u0004\u0096\u0966\b\u0096\u000b\u0096\f\u0096"+ + "\u0967\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001"+ + "\u0097\u0001\u0097\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001"+ + "\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001"+ + "\u0099\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001"+ + "\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001"+ + "\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001"+ + "\u009c\u0001\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001"+ + "\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001"+ + "\u009e\u0001\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ + "\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0004"+ + "\u00a1\u09a5\b\u00a1\u000b\u00a1\f\u00a1\u09a6\u0001\u00a1\u0001\u00a1"+ + "\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3"+ + "\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001\u00a4"+ + "\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5"+ + "\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6"+ + "\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7"+ + "\u0001\u00a8\u0001\u00a8\u0003\u00a8\u09cb\b\u00a8\u0001\u00a9\u0001\u00a9"+ + "\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa"+ + "\u0001\u00ab\u0003\u00ab\u09d6\b\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab"+ + "\u0004\u00ab\u09db\b\u00ab\u000b\u00ab\f\u00ab\u09dc\u0001\u00ab\u0001"+ + "\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001"+ + "\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0001"+ + "\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0001\u00af\u0001"+ + "\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001"+ + "\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0004\u00b2\u09fc\b\u00b2\u000b"+ + "\u00b2\f\u00b2\u09fd\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001"+ + "\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001"+ + "\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5\u0004\u00b5\u0a0e\b\u00b5\u000b"+ + "\u00b5\f\u00b5\u0a0f\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001"+ + "\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001"+ + "\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001"+ + "\u00ba\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001"+ + "\u00bc\u0001\u00bc\u0001\u00bc\u0003\u00bc\u0a2b\b\u00bc\u0001\u00bc\u0001"+ + "\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001"+ + "\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00bf\u0001\u00bf\u0001"+ + "\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001"+ + "\u00c0\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c2\u0001\u00c2\u0001"+ + "\u00c2\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001"+ + "\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c5\u0001"+ + "\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c6\u0001\u00c6\u0001"+ + "\u00c6\u0001\u00c7\u0001\u00c7\u0003\u00c7\u0a5b\b\u00c7\u0001\u00c8\u0001"+ + "\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001"+ + "\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00cb\u0001\u00cb\u0001"+ + "\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cd\u0004\u00cd\u0a6e\b\u00cd\u000b"+ + "\u00cd\f\u00cd\u0a6f\u0001\u00cd\u0001\u00cd\u0001\u00ce\u0001\u00ce\u0001"+ + "\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00d0\u0001\u00d0\u0001"+ + "\u00d0\u0001\u00d0\u0001\u00d0\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001"+ + "\u00d1\u0004\u00d1\u0a83\b\u00d1\u000b\u00d1\f\u00d1\u0a84\u0001\u00d1"+ + "\u0001\u00d1\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0005\u00d2"+ + "\u0a8d\b\u00d2\n\u00d2\f\u00d2\u0a90\t\u00d2\u0001\u00d2\u0001\u00d2\u0001"+ + "\u00d2\u0001\u00d2\u0005\u00d2\u0a96\b\u00d2\n\u00d2\f\u00d2\u0a99\t\u00d2"+ + "\u0001\u00d2\u0001\u00d2\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3"+ + "\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3"+ + "\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d5"+ + "\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d6\u0001\u00d6\u0001\u00d6"+ + "\u0001\u00d6\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d8"+ + "\u0001\u00d8\u0001\u00d8\u0001\u00d8\u0001\u00d9\u0001\u00d9\u0003\u00d9"+ + "\u0abe\b\u00d9\u0001\u00d9\u0001\u00d9\u0001\u00da\u0001\u00da\u0001\u00da"+ + "\u0001\u00da\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db"+ + "\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00dc\u0001\u00dc\u0001\u00dc"+ + "\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dd"+ + "\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00de\u0003\u00de\u0adb\b\u00de"+ + "\u0001\u00de\u0001\u00de\u0001\u00de\u0004\u00de\u0ae0\b\u00de\u000b\u00de"+ + "\f\u00de\u0ae1\u0001\u00de\u0001\u00de\u0001\u00df\u0001\u00df\u0001\u00df"+ + "\u0001\u00df\u0001\u00df\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0"+ + "\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e2"+ + "\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001\u00e3\u0001\u00e3\u0001\u00e3"+ + "\u0001\u00e3\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e5"+ + "\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e6\u0001\u00e6"+ + "\u0001\u00e6\u0001\u00e6\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7"+ + "\u0001\u00e7\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0004\u00e8"+ + "\u0b12\b\u00e8\u000b\u00e8\f\u00e8\u0b13\u0001\u00e8\u0001\u00e8\u0001"+ + "\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0005\u00e9\u0b1c\b\u00e9\n"+ + "\u00e9\f\u00e9\u0b1f\t\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001"+ + "\u00e9\u0001\u00e9\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001"+ + "\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00ec\u0001\u00ec\u0001"+ + "\u00ec\u0001\u00ec\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001"+ + "\u00ee\u0001\u00ee\u0003\u00ee\u0b38\b\u00ee\u0001\u00ee\u0001\u00ee\u0001"+ + "\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00f0\u0001\u00f0\u0001"+ + "\u00f0\u0001\u00f0\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001"+ + "\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f3\u0001"+ + "\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f4\u0001\u00f4\u0001"+ + "\u00f4\u0001\u00f4\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001"+ + "\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f7\u0001"+ + "\u00f7\u0001\u00f7\u0001\u00f7\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ + "\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ "\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ - "\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f9\u0001"+ - "\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00fa\u0001\u00fa\u0001"+ - "\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fb\u0001\u00fb\u0001\u00fb\u0001"+ - "\u00fb\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001"+ - "\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fd\u0001\u00fd\u0001\u00fd\u0001"+ - "\u00fd\u0001\u00fd\u0001\u00fe\u0001\u00fe\u0001\u00fe\u0001\u00fe\u0001"+ - "\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0003\u0765\u0a44"+ - "\u0ad3\u0000\u0100\u000e\u0000\u0010\u0000\u0012\u0000\u0014\u0000\u0016"+ - "\u0000\u0018\u0000\u001a\u0019\u001c\u001a\u001e\u001b \u001c\"\u001d"+ - "$\u001e&\u001f( *!,\".#0$2%4&6\'8(:)<*>+@,B-D.F/H0J1L2N3P4R5T6V7X8Z9\\"+ - ":^;`f?h@jAlBnCpDrEtFvGxHzI|J~K\u0080L\u0082M\u0084N\u0086O\u0088"+ - "P\u008aQ\u008cR\u008eS\u0090T\u0092U\u0094V\u0096W\u0098X\u009aY\u009c"+ - "Z\u009e[\u00a0\\\u00a2]\u00a4^\u00a6_\u00a8`\u00aaa\u00acb\u00aec\u00b0"+ - "d\u00b2e\u00b4f\u00b6\u0000\u00b8g\u00bah\u00bci\u00bej\u00c0k\u00c2l"+ - "\u00c4m\u00c6n\u00c8o\u00cap\u00ccq\u00ce\u00a3\u00d0\u00a4\u00d2r\u00d4"+ - "s\u00d6\u0000\u00d8t\u00dau\u00dcv\u00de\u0000\u00e0\u0000\u00e2w\u00e4"+ - "x\u00e6y\u00e8z\u00ea{\u00ec|\u00ee}\u00f0\u0000\u00f2\u0000\u00f4\u0000"+ - "\u00f6\u0000\u00f8\u0000\u00fa\u0000\u00fc\u0000\u00fe\u0000\u0100\u0000"+ - "\u0102\u0000\u0104~\u0106\u0000\u0108\u0000\u010a\u0000\u010c\u0000\u010e"+ - "\u0000\u0110\u0000\u0112\u0000\u0114\u00a5\u0116\u007f\u0118\u00a6\u011a"+ - "\u00a7\u011c\u00a8\u011e\u0080\u0120\u0000\u0122\u0000\u0124\u0000\u0126"+ - "\u0000\u0128\u0000\u012a\u0000\u012c\u0081\u012e\u0000\u0130\u0000\u0132"+ - "\u0000\u0134\u0082\u0136\u0000\u0138\u0083\u013a\u0084\u013c\u0000\u013e"+ - "\u0000\u0140\u0000\u0142\u0000\u0144\u0000\u0146\u0000\u0148\u0000\u014a"+ - "\u0000\u014c\u0000\u014e\u0000\u0150\u0085\u0152\r\u0154\u0000\u0156\u0000"+ - "\u0158\u0000\u015a\u0000\u015c\u0000\u015e\u0086\u0160\u0000\u0162\u0000"+ - "\u0164\u0000\u0166\u0000\u0168\u0000\u016a\u0000\u016c\u0087\u016e\u0088"+ - "\u0170\u0000\u0172\u0089\u0174\u0000\u0176\u0000\u0178\u008a\u017a\u008b"+ - "\u017c\u008c\u017e\u008d\u0180\u0000\u0182\u008e\u0184\u0000\u0186\u0000"+ - "\u0188\u0000\u018a\u0000\u018c\u0000\u018e\u008f\u0190\u000f\u0192\u0090"+ - "\u0194\u0000\u0196\u0000\u0198\u0000\u019a\u0091\u019c\u0011\u019e\u0000"+ - "\u01a0\u0012\u01a2\u0000\u01a4\u0092\u01a6\u0093\u01a8\u0094\u01aa\u0095"+ - "\u01ac\u0000\u01ae\u0000\u01b0\u0096\u01b2\u0097\u01b4\u0098\u01b6\u0000"+ - "\u01b8\u0000\u01ba\u0000\u01bc\u00a9\u01be\u00aa\u01c0\u0000\u01c2\u0000"+ - "\u01c4\u0000\u01c6\u00ab\u01c8\u0000\u01ca\u0000\u01cc\u0000\u01ce\u0000"+ - "\u01d0\u0000\u01d2\u0000\u01d4\u0000\u01d6\u0099\u01d8\u0000\u01da\u009a"+ - "\u01dc\u009b\u01de\u009c\u01e0\u009d\u01e2\u0000\u01e4\u0000\u01e6\u0000"+ - "\u01e8\u0000\u01ea\u0015\u01ec\u0000\u01ee\u0000\u01f0\u0000\u01f2\u0000"+ - "\u01f4\u0000\u01f6\u0000\u01f8\u0000\u01fa\u0000\u01fc\u0000\u01fe\u0000"+ - "\u0200\u009e\u0202\u0000\u0204\u0000\u0206\u009f\u0208\u00a0\u020a\u00a1"+ - "\u020c\u00a2\u000e\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t"+ - "\n\u000b\f\r\'\u0003\u0000AZaz\u0080\u8000\ufffe\u0006\u0000-.0:AZ__a"+ - "z\u0080\u8000\ufffe\u0002\u0000##..\u0006\u0000--0:AZ__az\u0080\u8000"+ - "\ufffe\u0002\u0000\'\'\\\\\u0002\u0000IIii\u0002\u0000FFff\u0002\u0000"+ - "EEee\u0002\u0000LLll\u0002\u0000SSss\u0002\u0000NNnn\u0002\u0000DDdd\u0002"+ - "\u0000WWww\u0002\u0000TTtt\u0002\u0000CCcc\u0002\u0000HHhh\u0002\u0000"+ - "AAaa\u0002\u0000UUuu\u0002\u0000MMmm\u0002\u0000PPpp\u0002\u0000YYyy\u0002"+ - "\u0000OOoo\u0002\u0000RRrr\u0002\u0000BBbb\u0002\u0000KKkk\u0002\u0000"+ - "XXxx\u0002\u0000JJjj\u0002\u0000GGgg\u0002\u0000VVvv\u0002\u0000QQqq\u0003"+ - "\u0000\n\n\r\r \u0002\u0000\n\n\r\r\u0004\u0000AZ__az\u0080\u8000\ufffe"+ - "\u0005\u000009AZ__az\u0080\u8000\ufffe\u0006\u0000..09AZ__az\u0080\u8000"+ - "\ufffe\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002\u0000\"\"\\\\\u0001"+ - "\u0000 \u0003\u0000\t\n\r\r \u0bac\u0000\u001a\u0001\u0000\u0000\u0000"+ - "\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000"+ - "\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000"+ - "$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001"+ - "\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000"+ - "\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u0000"+ - "2\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006\u0001"+ - "\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000"+ - "\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000"+ - "@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001"+ - "\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000"+ - "\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0000"+ - "N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000\u0000R\u0001"+ - "\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V\u0001\u0000\u0000"+ - "\u0000\u0000X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000"+ - "\\\u0001\u0000\u0000\u0000\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001"+ - "\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000\u0000d\u0001\u0000\u0000"+ - "\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001\u0000\u0000\u0000\u0000"+ - "j\u0001\u0000\u0000\u0000\u0000l\u0001\u0000\u0000\u0000\u0000n\u0001"+ - "\u0000\u0000\u0000\u0000p\u0001\u0000\u0000\u0000\u0000r\u0001\u0000\u0000"+ - "\u0000\u0000t\u0001\u0000\u0000\u0000\u0000v\u0001\u0000\u0000\u0000\u0000"+ - "x\u0001\u0000\u0000\u0000\u0000z\u0001\u0000\u0000\u0000\u0000|\u0001"+ - "\u0000\u0000\u0000\u0000~\u0001\u0000\u0000\u0000\u0000\u0080\u0001\u0000"+ - "\u0000\u0000\u0000\u0082\u0001\u0000\u0000\u0000\u0000\u0084\u0001\u0000"+ - "\u0000\u0000\u0000\u0086\u0001\u0000\u0000\u0000\u0000\u0088\u0001\u0000"+ - "\u0000\u0000\u0000\u008a\u0001\u0000\u0000\u0000\u0000\u008c\u0001\u0000"+ - "\u0000\u0000\u0000\u008e\u0001\u0000\u0000\u0000\u0000\u0090\u0001\u0000"+ - "\u0000\u0000\u0000\u0092\u0001\u0000\u0000\u0000\u0000\u0094\u0001\u0000"+ - "\u0000\u0000\u0000\u0096\u0001\u0000\u0000\u0000\u0000\u0098\u0001\u0000"+ - "\u0000\u0000\u0000\u009a\u0001\u0000\u0000\u0000\u0000\u009c\u0001\u0000"+ - "\u0000\u0000\u0000\u009e\u0001\u0000\u0000\u0000\u0000\u00a0\u0001\u0000"+ - "\u0000\u0000\u0000\u00a2\u0001\u0000\u0000\u0000\u0000\u00a4\u0001\u0000"+ - "\u0000\u0000\u0000\u00a6\u0001\u0000\u0000\u0000\u0000\u00a8\u0001\u0000"+ - "\u0000\u0000\u0000\u00aa\u0001\u0000\u0000\u0000\u0000\u00ac\u0001\u0000"+ - "\u0000\u0000\u0000\u00ae\u0001\u0000\u0000\u0000\u0000\u00b0\u0001\u0000"+ - "\u0000\u0000\u0000\u00b2\u0001\u0000\u0000\u0000\u0000\u00b4\u0001\u0000"+ - "\u0000\u0000\u0000\u00b6\u0001\u0000\u0000\u0000\u0000\u00b8\u0001\u0000"+ - "\u0000\u0000\u0000\u00ba\u0001\u0000\u0000\u0000\u0000\u00bc\u0001\u0000"+ - "\u0000\u0000\u0000\u00be\u0001\u0000\u0000\u0000\u0000\u00c0\u0001\u0000"+ - "\u0000\u0000\u0000\u00c2\u0001\u0000\u0000\u0000\u0000\u00c4\u0001\u0000"+ - "\u0000\u0000\u0000\u00c6\u0001\u0000\u0000\u0000\u0000\u00c8\u0001\u0000"+ - "\u0000\u0000\u0000\u00ca\u0001\u0000\u0000\u0000\u0000\u00cc\u0001\u0000"+ - "\u0000\u0000\u0000\u00ce\u0001\u0000\u0000\u0000\u0000\u00d0\u0001\u0000"+ - "\u0000\u0000\u0000\u00d2\u0001\u0000\u0000\u0000\u0000\u00d4\u0001\u0000"+ - "\u0000\u0000\u0000\u00d6\u0001\u0000\u0000\u0000\u0000\u00d8\u0001\u0000"+ - "\u0000\u0000\u0000\u00da\u0001\u0000\u0000\u0000\u0000\u00dc\u0001\u0000"+ - "\u0000\u0000\u0000\u00de\u0001\u0000\u0000\u0000\u0000\u00e0\u0001\u0000"+ - "\u0000\u0000\u0000\u00e2\u0001\u0000\u0000\u0000\u0000\u00e4\u0001\u0000"+ - "\u0000\u0000\u0000\u00e6\u0001\u0000\u0000\u0000\u0000\u00e8\u0001\u0000"+ - "\u0000\u0000\u0000\u00ea\u0001\u0000\u0000\u0000\u0000\u00ec\u0001\u0000"+ - "\u0000\u0000\u0000\u00ee\u0001\u0000\u0000\u0000\u0000\u0104\u0001\u0000"+ - "\u0000\u0000\u0000\u0106\u0001\u0000\u0000\u0000\u0000\u0108\u0001\u0000"+ - "\u0000\u0000\u0000\u010a\u0001\u0000\u0000\u0000\u0001\u010c\u0001\u0000"+ - "\u0000\u0000\u0001\u010e\u0001\u0000\u0000\u0000\u0001\u0110\u0001\u0000"+ - "\u0000\u0000\u0001\u0112\u0001\u0000\u0000\u0000\u0001\u0114\u0001\u0000"+ - "\u0000\u0000\u0001\u0116\u0001\u0000\u0000\u0000\u0001\u0118\u0001\u0000"+ - "\u0000\u0000\u0001\u011a\u0001\u0000\u0000\u0000\u0001\u011c\u0001\u0000"+ - "\u0000\u0000\u0001\u011e\u0001\u0000\u0000\u0000\u0001\u0120\u0001\u0000"+ - "\u0000\u0000\u0002\u0122\u0001\u0000\u0000\u0000\u0002\u0124\u0001\u0000"+ - "\u0000\u0000\u0002\u0126\u0001\u0000\u0000\u0000\u0002\u0128\u0001\u0000"+ - "\u0000\u0000\u0002\u012a\u0001\u0000\u0000\u0000\u0002\u012c\u0001\u0000"+ - "\u0000\u0000\u0002\u012e\u0001\u0000\u0000\u0000\u0002\u0130\u0001\u0000"+ - "\u0000\u0000\u0002\u0132\u0001\u0000\u0000\u0000\u0002\u0134\u0001\u0000"+ - "\u0000\u0000\u0002\u0136\u0001\u0000\u0000\u0000\u0003\u0138\u0001\u0000"+ - "\u0000\u0000\u0003\u013a\u0001\u0000\u0000\u0000\u0003\u013c\u0001\u0000"+ - "\u0000\u0000\u0003\u013e\u0001\u0000\u0000\u0000\u0003\u0140\u0001\u0000"+ - "\u0000\u0000\u0004\u0142\u0001\u0000\u0000\u0000\u0004\u0144\u0001\u0000"+ - "\u0000\u0000\u0004\u0146\u0001\u0000\u0000\u0000\u0004\u0148\u0001\u0000"+ - "\u0000\u0000\u0004\u014a\u0001\u0000\u0000\u0000\u0004\u014c\u0001\u0000"+ - "\u0000\u0000\u0004\u014e\u0001\u0000\u0000\u0000\u0005\u0150\u0001\u0000"+ - "\u0000\u0000\u0005\u0152\u0001\u0000\u0000\u0000\u0005\u0154\u0001\u0000"+ - "\u0000\u0000\u0006\u0156\u0001\u0000\u0000\u0000\u0006\u0158\u0001\u0000"+ - "\u0000\u0000\u0006\u015a\u0001\u0000\u0000\u0000\u0006\u015c\u0001\u0000"+ - "\u0000\u0000\u0006\u015e\u0001\u0000\u0000\u0000\u0006\u0160\u0001\u0000"+ - "\u0000\u0000\u0006\u0162\u0001\u0000\u0000\u0000\u0006\u0164\u0001\u0000"+ - "\u0000\u0000\u0006\u0166\u0001\u0000\u0000\u0000\u0006\u0168\u0001\u0000"+ - "\u0000\u0000\u0006\u016a\u0001\u0000\u0000\u0000\u0006\u016c\u0001\u0000"+ - "\u0000\u0000\u0006\u016e\u0001\u0000\u0000\u0000\u0006\u0170\u0001\u0000"+ - "\u0000\u0000\u0007\u0172\u0001\u0000\u0000\u0000\u0007\u0174\u0001\u0000"+ - "\u0000\u0000\u0007\u0176\u0001\u0000\u0000\u0000\b\u0178\u0001\u0000\u0000"+ - "\u0000\b\u017a\u0001\u0000\u0000\u0000\b\u017c\u0001\u0000\u0000\u0000"+ - "\b\u017e\u0001\u0000\u0000\u0000\b\u0180\u0001\u0000\u0000\u0000\b\u0182"+ - "\u0001\u0000\u0000\u0000\b\u0184\u0001\u0000\u0000\u0000\b\u0186\u0001"+ - "\u0000\u0000\u0000\b\u0188\u0001\u0000\u0000\u0000\b\u018a\u0001\u0000"+ - "\u0000\u0000\b\u018c\u0001\u0000\u0000\u0000\t\u018e\u0001\u0000\u0000"+ - "\u0000\t\u0190\u0001\u0000\u0000\u0000\t\u0192\u0001\u0000\u0000\u0000"+ - "\t\u0194\u0001\u0000\u0000\u0000\t\u0196\u0001\u0000\u0000\u0000\t\u0198"+ - "\u0001\u0000\u0000\u0000\t\u019a\u0001\u0000\u0000\u0000\t\u019c\u0001"+ - "\u0000\u0000\u0000\t\u019e\u0001\u0000\u0000\u0000\t\u01a0\u0001\u0000"+ - "\u0000\u0000\t\u01a2\u0001\u0000\u0000\u0000\t\u01a4\u0001\u0000\u0000"+ - "\u0000\t\u01a6\u0001\u0000\u0000\u0000\t\u01a8\u0001\u0000\u0000\u0000"+ - "\t\u01aa\u0001\u0000\u0000\u0000\t\u01ac\u0001\u0000\u0000\u0000\t\u01ae"+ - "\u0001\u0000\u0000\u0000\n\u01b0\u0001\u0000\u0000\u0000\n\u01b2\u0001"+ - "\u0000\u0000\u0000\n\u01b4\u0001\u0000\u0000\u0000\n\u01b6\u0001\u0000"+ - "\u0000\u0000\n\u01b8\u0001\u0000\u0000\u0000\n\u01ba\u0001\u0000\u0000"+ - "\u0000\n\u01bc\u0001\u0000\u0000\u0000\n\u01be\u0001\u0000\u0000\u0000"+ - "\n\u01c0\u0001\u0000\u0000\u0000\n\u01c2\u0001\u0000\u0000\u0000\n\u01c4"+ - "\u0001\u0000\u0000\u0000\n\u01c6\u0001\u0000\u0000\u0000\n\u01c8\u0001"+ - "\u0000\u0000\u0000\n\u01ca\u0001\u0000\u0000\u0000\n\u01cc\u0001\u0000"+ - "\u0000\u0000\n\u01ce\u0001\u0000\u0000\u0000\n\u01d0\u0001\u0000\u0000"+ - "\u0000\n\u01d2\u0001\u0000\u0000\u0000\n\u01d4\u0001\u0000\u0000\u0000"+ - "\n\u01d6\u0001\u0000\u0000\u0000\n\u01d8\u0001\u0000\u0000\u0000\n\u01da"+ - "\u0001\u0000\u0000\u0000\u000b\u01dc\u0001\u0000\u0000\u0000\u000b\u01de"+ - "\u0001\u0000\u0000\u0000\u000b\u01e0\u0001\u0000\u0000\u0000\u000b\u01e2"+ - "\u0001\u0000\u0000\u0000\u000b\u01e4\u0001\u0000\u0000\u0000\u000b\u01e6"+ - "\u0001\u0000\u0000\u0000\u000b\u01e8\u0001\u0000\u0000\u0000\u000b\u01ea"+ - "\u0001\u0000\u0000\u0000\u000b\u01ec\u0001\u0000\u0000\u0000\u000b\u01ee"+ - "\u0001\u0000\u0000\u0000\u000b\u01f0\u0001\u0000\u0000\u0000\u000b\u01f2"+ - "\u0001\u0000\u0000\u0000\u000b\u01f4\u0001\u0000\u0000\u0000\u000b\u01f6"+ - "\u0001\u0000\u0000\u0000\u000b\u01f8\u0001\u0000\u0000\u0000\u000b\u01fa"+ - "\u0001\u0000\u0000\u0000\u000b\u01fc\u0001\u0000\u0000\u0000\f\u01fe\u0001"+ - "\u0000\u0000\u0000\f\u0200\u0001\u0000\u0000\u0000\f\u0202\u0001\u0000"+ - "\u0000\u0000\f\u0204\u0001\u0000\u0000\u0000\r\u0206\u0001\u0000\u0000"+ - "\u0000\r\u0208\u0001\u0000\u0000\u0000\r\u020a\u0001\u0000\u0000\u0000"+ - "\r\u020c\u0001\u0000\u0000\u0000\u000e\u020e\u0001\u0000\u0000\u0000\u0010"+ - "\u0220\u0001\u0000\u0000\u0000\u0012\u0222\u0001\u0000\u0000\u0000\u0014"+ - "\u0269\u0001\u0000\u0000\u0000\u0016\u026b\u0001\u0000\u0000\u0000\u0018"+ - "\u027c\u0001\u0000\u0000\u0000\u001a\u027e\u0001\u0000\u0000\u0000\u001c"+ - "\u0284\u0001\u0000\u0000\u0000\u001e\u028e\u0001\u0000\u0000\u0000 \u0294"+ - "\u0001\u0000\u0000\u0000\"\u029b\u0001\u0000\u0000\u0000$\u02a5\u0001"+ - "\u0000\u0000\u0000&\u02ad\u0001\u0000\u0000\u0000(\u02b6\u0001\u0000\u0000"+ - "\u0000*\u02c1\u0001\u0000\u0000\u0000,\u02ca\u0001\u0000\u0000\u0000."+ - "\u02e1\u0001\u0000\u0000\u00000\u02f8\u0001\u0000\u0000\u00002\u02fa\u0001"+ - "\u0000\u0000\u00004\u0305\u0001\u0000\u0000\u00006\u0311\u0001\u0000\u0000"+ - "\u00008\u0318\u0001\u0000\u0000\u0000:\u0320\u0001\u0000\u0000\u0000<"+ - "\u032b\u0001\u0000\u0000\u0000>\u0337\u0001\u0000\u0000\u0000@\u0340\u0001"+ - "\u0000\u0000\u0000B\u034a\u0001\u0000\u0000\u0000D\u0353\u0001\u0000\u0000"+ - "\u0000F\u035f\u0001\u0000\u0000\u0000H\u036a\u0001\u0000\u0000\u0000J"+ - "\u0377\u0001\u0000\u0000\u0000L\u0386\u0001\u0000\u0000\u0000N\u0396\u0001"+ - "\u0000\u0000\u0000P\u03a7\u0001\u0000\u0000\u0000R\u03af\u0001\u0000\u0000"+ - "\u0000T\u03ba\u0001\u0000\u0000\u0000V\u03c0\u0001\u0000\u0000\u0000X"+ - "\u03c8\u0001\u0000\u0000\u0000Z\u03d3\u0001\u0000\u0000\u0000\\\u03e1"+ - "\u0001\u0000\u0000\u0000^\u03f3\u0001\u0000\u0000\u0000`\u03ff\u0001\u0000"+ - "\u0000\u0000b\u0408\u0001\u0000\u0000\u0000d\u0410\u0001\u0000\u0000\u0000"+ - "f\u0416\u0001\u0000\u0000\u0000h\u0421\u0001\u0000\u0000\u0000j\u0427"+ - "\u0001\u0000\u0000\u0000l\u042f\u0001\u0000\u0000\u0000n\u0435\u0001\u0000"+ - "\u0000\u0000p\u043e\u0001\u0000\u0000\u0000r\u0447\u0001\u0000\u0000\u0000"+ - "t\u044f\u0001\u0000\u0000\u0000v\u0458\u0001\u0000\u0000\u0000x\u0462"+ - "\u0001\u0000\u0000\u0000z\u046d\u0001\u0000\u0000\u0000|\u0479\u0001\u0000"+ - "\u0000\u0000~\u0486\u0001\u0000\u0000\u0000\u0080\u0491\u0001\u0000\u0000"+ - "\u0000\u0082\u049d\u0001\u0000\u0000\u0000\u0084\u04a6\u0001\u0000\u0000"+ - "\u0000\u0086\u04b2\u0001\u0000\u0000\u0000\u0088\u04bf\u0001\u0000\u0000"+ - "\u0000\u008a\u04c5\u0001\u0000\u0000\u0000\u008c\u04cf\u0001\u0000\u0000"+ - "\u0000\u008e\u04d8\u0001\u0000\u0000\u0000\u0090\u04e2\u0001\u0000\u0000"+ - "\u0000\u0092\u04ee\u0001\u0000\u0000\u0000\u0094\u04fd\u0001\u0000\u0000"+ - "\u0000\u0096\u0504\u0001\u0000\u0000\u0000\u0098\u0517\u0001\u0000\u0000"+ - "\u0000\u009a\u052c\u0001\u0000\u0000\u0000\u009c\u052e\u0001\u0000\u0000"+ - "\u0000\u009e\u053d\u0001\u0000\u0000\u0000\u00a0\u0550\u0001\u0000\u0000"+ - "\u0000\u00a2\u0560\u0001\u0000\u0000\u0000\u00a4\u0569\u0001\u0000\u0000"+ - "\u0000\u00a6\u059e\u0001\u0000\u0000\u0000\u00a8\u05a2\u0001\u0000\u0000"+ - "\u0000\u00aa\u05ab\u0001\u0000\u0000\u0000\u00ac\u05b6\u0001\u0000\u0000"+ - "\u0000\u00ae\u05ca\u0001\u0000\u0000\u0000\u00b0\u05ce\u0001\u0000\u0000"+ - "\u0000\u00b2\u05d6\u0001\u0000\u0000\u0000\u00b4\u05dd\u0001\u0000\u0000"+ - "\u0000\u00b6\u05e7\u0001\u0000\u0000\u0000\u00b8\u05f4\u0001\u0000\u0000"+ - "\u0000\u00ba\u05fd\u0001\u0000\u0000\u0000\u00bc\u0609\u0001\u0000\u0000"+ - "\u0000\u00be\u0653\u0001\u0000\u0000\u0000\u00c0\u0655\u0001\u0000\u0000"+ - "\u0000\u00c2\u065d\u0001\u0000\u0000\u0000\u00c4\u066f\u0001\u0000\u0000"+ - "\u0000\u00c6\u0675\u0001\u0000\u0000\u0000\u00c8\u0679\u0001\u0000\u0000"+ - "\u0000\u00ca\u067d\u0001\u0000\u0000\u0000\u00cc\u0682\u0001\u0000\u0000"+ - "\u0000\u00ce\u0688\u0001\u0000\u0000\u0000\u00d0\u068c\u0001\u0000\u0000"+ - "\u0000\u00d2\u0699\u0001\u0000\u0000\u0000\u00d4\u069d\u0001\u0000\u0000"+ - "\u0000\u00d6\u06af\u0001\u0000\u0000\u0000\u00d8\u06cb\u0001\u0000\u0000"+ - "\u0000\u00da\u06cf\u0001\u0000\u0000\u0000\u00dc\u06de\u0001\u0000\u0000"+ - "\u0000\u00de\u06e4\u0001\u0000\u0000\u0000\u00e0\u06eb\u0001\u0000\u0000"+ - "\u0000\u00e2\u06fc\u0001\u0000\u0000\u0000\u00e4\u0703\u0001\u0000\u0000"+ - "\u0000\u00e6\u0722\u0001\u0000\u0000\u0000\u00e8\u0732\u0001\u0000\u0000"+ - "\u0000\u00ea\u0735\u0001\u0000\u0000\u0000\u00ec\u0741\u0001\u0000\u0000"+ - "\u0000\u00ee\u0745\u0001\u0000\u0000\u0000\u00f0\u0749\u0001\u0000\u0000"+ - "\u0000\u00f2\u0750\u0001\u0000\u0000\u0000\u00f4\u0757\u0001\u0000\u0000"+ - "\u0000\u00f6\u075e\u0001\u0000\u0000\u0000\u00f8\u0760\u0001\u0000\u0000"+ - "\u0000\u00fa\u076a\u0001\u0000\u0000\u0000\u00fc\u0775\u0001\u0000\u0000"+ - "\u0000\u00fe\u077e\u0001\u0000\u0000\u0000\u0100\u0793\u0001\u0000\u0000"+ - "\u0000\u0102\u0795\u0001\u0000\u0000\u0000\u0104\u0797\u0001\u0000\u0000"+ - "\u0000\u0106\u079f\u0001\u0000\u0000\u0000\u0108\u07a5\u0001\u0000\u0000"+ - "\u0000\u010a\u089b\u0001\u0000\u0000\u0000\u010c\u089f\u0001\u0000\u0000"+ - "\u0000\u010e\u08a3\u0001\u0000\u0000\u0000\u0110\u08a8\u0001\u0000\u0000"+ - "\u0000\u0112\u08b3\u0001\u0000\u0000\u0000\u0114\u08b7\u0001\u0000\u0000"+ - "\u0000\u0116\u08bc\u0001\u0000\u0000\u0000\u0118\u08c1\u0001\u0000\u0000"+ - "\u0000\u011a\u08c5\u0001\u0000\u0000\u0000\u011c\u08c9\u0001\u0000\u0000"+ - "\u0000\u011e\u08ce\u0001\u0000\u0000\u0000\u0120\u08d2\u0001\u0000\u0000"+ - "\u0000\u0122\u08d7\u0001\u0000\u0000\u0000\u0124\u08db\u0001\u0000\u0000"+ - "\u0000\u0126\u08e0\u0001\u0000\u0000\u0000\u0128\u08eb\u0001\u0000\u0000"+ - "\u0000\u012a\u08ef\u0001\u0000\u0000\u0000\u012c\u08f4\u0001\u0000\u0000"+ - "\u0000\u012e\u08fa\u0001\u0000\u0000\u0000\u0130\u08fe\u0001\u0000\u0000"+ - "\u0000\u0132\u0902\u0001\u0000\u0000\u0000\u0134\u0907\u0001\u0000\u0000"+ - "\u0000\u0136\u090b\u0001\u0000\u0000\u0000\u0138\u0911\u0001\u0000\u0000"+ - "\u0000\u013a\u091b\u0001\u0000\u0000\u0000\u013c\u0921\u0001\u0000\u0000"+ - "\u0000\u013e\u0926\u0001\u0000\u0000\u0000\u0140\u092c\u0001\u0000\u0000"+ - "\u0000\u0142\u0931\u0001\u0000\u0000\u0000\u0144\u0937\u0001\u0000\u0000"+ - "\u0000\u0146\u093e\u0001\u0000\u0000\u0000\u0148\u0944\u0001\u0000\u0000"+ - "\u0000\u014a\u094a\u0001\u0000\u0000\u0000\u014c\u0950\u0001\u0000\u0000"+ - "\u0000\u014e\u0954\u0001\u0000\u0000\u0000\u0150\u095a\u0001\u0000\u0000"+ - "\u0000\u0152\u0960\u0001\u0000\u0000\u0000\u0154\u0965\u0001\u0000\u0000"+ - "\u0000\u0156\u096a\u0001\u0000\u0000\u0000\u0158\u096f\u0001\u0000\u0000"+ - "\u0000\u015a\u0974\u0001\u0000\u0000\u0000\u015c\u0979\u0001\u0000\u0000"+ - "\u0000\u015e\u0980\u0001\u0000\u0000\u0000\u0160\u0982\u0001\u0000\u0000"+ - "\u0000\u0162\u0986\u0001\u0000\u0000\u0000\u0164\u098b\u0001\u0000\u0000"+ - "\u0000\u0166\u0996\u0001\u0000\u0000\u0000\u0168\u099a\u0001\u0000\u0000"+ - "\u0000\u016a\u099f\u0001\u0000\u0000\u0000\u016c\u09a4\u0001\u0000\u0000"+ - "\u0000\u016e\u09a7\u0001\u0000\u0000\u0000\u0170\u09ab\u0001\u0000\u0000"+ - "\u0000\u0172\u09b1\u0001\u0000\u0000\u0000\u0174\u09b7\u0001\u0000\u0000"+ - "\u0000\u0176\u09bd\u0001\u0000\u0000\u0000\u0178\u09c3\u0001\u0000\u0000"+ - "\u0000\u017a\u09c9\u0001\u0000\u0000\u0000\u017c\u09cc\u0001\u0000\u0000"+ - "\u0000\u017e\u09cf\u0001\u0000\u0000\u0000\u0180\u09d2\u0001\u0000\u0000"+ - "\u0000\u0182\u09d6\u0001\u0000\u0000\u0000\u0184\u09d9\u0001\u0000\u0000"+ - "\u0000\u0186\u09e0\u0001\u0000\u0000\u0000\u0188\u09e4\u0001\u0000\u0000"+ - "\u0000\u018a\u09e9\u0001\u0000\u0000\u0000\u018c\u09ed\u0001\u0000\u0000"+ - "\u0000\u018e\u09f2\u0001\u0000\u0000\u0000\u0190\u09f6\u0001\u0000\u0000"+ - "\u0000\u0192\u09f9\u0001\u0000\u0000\u0000\u0194\u09fc\u0001\u0000\u0000"+ - "\u0000\u0196\u0a01\u0001\u0000\u0000\u0000\u0198\u0a06\u0001\u0000\u0000"+ - "\u0000\u019a\u0a0b\u0001\u0000\u0000\u0000\u019c\u0a10\u0001\u0000\u0000"+ - "\u0000\u019e\u0a12\u0001\u0000\u0000\u0000\u01a0\u0a16\u0001\u0000\u0000"+ - "\u0000\u01a2\u0a19\u0001\u0000\u0000\u0000\u01a4\u0a1d\u0001\u0000\u0000"+ - "\u0000\u01a6\u0a1f\u0001\u0000\u0000\u0000\u01a8\u0a23\u0001\u0000\u0000"+ - "\u0000\u01aa\u0a29\u0001\u0000\u0000\u0000\u01ac\u0a2b\u0001\u0000\u0000"+ - "\u0000\u01ae\u0a2f\u0001\u0000\u0000\u0000\u01b0\u0a34\u0001\u0000\u0000"+ - "\u0000\u01b2\u0a3e\u0001\u0000\u0000\u0000\u01b4\u0a52\u0001\u0000\u0000"+ - "\u0000\u01b6\u0a5c\u0001\u0000\u0000\u0000\u01b8\u0a61\u0001\u0000\u0000"+ - "\u0000\u01ba\u0a65\u0001\u0000\u0000\u0000\u01bc\u0a69\u0001\u0000\u0000"+ - "\u0000\u01be\u0a6d\u0001\u0000\u0000\u0000\u01c0\u0a73\u0001\u0000\u0000"+ - "\u0000\u01c2\u0a77\u0001\u0000\u0000\u0000\u01c4\u0a7b\u0001\u0000\u0000"+ - "\u0000\u01c6\u0a83\u0001\u0000\u0000\u0000\u01c8\u0a8b\u0001\u0000\u0000"+ - "\u0000\u01ca\u0a90\u0001\u0000\u0000\u0000\u01cc\u0a9b\u0001\u0000\u0000"+ - "\u0000\u01ce\u0aa0\u0001\u0000\u0000\u0000\u01d0\u0aa4\u0001\u0000\u0000"+ - "\u0000\u01d2\u0aa9\u0001\u0000\u0000\u0000\u01d4\u0aad\u0001\u0000\u0000"+ - "\u0000\u01d6\u0ab1\u0001\u0000\u0000\u0000\u01d8\u0ab5\u0001\u0000\u0000"+ - "\u0000\u01da\u0aba\u0001\u0000\u0000\u0000\u01dc\u0abe\u0001\u0000\u0000"+ - "\u0000\u01de\u0ac3\u0001\u0000\u0000\u0000\u01e0\u0acd\u0001\u0000\u0000"+ - "\u0000\u01e2\u0adb\u0001\u0000\u0000\u0000\u01e4\u0adf\u0001\u0000\u0000"+ - "\u0000\u01e6\u0ae3\u0001\u0000\u0000\u0000\u01e8\u0ae7\u0001\u0000\u0000"+ - "\u0000\u01ea\u0aed\u0001\u0000\u0000\u0000\u01ec\u0af1\u0001\u0000\u0000"+ - "\u0000\u01ee\u0af5\u0001\u0000\u0000\u0000\u01f0\u0af9\u0001\u0000\u0000"+ - "\u0000\u01f2\u0afd\u0001\u0000\u0000\u0000\u01f4\u0b02\u0001\u0000\u0000"+ - "\u0000\u01f6\u0b07\u0001\u0000\u0000\u0000\u01f8\u0b0b\u0001\u0000\u0000"+ - "\u0000\u01fa\u0b0f\u0001\u0000\u0000\u0000\u01fc\u0b14\u0001\u0000\u0000"+ - "\u0000\u01fe\u0b18\u0001\u0000\u0000\u0000\u0200\u0b28\u0001\u0000\u0000"+ - "\u0000\u0202\u0b2d\u0001\u0000\u0000\u0000\u0204\u0b32\u0001\u0000\u0000"+ - "\u0000\u0206\u0b36\u0001\u0000\u0000\u0000\u0208\u0b3e\u0001\u0000\u0000"+ - "\u0000\u020a\u0b43\u0001\u0000\u0000\u0000\u020c\u0b47\u0001\u0000\u0000"+ - "\u0000\u020e\u0212\u0007\u0000\u0000\u0000\u020f\u0211\u0007\u0001\u0000"+ - "\u0000\u0210\u020f\u0001\u0000\u0000\u0000\u0211\u0214\u0001\u0000\u0000"+ - "\u0000\u0212\u0210\u0001\u0000\u0000\u0000\u0212\u0213\u0001\u0000\u0000"+ - "\u0000\u0213\u000f\u0001\u0000\u0000\u0000\u0214\u0212\u0001\u0000\u0000"+ - "\u0000\u0215\u0217\u0007\u0002\u0000\u0000\u0216\u0215\u0001\u0000\u0000"+ - "\u0000\u0216\u0217\u0001\u0000\u0000\u0000\u0217\u0218\u0001\u0000\u0000"+ - "\u0000\u0218\u021c\u0007\u0000\u0000\u0000\u0219\u021b\u0007\u0003\u0000"+ - "\u0000\u021a\u0219\u0001\u0000\u0000\u0000\u021b\u021e\u0001\u0000\u0000"+ - "\u0000\u021c\u021a\u0001\u0000\u0000\u0000\u021c\u021d\u0001\u0000\u0000"+ - "\u0000\u021d\u0221\u0001\u0000\u0000\u0000\u021e\u021c\u0001\u0000\u0000"+ - "\u0000\u021f\u0221\u0003\u0016\u0004\u0000\u0220\u0216\u0001\u0000\u0000"+ - "\u0000\u0220\u021f\u0001\u0000\u0000\u0000\u0221\u0011\u0001\u0000\u0000"+ - "\u0000\u0222\u0223\u0003\u00f0q\u0000\u0223\u0227\u0005(\u0000\u0000\u0224"+ - "\u0226\u0003\u00f0q\u0000\u0225\u0224\u0001\u0000\u0000\u0000\u0226\u0229"+ - "\u0001\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000\u0000\u0227\u0228"+ - "\u0001\u0000\u0000\u0000\u0228\u0234\u0001\u0000\u0000\u0000\u0229\u0227"+ - "\u0001\u0000\u0000\u0000\u022a\u022e\u0005,\u0000\u0000\u022b\u022d\u0005"+ - " \u0000\u0000\u022c\u022b\u0001\u0000\u0000\u0000\u022d\u0230\u0001\u0000"+ - "\u0000\u0000\u022e\u022c\u0001\u0000\u0000\u0000\u022e\u022f\u0001\u0000"+ - "\u0000\u0000\u022f\u0231\u0001\u0000\u0000\u0000\u0230\u022e\u0001\u0000"+ - "\u0000\u0000\u0231\u0233\u0003\u00f0q\u0000\u0232\u022a\u0001\u0000\u0000"+ - "\u0000\u0233\u0236\u0001\u0000\u0000\u0000\u0234\u0232\u0001\u0000\u0000"+ - "\u0000\u0234\u0235\u0001\u0000\u0000\u0000\u0235\u023a\u0001\u0000\u0000"+ - "\u0000\u0236\u0234\u0001\u0000\u0000\u0000\u0237\u0239\u0005 \u0000\u0000"+ - "\u0238\u0237\u0001\u0000\u0000\u0000\u0239\u023c\u0001\u0000\u0000\u0000"+ - "\u023a\u0238\u0001\u0000\u0000\u0000\u023a\u023b\u0001\u0000\u0000\u0000"+ - "\u023b\u023d\u0001\u0000\u0000\u0000\u023c\u023a\u0001\u0000\u0000\u0000"+ - "\u023d\u0241\u0005)\u0000\u0000\u023e\u0240\u0005 \u0000\u0000\u023f\u023e"+ - "\u0001\u0000\u0000\u0000\u0240\u0243\u0001\u0000\u0000\u0000\u0241\u023f"+ - "\u0001\u0000\u0000\u0000\u0241\u0242\u0001\u0000\u0000\u0000\u0242\u0246"+ - "\u0001\u0000\u0000\u0000\u0243\u0241\u0001\u0000\u0000\u0000\u0244\u0245"+ - "\u0005{\u0000\u0000\u0245\u0247\u0004\u0002\u0000\u0000\u0246\u0244\u0001"+ - "\u0000\u0000\u0000\u0246\u0247\u0001\u0000\u0000\u0000\u0247\u0013\u0001"+ - "\u0000\u0000\u0000\u0248\u0249\u0007\u0004\u0000\u0000\u0249\u0253\u0003"+ - "\u0010\u0001\u0000\u024a\u024c\u0005 \u0000\u0000\u024b\u024a\u0001\u0000"+ - "\u0000\u0000\u024c\u024f\u0001\u0000\u0000\u0000\u024d\u024b\u0001\u0000"+ - "\u0000\u0000\u024d\u024e\u0001\u0000\u0000\u0000\u024e\u0250\u0001\u0000"+ - "\u0000\u0000\u024f\u024d\u0001\u0000\u0000\u0000\u0250\u0252\u0003\u0010"+ - "\u0001\u0000\u0251\u024d\u0001\u0000\u0000\u0000\u0252\u0255\u0001\u0000"+ - "\u0000\u0000\u0253\u0251\u0001\u0000\u0000\u0000\u0253\u0254\u0001\u0000"+ - "\u0000\u0000\u0254\u0256\u0001\u0000\u0000\u0000\u0255\u0253\u0001\u0000"+ - "\u0000\u0000\u0256\u0257\u0007\u0004\u0000\u0000\u0257\u026a\u0001\u0000"+ - "\u0000\u0000\u0258\u0259\u0005\"\u0000\u0000\u0259\u0263\u0003\u0010\u0001"+ - "\u0000\u025a\u025c\u0005 \u0000\u0000\u025b\u025a\u0001\u0000\u0000\u0000"+ - "\u025c\u025f\u0001\u0000\u0000\u0000\u025d\u025b\u0001\u0000\u0000\u0000"+ - "\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u0260\u0001\u0000\u0000\u0000"+ - "\u025f\u025d\u0001\u0000\u0000\u0000\u0260\u0262\u0003\u0010\u0001\u0000"+ - "\u0261\u025d\u0001\u0000\u0000\u0000\u0262\u0265\u0001\u0000\u0000\u0000"+ - "\u0263\u0261\u0001\u0000\u0000\u0000\u0263\u0264\u0001\u0000\u0000\u0000"+ - "\u0264\u0266\u0001\u0000\u0000\u0000\u0265\u0263\u0001\u0000\u0000\u0000"+ - "\u0266\u0267\u0007\u0004\u0000\u0000\u0267\u0268\u0005\"\u0000\u0000\u0268"+ - "\u026a\u0001\u0000\u0000\u0000\u0269\u0248\u0001\u0000\u0000\u0000\u0269"+ - "\u0258\u0001\u0000\u0000\u0000\u026a\u0015\u0001\u0000\u0000\u0000\u026b"+ - "\u026c\u0005[\u0000\u0000\u026c\u0270\u0003\u00f4s\u0000\u026d\u026e\u0003"+ - "\u00ean\u0000\u026e\u026f\u0003\u0018\u0005\u0000\u026f\u0271\u0001\u0000"+ - "\u0000\u0000\u0270\u026d\u0001\u0000\u0000\u0000\u0270\u0271\u0001\u0000"+ - "\u0000\u0000\u0271\u0272\u0001\u0000\u0000\u0000\u0272\u0273\u0005]\u0000"+ - "\u0000\u0273\u0017\u0001\u0000\u0000\u0000\u0274\u0275\u0005\"\u0000\u0000"+ - "\u0275\u0276\u0003\u00f4s\u0000\u0276\u0277\u0005\"\u0000\u0000\u0277"+ - "\u027d\u0001\u0000\u0000\u0000\u0278\u0279\u0007\u0004\u0000\u0000\u0279"+ - "\u027a\u0003\u00f4s\u0000\u027a\u027b\u0007\u0004\u0000\u0000\u027b\u027d"+ - "\u0001\u0000\u0000\u0000\u027c\u0274\u0001\u0000\u0000\u0000\u027c\u0278"+ - "\u0001\u0000\u0000\u0000\u027d\u0019\u0001\u0000\u0000\u0000\u027e\u027f"+ - "\u0005@\u0000\u0000\u027f\u0280\u0007\u0005\u0000\u0000\u0280\u0281\u0007"+ - "\u0006\u0000\u0000\u0281\u0282\u0001\u0000\u0000\u0000\u0282\u0283\u0006"+ - "\u0006\u0000\u0000\u0283\u001b\u0001\u0000\u0000\u0000\u0284\u0285\u0005"+ - "@\u0000\u0000\u0285\u0286\u0007\u0007\u0000\u0000\u0286\u0287\u0007\b"+ - "\u0000\u0000\u0287\u0288\u0007\t\u0000\u0000\u0288\u0289\u0007\u0007\u0000"+ - "\u0000\u0289\u028a\u0007\u0005\u0000\u0000\u028a\u028b\u0007\u0006\u0000"+ - "\u0000\u028b\u028c\u0001\u0000\u0000\u0000\u028c\u028d\u0006\u0007\u0000"+ - "\u0000\u028d\u001d\u0001\u0000\u0000\u0000\u028e\u028f\u0005@\u0000\u0000"+ - "\u028f\u0290\u0007\u0007\u0000\u0000\u0290\u0291\u0007\b\u0000\u0000\u0291"+ - "\u0292\u0007\t\u0000\u0000\u0292\u0293\u0007\u0007\u0000\u0000\u0293\u001f"+ - "\u0001\u0000\u0000\u0000\u0294\u0295\u0005@\u0000\u0000\u0295\u0296\u0007"+ - "\u0007\u0000\u0000\u0296\u0297\u0007\n\u0000\u0000\u0297\u0298\u0007\u000b"+ - "\u0000\u0000\u0298\u0299\u0007\u0005\u0000\u0000\u0299\u029a\u0007\u0006"+ - "\u0000\u0000\u029a!\u0001\u0000\u0000\u0000\u029b\u029c\u0005@\u0000\u0000"+ - "\u029c\u029d\u0007\t\u0000\u0000\u029d\u029e\u0007\f\u0000\u0000\u029e"+ - "\u029f\u0007\u0005\u0000\u0000\u029f\u02a0\u0007\r\u0000\u0000\u02a0\u02a1"+ - "\u0007\u000e\u0000\u0000\u02a1\u02a2\u0007\u000f\u0000\u0000\u02a2\u02a3"+ - "\u0001\u0000\u0000\u0000\u02a3\u02a4\u0006\n\u0001\u0000\u02a4#\u0001"+ - "\u0000\u0000\u0000\u02a5\u02a6\u0005@\u0000\u0000\u02a6\u02a7\u0007\u000e"+ - "\u0000\u0000\u02a7\u02a8\u0007\u0010\u0000\u0000\u02a8\u02a9\u0007\t\u0000"+ - "\u0000\u02a9\u02aa\u0007\u0007\u0000\u0000\u02aa\u02ab\u0001\u0000\u0000"+ - "\u0000\u02ab\u02ac\u0006\u000b\u0001\u0000\u02ac%\u0001\u0000\u0000\u0000"+ - "\u02ad\u02ae\u0005@\u0000\u0000\u02ae\u02af\u0007\u000b\u0000\u0000\u02af"+ - "\u02b0\u0007\u0007\u0000\u0000\u02b0\u02b1\u0007\u0006\u0000\u0000\u02b1"+ - "\u02b2\u0007\u0010\u0000\u0000\u02b2\u02b3\u0007\u0011\u0000\u0000\u02b3"+ - "\u02b4\u0007\b\u0000\u0000\u02b4\u02b5\u0007\r\u0000\u0000\u02b5\'\u0001"+ - "\u0000\u0000\u0000\u02b6\u02b7\u0005@\u0000\u0000\u02b7\u02b8\u0007\u0007"+ - "\u0000\u0000\u02b8\u02b9\u0007\n\u0000\u0000\u02b9\u02ba\u0007\u000b\u0000"+ - "\u0000\u02ba\u02bb\u0007\t\u0000\u0000\u02bb\u02bc\u0007\f\u0000\u0000"+ - "\u02bc\u02bd\u0007\u0005\u0000\u0000\u02bd\u02be\u0007\r\u0000\u0000\u02be"+ - "\u02bf\u0007\u000e\u0000\u0000\u02bf\u02c0\u0007\u000f\u0000\u0000\u02c0"+ - ")\u0001\u0000\u0000\u0000\u02c1\u02c2\u0005@\u0000\u0000\u02c2\u02c3\u0007"+ - "\u0007\u0000\u0000\u02c3\u02c4\u0007\u0012\u0000\u0000\u02c4\u02c5\u0007"+ - "\u0013\u0000\u0000\u02c5\u02c6\u0007\r\u0000\u0000\u02c6\u02c7\u0007\u0014"+ - "\u0000\u0000\u02c7\u02c8\u0001\u0000\u0000\u0000\u02c8\u02c9\u0006\u000e"+ - "\u0000\u0000\u02c9+\u0001\u0000\u0000\u0000\u02ca\u02cb\u0005@\u0000\u0000"+ - "\u02cb\u02cc\u0007\u0007\u0000\u0000\u02cc\u02cd\u0007\n\u0000\u0000\u02cd"+ - "\u02ce\u0007\u000b\u0000\u0000\u02ce\u02cf\u0007\u0007\u0000\u0000\u02cf"+ - "\u02d0\u0007\u0012\u0000\u0000\u02d0\u02d1\u0007\u0013\u0000\u0000\u02d1"+ - "\u02d2\u0007\r\u0000\u0000\u02d2\u02d3\u0007\u0014\u0000\u0000\u02d3-"+ - "\u0001\u0000\u0000\u0000\u02d4\u02d5\u0005@\u0000\u0000\u02d5\u02d6\u0007"+ - "\u0011\u0000\u0000\u02d6\u02d7\u0007\n\u0000\u0000\u02d7\u02d8\u0007\b"+ - "\u0000\u0000\u02d8\u02d9\u0007\u0007\u0000\u0000\u02d9\u02da\u0007\t\u0000"+ - "\u0000\u02da\u02e2\u0007\t\u0000\u0000\u02db\u02dc\u0005@\u0000\u0000"+ - "\u02dc\u02dd\u0007\u0005\u0000\u0000\u02dd\u02de\u0007\t\u0000\u0000\u02de"+ - "\u02df\u0007\t\u0000\u0000\u02df\u02e0\u0007\u0007\u0000\u0000\u02e0\u02e2"+ - "\u0007\r\u0000\u0000\u02e1\u02d4\u0001\u0000\u0000\u0000\u02e1\u02db\u0001"+ - "\u0000\u0000\u0000\u02e2\u02e3\u0001\u0000\u0000\u0000\u02e3\u02e4\u0006"+ - "\u0010\u0000\u0000\u02e4/\u0001\u0000\u0000\u0000\u02e5\u02e6\u0005@\u0000"+ - "\u0000\u02e6\u02e7\u0007\u0007\u0000\u0000\u02e7\u02e8\u0007\n\u0000\u0000"+ - "\u02e8\u02e9\u0007\u000b\u0000\u0000\u02e9\u02ea\u0007\u0011\u0000\u0000"+ - "\u02ea\u02eb\u0007\n\u0000\u0000\u02eb\u02ec\u0007\b\u0000\u0000\u02ec"+ - "\u02ed\u0007\u0007\u0000\u0000\u02ed\u02ee\u0007\t\u0000\u0000\u02ee\u02f9"+ - "\u0007\t\u0000\u0000\u02ef\u02f0\u0005@\u0000\u0000\u02f0\u02f1\u0007"+ - "\u0007\u0000\u0000\u02f1\u02f2\u0007\n\u0000\u0000\u02f2\u02f3\u0007\u000b"+ - "\u0000\u0000\u02f3\u02f4\u0007\u0005\u0000\u0000\u02f4\u02f5\u0007\t\u0000"+ - "\u0000\u02f5\u02f6\u0007\t\u0000\u0000\u02f6\u02f7\u0007\u0007\u0000\u0000"+ - "\u02f7\u02f9\u0007\r\u0000\u0000\u02f8\u02e5\u0001\u0000\u0000\u0000\u02f8"+ - "\u02ef\u0001\u0000\u0000\u0000\u02f91\u0001\u0000\u0000\u0000\u02fa\u02fb"+ - "\u0005@\u0000\u0000\u02fb\u02fc\u0007\u0006\u0000\u0000\u02fc\u02fd\u0007"+ - "\u0015\u0000\u0000\u02fd\u02fe\u0007\u0016\u0000\u0000\u02fe\u02ff\u0007"+ - "\u0007\u0000\u0000\u02ff\u0300\u0007\u0010\u0000\u0000\u0300\u0301\u0007"+ - "\u000e\u0000\u0000\u0301\u0302\u0007\u000f\u0000\u0000\u0302\u0303\u0001"+ - "\u0000\u0000\u0000\u0303\u0304\u0006\u0012\u0002\u0000\u03043\u0001\u0000"+ - "\u0000\u0000\u0305\u0306\u0005@\u0000\u0000\u0306\u0307\u0007\u0007\u0000"+ - "\u0000\u0307\u0308\u0007\n\u0000\u0000\u0308\u0309\u0007\u000b\u0000\u0000"+ - "\u0309\u030a\u0007\u0006\u0000\u0000\u030a\u030b\u0007\u0015\u0000\u0000"+ - "\u030b\u030c\u0007\u0016\u0000\u0000\u030c\u030d\u0007\u0007\u0000\u0000"+ - "\u030d\u030e\u0007\u0010\u0000\u0000\u030e\u030f\u0007\u000e\u0000\u0000"+ - "\u030f\u0310\u0007\u000f\u0000\u0000\u03105\u0001\u0000\u0000\u0000\u0311"+ - "\u0312\u0005@\u0000\u0000\u0312\u0313\u0007\u0006\u0000\u0000\u0313\u0314"+ - "\u0007\u0015\u0000\u0000\u0314\u0315\u0007\u0016\u0000\u0000\u0315\u0316"+ - "\u0001\u0000\u0000\u0000\u0316\u0317\u0006\u0014\u0001\u0000\u03177\u0001"+ - "\u0000\u0000\u0000\u0318\u0319\u0005@\u0000\u0000\u0319\u031a\u0007\u0007"+ - "\u0000\u0000\u031a\u031b\u0007\n\u0000\u0000\u031b\u031c\u0007\u000b\u0000"+ - "\u0000\u031c\u031d\u0007\u0006\u0000\u0000\u031d\u031e\u0007\u0015\u0000"+ - "\u0000\u031e\u031f\u0007\u0016\u0000\u0000\u031f9\u0001\u0000\u0000\u0000"+ - "\u0320\u0321\u0005@\u0000\u0000\u0321\u0322\u0007\u0006\u0000\u0000\u0322"+ - "\u0323\u0007\u0015\u0000\u0000\u0323\u0324\u0007\u0016\u0000\u0000\u0324"+ - "\u0325\u0007\u0007\u0000\u0000\u0325\u0326\u0007\b\u0000\u0000\u0326\u0327"+ - "\u0007\t\u0000\u0000\u0327\u0328\u0007\u0007\u0000\u0000\u0328\u0329\u0001"+ - "\u0000\u0000\u0000\u0329\u032a\u0006\u0016\u0002\u0000\u032a;\u0001\u0000"+ - "\u0000\u0000\u032b\u032c\u0005@\u0000\u0000\u032c\u032d\u0007\u0007\u0000"+ - "\u0000\u032d\u032e\u0007\n\u0000\u0000\u032e\u032f\u0007\u000b\u0000\u0000"+ - "\u032f\u0330\u0007\u0006\u0000\u0000\u0330\u0331\u0007\u0015\u0000\u0000"+ - "\u0331\u0332\u0007\u0016\u0000\u0000\u0332\u0333\u0007\u0007\u0000\u0000"+ - "\u0333\u0334\u0007\b\u0000\u0000\u0334\u0335\u0007\t\u0000\u0000\u0335"+ - "\u0336\u0007\u0007\u0000\u0000\u0336=\u0001\u0000\u0000\u0000\u0337\u0338"+ - "\u0005@\u0000\u0000\u0338\u0339\u0007\f\u0000\u0000\u0339\u033a\u0007"+ - "\u000f\u0000\u0000\u033a\u033b\u0007\u0005\u0000\u0000\u033b\u033c\u0007"+ - "\b\u0000\u0000\u033c\u033d\u0007\u0007\u0000\u0000\u033d\u033e\u0001\u0000"+ - "\u0000\u0000\u033e\u033f\u0006\u0018\u0001\u0000\u033f?\u0001\u0000\u0000"+ - "\u0000\u0340\u0341\u0005@\u0000\u0000\u0341\u0342\u0007\u0007\u0000\u0000"+ - "\u0342\u0343\u0007\n\u0000\u0000\u0343\u0344\u0007\u000b\u0000\u0000\u0344"+ - "\u0345\u0007\f\u0000\u0000\u0345\u0346\u0007\u000f\u0000\u0000\u0346\u0347"+ - "\u0007\u0005\u0000\u0000\u0347\u0348\u0007\b\u0000\u0000\u0348\u0349\u0007"+ - "\u0007\u0000\u0000\u0349A\u0001\u0000\u0000\u0000\u034a\u034b\u0005@\u0000"+ - "\u0000\u034b\u034c\u0007\u0017\u0000\u0000\u034c\u034d\u0007\u0016\u0000"+ - "\u0000\u034d\u034e\u0007\u0007\u0000\u0000\u034e\u034f\u0007\u0010\u0000"+ - "\u0000\u034f\u0350\u0007\u0018\u0000\u0000\u0350\u0351\u0001\u0000\u0000"+ - "\u0000\u0351\u0352\u0006\u001a\u0001\u0000\u0352C\u0001\u0000\u0000\u0000"+ - "\u0353\u0354\u0005@\u0000\u0000\u0354\u0355\u0007\u000e\u0000\u0000\u0355"+ - "\u0356\u0007\u0015\u0000\u0000\u0356\u0357\u0007\n\u0000\u0000\u0357\u0358"+ - "\u0007\r\u0000\u0000\u0358\u0359\u0007\u0005\u0000\u0000\u0359\u035a\u0007"+ - "\n\u0000\u0000\u035a\u035b\u0007\u0011\u0000\u0000\u035b\u035c\u0007\u0007"+ - "\u0000\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d\u035e\u0006\u001b"+ - "\u0001\u0000\u035eE\u0001\u0000\u0000\u0000\u035f\u0360\u0005@\u0000\u0000"+ - "\u0360\u0361\u0007\u0005\u0000\u0000\u0361\u0362\u0007\n\u0000\u0000\u0362"+ - "\u0363\u0007\u000e\u0000\u0000\u0363\u0364\u0007\b\u0000\u0000\u0364\u0365"+ - "\u0007\u0011\u0000\u0000\u0365\u0366\u0007\u000b\u0000\u0000\u0366\u0367"+ - "\u0007\u0007\u0000\u0000\u0367\u0368\u0001\u0000\u0000\u0000\u0368\u0369"+ - "\u0006\u001c\u0003\u0000\u0369G\u0001\u0000\u0000\u0000\u036a\u036b\u0005"+ - "@\u0000\u0000\u036b\u036c\u0007\u0005\u0000\u0000\u036c\u036d\u0007\n"+ - "\u0000\u0000\u036d\u036e\u0007\u000e\u0000\u0000\u036e\u036f\u0007\b\u0000"+ - "\u0000\u036f\u0370\u0007\u0011\u0000\u0000\u0370\u0371\u0007\u000b\u0000"+ - "\u0000\u0371\u0372\u0007\u0007\u0000\u0000\u0372\u0373\u0007\u0005\u0000"+ - "\u0000\u0373\u0374\u0007\u0006\u0000\u0000\u0374\u0375\u0001\u0000\u0000"+ - "\u0000\u0375\u0376\u0006\u001d\u0003\u0000\u0376I\u0001\u0000\u0000\u0000"+ - "\u0377\u0378\u0005@\u0000\u0000\u0378\u0379\u0007\u0005\u0000\u0000\u0379"+ - "\u037a\u0007\n\u0000\u0000\u037a\u037b\u0007\u000e\u0000\u0000\u037b\u037c"+ - "\u0007\b\u0000\u0000\u037c\u037d\u0007\u0011\u0000\u0000\u037d\u037e\u0007"+ - "\u000b\u0000\u0000\u037e\u037f\u0007\u0007\u0000\u0000\u037f\u0380\u0007"+ - "\f\u0000\u0000\u0380\u0381\u0007\u000f\u0000\u0000\u0381\u0382\u0007\u0007"+ - "\u0000\u0000\u0382\u0383\u0007\n\u0000\u0000\u0383\u0384\u0001\u0000\u0000"+ - "\u0000\u0384\u0385\u0006\u001e\u0003\u0000\u0385K\u0001\u0000\u0000\u0000"+ - "\u0386\u0387\u0005@\u0000\u0000\u0387\u0388\u0007\u0005\u0000\u0000\u0388"+ - "\u0389\u0007\n\u0000\u0000\u0389\u038a\u0007\u000e\u0000\u0000\u038a\u038b"+ - "\u0007\b\u0000\u0000\u038b\u038c\u0007\u0011\u0000\u0000\u038c\u038d\u0007"+ - "\u000b\u0000\u0000\u038d\u038e\u0007\u0007\u0000\u0000\u038e\u038f\u0007"+ - "\u0006\u0000\u0000\u038f\u0390\u0007\u0005\u0000\u0000\u0390\u0391\u0007"+ - "\u0016\u0000\u0000\u0391\u0392\u0007\t\u0000\u0000\u0392\u0393\u0007\r"+ - "\u0000\u0000\u0393\u0394\u0001\u0000\u0000\u0000\u0394\u0395\u0006\u001f"+ - "\u0003\u0000\u0395M\u0001\u0000\u0000\u0000\u0396\u0397\u0005@\u0000\u0000"+ - "\u0397\u0398\u0007\u0005\u0000\u0000\u0398\u0399\u0007\n\u0000\u0000\u0399"+ - "\u039a\u0007\u000e\u0000\u0000\u039a\u039b\u0007\b\u0000\u0000\u039b\u039c"+ - "\u0007\u0011\u0000\u0000\u039c\u039d\u0007\u000b\u0000\u0000\u039d\u039e"+ - "\u0007\u0007\u0000\u0000\u039e\u039f\u0007\u0011\u0000\u0000\u039f\u03a0"+ - "\u0007\n\u0000\u0000\u03a0\u03a1\u0007\b\u0000\u0000\u03a1\u03a2\u0007"+ - "\u0007\u0000\u0000\u03a2\u03a3\u0007\t\u0000\u0000\u03a3\u03a4\u0007\t"+ - "\u0000\u0000\u03a4\u03a5\u0001\u0000\u0000\u0000\u03a5\u03a6\u0006 \u0003"+ - "\u0000\u03a6O\u0001\u0000\u0000\u0000\u03a7\u03a8\u0005@\u0000\u0000\u03a8"+ - "\u03a9\u0007\u0007\u0000\u0000\u03a9\u03aa\u0007\u0010\u0000\u0000\u03aa"+ - "\u03ab\u0007\u000e\u0000\u0000\u03ab\u03ac\u0007\u000f\u0000\u0000\u03ac"+ - "\u03ad\u0001\u0000\u0000\u0000\u03ad\u03ae\u0006!\u0003\u0000\u03aeQ\u0001"+ - "\u0000\u0000\u0000\u03af\u03b0\u0005@\u0000\u0000\u03b0\u03b1\u0007\u0007"+ - "\u0000\u0000\u03b1\u03b2\u0007\u0019\u0000\u0000\u03b2\u03b3\u0007\r\u0000"+ - "\u0000\u03b3\u03b4\u0007\u0007\u0000\u0000\u03b4\u03b5\u0007\n\u0000\u0000"+ - "\u03b5\u03b6\u0007\u000b\u0000\u0000\u03b6\u03b7\u0007\t\u0000\u0000\u03b7"+ - "\u03b8\u0001\u0000\u0000\u0000\u03b8\u03b9\u0006\"\u0003\u0000\u03b9S"+ - "\u0001\u0000\u0000\u0000\u03ba\u03bb\u0005@\u0000\u0000\u03bb\u03bc\u0007"+ - "\u001a\u0000\u0000\u03bc\u03bd\u0007\t\u0000\u0000\u03bd\u03be\u0001\u0000"+ - "\u0000\u0000\u03be\u03bf\u0006#\u0000\u0000\u03bfU\u0001\u0000\u0000\u0000"+ - "\u03c0\u03c1\u0005@\u0000\u0000\u03c1\u03c2\u0007\u001a\u0000\u0000\u03c2"+ - "\u03c3\u0007\t\u0000\u0000\u03c3\u03c4\u0007\u0015\u0000\u0000\u03c4\u03c5"+ - "\u0007\n\u0000\u0000\u03c5\u03c6\u0001\u0000\u0000\u0000\u03c6\u03c7\u0006"+ - "$\u0000\u0000\u03c7W\u0001\u0000\u0000\u0000\u03c8\u03c9\u0005@\u0000"+ - "\u0000\u03c9\u03ca\u0007\t\u0000\u0000\u03ca\u03cb\u0007\u0007\u0000\u0000"+ - "\u03cb\u03cc\u0007\u000e\u0000\u0000\u03cc\u03cd\u0007\r\u0000\u0000\u03cd"+ - "\u03ce\u0007\u0005\u0000\u0000\u03ce\u03cf\u0007\u0015\u0000\u0000\u03cf"+ - "\u03d0\u0007\n\u0000\u0000\u03d0\u03d1\u0001\u0000\u0000\u0000\u03d1\u03d2"+ - "\u0006%\u0003\u0000\u03d2Y\u0001\u0000\u0000\u0000\u03d3\u03d4\u0005@"+ - "\u0000\u0000\u03d4\u03d5\u0007\u000f\u0000\u0000\u03d5\u03d6\u0007\u0010"+ - "\u0000\u0000\u03d6\u03d7\u0007\t\u0000\u0000\u03d7\u03d8\u0007\t\u0000"+ - "\u0000\u03d8\u03d9\u0007\u0007\u0000\u0000\u03d9\u03da\u0007\u000e\u0000"+ - "\u0000\u03da\u03db\u0007\r\u0000\u0000\u03db\u03dc\u0007\u0005\u0000\u0000"+ - "\u03dc\u03dd\u0007\u0015\u0000\u0000\u03dd\u03de\u0007\n\u0000\u0000\u03de"+ - "\u03df\u0001\u0000\u0000\u0000\u03df\u03e0\u0006&\u0003\u0000\u03e0[\u0001"+ - "\u0000\u0000\u0000\u03e1\u03e2\u0005@\u0000\u0000\u03e2\u03e3\u0007\t"+ - "\u0000\u0000\u03e3\u03e4\u0007\u0007\u0000\u0000\u03e4\u03e5\u0007\u000e"+ + "\u00f8\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001"+ + "\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fb\u0001"+ + "\u00fb\u0001\u00fb\u0001\u00fb\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001"+ + "\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fd\u0001"+ + "\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fe\u0001\u00fe\u0001"+ + "\u00fe\u0001\u00fe\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001"+ + "\u00ff\u0003\u0765\u0a8e\u0b1d\u0000\u0100\u000e\u0000\u0010\u0000\u0012"+ + "\u0000\u0014\u0000\u0016\u0000\u0018\u0000\u001a\u0019\u001c\u001a\u001e"+ + "\u001b \u001c\"\u001d$\u001e&\u001f( *!,\".#0$2%4&6\'8(:)<*>+@,B-D.F/"+ + "H0J1L2N3P4R5T6V7X8Z9\\:^;`f?h@jAlBnCpDrEtFvGxHzI|J~K\u0080L\u0082"+ + "M\u0084N\u0086O\u0088P\u008aQ\u008cR\u008eS\u0090T\u0092U\u0094V\u0096"+ + "W\u0098X\u009aY\u009cZ\u009e[\u00a0\\\u00a2]\u00a4^\u00a6_\u00a8`\u00aa"+ + "a\u00acb\u00aec\u00b0d\u00b2e\u00b4f\u00b6\u0000\u00b8g\u00bah\u00bci"+ + "\u00bej\u00c0k\u00c2l\u00c4m\u00c6n\u00c8o\u00cap\u00ccq\u00ce\u00a3\u00d0"+ + "\u00a4\u00d2r\u00d4s\u00d6\u0000\u00d8t\u00dau\u00dcv\u00de\u0000\u00e0"+ + "\u0000\u00e2w\u00e4x\u00e6y\u00e8z\u00ea{\u00ec|\u00ee}\u00f0\u0000\u00f2"+ + "\u0000\u00f4\u0000\u00f6\u0000\u00f8\u0000\u00fa\u0000\u00fc\u0000\u00fe"+ + "\u0000\u0100\u0000\u0102\u0000\u0104~\u0106\u0000\u0108\u0000\u010a\u0000"+ + "\u010c\u0000\u010e\u0000\u0110\u0000\u0112\u0000\u0114\u00a5\u0116\u007f"+ + "\u0118\u00a6\u011a\u00a7\u011c\u00a8\u011e\u0080\u0120\u0000\u0122\u0000"+ + "\u0124\u0000\u0126\u0000\u0128\u0000\u012a\u0000\u012c\u0081\u012e\u0000"+ + "\u0130\u0000\u0132\u0000\u0134\u0082\u0136\u0000\u0138\u0083\u013a\u0084"+ + "\u013c\u0000\u013e\u0000\u0140\u0000\u0142\u0000\u0144\u0000\u0146\u0000"+ + "\u0148\u0000\u014a\u0000\u014c\u0000\u014e\u0000\u0150\u0085\u0152\r\u0154"+ + "\u0000\u0156\u0000\u0158\u0000\u015a\u0000\u015c\u0000\u015e\u0086\u0160"+ + "\u0000\u0162\u0000\u0164\u0000\u0166\u0000\u0168\u0000\u016a\u0000\u016c"+ + "\u0087\u016e\u0088\u0170\u0000\u0172\u0089\u0174\u0000\u0176\u0000\u0178"+ + "\u008a\u017a\u008b\u017c\u008c\u017e\u008d\u0180\u0000\u0182\u008e\u0184"+ + "\u0000\u0186\u0000\u0188\u0000\u018a\u0000\u018c\u0000\u018e\u008f\u0190"+ + "\u000f\u0192\u0090\u0194\u0000\u0196\u0000\u0198\u0000\u019a\u0091\u019c"+ + "\u0011\u019e\u0000\u01a0\u0012\u01a2\u0000\u01a4\u0092\u01a6\u0093\u01a8"+ + "\u0094\u01aa\u0095\u01ac\u0000\u01ae\u0000\u01b0\u0096\u01b2\u0097\u01b4"+ + "\u0098\u01b6\u0000\u01b8\u0000\u01ba\u0000\u01bc\u00a9\u01be\u00aa\u01c0"+ + "\u0000\u01c2\u0000\u01c4\u0000\u01c6\u00ab\u01c8\u0000\u01ca\u0000\u01cc"+ + "\u0000\u01ce\u0000\u01d0\u0000\u01d2\u0000\u01d4\u0000\u01d6\u0099\u01d8"+ + "\u0000\u01da\u009a\u01dc\u009b\u01de\u009c\u01e0\u009d\u01e2\u0000\u01e4"+ + "\u0000\u01e6\u0000\u01e8\u0000\u01ea\u0015\u01ec\u0000\u01ee\u0000\u01f0"+ + "\u0000\u01f2\u0000\u01f4\u0000\u01f6\u0000\u01f8\u0000\u01fa\u0000\u01fc"+ + "\u0000\u01fe\u0000\u0200\u009e\u0202\u0000\u0204\u0000\u0206\u009f\u0208"+ + "\u00a0\u020a\u00a1\u020c\u00a2\u000e\u0000\u0001\u0002\u0003\u0004\u0005"+ + "\u0006\u0007\b\t\n\u000b\f\r\'\u0003\u0000AZaz\u0080\u8000\ufffe\u0006"+ + "\u0000-.0:AZ__az\u0080\u8000\ufffe\u0002\u0000##..\u0006\u0000--0:AZ_"+ + "_az\u0080\u8000\ufffe\u0002\u0000\'\'\\\\\u0002\u0000IIii\u0002\u0000"+ + "FFff\u0002\u0000EEee\u0002\u0000LLll\u0002\u0000SSss\u0002\u0000NNnn\u0002"+ + "\u0000DDdd\u0002\u0000WWww\u0002\u0000TTtt\u0002\u0000CCcc\u0002\u0000"+ + "HHhh\u0002\u0000AAaa\u0002\u0000UUuu\u0002\u0000MMmm\u0002\u0000PPpp\u0002"+ + "\u0000YYyy\u0002\u0000OOoo\u0002\u0000RRrr\u0002\u0000BBbb\u0002\u0000"+ + "KKkk\u0002\u0000XXxx\u0002\u0000JJjj\u0002\u0000GGgg\u0002\u0000VVvv\u0002"+ + "\u0000QQqq\u0003\u0000\n\n\r\r \u0002\u0000\n\n\r\r\u0004\u0000AZ__a"+ + "z\u0080\u8000\ufffe\u0005\u000009AZ__az\u0080\u8000\ufffe\u0006\u0000"+ + "..09AZ__az\u0080\u8000\ufffe\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002"+ + "\u0000\"\"\\\\\u0001\u0000 \u0003\u0000\t\n\r\r \u0bfd\u0000\u001a\u0001"+ + "\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001"+ + "\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000"+ + "\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000"+ + "\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,"+ + "\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000"+ + "\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000"+ + "\u00006\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:"+ + "\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000"+ + "\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000"+ + "\u0000D\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H"+ + "\u0001\u0000\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000"+ + "\u0000\u0000\u0000N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000"+ + "\u0000R\u0001\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V"+ + "\u0001\u0000\u0000\u0000\u0000X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000"+ + "\u0000\u0000\u0000\\\u0001\u0000\u0000\u0000\u0000^\u0001\u0000\u0000"+ + "\u0000\u0000`\u0001\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000\u0000"+ + "d\u0001\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001"+ + "\u0000\u0000\u0000\u0000j\u0001\u0000\u0000\u0000\u0000l\u0001\u0000\u0000"+ + "\u0000\u0000n\u0001\u0000\u0000\u0000\u0000p\u0001\u0000\u0000\u0000\u0000"+ + "r\u0001\u0000\u0000\u0000\u0000t\u0001\u0000\u0000\u0000\u0000v\u0001"+ + "\u0000\u0000\u0000\u0000x\u0001\u0000\u0000\u0000\u0000z\u0001\u0000\u0000"+ + "\u0000\u0000|\u0001\u0000\u0000\u0000\u0000~\u0001\u0000\u0000\u0000\u0000"+ + "\u0080\u0001\u0000\u0000\u0000\u0000\u0082\u0001\u0000\u0000\u0000\u0000"+ + "\u0084\u0001\u0000\u0000\u0000\u0000\u0086\u0001\u0000\u0000\u0000\u0000"+ + "\u0088\u0001\u0000\u0000\u0000\u0000\u008a\u0001\u0000\u0000\u0000\u0000"+ + "\u008c\u0001\u0000\u0000\u0000\u0000\u008e\u0001\u0000\u0000\u0000\u0000"+ + "\u0090\u0001\u0000\u0000\u0000\u0000\u0092\u0001\u0000\u0000\u0000\u0000"+ + "\u0094\u0001\u0000\u0000\u0000\u0000\u0096\u0001\u0000\u0000\u0000\u0000"+ + "\u0098\u0001\u0000\u0000\u0000\u0000\u009a\u0001\u0000\u0000\u0000\u0000"+ + "\u009c\u0001\u0000\u0000\u0000\u0000\u009e\u0001\u0000\u0000\u0000\u0000"+ + "\u00a0\u0001\u0000\u0000\u0000\u0000\u00a2\u0001\u0000\u0000\u0000\u0000"+ + "\u00a4\u0001\u0000\u0000\u0000\u0000\u00a6\u0001\u0000\u0000\u0000\u0000"+ + "\u00a8\u0001\u0000\u0000\u0000\u0000\u00aa\u0001\u0000\u0000\u0000\u0000"+ + "\u00ac\u0001\u0000\u0000\u0000\u0000\u00ae\u0001\u0000\u0000\u0000\u0000"+ + "\u00b0\u0001\u0000\u0000\u0000\u0000\u00b2\u0001\u0000\u0000\u0000\u0000"+ + "\u00b4\u0001\u0000\u0000\u0000\u0000\u00b6\u0001\u0000\u0000\u0000\u0000"+ + "\u00b8\u0001\u0000\u0000\u0000\u0000\u00ba\u0001\u0000\u0000\u0000\u0000"+ + "\u00bc\u0001\u0000\u0000\u0000\u0000\u00be\u0001\u0000\u0000\u0000\u0000"+ + "\u00c0\u0001\u0000\u0000\u0000\u0000\u00c2\u0001\u0000\u0000\u0000\u0000"+ + "\u00c4\u0001\u0000\u0000\u0000\u0000\u00c6\u0001\u0000\u0000\u0000\u0000"+ + "\u00c8\u0001\u0000\u0000\u0000\u0000\u00ca\u0001\u0000\u0000\u0000\u0000"+ + "\u00cc\u0001\u0000\u0000\u0000\u0000\u00ce\u0001\u0000\u0000\u0000\u0000"+ + "\u00d0\u0001\u0000\u0000\u0000\u0000\u00d2\u0001\u0000\u0000\u0000\u0000"+ + "\u00d4\u0001\u0000\u0000\u0000\u0000\u00d6\u0001\u0000\u0000\u0000\u0000"+ + "\u00d8\u0001\u0000\u0000\u0000\u0000\u00da\u0001\u0000\u0000\u0000\u0000"+ + "\u00dc\u0001\u0000\u0000\u0000\u0000\u00de\u0001\u0000\u0000\u0000\u0000"+ + "\u00e0\u0001\u0000\u0000\u0000\u0000\u00e2\u0001\u0000\u0000\u0000\u0000"+ + "\u00e4\u0001\u0000\u0000\u0000\u0000\u00e6\u0001\u0000\u0000\u0000\u0000"+ + "\u00e8\u0001\u0000\u0000\u0000\u0000\u00ea\u0001\u0000\u0000\u0000\u0000"+ + "\u00ec\u0001\u0000\u0000\u0000\u0000\u00ee\u0001\u0000\u0000\u0000\u0000"+ + "\u0104\u0001\u0000\u0000\u0000\u0000\u0106\u0001\u0000\u0000\u0000\u0000"+ + "\u0108\u0001\u0000\u0000\u0000\u0000\u010a\u0001\u0000\u0000\u0000\u0001"+ + "\u010c\u0001\u0000\u0000\u0000\u0001\u010e\u0001\u0000\u0000\u0000\u0001"+ + "\u0110\u0001\u0000\u0000\u0000\u0001\u0112\u0001\u0000\u0000\u0000\u0001"+ + "\u0114\u0001\u0000\u0000\u0000\u0001\u0116\u0001\u0000\u0000\u0000\u0001"+ + "\u0118\u0001\u0000\u0000\u0000\u0001\u011a\u0001\u0000\u0000\u0000\u0001"+ + "\u011c\u0001\u0000\u0000\u0000\u0001\u011e\u0001\u0000\u0000\u0000\u0001"+ + "\u0120\u0001\u0000\u0000\u0000\u0002\u0122\u0001\u0000\u0000\u0000\u0002"+ + "\u0124\u0001\u0000\u0000\u0000\u0002\u0126\u0001\u0000\u0000\u0000\u0002"+ + "\u0128\u0001\u0000\u0000\u0000\u0002\u012a\u0001\u0000\u0000\u0000\u0002"+ + "\u012c\u0001\u0000\u0000\u0000\u0002\u012e\u0001\u0000\u0000\u0000\u0002"+ + "\u0130\u0001\u0000\u0000\u0000\u0002\u0132\u0001\u0000\u0000\u0000\u0002"+ + "\u0134\u0001\u0000\u0000\u0000\u0002\u0136\u0001\u0000\u0000\u0000\u0003"+ + "\u0138\u0001\u0000\u0000\u0000\u0003\u013a\u0001\u0000\u0000\u0000\u0003"+ + "\u013c\u0001\u0000\u0000\u0000\u0003\u013e\u0001\u0000\u0000\u0000\u0003"+ + "\u0140\u0001\u0000\u0000\u0000\u0004\u0142\u0001\u0000\u0000\u0000\u0004"+ + "\u0144\u0001\u0000\u0000\u0000\u0004\u0146\u0001\u0000\u0000\u0000\u0004"+ + "\u0148\u0001\u0000\u0000\u0000\u0004\u014a\u0001\u0000\u0000\u0000\u0004"+ + "\u014c\u0001\u0000\u0000\u0000\u0004\u014e\u0001\u0000\u0000\u0000\u0005"+ + "\u0150\u0001\u0000\u0000\u0000\u0005\u0152\u0001\u0000\u0000\u0000\u0005"+ + "\u0154\u0001\u0000\u0000\u0000\u0006\u0156\u0001\u0000\u0000\u0000\u0006"+ + "\u0158\u0001\u0000\u0000\u0000\u0006\u015a\u0001\u0000\u0000\u0000\u0006"+ + "\u015c\u0001\u0000\u0000\u0000\u0006\u015e\u0001\u0000\u0000\u0000\u0006"+ + "\u0160\u0001\u0000\u0000\u0000\u0006\u0162\u0001\u0000\u0000\u0000\u0006"+ + "\u0164\u0001\u0000\u0000\u0000\u0006\u0166\u0001\u0000\u0000\u0000\u0006"+ + "\u0168\u0001\u0000\u0000\u0000\u0006\u016a\u0001\u0000\u0000\u0000\u0006"+ + "\u016c\u0001\u0000\u0000\u0000\u0006\u016e\u0001\u0000\u0000\u0000\u0006"+ + "\u0170\u0001\u0000\u0000\u0000\u0007\u0172\u0001\u0000\u0000\u0000\u0007"+ + "\u0174\u0001\u0000\u0000\u0000\u0007\u0176\u0001\u0000\u0000\u0000\b\u0178"+ + "\u0001\u0000\u0000\u0000\b\u017a\u0001\u0000\u0000\u0000\b\u017c\u0001"+ + "\u0000\u0000\u0000\b\u017e\u0001\u0000\u0000\u0000\b\u0180\u0001\u0000"+ + "\u0000\u0000\b\u0182\u0001\u0000\u0000\u0000\b\u0184\u0001\u0000\u0000"+ + "\u0000\b\u0186\u0001\u0000\u0000\u0000\b\u0188\u0001\u0000\u0000\u0000"+ + "\b\u018a\u0001\u0000\u0000\u0000\b\u018c\u0001\u0000\u0000\u0000\t\u018e"+ + "\u0001\u0000\u0000\u0000\t\u0190\u0001\u0000\u0000\u0000\t\u0192\u0001"+ + "\u0000\u0000\u0000\t\u0194\u0001\u0000\u0000\u0000\t\u0196\u0001\u0000"+ + "\u0000\u0000\t\u0198\u0001\u0000\u0000\u0000\t\u019a\u0001\u0000\u0000"+ + "\u0000\t\u019c\u0001\u0000\u0000\u0000\t\u019e\u0001\u0000\u0000\u0000"+ + "\t\u01a0\u0001\u0000\u0000\u0000\t\u01a2\u0001\u0000\u0000\u0000\t\u01a4"+ + "\u0001\u0000\u0000\u0000\t\u01a6\u0001\u0000\u0000\u0000\t\u01a8\u0001"+ + "\u0000\u0000\u0000\t\u01aa\u0001\u0000\u0000\u0000\t\u01ac\u0001\u0000"+ + "\u0000\u0000\t\u01ae\u0001\u0000\u0000\u0000\n\u01b0\u0001\u0000\u0000"+ + "\u0000\n\u01b2\u0001\u0000\u0000\u0000\n\u01b4\u0001\u0000\u0000\u0000"+ + "\n\u01b6\u0001\u0000\u0000\u0000\n\u01b8\u0001\u0000\u0000\u0000\n\u01ba"+ + "\u0001\u0000\u0000\u0000\n\u01bc\u0001\u0000\u0000\u0000\n\u01be\u0001"+ + "\u0000\u0000\u0000\n\u01c0\u0001\u0000\u0000\u0000\n\u01c2\u0001\u0000"+ + "\u0000\u0000\n\u01c4\u0001\u0000\u0000\u0000\n\u01c6\u0001\u0000\u0000"+ + "\u0000\n\u01c8\u0001\u0000\u0000\u0000\n\u01ca\u0001\u0000\u0000\u0000"+ + "\n\u01cc\u0001\u0000\u0000\u0000\n\u01ce\u0001\u0000\u0000\u0000\n\u01d0"+ + "\u0001\u0000\u0000\u0000\n\u01d2\u0001\u0000\u0000\u0000\n\u01d4\u0001"+ + "\u0000\u0000\u0000\n\u01d6\u0001\u0000\u0000\u0000\n\u01d8\u0001\u0000"+ + "\u0000\u0000\n\u01da\u0001\u0000\u0000\u0000\u000b\u01dc\u0001\u0000\u0000"+ + "\u0000\u000b\u01de\u0001\u0000\u0000\u0000\u000b\u01e0\u0001\u0000\u0000"+ + "\u0000\u000b\u01e2\u0001\u0000\u0000\u0000\u000b\u01e4\u0001\u0000\u0000"+ + "\u0000\u000b\u01e6\u0001\u0000\u0000\u0000\u000b\u01e8\u0001\u0000\u0000"+ + "\u0000\u000b\u01ea\u0001\u0000\u0000\u0000\u000b\u01ec\u0001\u0000\u0000"+ + "\u0000\u000b\u01ee\u0001\u0000\u0000\u0000\u000b\u01f0\u0001\u0000\u0000"+ + "\u0000\u000b\u01f2\u0001\u0000\u0000\u0000\u000b\u01f4\u0001\u0000\u0000"+ + "\u0000\u000b\u01f6\u0001\u0000\u0000\u0000\u000b\u01f8\u0001\u0000\u0000"+ + "\u0000\u000b\u01fa\u0001\u0000\u0000\u0000\u000b\u01fc\u0001\u0000\u0000"+ + "\u0000\f\u01fe\u0001\u0000\u0000\u0000\f\u0200\u0001\u0000\u0000\u0000"+ + "\f\u0202\u0001\u0000\u0000\u0000\f\u0204\u0001\u0000\u0000\u0000\r\u0206"+ + "\u0001\u0000\u0000\u0000\r\u0208\u0001\u0000\u0000\u0000\r\u020a\u0001"+ + "\u0000\u0000\u0000\r\u020c\u0001\u0000\u0000\u0000\u000e\u020e\u0001\u0000"+ + "\u0000\u0000\u0010\u0220\u0001\u0000\u0000\u0000\u0012\u0222\u0001\u0000"+ + "\u0000\u0000\u0014\u0269\u0001\u0000\u0000\u0000\u0016\u026b\u0001\u0000"+ + "\u0000\u0000\u0018\u027c\u0001\u0000\u0000\u0000\u001a\u027e\u0001\u0000"+ + "\u0000\u0000\u001c\u0284\u0001\u0000\u0000\u0000\u001e\u028e\u0001\u0000"+ + "\u0000\u0000 \u0294\u0001\u0000\u0000\u0000\"\u029b\u0001\u0000\u0000"+ + "\u0000$\u02a5\u0001\u0000\u0000\u0000&\u02ad\u0001\u0000\u0000\u0000("+ + "\u02b6\u0001\u0000\u0000\u0000*\u02c1\u0001\u0000\u0000\u0000,\u02ca\u0001"+ + "\u0000\u0000\u0000.\u02e1\u0001\u0000\u0000\u00000\u02f8\u0001\u0000\u0000"+ + "\u00002\u02fa\u0001\u0000\u0000\u00004\u0305\u0001\u0000\u0000\u00006"+ + "\u0311\u0001\u0000\u0000\u00008\u0318\u0001\u0000\u0000\u0000:\u0320\u0001"+ + "\u0000\u0000\u0000<\u032b\u0001\u0000\u0000\u0000>\u0337\u0001\u0000\u0000"+ + "\u0000@\u0340\u0001\u0000\u0000\u0000B\u034a\u0001\u0000\u0000\u0000D"+ + "\u0353\u0001\u0000\u0000\u0000F\u035f\u0001\u0000\u0000\u0000H\u036a\u0001"+ + "\u0000\u0000\u0000J\u0377\u0001\u0000\u0000\u0000L\u0386\u0001\u0000\u0000"+ + "\u0000N\u0396\u0001\u0000\u0000\u0000P\u03a7\u0001\u0000\u0000\u0000R"+ + "\u03af\u0001\u0000\u0000\u0000T\u03ba\u0001\u0000\u0000\u0000V\u03c0\u0001"+ + "\u0000\u0000\u0000X\u03c8\u0001\u0000\u0000\u0000Z\u03d3\u0001\u0000\u0000"+ + "\u0000\\\u03e1\u0001\u0000\u0000\u0000^\u03f3\u0001\u0000\u0000\u0000"+ + "`\u03ff\u0001\u0000\u0000\u0000b\u0408\u0001\u0000\u0000\u0000d\u0410"+ + "\u0001\u0000\u0000\u0000f\u0416\u0001\u0000\u0000\u0000h\u0421\u0001\u0000"+ + "\u0000\u0000j\u0427\u0001\u0000\u0000\u0000l\u042f\u0001\u0000\u0000\u0000"+ + "n\u0435\u0001\u0000\u0000\u0000p\u043e\u0001\u0000\u0000\u0000r\u0447"+ + "\u0001\u0000\u0000\u0000t\u044f\u0001\u0000\u0000\u0000v\u0458\u0001\u0000"+ + "\u0000\u0000x\u0462\u0001\u0000\u0000\u0000z\u046d\u0001\u0000\u0000\u0000"+ + "|\u0479\u0001\u0000\u0000\u0000~\u0486\u0001\u0000\u0000\u0000\u0080\u0491"+ + "\u0001\u0000\u0000\u0000\u0082\u049d\u0001\u0000\u0000\u0000\u0084\u04a6"+ + "\u0001\u0000\u0000\u0000\u0086\u04b2\u0001\u0000\u0000\u0000\u0088\u04bf"+ + "\u0001\u0000\u0000\u0000\u008a\u04c5\u0001\u0000\u0000\u0000\u008c\u04cf"+ + "\u0001\u0000\u0000\u0000\u008e\u04d8\u0001\u0000\u0000\u0000\u0090\u04e2"+ + "\u0001\u0000\u0000\u0000\u0092\u04ee\u0001\u0000\u0000\u0000\u0094\u04fd"+ + "\u0001\u0000\u0000\u0000\u0096\u0504\u0001\u0000\u0000\u0000\u0098\u0517"+ + "\u0001\u0000\u0000\u0000\u009a\u052c\u0001\u0000\u0000\u0000\u009c\u052e"+ + "\u0001\u0000\u0000\u0000\u009e\u053d\u0001\u0000\u0000\u0000\u00a0\u0550"+ + "\u0001\u0000\u0000\u0000\u00a2\u0560\u0001\u0000\u0000\u0000\u00a4\u0569"+ + "\u0001\u0000\u0000\u0000\u00a6\u059e\u0001\u0000\u0000\u0000\u00a8\u05a2"+ + "\u0001\u0000\u0000\u0000\u00aa\u05ab\u0001\u0000\u0000\u0000\u00ac\u05b6"+ + "\u0001\u0000\u0000\u0000\u00ae\u05ca\u0001\u0000\u0000\u0000\u00b0\u05ce"+ + "\u0001\u0000\u0000\u0000\u00b2\u05d6\u0001\u0000\u0000\u0000\u00b4\u05dd"+ + "\u0001\u0000\u0000\u0000\u00b6\u05e7\u0001\u0000\u0000\u0000\u00b8\u05f4"+ + "\u0001\u0000\u0000\u0000\u00ba\u05fd\u0001\u0000\u0000\u0000\u00bc\u0609"+ + "\u0001\u0000\u0000\u0000\u00be\u0653\u0001\u0000\u0000\u0000\u00c0\u0655"+ + "\u0001\u0000\u0000\u0000\u00c2\u065d\u0001\u0000\u0000\u0000\u00c4\u066f"+ + "\u0001\u0000\u0000\u0000\u00c6\u0675\u0001\u0000\u0000\u0000\u00c8\u0679"+ + "\u0001\u0000\u0000\u0000\u00ca\u067d\u0001\u0000\u0000\u0000\u00cc\u0682"+ + "\u0001\u0000\u0000\u0000\u00ce\u0688\u0001\u0000\u0000\u0000\u00d0\u068c"+ + "\u0001\u0000\u0000\u0000\u00d2\u0699\u0001\u0000\u0000\u0000\u00d4\u069d"+ + "\u0001\u0000\u0000\u0000\u00d6\u06af\u0001\u0000\u0000\u0000\u00d8\u06cb"+ + "\u0001\u0000\u0000\u0000\u00da\u06cf\u0001\u0000\u0000\u0000\u00dc\u06de"+ + "\u0001\u0000\u0000\u0000\u00de\u06e4\u0001\u0000\u0000\u0000\u00e0\u06eb"+ + "\u0001\u0000\u0000\u0000\u00e2\u06fc\u0001\u0000\u0000\u0000\u00e4\u0703"+ + "\u0001\u0000\u0000\u0000\u00e6\u0722\u0001\u0000\u0000\u0000\u00e8\u0732"+ + "\u0001\u0000\u0000\u0000\u00ea\u0735\u0001\u0000\u0000\u0000\u00ec\u0741"+ + "\u0001\u0000\u0000\u0000\u00ee\u0745\u0001\u0000\u0000\u0000\u00f0\u0749"+ + "\u0001\u0000\u0000\u0000\u00f2\u0750\u0001\u0000\u0000\u0000\u00f4\u0757"+ + "\u0001\u0000\u0000\u0000\u00f6\u075e\u0001\u0000\u0000\u0000\u00f8\u0760"+ + "\u0001\u0000\u0000\u0000\u00fa\u076a\u0001\u0000\u0000\u0000\u00fc\u0775"+ + "\u0001\u0000\u0000\u0000\u00fe\u077e\u0001\u0000\u0000\u0000\u0100\u0793"+ + "\u0001\u0000\u0000\u0000\u0102\u0795\u0001\u0000\u0000\u0000\u0104\u0797"+ + "\u0001\u0000\u0000\u0000\u0106\u079f\u0001\u0000\u0000\u0000\u0108\u07a5"+ + "\u0001\u0000\u0000\u0000\u010a\u08e5\u0001\u0000\u0000\u0000\u010c\u08e9"+ + "\u0001\u0000\u0000\u0000\u010e\u08ed\u0001\u0000\u0000\u0000\u0110\u08f2"+ + "\u0001\u0000\u0000\u0000\u0112\u08fd\u0001\u0000\u0000\u0000\u0114\u0901"+ + "\u0001\u0000\u0000\u0000\u0116\u0906\u0001\u0000\u0000\u0000\u0118\u090b"+ + "\u0001\u0000\u0000\u0000\u011a\u090f\u0001\u0000\u0000\u0000\u011c\u0913"+ + "\u0001\u0000\u0000\u0000\u011e\u0918\u0001\u0000\u0000\u0000\u0120\u091c"+ + "\u0001\u0000\u0000\u0000\u0122\u0921\u0001\u0000\u0000\u0000\u0124\u0925"+ + "\u0001\u0000\u0000\u0000\u0126\u092a\u0001\u0000\u0000\u0000\u0128\u0935"+ + "\u0001\u0000\u0000\u0000\u012a\u0939\u0001\u0000\u0000\u0000\u012c\u093e"+ + "\u0001\u0000\u0000\u0000\u012e\u0944\u0001\u0000\u0000\u0000\u0130\u0948"+ + "\u0001\u0000\u0000\u0000\u0132\u094c\u0001\u0000\u0000\u0000\u0134\u0951"+ + "\u0001\u0000\u0000\u0000\u0136\u0955\u0001\u0000\u0000\u0000\u0138\u095b"+ + "\u0001\u0000\u0000\u0000\u013a\u0965\u0001\u0000\u0000\u0000\u013c\u096b"+ + "\u0001\u0000\u0000\u0000\u013e\u0970\u0001\u0000\u0000\u0000\u0140\u0976"+ + "\u0001\u0000\u0000\u0000\u0142\u097b\u0001\u0000\u0000\u0000\u0144\u0981"+ + "\u0001\u0000\u0000\u0000\u0146\u0988\u0001\u0000\u0000\u0000\u0148\u098e"+ + "\u0001\u0000\u0000\u0000\u014a\u0994\u0001\u0000\u0000\u0000\u014c\u099a"+ + "\u0001\u0000\u0000\u0000\u014e\u099e\u0001\u0000\u0000\u0000\u0150\u09a4"+ + "\u0001\u0000\u0000\u0000\u0152\u09aa\u0001\u0000\u0000\u0000\u0154\u09af"+ + "\u0001\u0000\u0000\u0000\u0156\u09b4\u0001\u0000\u0000\u0000\u0158\u09b9"+ + "\u0001\u0000\u0000\u0000\u015a\u09be\u0001\u0000\u0000\u0000\u015c\u09c3"+ + "\u0001\u0000\u0000\u0000\u015e\u09ca\u0001\u0000\u0000\u0000\u0160\u09cc"+ + "\u0001\u0000\u0000\u0000\u0162\u09d0\u0001\u0000\u0000\u0000\u0164\u09d5"+ + "\u0001\u0000\u0000\u0000\u0166\u09e0\u0001\u0000\u0000\u0000\u0168\u09e4"+ + "\u0001\u0000\u0000\u0000\u016a\u09e9\u0001\u0000\u0000\u0000\u016c\u09ee"+ + "\u0001\u0000\u0000\u0000\u016e\u09f1\u0001\u0000\u0000\u0000\u0170\u09f5"+ + "\u0001\u0000\u0000\u0000\u0172\u09fb\u0001\u0000\u0000\u0000\u0174\u0a01"+ + "\u0001\u0000\u0000\u0000\u0176\u0a07\u0001\u0000\u0000\u0000\u0178\u0a0d"+ + "\u0001\u0000\u0000\u0000\u017a\u0a13\u0001\u0000\u0000\u0000\u017c\u0a16"+ + "\u0001\u0000\u0000\u0000\u017e\u0a19\u0001\u0000\u0000\u0000\u0180\u0a1c"+ + "\u0001\u0000\u0000\u0000\u0182\u0a20\u0001\u0000\u0000\u0000\u0184\u0a23"+ + "\u0001\u0000\u0000\u0000\u0186\u0a2a\u0001\u0000\u0000\u0000\u0188\u0a2e"+ + "\u0001\u0000\u0000\u0000\u018a\u0a33\u0001\u0000\u0000\u0000\u018c\u0a37"+ + "\u0001\u0000\u0000\u0000\u018e\u0a3c\u0001\u0000\u0000\u0000\u0190\u0a40"+ + "\u0001\u0000\u0000\u0000\u0192\u0a43\u0001\u0000\u0000\u0000\u0194\u0a46"+ + "\u0001\u0000\u0000\u0000\u0196\u0a4b\u0001\u0000\u0000\u0000\u0198\u0a50"+ + "\u0001\u0000\u0000\u0000\u019a\u0a55\u0001\u0000\u0000\u0000\u019c\u0a5a"+ + "\u0001\u0000\u0000\u0000\u019e\u0a5c\u0001\u0000\u0000\u0000\u01a0\u0a60"+ + "\u0001\u0000\u0000\u0000\u01a2\u0a63\u0001\u0000\u0000\u0000\u01a4\u0a67"+ + "\u0001\u0000\u0000\u0000\u01a6\u0a69\u0001\u0000\u0000\u0000\u01a8\u0a6d"+ + "\u0001\u0000\u0000\u0000\u01aa\u0a73\u0001\u0000\u0000\u0000\u01ac\u0a75"+ + "\u0001\u0000\u0000\u0000\u01ae\u0a79\u0001\u0000\u0000\u0000\u01b0\u0a7e"+ + "\u0001\u0000\u0000\u0000\u01b2\u0a88\u0001\u0000\u0000\u0000\u01b4\u0a9c"+ + "\u0001\u0000\u0000\u0000\u01b6\u0aa6\u0001\u0000\u0000\u0000\u01b8\u0aab"+ + "\u0001\u0000\u0000\u0000\u01ba\u0aaf\u0001\u0000\u0000\u0000\u01bc\u0ab3"+ + "\u0001\u0000\u0000\u0000\u01be\u0ab7\u0001\u0000\u0000\u0000\u01c0\u0abd"+ + "\u0001\u0000\u0000\u0000\u01c2\u0ac1\u0001\u0000\u0000\u0000\u01c4\u0ac5"+ + "\u0001\u0000\u0000\u0000\u01c6\u0acd\u0001\u0000\u0000\u0000\u01c8\u0ad5"+ + "\u0001\u0000\u0000\u0000\u01ca\u0ada\u0001\u0000\u0000\u0000\u01cc\u0ae5"+ + "\u0001\u0000\u0000\u0000\u01ce\u0aea\u0001\u0000\u0000\u0000\u01d0\u0aee"+ + "\u0001\u0000\u0000\u0000\u01d2\u0af3\u0001\u0000\u0000\u0000\u01d4\u0af7"+ + "\u0001\u0000\u0000\u0000\u01d6\u0afb\u0001\u0000\u0000\u0000\u01d8\u0aff"+ + "\u0001\u0000\u0000\u0000\u01da\u0b04\u0001\u0000\u0000\u0000\u01dc\u0b08"+ + "\u0001\u0000\u0000\u0000\u01de\u0b0d\u0001\u0000\u0000\u0000\u01e0\u0b17"+ + "\u0001\u0000\u0000\u0000\u01e2\u0b25\u0001\u0000\u0000\u0000\u01e4\u0b29"+ + "\u0001\u0000\u0000\u0000\u01e6\u0b2d\u0001\u0000\u0000\u0000\u01e8\u0b31"+ + "\u0001\u0000\u0000\u0000\u01ea\u0b37\u0001\u0000\u0000\u0000\u01ec\u0b3b"+ + "\u0001\u0000\u0000\u0000\u01ee\u0b3f\u0001\u0000\u0000\u0000\u01f0\u0b43"+ + "\u0001\u0000\u0000\u0000\u01f2\u0b47\u0001\u0000\u0000\u0000\u01f4\u0b4c"+ + "\u0001\u0000\u0000\u0000\u01f6\u0b51\u0001\u0000\u0000\u0000\u01f8\u0b55"+ + "\u0001\u0000\u0000\u0000\u01fa\u0b59\u0001\u0000\u0000\u0000\u01fc\u0b5e"+ + "\u0001\u0000\u0000\u0000\u01fe\u0b62\u0001\u0000\u0000\u0000\u0200\u0b72"+ + "\u0001\u0000\u0000\u0000\u0202\u0b77\u0001\u0000\u0000\u0000\u0204\u0b7c"+ + "\u0001\u0000\u0000\u0000\u0206\u0b80\u0001\u0000\u0000\u0000\u0208\u0b88"+ + "\u0001\u0000\u0000\u0000\u020a\u0b8d\u0001\u0000\u0000\u0000\u020c\u0b91"+ + "\u0001\u0000\u0000\u0000\u020e\u0212\u0007\u0000\u0000\u0000\u020f\u0211"+ + "\u0007\u0001\u0000\u0000\u0210\u020f\u0001\u0000\u0000\u0000\u0211\u0214"+ + "\u0001\u0000\u0000\u0000\u0212\u0210\u0001\u0000\u0000\u0000\u0212\u0213"+ + "\u0001\u0000\u0000\u0000\u0213\u000f\u0001\u0000\u0000\u0000\u0214\u0212"+ + "\u0001\u0000\u0000\u0000\u0215\u0217\u0007\u0002\u0000\u0000\u0216\u0215"+ + "\u0001\u0000\u0000\u0000\u0216\u0217\u0001\u0000\u0000\u0000\u0217\u0218"+ + "\u0001\u0000\u0000\u0000\u0218\u021c\u0007\u0000\u0000\u0000\u0219\u021b"+ + "\u0007\u0003\u0000\u0000\u021a\u0219\u0001\u0000\u0000\u0000\u021b\u021e"+ + "\u0001\u0000\u0000\u0000\u021c\u021a\u0001\u0000\u0000\u0000\u021c\u021d"+ + "\u0001\u0000\u0000\u0000\u021d\u0221\u0001\u0000\u0000\u0000\u021e\u021c"+ + "\u0001\u0000\u0000\u0000\u021f\u0221\u0003\u0016\u0004\u0000\u0220\u0216"+ + "\u0001\u0000\u0000\u0000\u0220\u021f\u0001\u0000\u0000\u0000\u0221\u0011"+ + "\u0001\u0000\u0000\u0000\u0222\u0223\u0003\u00f0q\u0000\u0223\u0227\u0005"+ + "(\u0000\u0000\u0224\u0226\u0003\u00f0q\u0000\u0225\u0224\u0001\u0000\u0000"+ + "\u0000\u0226\u0229\u0001\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000"+ + "\u0000\u0227\u0228\u0001\u0000\u0000\u0000\u0228\u0234\u0001\u0000\u0000"+ + "\u0000\u0229\u0227\u0001\u0000\u0000\u0000\u022a\u022e\u0005,\u0000\u0000"+ + "\u022b\u022d\u0005 \u0000\u0000\u022c\u022b\u0001\u0000\u0000\u0000\u022d"+ + "\u0230\u0001\u0000\u0000\u0000\u022e\u022c\u0001\u0000\u0000\u0000\u022e"+ + "\u022f\u0001\u0000\u0000\u0000\u022f\u0231\u0001\u0000\u0000\u0000\u0230"+ + "\u022e\u0001\u0000\u0000\u0000\u0231\u0233\u0003\u00f0q\u0000\u0232\u022a"+ + "\u0001\u0000\u0000\u0000\u0233\u0236\u0001\u0000\u0000\u0000\u0234\u0232"+ + "\u0001\u0000\u0000\u0000\u0234\u0235\u0001\u0000\u0000\u0000\u0235\u023a"+ + "\u0001\u0000\u0000\u0000\u0236\u0234\u0001\u0000\u0000\u0000\u0237\u0239"+ + "\u0005 \u0000\u0000\u0238\u0237\u0001\u0000\u0000\u0000\u0239\u023c\u0001"+ + "\u0000\u0000\u0000\u023a\u0238\u0001\u0000\u0000\u0000\u023a\u023b\u0001"+ + "\u0000\u0000\u0000\u023b\u023d\u0001\u0000\u0000\u0000\u023c\u023a\u0001"+ + "\u0000\u0000\u0000\u023d\u0241\u0005)\u0000\u0000\u023e\u0240\u0005 \u0000"+ + "\u0000\u023f\u023e\u0001\u0000\u0000\u0000\u0240\u0243\u0001\u0000\u0000"+ + "\u0000\u0241\u023f\u0001\u0000\u0000\u0000\u0241\u0242\u0001\u0000\u0000"+ + "\u0000\u0242\u0246\u0001\u0000\u0000\u0000\u0243\u0241\u0001\u0000\u0000"+ + "\u0000\u0244\u0245\u0005{\u0000\u0000\u0245\u0247\u0004\u0002\u0000\u0000"+ + "\u0246\u0244\u0001\u0000\u0000\u0000\u0246\u0247\u0001\u0000\u0000\u0000"+ + "\u0247\u0013\u0001\u0000\u0000\u0000\u0248\u0249\u0007\u0004\u0000\u0000"+ + "\u0249\u0253\u0003\u0010\u0001\u0000\u024a\u024c\u0005 \u0000\u0000\u024b"+ + "\u024a\u0001\u0000\u0000\u0000\u024c\u024f\u0001\u0000\u0000\u0000\u024d"+ + "\u024b\u0001\u0000\u0000\u0000\u024d\u024e\u0001\u0000\u0000\u0000\u024e"+ + "\u0250\u0001\u0000\u0000\u0000\u024f\u024d\u0001\u0000\u0000\u0000\u0250"+ + "\u0252\u0003\u0010\u0001\u0000\u0251\u024d\u0001\u0000\u0000\u0000\u0252"+ + "\u0255\u0001\u0000\u0000\u0000\u0253\u0251\u0001\u0000\u0000\u0000\u0253"+ + "\u0254\u0001\u0000\u0000\u0000\u0254\u0256\u0001\u0000\u0000\u0000\u0255"+ + "\u0253\u0001\u0000\u0000\u0000\u0256\u0257\u0007\u0004\u0000\u0000\u0257"+ + "\u026a\u0001\u0000\u0000\u0000\u0258\u0259\u0005\"\u0000\u0000\u0259\u0263"+ + "\u0003\u0010\u0001\u0000\u025a\u025c\u0005 \u0000\u0000\u025b\u025a\u0001"+ + "\u0000\u0000\u0000\u025c\u025f\u0001\u0000\u0000\u0000\u025d\u025b\u0001"+ + "\u0000\u0000\u0000\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u0260\u0001"+ + "\u0000\u0000\u0000\u025f\u025d\u0001\u0000\u0000\u0000\u0260\u0262\u0003"+ + "\u0010\u0001\u0000\u0261\u025d\u0001\u0000\u0000\u0000\u0262\u0265\u0001"+ + "\u0000\u0000\u0000\u0263\u0261\u0001\u0000\u0000\u0000\u0263\u0264\u0001"+ + "\u0000\u0000\u0000\u0264\u0266\u0001\u0000\u0000\u0000\u0265\u0263\u0001"+ + "\u0000\u0000\u0000\u0266\u0267\u0007\u0004\u0000\u0000\u0267\u0268\u0005"+ + "\"\u0000\u0000\u0268\u026a\u0001\u0000\u0000\u0000\u0269\u0248\u0001\u0000"+ + "\u0000\u0000\u0269\u0258\u0001\u0000\u0000\u0000\u026a\u0015\u0001\u0000"+ + "\u0000\u0000\u026b\u026c\u0005[\u0000\u0000\u026c\u0270\u0003\u00f4s\u0000"+ + "\u026d\u026e\u0003\u00ean\u0000\u026e\u026f\u0003\u0018\u0005\u0000\u026f"+ + "\u0271\u0001\u0000\u0000\u0000\u0270\u026d\u0001\u0000\u0000\u0000\u0270"+ + "\u0271\u0001\u0000\u0000\u0000\u0271\u0272\u0001\u0000\u0000\u0000\u0272"+ + "\u0273\u0005]\u0000\u0000\u0273\u0017\u0001\u0000\u0000\u0000\u0274\u0275"+ + "\u0005\"\u0000\u0000\u0275\u0276\u0003\u00f4s\u0000\u0276\u0277\u0005"+ + "\"\u0000\u0000\u0277\u027d\u0001\u0000\u0000\u0000\u0278\u0279\u0007\u0004"+ + "\u0000\u0000\u0279\u027a\u0003\u00f4s\u0000\u027a\u027b\u0007\u0004\u0000"+ + "\u0000\u027b\u027d\u0001\u0000\u0000\u0000\u027c\u0274\u0001\u0000\u0000"+ + "\u0000\u027c\u0278\u0001\u0000\u0000\u0000\u027d\u0019\u0001\u0000\u0000"+ + "\u0000\u027e\u027f\u0005@\u0000\u0000\u027f\u0280\u0007\u0005\u0000\u0000"+ + "\u0280\u0281\u0007\u0006\u0000\u0000\u0281\u0282\u0001\u0000\u0000\u0000"+ + "\u0282\u0283\u0006\u0006\u0000\u0000\u0283\u001b\u0001\u0000\u0000\u0000"+ + "\u0284\u0285\u0005@\u0000\u0000\u0285\u0286\u0007\u0007\u0000\u0000\u0286"+ + "\u0287\u0007\b\u0000\u0000\u0287\u0288\u0007\t\u0000\u0000\u0288\u0289"+ + "\u0007\u0007\u0000\u0000\u0289\u028a\u0007\u0005\u0000\u0000\u028a\u028b"+ + "\u0007\u0006\u0000\u0000\u028b\u028c\u0001\u0000\u0000\u0000\u028c\u028d"+ + "\u0006\u0007\u0000\u0000\u028d\u001d\u0001\u0000\u0000\u0000\u028e\u028f"+ + "\u0005@\u0000\u0000\u028f\u0290\u0007\u0007\u0000\u0000\u0290\u0291\u0007"+ + "\b\u0000\u0000\u0291\u0292\u0007\t\u0000\u0000\u0292\u0293\u0007\u0007"+ + "\u0000\u0000\u0293\u001f\u0001\u0000\u0000\u0000\u0294\u0295\u0005@\u0000"+ + "\u0000\u0295\u0296\u0007\u0007\u0000\u0000\u0296\u0297\u0007\n\u0000\u0000"+ + "\u0297\u0298\u0007\u000b\u0000\u0000\u0298\u0299\u0007\u0005\u0000\u0000"+ + "\u0299\u029a\u0007\u0006\u0000\u0000\u029a!\u0001\u0000\u0000\u0000\u029b"+ + "\u029c\u0005@\u0000\u0000\u029c\u029d\u0007\t\u0000\u0000\u029d\u029e"+ + "\u0007\f\u0000\u0000\u029e\u029f\u0007\u0005\u0000\u0000\u029f\u02a0\u0007"+ + "\r\u0000\u0000\u02a0\u02a1\u0007\u000e\u0000\u0000\u02a1\u02a2\u0007\u000f"+ + "\u0000\u0000\u02a2\u02a3\u0001\u0000\u0000\u0000\u02a3\u02a4\u0006\n\u0001"+ + "\u0000\u02a4#\u0001\u0000\u0000\u0000\u02a5\u02a6\u0005@\u0000\u0000\u02a6"+ + "\u02a7\u0007\u000e\u0000\u0000\u02a7\u02a8\u0007\u0010\u0000\u0000\u02a8"+ + "\u02a9\u0007\t\u0000\u0000\u02a9\u02aa\u0007\u0007\u0000\u0000\u02aa\u02ab"+ + "\u0001\u0000\u0000\u0000\u02ab\u02ac\u0006\u000b\u0001\u0000\u02ac%\u0001"+ + "\u0000\u0000\u0000\u02ad\u02ae\u0005@\u0000\u0000\u02ae\u02af\u0007\u000b"+ + "\u0000\u0000\u02af\u02b0\u0007\u0007\u0000\u0000\u02b0\u02b1\u0007\u0006"+ + "\u0000\u0000\u02b1\u02b2\u0007\u0010\u0000\u0000\u02b2\u02b3\u0007\u0011"+ + "\u0000\u0000\u02b3\u02b4\u0007\b\u0000\u0000\u02b4\u02b5\u0007\r\u0000"+ + "\u0000\u02b5\'\u0001\u0000\u0000\u0000\u02b6\u02b7\u0005@\u0000\u0000"+ + "\u02b7\u02b8\u0007\u0007\u0000\u0000\u02b8\u02b9\u0007\n\u0000\u0000\u02b9"+ + "\u02ba\u0007\u000b\u0000\u0000\u02ba\u02bb\u0007\t\u0000\u0000\u02bb\u02bc"+ + "\u0007\f\u0000\u0000\u02bc\u02bd\u0007\u0005\u0000\u0000\u02bd\u02be\u0007"+ + "\r\u0000\u0000\u02be\u02bf\u0007\u000e\u0000\u0000\u02bf\u02c0\u0007\u000f"+ + "\u0000\u0000\u02c0)\u0001\u0000\u0000\u0000\u02c1\u02c2\u0005@\u0000\u0000"+ + "\u02c2\u02c3\u0007\u0007\u0000\u0000\u02c3\u02c4\u0007\u0012\u0000\u0000"+ + "\u02c4\u02c5\u0007\u0013\u0000\u0000\u02c5\u02c6\u0007\r\u0000\u0000\u02c6"+ + "\u02c7\u0007\u0014\u0000\u0000\u02c7\u02c8\u0001\u0000\u0000\u0000\u02c8"+ + "\u02c9\u0006\u000e\u0000\u0000\u02c9+\u0001\u0000\u0000\u0000\u02ca\u02cb"+ + "\u0005@\u0000\u0000\u02cb\u02cc\u0007\u0007\u0000\u0000\u02cc\u02cd\u0007"+ + "\n\u0000\u0000\u02cd\u02ce\u0007\u000b\u0000\u0000\u02ce\u02cf\u0007\u0007"+ + "\u0000\u0000\u02cf\u02d0\u0007\u0012\u0000\u0000\u02d0\u02d1\u0007\u0013"+ + "\u0000\u0000\u02d1\u02d2\u0007\r\u0000\u0000\u02d2\u02d3\u0007\u0014\u0000"+ + "\u0000\u02d3-\u0001\u0000\u0000\u0000\u02d4\u02d5\u0005@\u0000\u0000\u02d5"+ + "\u02d6\u0007\u0011\u0000\u0000\u02d6\u02d7\u0007\n\u0000\u0000\u02d7\u02d8"+ + "\u0007\b\u0000\u0000\u02d8\u02d9\u0007\u0007\u0000\u0000\u02d9\u02da\u0007"+ + "\t\u0000\u0000\u02da\u02e2\u0007\t\u0000\u0000\u02db\u02dc\u0005@\u0000"+ + "\u0000\u02dc\u02dd\u0007\u0005\u0000\u0000\u02dd\u02de\u0007\t\u0000\u0000"+ + "\u02de\u02df\u0007\t\u0000\u0000\u02df\u02e0\u0007\u0007\u0000\u0000\u02e0"+ + "\u02e2\u0007\r\u0000\u0000\u02e1\u02d4\u0001\u0000\u0000\u0000\u02e1\u02db"+ + "\u0001\u0000\u0000\u0000\u02e2\u02e3\u0001\u0000\u0000\u0000\u02e3\u02e4"+ + "\u0006\u0010\u0000\u0000\u02e4/\u0001\u0000\u0000\u0000\u02e5\u02e6\u0005"+ + "@\u0000\u0000\u02e6\u02e7\u0007\u0007\u0000\u0000\u02e7\u02e8\u0007\n"+ + "\u0000\u0000\u02e8\u02e9\u0007\u000b\u0000\u0000\u02e9\u02ea\u0007\u0011"+ + "\u0000\u0000\u02ea\u02eb\u0007\n\u0000\u0000\u02eb\u02ec\u0007\b\u0000"+ + "\u0000\u02ec\u02ed\u0007\u0007\u0000\u0000\u02ed\u02ee\u0007\t\u0000\u0000"+ + "\u02ee\u02f9\u0007\t\u0000\u0000\u02ef\u02f0\u0005@\u0000\u0000\u02f0"+ + "\u02f1\u0007\u0007\u0000\u0000\u02f1\u02f2\u0007\n\u0000\u0000\u02f2\u02f3"+ + "\u0007\u000b\u0000\u0000\u02f3\u02f4\u0007\u0005\u0000\u0000\u02f4\u02f5"+ + "\u0007\t\u0000\u0000\u02f5\u02f6\u0007\t\u0000\u0000\u02f6\u02f7\u0007"+ + "\u0007\u0000\u0000\u02f7\u02f9\u0007\r\u0000\u0000\u02f8\u02e5\u0001\u0000"+ + "\u0000\u0000\u02f8\u02ef\u0001\u0000\u0000\u0000\u02f91\u0001\u0000\u0000"+ + "\u0000\u02fa\u02fb\u0005@\u0000\u0000\u02fb\u02fc\u0007\u0006\u0000\u0000"+ + "\u02fc\u02fd\u0007\u0015\u0000\u0000\u02fd\u02fe\u0007\u0016\u0000\u0000"+ + "\u02fe\u02ff\u0007\u0007\u0000\u0000\u02ff\u0300\u0007\u0010\u0000\u0000"+ + "\u0300\u0301\u0007\u000e\u0000\u0000\u0301\u0302\u0007\u000f\u0000\u0000"+ + "\u0302\u0303\u0001\u0000\u0000\u0000\u0303\u0304\u0006\u0012\u0002\u0000"+ + "\u03043\u0001\u0000\u0000\u0000\u0305\u0306\u0005@\u0000\u0000\u0306\u0307"+ + "\u0007\u0007\u0000\u0000\u0307\u0308\u0007\n\u0000\u0000\u0308\u0309\u0007"+ + "\u000b\u0000\u0000\u0309\u030a\u0007\u0006\u0000\u0000\u030a\u030b\u0007"+ + "\u0015\u0000\u0000\u030b\u030c\u0007\u0016\u0000\u0000\u030c\u030d\u0007"+ + "\u0007\u0000\u0000\u030d\u030e\u0007\u0010\u0000\u0000\u030e\u030f\u0007"+ + "\u000e\u0000\u0000\u030f\u0310\u0007\u000f\u0000\u0000\u03105\u0001\u0000"+ + "\u0000\u0000\u0311\u0312\u0005@\u0000\u0000\u0312\u0313\u0007\u0006\u0000"+ + "\u0000\u0313\u0314\u0007\u0015\u0000\u0000\u0314\u0315\u0007\u0016\u0000"+ + "\u0000\u0315\u0316\u0001\u0000\u0000\u0000\u0316\u0317\u0006\u0014\u0001"+ + "\u0000\u03177\u0001\u0000\u0000\u0000\u0318\u0319\u0005@\u0000\u0000\u0319"+ + "\u031a\u0007\u0007\u0000\u0000\u031a\u031b\u0007\n\u0000\u0000\u031b\u031c"+ + "\u0007\u000b\u0000\u0000\u031c\u031d\u0007\u0006\u0000\u0000\u031d\u031e"+ + "\u0007\u0015\u0000\u0000\u031e\u031f\u0007\u0016\u0000\u0000\u031f9\u0001"+ + "\u0000\u0000\u0000\u0320\u0321\u0005@\u0000\u0000\u0321\u0322\u0007\u0006"+ + "\u0000\u0000\u0322\u0323\u0007\u0015\u0000\u0000\u0323\u0324\u0007\u0016"+ + "\u0000\u0000\u0324\u0325\u0007\u0007\u0000\u0000\u0325\u0326\u0007\b\u0000"+ + "\u0000\u0326\u0327\u0007\t\u0000\u0000\u0327\u0328\u0007\u0007\u0000\u0000"+ + "\u0328\u0329\u0001\u0000\u0000\u0000\u0329\u032a\u0006\u0016\u0002\u0000"+ + "\u032a;\u0001\u0000\u0000\u0000\u032b\u032c\u0005@\u0000\u0000\u032c\u032d"+ + "\u0007\u0007\u0000\u0000\u032d\u032e\u0007\n\u0000\u0000\u032e\u032f\u0007"+ + "\u000b\u0000\u0000\u032f\u0330\u0007\u0006\u0000\u0000\u0330\u0331\u0007"+ + "\u0015\u0000\u0000\u0331\u0332\u0007\u0016\u0000\u0000\u0332\u0333\u0007"+ + "\u0007\u0000\u0000\u0333\u0334\u0007\b\u0000\u0000\u0334\u0335\u0007\t"+ + "\u0000\u0000\u0335\u0336\u0007\u0007\u0000\u0000\u0336=\u0001\u0000\u0000"+ + "\u0000\u0337\u0338\u0005@\u0000\u0000\u0338\u0339\u0007\f\u0000\u0000"+ + "\u0339\u033a\u0007\u000f\u0000\u0000\u033a\u033b\u0007\u0005\u0000\u0000"+ + "\u033b\u033c\u0007\b\u0000\u0000\u033c\u033d\u0007\u0007\u0000\u0000\u033d"+ + "\u033e\u0001\u0000\u0000\u0000\u033e\u033f\u0006\u0018\u0001\u0000\u033f"+ + "?\u0001\u0000\u0000\u0000\u0340\u0341\u0005@\u0000\u0000\u0341\u0342\u0007"+ + "\u0007\u0000\u0000\u0342\u0343\u0007\n\u0000\u0000\u0343\u0344\u0007\u000b"+ + "\u0000\u0000\u0344\u0345\u0007\f\u0000\u0000\u0345\u0346\u0007\u000f\u0000"+ + "\u0000\u0346\u0347\u0007\u0005\u0000\u0000\u0347\u0348\u0007\b\u0000\u0000"+ + "\u0348\u0349\u0007\u0007\u0000\u0000\u0349A\u0001\u0000\u0000\u0000\u034a"+ + "\u034b\u0005@\u0000\u0000\u034b\u034c\u0007\u0017\u0000\u0000\u034c\u034d"+ + "\u0007\u0016\u0000\u0000\u034d\u034e\u0007\u0007\u0000\u0000\u034e\u034f"+ + "\u0007\u0010\u0000\u0000\u034f\u0350\u0007\u0018\u0000\u0000\u0350\u0351"+ + "\u0001\u0000\u0000\u0000\u0351\u0352\u0006\u001a\u0001\u0000\u0352C\u0001"+ + "\u0000\u0000\u0000\u0353\u0354\u0005@\u0000\u0000\u0354\u0355\u0007\u000e"+ + "\u0000\u0000\u0355\u0356\u0007\u0015\u0000\u0000\u0356\u0357\u0007\n\u0000"+ + "\u0000\u0357\u0358\u0007\r\u0000\u0000\u0358\u0359\u0007\u0005\u0000\u0000"+ + "\u0359\u035a\u0007\n\u0000\u0000\u035a\u035b\u0007\u0011\u0000\u0000\u035b"+ + "\u035c\u0007\u0007\u0000\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d"+ + "\u035e\u0006\u001b\u0001\u0000\u035eE\u0001\u0000\u0000\u0000\u035f\u0360"+ + "\u0005@\u0000\u0000\u0360\u0361\u0007\u0005\u0000\u0000\u0361\u0362\u0007"+ + "\n\u0000\u0000\u0362\u0363\u0007\u000e\u0000\u0000\u0363\u0364\u0007\b"+ + "\u0000\u0000\u0364\u0365\u0007\u0011\u0000\u0000\u0365\u0366\u0007\u000b"+ + "\u0000\u0000\u0366\u0367\u0007\u0007\u0000\u0000\u0367\u0368\u0001\u0000"+ + "\u0000\u0000\u0368\u0369\u0006\u001c\u0003\u0000\u0369G\u0001\u0000\u0000"+ + "\u0000\u036a\u036b\u0005@\u0000\u0000\u036b\u036c\u0007\u0005\u0000\u0000"+ + "\u036c\u036d\u0007\n\u0000\u0000\u036d\u036e\u0007\u000e\u0000\u0000\u036e"+ + "\u036f\u0007\b\u0000\u0000\u036f\u0370\u0007\u0011\u0000\u0000\u0370\u0371"+ + "\u0007\u000b\u0000\u0000\u0371\u0372\u0007\u0007\u0000\u0000\u0372\u0373"+ + "\u0007\u0005\u0000\u0000\u0373\u0374\u0007\u0006\u0000\u0000\u0374\u0375"+ + "\u0001\u0000\u0000\u0000\u0375\u0376\u0006\u001d\u0003\u0000\u0376I\u0001"+ + "\u0000\u0000\u0000\u0377\u0378\u0005@\u0000\u0000\u0378\u0379\u0007\u0005"+ + "\u0000\u0000\u0379\u037a\u0007\n\u0000\u0000\u037a\u037b\u0007\u000e\u0000"+ + "\u0000\u037b\u037c\u0007\b\u0000\u0000\u037c\u037d\u0007\u0011\u0000\u0000"+ + "\u037d\u037e\u0007\u000b\u0000\u0000\u037e\u037f\u0007\u0007\u0000\u0000"+ + "\u037f\u0380\u0007\f\u0000\u0000\u0380\u0381\u0007\u000f\u0000\u0000\u0381"+ + "\u0382\u0007\u0007\u0000\u0000\u0382\u0383\u0007\n\u0000\u0000\u0383\u0384"+ + "\u0001\u0000\u0000\u0000\u0384\u0385\u0006\u001e\u0003\u0000\u0385K\u0001"+ + "\u0000\u0000\u0000\u0386\u0387\u0005@\u0000\u0000\u0387\u0388\u0007\u0005"+ + "\u0000\u0000\u0388\u0389\u0007\n\u0000\u0000\u0389\u038a\u0007\u000e\u0000"+ + "\u0000\u038a\u038b\u0007\b\u0000\u0000\u038b\u038c\u0007\u0011\u0000\u0000"+ + "\u038c\u038d\u0007\u000b\u0000\u0000\u038d\u038e\u0007\u0007\u0000\u0000"+ + "\u038e\u038f\u0007\u0006\u0000\u0000\u038f\u0390\u0007\u0005\u0000\u0000"+ + "\u0390\u0391\u0007\u0016\u0000\u0000\u0391\u0392\u0007\t\u0000\u0000\u0392"+ + "\u0393\u0007\r\u0000\u0000\u0393\u0394\u0001\u0000\u0000\u0000\u0394\u0395"+ + "\u0006\u001f\u0003\u0000\u0395M\u0001\u0000\u0000\u0000\u0396\u0397\u0005"+ + "@\u0000\u0000\u0397\u0398\u0007\u0005\u0000\u0000\u0398\u0399\u0007\n"+ + "\u0000\u0000\u0399\u039a\u0007\u000e\u0000\u0000\u039a\u039b\u0007\b\u0000"+ + "\u0000\u039b\u039c\u0007\u0011\u0000\u0000\u039c\u039d\u0007\u000b\u0000"+ + "\u0000\u039d\u039e\u0007\u0007\u0000\u0000\u039e\u039f\u0007\u0011\u0000"+ + "\u0000\u039f\u03a0\u0007\n\u0000\u0000\u03a0\u03a1\u0007\b\u0000\u0000"+ + "\u03a1\u03a2\u0007\u0007\u0000\u0000\u03a2\u03a3\u0007\t\u0000\u0000\u03a3"+ + "\u03a4\u0007\t\u0000\u0000\u03a4\u03a5\u0001\u0000\u0000\u0000\u03a5\u03a6"+ + "\u0006 \u0003\u0000\u03a6O\u0001\u0000\u0000\u0000\u03a7\u03a8\u0005@"+ + "\u0000\u0000\u03a8\u03a9\u0007\u0007\u0000\u0000\u03a9\u03aa\u0007\u0010"+ + "\u0000\u0000\u03aa\u03ab\u0007\u000e\u0000\u0000\u03ab\u03ac\u0007\u000f"+ + "\u0000\u0000\u03ac\u03ad\u0001\u0000\u0000\u0000\u03ad\u03ae\u0006!\u0003"+ + "\u0000\u03aeQ\u0001\u0000\u0000\u0000\u03af\u03b0\u0005@\u0000\u0000\u03b0"+ + "\u03b1\u0007\u0007\u0000\u0000\u03b1\u03b2\u0007\u0019\u0000\u0000\u03b2"+ + "\u03b3\u0007\r\u0000\u0000\u03b3\u03b4\u0007\u0007\u0000\u0000\u03b4\u03b5"+ + "\u0007\n\u0000\u0000\u03b5\u03b6\u0007\u000b\u0000\u0000\u03b6\u03b7\u0007"+ + "\t\u0000\u0000\u03b7\u03b8\u0001\u0000\u0000\u0000\u03b8\u03b9\u0006\""+ + "\u0003\u0000\u03b9S\u0001\u0000\u0000\u0000\u03ba\u03bb\u0005@\u0000\u0000"+ + "\u03bb\u03bc\u0007\u001a\u0000\u0000\u03bc\u03bd\u0007\t\u0000\u0000\u03bd"+ + "\u03be\u0001\u0000\u0000\u0000\u03be\u03bf\u0006#\u0000\u0000\u03bfU\u0001"+ + "\u0000\u0000\u0000\u03c0\u03c1\u0005@\u0000\u0000\u03c1\u03c2\u0007\u001a"+ + "\u0000\u0000\u03c2\u03c3\u0007\t\u0000\u0000\u03c3\u03c4\u0007\u0015\u0000"+ + "\u0000\u03c4\u03c5\u0007\n\u0000\u0000\u03c5\u03c6\u0001\u0000\u0000\u0000"+ + "\u03c6\u03c7\u0006$\u0000\u0000\u03c7W\u0001\u0000\u0000\u0000\u03c8\u03c9"+ + "\u0005@\u0000\u0000\u03c9\u03ca\u0007\t\u0000\u0000\u03ca\u03cb\u0007"+ + "\u0007\u0000\u0000\u03cb\u03cc\u0007\u000e\u0000\u0000\u03cc\u03cd\u0007"+ + "\r\u0000\u0000\u03cd\u03ce\u0007\u0005\u0000\u0000\u03ce\u03cf\u0007\u0015"+ + "\u0000\u0000\u03cf\u03d0\u0007\n\u0000\u0000\u03d0\u03d1\u0001\u0000\u0000"+ + "\u0000\u03d1\u03d2\u0006%\u0003\u0000\u03d2Y\u0001\u0000\u0000\u0000\u03d3"+ + "\u03d4\u0005@\u0000\u0000\u03d4\u03d5\u0007\u000f\u0000\u0000\u03d5\u03d6"+ + "\u0007\u0010\u0000\u0000\u03d6\u03d7\u0007\t\u0000\u0000\u03d7\u03d8\u0007"+ + "\t\u0000\u0000\u03d8\u03d9\u0007\u0007\u0000\u0000\u03d9\u03da\u0007\u000e"+ + "\u0000\u0000\u03da\u03db\u0007\r\u0000\u0000\u03db\u03dc\u0007\u0005\u0000"+ + "\u0000\u03dc\u03dd\u0007\u0015\u0000\u0000\u03dd\u03de\u0007\n\u0000\u0000"+ + "\u03de\u03df\u0001\u0000\u0000\u0000\u03df\u03e0\u0006&\u0003\u0000\u03e0"+ + "[\u0001\u0000\u0000\u0000\u03e1\u03e2\u0005@\u0000\u0000\u03e2\u03e3\u0007"+ + "\t\u0000\u0000\u03e3\u03e4\u0007\u0007\u0000\u0000\u03e4\u03e5\u0007\u000e"+ "\u0000\u0000\u03e5\u03e6\u0007\r\u0000\u0000\u03e6\u03e7\u0007\u0005\u0000"+ "\u0000\u03e7\u03e8\u0007\u0015\u0000\u0000\u03e8\u03e9\u0007\n\u0000\u0000"+ "\u03e9\u03ea\u0007\u0012\u0000\u0000\u03ea\u03eb\u0007\u0005\u0000\u0000"+ @@ -2103,492 +2110,531 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "\u0000\u0000\u07ac\u07ad\u0001\u0000\u0000\u0000\u07ad\u07ae\u0001\u0000"+ "\u0000\u0000\u07ae\u07af\u0006}\t\u0000\u07af\u0109\u0001\u0000\u0000"+ "\u0000\u07b0\u07b1\u0005{\u0000\u0000\u07b1\u07b2\u0005{\u0000\u0000\u07b2"+ - "\u089c\u0005{\u0000\u0000\u07b3\u07b4\u0005@\u0000\u0000\u07b4\u07b5\u0005"+ + "\u08e6\u0005{\u0000\u0000\u07b3\u07b4\u0005@\u0000\u0000\u07b4\u07b5\u0005"+ "@\u0000\u0000\u07b5\u07b7\u0001\u0000\u0000\u0000\u07b6\u07b8\u0005@\u0000"+ "\u0000\u07b7\u07b6\u0001\u0000\u0000\u0000\u07b7\u07b8\u0001\u0000\u0000"+ - "\u0000\u07b8\u089c\u0001\u0000\u0000\u0000\u07b9\u07ba\u0005@\u0000\u0000"+ + "\u0000\u07b8\u08e6\u0001\u0000\u0000\u0000\u07b9\u07ba\u0005@\u0000\u0000"+ "\u07ba\u07bb\u0005{\u0000\u0000\u07bb\u07bd\u0001\u0000\u0000\u0000\u07bc"+ "\u07be\u0005{\u0000\u0000\u07bd\u07bc\u0001\u0000\u0000\u0000\u07bd\u07be"+ - "\u0001\u0000\u0000\u0000\u07be\u089c\u0001\u0000\u0000\u0000\u07bf\u07c0"+ + "\u0001\u0000\u0000\u0000\u07be\u08e6\u0001\u0000\u0000\u0000\u07bf\u07c0"+ "\u0005@\u0000\u0000\u07c0\u07c1\u0007\u0012\u0000\u0000\u07c1\u07c2\u0007"+ "\u0007\u0000\u0000\u07c2\u07c3\u0007\u000b\u0000\u0000\u07c3\u07c4\u0007"+ - "\u0005\u0000\u0000\u07c4\u07c5\u0007\u0010\u0000\u0000\u07c5\u07c9\u0001"+ + "\u0005\u0000\u0000\u07c4\u07c5\u0007\u0010\u0000\u0000\u07c5\u07c7\u0001"+ "\u0000\u0000\u0000\u07c6\u07c8\u0007%\u0000\u0000\u07c7\u07c6\u0001\u0000"+ - "\u0000\u0000\u07c8\u07cb\u0001\u0000\u0000\u0000\u07c9\u07c7\u0001\u0000"+ - "\u0000\u0000\u07c9\u07ca\u0001\u0000\u0000\u0000\u07ca\u07cd\u0001\u0000"+ - "\u0000\u0000\u07cb\u07c9\u0001\u0000\u0000\u0000\u07cc\u07ce\u0005(\u0000"+ - "\u0000\u07cd\u07cc\u0001\u0000\u0000\u0000\u07cd\u07ce\u0001\u0000\u0000"+ - "\u0000\u07ce\u089c\u0001\u0000\u0000\u0000\u07cf\u07d0\u0005@\u0000\u0000"+ - "\u07d0\u07d1\u0007\u000e\u0000\u0000\u07d1\u07d2\u0007\u000f\u0000\u0000"+ - "\u07d2\u07d3\u0007\u0010\u0000\u0000\u07d3\u07d4\u0007\u0016\u0000\u0000"+ - "\u07d4\u07d5\u0007\t\u0000\u0000\u07d5\u07d6\u0007\u0007\u0000\u0000\u07d6"+ - "\u0894\u0007\r\u0000\u0000\u07d7\u07d8\u0005@\u0000\u0000\u07d8\u07d9"+ - "\u0007\u0005\u0000\u0000\u07d9\u07da\u0007\u0012\u0000\u0000\u07da\u07db"+ - "\u0007\u0013\u0000\u0000\u07db\u07dc\u0007\u0015\u0000\u0000\u07dc\u07dd"+ - "\u0007\u0016\u0000\u0000\u07dd\u0894\u0007\r\u0000\u0000\u07de\u07df\u0005"+ - "@\u0000\u0000\u07df\u07e0\u0007\n\u0000\u0000\u07e0\u07e1\u0007\u0010"+ - "\u0000\u0000\u07e1\u07e2\u0007\u0012\u0000\u0000\u07e2\u07e3\u0007\u0007"+ - "\u0000\u0000\u07e3\u07e4\u0007\t\u0000\u0000\u07e4\u07e5\u0007\u0013\u0000"+ - "\u0000\u07e5\u07e6\u0007\u0010\u0000\u0000\u07e6\u07e7\u0007\u000e\u0000"+ - "\u0000\u07e7\u0894\u0007\u0007\u0000\u0000\u07e8\u07e9\u0005@\u0000\u0000"+ - "\u07e9\u07ea\u0007\u000b\u0000\u0000\u07ea\u07eb\u0007\u0015\u0000\u0000"+ - "\u07eb\u07ec\u0007\u000e\u0000\u0000\u07ec\u07ed\u0007\u0011\u0000\u0000"+ - "\u07ed\u07ee\u0007\u0012\u0000\u0000\u07ee\u07ef\u0007\u0007\u0000\u0000"+ - "\u07ef\u07f0\u0007\n\u0000\u0000\u07f0\u0894\u0007\r\u0000\u0000\u07f1"+ - "\u07f2\u0005@\u0000\u0000\u07f2\u07f3\u0007\u0006\u0000\u0000\u07f3\u07f4"+ - "\u0007\u0015\u0000\u0000\u07f4\u07f5\u0007\n\u0000\u0000\u07f5\u07f6\u0007"+ - "\r\u0000\u0000\u07f6\u07f7\u0005-\u0000\u0000\u07f7\u07f8\u0007\u0006"+ - "\u0000\u0000\u07f8\u07f9\u0007\u0010\u0000\u0000\u07f9\u07fa\u0007\u000e"+ - "\u0000\u0000\u07fa\u0894\u0007\u0007\u0000\u0000\u07fb\u07fc\u0005@\u0000"+ - "\u0000\u07fc\u07fd\u0007\u0013\u0000\u0000\u07fd\u07fe\u0007\u0010\u0000"+ - "\u0000\u07fe\u07ff\u0007\u001b\u0000\u0000\u07ff\u0894\u0007\u0007\u0000"+ - "\u0000\u0800\u0801\u0005@\u0000\u0000\u0801\u0802\u0007\b\u0000\u0000"+ - "\u0802\u0803\u0007\u0010\u0000\u0000\u0803\u0804\u0007\u0014\u0000\u0000"+ - "\u0804\u0805\u0007\u0007\u0000\u0000\u0805\u0894\u0007\u0016\u0000\u0000"+ - "\u0806\u0807\u0005@\u0000\u0000\u0807\u0808\u0007\t\u0000\u0000\u0808"+ - "\u0809\u0007\u0011\u0000\u0000\u0809\u080a\u0007\u0013\u0000\u0000\u080a"+ - "\u080b\u0007\u0013\u0000\u0000\u080b\u080c\u0007\u0015\u0000\u0000\u080c"+ - "\u080d\u0007\u0016\u0000\u0000\u080d\u080e\u0007\r\u0000\u0000\u080e\u0894"+ - "\u0007\t\u0000\u0000\u080f\u0810\u0005@\u0000\u0000\u0810\u0811\u0007"+ - "\r\u0000\u0000\u0811\u0812\u0007\u0010\u0000\u0000\u0812\u0813\u0007\u0005"+ - "\u0000\u0000\u0813\u0814\u0007\b\u0000\u0000\u0814\u0815\u0007\f\u0000"+ - "\u0000\u0815\u0816\u0007\u0005\u0000\u0000\u0816\u0817\u0007\n\u0000\u0000"+ - "\u0817\u0894\u0007\u000b\u0000\u0000\u0818\u0819\u0005@\u0000\u0000\u0819"+ - "\u081a\u0007\u0010\u0000\u0000\u081a\u081b\u0007\u0013\u0000\u0000\u081b"+ - "\u081c\u0007\u0013\u0000\u0000\u081c\u081d\u0007\b\u0000\u0000\u081d\u0894"+ - "\u0007\u0014\u0000\u0000\u081e\u081f\u0005@\u0000\u0000\u081f\u0820\u0005"+ - "-\u0000\u0000\u0820\u0821\u0007\f\u0000\u0000\u0821\u0822\u0007\u0007"+ - "\u0000\u0000\u0822\u0823\u0007\u0017\u0000\u0000\u0823\u0824\u0007\u0018"+ - "\u0000\u0000\u0824\u0825\u0007\u0005\u0000\u0000\u0825\u0826\u0007\r\u0000"+ - "\u0000\u0826\u0827\u0005-\u0000\u0000\u0827\u0828\u0007\u0018\u0000\u0000"+ - "\u0828\u0829\u0007\u0007\u0000\u0000\u0829\u082a\u0007\u0014\u0000\u0000"+ - "\u082a\u082b\u0007\u0006\u0000\u0000\u082b\u082c\u0007\u0016\u0000\u0000"+ - "\u082c\u082d\u0007\u0010\u0000\u0000\u082d\u082e\u0007\u0012\u0000\u0000"+ - "\u082e\u082f\u0007\u0007\u0000\u0000\u082f\u0894\u0007\t\u0000\u0000\u0830"+ - "\u0831\u0005@\u0000\u0000\u0831\u0832\u0007\u0018\u0000\u0000\u0832\u0833"+ - "\u0007\u0007\u0000\u0000\u0833\u0834\u0007\u0014\u0000\u0000\u0834\u0835"+ - "\u0007\u0006\u0000\u0000\u0835\u0836\u0007\u0016\u0000\u0000\u0836\u0837"+ - "\u0007\u0010\u0000\u0000\u0837\u0838\u0007\u0012\u0000\u0000\u0838\u0839"+ - "\u0007\u0007\u0000\u0000\u0839\u0894\u0007\t\u0000\u0000\u083a\u083b\u0005"+ - "@\u0000\u0000\u083b\u083c\u0007\u000e\u0000\u0000\u083c\u083d\u0007\u0015"+ - "\u0000\u0000\u083d\u083e\u0007\u0011\u0000\u0000\u083e\u083f\u0007\n\u0000"+ - "\u0000\u083f\u0840\u0007\r\u0000\u0000\u0840\u0841\u0007\u0007\u0000\u0000"+ - "\u0841\u0842\u0007\u0016\u0000\u0000\u0842\u0843\u0005-\u0000\u0000\u0843"+ - "\u0844\u0007\t\u0000\u0000\u0844\u0845\u0007\r\u0000\u0000\u0845\u0846"+ - "\u0007\u0014\u0000\u0000\u0846\u0847\u0007\b\u0000\u0000\u0847\u0894\u0007"+ - "\u0007\u0000\u0000\u0848\u0849\u0005@\u0000\u0000\u0849\u084a\u0007\u0006"+ - "\u0000\u0000\u084a\u084b\u0007\u0015\u0000\u0000\u084b\u084c\u0007\n\u0000"+ - "\u0000\u084c\u084d\u0007\r\u0000\u0000\u084d\u084e\u0005-\u0000\u0000"+ - "\u084e\u084f\u0007\u0006\u0000\u0000\u084f\u0850\u0007\u0007\u0000\u0000"+ - "\u0850\u0851\u0007\u0010\u0000\u0000\u0851\u0852\u0007\r\u0000\u0000\u0852"+ - "\u0853\u0007\u0011\u0000\u0000\u0853\u0854\u0007\u0016\u0000\u0000\u0854"+ - "\u0855\u0007\u0007\u0000\u0000\u0855\u0856\u0005-\u0000\u0000\u0856\u0857"+ - "\u0007\u001c\u0000\u0000\u0857\u0858\u0007\u0010\u0000\u0000\u0858\u0859"+ - "\u0007\b\u0000\u0000\u0859\u085a\u0007\u0011\u0000\u0000\u085a\u085b\u0007"+ - "\u0007\u0000\u0000\u085b\u0894\u0007\t\u0000\u0000\u085c\u085d\u0005@"+ - "\u0000\u0000\u085d\u085e\u0007\u0013\u0000\u0000\u085e\u085f\u0007\u0016"+ - "\u0000\u0000\u085f\u0860\u0007\u0015\u0000\u0000\u0860\u0861\u0007\u0013"+ - "\u0000\u0000\u0861\u0862\u0007\u0007\u0000\u0000\u0862\u0863\u0007\u0016"+ - "\u0000\u0000\u0863\u0864\u0007\r\u0000\u0000\u0864\u0894\u0007\u0014\u0000"+ - "\u0000\u0865\u0866\u0005@\u0000\u0000\u0866\u0867\u0007\t\u0000\u0000"+ - "\u0867\u0868\u0007\u000e\u0000\u0000\u0868\u0869\u0007\u0015\u0000\u0000"+ - "\u0869\u086a\u0007\u0013\u0000\u0000\u086a\u0894\u0007\u0007\u0000\u0000"+ - "\u086b\u086c\u0005@\u0000\u0000\u086c\u086d\u0007\t\u0000\u0000\u086d"+ - "\u086e\u0007\r\u0000\u0000\u086e\u086f\u0007\u0010\u0000\u0000\u086f\u0870"+ - "\u0007\u0016\u0000\u0000\u0870\u0871\u0007\r\u0000\u0000\u0871\u0872\u0007"+ - "\u0005\u0000\u0000\u0872\u0873\u0007\n\u0000\u0000\u0873\u0874\u0007\u001b"+ - "\u0000\u0000\u0874\u0875\u0005-\u0000\u0000\u0875\u0876\u0007\t\u0000"+ - "\u0000\u0876\u0877\u0007\r\u0000\u0000\u0877\u0878\u0007\u0014\u0000\u0000"+ - "\u0878\u0879\u0007\b\u0000\u0000\u0879\u0894\u0007\u0007\u0000\u0000\u087a"+ - "\u087b\u0005@\u0000\u0000\u087b\u087c\u0007\t\u0000\u0000\u087c\u087d"+ - "\u0007\u0011\u0000\u0000\u087d\u087e\u0007\u0013\u0000\u0000\u087e\u087f"+ - "\u0007\u0013\u0000\u0000\u087f\u0880\u0007\u0015\u0000\u0000\u0880\u0881"+ - "\u0007\u0016\u0000\u0000\u0881\u0882\u0007\r\u0000\u0000\u0882\u0894\u0007"+ - "\t\u0000\u0000\u0883\u0884\u0005@\u0000\u0000\u0884\u0885\u0007\u001c"+ - "\u0000\u0000\u0885\u0886\u0007\u0005\u0000\u0000\u0886\u0887\u0007\u0007"+ - "\u0000\u0000\u0887\u0888\u0007\f\u0000\u0000\u0888\u0889\u0005-\u0000"+ - "\u0000\u0889\u088a\u0007\r\u0000\u0000\u088a\u088b\u0007\u0016\u0000\u0000"+ - "\u088b\u088c\u0007\u0010\u0000\u0000\u088c\u088d\u0007\n\u0000\u0000\u088d"+ - "\u088e\u0007\t\u0000\u0000\u088e\u088f\u0007\u0005\u0000\u0000\u088f\u0890"+ - "\u0007\r\u0000\u0000\u0890\u0891\u0007\u0005\u0000\u0000\u0891\u0892\u0007"+ - "\u0015\u0000\u0000\u0892\u0894\u0007\n\u0000\u0000\u0893\u07cf\u0001\u0000"+ - "\u0000\u0000\u0893\u07d7\u0001\u0000\u0000\u0000\u0893\u07de\u0001\u0000"+ - "\u0000\u0000\u0893\u07e8\u0001\u0000\u0000\u0000\u0893\u07f1\u0001\u0000"+ - "\u0000\u0000\u0893\u07fb\u0001\u0000\u0000\u0000\u0893\u0800\u0001\u0000"+ - "\u0000\u0000\u0893\u0806\u0001\u0000\u0000\u0000\u0893\u080f\u0001\u0000"+ - "\u0000\u0000\u0893\u0818\u0001\u0000\u0000\u0000\u0893\u081e\u0001\u0000"+ - "\u0000\u0000\u0893\u0830\u0001\u0000\u0000\u0000\u0893\u083a\u0001\u0000"+ - "\u0000\u0000\u0893\u0848\u0001\u0000\u0000\u0000\u0893\u085c\u0001\u0000"+ - "\u0000\u0000\u0893\u0865\u0001\u0000\u0000\u0000\u0893\u086b\u0001\u0000"+ - "\u0000\u0000\u0893\u087a\u0001\u0000\u0000\u0000\u0893\u0883\u0001\u0000"+ - "\u0000\u0000\u0894\u0898\u0001\u0000\u0000\u0000\u0895\u0897\u0007%\u0000"+ - "\u0000\u0896\u0895\u0001\u0000\u0000\u0000\u0897\u089a\u0001\u0000\u0000"+ - "\u0000\u0898\u0896\u0001\u0000\u0000\u0000\u0898\u0899\u0001\u0000\u0000"+ - "\u0000\u0899\u089c\u0001\u0000\u0000\u0000\u089a\u0898\u0001\u0000\u0000"+ - "\u0000\u089b\u07b0\u0001\u0000\u0000\u0000\u089b\u07b3\u0001\u0000\u0000"+ - "\u0000\u089b\u07b9\u0001\u0000\u0000\u0000\u089b\u07bf\u0001\u0000\u0000"+ - "\u0000\u089b\u0893\u0001\u0000\u0000\u0000\u089c\u089d\u0001\u0000\u0000"+ - "\u0000\u089d\u089e\u0006~\t\u0000\u089e\u010b\u0001\u0000\u0000\u0000"+ - "\u089f\u08a0\u0003\u00fex\u0000\u08a0\u08a1\u0001\u0000\u0000\u0000\u08a1"+ - "\u08a2\u0006\u007f\u0012\u0000\u08a2\u010d\u0001\u0000\u0000\u0000\u08a3"+ - "\u08a4\u0003\u0100y\u0000\u08a4\u08a5\u0001\u0000\u0000\u0000\u08a5\u08a6"+ - "\u0006\u0080\u0013\u0000\u08a6\u010f\u0001\u0000\u0000\u0000\u08a7\u08a9"+ - "\u0005\\\u0000\u0000\u08a8\u08a7\u0001\u0000\u0000\u0000\u08a8\u08a9\u0001"+ - "\u0000\u0000\u0000\u08a9\u08ad\u0001\u0000\u0000\u0000\u08aa\u08ab\u0003"+ - "\u00f0q\u0000\u08ab\u08ac\u0005\\\u0000\u0000\u08ac\u08ae\u0001\u0000"+ - "\u0000\u0000\u08ad\u08aa\u0001\u0000\u0000\u0000\u08ae\u08af\u0001\u0000"+ - "\u0000\u0000\u08af\u08ad\u0001\u0000\u0000\u0000\u08af\u08b0\u0001\u0000"+ - "\u0000\u0000\u08b0\u08b1\u0001\u0000\u0000\u0000\u08b1\u08b2\u0006\u0081"+ - "\u0014\u0000\u08b2\u0111\u0001\u0000\u0000\u0000\u08b3\u08b4\u0003\u00f0"+ - "q\u0000\u08b4\u08b5\u0001\u0000\u0000\u0000\u08b5\u08b6\u0006\u0082\u0015"+ - "\u0000\u08b6\u0113\u0001\u0000\u0000\u0000\u08b7\u08b8\u0005:\u0000\u0000"+ - "\u08b8\u08b9\u0005:\u0000\u0000\u08b9\u08ba\u0001\u0000\u0000\u0000\u08ba"+ - "\u08bb\u0006\u0083\u0016\u0000\u08bb\u0115\u0001\u0000\u0000\u0000\u08bc"+ - "\u08bd\u0005}\u0000\u0000\u08bd\u08be\u0005}\u0000\u0000\u08be\u08bf\u0001"+ - "\u0000\u0000\u0000\u08bf\u08c0\u0006\u0084\u0017\u0000\u08c0\u0117\u0001"+ - "\u0000\u0000\u0000\u08c1\u08c2\u0005(\u0000\u0000\u08c2\u08c3\u0001\u0000"+ - "\u0000\u0000\u08c3\u08c4\u0006\u0085\u0018\u0000\u08c4\u0119\u0001\u0000"+ - "\u0000\u0000\u08c5\u08c6\u0005)\u0000\u0000\u08c6\u08c7\u0001\u0000\u0000"+ - "\u0000\u08c7\u08c8\u0006\u0086\u0019\u0000\u08c8\u011b\u0001\u0000\u0000"+ - "\u0000\u08c9\u08ca\u0005-\u0000\u0000\u08ca\u08cb\u0005>\u0000\u0000\u08cb"+ - "\u08cc\u0001\u0000\u0000\u0000\u08cc\u08cd\u0006\u0087\u001a\u0000\u08cd"+ - "\u011d\u0001\u0000\u0000\u0000\u08ce\u08cf\t\u0000\u0000\u0000\u08cf\u08d0"+ - "\u0001\u0000\u0000\u0000\u08d0\u08d1\u0006\u0088\r\u0000\u08d1\u011f\u0001"+ - "\u0000\u0000\u0000\u08d2\u08d3\u0005\u0000\u0000\u0001\u08d3\u08d4\u0001"+ - "\u0000\u0000\u0000\u08d4\u08d5\u0006\u0089\u001b\u0000\u08d5\u08d6\u0006"+ - "\u0089\u0017\u0000\u08d6\u0121\u0001\u0000\u0000\u0000\u08d7\u08d8\u0003"+ - "\u00fex\u0000\u08d8\u08d9\u0001\u0000\u0000\u0000\u08d9\u08da\u0006\u008a"+ - "\u0012\u0000\u08da\u0123\u0001\u0000\u0000\u0000\u08db\u08dc\u0003\u0100"+ - "y\u0000\u08dc\u08dd\u0001\u0000\u0000\u0000\u08dd\u08de\u0006\u008b\u0013"+ - "\u0000\u08de\u0125\u0001\u0000\u0000\u0000\u08df\u08e1\u0005\\\u0000\u0000"+ - "\u08e0\u08df\u0001\u0000\u0000\u0000\u08e0\u08e1\u0001\u0000\u0000\u0000"+ - "\u08e1\u08e5\u0001\u0000\u0000\u0000\u08e2\u08e3\u0003\u00f0q\u0000\u08e3"+ - "\u08e4\u0005\\\u0000\u0000\u08e4\u08e6\u0001\u0000\u0000\u0000\u08e5\u08e2"+ - "\u0001\u0000\u0000\u0000\u08e6\u08e7\u0001\u0000\u0000\u0000\u08e7\u08e5"+ - "\u0001\u0000\u0000\u0000\u08e7\u08e8\u0001\u0000\u0000\u0000\u08e8\u08e9"+ - "\u0001\u0000\u0000\u0000\u08e9\u08ea\u0006\u008c\u0014\u0000\u08ea\u0127"+ - "\u0001\u0000\u0000\u0000\u08eb\u08ec\u0003\u00f0q\u0000\u08ec\u08ed\u0001"+ - "\u0000\u0000\u0000\u08ed\u08ee\u0006\u008d\u0015\u0000\u08ee\u0129\u0001"+ - "\u0000\u0000\u0000\u08ef\u08f0\u0005:\u0000\u0000\u08f0\u08f1\u0005:\u0000"+ - "\u0000\u08f1\u08f2\u0001\u0000\u0000\u0000\u08f2\u08f3\u0006\u008e\u0016"+ - "\u0000\u08f3\u012b\u0001\u0000\u0000\u0000\u08f4\u08f5\u0005!\u0000\u0000"+ - "\u08f5\u08f6\u0005!\u0000\u0000\u08f6\u08f7\u0005}\u0000\u0000\u08f7\u08f8"+ - "\u0001\u0000\u0000\u0000\u08f8\u08f9\u0006\u008f\u0017\u0000\u08f9\u012d"+ - "\u0001\u0000\u0000\u0000\u08fa\u08fb\u0005(\u0000\u0000\u08fb\u08fc\u0001"+ - "\u0000\u0000\u0000\u08fc\u08fd\u0006\u0090\u0018\u0000\u08fd\u012f\u0001"+ - "\u0000\u0000\u0000\u08fe\u08ff\u0005)\u0000\u0000\u08ff\u0900\u0001\u0000"+ - "\u0000\u0000\u0900\u0901\u0006\u0091\u0019\u0000\u0901\u0131\u0001\u0000"+ - "\u0000\u0000\u0902\u0903\u0005-\u0000\u0000\u0903\u0904\u0005>\u0000\u0000"+ - "\u0904\u0905\u0001\u0000\u0000\u0000\u0905\u0906\u0006\u0092\u001a\u0000"+ - "\u0906\u0133\u0001\u0000\u0000\u0000\u0907\u0908\t\u0000\u0000\u0000\u0908"+ - "\u0909\u0001\u0000\u0000\u0000\u0909\u090a\u0006\u0093\r\u0000\u090a\u0135"+ - "\u0001\u0000\u0000\u0000\u090b\u090c\u0005\u0000\u0000\u0001\u090c\u090d"+ - "\u0001\u0000\u0000\u0000\u090d\u090e\u0006\u0094\u001b\u0000\u090e\u090f"+ - "\u0006\u0094\u0017\u0000\u090f\u0137\u0001\u0000\u0000\u0000\u0910\u0912"+ - "\u0007%\u0000\u0000\u0911\u0910\u0001\u0000\u0000\u0000\u0912\u0913\u0001"+ - "\u0000\u0000\u0000\u0913\u0911\u0001\u0000\u0000\u0000\u0913\u0914\u0001"+ - "\u0000\u0000\u0000\u0914\u0915\u0001\u0000\u0000\u0000\u0915\u0916\u0004"+ - "\u0095\u0007\u0000\u0916\u0917\u0001\u0000\u0000\u0000\u0917\u0918\u0006"+ - "\u0095\r\u0000\u0918\u0919\u0006\u0095\u0017\u0000\u0919\u0139\u0001\u0000"+ - "\u0000\u0000\u091a\u091c\u0007%\u0000\u0000\u091b\u091a\u0001\u0000\u0000"+ - "\u0000\u091c\u091d\u0001\u0000\u0000\u0000\u091d\u091b\u0001\u0000\u0000"+ - "\u0000\u091d\u091e\u0001\u0000\u0000\u0000\u091e\u091f\u0001\u0000\u0000"+ - "\u0000\u091f\u0920\u0006\u0096\r\u0000\u0920\u013b\u0001\u0000\u0000\u0000"+ - "\u0921\u0922\u0005(\u0000\u0000\u0922\u0923\u0001\u0000\u0000\u0000\u0923"+ - "\u0924\u0006\u0097\u001c\u0000\u0924\u0925\u0006\u0097\u001d\u0000\u0925"+ - "\u013d\u0001\u0000\u0000\u0000\u0926\u0927\t\u0000\u0000\u0000\u0927\u0928"+ - "\u0004\u0098\b\u0000\u0928\u0929\u0001\u0000\u0000\u0000\u0929\u092a\u0006"+ - "\u0098\t\u0000\u092a\u092b\u0006\u0098\u0017\u0000\u092b\u013f\u0001\u0000"+ - "\u0000\u0000\u092c\u092d\t\u0000\u0000\u0000\u092d\u092e\u0001\u0000\u0000"+ - "\u0000\u092e\u092f\u0006\u0099\t\u0000\u092f\u0930\u0006\u0099\u0017\u0000"+ - "\u0930\u0141\u0001\u0000\u0000\u0000\u0931\u0932\u0004\u009a\t\u0000\u0932"+ - "\u0933\u0005(\u0000\u0000\u0933\u0934\u0006\u009a\u001e\u0000\u0934\u0935"+ - "\u0001\u0000\u0000\u0000\u0935\u0936\u0006\u009a\u001c\u0000\u0936\u0143"+ - "\u0001\u0000\u0000\u0000\u0937\u0938\u0004\u009b\n\u0000\u0938\u0939\u0005"+ - ")\u0000\u0000\u0939\u093a\u0006\u009b\u001f\u0000\u093a\u093b\u0001\u0000"+ - "\u0000\u0000\u093b\u093c\u0006\u009b \u0000\u093c\u093d\u0006\u009b!\u0000"+ - "\u093d\u0145\u0001\u0000\u0000\u0000\u093e\u093f\u0004\u009c\u000b\u0000"+ - "\u093f\u0940\u0005(\u0000\u0000\u0940\u0941\u0006\u009c\"\u0000\u0941"+ - "\u0942\u0001\u0000\u0000\u0000\u0942\u0943\u0006\u009c\u001c\u0000\u0943"+ - "\u0147\u0001\u0000\u0000\u0000\u0944\u0945\u0004\u009d\f\u0000\u0945\u0946"+ - "\u0005)\u0000\u0000\u0946\u0947\u0006\u009d#\u0000\u0947\u0948\u0001\u0000"+ - "\u0000\u0000\u0948\u0949\u0006\u009d\u001c\u0000\u0949\u0149\u0001\u0000"+ - "\u0000\u0000\u094a\u094b\u0005)\u0000\u0000\u094b\u094c\u0004\u009e\r"+ - "\u0000\u094c\u094d\u0001\u0000\u0000\u0000\u094d\u094e\u0006\u009e \u0000"+ - "\u094e\u094f\u0006\u009e!\u0000\u094f\u014b\u0001\u0000\u0000\u0000\u0950"+ - "\u0951\t\u0000\u0000\u0000\u0951\u0952\u0001\u0000\u0000\u0000\u0952\u0953"+ - "\u0006\u009f\u001c\u0000\u0953\u014d\u0001\u0000\u0000\u0000\u0954\u0955"+ - "\u0005\u0000\u0000\u0001\u0955\u0956\u0001\u0000\u0000\u0000\u0956\u0957"+ - "\u0006\u00a0\u001b\u0000\u0957\u0958\u0006\u00a0\u0017\u0000\u0958\u014f"+ - "\u0001\u0000\u0000\u0000\u0959\u095b\u0007%\u0000\u0000\u095a\u0959\u0001"+ - "\u0000\u0000\u0000\u095b\u095c\u0001\u0000\u0000\u0000\u095c\u095a\u0001"+ - "\u0000\u0000\u0000\u095c\u095d\u0001\u0000\u0000\u0000\u095d\u095e\u0001"+ - "\u0000\u0000\u0000\u095e\u095f\u0006\u00a1\r\u0000\u095f\u0151\u0001\u0000"+ - "\u0000\u0000\u0960\u0961\u0005(\u0000\u0000\u0961\u0962\u0006\u00a2$\u0000"+ - "\u0962\u0963\u0001\u0000\u0000\u0000\u0963\u0964\u0006\u00a2%\u0000\u0964"+ - "\u0153\u0001\u0000\u0000\u0000\u0965\u0966\t\u0000\u0000\u0000\u0966\u0967"+ - "\u0001\u0000\u0000\u0000\u0967\u0968\u0006\u00a3\t\u0000\u0968\u0969\u0006"+ - "\u00a3\u0017\u0000\u0969\u0155\u0001\u0000\u0000\u0000\u096a\u096b\u0005"+ - "[\u0000\u0000\u096b\u096c\u0006\u00a4&\u0000\u096c\u096d\u0001\u0000\u0000"+ - "\u0000\u096d\u096e\u0006\u00a4\'\u0000\u096e\u0157\u0001\u0000\u0000\u0000"+ - "\u096f\u0970\u0005]\u0000\u0000\u0970\u0971\u0006\u00a5(\u0000\u0971\u0972"+ - "\u0001\u0000\u0000\u0000\u0972\u0973\u0006\u00a5)\u0000\u0973\u0159\u0001"+ - "\u0000\u0000\u0000\u0974\u0975\u0005{\u0000\u0000\u0975\u0976\u0006\u00a6"+ - "*\u0000\u0976\u0977\u0001\u0000\u0000\u0000\u0977\u0978\u0006\u00a6 \u0000"+ - "\u0978\u015b\u0001\u0000\u0000\u0000\u0979\u097a\u0005}\u0000\u0000\u097a"+ - "\u097b\u0006\u00a7+\u0000\u097b\u097c\u0001\u0000\u0000\u0000\u097c\u097d"+ - "\u0006\u00a7 \u0000\u097d\u015d\u0001\u0000\u0000\u0000\u097e\u0981\u0003"+ - "\u00f8u\u0000\u097f\u0981\u0003\u00fav\u0000\u0980\u097e\u0001\u0000\u0000"+ - "\u0000\u0980\u097f\u0001\u0000\u0000\u0000\u0981\u015f\u0001\u0000\u0000"+ - "\u0000\u0982\u0983\u0003\u00fex"; + "\u0000\u0000\u07c8\u07c9\u0001\u0000\u0000\u0000\u07c9\u07c7\u0001\u0000"+ + "\u0000\u0000\u07c9\u07ca\u0001\u0000\u0000\u0000\u07ca\u07dc\u0001\u0000"+ + "\u0000\u0000\u07cb\u07cc\u0007\t\u0000\u0000\u07cc\u07cd\u0007\u000e\u0000"+ + "\u0000\u07cd\u07ce\u0007\u0016\u0000\u0000\u07ce\u07cf\u0007\u0007\u0000"+ + "\u0000\u07cf\u07d0\u0007\u0007\u0000\u0000\u07d0\u07d1\u0007\n\u0000\u0000"+ + "\u07d1\u07d3\u0001\u0000\u0000\u0000\u07d2\u07d4\u0007%\u0000\u0000\u07d3"+ + "\u07d2\u0001\u0000\u0000\u0000\u07d4\u07d5\u0001\u0000\u0000\u0000\u07d5"+ + "\u07d3\u0001\u0000\u0000\u0000\u07d5\u07d6\u0001\u0000\u0000\u0000\u07d6"+ + "\u07da\u0001\u0000\u0000\u0000\u07d7\u07d8\u0007\u0010\u0000\u0000\u07d8"+ + "\u07d9\u0007\n\u0000\u0000\u07d9\u07db\u0007\u000b\u0000\u0000\u07da\u07d7"+ + "\u0001\u0000\u0000\u0000\u07da\u07db\u0001\u0000\u0000\u0000\u07db\u07dd"+ + "\u0001\u0000\u0000\u0000\u07dc\u07cb\u0001\u0000\u0000\u0000\u07dc\u07dd"+ + "\u0001\u0000\u0000\u0000\u07dd\u08e6\u0001\u0000\u0000\u0000\u07de\u07df"+ + "\u0005@\u0000\u0000\u07df\u07e0\u0007\u000e\u0000\u0000\u07e0\u07e1\u0007"+ + "\u000f\u0000\u0000\u07e1\u07e2\u0007\u0010\u0000\u0000\u07e2\u07e3\u0007"+ + "\u0016\u0000\u0000\u07e3\u07e4\u0007\t\u0000\u0000\u07e4\u07e5\u0007\u0007"+ + "\u0000\u0000\u07e5\u08de\u0007\r\u0000\u0000\u07e6\u07e7\u0005@\u0000"+ + "\u0000\u07e7\u07e8\u0007\u0005\u0000\u0000\u07e8\u07e9\u0007\u0012\u0000"+ + "\u0000\u07e9\u07ea\u0007\u0013\u0000\u0000\u07ea\u07eb\u0007\u0015\u0000"+ + "\u0000\u07eb\u07ec\u0007\u0016\u0000\u0000\u07ec\u08de\u0007\r\u0000\u0000"+ + "\u07ed\u07ee\u0005@\u0000\u0000\u07ee\u07ef\u0007\n\u0000\u0000\u07ef"+ + "\u07f0\u0007\u0010\u0000\u0000\u07f0\u07f1\u0007\u0012\u0000\u0000\u07f1"+ + "\u07f2\u0007\u0007\u0000\u0000\u07f2\u07f3\u0007\t\u0000\u0000\u07f3\u07f4"+ + "\u0007\u0013\u0000\u0000\u07f4\u07f5\u0007\u0010\u0000\u0000\u07f5\u07f6"+ + "\u0007\u000e\u0000\u0000\u07f6\u08de\u0007\u0007\u0000\u0000\u07f7\u07f8"+ + "\u0005@\u0000\u0000\u07f8\u07f9\u0007\u000b\u0000\u0000\u07f9\u07fa\u0007"+ + "\u0015\u0000\u0000\u07fa\u07fb\u0007\u000e\u0000\u0000\u07fb\u07fc\u0007"+ + "\u0011\u0000\u0000\u07fc\u07fd\u0007\u0012\u0000\u0000\u07fd\u07fe\u0007"+ + "\u0007\u0000\u0000\u07fe\u07ff\u0007\n\u0000\u0000\u07ff\u08de\u0007\r"+ + "\u0000\u0000\u0800\u0801\u0005@\u0000\u0000\u0801\u0802\u0007\u0006\u0000"+ + "\u0000\u0802\u0803\u0007\u0015\u0000\u0000\u0803\u0804\u0007\n\u0000\u0000"+ + "\u0804\u0805\u0007\r\u0000\u0000\u0805\u0806\u0005-\u0000\u0000\u0806"+ + "\u0807\u0007\u0006\u0000\u0000\u0807\u0808\u0007\u0010\u0000\u0000\u0808"+ + "\u0809\u0007\u000e\u0000\u0000\u0809\u08de\u0007\u0007\u0000\u0000\u080a"+ + "\u080b\u0005@\u0000\u0000\u080b\u080c\u0007\u0013\u0000\u0000\u080c\u080d"+ + "\u0007\u0010\u0000\u0000\u080d\u080e\u0007\u001b\u0000\u0000\u080e\u08de"+ + "\u0007\u0007\u0000\u0000\u080f\u0810\u0005@\u0000\u0000\u0810\u0811\u0007"+ + "\b\u0000\u0000\u0811\u0812\u0007\u0010\u0000\u0000\u0812\u0813\u0007\u0014"+ + "\u0000\u0000\u0813\u0814\u0007\u0007\u0000\u0000\u0814\u08de\u0007\u0016"+ + "\u0000\u0000\u0815\u0816\u0005@\u0000\u0000\u0816\u0817\u0007\t\u0000"+ + "\u0000\u0817\u0818\u0007\u0011\u0000\u0000\u0818\u0819\u0007\u0013\u0000"+ + "\u0000\u0819\u081a\u0007\u0013\u0000\u0000\u081a\u081b\u0007\u0015\u0000"+ + "\u0000\u081b\u081c\u0007\u0016\u0000\u0000\u081c\u081d\u0007\r\u0000\u0000"+ + "\u081d\u08de\u0007\t\u0000\u0000\u081e\u081f\u0005@\u0000\u0000\u081f"+ + "\u0820\u0007\r\u0000\u0000\u0820\u0821\u0007\u0010\u0000\u0000\u0821\u0822"+ + "\u0007\u0005\u0000\u0000\u0822\u0823\u0007\b\u0000\u0000\u0823\u0824\u0007"+ + "\f\u0000\u0000\u0824\u0825\u0007\u0005\u0000\u0000\u0825\u0826\u0007\n"+ + "\u0000\u0000\u0826\u08de\u0007\u000b\u0000\u0000\u0827\u0828\u0005@\u0000"+ + "\u0000\u0828\u0829\u0007\u0010\u0000\u0000\u0829\u082a\u0007\u0013\u0000"+ + "\u0000\u082a\u082b\u0007\u0013\u0000\u0000\u082b\u082c\u0007\b\u0000\u0000"+ + "\u082c\u08de\u0007\u0014\u0000\u0000\u082d\u082e\u0005@\u0000\u0000\u082e"+ + "\u082f\u0005-\u0000\u0000\u082f\u0830\u0007\f\u0000\u0000\u0830\u0831"+ + "\u0007\u0007\u0000\u0000\u0831\u0832\u0007\u0017\u0000\u0000\u0832\u0833"+ + "\u0007\u0018\u0000\u0000\u0833\u0834\u0007\u0005\u0000\u0000\u0834\u0835"+ + "\u0007\r\u0000\u0000\u0835\u0836\u0005-\u0000\u0000\u0836\u0837\u0007"+ + "\u0018\u0000\u0000\u0837\u0838\u0007\u0007\u0000\u0000\u0838\u0839\u0007"+ + "\u0014\u0000\u0000\u0839\u083a\u0007\u0006\u0000\u0000\u083a\u083b\u0007"+ + "\u0016\u0000\u0000\u083b\u083c\u0007\u0010\u0000\u0000\u083c\u083d\u0007"+ + "\u0012\u0000\u0000\u083d\u083e\u0007\u0007\u0000\u0000\u083e\u08de\u0007"+ + "\t\u0000\u0000\u083f\u0840\u0005@\u0000\u0000\u0840\u0841\u0007\u0018"+ + "\u0000\u0000\u0841\u0842\u0007\u0007\u0000\u0000\u0842\u0843\u0007\u0014"+ + "\u0000\u0000\u0843\u0844\u0007\u0006\u0000\u0000\u0844\u0845\u0007\u0016"+ + "\u0000\u0000\u0845\u0846\u0007\u0010\u0000\u0000\u0846\u0847\u0007\u0012"+ + "\u0000\u0000\u0847\u0848\u0007\u0007\u0000\u0000\u0848\u08de\u0007\t\u0000"+ + "\u0000\u0849\u084a\u0005@\u0000\u0000\u084a\u084b\u0007\u000e\u0000\u0000"+ + "\u084b\u084c\u0007\u0015\u0000\u0000\u084c\u084d\u0007\u0011\u0000\u0000"+ + "\u084d\u084e\u0007\n\u0000\u0000\u084e\u084f\u0007\r\u0000\u0000\u084f"+ + "\u0850\u0007\u0007\u0000\u0000\u0850\u0851\u0007\u0016\u0000\u0000\u0851"+ + "\u0852\u0005-\u0000\u0000\u0852\u0853\u0007\t\u0000\u0000\u0853\u0854"+ + "\u0007\r\u0000\u0000\u0854\u0855\u0007\u0014\u0000\u0000\u0855\u0856\u0007"+ + "\b\u0000\u0000\u0856\u08de\u0007\u0007\u0000\u0000\u0857\u0858\u0005@"+ + "\u0000\u0000\u0858\u0859\u0007\u0006\u0000\u0000\u0859\u085a\u0007\u0015"+ + "\u0000\u0000\u085a\u085b\u0007\n\u0000\u0000\u085b\u085c\u0007\r\u0000"+ + "\u0000\u085c\u085d\u0005-\u0000\u0000\u085d\u085e\u0007\u0006\u0000\u0000"+ + "\u085e\u085f\u0007\u0007\u0000\u0000\u085f\u0860\u0007\u0010\u0000\u0000"+ + "\u0860\u0861\u0007\r\u0000\u0000\u0861\u0862\u0007\u0011\u0000\u0000\u0862"+ + "\u0863\u0007\u0016\u0000\u0000\u0863\u0864\u0007\u0007\u0000\u0000\u0864"+ + "\u0865\u0005-\u0000\u0000\u0865\u0866\u0007\u001c\u0000\u0000\u0866\u0867"+ + "\u0007\u0010\u0000\u0000\u0867\u0868\u0007\b\u0000\u0000\u0868\u0869\u0007"+ + "\u0011\u0000\u0000\u0869\u086a\u0007\u0007\u0000\u0000\u086a\u08de\u0007"+ + "\t\u0000\u0000\u086b\u086c\u0005@\u0000\u0000\u086c\u086d\u0007\u0013"+ + "\u0000\u0000\u086d\u086e\u0007\u0016\u0000\u0000\u086e\u086f\u0007\u0015"+ + "\u0000\u0000\u086f\u0870\u0007\u0013\u0000\u0000\u0870\u0871\u0007\u0007"+ + "\u0000\u0000\u0871\u0872\u0007\u0016\u0000\u0000\u0872\u0873\u0007\r\u0000"+ + "\u0000\u0873\u08de\u0007\u0014\u0000\u0000\u0874\u0875\u0005@\u0000\u0000"+ + "\u0875\u0876\u0007\t\u0000\u0000\u0876\u0877\u0007\u000e\u0000\u0000\u0877"+ + "\u0878\u0007\u0015\u0000\u0000\u0878\u0879\u0007\u0013\u0000\u0000\u0879"+ + "\u08de\u0007\u0007\u0000\u0000\u087a\u087b\u0005@\u0000\u0000\u087b\u087c"+ + "\u0007\t\u0000\u0000\u087c\u087d\u0007\r\u0000\u0000\u087d\u087e\u0007"+ + "\u0010\u0000\u0000\u087e\u087f\u0007\u0016\u0000\u0000\u087f\u0880\u0007"+ + "\r\u0000\u0000\u0880\u0881\u0007\u0005\u0000\u0000\u0881\u0882\u0007\n"+ + "\u0000\u0000\u0882\u0883\u0007\u001b\u0000\u0000\u0883\u0884\u0005-\u0000"+ + "\u0000\u0884\u0885\u0007\t\u0000\u0000\u0885\u0886\u0007\r\u0000\u0000"+ + "\u0886\u0887\u0007\u0014\u0000\u0000\u0887\u0888\u0007\b\u0000\u0000\u0888"+ + "\u08de\u0007\u0007\u0000\u0000\u0889\u088a\u0005@\u0000\u0000\u088a\u088b"+ + "\u0007\t\u0000\u0000\u088b\u088c\u0007\u0011\u0000\u0000\u088c\u088d\u0007"+ + "\u0013\u0000\u0000\u088d\u088e\u0007\u0013\u0000\u0000\u088e\u088f\u0007"+ + "\u0015\u0000\u0000\u088f\u0890\u0007\u0016\u0000\u0000\u0890\u0891\u0007"+ + "\r\u0000\u0000\u0891\u08de\u0007\t\u0000\u0000\u0892\u0893\u0005@\u0000"+ + "\u0000\u0893\u0894\u0007\u001c\u0000\u0000\u0894\u0895\u0007\u0005\u0000"+ + "\u0000\u0895\u0896\u0007\u0007\u0000\u0000\u0896\u0897\u0007\f\u0000\u0000"+ + "\u0897\u0898\u0005-\u0000\u0000\u0898\u0899\u0007\r\u0000\u0000\u0899"+ + "\u089a\u0007\u0016\u0000\u0000\u089a\u089b\u0007\u0010\u0000\u0000\u089b"+ + "\u089c\u0007\n\u0000\u0000\u089c\u089d\u0007\t\u0000\u0000\u089d\u089e"+ + "\u0007\u0005\u0000\u0000\u089e\u089f\u0007\r\u0000\u0000\u089f\u08a0\u0007"+ + "\u0005\u0000\u0000\u08a0\u08a1\u0007\u0015\u0000\u0000\u08a1\u08de\u0007"+ + "\n\u0000\u0000\u08a2\u08a3\u0005@\u0000\u0000\u08a3\u08a4\u0007\u000e"+ + "\u0000\u0000\u08a4\u08a5\u0007\u0015\u0000\u0000\u08a5\u08a6\u0007\n\u0000"+ + "\u0000\u08a6\u08a7\u0007\r\u0000\u0000\u08a7\u08a8\u0007\u0010\u0000\u0000"+ + "\u08a8\u08a9\u0007\u0005\u0000\u0000\u08a9\u08aa\u0007\n\u0000\u0000\u08aa"+ + "\u08ab\u0007\u0007\u0000\u0000\u08ab\u08de\u0007\u0016\u0000\u0000\u08ac"+ + "\u08ad\u0005@\u0000\u0000\u08ad\u08ae\u0007\u000e\u0000\u0000\u08ae\u08af"+ + "\u0007\u0015\u0000\u0000\u08af\u08b0\u0007\b\u0000\u0000\u08b0\u08b1\u0007"+ + "\u0015\u0000\u0000\u08b1\u08b2\u0007\u0016\u0000\u0000\u08b2\u08b3\u0005"+ + "-\u0000\u0000\u08b3\u08b4\u0007\u0013\u0000\u0000\u08b4\u08b5\u0007\u0016"+ + "\u0000\u0000\u08b5\u08b6\u0007\u0015\u0000\u0000\u08b6\u08b7\u0007\u0006"+ + "\u0000\u0000\u08b7\u08b8\u0007\u0005\u0000\u0000\u08b8\u08b9\u0007\b\u0000"+ + "\u0000\u08b9\u08de\u0007\u0007\u0000\u0000\u08ba\u08bb\u0005@\u0000\u0000"+ + "\u08bb\u08bc\u0007\t\u0000\u0000\u08bc\u08bd\u0007\r\u0000\u0000\u08bd"+ + "\u08be\u0007\u0014\u0000\u0000\u08be\u08bf\u0007\b\u0000\u0000\u08bf\u08c0"+ + "\u0007\u0007\u0000\u0000\u08c0\u08c1\u0007\t\u0000\u0000\u08c1\u08c2\u0007"+ + "\u0007\u0000\u0000\u08c2\u08de\u0007\r\u0000\u0000\u08c3\u08c4\u0005@"+ + "\u0000\u0000\u08c4\u08c5\u0007\u0006\u0000\u0000\u08c5\u08c6\u0007\u0015"+ + "\u0000\u0000\u08c6\u08c7\u0007\n\u0000\u0000\u08c7\u08c8\u0007\r\u0000"+ + "\u0000\u08c8\u08c9\u0005-\u0000\u0000\u08c9\u08ca\u0007\u0013\u0000\u0000"+ + "\u08ca\u08cb\u0007\u0010\u0000\u0000\u08cb\u08cc\u0007\b\u0000\u0000\u08cc"+ + "\u08cd\u0007\u0007\u0000\u0000\u08cd\u08ce\u0007\r\u0000\u0000\u08ce\u08cf"+ + "\u0007\r\u0000\u0000\u08cf\u08d0\u0007\u0007\u0000\u0000\u08d0\u08d1\u0005"+ + "-\u0000\u0000\u08d1\u08d2\u0007\u001c\u0000\u0000\u08d2\u08d3\u0007\u0010"+ + "\u0000\u0000\u08d3\u08d4\u0007\b\u0000\u0000\u08d4\u08d5\u0007\u0011\u0000"+ + "\u0000\u08d5\u08d6\u0007\u0007\u0000\u0000\u08d6\u08de\u0007\t\u0000\u0000"+ + "\u08d7\u08d8\u0005@\u0000\u0000\u08d8\u08d9\u0007\u0012\u0000\u0000\u08d9"+ + "\u08da\u0007\u0007\u0000\u0000\u08da\u08db\u0007\u000b\u0000\u0000\u08db"+ + "\u08dc\u0007\u0005\u0000\u0000\u08dc\u08de\u0007\u0010\u0000\u0000\u08dd"+ + "\u07de\u0001\u0000\u0000\u0000\u08dd\u07e6\u0001\u0000\u0000\u0000\u08dd"+ + "\u07ed\u0001\u0000\u0000\u0000\u08dd\u07f7\u0001\u0000\u0000\u0000\u08dd"+ + "\u0800\u0001\u0000\u0000\u0000\u08dd\u080a\u0001\u0000\u0000\u0000\u08dd"+ + "\u080f\u0001\u0000\u0000\u0000\u08dd\u0815\u0001\u0000\u0000\u0000\u08dd"+ + "\u081e\u0001\u0000\u0000\u0000\u08dd\u0827\u0001\u0000\u0000\u0000\u08dd"+ + "\u082d\u0001\u0000\u0000\u0000\u08dd\u083f\u0001\u0000\u0000\u0000\u08dd"+ + "\u0849\u0001\u0000\u0000\u0000\u08dd\u0857\u0001\u0000\u0000\u0000\u08dd"+ + "\u086b\u0001\u0000\u0000\u0000\u08dd\u0874\u0001\u0000\u0000\u0000\u08dd"+ + "\u087a\u0001\u0000\u0000\u0000\u08dd\u0889\u0001\u0000\u0000\u0000\u08dd"+ + "\u0892\u0001\u0000\u0000\u0000\u08dd\u08a2\u0001\u0000\u0000\u0000\u08dd"+ + "\u08ac\u0001\u0000\u0000\u0000\u08dd\u08ba\u0001\u0000\u0000\u0000\u08dd"+ + "\u08c3\u0001\u0000\u0000\u0000\u08dd\u08d7\u0001\u0000\u0000\u0000\u08de"+ + "\u08e2\u0001\u0000\u0000\u0000\u08df\u08e1\u0007%\u0000\u0000\u08e0\u08df"+ + "\u0001\u0000\u0000\u0000\u08e1\u08e4\u0001\u0000\u0000\u0000\u08e2\u08e0"+ + "\u0001\u0000\u0000\u0000\u08e2\u08e3\u0001\u0000\u0000\u0000\u08e3\u08e6"+ + "\u0001\u0000\u0000\u0000\u08e4\u08e2\u0001\u0000\u0000\u0000\u08e5\u07b0"+ + "\u0001\u0000\u0000\u0000\u08e5\u07b3\u0001\u0000\u0000\u0000\u08e5\u07b9"+ + "\u0001\u0000\u0000\u0000\u08e5\u07bf\u0001\u0000\u0000\u0000\u08e5\u08dd"+ + "\u0001\u0000\u0000\u0000\u08e6\u08e7\u0001\u0000\u0000\u0000\u08e7\u08e8"+ + "\u0006~\t\u0000\u08e8\u010b\u0001\u0000\u0000\u0000\u08e9\u08ea\u0003"+ + "\u00fex\u0000\u08ea\u08eb\u0001\u0000\u0000\u0000\u08eb\u08ec\u0006\u007f"+ + "\u0012\u0000\u08ec\u010d\u0001\u0000\u0000\u0000\u08ed\u08ee\u0003\u0100"+ + "y\u0000\u08ee\u08ef\u0001\u0000\u0000\u0000\u08ef\u08f0\u0006\u0080\u0013"+ + "\u0000\u08f0\u010f\u0001\u0000\u0000\u0000\u08f1\u08f3\u0005\\\u0000\u0000"+ + "\u08f2\u08f1\u0001\u0000\u0000\u0000\u08f2\u08f3\u0001\u0000\u0000\u0000"+ + "\u08f3\u08f7\u0001\u0000\u0000\u0000\u08f4\u08f5\u0003\u00f0q\u0000\u08f5"+ + "\u08f6\u0005\\\u0000\u0000\u08f6\u08f8\u0001\u0000\u0000\u0000\u08f7\u08f4"+ + "\u0001\u0000\u0000\u0000\u08f8\u08f9\u0001\u0000\u0000\u0000\u08f9\u08f7"+ + "\u0001\u0000\u0000\u0000\u08f9\u08fa\u0001\u0000\u0000\u0000\u08fa\u08fb"+ + "\u0001\u0000\u0000\u0000\u08fb\u08fc\u0006\u0081\u0014\u0000\u08fc\u0111"+ + "\u0001\u0000\u0000\u0000\u08fd\u08fe\u0003\u00f0q\u0000\u08fe\u08ff\u0001"+ + "\u0000\u0000\u0000\u08ff\u0900\u0006\u0082\u0015\u0000\u0900\u0113\u0001"+ + "\u0000\u0000\u0000\u0901\u0902\u0005:\u0000\u0000\u0902\u0903\u0005:\u0000"+ + "\u0000\u0903\u0904\u0001\u0000\u0000\u0000\u0904\u0905\u0006\u0083\u0016"+ + "\u0000\u0905\u0115\u0001\u0000\u0000\u0000\u0906\u0907\u0005}\u0000\u0000"+ + "\u0907\u0908\u0005}\u0000\u0000\u0908\u0909\u0001\u0000\u0000\u0000\u0909"+ + "\u090a\u0006\u0084\u0017\u0000\u090a\u0117\u0001\u0000\u0000\u0000\u090b"+ + "\u090c\u0005(\u0000\u0000\u090c\u090d\u0001\u0000\u0000\u0000\u090d\u090e"+ + "\u0006\u0085\u0018\u0000\u090e\u0119\u0001\u0000\u0000\u0000\u090f\u0910"+ + "\u0005)\u0000\u0000\u0910\u0911\u0001\u0000\u0000\u0000\u0911\u0912\u0006"+ + "\u0086\u0019\u0000\u0912\u011b\u0001\u0000\u0000\u0000\u0913\u0914\u0005"+ + "-\u0000\u0000\u0914\u0915\u0005>\u0000\u0000\u0915\u0916\u0001\u0000\u0000"+ + "\u0000\u0916\u0917\u0006\u0087\u001a\u0000\u0917\u011d\u0001\u0000\u0000"+ + "\u0000\u0918\u0919\t\u0000\u0000\u0000\u0919\u091a\u0001\u0000\u0000\u0000"+ + "\u091a\u091b\u0006\u0088\r\u0000\u091b\u011f\u0001\u0000\u0000\u0000\u091c"+ + "\u091d\u0005\u0000\u0000\u0001\u091d\u091e\u0001\u0000\u0000\u0000\u091e"+ + "\u091f\u0006\u0089\u001b\u0000\u091f\u0920\u0006\u0089\u0017\u0000\u0920"+ + "\u0121\u0001\u0000\u0000\u0000\u0921\u0922\u0003\u00fex\u0000\u0922\u0923"+ + "\u0001\u0000\u0000\u0000\u0923\u0924\u0006\u008a\u0012\u0000\u0924\u0123"+ + "\u0001\u0000\u0000\u0000\u0925\u0926\u0003\u0100y\u0000\u0926\u0927\u0001"+ + "\u0000\u0000\u0000\u0927\u0928\u0006\u008b\u0013\u0000\u0928\u0125\u0001"+ + "\u0000\u0000\u0000\u0929\u092b\u0005\\\u0000\u0000\u092a\u0929\u0001\u0000"+ + "\u0000\u0000\u092a\u092b\u0001\u0000\u0000\u0000\u092b\u092f\u0001\u0000"+ + "\u0000\u0000\u092c\u092d\u0003\u00f0q\u0000\u092d\u092e\u0005\\\u0000"+ + "\u0000\u092e\u0930\u0001\u0000\u0000\u0000\u092f\u092c\u0001\u0000\u0000"+ + "\u0000\u0930\u0931\u0001\u0000\u0000\u0000\u0931\u092f\u0001\u0000\u0000"+ + "\u0000\u0931\u0932\u0001\u0000\u0000\u0000\u0932\u0933\u0001\u0000\u0000"+ + "\u0000\u0933\u0934\u0006\u008c\u0014\u0000\u0934\u0127\u0001\u0000\u0000"+ + "\u0000\u0935\u0936\u0003\u00f0q\u0000\u0936\u0937\u0001\u0000\u0000\u0000"+ + "\u0937\u0938\u0006\u008d\u0015\u0000\u0938\u0129\u0001\u0000\u0000\u0000"+ + "\u0939\u093a\u0005:\u0000\u0000\u093a\u093b\u0005:\u0000\u0000\u093b\u093c"+ + "\u0001\u0000\u0000\u0000\u093c\u093d\u0006\u008e\u0016\u0000\u093d\u012b"+ + "\u0001\u0000\u0000\u0000\u093e\u093f\u0005!\u0000\u0000\u093f\u0940\u0005"+ + "!\u0000\u0000\u0940\u0941\u0005}\u0000\u0000\u0941\u0942\u0001\u0000\u0000"+ + "\u0000\u0942\u0943\u0006\u008f\u0017\u0000\u0943\u012d\u0001\u0000\u0000"+ + "\u0000\u0944\u0945\u0005(\u0000\u0000\u0945\u0946\u0001\u0000\u0000\u0000"+ + "\u0946\u0947\u0006\u0090\u0018\u0000\u0947\u012f\u0001\u0000\u0000\u0000"+ + "\u0948\u0949\u0005)\u0000\u0000\u0949\u094a\u0001\u0000\u0000\u0000\u094a"+ + "\u094b\u0006\u0091\u0019\u0000\u094b\u0131\u0001\u0000\u0000\u0000\u094c"+ + "\u094d\u0005-\u0000\u0000\u094d\u094e\u0005>\u0000\u0000\u094e\u094f\u0001"+ + "\u0000\u0000\u0000\u094f\u0950\u0006\u0092\u001a\u0000\u0950\u0133\u0001"+ + "\u0000\u0000\u0000\u0951\u0952\t\u0000\u0000\u0000\u0952\u0953\u0001\u0000"+ + "\u0000\u0000\u0953\u0954\u0006\u0093\r\u0000\u0954\u0135\u0001\u0000\u0000"+ + "\u0000\u0955\u0956\u0005\u0000\u0000\u0001\u0956\u0957\u0001\u0000\u0000"+ + "\u0000\u0957\u0958\u0006\u0094\u001b\u0000\u0958\u0959\u0006\u0094\u0017"+ + "\u0000\u0959\u0137\u0001\u0000\u0000\u0000\u095a\u095c\u0007%\u0000\u0000"+ + "\u095b\u095a\u0001\u0000\u0000\u0000\u095c\u095d\u0001\u0000\u0000\u0000"+ + "\u095d\u095b\u0001\u0000\u0000\u0000\u095d\u095e\u0001\u0000\u0000\u0000"+ + "\u095e\u095f\u0001\u0000\u0000\u0000\u095f\u0960\u0004\u0095\u0007\u0000"+ + "\u0960\u0961\u0001\u0000\u0000\u0000\u0961\u0962\u0006\u0095\r\u0000\u0962"+ + "\u0963\u0006\u0095\u0017\u0000\u0963\u0139\u0001\u0000\u0000\u0000\u0964"+ + "\u0966\u0007%\u0000\u0000\u0965\u0964\u0001\u0000"; private static final String _serializedATNSegment1 = - "\u0000\u0983\u0984\u0001\u0000\u0000\u0000\u0984\u0985\u0006\u00a9\u0012"+ - "\u0000\u0985\u0161\u0001\u0000\u0000\u0000\u0986\u0987\u0003\u0100y\u0000"+ - "\u0987\u0988\u0001\u0000\u0000\u0000\u0988\u0989\u0006\u00aa\u0013\u0000"+ - "\u0989\u0163\u0001\u0000\u0000\u0000\u098a\u098c\u0005\\\u0000\u0000\u098b"+ - "\u098a\u0001\u0000\u0000\u0000\u098b\u098c\u0001\u0000\u0000\u0000\u098c"+ - "\u0990\u0001\u0000\u0000\u0000\u098d\u098e\u0003\u00f0q\u0000\u098e\u098f"+ - "\u0005\\\u0000\u0000\u098f\u0991\u0001\u0000\u0000\u0000\u0990\u098d\u0001"+ - "\u0000\u0000\u0000\u0991\u0992\u0001\u0000\u0000\u0000\u0992\u0990\u0001"+ - "\u0000\u0000\u0000\u0992\u0993\u0001\u0000\u0000\u0000\u0993\u0994\u0001"+ - "\u0000\u0000\u0000\u0994\u0995\u0006\u00ab\u0014\u0000\u0995\u0165\u0001"+ - "\u0000\u0000\u0000\u0996\u0997\u0003\u00f0q\u0000\u0997\u0998\u0001\u0000"+ - "\u0000\u0000\u0998\u0999\u0006\u00ac\u0015\u0000\u0999\u0167\u0001\u0000"+ - "\u0000\u0000\u099a\u099b\u0005:\u0000\u0000\u099b\u099c\u0005:\u0000\u0000"+ - "\u099c\u099d\u0001\u0000\u0000\u0000\u099d\u099e\u0006\u00ad\u0016\u0000"+ - "\u099e\u0169\u0001\u0000\u0000\u0000\u099f\u09a0\u0005(\u0000\u0000\u09a0"+ - "\u09a1\u0006\u00ae,\u0000\u09a1\u09a2\u0001\u0000\u0000\u0000\u09a2\u09a3"+ - "\u0006\u00ae\u0018\u0000\u09a3\u016b\u0001\u0000\u0000\u0000\u09a4\u09a5"+ - "\u0005)\u0000\u0000\u09a5\u09a6\u0006\u00af-\u0000\u09a6\u016d\u0001\u0000"+ - "\u0000\u0000\u09a7\u09a8\t\u0000\u0000\u0000\u09a8\u09a9\u0001\u0000\u0000"+ - "\u0000\u09a9\u09aa\u0006\u00b0\r\u0000\u09aa\u016f\u0001\u0000\u0000\u0000"+ - "\u09ab\u09ac\u0005\u0000\u0000\u0001\u09ac\u09ad\u0001\u0000\u0000\u0000"+ - "\u09ad\u09ae\u0006\u00b1\u001b\u0000\u09ae\u09af\u0006\u00b1\u0017\u0000"+ - "\u09af\u0171\u0001\u0000\u0000\u0000\u09b0\u09b2\u0007%\u0000\u0000\u09b1"+ - "\u09b0\u0001\u0000\u0000\u0000\u09b2\u09b3\u0001\u0000\u0000\u0000\u09b3"+ - "\u09b1\u0001\u0000\u0000\u0000\u09b3\u09b4\u0001\u0000\u0000\u0000\u09b4"+ - "\u09b5\u0001\u0000\u0000\u0000\u09b5\u09b6\u0006\u00b2\r\u0000\u09b6\u0173"+ - "\u0001\u0000\u0000\u0000\u09b7\u09b8\u0005(\u0000\u0000\u09b8\u09b9\u0006"+ - "\u00b3.\u0000\u09b9\u09ba\u0001\u0000\u0000\u0000\u09ba\u09bb\u0006\u00b3"+ - "/\u0000\u09bb\u09bc\u0006\u00b30\u0000\u09bc\u0175\u0001\u0000\u0000\u0000"+ - "\u09bd\u09be\t\u0000\u0000\u0000\u09be\u09bf\u0001\u0000\u0000\u0000\u09bf"+ - "\u09c0\u0006\u00b4\t\u0000\u09c0\u09c1\u0006\u00b4\u0017\u0000\u09c1\u0177"+ - "\u0001\u0000\u0000\u0000\u09c2\u09c4\u0007%\u0000\u0000\u09c3\u09c2\u0001"+ - "\u0000\u0000\u0000\u09c4\u09c5\u0001\u0000\u0000\u0000\u09c5\u09c3\u0001"+ - "\u0000\u0000\u0000\u09c5\u09c6\u0001\u0000\u0000\u0000\u09c6\u09c7\u0001"+ - "\u0000\u0000\u0000\u09c7\u09c8\u0006\u00b5\r\u0000\u09c8\u0179\u0001\u0000"+ - "\u0000\u0000\u09c9\u09ca\u0005(\u0000\u0000\u09ca\u09cb\u0006\u00b61\u0000"+ - "\u09cb\u017b\u0001\u0000\u0000\u0000\u09cc\u09cd\u0005)\u0000\u0000\u09cd"+ - "\u09ce\u0006\u00b72\u0000\u09ce\u017d\u0001\u0000\u0000\u0000\u09cf\u09d0"+ - "\u0007\u0010\u0000\u0000\u09d0\u09d1\u0007\t\u0000\u0000\u09d1\u017f\u0001"+ - "\u0000\u0000\u0000\u09d2\u09d3\u0003\u00fex\u0000\u09d3\u09d4\u0001\u0000"+ - "\u0000\u0000\u09d4\u09d5\u0006\u00b9\u0012\u0000\u09d5\u0181\u0001\u0000"+ - "\u0000\u0000\u09d6\u09d7\u0005=\u0000\u0000\u09d7\u09d8\u0005>\u0000\u0000"+ - "\u09d8\u0183\u0001\u0000\u0000\u0000\u09d9\u09da\u0003\u0100y\u0000\u09da"+ - "\u09db\u0001\u0000\u0000\u0000\u09db\u09dc\u0006\u00bb \u0000\u09dc\u0185"+ - "\u0001\u0000\u0000\u0000\u09dd\u09e1\u0003\u00f8u\u0000\u09de\u09e1\u0003"+ - "\u00fav\u0000\u09df\u09e1\u0003\u00f0q\u0000\u09e0\u09dd\u0001\u0000\u0000"+ - "\u0000\u09e0\u09de\u0001\u0000\u0000\u0000\u09e0\u09df\u0001\u0000\u0000"+ - "\u0000\u09e1\u09e2\u0001\u0000\u0000\u0000\u09e2\u09e3\u0006\u00bc \u0000"+ - "\u09e3\u0187\u0001\u0000\u0000\u0000\u09e4\u09e5\u0005:\u0000\u0000\u09e5"+ - "\u09e6\u0005:\u0000\u0000\u09e6\u09e7\u0001\u0000\u0000\u0000\u09e7\u09e8"+ - "\u0006\u00bd \u0000\u09e8\u0189\u0001\u0000\u0000\u0000\u09e9\u09ea\t"+ - "\u0000\u0000\u0000\u09ea\u09eb\u0001\u0000\u0000\u0000\u09eb\u09ec\u0006"+ - "\u00be \u0000\u09ec\u018b\u0001\u0000\u0000\u0000\u09ed\u09ee\u0005\u0000"+ - "\u0000\u0001\u09ee\u09ef\u0001\u0000\u0000\u0000\u09ef\u09f0\u0006\u00bf"+ - "\u001b\u0000\u09f0\u09f1\u0006\u00bf\u0017\u0000\u09f1\u018d\u0001\u0000"+ - "\u0000\u0000\u09f2\u09f3\u0003\u00fcw\u0000\u09f3\u09f4\u0001\u0000\u0000"+ - "\u0000\u09f4\u09f5\u0006\u00c03\u0000\u09f5\u018f\u0001\u0000\u0000\u0000"+ - "\u09f6\u09f7\u0005[\u0000\u0000\u09f7\u09f8\u0006\u00c14\u0000\u09f8\u0191"+ - "\u0001\u0000\u0000\u0000\u09f9\u09fa\u0005]\u0000\u0000\u09fa\u09fb\u0006"+ - "\u00c25\u0000\u09fb\u0193\u0001\u0000\u0000\u0000\u09fc\u09fd\u0005{\u0000"+ - "\u0000\u09fd\u09fe\u0006\u00c36\u0000\u09fe\u09ff\u0001\u0000\u0000\u0000"+ - "\u09ff\u0a00\u0006\u00c37\u0000\u0a00\u0195\u0001\u0000\u0000\u0000\u0a01"+ - "\u0a02\u0005}\u0000\u0000\u0a02\u0a03\u0006\u00c48\u0000\u0a03\u0a04\u0001"+ - "\u0000\u0000\u0000\u0a04\u0a05\u0006\u00c47\u0000\u0a05\u0197\u0001\u0000"+ - "\u0000\u0000\u0a06\u0a07\u0005(\u0000\u0000\u0a07\u0a08\u0006\u00c59\u0000"+ - "\u0a08\u0a09\u0001\u0000\u0000\u0000\u0a09\u0a0a\u0006\u00c57\u0000\u0a0a"+ - "\u0199\u0001\u0000\u0000\u0000\u0a0b\u0a0c\u0005)\u0000\u0000\u0a0c\u0a0d"+ - "\u0006\u00c6:\u0000\u0a0d\u019b\u0001\u0000\u0000\u0000\u0a0e\u0a11\u0003"+ - "\u00f8u\u0000\u0a0f\u0a11\u0003\u00fav\u0000\u0a10\u0a0e\u0001\u0000\u0000"+ - "\u0000\u0a10\u0a0f\u0001\u0000\u0000\u0000\u0a11\u019d\u0001\u0000\u0000"+ - "\u0000\u0a12\u0a13\u0003\u00fex\u0000\u0a13\u0a14\u0001\u0000\u0000\u0000"+ - "\u0a14\u0a15\u0006\u00c8\u0012\u0000\u0a15\u019f\u0001\u0000\u0000\u0000"+ - "\u0a16\u0a17\u0005=\u0000\u0000\u0a17\u0a18\u0005>\u0000\u0000\u0a18\u01a1"+ - "\u0001\u0000\u0000\u0000\u0a19\u0a1a\u0003\u0100y\u0000\u0a1a\u0a1b\u0001"+ - "\u0000\u0000\u0000\u0a1b\u0a1c\u0006\u00ca\u0013\u0000\u0a1c\u01a3\u0001"+ - "\u0000\u0000\u0000\u0a1d\u0a1e\u0005.\u0000\u0000\u0a1e\u01a5\u0001\u0000"+ - "\u0000\u0000\u0a1f\u0a20\u0005,\u0000\u0000\u0a20\u0a21\u0006\u00cc;\u0000"+ - "\u0a21\u01a7\u0001\u0000\u0000\u0000\u0a22\u0a24\u0007&\u0000\u0000\u0a23"+ - "\u0a22\u0001\u0000\u0000\u0000\u0a24\u0a25\u0001\u0000\u0000\u0000\u0a25"+ - "\u0a23\u0001\u0000\u0000\u0000\u0a25\u0a26\u0001\u0000\u0000\u0000\u0a26"+ - "\u0a27\u0001\u0000\u0000\u0000\u0a27\u0a28\u0006\u00cd\r\u0000\u0a28\u01a9"+ - "\u0001\u0000\u0000\u0000\u0a29\u0a2a\u0003\u00f0q\u0000\u0a2a\u01ab\u0001"+ - "\u0000\u0000\u0000\u0a2b\u0a2c\t\u0000\u0000\u0000\u0a2c\u0a2d\u0001\u0000"+ - "\u0000\u0000\u0a2d\u0a2e\u0006\u00cf7\u0000\u0a2e\u01ad\u0001\u0000\u0000"+ - "\u0000\u0a2f\u0a30\u0005\u0000\u0000\u0001\u0a30\u0a31\u0001\u0000\u0000"+ - "\u0000\u0a31\u0a32\u0006\u00d0\u001b\u0000\u0a32\u0a33\u0006\u00d0\u0017"+ - "\u0000\u0a33\u01af\u0001\u0000\u0000\u0000\u0a34\u0a35\u0005/\u0000\u0000"+ - "\u0a35\u0a36\u0005/\u0000\u0000\u0a36\u0a38\u0001\u0000\u0000\u0000\u0a37"+ - "\u0a39\b\u001f\u0000\u0000\u0a38\u0a37\u0001\u0000\u0000\u0000\u0a39\u0a3a"+ - "\u0001\u0000\u0000\u0000\u0a3a\u0a38\u0001\u0000\u0000\u0000\u0a3a\u0a3b"+ - "\u0001\u0000\u0000\u0000\u0a3b\u0a3c\u0001\u0000\u0000\u0000\u0a3c\u0a3d"+ - "\u0006\u00d1\r\u0000\u0a3d\u01b1\u0001\u0000\u0000\u0000\u0a3e\u0a3f\u0005"+ - "/\u0000\u0000\u0a3f\u0a40\u0005*\u0000\u0000\u0a40\u0a44\u0001\u0000\u0000"+ - "\u0000\u0a41\u0a43\t\u0000\u0000\u0000\u0a42\u0a41\u0001\u0000\u0000\u0000"+ - "\u0a43\u0a46\u0001\u0000\u0000\u0000\u0a44\u0a45\u0001\u0000\u0000\u0000"+ - "\u0a44\u0a42\u0001\u0000\u0000\u0000\u0a45\u0a47\u0001\u0000\u0000\u0000"+ - "\u0a46\u0a44\u0001\u0000\u0000\u0000\u0a47\u0a48\u0005*\u0000\u0000\u0a48"+ - "\u0a49\u0005/\u0000\u0000\u0a49\u0a4d\u0001\u0000\u0000\u0000\u0a4a\u0a4c"+ - "\u0007\u001f\u0000\u0000\u0a4b\u0a4a\u0001\u0000\u0000\u0000\u0a4c\u0a4f"+ - "\u0001\u0000\u0000\u0000\u0a4d\u0a4b\u0001\u0000\u0000\u0000\u0a4d\u0a4e"+ - "\u0001\u0000\u0000\u0000\u0a4e\u0a50\u0001\u0000\u0000\u0000\u0a4f\u0a4d"+ - "\u0001\u0000\u0000\u0000\u0a50\u0a51\u0006\u00d2\r\u0000\u0a51\u01b3\u0001"+ - "\u0000\u0000\u0000\u0a52\u0a53\u0005@\u0000\u0000\u0a53\u0a54\u0007\u0007"+ - "\u0000\u0000\u0a54\u0a55\u0007\n\u0000\u0000\u0a55\u0a56\u0007\u000b\u0000"+ - "\u0000\u0a56\u0a57\u0007\u0013\u0000\u0000\u0a57\u0a58\u0007\u000f\u0000"+ - "\u0000\u0a58\u0a59\u0007\u0013\u0000\u0000\u0a59\u0a5a\u0001\u0000\u0000"+ - "\u0000\u0a5a\u0a5b\u0006\u00d3\u0017\u0000\u0a5b\u01b5\u0001\u0000\u0000"+ - "\u0000\u0a5c\u0a5d\u0005@\u0000\u0000\u0a5d\u0a5e\u0001\u0000\u0000\u0000"+ - "\u0a5e\u0a5f\u0006\u00d4\t\u0000\u0a5f\u0a60\u0006\u00d4\u0017\u0000\u0a60"+ - "\u01b7\u0001\u0000\u0000\u0000\u0a61\u0a62\u0005[\u0000\u0000\u0a62\u0a63"+ - "\u0001\u0000\u0000\u0000\u0a63\u0a64\u0006\u00d5 \u0000\u0a64\u01b9\u0001"+ - "\u0000\u0000\u0000\u0a65\u0a66\u0005]\u0000\u0000\u0a66\u0a67\u0001\u0000"+ - "\u0000\u0000\u0a67\u0a68\u0006\u00d6 \u0000\u0a68\u01bb\u0001\u0000\u0000"+ - "\u0000\u0a69\u0a6a\u0005{\u0000\u0000\u0a6a\u0a6b\u0001\u0000\u0000\u0000"+ - "\u0a6b\u0a6c\u0006\u00d7 \u0000\u0a6c\u01bd\u0001\u0000\u0000\u0000\u0a6d"+ - "\u0a6e\u0005}\u0000\u0000\u0a6e\u0a6f\u0001\u0000\u0000\u0000\u0a6f\u0a70"+ - "\u0006\u00d8 \u0000\u0a70\u01bf\u0001\u0000\u0000\u0000\u0a71\u0a74\u0003"+ - "\u00f8u\u0000\u0a72\u0a74\u0003\u00fav\u0000\u0a73\u0a71\u0001\u0000\u0000"+ - "\u0000\u0a73\u0a72\u0001\u0000\u0000\u0000\u0a74\u0a75\u0001\u0000\u0000"+ - "\u0000\u0a75\u0a76\u0006\u00d9<\u0000\u0a76\u01c1\u0001\u0000\u0000\u0000"+ - "\u0a77\u0a78\u0003\u00fex\u0000\u0a78\u0a79\u0001\u0000\u0000\u0000\u0a79"+ - "\u0a7a\u0006\u00da\u0012\u0000\u0a7a\u01c3\u0001\u0000\u0000\u0000\u0a7b"+ - "\u0a7c\u0007\n\u0000\u0000\u0a7c\u0a7d\u0007\u0007\u0000\u0000\u0a7d\u0a7e"+ - "\u0007\f\u0000\u0000\u0a7e\u0a7f\u0001\u0000\u0000\u0000\u0a7f\u0a80\u0004"+ - "\u00db\u000e\u0000\u0a80\u0a81\u0001\u0000\u0000\u0000\u0a81\u0a82\u0006"+ - "\u00db=\u0000\u0a82\u01c5\u0001\u0000\u0000\u0000\u0a83\u0a84\u0007\u000e"+ - "\u0000\u0000\u0a84\u0a85\u0007\b\u0000\u0000\u0a85\u0a86\u0007\u0010\u0000"+ - "\u0000\u0a86\u0a87\u0007\t\u0000\u0000\u0a87\u0a88\u0007\t\u0000\u0000"+ - "\u0a88\u0a89\u0001\u0000\u0000\u0000\u0a89\u0a8a\u0006\u00dc>\u0000\u0a8a"+ - "\u01c7\u0001\u0000\u0000\u0000\u0a8b\u0a8c\u0003\u0100y\u0000\u0a8c\u0a8d"+ - "\u0001\u0000\u0000\u0000\u0a8d\u0a8e\u0006\u00dd\u0013\u0000\u0a8e\u01c9"+ - "\u0001\u0000\u0000\u0000\u0a8f\u0a91\u0005\\\u0000\u0000\u0a90\u0a8f\u0001"+ - "\u0000\u0000\u0000\u0a90\u0a91\u0001\u0000\u0000\u0000\u0a91\u0a95\u0001"+ - "\u0000\u0000\u0000\u0a92\u0a93\u0003\u00f0q\u0000\u0a93\u0a94\u0005\\"+ - "\u0000\u0000\u0a94\u0a96\u0001\u0000\u0000\u0000\u0a95\u0a92\u0001\u0000"+ - "\u0000\u0000\u0a96\u0a97\u0001\u0000\u0000\u0000\u0a97\u0a95\u0001\u0000"+ - "\u0000\u0000\u0a97\u0a98\u0001\u0000\u0000\u0000\u0a98\u0a99\u0001\u0000"+ - "\u0000\u0000\u0a99\u0a9a\u0006\u00de\u0014\u0000\u0a9a\u01cb\u0001\u0000"+ - "\u0000\u0000\u0a9b\u0a9c\u0005\\\u0000\u0000\u0a9c\u0a9d\u0003\u00f0q"+ - "\u0000\u0a9d\u0a9e\u0001\u0000\u0000\u0000\u0a9e\u0a9f\u0006\u00df\u0015"+ - "\u0000\u0a9f\u01cd\u0001\u0000\u0000\u0000\u0aa0\u0aa1\u0003\u00f0q\u0000"+ - "\u0aa1\u0aa2\u0001\u0000\u0000\u0000\u0aa2\u0aa3\u0006\u00e0\u0015\u0000"+ - "\u0aa3\u01cf\u0001\u0000\u0000\u0000\u0aa4\u0aa5\u0005:\u0000\u0000\u0aa5"+ - "\u0aa6\u0005:\u0000\u0000\u0aa6\u0aa7\u0001\u0000\u0000\u0000\u0aa7\u0aa8"+ - "\u0006\u00e1\u0016\u0000\u0aa8\u01d1\u0001\u0000\u0000\u0000\u0aa9\u0aaa"+ - "\u0005(\u0000\u0000\u0aaa\u0aab\u0001\u0000\u0000\u0000\u0aab\u0aac\u0006"+ - "\u00e2\u0018\u0000\u0aac\u01d3\u0001\u0000\u0000\u0000\u0aad\u0aae\u0005"+ - ")\u0000\u0000\u0aae\u0aaf\u0001\u0000\u0000\u0000\u0aaf\u0ab0\u0006\u00e3"+ - "\u0019\u0000\u0ab0\u01d5\u0001\u0000\u0000\u0000\u0ab1\u0ab2\u0005 \u0000"+ - "\u0000\u0ab2\u0ab3\u0001\u0000\u0000\u0000\u0ab3\u0ab4\u0006\u00e4\r\u0000"+ - "\u0ab4\u01d7\u0001\u0000\u0000\u0000\u0ab5\u0ab6\u0005\u0000\u0000\u0001"+ - "\u0ab6\u0ab7\u0001\u0000\u0000\u0000\u0ab7\u0ab8\u0006\u00e5\u001b\u0000"+ - "\u0ab8\u0ab9\u0006\u00e5\u0017\u0000\u0ab9\u01d9\u0001\u0000\u0000\u0000"+ - "\u0aba\u0abb\t\u0000\u0000\u0000\u0abb\u0abc\u0001\u0000\u0000\u0000\u0abc"+ - "\u0abd\u0006\u00e6\r\u0000\u0abd\u01db\u0001\u0000\u0000\u0000\u0abe\u0abf"+ - "\u0005?\u0000\u0000\u0abf\u0ac0\u0005>\u0000\u0000\u0ac0\u0ac1\u0001\u0000"+ - "\u0000\u0000\u0ac1\u0ac2\u0006\u00e7\u0017\u0000\u0ac2\u01dd\u0001\u0000"+ - "\u0000\u0000\u0ac3\u0ac4\u0005/\u0000\u0000\u0ac4\u0ac5\u0005/\u0000\u0000"+ - "\u0ac5\u0ac7\u0001\u0000\u0000\u0000\u0ac6\u0ac8\b\u001f\u0000\u0000\u0ac7"+ - "\u0ac6\u0001\u0000\u0000\u0000\u0ac8\u0ac9\u0001\u0000\u0000\u0000\u0ac9"+ - "\u0ac7\u0001\u0000\u0000\u0000\u0ac9\u0aca\u0001\u0000\u0000\u0000\u0aca"+ - "\u0acb\u0001\u0000\u0000\u0000\u0acb\u0acc\u0006\u00e8\r\u0000\u0acc\u01df"+ - "\u0001\u0000\u0000\u0000\u0acd\u0ace\u0005/\u0000\u0000\u0ace\u0acf\u0005"+ - "*\u0000\u0000\u0acf\u0ad3\u0001\u0000\u0000\u0000\u0ad0\u0ad2\t\u0000"+ - "\u0000\u0000\u0ad1\u0ad0\u0001\u0000\u0000\u0000\u0ad2\u0ad5\u0001\u0000"+ - "\u0000\u0000\u0ad3\u0ad4\u0001\u0000\u0000\u0000\u0ad3\u0ad1\u0001\u0000"+ - "\u0000\u0000\u0ad4\u0ad6\u0001\u0000\u0000\u0000\u0ad5\u0ad3\u0001\u0000"+ - "\u0000\u0000\u0ad6\u0ad7\u0005*\u0000\u0000\u0ad7\u0ad8\u0005/\u0000\u0000"+ - "\u0ad8\u0ad9\u0001\u0000\u0000\u0000\u0ad9\u0ada\u0006\u00e9\r\u0000\u0ada"+ - "\u01e1\u0001\u0000\u0000\u0000\u0adb\u0adc\u0005[\u0000\u0000\u0adc\u0add"+ - "\u0001\u0000\u0000\u0000\u0add\u0ade\u0006\u00ea \u0000\u0ade\u01e3\u0001"+ - "\u0000\u0000\u0000\u0adf\u0ae0\u0005]\u0000\u0000\u0ae0\u0ae1\u0001\u0000"+ - "\u0000\u0000\u0ae1\u0ae2\u0006\u00eb \u0000\u0ae2\u01e5\u0001\u0000\u0000"+ - "\u0000\u0ae3\u0ae4\u0005{\u0000\u0000\u0ae4\u0ae5\u0001\u0000\u0000\u0000"+ - "\u0ae5\u0ae6\u0006\u00ec \u0000\u0ae6\u01e7\u0001\u0000\u0000\u0000\u0ae7"+ - "\u0ae8\u0005}\u0000\u0000\u0ae8\u0ae9\u0001\u0000\u0000\u0000\u0ae9\u0aea"+ - "\u0006\u00ed \u0000\u0aea\u01e9\u0001\u0000\u0000\u0000\u0aeb\u0aee\u0003"+ - "\u00f8u\u0000\u0aec\u0aee\u0003\u00fav\u0000\u0aed\u0aeb\u0001\u0000\u0000"+ - "\u0000\u0aed\u0aec\u0001\u0000\u0000\u0000\u0aee\u0aef\u0001\u0000\u0000"+ - "\u0000\u0aef\u0af0\u0006\u00ee<\u0000\u0af0\u01eb\u0001\u0000\u0000\u0000"+ - "\u0af1\u0af2\u0003\u00fex\u0000\u0af2\u0af3\u0001\u0000\u0000\u0000\u0af3"+ - "\u0af4\u0006\u00ef\u0012\u0000\u0af4\u01ed\u0001\u0000\u0000\u0000\u0af5"+ - "\u0af6\u0003\u0100y\u0000\u0af6\u0af7\u0001\u0000\u0000\u0000\u0af7\u0af8"+ - "\u0006\u00f0\u0013\u0000\u0af8\u01ef\u0001\u0000\u0000\u0000\u0af9\u0afa"+ - "\u0003\u00f0q\u0000\u0afa\u0afb\u0001\u0000\u0000\u0000\u0afb\u0afc\u0006"+ - "\u00f1\u0015\u0000\u0afc\u01f1\u0001\u0000\u0000\u0000\u0afd\u0afe\u0005"+ - ":\u0000\u0000\u0afe\u0aff\u0005:\u0000\u0000\u0aff\u0b00\u0001\u0000\u0000"+ - "\u0000\u0b00\u0b01\u0006\u00f2\u0016\u0000\u0b01\u01f3\u0001\u0000\u0000"+ - "\u0000\u0b02\u0b03\u0005-\u0000\u0000\u0b03\u0b04\u0005>\u0000\u0000\u0b04"+ - "\u0b05\u0001\u0000\u0000\u0000\u0b05\u0b06\u0006\u00f3\u001a\u0000\u0b06"+ - "\u01f5\u0001\u0000\u0000\u0000\u0b07\u0b08\u0005(\u0000\u0000\u0b08\u0b09"+ - "\u0001\u0000\u0000\u0000\u0b09\u0b0a\u0006\u00f4\u0018\u0000\u0b0a\u01f7"+ - "\u0001\u0000\u0000\u0000\u0b0b\u0b0c\u0005)\u0000\u0000\u0b0c\u0b0d\u0001"+ - "\u0000\u0000\u0000\u0b0d\u0b0e\u0006\u00f5\u0019\u0000\u0b0e\u01f9\u0001"+ - "\u0000\u0000\u0000\u0b0f\u0b10\u0005\u0000\u0000\u0001\u0b10\u0b11\u0001"+ - "\u0000\u0000\u0000\u0b11\u0b12\u0006\u00f6 \u0000\u0b12\u0b13\u0006\u00f6"+ - "\u0017\u0000\u0b13\u01fb\u0001\u0000\u0000\u0000\u0b14\u0b15\t\u0000\u0000"+ - "\u0000\u0b15\u0b16\u0001\u0000\u0000\u0000\u0b16\u0b17\u0006\u00f7 \u0000"+ - "\u0b17\u01fd\u0001\u0000\u0000\u0000\u0b18\u0b19\u0005@\u0000\u0000\u0b19"+ - "\u0b1a\u0007\u0007\u0000\u0000\u0b1a\u0b1b\u0007\n\u0000\u0000\u0b1b\u0b1c"+ - "\u0007\u000b\u0000\u0000\u0b1c\u0b1d\u0007\u001c\u0000\u0000\u0b1d\u0b1e"+ - "\u0007\u0007\u0000\u0000\u0b1e\u0b1f\u0007\u0016\u0000\u0000\u0b1f\u0b20"+ - "\u0007\u0017\u0000\u0000\u0b20\u0b21\u0007\u0010\u0000\u0000\u0b21\u0b22"+ - "\u0007\r\u0000\u0000\u0b22\u0b23\u0007\u0005\u0000\u0000\u0b23\u0b24\u0007"+ - "\u0012\u0000\u0000\u0b24\u0b25\u0001\u0000\u0000\u0000\u0b25\u0b26\u0006"+ - "\u00f8?\u0000\u0b26\u0b27\u0006\u00f8!\u0000\u0b27\u01ff\u0001\u0000\u0000"+ - "\u0000\u0b28\u0b29\t\u0000\u0000\u0000\u0b29\u0b2a\u0004\u00f9\u000f\u0000"+ - "\u0b2a\u0b2b\u0001\u0000\u0000\u0000\u0b2b\u0b2c\u0006\u00f9\r\u0000\u0b2c"+ - "\u0201\u0001\u0000\u0000\u0000\u0b2d\u0b2e\u0005\u0000\u0000\u0001\u0b2e"+ - "\u0b2f\u0001\u0000\u0000\u0000\u0b2f\u0b30\u0006\u00fa\u001b\u0000\u0b30"+ - "\u0b31\u0006\u00fa!\u0000\u0b31\u0203\u0001\u0000\u0000\u0000\u0b32\u0b33"+ - "\t\u0000\u0000\u0000\u0b33\u0b34\u0001\u0000\u0000\u0000\u0b34\u0b35\u0006"+ - "\u00fb\u001c\u0000\u0b35\u0205\u0001\u0000\u0000\u0000\u0b36\u0b37\u0005"+ - "-\u0000\u0000\u0b37\u0b38\u0005-\u0000\u0000\u0b38\u0b39\u0005}\u0000"+ - "\u0000\u0b39\u0b3a\u0005}\u0000\u0000\u0b3a\u0b3b\u0001\u0000\u0000\u0000"+ - "\u0b3b\u0b3c\u0006\u00fc\u0017\u0000\u0b3c\u0b3d\u0006\u00fc\r\u0000\u0b3d"+ - "\u0207\u0001\u0000\u0000\u0000\u0b3e\u0b3f\t\u0000\u0000\u0000\u0b3f\u0b40"+ - "\u0004\u00fd\u0010\u0000\u0b40\u0b41\u0001\u0000\u0000\u0000\u0b41\u0b42"+ - "\u0006\u00fd\r\u0000\u0b42\u0209\u0001\u0000\u0000\u0000\u0b43\u0b44\t"+ - "\u0000\u0000\u0000\u0b44\u0b45\u0001\u0000\u0000\u0000\u0b45\u0b46\u0006"+ - "\u00fe\r\u0000\u0b46\u020b\u0001\u0000\u0000\u0000\u0b47\u0b48\u0005\u0000"+ - "\u0000\u0001\u0b48\u0b49\u0001\u0000\u0000\u0000\u0b49\u0b4a\u0006\u00ff"+ - "\u0017\u0000\u0b4a\u0b4b\u0006\u00ff\r\u0000\u0b4b\u020d\u0001\u0000\u0000"+ - "\u0000j\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f"+ - "\r\u0212\u0216\u021c\u0220\u0227\u022e\u0234\u023a\u0241\u0246\u024d\u0253"+ - "\u025d\u0263\u0269\u0270\u027c\u02e1\u02f8\u0517\u052c\u0539\u054c\u055e"+ - "\u059e\u05ca\u05ed\u0653\u0699\u06a9\u06ab\u06b9\u06c1\u06c8\u06cb\u06d9"+ - "\u06e0\u06f4\u06fc\u0703\u070b\u070f\u0718\u071b\u0722\u0729\u072e\u073a"+ - "\u073f\u0741\u074d\u0754\u075b\u0763\u0765\u076e\u0770\u077b\u0793\u07a8"+ - "\u07ac\u07b7\u07bd\u07c9\u07cd\u0893\u0898\u089b\u08a8\u08af\u08e0\u08e7"+ - "\u0913\u091d\u095c\u0980\u098b\u0992\u09b3\u09c5\u09e0\u0a10\u0a25\u0a3a"+ - "\u0a44\u0a4d\u0a73\u0a90\u0a97\u0ac9\u0ad3\u0aed@\u0005\u0005\u0000\u0005"+ - "\u0003\u0000\u0005\b\u0000\u0005\u0007\u0000\u0007g\u0000\u0005\n\u0000"+ - "\u0005\f\u0000\u0005\u0001\u0000\u0005\u0002\u0000\u0007\u0017\u0000\u0005"+ - "\u000b\u0000\u0001c\u0000\u0007s\u0000\u0006\u0000\u0000\u0001h\u0001"+ - "\u0001i\u0002\u0001m\u0003\u0005\r\u0000\u0007\u0002\u0000\u0007\u0003"+ - "\u0000\u0007\u0006\u0000\u0007\u0005\u0000\u0007\u0007\u0000\u0004\u0000"+ - "\u0000\u0007\r\u0000\u0007\u000e\u0000\u0007\t\u0000\u0007\u0016\u0000"+ - "\u0003\u0000\u0000\u0005\u0004\u0000\u0001\u009a\u0004\u0001\u009b\u0005"+ - "\u0007\u0001\u0000\u0002\u0000\u0000\u0001\u009c\u0006\u0001\u009d\u0007"+ - "\u0001\u00a2\b\u0005\u0006\u0000\u0001\u00a4\t\u0007\u000f\u0000\u0001"+ - "\u00a5\n\u0007\u0090\u0000\u0001\u00a6\u000b\u0001\u00a7\f\u0001\u00ae"+ - "\r\u0001\u00af\u000e\u0001\u00b3\u000f\u0007\u000b\u0000\u0005\t\u0000"+ - "\u0001\u00b6\u0010\u0001\u00b7\u0011\u0000\u0002\u0000\u0001\u00c1\u0012"+ - "\u0001\u00c2\u0013\u0001\u00c3\u0014\u0007\n\u0000\u0001\u00c4\u0015\u0001"+ - "\u00c5\u0016\u0001\u00c6\u0017\u0001\u00cc\u0018\u0007\u0015\u0000\u0007"+ - "\u0004\u0000\u0007\b\u0000\u0007i\u0000"; + "\u0000\u0000\u0966\u0967\u0001\u0000\u0000\u0000\u0967\u0965\u0001\u0000"+ + "\u0000\u0000\u0967\u0968\u0001\u0000\u0000\u0000\u0968\u0969\u0001\u0000"+ + "\u0000\u0000\u0969\u096a\u0006\u0096\r\u0000\u096a\u013b\u0001\u0000\u0000"+ + "\u0000\u096b\u096c\u0005(\u0000\u0000\u096c\u096d\u0001\u0000\u0000\u0000"+ + "\u096d\u096e\u0006\u0097\u001c\u0000\u096e\u096f\u0006\u0097\u001d\u0000"+ + "\u096f\u013d\u0001\u0000\u0000\u0000\u0970\u0971\t\u0000\u0000\u0000\u0971"+ + "\u0972\u0004\u0098\b\u0000\u0972\u0973\u0001\u0000\u0000\u0000\u0973\u0974"+ + "\u0006\u0098\t\u0000\u0974\u0975\u0006\u0098\u0017\u0000\u0975\u013f\u0001"+ + "\u0000\u0000\u0000\u0976\u0977\t\u0000\u0000\u0000\u0977\u0978\u0001\u0000"+ + "\u0000\u0000\u0978\u0979\u0006\u0099\t\u0000\u0979\u097a\u0006\u0099\u0017"+ + "\u0000\u097a\u0141\u0001\u0000\u0000\u0000\u097b\u097c\u0004\u009a\t\u0000"+ + "\u097c\u097d\u0005(\u0000\u0000\u097d\u097e\u0006\u009a\u001e\u0000\u097e"+ + "\u097f\u0001\u0000\u0000\u0000\u097f\u0980\u0006\u009a\u001c\u0000\u0980"+ + "\u0143\u0001\u0000\u0000\u0000\u0981\u0982\u0004\u009b\n\u0000\u0982\u0983"+ + "\u0005)\u0000\u0000\u0983\u0984\u0006\u009b\u001f\u0000\u0984\u0985\u0001"+ + "\u0000\u0000\u0000\u0985\u0986\u0006\u009b \u0000\u0986\u0987\u0006\u009b"+ + "!\u0000\u0987\u0145\u0001\u0000\u0000\u0000\u0988\u0989\u0004\u009c\u000b"+ + "\u0000\u0989\u098a\u0005(\u0000\u0000\u098a\u098b\u0006\u009c\"\u0000"+ + "\u098b\u098c\u0001\u0000\u0000\u0000\u098c\u098d\u0006\u009c\u001c\u0000"+ + "\u098d\u0147\u0001\u0000\u0000\u0000\u098e\u098f\u0004\u009d\f\u0000\u098f"+ + "\u0990\u0005)\u0000\u0000\u0990\u0991\u0006\u009d#\u0000\u0991\u0992\u0001"+ + "\u0000\u0000\u0000\u0992\u0993\u0006\u009d\u001c\u0000\u0993\u0149\u0001"+ + "\u0000\u0000\u0000\u0994\u0995\u0005)\u0000\u0000\u0995\u0996\u0004\u009e"+ + "\r\u0000\u0996\u0997\u0001\u0000\u0000\u0000\u0997\u0998\u0006\u009e "+ + "\u0000\u0998\u0999\u0006\u009e!\u0000\u0999\u014b\u0001\u0000\u0000\u0000"+ + "\u099a\u099b\t\u0000\u0000\u0000\u099b\u099c\u0001\u0000\u0000\u0000\u099c"+ + "\u099d\u0006\u009f\u001c\u0000\u099d\u014d\u0001\u0000\u0000\u0000\u099e"+ + "\u099f\u0005\u0000\u0000\u0001\u099f\u09a0\u0001\u0000\u0000\u0000\u09a0"+ + "\u09a1\u0006\u00a0\u001b\u0000\u09a1\u09a2\u0006\u00a0\u0017\u0000\u09a2"+ + "\u014f\u0001\u0000\u0000\u0000\u09a3\u09a5\u0007%\u0000\u0000\u09a4\u09a3"+ + "\u0001\u0000\u0000\u0000\u09a5\u09a6\u0001\u0000\u0000\u0000\u09a6\u09a4"+ + "\u0001\u0000\u0000\u0000\u09a6\u09a7\u0001\u0000\u0000\u0000\u09a7\u09a8"+ + "\u0001\u0000\u0000\u0000\u09a8\u09a9\u0006\u00a1\r\u0000\u09a9\u0151\u0001"+ + "\u0000\u0000\u0000\u09aa\u09ab\u0005(\u0000\u0000\u09ab\u09ac\u0006\u00a2"+ + "$\u0000\u09ac\u09ad\u0001\u0000\u0000\u0000\u09ad\u09ae\u0006\u00a2%\u0000"+ + "\u09ae\u0153\u0001\u0000\u0000\u0000\u09af\u09b0\t\u0000\u0000\u0000\u09b0"+ + "\u09b1\u0001\u0000\u0000\u0000\u09b1\u09b2\u0006\u00a3\t\u0000\u09b2\u09b3"+ + "\u0006\u00a3\u0017\u0000\u09b3\u0155\u0001\u0000\u0000\u0000\u09b4\u09b5"+ + "\u0005[\u0000\u0000\u09b5\u09b6\u0006\u00a4&\u0000\u09b6\u09b7\u0001\u0000"+ + "\u0000\u0000\u09b7\u09b8\u0006\u00a4\'\u0000\u09b8\u0157\u0001\u0000\u0000"+ + "\u0000\u09b9\u09ba\u0005]\u0000\u0000\u09ba\u09bb\u0006\u00a5(\u0000\u09bb"+ + "\u09bc\u0001\u0000\u0000\u0000\u09bc\u09bd\u0006\u00a5)\u0000\u09bd\u0159"+ + "\u0001\u0000\u0000\u0000\u09be\u09bf\u0005{\u0000\u0000\u09bf\u09c0\u0006"+ + "\u00a6*\u0000\u09c0\u09c1\u0001\u0000\u0000\u0000\u09c1\u09c2\u0006\u00a6"+ + " \u0000\u09c2\u015b\u0001\u0000\u0000\u0000\u09c3\u09c4\u0005}\u0000\u0000"+ + "\u09c4\u09c5\u0006\u00a7+\u0000\u09c5\u09c6\u0001\u0000\u0000\u0000\u09c6"+ + "\u09c7\u0006\u00a7 \u0000\u09c7\u015d\u0001\u0000\u0000\u0000\u09c8\u09cb"+ + "\u0003\u00f8u\u0000\u09c9\u09cb\u0003\u00fav\u0000\u09ca\u09c8\u0001\u0000"+ + "\u0000\u0000\u09ca\u09c9\u0001\u0000\u0000\u0000\u09cb\u015f\u0001\u0000"+ + "\u0000\u0000\u09cc\u09cd\u0003\u00fex\u0000\u09cd\u09ce\u0001\u0000\u0000"+ + "\u0000\u09ce\u09cf\u0006\u00a9\u0012\u0000\u09cf\u0161\u0001\u0000\u0000"+ + "\u0000\u09d0\u09d1\u0003\u0100y\u0000\u09d1\u09d2\u0001\u0000\u0000\u0000"+ + "\u09d2\u09d3\u0006\u00aa\u0013\u0000\u09d3\u0163\u0001\u0000\u0000\u0000"+ + "\u09d4\u09d6\u0005\\\u0000\u0000\u09d5\u09d4\u0001\u0000\u0000\u0000\u09d5"+ + "\u09d6\u0001\u0000\u0000\u0000\u09d6\u09da\u0001\u0000\u0000\u0000\u09d7"+ + "\u09d8\u0003\u00f0q\u0000\u09d8\u09d9\u0005\\\u0000\u0000\u09d9\u09db"+ + "\u0001\u0000\u0000\u0000\u09da\u09d7\u0001\u0000\u0000\u0000\u09db\u09dc"+ + "\u0001\u0000\u0000\u0000\u09dc\u09da\u0001\u0000\u0000\u0000\u09dc\u09dd"+ + "\u0001\u0000\u0000\u0000\u09dd\u09de\u0001\u0000\u0000\u0000\u09de\u09df"+ + "\u0006\u00ab\u0014\u0000\u09df\u0165\u0001\u0000\u0000\u0000\u09e0\u09e1"+ + "\u0003\u00f0q\u0000\u09e1\u09e2\u0001\u0000\u0000\u0000\u09e2\u09e3\u0006"+ + "\u00ac\u0015\u0000\u09e3\u0167\u0001\u0000\u0000\u0000\u09e4\u09e5\u0005"+ + ":\u0000\u0000\u09e5\u09e6\u0005:\u0000\u0000\u09e6\u09e7\u0001\u0000\u0000"+ + "\u0000\u09e7\u09e8\u0006\u00ad\u0016\u0000\u09e8\u0169\u0001\u0000\u0000"+ + "\u0000\u09e9\u09ea\u0005(\u0000\u0000\u09ea\u09eb\u0006\u00ae,\u0000\u09eb"+ + "\u09ec\u0001\u0000\u0000\u0000\u09ec\u09ed\u0006\u00ae\u0018\u0000\u09ed"+ + "\u016b\u0001\u0000\u0000\u0000\u09ee\u09ef\u0005)\u0000\u0000\u09ef\u09f0"+ + "\u0006\u00af-\u0000\u09f0\u016d\u0001\u0000\u0000\u0000\u09f1\u09f2\t"+ + "\u0000\u0000\u0000\u09f2\u09f3\u0001\u0000\u0000\u0000\u09f3\u09f4\u0006"+ + "\u00b0\r\u0000\u09f4\u016f\u0001\u0000\u0000\u0000\u09f5\u09f6\u0005\u0000"+ + "\u0000\u0001\u09f6\u09f7\u0001\u0000\u0000\u0000\u09f7\u09f8\u0006\u00b1"+ + "\u001b\u0000\u09f8\u09f9\u0006\u00b1\u0017\u0000\u09f9\u0171\u0001\u0000"+ + "\u0000\u0000\u09fa\u09fc\u0007%\u0000\u0000\u09fb\u09fa\u0001\u0000\u0000"+ + "\u0000\u09fc\u09fd\u0001\u0000\u0000\u0000\u09fd\u09fb\u0001\u0000\u0000"+ + "\u0000\u09fd\u09fe\u0001\u0000\u0000\u0000\u09fe\u09ff\u0001\u0000\u0000"+ + "\u0000\u09ff\u0a00\u0006\u00b2\r\u0000\u0a00\u0173\u0001\u0000\u0000\u0000"+ + "\u0a01\u0a02\u0005(\u0000\u0000\u0a02\u0a03\u0006\u00b3.\u0000\u0a03\u0a04"+ + "\u0001\u0000\u0000\u0000\u0a04\u0a05\u0006\u00b3/\u0000\u0a05\u0a06\u0006"+ + "\u00b30\u0000\u0a06\u0175\u0001\u0000\u0000\u0000\u0a07\u0a08\t\u0000"+ + "\u0000\u0000\u0a08\u0a09\u0001\u0000\u0000\u0000\u0a09\u0a0a\u0006\u00b4"+ + "\t\u0000\u0a0a\u0a0b\u0006\u00b4\u0017\u0000\u0a0b\u0177\u0001\u0000\u0000"+ + "\u0000\u0a0c\u0a0e\u0007%\u0000\u0000\u0a0d\u0a0c\u0001\u0000\u0000\u0000"+ + "\u0a0e\u0a0f\u0001\u0000\u0000\u0000\u0a0f\u0a0d\u0001\u0000\u0000\u0000"+ + "\u0a0f\u0a10\u0001\u0000\u0000\u0000\u0a10\u0a11\u0001\u0000\u0000\u0000"+ + "\u0a11\u0a12\u0006\u00b5\r\u0000\u0a12\u0179\u0001\u0000\u0000\u0000\u0a13"+ + "\u0a14\u0005(\u0000\u0000\u0a14\u0a15\u0006\u00b61\u0000\u0a15\u017b\u0001"+ + "\u0000\u0000\u0000\u0a16\u0a17\u0005)\u0000\u0000\u0a17\u0a18\u0006\u00b7"+ + "2\u0000\u0a18\u017d\u0001\u0000\u0000\u0000\u0a19\u0a1a\u0007\u0010\u0000"+ + "\u0000\u0a1a\u0a1b\u0007\t\u0000\u0000\u0a1b\u017f\u0001\u0000\u0000\u0000"+ + "\u0a1c\u0a1d\u0003\u00fex\u0000\u0a1d\u0a1e\u0001\u0000\u0000\u0000\u0a1e"+ + "\u0a1f\u0006\u00b9\u0012\u0000\u0a1f\u0181\u0001\u0000\u0000\u0000\u0a20"+ + "\u0a21\u0005=\u0000\u0000\u0a21\u0a22\u0005>\u0000\u0000\u0a22\u0183\u0001"+ + "\u0000\u0000\u0000\u0a23\u0a24\u0003\u0100y\u0000\u0a24\u0a25\u0001\u0000"+ + "\u0000\u0000\u0a25\u0a26\u0006\u00bb \u0000\u0a26\u0185\u0001\u0000\u0000"+ + "\u0000\u0a27\u0a2b\u0003\u00f8u\u0000\u0a28\u0a2b\u0003\u00fav\u0000\u0a29"+ + "\u0a2b\u0003\u00f0q\u0000\u0a2a\u0a27\u0001\u0000\u0000\u0000\u0a2a\u0a28"+ + "\u0001\u0000\u0000\u0000\u0a2a\u0a29\u0001\u0000\u0000\u0000\u0a2b\u0a2c"+ + "\u0001\u0000\u0000\u0000\u0a2c\u0a2d\u0006\u00bc \u0000\u0a2d\u0187\u0001"+ + "\u0000\u0000\u0000\u0a2e\u0a2f\u0005:\u0000\u0000\u0a2f\u0a30\u0005:\u0000"+ + "\u0000\u0a30\u0a31\u0001\u0000\u0000\u0000\u0a31\u0a32\u0006\u00bd \u0000"+ + "\u0a32\u0189\u0001\u0000\u0000\u0000\u0a33\u0a34\t\u0000\u0000\u0000\u0a34"+ + "\u0a35\u0001\u0000\u0000\u0000\u0a35\u0a36\u0006\u00be \u0000\u0a36\u018b"+ + "\u0001\u0000\u0000\u0000\u0a37\u0a38\u0005\u0000\u0000\u0001\u0a38\u0a39"+ + "\u0001\u0000\u0000\u0000\u0a39\u0a3a\u0006\u00bf\u001b\u0000\u0a3a\u0a3b"+ + "\u0006\u00bf\u0017\u0000\u0a3b\u018d\u0001\u0000\u0000\u0000\u0a3c\u0a3d"+ + "\u0003\u00fcw\u0000\u0a3d\u0a3e\u0001\u0000\u0000\u0000\u0a3e\u0a3f\u0006"+ + "\u00c03\u0000\u0a3f\u018f\u0001\u0000\u0000\u0000\u0a40\u0a41\u0005[\u0000"+ + "\u0000\u0a41\u0a42\u0006\u00c14\u0000\u0a42\u0191\u0001\u0000\u0000\u0000"+ + "\u0a43\u0a44\u0005]\u0000\u0000\u0a44\u0a45\u0006\u00c25\u0000\u0a45\u0193"+ + "\u0001\u0000\u0000\u0000\u0a46\u0a47\u0005{\u0000\u0000\u0a47\u0a48\u0006"+ + "\u00c36\u0000\u0a48\u0a49\u0001\u0000\u0000\u0000\u0a49\u0a4a\u0006\u00c3"+ + "7\u0000\u0a4a\u0195\u0001\u0000\u0000\u0000\u0a4b\u0a4c\u0005}\u0000\u0000"+ + "\u0a4c\u0a4d\u0006\u00c48\u0000\u0a4d\u0a4e\u0001\u0000\u0000\u0000\u0a4e"+ + "\u0a4f\u0006\u00c47\u0000\u0a4f\u0197\u0001\u0000\u0000\u0000\u0a50\u0a51"+ + "\u0005(\u0000\u0000\u0a51\u0a52\u0006\u00c59\u0000\u0a52\u0a53\u0001\u0000"+ + "\u0000\u0000\u0a53\u0a54\u0006\u00c57\u0000\u0a54\u0199\u0001\u0000\u0000"+ + "\u0000\u0a55\u0a56\u0005)\u0000\u0000\u0a56\u0a57\u0006\u00c6:\u0000\u0a57"+ + "\u019b\u0001\u0000\u0000\u0000\u0a58\u0a5b\u0003\u00f8u\u0000\u0a59\u0a5b"+ + "\u0003\u00fav\u0000\u0a5a\u0a58\u0001\u0000\u0000\u0000\u0a5a\u0a59\u0001"+ + "\u0000\u0000\u0000\u0a5b\u019d\u0001\u0000\u0000\u0000\u0a5c\u0a5d\u0003"+ + "\u00fex\u0000\u0a5d\u0a5e\u0001\u0000\u0000\u0000\u0a5e\u0a5f\u0006\u00c8"+ + "\u0012\u0000\u0a5f\u019f\u0001\u0000\u0000\u0000\u0a60\u0a61\u0005=\u0000"+ + "\u0000\u0a61\u0a62\u0005>\u0000\u0000\u0a62\u01a1\u0001\u0000\u0000\u0000"+ + "\u0a63\u0a64\u0003\u0100y\u0000\u0a64\u0a65\u0001\u0000\u0000\u0000\u0a65"+ + "\u0a66\u0006\u00ca\u0013\u0000\u0a66\u01a3\u0001\u0000\u0000\u0000\u0a67"+ + "\u0a68\u0005.\u0000\u0000\u0a68\u01a5\u0001\u0000\u0000\u0000\u0a69\u0a6a"+ + "\u0005,\u0000\u0000\u0a6a\u0a6b\u0006\u00cc;\u0000\u0a6b\u01a7\u0001\u0000"+ + "\u0000\u0000\u0a6c\u0a6e\u0007&\u0000\u0000\u0a6d\u0a6c\u0001\u0000\u0000"+ + "\u0000\u0a6e\u0a6f\u0001\u0000\u0000\u0000\u0a6f\u0a6d\u0001\u0000\u0000"+ + "\u0000\u0a6f\u0a70\u0001\u0000\u0000\u0000\u0a70\u0a71\u0001\u0000\u0000"+ + "\u0000\u0a71\u0a72\u0006\u00cd\r\u0000\u0a72\u01a9\u0001\u0000\u0000\u0000"+ + "\u0a73\u0a74\u0003\u00f0q\u0000\u0a74\u01ab\u0001\u0000\u0000\u0000\u0a75"+ + "\u0a76\t\u0000\u0000\u0000\u0a76\u0a77\u0001\u0000\u0000\u0000\u0a77\u0a78"+ + "\u0006\u00cf7\u0000\u0a78\u01ad\u0001\u0000\u0000\u0000\u0a79\u0a7a\u0005"+ + "\u0000\u0000\u0001\u0a7a\u0a7b\u0001\u0000\u0000\u0000\u0a7b\u0a7c\u0006"+ + "\u00d0\u001b\u0000\u0a7c\u0a7d\u0006\u00d0\u0017\u0000\u0a7d\u01af\u0001"+ + "\u0000\u0000\u0000\u0a7e\u0a7f\u0005/\u0000\u0000\u0a7f\u0a80\u0005/\u0000"+ + "\u0000\u0a80\u0a82\u0001\u0000\u0000\u0000\u0a81\u0a83\b\u001f\u0000\u0000"+ + "\u0a82\u0a81\u0001\u0000\u0000\u0000\u0a83\u0a84\u0001\u0000\u0000\u0000"+ + "\u0a84\u0a82\u0001\u0000\u0000\u0000\u0a84\u0a85\u0001\u0000\u0000\u0000"+ + "\u0a85\u0a86\u0001\u0000\u0000\u0000\u0a86\u0a87\u0006\u00d1\r\u0000\u0a87"+ + "\u01b1\u0001\u0000\u0000\u0000\u0a88\u0a89\u0005/\u0000\u0000\u0a89\u0a8a"+ + "\u0005*\u0000\u0000\u0a8a\u0a8e\u0001\u0000\u0000\u0000\u0a8b\u0a8d\t"+ + "\u0000\u0000\u0000\u0a8c\u0a8b\u0001\u0000\u0000\u0000\u0a8d\u0a90\u0001"+ + "\u0000\u0000\u0000\u0a8e\u0a8f\u0001\u0000\u0000\u0000\u0a8e\u0a8c\u0001"+ + "\u0000\u0000\u0000\u0a8f\u0a91\u0001\u0000\u0000\u0000\u0a90\u0a8e\u0001"+ + "\u0000\u0000\u0000\u0a91\u0a92\u0005*\u0000\u0000\u0a92\u0a93\u0005/\u0000"+ + "\u0000\u0a93\u0a97\u0001\u0000\u0000\u0000\u0a94\u0a96\u0007\u001f\u0000"+ + "\u0000\u0a95\u0a94\u0001\u0000\u0000\u0000\u0a96\u0a99\u0001\u0000\u0000"+ + "\u0000\u0a97\u0a95\u0001\u0000\u0000\u0000\u0a97\u0a98\u0001\u0000\u0000"+ + "\u0000\u0a98\u0a9a\u0001\u0000\u0000\u0000\u0a99\u0a97\u0001\u0000\u0000"+ + "\u0000\u0a9a\u0a9b\u0006\u00d2\r\u0000\u0a9b\u01b3\u0001\u0000\u0000\u0000"+ + "\u0a9c\u0a9d\u0005@\u0000\u0000\u0a9d\u0a9e\u0007\u0007\u0000\u0000\u0a9e"+ + "\u0a9f\u0007\n\u0000\u0000\u0a9f\u0aa0\u0007\u000b\u0000\u0000\u0aa0\u0aa1"+ + "\u0007\u0013\u0000\u0000\u0aa1\u0aa2\u0007\u000f\u0000\u0000\u0aa2\u0aa3"+ + "\u0007\u0013\u0000\u0000\u0aa3\u0aa4\u0001\u0000\u0000\u0000\u0aa4\u0aa5"+ + "\u0006\u00d3\u0017\u0000\u0aa5\u01b5\u0001\u0000\u0000\u0000\u0aa6\u0aa7"+ + "\u0005@\u0000\u0000\u0aa7\u0aa8\u0001\u0000\u0000\u0000\u0aa8\u0aa9\u0006"+ + "\u00d4\t\u0000\u0aa9\u0aaa\u0006\u00d4\u0017\u0000\u0aaa\u01b7\u0001\u0000"+ + "\u0000\u0000\u0aab\u0aac\u0005[\u0000\u0000\u0aac\u0aad\u0001\u0000\u0000"+ + "\u0000\u0aad\u0aae\u0006\u00d5 \u0000\u0aae\u01b9\u0001\u0000\u0000\u0000"+ + "\u0aaf\u0ab0\u0005]\u0000\u0000\u0ab0\u0ab1\u0001\u0000\u0000\u0000\u0ab1"+ + "\u0ab2\u0006\u00d6 \u0000\u0ab2\u01bb\u0001\u0000\u0000\u0000\u0ab3\u0ab4"+ + "\u0005{\u0000\u0000\u0ab4\u0ab5\u0001\u0000\u0000\u0000\u0ab5\u0ab6\u0006"+ + "\u00d7 \u0000\u0ab6\u01bd\u0001\u0000\u0000\u0000\u0ab7\u0ab8\u0005}\u0000"+ + "\u0000\u0ab8\u0ab9\u0001\u0000\u0000\u0000\u0ab9\u0aba\u0006\u00d8 \u0000"+ + "\u0aba\u01bf\u0001\u0000\u0000\u0000\u0abb\u0abe\u0003\u00f8u\u0000\u0abc"+ + "\u0abe\u0003\u00fav\u0000\u0abd\u0abb\u0001\u0000\u0000\u0000\u0abd\u0abc"+ + "\u0001\u0000\u0000\u0000\u0abe\u0abf\u0001\u0000\u0000\u0000\u0abf\u0ac0"+ + "\u0006\u00d9<\u0000\u0ac0\u01c1\u0001\u0000\u0000\u0000\u0ac1\u0ac2\u0003"+ + "\u00fex\u0000\u0ac2\u0ac3\u0001\u0000\u0000\u0000\u0ac3\u0ac4\u0006\u00da"+ + "\u0012\u0000\u0ac4\u01c3\u0001\u0000\u0000\u0000\u0ac5\u0ac6\u0007\n\u0000"+ + "\u0000\u0ac6\u0ac7\u0007\u0007\u0000\u0000\u0ac7\u0ac8\u0007\f\u0000\u0000"+ + "\u0ac8\u0ac9\u0001\u0000\u0000\u0000\u0ac9\u0aca\u0004\u00db\u000e\u0000"+ + "\u0aca\u0acb\u0001\u0000\u0000\u0000\u0acb\u0acc\u0006\u00db=\u0000\u0acc"+ + "\u01c5\u0001\u0000\u0000\u0000\u0acd\u0ace\u0007\u000e\u0000\u0000\u0ace"+ + "\u0acf\u0007\b\u0000\u0000\u0acf\u0ad0\u0007\u0010\u0000\u0000\u0ad0\u0ad1"+ + "\u0007\t\u0000\u0000\u0ad1\u0ad2\u0007\t\u0000\u0000\u0ad2\u0ad3\u0001"+ + "\u0000\u0000\u0000\u0ad3\u0ad4\u0006\u00dc>\u0000\u0ad4\u01c7\u0001\u0000"+ + "\u0000\u0000\u0ad5\u0ad6\u0003\u0100y\u0000\u0ad6\u0ad7\u0001\u0000\u0000"+ + "\u0000\u0ad7\u0ad8\u0006\u00dd\u0013\u0000\u0ad8\u01c9\u0001\u0000\u0000"+ + "\u0000\u0ad9\u0adb\u0005\\\u0000\u0000\u0ada\u0ad9\u0001\u0000\u0000\u0000"+ + "\u0ada\u0adb\u0001\u0000\u0000\u0000\u0adb\u0adf\u0001\u0000\u0000\u0000"+ + "\u0adc\u0add\u0003\u00f0q\u0000\u0add\u0ade\u0005\\\u0000\u0000\u0ade"+ + "\u0ae0\u0001\u0000\u0000\u0000\u0adf\u0adc\u0001\u0000\u0000\u0000\u0ae0"+ + "\u0ae1\u0001\u0000\u0000\u0000\u0ae1\u0adf\u0001\u0000\u0000\u0000\u0ae1"+ + "\u0ae2\u0001\u0000\u0000\u0000\u0ae2\u0ae3\u0001\u0000\u0000\u0000\u0ae3"+ + "\u0ae4\u0006\u00de\u0014\u0000\u0ae4\u01cb\u0001\u0000\u0000\u0000\u0ae5"+ + "\u0ae6\u0005\\\u0000\u0000\u0ae6\u0ae7\u0003\u00f0q\u0000\u0ae7\u0ae8"+ + "\u0001\u0000\u0000\u0000\u0ae8\u0ae9\u0006\u00df\u0015\u0000\u0ae9\u01cd"+ + "\u0001\u0000\u0000\u0000\u0aea\u0aeb\u0003\u00f0q\u0000\u0aeb\u0aec\u0001"+ + "\u0000\u0000\u0000\u0aec\u0aed\u0006\u00e0\u0015\u0000\u0aed\u01cf\u0001"+ + "\u0000\u0000\u0000\u0aee\u0aef\u0005:\u0000\u0000\u0aef\u0af0\u0005:\u0000"+ + "\u0000\u0af0\u0af1\u0001\u0000\u0000\u0000\u0af1\u0af2\u0006\u00e1\u0016"+ + "\u0000\u0af2\u01d1\u0001\u0000\u0000\u0000\u0af3\u0af4\u0005(\u0000\u0000"+ + "\u0af4\u0af5\u0001\u0000\u0000\u0000\u0af5\u0af6\u0006\u00e2\u0018\u0000"+ + "\u0af6\u01d3\u0001\u0000\u0000\u0000\u0af7\u0af8\u0005)\u0000\u0000\u0af8"+ + "\u0af9\u0001\u0000\u0000\u0000\u0af9\u0afa\u0006\u00e3\u0019\u0000\u0afa"+ + "\u01d5\u0001\u0000\u0000\u0000\u0afb\u0afc\u0005 \u0000\u0000\u0afc\u0afd"+ + "\u0001\u0000\u0000\u0000\u0afd\u0afe\u0006\u00e4\r\u0000\u0afe\u01d7\u0001"+ + "\u0000\u0000\u0000\u0aff\u0b00\u0005\u0000\u0000\u0001\u0b00\u0b01\u0001"+ + "\u0000\u0000\u0000\u0b01\u0b02\u0006\u00e5\u001b\u0000\u0b02\u0b03\u0006"+ + "\u00e5\u0017\u0000\u0b03\u01d9\u0001\u0000\u0000\u0000\u0b04\u0b05\t\u0000"+ + "\u0000\u0000\u0b05\u0b06\u0001\u0000\u0000\u0000\u0b06\u0b07\u0006\u00e6"+ + "\r\u0000\u0b07\u01db\u0001\u0000\u0000\u0000\u0b08\u0b09\u0005?\u0000"+ + "\u0000\u0b09\u0b0a\u0005>\u0000\u0000\u0b0a\u0b0b\u0001\u0000\u0000\u0000"+ + "\u0b0b\u0b0c\u0006\u00e7\u0017\u0000\u0b0c\u01dd\u0001\u0000\u0000\u0000"+ + "\u0b0d\u0b0e\u0005/\u0000\u0000\u0b0e\u0b0f\u0005/\u0000\u0000\u0b0f\u0b11"+ + "\u0001\u0000\u0000\u0000\u0b10\u0b12\b\u001f\u0000\u0000\u0b11\u0b10\u0001"+ + "\u0000\u0000\u0000\u0b12\u0b13\u0001\u0000\u0000\u0000\u0b13\u0b11\u0001"+ + "\u0000\u0000\u0000\u0b13\u0b14\u0001\u0000\u0000\u0000\u0b14\u0b15\u0001"+ + "\u0000\u0000\u0000\u0b15\u0b16\u0006\u00e8\r\u0000\u0b16\u01df\u0001\u0000"+ + "\u0000\u0000\u0b17\u0b18\u0005/\u0000\u0000\u0b18\u0b19\u0005*\u0000\u0000"+ + "\u0b19\u0b1d\u0001\u0000\u0000\u0000\u0b1a\u0b1c\t\u0000\u0000\u0000\u0b1b"+ + "\u0b1a\u0001\u0000\u0000\u0000\u0b1c\u0b1f\u0001\u0000\u0000\u0000\u0b1d"+ + "\u0b1e\u0001\u0000\u0000\u0000\u0b1d\u0b1b\u0001\u0000\u0000\u0000\u0b1e"+ + "\u0b20\u0001\u0000\u0000\u0000\u0b1f\u0b1d\u0001\u0000\u0000\u0000\u0b20"+ + "\u0b21\u0005*\u0000\u0000\u0b21\u0b22\u0005/\u0000\u0000\u0b22\u0b23\u0001"+ + "\u0000\u0000\u0000\u0b23\u0b24\u0006\u00e9\r\u0000\u0b24\u01e1\u0001\u0000"+ + "\u0000\u0000\u0b25\u0b26\u0005[\u0000\u0000\u0b26\u0b27\u0001\u0000\u0000"+ + "\u0000\u0b27\u0b28\u0006\u00ea \u0000\u0b28\u01e3\u0001\u0000\u0000\u0000"+ + "\u0b29\u0b2a\u0005]\u0000\u0000\u0b2a\u0b2b\u0001\u0000\u0000\u0000\u0b2b"+ + "\u0b2c\u0006\u00eb \u0000\u0b2c\u01e5\u0001\u0000\u0000\u0000\u0b2d\u0b2e"+ + "\u0005{\u0000\u0000\u0b2e\u0b2f\u0001\u0000\u0000\u0000\u0b2f\u0b30\u0006"+ + "\u00ec \u0000\u0b30\u01e7\u0001\u0000\u0000\u0000\u0b31\u0b32\u0005}\u0000"+ + "\u0000\u0b32\u0b33\u0001\u0000\u0000\u0000\u0b33\u0b34\u0006\u00ed \u0000"+ + "\u0b34\u01e9\u0001\u0000\u0000\u0000\u0b35\u0b38\u0003\u00f8u\u0000\u0b36"+ + "\u0b38\u0003\u00fav\u0000\u0b37\u0b35\u0001\u0000\u0000\u0000\u0b37\u0b36"+ + "\u0001\u0000\u0000\u0000\u0b38\u0b39\u0001\u0000\u0000\u0000\u0b39\u0b3a"+ + "\u0006\u00ee<\u0000\u0b3a\u01eb\u0001\u0000\u0000\u0000\u0b3b\u0b3c\u0003"+ + "\u00fex\u0000\u0b3c\u0b3d\u0001\u0000\u0000\u0000\u0b3d\u0b3e\u0006\u00ef"+ + "\u0012\u0000\u0b3e\u01ed\u0001\u0000\u0000\u0000\u0b3f\u0b40\u0003\u0100"+ + "y\u0000\u0b40\u0b41\u0001\u0000\u0000\u0000\u0b41\u0b42\u0006\u00f0\u0013"+ + "\u0000\u0b42\u01ef\u0001\u0000\u0000\u0000\u0b43\u0b44\u0003\u00f0q\u0000"+ + "\u0b44\u0b45\u0001\u0000\u0000\u0000\u0b45\u0b46\u0006\u00f1\u0015\u0000"+ + "\u0b46\u01f1\u0001\u0000\u0000\u0000\u0b47\u0b48\u0005:\u0000\u0000\u0b48"+ + "\u0b49\u0005:\u0000\u0000\u0b49\u0b4a\u0001\u0000\u0000\u0000\u0b4a\u0b4b"+ + "\u0006\u00f2\u0016\u0000\u0b4b\u01f3\u0001\u0000\u0000\u0000\u0b4c\u0b4d"+ + "\u0005-\u0000\u0000\u0b4d\u0b4e\u0005>\u0000\u0000\u0b4e\u0b4f\u0001\u0000"+ + "\u0000\u0000\u0b4f\u0b50\u0006\u00f3\u001a\u0000\u0b50\u01f5\u0001\u0000"+ + "\u0000\u0000\u0b51\u0b52\u0005(\u0000\u0000\u0b52\u0b53\u0001\u0000\u0000"+ + "\u0000\u0b53\u0b54\u0006\u00f4\u0018\u0000\u0b54\u01f7\u0001\u0000\u0000"+ + "\u0000\u0b55\u0b56\u0005)\u0000\u0000\u0b56\u0b57\u0001\u0000\u0000\u0000"+ + "\u0b57\u0b58\u0006\u00f5\u0019\u0000\u0b58\u01f9\u0001\u0000\u0000\u0000"+ + "\u0b59\u0b5a\u0005\u0000\u0000\u0001\u0b5a\u0b5b\u0001\u0000\u0000\u0000"+ + "\u0b5b\u0b5c\u0006\u00f6 \u0000\u0b5c\u0b5d\u0006\u00f6\u0017\u0000\u0b5d"+ + "\u01fb\u0001\u0000\u0000\u0000\u0b5e\u0b5f\t\u0000\u0000\u0000\u0b5f\u0b60"+ + "\u0001\u0000\u0000\u0000\u0b60\u0b61\u0006\u00f7 \u0000\u0b61\u01fd\u0001"+ + "\u0000\u0000\u0000\u0b62\u0b63\u0005@\u0000\u0000\u0b63\u0b64\u0007\u0007"+ + "\u0000\u0000\u0b64\u0b65\u0007\n\u0000\u0000\u0b65\u0b66\u0007\u000b\u0000"+ + "\u0000\u0b66\u0b67\u0007\u001c\u0000\u0000\u0b67\u0b68\u0007\u0007\u0000"+ + "\u0000\u0b68\u0b69\u0007\u0016\u0000\u0000\u0b69\u0b6a\u0007\u0017\u0000"+ + "\u0000\u0b6a\u0b6b\u0007\u0010\u0000\u0000\u0b6b\u0b6c\u0007\r\u0000\u0000"+ + "\u0b6c\u0b6d\u0007\u0005\u0000\u0000\u0b6d\u0b6e\u0007\u0012\u0000\u0000"+ + "\u0b6e\u0b6f\u0001\u0000\u0000\u0000\u0b6f\u0b70\u0006\u00f8?\u0000\u0b70"+ + "\u0b71\u0006\u00f8!\u0000\u0b71\u01ff\u0001\u0000\u0000\u0000\u0b72\u0b73"+ + "\t\u0000\u0000\u0000\u0b73\u0b74\u0004\u00f9\u000f\u0000\u0b74\u0b75\u0001"+ + "\u0000\u0000\u0000\u0b75\u0b76\u0006\u00f9\r\u0000\u0b76\u0201\u0001\u0000"+ + "\u0000\u0000\u0b77\u0b78\u0005\u0000\u0000\u0001\u0b78\u0b79\u0001\u0000"+ + "\u0000\u0000\u0b79\u0b7a\u0006\u00fa\u001b\u0000\u0b7a\u0b7b\u0006\u00fa"+ + "!\u0000\u0b7b\u0203\u0001\u0000\u0000\u0000\u0b7c\u0b7d\t\u0000\u0000"+ + "\u0000\u0b7d\u0b7e\u0001\u0000\u0000\u0000\u0b7e\u0b7f\u0006\u00fb\u001c"+ + "\u0000\u0b7f\u0205\u0001\u0000\u0000\u0000\u0b80\u0b81\u0005-\u0000\u0000"+ + "\u0b81\u0b82\u0005-\u0000\u0000\u0b82\u0b83\u0005}\u0000\u0000\u0b83\u0b84"+ + "\u0005}\u0000\u0000\u0b84\u0b85\u0001\u0000\u0000\u0000\u0b85\u0b86\u0006"+ + "\u00fc\u0017\u0000\u0b86\u0b87\u0006\u00fc\r\u0000\u0b87\u0207\u0001\u0000"+ + "\u0000\u0000\u0b88\u0b89\t\u0000\u0000\u0000\u0b89\u0b8a\u0004\u00fd\u0010"+ + "\u0000\u0b8a\u0b8b\u0001\u0000\u0000\u0000\u0b8b\u0b8c\u0006\u00fd\r\u0000"+ + "\u0b8c\u0209\u0001\u0000\u0000\u0000\u0b8d\u0b8e\t\u0000\u0000\u0000\u0b8e"+ + "\u0b8f\u0001\u0000\u0000\u0000\u0b8f\u0b90\u0006\u00fe\r\u0000\u0b90\u020b"+ + "\u0001\u0000\u0000\u0000\u0b91\u0b92\u0005\u0000\u0000\u0001\u0b92\u0b93"+ + "\u0001\u0000\u0000\u0000\u0b93\u0b94\u0006\u00ff\u0017\u0000\u0b94\u0b95"+ + "\u0006\u00ff\r\u0000\u0b95\u020d\u0001\u0000\u0000\u0000l\u0000\u0001"+ + "\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u0212\u0216\u021c"+ + "\u0220\u0227\u022e\u0234\u023a\u0241\u0246\u024d\u0253\u025d\u0263\u0269"+ + "\u0270\u027c\u02e1\u02f8\u0517\u052c\u0539\u054c\u055e\u059e\u05ca\u05ed"+ + "\u0653\u0699\u06a9\u06ab\u06b9\u06c1\u06c8\u06cb\u06d9\u06e0\u06f4\u06fc"+ + "\u0703\u070b\u070f\u0718\u071b\u0722\u0729\u072e\u073a\u073f\u0741\u074d"+ + "\u0754\u075b\u0763\u0765\u076e\u0770\u077b\u0793\u07a8\u07ac\u07b7\u07bd"+ + "\u07c9\u07d5\u07da\u07dc\u08dd\u08e2\u08e5\u08f2\u08f9\u092a\u0931\u095d"+ + "\u0967\u09a6\u09ca\u09d5\u09dc\u09fd\u0a0f\u0a2a\u0a5a\u0a6f\u0a84\u0a8e"+ + "\u0a97\u0abd\u0ada\u0ae1\u0b13\u0b1d\u0b37@\u0005\u0005\u0000\u0005\u0003"+ + "\u0000\u0005\b\u0000\u0005\u0007\u0000\u0007g\u0000\u0005\n\u0000\u0005"+ + "\f\u0000\u0005\u0001\u0000\u0005\u0002\u0000\u0007\u0017\u0000\u0005\u000b"+ + "\u0000\u0001c\u0000\u0007s\u0000\u0006\u0000\u0000\u0001h\u0001\u0001"+ + "i\u0002\u0001m\u0003\u0005\r\u0000\u0007\u0002\u0000\u0007\u0003\u0000"+ + "\u0007\u0006\u0000\u0007\u0005\u0000\u0007\u0007\u0000\u0004\u0000\u0000"+ + "\u0007\r\u0000\u0007\u000e\u0000\u0007\t\u0000\u0007\u0016\u0000\u0003"+ + "\u0000\u0000\u0005\u0004\u0000\u0001\u009a\u0004\u0001\u009b\u0005\u0007"+ + "\u0001\u0000\u0002\u0000\u0000\u0001\u009c\u0006\u0001\u009d\u0007\u0001"+ + "\u00a2\b\u0005\u0006\u0000\u0001\u00a4\t\u0007\u000f\u0000\u0001\u00a5"+ + "\n\u0007\u0090\u0000\u0001\u00a6\u000b\u0001\u00a7\f\u0001\u00ae\r\u0001"+ + "\u00af\u000e\u0001\u00b3\u000f\u0007\u000b\u0000\u0005\t\u0000\u0001\u00b6"+ + "\u0010\u0001\u00b7\u0011\u0000\u0002\u0000\u0001\u00c1\u0012\u0001\u00c2"+ + "\u0013\u0001\u00c3\u0014\u0007\n\u0000\u0001\u00c4\u0015\u0001\u00c5\u0016"+ + "\u0001\u00c6\u0017\u0001\u00cc\u0018\u0007\u0015\u0000\u0007\u0004\u0000"+ + "\u0007\b\u0000\u0007i\u0000"; public static final String _serializedATN = Utils.join( new String[] { _serializedATNSegment0, diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java index 8dde751fa163..6724a8c447d2 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java @@ -29,12 +29,7 @@ public abstract class ColoringLexerAdaptor extends Lexer { private int _currentRuleType = Token.INVALID_TYPE; - public int roundParenBalance = 0; - public int squareParenBalance = 0; - public int curlyParenBalance = 0; - public int exitIfModePosition = 0; - public int phpExpressionOffset = -1; - public boolean hasPhpExprContent = false; + private int roundParenBalance = 0; public ColoringLexerAdaptor(CharStream input) { super(input); @@ -47,6 +42,10 @@ public int getCurrentRuleType() { public void setCurrentRuleType(int ruleType) { this._currentRuleType = ruleType; } + + public int getRoundParenBalance(){ + return this.roundParenBalance; + } @Override public Token emit() { @@ -84,6 +83,7 @@ public boolean peekNextChars(char peekChar, int number) { public void increaseRoundParenBalance() { this.roundParenBalance++; } + public void decreaseRoundParenBalance() { this.roundParenBalance--; @@ -99,12 +99,6 @@ public boolean endsWith(char ch1, char ch2, char ch3) { && this._input.LA(3) == ch3; } - public boolean hasNoBladeParamOpenBracket() { - return this.roundParenBalance > 0 - && this.squareParenBalance == 0 - && this.curlyParenBalance == 0; - } - //blade coloring lexer public void consumeEscapedEchoToken() { if (this._input.LA(1) == '}' && this._input.LA(2) == '}') { @@ -124,11 +118,7 @@ public void consumeNotEscapedEchoToken() { } public void consumeExprToken(){ - if (this._input.LA(1) == ':' && this._input.LA(2) != ':'){ - this.setType(BladeAntlrColoringLexer.PHP_EXPRESSION); - } else { - this.more(); - } + this.more(); } public void testForFreezeCombination(){ @@ -140,14 +130,6 @@ public void testForFreezeCombination(){ this.consumeExprToken(); } } - -// to continue when the sepparation of PHP_EXPRESSION can be implemented -// public void setPhpExpressionOffset(){ -// this.phpExpressionOffset = this.getCharIndex(); -// } -// -// public boolean isFirstElement() { -// return this._tokenStartCharIndex <= this.phpExpressionOffset; -// } + } diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/content_tag_tertiary_expr.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/content_tag_tertiary_expr.pass new file mode 100644 index 000000000000..4b2717c21e0c --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/content_tag_tertiary_expr.pass @@ -0,0 +1,5 @@ +Token #0 HTML [
      \n ] +Token #1 BLADE_ECHO_DELIMITOR [{{] +Token #2 PHP_BLADE_ECHO_EXPR [ $isTrue ? 'x' : 'z' ] +Token #3 BLADE_ECHO_DELIMITOR [}}] +Token #4 HTML [\n
      \n] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass index 92bccf4919c8..5e37b1080811 100644 --- a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass @@ -24,10 +24,10 @@ Token #22 HTML [{] Token #23 HTML [\n ] Token #24 HTML [}] Token #25 HTML [\n ] -Token #26 BLADE_DIRECTIVE [@container] -Token #27 WS_D [ ] -Token #28 PHP_BLADE_EXPRESSION [(width > 400px)] -Token #29 HTML [ ] +Token #26 HTML [@container ] +Token #27 HTML [(width ] +Token #28 HTML [>] +Token #29 HTML [ 400px) ] Token #30 HTML [{] Token #31 HTML [\n h2 ] Token #32 HTML [{] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_directive.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_directive.pass new file mode 100644 index 000000000000..99fb032c25e1 --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_directive.pass @@ -0,0 +1,3 @@ +Token #0 HTML [
      \n ] +Token #1 HTML [@@] +Token #2 HTML [escapedDirective\n
      \n] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/include_01.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/include_01.pass new file mode 100644 index 000000000000..990d06c4a62e --- /dev/null +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/include_01.pass @@ -0,0 +1,3 @@ +Token #0 BLADE_DIRECTIVE [@include] +Token #1 PHP_BLADE_EXPRESSION [('path', ['key' => 'value'])] +Token #2 HTML [\n] diff --git a/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php b/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php deleted file mode 100644 index e88b2e19617f..000000000000 --- a/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php +++ /dev/null @@ -1 +0,0 @@ -@test($test ?: $default) diff --git a/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php.testFreezeNekudo_01.embedding b/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php.testFreezeNekudo_01.embedding deleted file mode 100644 index c4a12f80a96a..000000000000 --- a/php/php.blade/test/unit/data/testfiles/embedding/php_freeze_nekudo_01.blade.php.testFreezeNekudo_01.embedding +++ /dev/null @@ -1 +0,0 @@ -@@@@@@@@@@@@@@@@@@@@@@@@@ \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/embedding/php_inline_embedding_01.blade.php b/php/php.blade/test/unit/data/testfiles/embedding/php_inline_embedding_01.blade.php new file mode 100644 index 000000000000..e3d154236e27 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/embedding/php_inline_embedding_01.blade.php @@ -0,0 +1,5 @@ +{{ $x }} + + +
      \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/embedding/php_inline_embedding_02.blade.php.testPhpInlineEmbedding_02.embedding b/php/php.blade/test/unit/data/testfiles/embedding/php_inline_embedding_02.blade.php.testPhpInlineEmbedding_02.embedding new file mode 100644 index 000000000000..cea1fe38161c --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/embedding/php_inline_embedding_02.blade.php.testPhpInlineEmbedding_02.embedding @@ -0,0 +1,4 @@ +@@@@@@@@@@@@ \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProviderTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProviderTest.java index 56e8e8ac1ca7..83cd72aa41c1 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProviderTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProviderTest.java @@ -34,7 +34,7 @@ public BladeHtmlEmbeddingProviderTest(String testName) { super(testName); } - private void checkPhpEmbedding(final String relFilePath) throws Exception { + private void checkHtmlEmbedding(final String relFilePath) throws Exception { checkEmbedding(relFilePath, new BladeHtmlEmbeddingProvider()); } @@ -55,7 +55,7 @@ private String serializableEmbeddings(List embeddings) { } public void testHtmlEmbedding_01() throws Exception { - checkPhpEmbedding("html_embedding_01"); + checkHtmlEmbedding("html_embedding_01"); } } diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProviderTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProviderTest.java index 37eab8eb00df..58286bc6fdfe 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProviderTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProviderTest.java @@ -54,15 +54,12 @@ private String serializableEmbeddings(List embeddings) { return sb.toString(); } - /** - * php embeddings freezes for syntax like $var:test or tertiary operation ?: - * - * solution is to skip full php embedd or hide ":" characters - * - * @throws Exception - */ - public void testFreezeNekudo_01() throws Exception { - checkPhpEmbedding("php_freeze_nekudo_01"); + public void testPhpInlineEmbedding_01() throws Exception { + checkPhpEmbedding("php_inline_embedding_01"); + } + + public void testPhpInlineEmbedding_02() throws Exception { + checkPhpEmbedding("php_inline_embedding_02"); } } From 4f03632c9ad50382bd2720faffc63d1c36659cc7 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Mon, 30 Sep 2024 09:26:20 +0300 Subject: [PATCH 19/43] internationalization comments, remove unecessary CompletionRequest container class + refactor --- .../completion/BladeCompletionHandler.java | 43 ++--- .../completion/BladeCompletionProposal.java | 162 ++++++++---------- .../completion/BladeCompletionProvider.java | 4 +- .../BladePhpCompletionProvider.java | 28 ++- .../completion/PhpCodeCompletionService.java | 73 ++++---- .../editor/components/ComponentElement.java | 34 ---- .../editor/components/ComponentModel.java | 51 ------ .../ComponentsCompletionService.java | 2 - .../ComponentDeclarationService.java | 4 +- .../editor/directives/CustomDirectives.java | 12 +- .../embedding/BladePhpEmbeddingProvider.java | 5 +- .../php/blade/editor/parser/ParsingUtils.java | 3 +- .../php/blade/editor/path/BladePathUtils.java | 16 +- .../blade/syntax/BladeDirectivesUtils.java | 1 + .../modules/php/blade/syntax/StringUtils.java | 3 + 15 files changed, 172 insertions(+), 269 deletions(-) delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentElement.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentModel.java diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java index cee2cc5167f7..26d84bea25cf 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java @@ -29,6 +29,7 @@ import javax.swing.text.Document; import javax.swing.text.JTextComponent; import org.antlr.v4.runtime.Token; +import org.netbeans.api.annotations.common.NonNull; import org.netbeans.api.project.Project; import org.netbeans.modules.csl.api.CodeCompletionContext; import org.netbeans.modules.csl.api.CodeCompletionHandler; @@ -46,7 +47,6 @@ import org.netbeans.modules.php.blade.csl.elements.NamedElement; import org.netbeans.modules.php.blade.csl.elements.PhpFunctionElement; import org.netbeans.modules.php.blade.csl.elements.TagElement; -import org.netbeans.modules.php.blade.editor.completion.BladeCompletionProposal.CompletionRequest; import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; import org.netbeans.modules.php.blade.editor.preferences.ModulePreferences; @@ -149,7 +149,7 @@ private void completePhpSnippet(final List completionProposa PhpCodeCompletionService phpCodeCompletion = new PhpCodeCompletionService(); for (CompletionProposal proposal : phpCodeCompletion.getCompletionProposal(offset, currentToken)) { String proposalPrefix = proposal.getInsertPrefix(); - if (proposalPrefix.startsWith(phpCodeCompletion.prefix)) { + if (proposalPrefix.startsWith(phpCodeCompletion.getPrefix())) { completionProposals.add(proposal); } } @@ -162,19 +162,17 @@ private void completeScopedVariables(final List completionPr FileObject fo = completionContext.getParserResult().getSnapshot().getSource().getFileObject(); if (scopedVariables != null && !scopedVariables.isEmpty()) { - CompletionRequest request = new CompletionRequest(); - request.anchorOffset = completionContext.getCaretOffset() - variablePrefix.length(); - request.carretOffset = completionContext.getCaretOffset(); - request.prefix = variablePrefix; + int anchorOffset = completionContext.getCaretOffset() - variablePrefix.length(); + if (BladeVariables.LOOP_VAR.startsWith(variablePrefix)) { String variableName = BladeVariables.LOOP_VAR; NamedElement variableElement = new NamedElement(variableName, fo, ElementType.VARIABLE); - completionProposals.add(new BladeCompletionProposal.BladeVariableItem(variableElement, request, variableName)); + completionProposals.add(new BladeCompletionProposal.BladeVariableItem(variableElement, anchorOffset, variableName)); } for (String variableName : scopedVariables) { if (variableName.startsWith(variablePrefix)) { NamedElement variableElement = new NamedElement(variableName, fo, ElementType.VARIABLE); - completionProposals.add(new BladeCompletionProposal.VariableItem(variableElement, request, variableName)); + completionProposals.add(new BladeCompletionProposal.VariableItem(variableElement, anchorOffset, variableName)); } } } @@ -192,13 +190,13 @@ private void completeBladeTags(final List completionProposal CodeCompletionContext completionContext, Token currentToken) { String tagStart = currentToken.getText(); - CompletionRequest request = completionRequest(tagStart, completionContext.getCaretOffset()); + int anchorOffset = computeAnchorOffset(tagStart, completionContext.getCaretOffset()); BladeTags tagsContainer = new BladeTags(); Tag[] tags = tagsContainer.getTags(); for (Tag tag : tags) { if (tag.openTag().startsWith(tagStart)) { TagElement tagElement = new TagElement(tag.closeTag()); - completionProposals.add(new BladeCompletionProposal.BladeTag(tagElement, request, tag)); + completionProposals.add(new BladeCompletionProposal.BladeTag(tagElement, anchorOffset, tag)); } } } @@ -208,7 +206,7 @@ private void completeDirectives(final List completionProposa String prefix = currentToken.getText(); DirectiveCompletionList completionList = new DirectiveCompletionList(); - CompletionRequest request = completionRequest(prefix, completionContext.getCaretOffset()); + int anchorOffset = computeAnchorOffset(prefix, completionContext.getCaretOffset()); for (Directive directive : completionList.getDirectives()) { String directiveName = directive.name(); @@ -216,15 +214,15 @@ private void completeDirectives(final List completionProposa DirectiveElement directiveEl = new DirectiveElement(directiveName, fo); if (directive.params()) { - completionProposals.add(new BladeCompletionProposal.DirectiveWithArg(directiveEl, request, directive)); + completionProposals.add(new BladeCompletionProposal.DirectiveWithArg(directiveEl, anchorOffset, directive)); if (!directive.endtag().isEmpty()) { - completionProposals.add(new BladeCompletionProposal.BlockDirectiveWithArg(directiveEl, request, directive)); + completionProposals.add(new BladeCompletionProposal.BlockDirectiveWithArg(directiveEl, anchorOffset, directive)); } } else { - completionProposals.add(new BladeCompletionProposal.InlineDirective(directiveEl, request, directive)); + completionProposals.add(new BladeCompletionProposal.InlineDirective(directiveEl, anchorOffset, directive)); if (!directive.endtag().isEmpty()) { - completionProposals.add(new BladeCompletionProposal.BlockDirective(directiveEl, request, directive)); + completionProposals.add(new BladeCompletionProposal.BlockDirective(directiveEl, anchorOffset, directive)); } } } @@ -236,11 +234,11 @@ private void completeDirectives(final List completionProposa public void filterDirectiveName(CustomDirectives.CustomDirective directive, FileObject file) { DirectiveElement directiveEl = new DirectiveElement(directive.name, file); if (directive.name.startsWith(prefix)) { - CompletionRequest request = completionRequest(prefix, completionContext.getCaretOffset()); + int anchorOffset = computeAnchorOffset(prefix, completionContext.getCaretOffset()); completionProposals.add( new BladeCompletionProposal.CustomDirective( directiveEl, - request, + anchorOffset, directive.name )); } @@ -317,13 +315,8 @@ public Documentation documentElement(ParserResult parserResult, ElementHandle el } return result; } - - public static CompletionRequest completionRequest(String prefix, int offset) { - CompletionRequest request = new CompletionRequest(); - request.anchorOffset = offset - prefix.length(); - request.carretOffset = offset; - request.prefix = prefix; - - return request; + + public static int computeAnchorOffset(@NonNull String prefix, int offset){ + return offset - prefix.length(); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java index 1514c460a43e..7394f019fa75 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java @@ -21,6 +21,7 @@ import java.util.Collections; import java.util.Set; import javax.swing.ImageIcon; +import org.netbeans.api.annotations.common.NonNull; import org.netbeans.modules.csl.api.CompletionProposal; import org.netbeans.modules.csl.api.ElementHandle; import org.netbeans.modules.csl.api.ElementKind; @@ -28,6 +29,7 @@ import org.netbeans.modules.csl.api.Modifier; import org.netbeans.modules.php.blade.csl.elements.ClassElement; import org.netbeans.modules.php.blade.editor.ResourceUtilities; +import org.netbeans.modules.php.blade.syntax.BladeDirectivesUtils; import org.netbeans.modules.php.blade.syntax.annotation.Directive; import org.netbeans.modules.php.blade.syntax.annotation.Tag; @@ -40,27 +42,27 @@ */ public class BladeCompletionProposal implements CompletionProposal { - final CompletionRequest request; - protected final ElementHandle element; - final String previewValue; - protected Directive directive; + private final ElementHandle element; + private final String previewValue; + private int anchorOffset; + private Directive directive; - public BladeCompletionProposal(ElementHandle element, CompletionRequest request, String previewValue) { + public BladeCompletionProposal(ElementHandle element, int anchorOffset, String previewValue) { this.element = element; - this.request = request; + this.anchorOffset = anchorOffset; this.previewValue = previewValue; } - public BladeCompletionProposal(ElementHandle element, CompletionRequest request, Directive directive) { + public BladeCompletionProposal(ElementHandle element, int anchorOffset, Directive directive) { this.element = element; - this.request = request; + this.anchorOffset = anchorOffset; this.previewValue = directive.name(); this.directive = directive; } @Override public int getAnchorOffset() { - return request.anchorOffset; + return anchorOffset; } @Override @@ -86,12 +88,12 @@ public int getSortPrioOverride() { @Override public String getLhsHtml(HtmlFormatter formatter) { formatter.name(getKind(), true); - formatter.appendHtml(""); - formatter.appendHtml(""); + formatter.appendHtml(""); // NOI18N + formatter.appendHtml(""); // NOI18N formatter.appendText(previewValue); - formatter.appendHtml(""); - formatter.appendHtml(""); - formatter.name(getKind(), false); + formatter.appendHtml(""); // NOI18N + formatter.appendHtml(""); // NOI18N + formatter.name(getKind(), false); // NOI18N return formatter.getText(); } @@ -141,11 +143,15 @@ public ElementKind getKind() { public boolean isSmart() { return true; } + + public Directive getDirective(){ + return directive; + } public static class PhpElementItem extends BladeCompletionProposal { - public PhpElementItem(ElementHandle element, CompletionRequest request, String previewValue) { - super(element, request, previewValue); + public PhpElementItem(ElementHandle element, int anchorOffset, String previewValue) { + super(element, anchorOffset, previewValue); } @Override @@ -165,8 +171,8 @@ public String getRhsHtml(HtmlFormatter formatter) { public static class NamespaceItem extends PhpElementItem { - public NamespaceItem(ElementHandle element, CompletionRequest request, String previewValue) { - super(element, request, previewValue); + public NamespaceItem(ElementHandle element, int anchorOffset, String previewValue) { + super(element, anchorOffset, previewValue); } @Override @@ -182,8 +188,8 @@ public int getSortPrioOverride() { public static class DirectiveItem extends BladeCompletionProposal { - public DirectiveItem(ElementHandle element, CompletionRequest request, String previewValue) { - super(element, request, previewValue); + public DirectiveItem(ElementHandle element, int anchorOffset, String previewValue) { + super(element, anchorOffset, previewValue); } } @@ -192,8 +198,8 @@ public static class ClassItem extends PhpElementItem { protected String namespace = null; - public ClassItem(ClassElement element, CompletionRequest request, String previewValue) { - super(element, request, previewValue); + public ClassItem(ClassElement element, int anchorOffset, String previewValue) { + super(element, anchorOffset, previewValue); this.namespace = element.getNamespace(); } @@ -218,9 +224,9 @@ public int getSortPrioOverride() { @Override public String getCustomInsertTemplate() { if (namespace != null && namespace.length() > 0) { - return "\\" + namespace + "\\" + element.getName(); + return "\\" + namespace + "\\" + getElement().getName(); } - return element.getName(); + return getElement().getName(); } } @@ -228,15 +234,15 @@ public static class FunctionItem extends PhpElementItem { protected final String namespace; - public FunctionItem(ElementHandle element, CompletionRequest request, String previewValue) { - super(element, request, previewValue); + public FunctionItem(ElementHandle element, int anchorOffset, String previewValue) { + super(element, anchorOffset, previewValue); this.namespace = null; } - public FunctionItem(ElementHandle element, CompletionRequest request, + public FunctionItem(ElementHandle element, int anchorOffset, String namespace, String previewValue) { - super(element, request, previewValue); + super(element, anchorOffset, previewValue); this.namespace = namespace; } @@ -262,8 +268,8 @@ public String getRhsHtml(HtmlFormatter formatter) { public static class ConstantItem extends PhpElementItem { - public ConstantItem(ElementHandle element, CompletionRequest request, String previewValue) { - super(element, request, previewValue); + public ConstantItem(ElementHandle element, int anchorOffset, String previewValue) { + super(element, anchorOffset, previewValue); } @Override @@ -275,8 +281,8 @@ public ElementKind getKind() { public static class VariableItem extends BladeCompletionProposal { - public VariableItem(ElementHandle element, CompletionRequest request, String previewValue) { - super(element, request, previewValue); + public VariableItem(ElementHandle element, int anchorOffset, String previewValue) { + super(element, anchorOffset, previewValue); } @Override @@ -288,8 +294,8 @@ public ElementKind getKind() { public static class BladeVariableItem extends BladeCompletionProposal { - public BladeVariableItem(ElementHandle element, CompletionRequest request, String previewValue) { - super(element, request, previewValue); + public BladeVariableItem(ElementHandle element, int anchorOffset, String previewValue) { + super(element, anchorOffset, previewValue); } @Override @@ -299,29 +305,22 @@ public ElementKind getKind() { @Override public String getRhsHtml(HtmlFormatter formatter) { - return "blade"; + return "blade"; // NOI18N } } - public static class CompletionRequest { - - public int anchorOffset; - public int carretOffset; - public String prefix; - } - public static class BladeTag extends BladeCompletionProposal { - protected Tag tag; + private Tag tag; - public BladeTag(ElementHandle element, CompletionRequest request, Tag tag) { - super(element, request, ""); + public BladeTag(ElementHandle element, int anchorOffset, Tag tag) { + super(element, anchorOffset, ""); // NOI18N this.tag = tag; } @Override public String getCustomInsertTemplate() { - return tag.openTag() + " ${cursor} " + tag.closeTag(); + return tag.openTag() + " ${cursor} " + tag.closeTag(); // NOI18N } @Override @@ -342,12 +341,12 @@ public int getSortPrioOverride() { public static class DirectiveProposal extends BladeCompletionProposal { - public DirectiveProposal(ElementHandle element, CompletionRequest request, Directive directive) { - super(element, request, directive); + public DirectiveProposal(ElementHandle element, int anchorOffset, Directive directive) { + super(element, anchorOffset, directive); } - public DirectiveProposal(ElementHandle element, CompletionRequest request, String previewValue) { - super(element, request, previewValue); + public DirectiveProposal(ElementHandle element, int anchorOffset, String previewValue) { + super(element, anchorOffset, previewValue); } @Override @@ -358,22 +357,22 @@ public ImageIcon getIcon() { @Override public String getRhsHtml(HtmlFormatter formatter) { - if (this.directive == null) { + if (this.getDirective() == null) { return null; } - if (directive.description().isEmpty() && !this.directive.since().isEmpty()) { - return "v" + this.directive.since(); + if (getDirective().description().isEmpty() && !getDirective().since().isEmpty()) { + return "v" + getDirective().since(); // NOI18N } - return this.directive.description(); + return getDirective().description(); } } public static class CustomDirective extends DirectiveProposal { - public CustomDirective(ElementHandle element, CompletionRequest request, String preview) { - super(element, request, preview); + public CustomDirective(ElementHandle element, int anchorOffset, String preview) { + super(element, anchorOffset, preview); } @Override @@ -381,87 +380,78 @@ public String getRhsHtml(HtmlFormatter formatter) { if (this.getElement().getFileObject() != null) { return this.getElement().getFileObject().getNameExt(); } - return "custom directive"; + return "custom directive"; // NOI18N } } public static class InlineDirective extends DirectiveProposal { - public InlineDirective(ElementHandle element, CompletionRequest request, Directive directive) { - super(element, request, directive); + public InlineDirective(ElementHandle element, int anchorOffset, Directive directive) { + super(element, anchorOffset, directive); } } public static class DirectiveWithArg extends InlineDirective { - public DirectiveWithArg(ElementHandle element, CompletionRequest request, Directive directive) { - super(element, request, directive); + public DirectiveWithArg(ElementHandle element, int anchorOffset, Directive directive) { + super(element, anchorOffset, directive); } @Override public String getCustomInsertTemplate() { String template = getName() + "($$${arg})"; switch (getName()) { - case "@include": - case "@extends": - template = getName() + "('${path}')"; - break; + case BladeDirectivesUtils.DIRECTIVE_INCLUDE, BladeDirectivesUtils.DIRECTIVE_EXTENDS -> template = getName() + "('${path}')"; // NOI18N } return template; } @Override public String getLhsHtml(HtmlFormatter formatter) { - return getName() + "()"; + return getName() + "()"; // NOI18N } } public static class BlockDirective extends DirectiveProposal { - public BlockDirective(ElementHandle element, CompletionRequest request, Directive directive) { - super(element, request, directive); + public BlockDirective(ElementHandle element, int anchorOffset, Directive directive) { + super(element, anchorOffset, directive); } @Override public String getLhsHtml(HtmlFormatter formatter) { - return getName() + " ... " + directive.endtag(); + return getName() + " ... " + getDirective().endtag(); // NOI18N } @Override public String getCustomInsertTemplate() { - return getName() + "\n ${selection} ${cursor}\n" + directive.endtag(); + return getName() + "\n ${selection} ${cursor}\n" + getDirective().endtag(); // NOI18N } } public static class BlockDirectiveWithArg extends DirectiveProposal { - public BlockDirectiveWithArg(ElementHandle element, CompletionRequest request, Directive directive) { - super(element, request, directive); + public BlockDirectiveWithArg(ElementHandle element, int anchorOffset, Directive directive) { + super(element, anchorOffset, directive); } @Override public String getLhsHtml(HtmlFormatter formatter) { - return getName() + "() ... " + directive.endtag(); + return getName() + "() ... " + getDirective().endtag(); // NOI18N } @Override public String getCustomInsertTemplate() { - String template = getName() + "($$${arg})\n ${cursor}\n" + directive.endtag(); - - switch (getName()) { - case "@foreach": // NOI18N - template = getName() + "($$${array} as $$${item})\n ${selection}${cursor}\n" + directive.endtag(); - break; - case "@section": // NOI18N - case "@session": // NOI18N - template = getName() + "('${id}')\n ${cursor}\n" + directive.endtag(); - break; - } - - return template; + return switch (getName()) { + case BladeDirectivesUtils.DIRECTIVE_FOREACH -> // NOI18N + getName() + "($$${array} as $$${item})\n ${selection}${cursor}\n" + getDirective().endtag(); // NOI18N + case BladeDirectivesUtils.DIRECTIVE_SECTION, BladeDirectivesUtils.DIRECTIVE_SESSION -> // NOI18N + getName() + "('${id}')\n ${cursor}\n" + getDirective().endtag(); // NOI18N + default -> getName() + "($$${arg})\n ${cursor}\n" + getDirective().endtag(); // NOI18N + }; } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java index 4fb960ec83bd..f79e213448c8 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java @@ -62,7 +62,7 @@ */ @MimeRegistrations(value = { @MimeRegistration(mimeType = "text/html", service = CompletionProvider.class), - @MimeRegistration(mimeType = "text/x-blade", service = CompletionProvider.class) + @MimeRegistration(mimeType = BladeLanguage.MIME_TYPE, service = CompletionProvider.class) }) public class BladeCompletionProvider implements CompletionProvider { @@ -182,7 +182,7 @@ protected void query(CompletionResultSet resultSet, Document doc, int caretOffse } finally { long time = System.currentTimeMillis() - startTime; if (time > 2000) { - LOGGER.log(Level.INFO, "Slow completion time detected. {0}ms", time); + LOGGER.log(Level.INFO, "Slow completion time detected. {0}ms", time); // NOI18N } resultSet.finish(); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java index 1234989407b6..58799632cac4 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java @@ -31,7 +31,9 @@ import org.netbeans.api.editor.document.EditorDocumentUtils; import org.netbeans.api.editor.mimelookup.MimeRegistration; import org.netbeans.api.editor.mimelookup.MimeRegistrations; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; import org.netbeans.api.project.Project; +import org.netbeans.modules.php.api.util.FileUtils; import org.netbeans.modules.php.blade.editor.BladeLanguage; import org.netbeans.modules.php.blade.editor.EditorStringUtils; import org.netbeans.modules.php.blade.editor.ResourceUtilities; @@ -40,7 +42,6 @@ import org.netbeans.modules.php.blade.editor.path.BladePathUtils; import org.netbeans.modules.php.blade.project.ProjectUtils; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; -import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrUtils; import org.netbeans.spi.editor.completion.CompletionItem; import org.netbeans.spi.editor.completion.CompletionProvider; @@ -58,7 +59,7 @@ * @author bhaidu */ @MimeRegistrations(value = { - @MimeRegistration(mimeType = "text/x-php5", service = CompletionProvider.class, position = 102), + @MimeRegistration(mimeType = FileUtils.PHP_MIME_TYPE, service = CompletionProvider.class, position = 102), } ) public class BladePhpCompletionProvider implements CompletionProvider { @@ -99,15 +100,10 @@ public int getAutoQueryTypes(JTextComponent component, String typedText) { } char lastChar = typedText.charAt(typedText.length() - 1); - switch (lastChar) { - case ')': - case '\n': - case '<': - case '>': - return 0; - } - - return COMPLETION_QUERY_TYPE; + return switch (lastChar) { + case ')', '\n', '<', '>' -> 0; + default -> COMPLETION_QUERY_TYPE; + }; } private class BladeCompletionQuery extends AsyncCompletionQuery { @@ -121,7 +117,7 @@ protected void query(CompletionResultSet resultSet, Document doc, int caretOffse doQuery(resultSet, doc, caretOffset); long time = System.currentTimeMillis() - startTime; if (time > 2000) { - LOGGER.log(Level.INFO, "Slow completion time detected. {0}ms", time); + LOGGER.log(Level.INFO, "Slow completion time detected. {0}ms", time); // NOI18N } resultSet.finish(); } @@ -212,7 +208,7 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse for (FileObject file : childrenFiles) { String pathFileName = file.getName(); if (!file.isFolder()) { - pathFileName = pathFileName.replace(".blade", ""); + pathFileName = pathFileName.replace(".blade", ""); // NOI18N } completeBladePath(pathFileName, file, pathOffset, resultSet); } @@ -232,10 +228,8 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse case EXPR_STRING: { String pathName = EditorStringUtils.stripSurroundingQuotes(currentToken.getText()); - if (!pathName.contains("resources")) { - if (!"resources".startsWith(pathName)) { - break; - } + if (!pathName.contains(BladePathUtils.LARAVEL_RESOURCES)) { + break; } int lastSlash = pathName.lastIndexOf("/"); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java index 1d3c146ee7f1..f91f70e8cdbd 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java @@ -22,6 +22,7 @@ import java.util.Collection; import java.util.List; import org.antlr.v4.runtime.Token; +import org.netbeans.api.annotations.common.NonNull; import org.netbeans.api.project.Project; import org.netbeans.modules.csl.api.CodeCompletionContext; import org.netbeans.modules.csl.api.CodeCompletionHandler; @@ -33,7 +34,6 @@ import org.netbeans.modules.php.blade.csl.elements.ElementType; import org.netbeans.modules.php.blade.csl.elements.NamedElement; import org.netbeans.modules.php.blade.editor.EditorStringUtils; -import static org.netbeans.modules.php.blade.editor.completion.BladeCompletionHandler.completionRequest; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexFunctionResult; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; @@ -50,9 +50,13 @@ * * @author bogdan */ -public class PhpCodeCompletionService { +public final class PhpCodeCompletionService { - public String prefix = ""; + private String prefix = ""; + + public String getPrefix() { + return prefix; + } public List getCompletionProposal(int offset, Token currentToken) { List proposals = new ArrayList<>(); @@ -100,7 +104,7 @@ public static void completePhpCode(final List completionProp BladeParserResult.FieldAccessReference fieldAccessReference = parserResult.findFieldAccessRefrence(offset); FileObject fo = parserResult.getSnapshot().getSource().getFileObject(); - + if (fieldAccessReference != null) { completeClassConstants(prefix, fieldAccessReference.ownerClass.identifier, offset, completionProposals, fo); completeClassMethods(prefix, fieldAccessReference, offset, completionProposals, fo); @@ -139,42 +143,41 @@ public static void completePhpCode(final List completionProp Collection indexedNamespaces = PhpIndexUtils.queryNamespaces( fo, namespacePath, QuerySupport.Kind.PREFIX ); - BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + + int anchorOffset = computeAnchorOffset(prefix, offset); for (PhpIndexResult indexResult : indexedNamespaces) { completionProposals.add(new BladeCompletionProposal.NamespaceItem( - namespaceElement(indexResult), request, indexResult.name)); + namespaceElement(indexResult), anchorOffset, indexResult.name)); } } else if (prefix.endsWith("\\")) { //the identifier is the namespace int substringOffset = elementReference.identifier.startsWith("\\") ? 1 : 0; String namespacePath = elementReference.identifier.substring(substringOffset, elementReference.identifier.length() - 1); Collection indexClassResults = PhpIndexUtils.queryAllNamespaceClasses(fo, namespacePath); - BladeCompletionProposal.CompletionRequest request = completionRequest(namespacePath, offset + namespacePath.length()); + int anchorOffset = computeAnchorOffset(namespacePath, offset + namespacePath.length()); for (PhpIndexResult indexResult : indexClassResults) { - completionProposals.add(new BladeCompletionProposal.ClassItem(classElement(indexResult), request, indexResult.name)); + completionProposals.add(new BladeCompletionProposal.ClassItem(classElement(indexResult), anchorOffset, indexResult.name)); } - //completeNamespacedPhpClasses("", namespace, offset, completionProposals, parserResult); } break; } } - private static void completePhpClasses(String prefix, int offset, + private static void completePhpClasses(String prefix, int offset, final List completionProposals, - FileObject fo) - { + FileObject fo) { Collection indexClassResults = PhpIndexUtils.queryClass(fo, prefix); if (indexClassResults.isEmpty()) { return; } - BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + int anchorOffset = computeAnchorOffset(prefix, offset); for (PhpIndexResult indexResult : indexClassResults) { completionProposals.add(new BladeCompletionProposal.ClassItem( - classElement(indexResult), request, indexResult.name)); + classElement(indexResult), anchorOffset, indexResult.name)); } } @@ -186,14 +189,14 @@ private static void completePhpFunctions(String prefix, int offset, if (indexedFunctions.isEmpty()) { return; } - BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + int anchorOffset = computeAnchorOffset(prefix, offset); for (PhpIndexFunctionResult indexResult : indexedFunctions) { //to be completed //might add syntax completion cursor String preview = indexResult.name + indexResult.getParamsAsString(); completionProposals.add(new BladeCompletionProposal.FunctionItem( functionElement(indexResult), - request, + anchorOffset, preview) ); } @@ -219,7 +222,7 @@ private static void completeClassMethods(String prefix, BladeParserResult.FieldA return; } - BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + int anchorOffset = computeAnchorOffset(prefix, offset); for (PhpIndexFunctionResult indexResult : indexedFunctions) { //to be completed @@ -227,7 +230,7 @@ private static void completeClassMethods(String prefix, BladeParserResult.FieldA String preview = indexResult.name + indexResult.getParamsAsString(); completionProposals.add(new BladeCompletionProposal.FunctionItem( functionElement(indexResult), - request, + anchorOffset, indexResult.getClassNamespace(), preview) ); @@ -256,34 +259,33 @@ private static void completeNamespace(String prefix, int offset, return; } - BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset + substringOffset); + int anchorOffset = computeAnchorOffset(prefix, offset + substringOffset); for (PhpIndexResult indexResult : indexClassResults) { completionProposals.add(new BladeCompletionProposal.NamespaceItem( - namespaceElement(indexResult), request, indexResult.name)); + namespaceElement(indexResult), anchorOffset, indexResult.name)); } } private static void completeConstants(String prefix, int offset, final List completionProposals, - FileObject fo) - { + FileObject fo) { Collection indexClassResults = PhpIndexUtils.queryConstants(fo, prefix); //treat only uppercase strings - if (!Character.isUpperCase(prefix.charAt(0))){ + if (!Character.isUpperCase(prefix.charAt(0))) { return; } - + if (indexClassResults.isEmpty()) { return; } - BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + int anchorOffset = computeAnchorOffset(prefix, offset); for (PhpIndexResult indexResult : indexClassResults) { completionProposals.add(new BladeCompletionProposal.ConstantItem( - constantElement(indexResult), request, indexResult.name)); + constantElement(indexResult), anchorOffset, indexResult.name)); } } @@ -295,30 +297,29 @@ private static void completeClassConstants(String prefix, String ownerClass, int fo, prefix, ownerClass); //treat only uppercase strings - if (!Character.isUpperCase(prefix.charAt(0))){ + if (!Character.isUpperCase(prefix.charAt(0))) { return; } - + if (indexClassResults.isEmpty()) { return; } - BladeCompletionProposal.CompletionRequest request = completionRequest(prefix, offset); + int anchorOffset = computeAnchorOffset(prefix, offset); for (PhpIndexResult indexResult : indexClassResults) { completionProposals.add(new BladeCompletionProposal.ConstantItem( - constantElement(indexResult), request, indexResult.name)); + constantElement(indexResult), anchorOffset, indexResult.name)); } } //TODO might move in a factory for NamedElement - private static ClassElement classElement(PhpIndexResult indexResult) { return new ClassElement(indexResult.name, indexResult.namespace, indexResult.declarationFile); } - + private static NamedElement namespaceElement(PhpIndexResult indexResult) { return namedElement(indexResult, ElementType.PHP_NAMESPACE); } @@ -331,12 +332,16 @@ private static NamedElement functionElement(PhpIndexResult indexResult) { private static NamedElement constantElement(PhpIndexResult indexResult) { return namedElement(indexResult, ElementType.PHP_CONSTANT); } - + private static NamedElement namedElement(PhpIndexResult indexResult, ElementType type) { return new NamedElement(indexResult.name, indexResult.declarationFile, type); } - + private static NamedElement namedElement(String preview, PhpIndexResult indexResult, ElementType type) { return new NamedElement(preview, indexResult.declarationFile, type); } + + public static int computeAnchorOffset(@NonNull String prefix, int offset) { + return offset - prefix.length(); + } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentElement.java deleted file mode 100644 index fa9628c37714..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentElement.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.editor.components; - -import java.util.HashSet; -import java.util.Set; - -/** - * TO use in implementation with ComponentModel - * - * @author bhaidu - */ -public class ComponentElement { - public String name; - public String qualifiedClassName; - - public Set properties = new HashSet<>(); -} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentModel.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentModel.java deleted file mode 100644 index 32aa0b7b9ec9..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentModel.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.editor.components; - -import java.util.Map; -import java.util.WeakHashMap; -import org.netbeans.api.project.Project; -import org.netbeans.spi.project.ui.support.ProjectConvertors; -import org.openide.filesystems.FileObject; - -/** - * TO BE CONTINUED - * - * @author bhaidu - */ -public class ComponentModel { - - private static final Map MODEL_INSTANCE = new WeakHashMap<>(); - - protected static ComponentModel getModel(FileObject fo, String prefix) { - ComponentModel selfModel = new ComponentModel(); - Project projectOwner = ProjectConvertors.getNonConvertorOwner(fo); - if (projectOwner == null) { - return null; - } - int pathHash = projectOwner.getProjectDirectory().toString().hashCode(); - if (ComponentModel.MODEL_INSTANCE.containsKey(pathHash)) { - selfModel = MODEL_INSTANCE.get(pathHash); - - } else { - MODEL_INSTANCE.put(pathHash, selfModel); - } - return selfModel; - } -} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java index ac2a2deabc01..b6e47db5a3fc 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java @@ -23,7 +23,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Map; -import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.project.Project; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; @@ -39,7 +38,6 @@ public class ComponentsCompletionService { - @CheckForNull public Collection queryComponents(String prefix, FileObject fo) { Collection results = new ArrayList<>(); Project project = ProjectUtils.getMainOwner(fo); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java index 13c01e4e9351..3892b5a3115f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java @@ -57,7 +57,7 @@ public Collection queryComponents(String prefix, FileObject fo) } public FileObject getComponentResourceFile(String componentId, String classQualifiedName, FileObject sourceFo) { - if (classQualifiedName.toLowerCase().contains("livewire")){ + if (classQualifiedName.toLowerCase().contains(ComponentsSupport.LIVEWIRE_NAME)){ return getLivewireComponentResourceFile(componentId, sourceFo); } @@ -70,7 +70,7 @@ public FileObject getLivewireComponentResourceFile(String componentId, FileObjec return null; } - FileObject componentResource = project.getProjectDirectory().getFileObject("resources/views/livewire/" + componentId + ".blade.php"); + FileObject componentResource = project.getProjectDirectory().getFileObject("resources/views/livewire/" + componentId + ".blade.php"); // NOI18N if (componentResource != null && componentResource.isValid()){ return componentResource; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java index aef8df37b541..d6cbc41a7a00 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java @@ -90,7 +90,7 @@ private CustomDirectives(Project project) { private void extractCustomDirectives() { LOGGER.info("Extracting custom directives"); String[] compilerPathList = BladeProjectProperties.getInstance(project).getCompilerPathList(); - FileObject defaultAppProvider = project.getProjectDirectory().getFileObject("app/Providers/AppServiceProvider.php"); + FileObject defaultAppProvider = project.getProjectDirectory().getFileObject("app/Providers/AppServiceProvider.php"); // NOI18N String defaultAppPath = ""; if (defaultAppProvider != null){ @@ -171,7 +171,7 @@ public List getList() { * directive name */ private class FunctionInvocationVisitor extends org.netbeans.modules.php.editor.parser.astnodes.visitors.DefaultVisitor { - private final String[] validFunctions = new String[]{"directive", "if"}; + private final String[] validFunctions = new String[]{"directive", "if"}; // NOI18N private final List directives; public FunctionInvocationVisitor() { @@ -196,13 +196,13 @@ public void visit(FunctionInvocation node) { Expression directiveName = (Expression) iter.next(); if (directiveName != null && directiveName instanceof Scalar) { Scalar name = (Scalar) directiveName; - String escapedDirectiveName = name.getStringValue().replaceAll("^[\"|\']|[\"|[\']]$", ""); + String escapedDirectiveName = name.getStringValue().replaceAll("^[\"|\']|[\"|[\']]$", ""); // NOI18N directives.add(new CustomDirective("@" + escapedDirectiveName, name.getStartOffset())); //Custom If Statements if (functionName.equals("if")){ - directives.add(new CustomDirective("@unless" + escapedDirectiveName, name.getStartOffset())); - directives.add(new CustomDirective("@else" + escapedDirectiveName, name.getStartOffset())); - directives.add(new CustomDirective("@end" + escapedDirectiveName, name.getStartOffset())); + directives.add(new CustomDirective("@unless" + escapedDirectiveName, name.getStartOffset())); // NOI18N + directives.add(new CustomDirective("@else" + escapedDirectiveName, name.getStartOffset())); // NOI18N + directives.add(new CustomDirective("@end" + escapedDirectiveName, name.getStartOffset())); // NOI18N } } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java index 7d88ddc83b16..7493ad3274bd 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java @@ -28,6 +28,7 @@ import org.netbeans.modules.parsing.api.Embedding; import org.netbeans.modules.parsing.api.Snapshot; import org.netbeans.modules.parsing.spi.EmbeddingProvider; +import org.netbeans.modules.php.api.util.FileUtils; import org.netbeans.modules.php.blade.editor.BladeLanguage; import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; /** @@ -36,9 +37,9 @@ */ @EmbeddingProvider.Registration( mimeType = BladeLanguage.MIME_TYPE, - targetMimeType = "text/x-php5") + targetMimeType = FileUtils.PHP_MIME_TYPE) public class BladePhpEmbeddingProvider extends EmbeddingProvider { - public static final String TARGET_MIME_TYPE = "text/x-php5"; //NOI18N + public static final String TARGET_MIME_TYPE = FileUtils.PHP_MIME_TYPE; //NOI18N @Override public List getEmbeddings(final Snapshot snapshot) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java index 16c6fd6e8e66..7d9e2974419d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java @@ -34,6 +34,7 @@ import org.netbeans.modules.parsing.api.UserTask; import org.netbeans.modules.parsing.spi.ParseException; import org.netbeans.modules.parsing.spi.Parser; +import org.netbeans.modules.php.api.util.FileUtils; import org.netbeans.modules.php.editor.parser.PHPParseResult; import org.openide.filesystems.AbstractFileSystem; import org.openide.filesystems.DefaultAttributes; @@ -299,7 +300,7 @@ public boolean readOnly(String name) { @Override public String mimeType(String name) { - return "text/x-php5"; + return FileUtils.PHP_MIME_TYPE; } @Override diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java index 6d660dbb8e3d..05d10e00d11a 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java @@ -28,6 +28,7 @@ import org.netbeans.api.project.Project; import org.netbeans.modules.php.blade.project.BladeProjectProperties; import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.netbeans.modules.php.blade.syntax.StringUtils; import org.netbeans.spi.project.ui.support.ProjectConvertors; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; @@ -38,6 +39,7 @@ */ public final class BladePathUtils { + public static final String LARAVEL_RESOURCES = "resources"; //NOI18N public static final String LARAVEL_VIEW_PATH = "resources/views"; //NOI18N public static final String BLADE_EXT = ".blade.php"; //NOI18N @@ -133,11 +135,11 @@ public static List getParentChildrenFromPrefixPath(FileObject contex return list; } - String unixPath = prefixViewPath.replace(".", "/"); + String unixPath = prefixViewPath.replace(StringUtils.DOT, StringUtils.FORWARD_SLASH); int relativeSlash; //fix issues with lastIndexOf search - relativeSlash = unixPath.lastIndexOf("/"); + relativeSlash = unixPath.lastIndexOf(StringUtils.FORWARD_SLASH); HashSet filteredViewRoots = new HashSet<>(); @@ -179,7 +181,7 @@ public static List getParentChildrenFromPrefixPath(FileObject contex //filter by filename in relative context for (FileObject rootFolder : filteredViewRoots) { for (FileObject file : rootFolder.getChildren()) { - String filePath = file.getPath().replace(rootFolder.getPath() + "/", ""); + String filePath = file.getPath().replace(rootFolder.getPath() + StringUtils.FORWARD_SLASH, ""); if (filePath.startsWith(relativePrefixToCompare)) { list.add(file); } @@ -269,7 +271,7 @@ public static String toBladeViewPath(FileObject file) { String viewFileAbsPath = viewFile.getPath(); if (filePath.startsWith(viewFileAbsPath)) { String relativePath = filePath.replace(viewFileAbsPath, ""); - if (!relativePath.startsWith("/")) { + if (!relativePath.startsWith(StringUtils.FORWARD_SLASH)) { //it doesn't belong to the folder continue; } @@ -298,11 +300,11 @@ public static String getRelativeProjectPath(FileObject currentFile) { } public static String toBladeViewPath(String filePath) { - return filePath.replace(BLADE_EXT, "").replace("/", "."); + return filePath.replace(BLADE_EXT, "").replace(StringUtils.FORWARD_SLASH, StringUtils.DOT); } public static String viewPathToFilePath(String viewPath) { - return viewPath.replace(".", "/") + BLADE_EXT; + return viewPath.replace(StringUtils.DOT, StringUtils.FORWARD_SLASH) + BLADE_EXT; } public static HashSet getDefaultRoots(Project project) { @@ -317,6 +319,6 @@ public static HashSet getDefaultRoots(Project project) { } public static String toBladeToProjectFilePath(String path) { - return LARAVEL_VIEW_PATH + "/" + viewPathToFilePath(path); + return LARAVEL_VIEW_PATH + StringUtils.FORWARD_SLASH + viewPathToFilePath(path); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java index 40f5c037c103..ceaad59fc130 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java @@ -41,6 +41,7 @@ public final class BladeDirectivesUtils { public static final String DIRECTIVE_FOREACH = "@foreach"; // NOI18N public static final String DIRECTIVE_INCLUDE = "@include"; // NOI18N public static final String DIRECTIVE_EXTENDS = "@extends"; // NOI18N + public static final String DIRECTIVE_SESSION = "@session"; // NOI18N public static String[] directiveStart2EndPair(String directive){ if (directive.equals(DIRECTIVE_SECTION)){ diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java index 42b6b9eda961..bfd222d49388 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java @@ -24,6 +24,9 @@ */ public final class StringUtils { + public static final String DOT = "."; + public static final String FORWARD_SLASH = "/"; //NOI18N + private StringUtils() { } From c9697ccc1d6304ea35581817b7caa2c3ef612b3c Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Tue, 1 Oct 2024 20:41:47 +0300 Subject: [PATCH 20/43] switch case code review, NOI18N, use Set instead of List for contains operations --- .../php/blade/editor/BladeBracesMatcher.java | 18 ++++--- .../blade/editor/BladeDeclarationFinder.java | 6 ++- .../php/blade/editor/BladeLanguage.java | 36 ++++++------- .../php/blade/editor/cache/QueryCache.java | 2 +- .../completion/BladeCompletionItem.java | 29 +++++----- .../completion/BladeCompletionProposal.java | 17 +++--- .../BladePhpCompletionProvider.java | 53 ++++++------------- .../ComponentDeclarationService.java | 3 ++ .../blade/editor/lexer/BladeLexerUtils.java | 8 +-- .../editor/ui/customizer/BladeDirectives.java | 4 +- .../ui/customizer/BladeViewsFoldersPanel.java | 13 ++--- .../editor/ui/customizer/UiOptionsUtils.java | 10 +--- .../syntax/antlr4/v10/BladeAntlrUtils.java | 44 +++------------ 13 files changed, 92 insertions(+), 151 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java index 18e8a1ec9605..b222001ff6d9 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -20,7 +20,9 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; import javax.swing.text.BadLocationException; import org.antlr.v4.runtime.Token; import org.netbeans.api.annotations.common.CheckForNull; @@ -155,7 +157,7 @@ private BraceDirectionType findBraceDirectionType(String tokenText, Token token) private int[] findOpenTag() { int matchTokenType = BladeAntlrUtils.getTagPairTokenType(originToken.getType()); - List skipableTokenTypes = new ArrayList<>(); + Set skipableTokenTypes = new HashSet<>(); skipableTokenTypes.add(HTML); Token startToken = BladeAntlrUtils.findBackwardWithStop(context.getDocument(), originToken, @@ -173,7 +175,7 @@ private int[] findOpenTag() { private int[] findCloseTag() { int matchTokenType = BladeAntlrUtils.getTagPairTokenType(originToken.getType()); - List skipableTokenTypes = new ArrayList<>(); + Set skipableTokenTypes = new HashSet<>(); skipableTokenTypes.add(HTML); Token endToken = BladeAntlrUtils.findForwardWithStop(context.getDocument(), originToken, @@ -195,8 +197,8 @@ private int[] findDirectiveEnd(String directive) { if (pair == null){ return null; } - List startDirectiveForBalance = new ArrayList<>(); - List stopDirectives = Arrays.asList(pair); + Set startDirectiveForBalance = new HashSet<>(); + Set stopDirectives = new HashSet<>(Arrays.asList(pair)); for (String endDirective : pair) { String[] startDirectives = BladeDirectivesUtils.directiveEnd2StartPair(endDirective); @@ -224,8 +226,8 @@ private int[] findDirectiveEnd(String directive) { private int[] findCustomDirectiveEnd(String directive) { String endPrefix = BladeDirectivesUtils.END_DIRECTIVE_PREFIX; String[] pair = new String[]{endPrefix + directive.substring(1)}; - List stopDirectives = Arrays.asList(pair); - List startDirectiveForBalance = Arrays.asList(new String[]{directive}); + Set stopDirectives = new HashSet<>(Arrays.asList(pair)); + Set startDirectiveForBalance = new HashSet<>(Arrays.asList(new String[]{directive})); Token endToken = BladeAntlrUtils.findForward(context.getDocument(), originToken, @@ -244,8 +246,8 @@ private int[] findCustomDirectiveEnd(String directive) { @CheckForNull private int[] findOriginForDirectiveEnd(String directive) { String[] pair = BladeDirectivesUtils.directiveEnd2StartPair(directive); - List endDirectivesForBalance = new ArrayList<>(); - List openDirectives = Arrays.asList(pair); + Set endDirectivesForBalance = new HashSet<>(); + Set openDirectives = new HashSet<>(Arrays.asList(pair)); for (String startDirective : pair) { String[] endDirectives = BladeDirectivesUtils.directiveStart2EndPair(startDirective); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java index af247662457c..3f452202a779 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java @@ -20,7 +20,9 @@ import java.util.Arrays; import java.util.Collection; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.text.BadLocationException; @@ -121,8 +123,8 @@ public OffsetRange getReferenceSpan(Document document, int caretOffset) { } if (nt.getType() == BL_PARAM_STRING || nt.getType() == EXPR_STRING) { - List tokensToMatch = BladeLexerUtils.TOKENS_WITH_IDENTIFIABLE_PARAM; - List tokensStop = Arrays.asList(new Integer[]{HTML}); + Set tokensToMatch = BladeLexerUtils.TOKENS_WITH_IDENTIFIABLE_PARAM; + Set tokensStop = new HashSet<>(Arrays.asList(new Integer[]{HTML})); org.antlr.v4.runtime.Token matchedToken = BladeAntlrUtils.findBackward(tokens, tokensToMatch, tokensStop); int offsetCorrection = caretOffset - lineOffset; if (matchedToken != null) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java index 99cb095427ef..4fa2390239f7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java @@ -56,30 +56,30 @@ * @author Haidu Bogdan */ @MIMEResolver.Registration( - resource = "../resources/mime-resolver.xml", - displayName = "#LBL_Blade_LOADER", + resource = "../resources/mime-resolver.xml", //NOI18N + displayName = "#LBL_Blade_LOADER", //NOI18N position = 1 ) @NbBundle.Messages({ "LBL_Blade_LOADER=Blade template files" }) -@LanguageRegistration(mimeType = "text/x-blade", useMultiview = true) +@LanguageRegistration(mimeType = "text/x-blade", useMultiview = true) //NOI18N @ActionReferences({ - @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.OpenAction"), path = ACTIONS, position = 100), - @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.CutAction"), path = ACTIONS, position = 300, separatorBefore = 200), - @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.CopyAction"), path = ACTIONS, position = 400), - @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.PasteAction"), path = ACTIONS, position = 500, separatorAfter = 600), - @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.NewAction"), path = ACTIONS, position = 700), - @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.DeleteAction"), path = ACTIONS, position = 800), - @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.RenameAction"), path = ACTIONS, position = 900, separatorAfter = 1000), - @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.SaveAsTemplateAction"), path = ACTIONS, position = 1100, separatorAfter = 1200), - @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.FileSystemAction"), path = ACTIONS, position = 1300, separatorAfter = 1400), - @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.ToolsAction"), path = ACTIONS, position = 1500), - @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.PropertiesAction"), path = ACTIONS, position = 1600), - @ActionReference(id = @ActionID(category = "TemplateActions", id = "org.netbeans.modules.php.blade.editor.actions.FindUsage"), + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.OpenAction"), path = ACTIONS, position = 100), //NOI18N + @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.CutAction"), path = ACTIONS, position = 300, separatorBefore = 200), //NOI18N + @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.CopyAction"), path = ACTIONS, position = 400), //NOI18N + @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.PasteAction"), path = ACTIONS, position = 500, separatorAfter = 600), //NOI18N + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.NewAction"), path = ACTIONS, position = 700), //NOI18N + @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.DeleteAction"), path = ACTIONS, position = 800), //NOI18N + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.RenameAction"), path = ACTIONS, position = 900, separatorAfter = 1000), //NOI18N + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.SaveAsTemplateAction"), path = ACTIONS, position = 1100, separatorAfter = 1200), //NOI18N + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.FileSystemAction"), path = ACTIONS, position = 1300, separatorAfter = 1400), //NOI18N + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.ToolsAction"), path = ACTIONS, position = 1500), //NOI18N + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.PropertiesAction"), path = ACTIONS, position = 1600), //NOI18N + @ActionReference(id = @ActionID(category = "TemplateActions", id = "org.netbeans.modules.php.blade.editor.actions.FindUsage"), //NOI18N path = ACTIONS, separatorBefore = 1700, position = 1800), - @ActionReference(id = @ActionID(category = "System", id = "org.netbeans.modules.php.blade.editor.actions.AntlrDebug"), path = ACTIONS, position = 1900), + @ActionReference(id = @ActionID(category = "System", id = "org.netbeans.modules.php.blade.editor.actions.AntlrDebug"), path = ACTIONS, position = 1900), //NOI18N } ) public class BladeLanguage extends DefaultLanguageConfig { @@ -203,10 +203,10 @@ protected Lexer createLexer(LexerRestartInfo info) { @NbBundle.Messages("Source=&Source Blade") @MultiViewElement.Registration( - displayName = "#Source", + displayName = "#Source", //NOI18N persistenceType = TopComponent.PERSISTENCE_ONLY_OPENED, mimeType = BladeLanguage.MIME_TYPE, - preferredID = "blade.source", + preferredID = "blade.source", //NOI18N position = 100 ) public static MultiViewEditorElement createMultiViewEditorElement(Lookup context) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java index e6568f2153b0..e971d6dfbaa5 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java @@ -59,7 +59,7 @@ public boolean containsKey(K key) { } protected Set getExpiredKeys() { - return this.cacheMap.keySet().parallelStream() + return this.cacheMap.keySet().stream() .filter(this::isExpired) .collect(Collectors.toSet()); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java index c3c406956285..2e55d0209b18 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java @@ -94,7 +94,6 @@ public void render(Graphics g, Font defaultFont, Color defaultColor, Color backg CompletionUtilities.renderHtml(getIcon(), getLeftHtmlText(), getRightHtmlText(), g, defaultFont, defaultColor, width, height, selected); } - @Override public CompletionTask createDocumentationTask() { return null; @@ -137,11 +136,11 @@ public CharSequence getSortText() { public CharSequence getInsertPrefix() { return getItemText(); } - + protected ImageIcon getIcon() { return null; } - + protected String getLeftHtmlText() { return name; } @@ -243,13 +242,12 @@ public DirectiveWithArg(String directive, int substitutionOffset, @Override protected String getSubstituteText() { - String template = getItemText() + "($$${arg})"; // NOI18N - switch (getName()) { - case BladeDirectivesUtils.DIRECTIVE_INCLUDE, - BladeDirectivesUtils.DIRECTIVE_EXTENDS -> - template = getItemText() + "('${path}')"; // NOI18N - } - return template; + return switch (getName()) { + case BladeDirectivesUtils.DIRECTIVE_INCLUDE, BladeDirectivesUtils.DIRECTIVE_EXTENDS -> + getItemText() + "('${path}')"; // NOI18N + default -> + getItemText() + "($$${arg})"; // NOI18N + }; } @Override @@ -316,14 +314,11 @@ public BlockDirectiveWithArg(String directive, String endTag, int substitutionOf @Override protected String getSubstituteText() { - String template = getItemText() + "($$${arg})\n\n${selection}${cursor}\n" + getEndTag(); // NOI18N - - switch (getName()) { + return switch (getName()) { case BladeDirectivesUtils.DIRECTIVE_FOREACH -> - template = getItemText() + "($$${array} as $$${item})\n${selection}${cursor}\n" + getEndTag(); // NOI18N - } - - return template; + getItemText() + "($$${array} as $$${item})\n${selection}${cursor}\n" + getEndTag(); // NOI18N + default -> getItemText() + "($$${arg})\n\n${selection}${cursor}\n" + getEndTag(); // NOI18N + }; } @Override diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java index 7394f019fa75..a2f2a2729694 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java @@ -128,7 +128,7 @@ public String getRhsHtml(HtmlFormatter formatter) { } if (file != null) { formatter.reset(); - formatter.appendText(" "); + formatter.appendText(" "); // NOI18N formatter.appendText(file.getName()); } return formatter.getText(); @@ -162,7 +162,7 @@ public String getRhsHtml(HtmlFormatter formatter) { } if (file != null) { formatter.reset(); - formatter.appendText(" "); + formatter.appendText(" "); // NOI18N formatter.appendText(file.getNameExt()); } return formatter.getText(); @@ -196,7 +196,7 @@ public DirectiveItem(ElementHandle element, int anchorOffset, String previewValu public static class ClassItem extends PhpElementItem { - protected String namespace = null; + private String namespace = null; public ClassItem(ClassElement element, int anchorOffset, String previewValue) { super(element, anchorOffset, previewValue); @@ -224,7 +224,7 @@ public int getSortPrioOverride() { @Override public String getCustomInsertTemplate() { if (namespace != null && namespace.length() > 0) { - return "\\" + namespace + "\\" + getElement().getName(); + return "\\" + namespace + "\\" + getElement().getName(); // NOI18N } return getElement().getName(); } @@ -401,11 +401,10 @@ public DirectiveWithArg(ElementHandle element, int anchorOffset, Directive direc @Override public String getCustomInsertTemplate() { - String template = getName() + "($$${arg})"; - switch (getName()) { - case BladeDirectivesUtils.DIRECTIVE_INCLUDE, BladeDirectivesUtils.DIRECTIVE_EXTENDS -> template = getName() + "('${path}')"; // NOI18N - } - return template; + return switch (getName()) { + case BladeDirectivesUtils.DIRECTIVE_INCLUDE, BladeDirectivesUtils.DIRECTIVE_EXTENDS -> getName() + "('${path}')"; // NOI18N + default -> getName() + "($$${arg})"; // NOI18N + }; } @Override diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java index 58799632cac4..8f248c5f8cc7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java @@ -20,7 +20,9 @@ import java.io.IOException; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.text.BadLocationException; @@ -39,6 +41,7 @@ import org.netbeans.modules.php.blade.editor.ResourceUtilities; import org.netbeans.modules.php.blade.editor.indexing.BladeIndex; import org.netbeans.modules.php.blade.editor.indexing.BladeIndex.IndexedReferenceId; +import org.netbeans.modules.php.blade.editor.lexer.BladeLexerUtils; import org.netbeans.modules.php.blade.editor.path.BladePathUtils; import org.netbeans.modules.php.blade.project.ProjectUtils; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; @@ -169,26 +172,17 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse } switch (currentToken.getType()) { - case BL_PARAM_STRING: { + case BL_PARAM_STRING -> { String pathName = EditorStringUtils.stripSurroundingQuotes(currentToken.getText()); - List tokensMatch = Arrays.asList(new Integer[]{ - D_EXTENDS, D_INCLUDE, D_SECTION, D_HAS_SECTION, - D_INCLUDE_IF, D_INCLUDE_WHEN, D_INCLUDE_UNLESS, D_INCLUDE_FIRST, - D_EACH, D_PUSH, D_PUSH_IF, D_PREPEND - }); - - List tokensStop = Arrays.asList(new Integer[]{HTML, BL_COMMA, BL_PARAM_CONCAT_OPERATOR}); - Token directiveToken = BladeAntlrUtils.findBackward(tokens, tokensMatch, tokensStop); + Set tokensToMatch = BladeLexerUtils.TOKENS_WITH_IDENTIFIABLE_PARAM; + Set tokensStop = new HashSet<>(Arrays.asList(new Integer[]{HTML, BL_COMMA, BL_PARAM_CONCAT_OPERATOR})); + + Token directiveToken = BladeAntlrUtils.findBackward(tokens, tokensToMatch, tokensStop); if (directiveToken == null) { - break; + return; } switch (directiveToken.getType()) { - case D_EXTENDS: - case D_INCLUDE: - case D_INCLUDE_IF: - case D_INCLUDE_WHEN: - case D_INCLUDE_UNLESS: - case D_EACH: + case D_EXTENDS, D_INCLUDE, D_INCLUDE_IF, D_INCLUDE_WHEN, D_INCLUDE_UNLESS, D_EACH -> { int lastDotPos; if (pathName.endsWith(".")) { @@ -213,23 +207,15 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse completeBladePath(pathFileName, file, pathOffset, resultSet); } return; - case D_SECTION: - case D_HAS_SECTION: - completeYieldIdFromIndex(pathName, fo, caretOffset, resultSet); - break; - case D_PUSH: - case D_PUSH_IF: - case D_PREPEND: - completeStackIdFromIndex(pathName, fo, caretOffset, resultSet); - break; } - break; + case D_SECTION, D_HAS_SECTION -> completeYieldIdFromIndex(pathName, fo, caretOffset, resultSet); + case D_PUSH, D_PUSH_IF, D_PREPEND -> completeStackIdFromIndex(pathName, fo, caretOffset, resultSet); + } } - case EXPR_STRING: { + case EXPR_STRING -> { String pathName = EditorStringUtils.stripSurroundingQuotes(currentToken.getText()); if (!pathName.contains(BladePathUtils.LARAVEL_RESOURCES)) { - break; } int lastSlash = pathName.lastIndexOf("/"); @@ -237,7 +223,6 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse FileObject projectDir = ProjectUtils.getProjectDirectory(fo); if (projectDir == null) { - break; } int pathOffset = caretOffset - pathName.length(); @@ -249,7 +234,6 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse String cssDirRoot = CSS_ASSET_FOLDER; FileObject cssFolder = projectDir.getFileObject(CSS_ASSET_FOLDER); addAssetPathCompletionItem(cssDirRoot, cssFolder.getPath(), pathOffset, resultSet, CompletionType.FOLDER); - break; } boolean isJsPath = JS_ASSET_FOLDER.startsWith(pathName) || pathName.startsWith(JS_ASSET_FOLDER); @@ -258,7 +242,6 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse if (isJsPath) { FileObject jsFolder = projectDir.getFileObject(JS_ASSET_FOLDER); if (jsFolder == null || !jsFolder.isValid()) { - break; } for (FileObject file : jsFolder.getChildren()) { String jsPath = JS_ASSET_FOLDER + "/" + file.getNameExt(); @@ -266,12 +249,10 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse addAssetPathCompletionItem(jsPath, file.getPath(), pathOffset, resultSet, CompletionType.JS_FILE); } } - break; } if (isCssPath) { FileObject cssFolder = projectDir.getFileObject(CSS_ASSET_FOLDER); if (cssFolder == null || !cssFolder.isValid()) { - break; } for (FileObject file : cssFolder.getChildren()) { String jsPath = CSS_ASSET_FOLDER + "/" + file.getNameExt(); @@ -279,12 +260,10 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse addAssetPathCompletionItem(jsPath, file.getPath(), pathOffset, resultSet, CompletionType.CSS_FILE); } } - break; } - break; } - default: - break; + default -> { + } } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java index 3892b5a3115f..6551a264860f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Map; +import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.project.Project; import org.netbeans.modules.php.blade.editor.components.annotation.Namespace; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; @@ -56,6 +57,7 @@ public Collection queryComponents(String prefix, FileObject fo) return results; } + @CheckForNull public FileObject getComponentResourceFile(String componentId, String classQualifiedName, FileObject sourceFo) { if (classQualifiedName.toLowerCase().contains(ComponentsSupport.LIVEWIRE_NAME)){ return getLivewireComponentResourceFile(componentId, sourceFo); @@ -64,6 +66,7 @@ public FileObject getComponentResourceFile(String componentId, String classQuali return null; } + @CheckForNull public FileObject getLivewireComponentResourceFile(String componentId, FileObject sourceFo) { Project project = ProjectUtils.getMainOwner(sourceFo); if (project == null) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java index d9e5de511063..79e347faee77 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java @@ -19,7 +19,9 @@ package org.netbeans.modules.php.blade.editor.lexer; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; import javax.swing.text.Document; import org.netbeans.api.lexer.Language; import org.netbeans.api.lexer.TokenHierarchy; @@ -36,12 +38,12 @@ public final class BladeLexerUtils { private BladeLexerUtils() { } - - public static final List TOKENS_WITH_IDENTIFIABLE_PARAM = Arrays.asList(new Integer[]{ + public static final Integer[] TOKENS_WITH_IDENTIFIABLE_PARAM_VALUES = new Integer[] { D_EXTENDS, D_INCLUDE, D_INCLUDE_IF, D_INCLUDE_WHEN, D_INCLUDE_UNLESS, D_EACH, D_SECTION, D_HAS_SECTION, D_SECTION_MISSING, D_PUSH, D_PUSH_IF, D_PREPEND, D_USE, D_INJECT, D_ASSET_BUNDLER - }); + }; + public static final Set TOKENS_WITH_IDENTIFIABLE_PARAM = new HashSet<>(Arrays.asList(TOKENS_WITH_IDENTIFIABLE_PARAM_VALUES)); public static TokenSequence getPhpTokenSequence(TokenHierarchy th, final int offset) { return getTokenSequence(th, offset, PHPTokenId.language()); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.java index 78f0e75981d8..e98d5d043f08 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.java @@ -38,7 +38,7 @@ public class BladeDirectives extends javax.swing.JPanel { private final Project project; - BladeProjectProperties bladeProperties; + private final BladeProjectProperties bladeProperties; /** * Creates new form CustomizerIncludePath @@ -177,7 +177,7 @@ private void removePathButtonActionPerformed(java.awt.event.ActionEvent evt) {// private void jLabel3MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel3MouseClicked try { - Desktop.getDesktop().browse(new URI("https://laravel.com/docs/10.x/blade#extending-blade")); + Desktop.getDesktop().browse(new URI("https://laravel.com/docs/10.x/blade#extending-blade")); // NOI18N } catch (URISyntaxException | IOException ex) { Exceptions.printStackTrace(ex); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.java index 3d28314d3b43..ccf258fdd723 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.java @@ -22,7 +22,6 @@ import java.io.File; import javax.swing.event.ChangeListener; import org.netbeans.api.project.Project; -import org.netbeans.modules.php.blade.editor.indexing.BladeIndex; import org.netbeans.modules.php.blade.editor.indexing.IndexManager; import org.netbeans.modules.php.blade.project.BladeProjectProperties; import org.netbeans.spi.options.OptionsPanelController; @@ -33,17 +32,17 @@ @NbBundle.Messages("BladePanel.options.keywords.tabTitle=Frameworks & Tools") @OptionsPanelController.Keywords( keywords = { - "php", "blade" + "php", "blade" // NOI18N }, - location = "Html5", - tabTitle = "#BladePanel.options.keywords.tabTitle" + location = "Html5", // NOI18N + tabTitle = "#BladePanel.options.keywords.tabTitle" // NOI18N ) public final class BladeViewsFoldersPanel extends javax.swing.JPanel { private final ChangeSupport changeSupport = new ChangeSupport(this); private final Project project; - BladeProjectProperties bladeProperties; + private final BladeProjectProperties bladeProperties; BladeViewsFoldersPanel(Project project) { assert project != null; @@ -66,10 +65,6 @@ public void storeData(){ public void addChangeListener(ChangeListener listener) { changeSupport.addChangeListener(listener); } - - void fireChange() { - changeSupport.fireChange(); - } /** * This method is called from within the constructor to initialize the form. diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UiOptionsUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UiOptionsUtils.java index 194a751d7fb6..fb8a7989e195 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UiOptionsUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UiOptionsUtils.java @@ -18,9 +18,8 @@ */ package org.netbeans.modules.php.blade.editor.ui.customizer; -import java.util.ArrayList; +import java.util.Collections; import java.util.Enumeration; -import java.util.List; /** @@ -30,11 +29,6 @@ public class UiOptionsUtils { public static String encodeToStrings(Enumeration list) { - List result = new ArrayList<>(); - while (list.hasMoreElements()) { - result.add(list.nextElement()); - } - - return String.join("|", result); + return String.join("|", Collections.list(list)); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java index ae688538e85c..181cf362d0ce 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java @@ -19,6 +19,7 @@ package org.netbeans.modules.php.blade.syntax.antlr4.v10; import java.util.List; +import java.util.Set; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import org.antlr.v4.runtime.CharStreams; @@ -70,7 +71,7 @@ public static Token getToken(Document doc, int offset) { } public static Token findForward(Document doc, Token start, - List stopTokenText, List openTokensText) { + Set stopTokenText, Set openTokensText) { AntlrTokenSequence tokens = getTokens(doc); @@ -128,7 +129,7 @@ public static Token findForward(AntlrTokenSequence tokens, } public static Token findBackward(Document doc, Token start, - List stopTokenText, List openTokensText) { + Set stopTokenText, Set openTokensText) { AntlrTokenSequence tokens = getTokens(doc); @@ -165,7 +166,7 @@ public static Token findBackward(Document doc, Token start, } public static Token findBackward(AntlrTokenSequence tokens, - List tokensMatch, List tokensStop) { + Set tokensMatch, Set tokensStop) { while (tokens.hasPrevious()) { Token pt = tokens.previous().get(); @@ -185,39 +186,8 @@ public static Token findBackward(AntlrTokenSequence tokens, return null; } - public static Token findForward(Document doc, Token start, - int tokensMatch, List skipableTokens) { - AntlrTokenSequence tokens = getTokens(doc); - - if (tokens == null || tokens.isEmpty()) { - return null; - } - - tokens.seekTo(start.getStopIndex() + 1); - - while (tokens.hasNext()) { - Token pt = tokens.next().get(); - if (pt == null) { - continue; - } - - if (pt.getType() == tokensMatch) { - return pt; - } - - if (skipableTokens.contains(pt.getType())) { - continue; - } - - return null; - } - - return null; - - } - public static Token findForwardWithStop(Document doc, Token start, - int tokensMatch, List stopTokens) { + int tokensMatch, Set stopTokens) { AntlrTokenSequence tokens = getTokens(doc); if (tokens == null || tokens.isEmpty()) { @@ -246,7 +216,7 @@ public static Token findForwardWithStop(Document doc, Token start, } public static Token findBackward(Document doc, Token start, - int tokensMatch, List skipableTokens) { + int tokensMatch, Set skipableTokens) { AntlrTokenSequence tokens = getTokens(doc); if (tokens == null || tokens.isEmpty()) { @@ -277,7 +247,7 @@ public static Token findBackward(Document doc, Token start, } public static Token findBackwardWithStop(Document doc, Token start, - int tokensMatch, List stopTokens) { + int tokensMatch, Set stopTokens) { AntlrTokenSequence tokens = getTokens(doc); if (tokens == null || tokens.isEmpty()) { From 59277d3e71924d7d1670bf4ab59c71e8e2d89850 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Tue, 1 Oct 2024 21:17:46 +0300 Subject: [PATCH 21/43] add test action for php module workflow, add sample files in license list, add license header in form files --- .github/workflows/main.yml | 3 +++ php/php.blade/licenseinfo.xml | 4 +++- .../editor/ui/customizer/BladeDirectives.form | 17 +++++++++++++++++ .../ui/customizer/BladeGeneralSettings.form | 17 +++++++++++++++++ .../ui/customizer/BladeViewsFoldersPanel.form | 17 +++++++++++++++++ .../resources/NewBladeFileDescription.html | 19 ++++++++++++++++++- .../blade/ui/options/BladeOptionsPanel.form | 17 +++++++++++++++++ 7 files changed, 92 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 706c88fdb4e5..1ad289e13abc 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2420,6 +2420,9 @@ jobs: - name: php.atoum run: ant $OPTS -f php/php.atoum test + - name: php.blade + run: ant $OPTS -f php/php.blade test + - name: php.code.analysis run: ant $OPTS -f php/php.code.analysis test diff --git a/php/php.blade/licenseinfo.xml b/php/php.blade/licenseinfo.xml index b832d133ad7a..d9ccbc4a7538 100644 --- a/php/php.blade/licenseinfo.xml +++ b/php/php.blade/licenseinfo.xml @@ -21,12 +21,14 @@ --> + src/org/netbeans/modules/php/blade/resources/emptyBladeFile.blade.php + src/org/netbeans/modules/php/blade/resources/formattingExample.blade.php src/org/netbeans/modules/php/blade/resources/highlightBlade.blade.php + src/org/netbeans/modules/php/blade/resources/NewBladeFileDescription.html - tools/skeleton.netbeans src/org/netbeans/modules/php/blade/resources/icon.png src/org/netbeans/modules/php/blade/resources/icons/at.png src/org/netbeans/modules/php/blade/resources/icons/blade_file.png diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.form b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.form index b92b5b851cd8..fdee705ee27b 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.form +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeDirectives.form @@ -1,5 +1,22 @@ +
      diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.form b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.form index 6c452fb0787d..6b535800c4d6 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.form +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeGeneralSettings.form @@ -1,5 +1,22 @@ + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.form b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.form index 0fbe951aaca2..0d1b60f1b72a 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.form +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeViewsFoldersPanel.form @@ -1,5 +1,22 @@ + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/NewBladeFileDescription.html b/php/php.blade/src/org/netbeans/modules/php/blade/resources/NewBladeFileDescription.html index 8bc99c49c5ae..64aba5479af0 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/resources/NewBladeFileDescription.html +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/NewBladeFileDescription.html @@ -1,5 +1,22 @@ - + Blade wizard diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.form b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.form index ec263c1cdaf6..9d55b8541585 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.form +++ b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.form @@ -1,5 +1,22 @@ + From 0d4c1a662262a76784cadbe94ad88dce5dac2db7 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Fri, 4 Oct 2024 09:43:31 +0300 Subject: [PATCH 22/43] add brace matcher tests, typinghook tests, removed comments, wip formatter test --- php/php.blade/nbproject/project.xml | 16 +-- .../php/blade/editor/BladeBracesMatcher.java | 2 +- .../php/blade/editor/BladeLanguage.java | 32 ++--- .../completion/BladeCompletionProposal.java | 3 +- .../completion/BladeCompletionProvider.java | 17 ++- .../BladePhpCompletionProvider.java | 55 +++++---- .../completion/PhpCodeCompletionService.java | 6 +- .../editor/directives/CustomDirectives.java | 2 +- .../editor/format/BladeFormatterService.java | 15 +-- .../blade/editor/indexing/IndexManager.java | 2 +- .../blade/editor/indexing/PhpIndexUtils.java | 17 +-- .../php/blade/editor/path/BladePathUtils.java | 6 +- .../BladeTypedTextInterceptor.java | 22 ++-- .../blade/project/BladeProjectProperties.java | 39 +++--- .../php/blade/project/ComponentsSupport.java | 12 +- .../modules/php/blade/syntax/BladeTags.java | 2 +- .../modules/php/blade/syntax/StringUtils.java | 4 +- .../blade/syntax/annotation/Directive.java | 8 +- .../php/blade/syntax/annotation/Tag.java | 4 +- .../blade/ui/options/BladeOptionsPanel.form | 2 + .../blade/ui/options/BladeOptionsPanel.java | 13 +- .../options/BladeOptionsPanelController.java | 17 +-- ...rective_01.testClosedIfDirective_01.braces | 5 + ...ve_01.testClosedSectionDirective_01.braces | 5 + ..._01.testUnClosedSectionDirective_01.braces | 5 + .../testfiles/format/if_block_01.blade.php | 4 + .../format/if_block_01.blade.php.formatted | 4 + .../blade/editor/BladeBracesMatcherTest.java | 111 ++++++++++++++++++ .../editor/format/BladeFormatterTest.java} | 20 ++-- .../editor/format/BladeFormatterTestBase.java | 108 +++++++++++++++++ .../BladeTypedTextInterceptorTest.java | 52 ++++++++ .../typinghooks/BladeTypinghooksTestBase.java | 35 ++++++ 32 files changed, 474 insertions(+), 171 deletions(-) create mode 100644 php/php.blade/test/unit/data/testfiles/braces/testClosedIfDirective_01.testClosedIfDirective_01.braces create mode 100644 php/php.blade/test/unit/data/testfiles/braces/testClosedSectionDirective_01.testClosedSectionDirective_01.braces create mode 100644 php/php.blade/test/unit/data/testfiles/braces/testUnClosedSectionDirective_01.testUnClosedSectionDirective_01.braces create mode 100644 php/php.blade/test/unit/data/testfiles/format/if_block_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/format/if_block_01.blade.php.formatted create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcherTest.java rename php/php.blade/{src/org/netbeans/modules/php/blade/editor/ui/customizer/UiOptionsUtils.java => test/unit/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterTest.java} (73%) create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterTestBase.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptorTest.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypinghooksTestBase.java diff --git a/php/php.blade/nbproject/project.xml b/php/php.blade/nbproject/project.xml index 3c38a4c6735b..3c5e9b333144 100644 --- a/php/php.blade/nbproject/project.xml +++ b/php/php.blade/nbproject/project.xml @@ -246,29 +246,29 @@ - org.netbeans.modules.php.editor + org.netbeans.modules.php.api.editor - 2 - + 0 + 0.52 - org.netbeans.modules.php.api.editor + org.netbeans.modules.php.api.phpmodule - 0 - 0.52 + 2.97 - org.netbeans.modules.php.api.phpmodule + org.netbeans.modules.php.editor - 2.97 + 2 + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java index b222001ff6d9..104c5bdbb2d0 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -271,7 +271,7 @@ private int[] findOriginForDirectiveEnd(String directive) { return null; } - @MimeRegistration(service = BracesMatcherFactory.class, mimeType = BladeLanguage.MIME_TYPE, position = 110) + @MimeRegistration(service = BracesMatcherFactory.class, mimeType = BladeLanguage.MIME_TYPE, position = 0) public static final class Factory implements BracesMatcherFactory { @Override diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java index 4fa2390239f7..68dba851c4cb 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java @@ -56,30 +56,30 @@ * @author Haidu Bogdan */ @MIMEResolver.Registration( - resource = "../resources/mime-resolver.xml", //NOI18N - displayName = "#LBL_Blade_LOADER", //NOI18N + resource = "../resources/mime-resolver.xml", + displayName = "#LBL_Blade_LOADER", position = 1 ) @NbBundle.Messages({ "LBL_Blade_LOADER=Blade template files" }) -@LanguageRegistration(mimeType = "text/x-blade", useMultiview = true) //NOI18N +@LanguageRegistration(mimeType = BladeLanguage.MIME_TYPE, useMultiview = true) @ActionReferences({ - @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.OpenAction"), path = ACTIONS, position = 100), //NOI18N - @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.CutAction"), path = ACTIONS, position = 300, separatorBefore = 200), //NOI18N - @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.CopyAction"), path = ACTIONS, position = 400), //NOI18N - @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.PasteAction"), path = ACTIONS, position = 500, separatorAfter = 600), //NOI18N - @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.NewAction"), path = ACTIONS, position = 700), //NOI18N - @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.DeleteAction"), path = ACTIONS, position = 800), //NOI18N - @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.RenameAction"), path = ACTIONS, position = 900, separatorAfter = 1000), //NOI18N - @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.SaveAsTemplateAction"), path = ACTIONS, position = 1100, separatorAfter = 1200), //NOI18N - @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.FileSystemAction"), path = ACTIONS, position = 1300, separatorAfter = 1400), //NOI18N - @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.ToolsAction"), path = ACTIONS, position = 1500), //NOI18N - @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.PropertiesAction"), path = ACTIONS, position = 1600), //NOI18N - @ActionReference(id = @ActionID(category = "TemplateActions", id = "org.netbeans.modules.php.blade.editor.actions.FindUsage"), //NOI18N + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.OpenAction"), path = ACTIONS, position = 100), + @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.CutAction"), path = ACTIONS, position = 300, separatorBefore = 200), + @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.CopyAction"), path = ACTIONS, position = 400), + @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.PasteAction"), path = ACTIONS, position = 500, separatorAfter = 600), + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.NewAction"), path = ACTIONS, position = 700), + @ActionReference(id = @ActionID(category = "Edit", id = "org.openide.actions.DeleteAction"), path = ACTIONS, position = 800), + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.RenameAction"), path = ACTIONS, position = 900, separatorAfter = 1000), + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.SaveAsTemplateAction"), path = ACTIONS, position = 1100, separatorAfter = 1200), + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.FileSystemAction"), path = ACTIONS, position = 1300, separatorAfter = 1400), + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.ToolsAction"), path = ACTIONS, position = 1500), + @ActionReference(id = @ActionID(category = "System", id = "org.openide.actions.PropertiesAction"), path = ACTIONS, position = 1600), + @ActionReference(id = @ActionID(category = "TemplateActions", id = "org.netbeans.modules.php.blade.editor.actions.FindUsage"), path = ACTIONS, separatorBefore = 1700, position = 1800), - @ActionReference(id = @ActionID(category = "System", id = "org.netbeans.modules.php.blade.editor.actions.AntlrDebug"), path = ACTIONS, position = 1900), //NOI18N + @ActionReference(id = @ActionID(category = "System", id = "org.netbeans.modules.php.blade.editor.actions.AntlrDebug"), path = ACTIONS, position = 1900), } ) public class BladeLanguage extends DefaultLanguageConfig { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java index a2f2a2729694..c415eb89406c 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java @@ -28,6 +28,7 @@ import org.netbeans.modules.csl.api.HtmlFormatter; import org.netbeans.modules.csl.api.Modifier; import org.netbeans.modules.php.blade.csl.elements.ClassElement; +import org.netbeans.modules.php.blade.editor.EditorStringUtils; import org.netbeans.modules.php.blade.editor.ResourceUtilities; import org.netbeans.modules.php.blade.syntax.BladeDirectivesUtils; import org.netbeans.modules.php.blade.syntax.annotation.Directive; @@ -224,7 +225,7 @@ public int getSortPrioOverride() { @Override public String getCustomInsertTemplate() { if (namespace != null && namespace.length() > 0) { - return "\\" + namespace + "\\" + getElement().getName(); // NOI18N + return EditorStringUtils.NAMESPACE_SEPARATOR + namespace + EditorStringUtils.NAMESPACE_SEPARATOR + getElement().getName(); // NOI18N } return getElement().getName(); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java index f79e213448c8..bb44247f1447 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java @@ -60,12 +60,13 @@ * * @author bhaidu */ -@MimeRegistrations(value = { +@MimeRegistrations({ @MimeRegistration(mimeType = "text/html", service = CompletionProvider.class), @MimeRegistration(mimeType = BladeLanguage.MIME_TYPE, service = CompletionProvider.class) }) public class BladeCompletionProvider implements CompletionProvider { + public static final int MIN_COMPONENT_PREFIX_LENGTH = 3; private static final Logger LOGGER = Logger.getLogger(BladeCompletionProvider.class.getName()); public enum CompletionType { @@ -98,14 +99,10 @@ public int getAutoQueryTypes(JTextComponent component, String typedText) { } char lastChar = typedText.charAt(typedText.length() - 1); - switch (lastChar) { - case ')': - case '\n': - case '<': - case '>': - return 0; - } - return COMPLETION_QUERY_TYPE; + return switch (lastChar) { + case ')', '\n', '<', '>' -> 0; + default -> COMPLETION_QUERY_TYPE; + }; } private class BladeCompletionQuery extends AsyncCompletionQuery { @@ -172,7 +169,7 @@ protected void query(CompletionResultSet resultSet, Document doc, int caretOffse } } case HTML_COMPONENT_PREFIX -> { - String compPrefix = currentToken.getText().length() > 3 ? StringUtils.kebabToCamel(currentToken.getText().substring(3)) : ""; + String compPrefix = currentToken.getText().length() > MIN_COMPONENT_PREFIX_LENGTH ? StringUtils.kebabToCamel(currentToken.getText().substring(MIN_COMPONENT_PREFIX_LENGTH)) : ""; // NOI18N completeComponents(compPrefix, fo, caretOffset, resultSet); } case D_UNKNOWN_ATTR_ENC -> completeDirectives(currentToken.getText(), doc, caretOffset, resultSet); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java index 8f248c5f8cc7..3cd99e7f83f7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java @@ -44,6 +44,7 @@ import org.netbeans.modules.php.blade.editor.lexer.BladeLexerUtils; import org.netbeans.modules.php.blade.editor.path.BladePathUtils; import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.netbeans.modules.php.blade.syntax.StringUtils; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrUtils; import org.netbeans.spi.editor.completion.CompletionItem; @@ -61,9 +62,8 @@ * * @author bhaidu */ -@MimeRegistrations(value = { - @MimeRegistration(mimeType = FileUtils.PHP_MIME_TYPE, service = CompletionProvider.class, position = 102), -} +@MimeRegistrations({ + @MimeRegistration(mimeType = FileUtils.PHP_MIME_TYPE, service = CompletionProvider.class, position = 102),} ) public class BladePhpCompletionProvider implements CompletionProvider { @@ -104,8 +104,10 @@ public int getAutoQueryTypes(JTextComponent component, String typedText) { char lastChar = typedText.charAt(typedText.length() - 1); return switch (lastChar) { - case ')', '\n', '<', '>' -> 0; - default -> COMPLETION_QUERY_TYPE; + case ')', '\n', '<', '>' -> + 0; + default -> + COMPLETION_QUERY_TYPE; }; } @@ -172,7 +174,7 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse } switch (currentToken.getType()) { - case BL_PARAM_STRING -> { + case BL_PARAM_STRING -> { String pathName = EditorStringUtils.stripSurroundingQuotes(currentToken.getText()); Set tokensToMatch = BladeLexerUtils.TOKENS_WITH_IDENTIFIABLE_PARAM; Set tokensStop = new HashSet<>(Arrays.asList(new Integer[]{HTML, BL_COMMA, BL_PARAM_CONCAT_OPERATOR})); @@ -207,22 +209,25 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse completeBladePath(pathFileName, file, pathOffset, resultSet); } return; - } - case D_SECTION, D_HAS_SECTION -> completeYieldIdFromIndex(pathName, fo, caretOffset, resultSet); - case D_PUSH, D_PUSH_IF, D_PREPEND -> completeStackIdFromIndex(pathName, fo, caretOffset, resultSet); + } + case D_SECTION, D_HAS_SECTION -> + completeYieldIdFromIndex(pathName, fo, caretOffset, resultSet); + case D_PUSH, D_PUSH_IF, D_PREPEND -> + completeStackIdFromIndex(pathName, fo, caretOffset, resultSet); } } - case EXPR_STRING -> { + case EXPR_STRING -> { String pathName = EditorStringUtils.stripSurroundingQuotes(currentToken.getText()); if (!pathName.contains(BladePathUtils.LARAVEL_RESOURCES)) { } - int lastSlash = pathName.lastIndexOf("/"); + int lastSlash = pathName.lastIndexOf(StringUtils.FORWARD_SLASH); FileObject projectDir = ProjectUtils.getProjectDirectory(fo); if (projectDir == null) { + break; } int pathOffset = caretOffset - pathName.length(); @@ -242,9 +247,10 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse if (isJsPath) { FileObject jsFolder = projectDir.getFileObject(JS_ASSET_FOLDER); if (jsFolder == null || !jsFolder.isValid()) { + break; } for (FileObject file : jsFolder.getChildren()) { - String jsPath = JS_ASSET_FOLDER + "/" + file.getNameExt(); + String jsPath = JS_ASSET_FOLDER + StringUtils.FORWARD_SLASH + file.getNameExt(); if (jsPath.startsWith(pathName)) { addAssetPathCompletionItem(jsPath, file.getPath(), pathOffset, resultSet, CompletionType.JS_FILE); } @@ -253,9 +259,10 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse if (isCssPath) { FileObject cssFolder = projectDir.getFileObject(CSS_ASSET_FOLDER); if (cssFolder == null || !cssFolder.isValid()) { + break; } for (FileObject file : cssFolder.getChildren()) { - String jsPath = CSS_ASSET_FOLDER + "/" + file.getNameExt(); + String jsPath = CSS_ASSET_FOLDER + StringUtils.FORWARD_SLASH + file.getNameExt(); if (jsPath.startsWith(pathName)) { addAssetPathCompletionItem(jsPath, file.getPath(), pathOffset, resultSet, CompletionType.CSS_FILE); } @@ -263,6 +270,7 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse } } default -> { + //skip any action } } } @@ -340,17 +348,16 @@ private void addAssetPathCompletionItem(String preview, String info, } private static String getReferenceIcon(CompletionType type) { - - switch (type) { - case FOLDER: - return ResourceUtilities.FOLDER; // NOI18N - case CSS_FILE: - return "org/netbeans/modules/css/visual/resources/style_sheet_16.png"; // NOI18N - case JS_FILE: - return "org/netbeans/modules/javascript2/editor/resources/javascript.png"; // NOI18N - } - return ResourceUtilities.LAYOUT_IDENTIFIER; //NOI18N - + return switch (type) { + case FOLDER -> + ResourceUtilities.FOLDER; + case CSS_FILE -> + "org/netbeans/modules/css/visual/resources/style_sheet_16.png"; // NOI18N + case JS_FILE -> + "org/netbeans/modules/javascript2/editor/resources/javascript.png"; // NOI18N + default -> + ResourceUtilities.LAYOUT_IDENTIFIER; + }; } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java index f91f70e8cdbd..630fe4dab509 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java @@ -138,7 +138,7 @@ public static void completePhpCode(final List completionProp if (elementReference.namespace != null) { String classQuery = prefix; String namespace = elementReference.namespace; - int substringStartOffset = namespace.startsWith("\\") ? 1 : 0; + int substringStartOffset = namespace.startsWith(EditorStringUtils.NAMESPACE_SEPARATOR) ? 1 : 0; String namespacePath = namespace.substring(substringStartOffset) + classQuery; Collection indexedNamespaces = PhpIndexUtils.queryNamespaces( fo, namespacePath, QuerySupport.Kind.PREFIX @@ -150,9 +150,9 @@ public static void completePhpCode(final List completionProp completionProposals.add(new BladeCompletionProposal.NamespaceItem( namespaceElement(indexResult), anchorOffset, indexResult.name)); } - } else if (prefix.endsWith("\\")) { + } else if (prefix.endsWith(EditorStringUtils.NAMESPACE_SEPARATOR)) { //the identifier is the namespace - int substringOffset = elementReference.identifier.startsWith("\\") ? 1 : 0; + int substringOffset = elementReference.identifier.startsWith(EditorStringUtils.NAMESPACE_SEPARATOR) ? 1 : 0; String namespacePath = elementReference.identifier.substring(substringOffset, elementReference.identifier.length() - 1); Collection indexClassResults = PhpIndexUtils.queryAllNamespaceClasses(fo, namespacePath); int anchorOffset = computeAnchorOffset(namespacePath, offset + namespacePath.length()); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java index d6cbc41a7a00..82141ef945a3 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java @@ -89,7 +89,7 @@ private CustomDirectives(Project project) { private void extractCustomDirectives() { LOGGER.info("Extracting custom directives"); - String[] compilerPathList = BladeProjectProperties.getInstance(project).getCompilerPathList(); + String[] compilerPathList = BladeProjectProperties.getInstance(project).getDirectiveRegistrationsPathList(); FileObject defaultAppProvider = project.getProjectDirectory().getFileObject("app/Providers/AppServiceProvider.php"); // NOI18N String defaultAppPath = ""; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterService.java index 8bc9edf32a01..566af88e242d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterService.java @@ -73,38 +73,25 @@ public void format(Context context, String text, int indentSize) { break; } if (tstart > cend) { -// System.out.println("exit " + tstart + " > " + cend); -// System.out.println("line : " + entry.getKey() + " ei " + existingLineIndent); -// System.out.println("token : " + entry.getValue()); -// System.out.println("Finished formatting for caret " + cstart); break; } } if (tstart >= cstart) { -// System.out.println("doc length : " + context.document().getLength()); -// System.out.println("delta : " + (tstart - textDelta)); if (context.document().getLength() < (tstart - textDelta)) { //skipping continue; } -// System.out.println("line : " + entry.getKey()); -// System.out.println("token : " + entry.getValue()); -// System.out.println("indent : " + indent); -// System.out.println("htmlindent : " + htmlIndent); try { int lineStart_i = context.lineStartOffset(tstart - textDelta); int originalIndent_i = context.lineIndent(lineStart_i); int wsIndent = (indent + htmlIndent) * indentSize; -// System.out.println("linestart + offset : " + (lineStart_i + wsIndent)); + if (lineStart_i + wsIndent > context.document().getLength()) { -// System.out.println("out of range : " + (lineStart_i + wsIndent)); break; } context.modifyIndent(lineStart_i, wsIndent); -// System.out.println("delta : " + (originalIndent_i - wsIndent)); -// System.out.println("===================================="); textDelta += (originalIndent_i - wsIndent); } catch (BadLocationException ex) { Exceptions.printStackTrace(ex); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/IndexManager.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/IndexManager.java index 701b1c268db6..ad978bedf16c 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/IndexManager.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/IndexManager.java @@ -34,7 +34,7 @@ public class IndexManager { public static void reindexProjectViews(Project project) { assert project != null; - String[] views = BladeProjectProperties.getInstance(project).getViewsPathList(); + String[] views = BladeProjectProperties.getInstance(project).getViewsFolderPathList(); if (views.length > 0) { for (String view : views) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java index 534c737512ed..0be45ca0f1d7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java @@ -49,6 +49,7 @@ public final class PhpIndexUtils { private final static QueryCache> cache = new QueryCache(); private final static QueryCache> functionCache = new QueryCache(); + public static final int MIN_NAMESPACE_PREFIX_LENGTH = 3; private static final Map QUERY_SUPPORT_INSTANCES = new WeakHashMap<>(); private PhpIndexUtils() { @@ -380,7 +381,7 @@ public static Collection queryClassMethods(FileObject fo QuerySupport phpindex = QuerySupportFactory.get(fo); Collection results = new ArrayList<>(); String queryNamespacePath = queryNamespace; - if (queryNamespace != null && queryNamespace.length() > 3) { + if (queryNamespace != null && queryNamespace.length() > MIN_NAMESPACE_PREFIX_LENGTH) { queryNamespacePath = EditorStringUtils.trimNamespace(queryNamespace); } //should query the class befoe @@ -410,7 +411,7 @@ public static Collection queryClassMethods(FileObject fo } if (namespace.length() > 0) { - classNamespace = namespace + "\\" + className; + classNamespace = namespace + EditorStringUtils.NAMESPACE_SEPARATOR + className; } } } @@ -746,7 +747,7 @@ static List parseParameters(final String signature) { } /** - * TODO improve the function param parsing + * * * @param sig * @return @@ -757,16 +758,6 @@ static String parseOneParameter(String sig) { String[] parts = sig.split(regexp); if (parts.length > 0) { String paramName = parts[0]; - boolean isRawType = Integer.parseInt(parts[2]) > 0; - boolean isMandatory = Integer.parseInt(parts[4]) > 0; - boolean isReference = Integer.parseInt(parts[5]) > 0; - boolean isVariadic = Integer.parseInt(parts[6]) > 0; - boolean isUnionType = Integer.parseInt(parts[7]) > 0; - int modifier = Integer.parseInt(parts[8]); - boolean isIntersectionType = Integer.parseInt(parts[9]) > 0; - String defValue = parts.length > 3 ? parts[3] : null; - String declaredType = parts.length > 10 ? parts[10] : null; - String phpdocType = parts.length > 11 ? parts[11] : null; retval = paramName; } return retval; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java index 05d10e00d11a..b4aca72b9f11 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java @@ -169,7 +169,7 @@ public static List getParentChildrenFromPrefixPath(FileObject contex relativePrefixToCompare = unixPath; } - if (unixPath.endsWith("/")) { + if (unixPath.endsWith(StringUtils.FORWARD_SLASH)) { //add children for (FileObject rootFolder : filteredViewRoots) { list.addAll(Arrays.asList(rootFolder.getChildren())); @@ -205,7 +205,7 @@ public static List getParentChildrenFromPrefixPath(FileObject contex public static List getCustomViewsRoots(Project project, FileObject contextFile) { List list = new ArrayList<>(); - String[] views = BladeProjectProperties.getInstance(project).getViewsPathList(); + String[] views = BladeProjectProperties.getInstance(project).getViewsFolderPathList(); if (views.length > 0) { views = Arrays.stream(views).filter(s -> !s.isEmpty()).toArray(String[]::new); @@ -255,7 +255,7 @@ public static String toBladeViewPath(FileObject file) { } } - String[] viewFolders = BladeProjectProperties.getInstance(project).getViewsPathList(); + String[] viewFolders = BladeProjectProperties.getInstance(project).getViewsFolderPathList(); for (String viewFolder : viewFolders) { if (viewFolder.length() == 0) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java index e8f3101998b9..ae7550158462 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java @@ -29,15 +29,13 @@ import org.netbeans.api.lexer.Token; import org.netbeans.api.lexer.TokenHierarchy; import org.netbeans.api.lexer.TokenSequence; -import org.netbeans.modules.php.blade.editor.BladeCommentHandler; import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; import static org.netbeans.modules.php.blade.editor.lexer.BladeTokenId.HTML; -import static org.netbeans.modules.php.blade.editor.lexer.BladeTokenId.BLADE_COMMENT; import org.netbeans.modules.php.blade.editor.preferences.ModulePreferences; import org.netbeans.spi.editor.typinghooks.TypedTextInterceptor; /** - * auto complete for '[', '(', '\'', '"' + * auto complete for '[', '(', '\'', '"' and blade tags * * @author bhaidu */ @@ -93,7 +91,7 @@ public void insert(MutableContext context) throws BadLocationException { int offset = context.getOffset(); - if (offset < 2) { + if (offset < 1) { return; } @@ -113,7 +111,8 @@ public void insert(MutableContext context) throws BadLocationException { String tokenText = token.text().toString(); - if (bladeToken.equals(HTML)) { + if (bladeToken.equals(HTML) + || tokenText.equals("{{") && ch == '-') { // NOI18N completeFromHtmlFragments(tokenText, context, tagType); } } @@ -167,8 +166,10 @@ private void completeFromHtmlFragments(String tokenText, MutableContext context, completeContentTag(context, tagType); case "{!" -> // NOI18N completeRawContentTag(context, tagType); + case "{{" -> // NOI18N + completeCommenTag(context, tagType, "-- --}}"); case "{{-" -> // NOI18N - completeCommenTag(context, tagType); + completeCommenTag(context, tagType, "- --}}"); } } @@ -186,17 +187,14 @@ private void completeRawContentTag(MutableContext context, TagType tagType) { context.setText("! !!}", 1);// NOI18N } - private void completeCommenTag(MutableContext context, TagType tagType) { + private void completeCommenTag(MutableContext context, TagType tagType, String completeText) { if (tagType != TagType.COMMENT) { return; } - context.setText("- --}}", 1);// NOI18N + context.setText(completeText, 1);// NOI18N } - /** - * register for HTML also - */ - @MimeRegistrations(value = { + @MimeRegistrations({ @MimeRegistration(mimeType = BladeLanguage.MIME_TYPE, service = TypedTextInterceptor.Factory.class), @MimeRegistration(mimeType = "text/html", service = TypedTextInterceptor.Factory.class) }) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java index b1d91977a230..238ee06029da 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java @@ -18,6 +18,8 @@ */ package org.netbeans.modules.php.blade.project; +import java.util.Collections; +import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; @@ -27,7 +29,6 @@ import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectUtils; -import org.netbeans.modules.php.blade.editor.ui.customizer.UiOptionsUtils; import org.openide.util.NbPreferences; /** @@ -48,6 +49,9 @@ public final class BladeProjectProperties { private DefaultListModel viewsPathList = new DefaultListModel(); // enable declaration finder outside of framework plugin private final AtomicBoolean nonLaravelDeclFinder = new AtomicBoolean(false); + + // the pipe "|" char needs to be escaped + public static final String ESCAPED_VIEW_PATH_SEPARATOR = "\\|"; // NOI18N private BladeProjectProperties(Project project) { this.project = project; @@ -81,12 +85,12 @@ private void initModelsFromPreferences() { } public void storeDirectiveCustomizerPaths() { - String includePath = UiOptionsUtils.encodeToStrings(directiveCustomizerPathList.elements()); + String includePath = encodeToStrings(directiveCustomizerPathList.elements()); getPreferences().put(DIRECTIVE_CUSTOMIZER_PATH_LIST, includePath); } public void storeViewsPaths() { - String includePath = UiOptionsUtils.encodeToStrings(viewsPathList.elements()); + String includePath = encodeToStrings(viewsPathList.elements()); getPreferences().put(VIEW_PATH_LIST, includePath); } @@ -112,16 +116,16 @@ public void removeViewsPath(int index) { } public void setViewsPathList(DefaultListModel list) { - String includePath = UiOptionsUtils.encodeToStrings(list.elements()); + String includePath = encodeToStrings(list.elements()); getPreferences().put(VIEW_PATH_LIST, includePath); } public DefaultListModel createModelForDirectiveCusomizerPathList() { - return creatModelFromPreferences(DIRECTIVE_CUSTOMIZER_PATH_LIST); + return createFilePathModelFromPreferences(DIRECTIVE_CUSTOMIZER_PATH_LIST); } public DefaultListModel createModelForViewsPathList() { - return creatModelFromPreferences(VIEW_PATH_LIST); + return createFilePathModelFromPreferences(VIEW_PATH_LIST); } public DefaultListModel getModelForDirectiveCusomizerPathList() { @@ -136,13 +140,13 @@ public boolean getNonLaravelDeclFinderFlag() { return nonLaravelDeclFinder.get(); } - private DefaultListModel creatModelFromPreferences(String pathName) { + private DefaultListModel createFilePathModelFromPreferences(String pathName) { DefaultListModel model = new DefaultListModel<>(); String encodedCompilerPathList = getPreferences().get(pathName, null); String[] paths; if (encodedCompilerPathList != null) { - paths = encodedCompilerPathList.split("\\|", -1); // NOI18N + paths = encodedCompilerPathList.split(ESCAPED_VIEW_PATH_SEPARATOR, -1); } else { return model; } @@ -157,20 +161,20 @@ private DefaultListModel creatModelFromPreferences(String pathName) { return model; } - public String[] getCompilerPathList() { - String encodedCompilerPathList = getPreferences().get(DIRECTIVE_CUSTOMIZER_PATH_LIST, null); + public String[] getDirectiveRegistrationsPathList() { + String encodedDirectiveRegistrationPathList = getPreferences().get(DIRECTIVE_CUSTOMIZER_PATH_LIST, null); String[] paths = new String[]{}; - if (encodedCompilerPathList != null) { - return encodedCompilerPathList.split("\\|", -1); // NOI18N + if (encodedDirectiveRegistrationPathList != null) { + return encodedDirectiveRegistrationPathList.split(ESCAPED_VIEW_PATH_SEPARATOR, -1); } return paths; } - public String[] getViewsPathList() { - String encodedCompilerPathList = getPreferences().get(VIEW_PATH_LIST, null); + public String[] getViewsFolderPathList() { + String encodedViewsFolderPathList = getPreferences().get(VIEW_PATH_LIST, null); String[] paths = new String[]{}; - if (encodedCompilerPathList != null) { - return encodedCompilerPathList.split("\\|", -1); // NOI18N + if (encodedViewsFolderPathList != null) { + return encodedViewsFolderPathList.split(ESCAPED_VIEW_PATH_SEPARATOR, -1); } return paths; } @@ -183,4 +187,7 @@ public void removePreferenceChangeListener(PreferenceChangeListener preferenceCh getPreferences().removePreferenceChangeListener(preferenceChangeListener); } + public static String encodeToStrings(Enumeration list) { + return String.join(ESCAPED_VIEW_PATH_SEPARATOR, Collections.list(list)); + } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java index 4c83efd79ce4..585e6d518acb 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java @@ -30,12 +30,12 @@ * @author bogdan */ @NamespaceRegister({ - @Namespace(path = "App\\View\\Components", fromApp = true, relativeFilePath = "app/View/Components"), // NOI18N - @Namespace(path = "App\\Http\\Livewire", fromApp = true, relativeFilePath = "app/Http/Livewire"), // NOI18N - @Namespace(path = "App\\Livewire", fromApp = true, relativeFilePath = "app/Livewire"), // NOI18N - @Namespace(path = "Illuminate\\Console\\View\\Components"), // NOI18N - @Namespace(path = "BladeUI\\Icons\\Components", packageName = "blade-ui-kit/blade-icons"), // NOI18N - @Namespace(path = "BladeUIKit\\Components", packageName = "blade-ui-kit/blade-ui-kit"),}) // NOI18N + @Namespace(path = "App\\View\\Components", fromApp = true, relativeFilePath = "app/View/Components"), + @Namespace(path = "App\\Http\\Livewire", fromApp = true, relativeFilePath = "app/Http/Livewire"), + @Namespace(path = "App\\Livewire", fromApp = true, relativeFilePath = "app/Livewire"), + @Namespace(path = "Illuminate\\Console\\View\\Components"), + @Namespace(path = "BladeUI\\Icons\\Components", packageName = "blade-ui-kit/blade-icons"), + @Namespace(path = "BladeUIKit\\Components", packageName = "blade-ui-kit/blade-ui-kit"),}) public class ComponentsSupport { public static final String LIVEWIRE_NAME = "livewire"; // NOI18N diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTags.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTags.java index 3b24488e4023..757ffa5a32ad 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTags.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTags.java @@ -28,7 +28,7 @@ @TagRegister({ @Tag(openTag = "{{", closeTag = "}}", description = "regular echo", position=0), @Tag(openTag = "{!!", closeTag = "!!}", description = "raw echo", position=1), - @Tag(openTag = "{{--", closeTag = "--}}", description = "comment", position=2) + @Tag(openTag = "{{--", closeTag = "--}}", description = "comment", position=2), }) public class BladeTags { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java index bfd222d49388..33e06e448fc2 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java @@ -24,7 +24,7 @@ */ public final class StringUtils { - public static final String DOT = "."; + public static final String DOT = "."; //NOI18N public static final String FORWARD_SLASH = "/"; //NOI18N private StringUtils() { @@ -52,7 +52,7 @@ public static String capitalize(String str) { } public static String toKebabCase(String str) { - return str.replaceAll("([A-Z])", "-$1").toLowerCase().substring(1); + return str.replaceAll("([A-Z])", "-$1").toLowerCase().substring(1); // NOI18N } public static String kebabToCamel(String str) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Directive.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Directive.java index e2e2057f69fc..3af6eaafe76e 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Directive.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Directive.java @@ -25,9 +25,9 @@ public @interface Directive { String name(); boolean params() default false; - String endtag() default ""; + String endtag() default ""; //NOI18N String[] endTags() default {}; - String description() default ""; - String category() default ""; - String since() default ""; + String description() default ""; //NOI18N + String category() default ""; //NOI18N + String since() default ""; //NOI18N } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Tag.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Tag.java index 70187a3abb60..360ce94122d9 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Tag.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/Tag.java @@ -24,7 +24,7 @@ */ public @interface Tag { String openTag(); - String closeTag() default ""; - String description() default ""; + String closeTag() default ""; //NOI18N + String description() default ""; //NOI18N int position() default 0; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.form b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.form index 9d55b8541585..1fa124a33534 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.form +++ b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.form @@ -1,4 +1,5 @@ + + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.java b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.java index ca6bbd80d2da..bb35eedbb1e0 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanel.java @@ -29,17 +29,14 @@ */ @OptionsPanelController.Keywords( keywords = { - "php", "twig" + "php" // NOI18N }, location = UiUtils.OPTIONS_PATH, - tabTitle = "Laravel tab" + tabTitle = "Laravel tab" // NOI18N ) public class BladeOptionsPanel extends javax.swing.JPanel { - private final BladeOptionsPanelController controller; - - BladeOptionsPanel(BladeOptionsPanelController controller) { - this.controller = controller; + BladeOptionsPanel() { initComponents(); } @@ -89,10 +86,6 @@ void store() { ModulePreferences.setPrefBoolean(GeneralPreferencesUtils.ENABLE_AUTO_TAG_COMPLETION, this.auto_tag_completion.isSelected()); } - void cancel() { - //throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody - } - boolean valid() { return true; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java index 8b6edf154758..c934f9641396 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java @@ -28,7 +28,7 @@ @UiUtils.PhpOptionsPanelRegistration( id = BladeOptionsPanelController.ID, - displayName = "Blade", + displayName = "Blade", // NOI18N position = 2150 ) public class BladeOptionsPanelController extends OptionsPanelController { @@ -38,23 +38,20 @@ public class BladeOptionsPanelController extends OptionsPanelController { private BladeOptionsPanel panel; private final PropertyChangeSupport pcs = new PropertyChangeSupport(this); - private volatile boolean changed; @Override public void update() { getPanel().load(); - changed = false; } @Override public void applyChanges() { getPanel().store(); - changed = false; } @Override public void cancel() { - getPanel().cancel(); + //no action } @Override @@ -89,19 +86,11 @@ public void removePropertyChangeListener(PropertyChangeListener l) { private BladeOptionsPanel getPanel() { if (panel == null) { - panel = new BladeOptionsPanel(this); + panel = new BladeOptionsPanel(); } return panel; } - void changed() { - if (!changed) { - changed = true; - pcs.firePropertyChange(OptionsPanelController.PROP_CHANGED, false, true); - } - pcs.firePropertyChange(OptionsPanelController.PROP_VALID, null, null); - } - public static String getOptionsPath() { return UiUtils.OPTIONS_PATH + "/" + OPTIONS_SUBPATH; // NOI18N } diff --git a/php/php.blade/test/unit/data/testfiles/braces/testClosedIfDirective_01.testClosedIfDirective_01.braces b/php/php.blade/test/unit/data/testfiles/braces/testClosedIfDirective_01.testClosedIfDirective_01.braces new file mode 100644 index 000000000000..7834820e2ca9 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/braces/testClosedIfDirective_01.testClosedIfDirective_01.braces @@ -0,0 +1,5 @@ + +*@if*($x) +text +*@end^if* + \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/braces/testClosedSectionDirective_01.testClosedSectionDirective_01.braces b/php/php.blade/test/unit/data/testfiles/braces/testClosedSectionDirective_01.testClosedSectionDirective_01.braces new file mode 100644 index 000000000000..5cd7ccba213e --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/braces/testClosedSectionDirective_01.testClosedSectionDirective_01.braces @@ -0,0 +1,5 @@ + +*@sec^tion*($x) +text +*@endsection* + \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/braces/testUnClosedSectionDirective_01.testUnClosedSectionDirective_01.braces b/php/php.blade/test/unit/data/testfiles/braces/testUnClosedSectionDirective_01.testUnClosedSectionDirective_01.braces new file mode 100644 index 000000000000..fc61ba33fed6 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/braces/testUnClosedSectionDirective_01.testUnClosedSectionDirective_01.braces @@ -0,0 +1,5 @@ + +*@sec^tion*($x) +text +@endsec + \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/format/if_block_01.blade.php b/php/php.blade/test/unit/data/testfiles/format/if_block_01.blade.php new file mode 100644 index 000000000000..ea4a045ce5c3 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/format/if_block_01.blade.php @@ -0,0 +1,4 @@ +@if($x) +@if($y) +@endif +@endif \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/format/if_block_01.blade.php.formatted b/php/php.blade/test/unit/data/testfiles/format/if_block_01.blade.php.formatted new file mode 100644 index 000000000000..ea4a045ce5c3 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/format/if_block_01.blade.php.formatted @@ -0,0 +1,4 @@ +@if($x) +@if($y) +@endif +@endif \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcherTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcherTest.java new file mode 100644 index 000000000000..388278f124d6 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcherTest.java @@ -0,0 +1,111 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import java.util.Arrays; +import java.util.Collections; +import org.netbeans.api.editor.mimelookup.MimeLookup; +import org.netbeans.editor.BaseDocument; +import org.netbeans.modules.editor.bracesmatching.api.BracesMatchingTestUtils; +import org.netbeans.spi.editor.bracesmatching.BracesMatcher; +import org.netbeans.spi.editor.bracesmatching.BracesMatcherFactory; +import org.netbeans.spi.editor.bracesmatching.MatcherContext; + +/** + * + * + */ +public class BladeBracesMatcherTest extends BladeTestBase { + + public BladeBracesMatcherTest(String testName) { + super(testName); + } + + public void testClosedIfDirective_01() throws Exception { + testMatches("\n" + + "@if($x)\n" + + "text\n" + + "@end^if\n" + + ""); + } + + public void testClosedSectionDirective_01() throws Exception { + testMatches("\n" + + "@sec^tion($x)\n" + + "text\n" + + "@endsection\n" + + ""); + } + + public void testUnclosedSectionDirective_01() throws Exception { + testMatches("\n" + + "@sec^tion($x)\n" + + "text\n" + + "@endsec\n" + + ""); + } + + private void testMatches(String original) throws Exception { + BracesMatcherFactory factory = MimeLookup.getLookup(getPreferredMimeType()).lookup(BracesMatcherFactory.class); + int caretPosition = original.indexOf('^'); + assert caretPosition != -1; + original = original.substring(0, caretPosition) + original.substring(caretPosition + 1); + + BaseDocument doc = getDocument(original); + + MatcherContext context = BracesMatchingTestUtils.createMatcherContext(doc, caretPosition, false, 1); + BracesMatcher matcher = factory.createMatcher(context); + int[] origin = null, matches = null; + try { + origin = matcher.findOrigin(); + matches = matcher.findMatches(); + } catch (InterruptedException ex) { + } + + assertNotNull("Did not find origin", origin); + assertEquals("Wrong origin length", 2, origin.length); + + int matchesLength = 0; + if (matches != null) { + matchesLength = matches.length; + } + int[] boundaries = new int[origin.length + matchesLength]; + System.arraycopy(origin, 0, boundaries, 0, origin.length); + if (matchesLength != 0) { + System.arraycopy(matches, 0, boundaries, origin.length, matches.length); + } + + Integer[] boundariesIntegers = new Integer[boundaries.length]; + for (int i = 0; i < boundaries.length; i++) { + boundariesIntegers[i] = boundaries[i]; + } + Arrays.sort(boundariesIntegers, Collections.reverseOrder()); + String expected = original; + boolean caretInserted = false; + for (int i : boundariesIntegers) { + if (i <= caretPosition && !caretInserted) { + expected = expected.substring(0, caretPosition) + "^" + expected.substring(caretPosition); + caretInserted = true; + } + expected = expected.substring(0, i) + "*" + expected.substring(i); + } + assertDescriptionMatches("testfiles/braces/" + getName(), expected, true, ".braces", false); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UiOptionsUtils.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterTest.java similarity index 73% rename from php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UiOptionsUtils.java rename to php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterTest.java index fb8a7989e195..9cba5c68d8d6 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UiOptionsUtils.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterTest.java @@ -16,19 +16,21 @@ * specific language governing permissions and limitations * under the License. */ -package org.netbeans.modules.php.blade.editor.ui.customizer; - -import java.util.Collections; -import java.util.Enumeration; +package org.netbeans.modules.php.blade.editor.format; /** * - * @author bhaidu + * */ -public class UiOptionsUtils { - - public static String encodeToStrings(Enumeration list) { - return String.join("|", Collections.list(list)); +public class BladeFormatterTest extends BladeFormatterTestBase { + + public BladeFormatterTest(String testName) { + super(testName); } + + public void testIfBlockFormat_01() throws Exception{ + format("if_block_01"); + } + } diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterTestBase.java new file mode 100644 index 000000000000..52446f6595f2 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterTestBase.java @@ -0,0 +1,108 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.format; + +import javax.swing.text.Document; +import org.netbeans.api.html.lexer.HTMLTokenId; +import org.netbeans.api.lexer.Language; +import org.netbeans.editor.BaseDocument; +import org.netbeans.lib.lexer.test.TestLanguageProvider; +import org.netbeans.modules.csl.api.Formatter; +import org.netbeans.modules.csl.api.test.CslTestBase.IndentPrefs; +import org.netbeans.modules.php.blade.editor.BladeTestBase; +import org.openide.cookies.EditorCookie; +import org.openide.filesystems.FileObject; +import org.openide.loaders.DataObject; +import org.openide.util.Lookup; +import org.openide.util.test.MockLookup; + +/** + * + * + */ +public abstract class BladeFormatterTestBase extends BladeTestBase { + + public BladeFormatterTestBase(String testName) { + super(testName); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + MockLookup.setInstances(new TestLanguageProvider()); + + // AbstractIndenter.inUnitTestRun = true; + + // init TestLanguageProvider + assert Lookup.getDefault().lookup(TestLanguageProvider.class) != null; + + try { + TestLanguageProvider.register(HTMLTokenId.language()); + } catch (IllegalStateException ise) { + // Ignore -- we've already registered this either via layers or other means + } + try { + TestLanguageProvider.register(getPreferredLanguage().getLexerLanguage()); + } catch (IllegalStateException ise) { + // Ignore -- we've already registered this either via layers or other means + } + } + + @Override + protected BaseDocument getDocument(FileObject fo, String mimeType, Language language) { + // for some reason GsfTestBase is not using DataObjects for BaseDocument construction + // which means that for example Java formatter which does call EditorCookie to retrieve + // document will get difference instance of BaseDocument for indentation + try { + DataObject dobj = DataObject.find(fo); + assertNotNull(dobj); + EditorCookie ec = dobj.getLookup().lookup(EditorCookie.class); + assertNotNull(ec); + return (BaseDocument) ec.openDocument(); + } catch (Exception ex) { + fail(ex.toString()); + return null; + } + } + + @Override + protected void configureIndenters(Document document, Formatter formatter, boolean indentOnly, String mimeType) { + // override it because It's already done in setUp() + } + + @Override + public Formatter getFormatter(IndentPrefs preferences) { + return new BladeFormatter(); + } + + @Override + protected boolean runInEQ() { + return true; + } + + protected void format(String fileName) throws Exception { + format(fileName, new IndentPrefs(4, 4)); + } + + protected void format(String fileName, IndentPrefs indentPreferences) throws Exception { + assert fileName != null; + reformatFileContents("testfiles/format/" + fileName + ".blade.php", indentPreferences); //NOI18N + } + +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptorTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptorTest.java new file mode 100644 index 000000000000..0767bc96c345 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptorTest.java @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.typinghooks; + +public class BladeTypedTextInterceptorTest extends BladeTypinghooksTestBase { + + public BladeTypedTextInterceptorTest(String testName) { + super(testName); + } + + private void insertChar(String original, char insertText, String expected) throws Exception { + insertChar(original, insertText, expected, null); + } + + private void insertChar(String original, char insertText, String expected, String selection) throws Exception { + insertChar(original, insertText, expected, selection, false); + } + + public void testAutoCompleteContentTag_01() throws Exception { + String original = "{^"; + String expected = "{{^ }}"; + insertChar(original, '{', expected); + } + + public void testAutoCompleteRawContentTag_01() throws Exception { + String original = "{!^"; + String expected = "{!!^ !!}"; + insertChar(original, '!', expected); + } + + public void testAutoCompleteCommentTag_01() throws Exception { + String original = "{{-^"; + String expected = "{{--^ --}}"; + insertChar(original, '-', expected); + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypinghooksTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypinghooksTestBase.java new file mode 100644 index 000000000000..58de4fc48a5f --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypinghooksTestBase.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.typinghooks; + +import org.netbeans.modules.php.blade.editor.BladeTestBase; + + +public abstract class BladeTypinghooksTestBase extends BladeTestBase { + + public BladeTypinghooksTestBase(String testName) { + super(testName); + } + + @Override + protected boolean runInEQ() { + return true; + } + +} From aa7ed46f6aeb04187fd75106234a0053facf35fc Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Sat, 5 Oct 2024 08:20:07 +0300 Subject: [PATCH 23/43] add position for mime service, unix endline for braces test files, increase antlr version to 4.13.0 --- .../completion/BladeCompletionProvider.java | 4 +- .../BladeTypedTextInterceptor.java | 4 +- .../formatter/BladeAntlrFormatterLexer.java | 4 +- .../formatter/BladeAntlrFormatterParser.java | 18 ++--- ...BladeAntlrFormatterParserBaseListener.java | 2 +- .../BladeAntlrFormatterParserListener.java | 2 +- .../antlr4/v10/BladeAntlrColoringLexer.java | 4 +- .../syntax/antlr4/v10/BladeAntlrLexer.java | 4 +- .../syntax/antlr4/v10/BladeAntlrParser.java | 78 +++++++++---------- .../v10/BladeAntlrParserBaseListener.java | 2 +- .../antlr4/v10/BladeAntlrParserListener.java | 2 +- .../lexer/BladeLexerPerformanceTest.java | 4 +- .../editor/parser/ParserPerformanceTest.java | 2 +- 13 files changed, 65 insertions(+), 65 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java index bb44247f1447..01e38ecce770 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java @@ -61,8 +61,8 @@ * @author bhaidu */ @MimeRegistrations({ - @MimeRegistration(mimeType = "text/html", service = CompletionProvider.class), - @MimeRegistration(mimeType = BladeLanguage.MIME_TYPE, service = CompletionProvider.class) + @MimeRegistration(mimeType = "text/html", service = CompletionProvider.class, position=102), + @MimeRegistration(mimeType = BladeLanguage.MIME_TYPE, service = CompletionProvider.class, position=0) }) public class BladeCompletionProvider implements CompletionProvider { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java index ae7550158462..3414812355a5 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java @@ -195,8 +195,8 @@ private void completeCommenTag(MutableContext context, TagType tagType, String c } @MimeRegistrations({ - @MimeRegistration(mimeType = BladeLanguage.MIME_TYPE, service = TypedTextInterceptor.Factory.class), - @MimeRegistration(mimeType = "text/html", service = TypedTextInterceptor.Factory.class) + @MimeRegistration(mimeType = BladeLanguage.MIME_TYPE, service = TypedTextInterceptor.Factory.class, position=0), + @MimeRegistration(mimeType = "text/html", service = TypedTextInterceptor.Factory.class, position=102) }) public static class Factory implements TypedTextInterceptor.Factory { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.java index 3868be6f2558..95718dabbbfa 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.java @@ -1,4 +1,4 @@ -// Generated from java-escape by ANTLR 4.11.1 +// Generated from BladeAntlrFormatterLexer.g4 by ANTLR 4.13.0 /* * Licensed to the Apache Software Foundation (ASF) under one @@ -31,7 +31,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) public class BladeAntlrFormatterLexer extends LexerAdaptor { - static { RuntimeMetaData.checkVersion("4.11.1", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.java index 6490c34384d3..119eb541fad2 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.java @@ -1,4 +1,4 @@ -// Generated from java-escape by ANTLR 4.11.1 +// Generated from BladeAntlrFormatterParser.g4 by ANTLR 4.13.0 /* * Licensed to the Apache Software Foundation (ASF) under one @@ -31,7 +31,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) public class BladeAntlrFormatterParser extends Parser { - static { RuntimeMetaData.checkVersion("4.11.1", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -125,7 +125,7 @@ public Vocabulary getVocabulary() { } @Override - public String getGrammarFileName() { return "java-escape"; } + public String getGrammarFileName() { return "BladeAntlrFormatterParser.g4"; } @Override public String[] getRuleNames() { return ruleNames; } @@ -174,7 +174,7 @@ public final FileContext file() throws RecognitionException { setState(43); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2000678626L) != 0) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2000678626L) != 0)) { { { setState(40); @@ -658,7 +658,7 @@ public final Html_indentContext html_indent() throws RecognitionException { setState(92); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 817921632L) != 0) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 817921632L) != 0)) { { { setState(89); @@ -747,7 +747,7 @@ public final Html_tagContext html_tag() throws RecognitionException { setState(107); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 817921632L) != 0) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 817921632L) != 0)) { { { setState(104); @@ -832,7 +832,7 @@ public final Self_closed_tagContext self_closed_tag() throws RecognitionExceptio setState(117); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 817921632L) != 0) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 817921632L) != 0)) { { { setState(114); @@ -1240,7 +1240,7 @@ public final Section_blockContext section_block() throws RecognitionException { setState(158); _errHandler.sync(this); _la = _input.LA(1); - } while ( ((_la) & ~0x3f) == 0 && ((1L << _la) & 2000678626L) != 0 ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 2000678626L) != 0) ); setState(160); section_block_end(); } @@ -1482,7 +1482,7 @@ public final Static_elementContext static_element() throws RecognitionException { setState(182); _la = _input.LA(1); - if ( !(((_la) & ~0x3f) == 0 && ((1L << _la) & 1074003970L) != 0) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 1074003970L) != 0)) ) { _errHandler.recoverInline(this); } else { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserBaseListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserBaseListener.java index 8f275cc805a0..4f4a78b3ad34 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserBaseListener.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserBaseListener.java @@ -1,4 +1,4 @@ -// Generated from java-escape by ANTLR 4.11.1 +// Generated from BladeAntlrFormatterParser.g4 by ANTLR 4.13.0 /* * Licensed to the Apache Software Foundation (ASF) under one diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserListener.java index 3a43e4b866b6..6a90aee9a583 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserListener.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserListener.java @@ -1,4 +1,4 @@ -// Generated from java-escape by ANTLR 4.11.1 +// Generated from BladeAntlrFormatterParser.g4 by ANTLR 4.13.0 /* * Licensed to the Apache Software Foundation (ASF) under one diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java index 365fae37718d..829f5d615c3a 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java @@ -1,4 +1,4 @@ -// Generated from java-escape by ANTLR 4.11.1 +// Generated from BladeAntlrColoringLexer.g4 by ANTLR 4.13.0 /* * Licensed to the Apache Software Foundation (ASF) under one @@ -31,7 +31,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) public class BladeAntlrColoringLexer extends ColoringLexerAdaptor { - static { RuntimeMetaData.checkVersion("4.11.1", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java index fa2bf4287735..5ef4791a09e7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java @@ -1,4 +1,4 @@ -// Generated from java-escape by ANTLR 4.11.1 +// Generated from BladeAntlrLexer.g4 by ANTLR 4.13.0 /* * Licensed to the Apache Software Foundation (ASF) under one @@ -32,7 +32,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) public class BladeAntlrLexer extends LexerAdaptor { - static { RuntimeMetaData.checkVersion("4.11.1", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.java index b676170c1c3d..aa7fd049c4f9 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.java @@ -1,4 +1,4 @@ -// Generated from java-escape by ANTLR 4.11.1 +// Generated from BladeAntlrParser.g4 by ANTLR 4.13.0 /* * Licensed to the Apache Software Foundation (ASF) under one @@ -40,7 +40,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) public class BladeAntlrParser extends Parser { - static { RuntimeMetaData.checkVersion("4.11.1", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -230,7 +230,7 @@ public Vocabulary getVocabulary() { } @Override - public String getGrammarFileName() { return "java-escape"; } + public String getGrammarFileName() { return "BladeAntlrParser.g4"; } @Override public String[] getRuleNames() { return ruleNames; } @@ -280,7 +280,7 @@ public final FileContext file() throws RecognitionException { setState(141); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { { { setState(138); @@ -606,7 +606,7 @@ public final Inline_directiveContext inline_directive() throws RecognitionExcept { setState(163); _la = _input.LA(1); - if ( !(((_la) & ~0x3f) == 0 && ((1L << _la) & 55169096509030400L) != 0 || (((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 5177361L) != 0) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 55169096509030400L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 5177361L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -623,7 +623,7 @@ public final Inline_directiveContext inline_directive() throws RecognitionExcept { setState(165); _la = _input.LA(1); - if ( !(((_la) & ~0x3f) == 0 && ((1L << _la) & 105555263750144L) != 0 || _la==D_CSRF || _la==D_LIVEWIRE) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 105555263750144L) != 0) || _la==D_CSRF || _la==D_LIVEWIRE) ) { _errHandler.recoverInline(this); } else { @@ -1004,7 +1004,7 @@ public final IdentifiableTypeContext identifiableType() throws RecognitionExcept setState(200); ((IdentifiableTypeContext)_localctx).d_name = _input.LT(1); _la = _input.LA(1); - if ( !((((_la - 47)) & ~0x3f) == 0 && ((1L << (_la - 47)) & 27021597764231235L) != 0) ) { + if ( !(((((_la - 47)) & ~0x3f) == 0 && ((1L << (_la - 47)) & 27021597764231235L) != 0)) ) { ((IdentifiableTypeContext)_localctx).d_name = (Token)_errHandler.recoverInline(this); } else { @@ -1159,7 +1159,7 @@ public final SectionContext section() throws RecognitionException { setState(224); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 4035201810946850816L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 4035201810946850816L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { { setState(222); _errHandler.sync(this); @@ -1251,7 +1251,7 @@ public final SectionContext section() throws RecognitionException { } setState(227); _la = _input.LA(1); - if ( !((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & 121L) != 0) ) { + if ( !(((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & 121L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -1313,7 +1313,7 @@ public final PushContext push() throws RecognitionException { setState(234); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { { { setState(231); @@ -1380,7 +1380,7 @@ public final PushOnceContext pushOnce() throws RecognitionException { setState(244); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { { { setState(241); @@ -1447,7 +1447,7 @@ public final PushIfContext pushIf() throws RecognitionException { setState(254); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { { { setState(251); @@ -1514,7 +1514,7 @@ public final PrependContext prepend() throws RecognitionException { setState(264); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { { { setState(261); @@ -1581,7 +1581,7 @@ public final FragmentDContext fragmentD() throws RecognitionException { setState(274); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { { { setState(271); @@ -1766,7 +1766,7 @@ public final ElseContext else_() throws RecognitionException { setState(309); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { { { setState(306); @@ -1985,7 +1985,7 @@ public final Auth_blockContext auth_block() throws RecognitionException { setState(329); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1475596L) != 0 || _la==BL_PARAM_CONCAT_OPERATOR || _la==BL_NAME_STRING) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1475596L) != 0) || _la==BL_PARAM_CONCAT_OPERATOR || _la==BL_NAME_STRING) { { { setState(326); @@ -2259,7 +2259,7 @@ public final Error_blockContext error_block() throws RecognitionException { setState(371); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { { { setState(368); @@ -2352,7 +2352,7 @@ public final SwitchContext switch_() throws RecognitionException { setState(382); _errHandler.sync(this); _la = _input.LA(1); - } while ( ((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0 ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) ); setState(384); match(D_ENDSWITCH); } @@ -2409,7 +2409,7 @@ public final WhileContext while_() throws RecognitionException { setState(391); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { { { setState(388); @@ -2476,7 +2476,7 @@ public final ForContext for_() throws RecognitionException { setState(401); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { { { setState(398); @@ -2549,7 +2549,7 @@ public final ForeachContext foreach() throws RecognitionException { setState(413); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { { { setState(410); @@ -2626,7 +2626,7 @@ public final ForelseContext forelse() throws RecognitionException { setState(426); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { { setState(424); _errHandler.sync(this); @@ -2705,7 +2705,7 @@ public final SessionContext session() throws RecognitionException { setState(436); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { { { setState(433); @@ -2876,7 +2876,7 @@ public final Asset_bundlerContext asset_bundler() throws RecognitionException { setState(460); _errHandler.sync(this); _la = _input.LA(1); - } while ( ((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING ); } break; } @@ -3225,7 +3225,7 @@ public final Once_blockContext once_block() throws RecognitionException { setState(513); _errHandler.sync(this); _la = _input.LA(1); - } while ( ((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0 || (((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0 ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) ); setState(515); match(D_ENDONCE); } @@ -3456,7 +3456,7 @@ public final Php_bladeContext php_blade() throws RecognitionException { setState(534); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING) { { { setState(531); @@ -3540,7 +3540,7 @@ public final PhpInlineContext phpInline() throws RecognitionException { setState(546); _errHandler.sync(this); _la = _input.LA(1); - } while ( ((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING ); setState(548); _la = _input.LA(1); if ( !(_la==EOF || _la==PHP_EXIT) ) { @@ -3600,7 +3600,7 @@ public final Regular_echoContext regular_echo() throws RecognitionException { setState(554); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING) { { { setState(551); @@ -3662,7 +3662,7 @@ public final Raw_echoContext raw_echo() throws RecognitionException { setState(563); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING) { { { setState(560); @@ -3970,7 +3970,7 @@ public final Static_direct_class_accessContext static_direct_class_access() thro setState(593); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING) { { { setState(590); @@ -4075,7 +4075,7 @@ public final Static_direct_namespace_class_accessContext static_direct_namespace setState(612); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING) { { { setState(609); @@ -4181,7 +4181,7 @@ public final Class_instanceContext class_instance() throws RecognitionException setState(634); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING) { { { setState(631); @@ -4357,7 +4357,7 @@ public final Function_callContext function_call() throws RecognitionException { setState(656); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING) { { { setState(653); @@ -4493,7 +4493,7 @@ public final Loop_expressionContext loop_expression() throws RecognitionExceptio { setState(664); _la = _input.LA(1); - if ( !(_la==PHP_EXPRESSION || _la==PHP_VARIABLE || (((_la - 139)) & ~0x3f) == 0 && ((1L << (_la - 139)) & 15L) != 0) ) { + if ( !(_la==PHP_EXPRESSION || _la==PHP_VARIABLE || ((((_la - 139)) & ~0x3f) == 0 && ((1L << (_la - 139)) & 15L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -4572,7 +4572,7 @@ public final Main_php_expressionContext main_php_expression() throws Recognition setState(675); _errHandler.sync(this); _la = _input.LA(1); - } while ( ((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING ); setState(677); match(BLADE_EXPR_RPAREN); } @@ -4755,7 +4755,7 @@ public final Composed_php_expressionContext composed_php_expression() throws Rec setState(699); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING) { { { setState(696); @@ -4778,7 +4778,7 @@ public final Composed_php_expressionContext composed_php_expression() throws Rec setState(707); _errHandler.sync(this); _la = _input.LA(1); - while (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0 || _la==EXPR_STRING) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING) { { { setState(704); @@ -5433,7 +5433,7 @@ public final ArrayDefineContext arrayDefine() throws RecognitionException { setState(785); _errHandler.sync(this); _la = _input.LA(1); - } while ( ((_la) & ~0x3f) == 0 && ((1L << _la) & 1475596L) != 0 || _la==BL_PARAM_CONCAT_OPERATOR || _la==BL_NAME_STRING ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 1475596L) != 0) || _la==BL_PARAM_CONCAT_OPERATOR || _la==BL_NAME_STRING ); setState(787); match(BL_SQ_RPAREN); } @@ -5496,7 +5496,7 @@ public final ParamAssignContext paramAssign() throws RecognitionException { match(BL_PARAM_ASSIGN); setState(795); _la = _input.LA(1); - if ( !(((_la) & ~0x3f) == 0 && ((1L << _la) & 131084L) != 0) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 131084L) != 0)) ) { _errHandler.recoverInline(this); } else { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserBaseListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserBaseListener.java index ea058ca9048b..72ff3e8ffd63 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserBaseListener.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserBaseListener.java @@ -1,4 +1,4 @@ -// Generated from java-escape by ANTLR 4.11.1 +// Generated from BladeAntlrParser.g4 by ANTLR 4.13.0 /* * Licensed to the Apache Software Foundation (ASF) under one diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserListener.java index 308bafcd389e..06e4ab155ee2 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserListener.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserListener.java @@ -1,4 +1,4 @@ -// Generated from java-escape by ANTLR 4.11.1 +// Generated from BladeAntlrParser.g4 by ANTLR 4.13.0 /* * Licensed to the Apache Software Foundation (ASF) under one diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerPerformanceTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerPerformanceTest.java index 81e187df6ab8..2e0570129973 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerPerformanceTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerPerformanceTest.java @@ -51,13 +51,13 @@ private void testFile(String filename) throws Exception { long time = end.getTime() - start.getTime(); long fileSize = testFile.getTotalSpace() / 1024; String output = String.format( - "Parsing of file(%s: %sKB) takes: %sms", + "Lexer tokenization of file(%s: %sKB) takes: %sms", testFile.getName(), fileSize, time ); // System.out.println(output); - assertTrue(time < 200); + assertTrue("Lexer tokenization time should be below 200", time < 200); } } diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/ParserPerformanceTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/ParserPerformanceTest.java index bfe1b0c2712a..893f900fabcb 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/ParserPerformanceTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/ParserPerformanceTest.java @@ -74,6 +74,6 @@ void run(ResultIterator resultIterator) throws Exception { ); // System.out.println(output); - assertTrue(time < 500); + assertTrue("Parsing time should be below 500", time < 500); } } From f5ec6e7c0a78857a5d43198f6655fc0af6c69d61 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Mon, 7 Oct 2024 09:32:59 +0300 Subject: [PATCH 24/43] wip formatter fixes and tests, move BladeError outside of parser class --- .../php/blade/editor/actions/BladeUtils.java | 38 + .../ViewAntlrColoringTokensAction.java | 53 +- .../ViewAntlrFormatterTokensAction.java | 82 +- .../actions/ViewAntlrLexerTokensAction.java | 67 +- .../blade/editor/format/BladeFormatter.java | 24 +- .../editor/format/BladeFormatterService.java | 34 +- .../editor/hints/BladeHintsProvider.java | 10 +- .../php/blade/editor/parser/BladeError.java | 95 +++ .../editor/parser/BladeParserResult.java | 21 +- .../formatter/BladeAntlrFormatterLexer.g4 | 2 +- .../formatter/BladeAntlrFormatterLexer.java | 704 +++++++++--------- .../formatter/BladeAntlrFormatterParser.g4 | 12 +- .../formatter/BladeAntlrFormatterParser.java | 675 ++++++++--------- ...BladeAntlrFormatterParserBaseListener.java | 40 +- .../BladeAntlrFormatterParserListener.java | 38 +- .../format/directive_blocks_01.blade.php | 4 + .../directive_blocks_01.blade.php.formatted | 4 + .../format/directive_blocks_02.blade.php | 6 + .../directive_blocks_02.blade.php.formatted | 6 + .../format/if_block_01.blade.php.formatted | 4 +- .../editor/format/BladeFormatterTest.java | 11 +- .../editor/format/BladeFormatterTestBase.java | 6 +- 22 files changed, 917 insertions(+), 1019 deletions(-) create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/BladeUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeError.java create mode 100644 php/php.blade/test/unit/data/testfiles/format/directive_blocks_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/format/directive_blocks_01.blade.php.formatted create mode 100644 php/php.blade/test/unit/data/testfiles/format/directive_blocks_02.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/format/directive_blocks_02.blade.php.formatted diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/BladeUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/BladeUtils.java new file mode 100644 index 000000000000..dc2c1860edc9 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/BladeUtils.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.actions; + +/** + * + * @author bogdan + */ +public final class BladeUtils { + + private BladeUtils() { + + } + + public static String replaceLinesAndTabs(String input) { + String escapedString = input; + escapedString = escapedString.replaceAll("\n", "\\\\n"); + escapedString = escapedString.replaceAll("\r", "\\\\r"); + escapedString = escapedString.replaceAll("\t", "\\\\t"); + return escapedString; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrColoringTokensAction.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrColoringTokensAction.java index 5045b558072e..5cd8fc115eb2 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrColoringTokensAction.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrColoringTokensAction.java @@ -36,6 +36,7 @@ import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.Vocabulary; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrColoringLexer; import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrColoringLexer.*; import org.openide.awt.ActionID; @@ -101,6 +102,7 @@ protected void initComponents() { try { CharStream cs = CharStreams.fromString(String.valueOf(fileObject.asText())); BladeAntlrColoringLexer lexer = new BladeAntlrColoringLexer(cs); + Vocabulary vocabulary = lexer.getVocabulary(); CommonTokenStream tokens = new CommonTokenStream(lexer); tokens.fill(); Document doc = viewer.getDocument(); @@ -108,45 +110,22 @@ protected void initComponents() { // Would be better to create some diff and update the changed elemets doc.remove(0, doc.getLength()); StringBuilder result = new StringBuilder(); - - int lastLine = 0; + for (Token token : tokens.getTokens()) { - if (lastLine != token.getLine()) { - lastLine = token.getLine(); - if (lastLine > 1) { - result.append("\n"); - } - result.append("L"); - result.append(lastLine); - result.append(": ").append(lastLine); - } - switch (token.getType()) { - case DIRECTIVE: - case D_AT: - result.append(token.getText()); - break; - case HTML_TAG: - case HTML: - result.append(" (HTML-"); - result.append(token.getType()); - result.append(" "); - result.append(token.getText()); - result.append(" ~)"); - break; - case PHP_EXPRESSION: - result.append(" (PHP_EXPRESSION)"); - result.append(token.getText()); - break; - case BLADE_PHP_ECHO_EXPR: - result.append(" (BLADE_PHP_ECHO_EXPR)"); - result.append(token.getText()); - break; - default: - result.append(token.getType()); - } - if (token.getType() > -1) { - result.append(" | "); + int tokenId = token.getType(); + String text = token.getText(); + result.append("Token #"); + result.append(tokenId); + result.append(" "); + result.append(vocabulary.getDisplayName(tokenId)); + String tokenText = BladeUtils.replaceLinesAndTabs(text); + if (!tokenText.isEmpty()) { + result.append(" "); + result.append("["); + result.append(token); + result.append("]"); } + result.append("\n"); } EditorKit kit = viewer.getEditorKit(); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrFormatterTokensAction.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrFormatterTokensAction.java index 8b4ee0df6a29..cc7118492588 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrFormatterTokensAction.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrFormatterTokensAction.java @@ -36,6 +36,7 @@ import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.Vocabulary; import org.netbeans.modules.php.blade.syntax.antlr4.formatter.BladeAntlrFormatterLexer; import static org.netbeans.modules.php.blade.syntax.antlr4.formatter.BladeAntlrFormatterLexer.*; import org.openide.awt.ActionID; @@ -101,6 +102,7 @@ protected void initComponents() { try { CharStream cs = CharStreams.fromString(String.valueOf(fileObject.asText())); BladeAntlrFormatterLexer lexer = new BladeAntlrFormatterLexer(cs); + Vocabulary vocabulary = lexer.getVocabulary(); CommonTokenStream tokens = new CommonTokenStream(lexer); tokens.fill(); Document doc = viewer.getDocument(); @@ -109,75 +111,21 @@ protected void initComponents() { doc.remove(0, doc.getLength()); StringBuilder result = new StringBuilder(); - int lastLine = 0; for (Token token : tokens.getTokens()) { - if (lastLine != token.getLine()) { - lastLine = token.getLine(); - if (lastLine > 1) { - result.append("\n"); - } - result.append("L"); - result.append(lastLine); - result.append(": "); - } - switch (token.getType()) { - case PARAM_COMMA: - result.append(" ~,"); - break; - case D_ARG_LPAREN: - result.append(" ~("); - break; - case D_ARG_RPAREN: - result.append(" ~)"); - break; - case SG_QUOTE: - result.append(" '"); - break; - case WS: - result.append(" ("); - result.append(token.getText()); - result.append(" )"); - break; - case NL: - result.append(" (n)"); - break; - case EQ: - result.append("(EQ)"); - break; - case STRING: - result.append("string"); - break; - case IDENTIFIER: - result.append("~"); - result.append(token.getText()); - break; - case COMPONENT_TAG: - result.append("COMP_TAG "); - result.append(token.getText()); - break; - case HTML_CLOSE_TAG: - result.append("CLOSE_TAG "); - result.append(token.getText()); - break; - case HTML_START_BLOCK_TAG: - result.append("START_TAG "); - result.append(token.getText()); - break; - case GT_SYMBOL: - result.append(" (>)"); - break; - case D_PHP: - result.append(" (@php)"); - break; - default: - result.append(token.getType()); - if (token.getText().startsWith("@")) { - result.append(" (DIRECTIVE)"); - } - } - if (token.getType() > -1) { - result.append(" | "); + int tokenId = token.getType(); + String text = token.getText(); + result.append("Token #"); + result.append(tokenId); + result.append(" "); + result.append(vocabulary.getDisplayName(tokenId)); + String tokenText = BladeUtils.replaceLinesAndTabs(text); + if (!tokenText.isEmpty()) { + result.append(" "); + result.append("["); + result.append(token); + result.append("]"); } + result.append("\n"); } EditorKit kit = viewer.getEditorKit(); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrLexerTokensAction.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrLexerTokensAction.java index ccca610a149f..6d1da2cd48a9 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrLexerTokensAction.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrLexerTokensAction.java @@ -36,6 +36,7 @@ import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.Vocabulary; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; import org.openide.awt.ActionID; @@ -101,6 +102,7 @@ protected void initComponents() { try { CharStream cs = CharStreams.fromString(String.valueOf(fileObject.asText())); BladeAntlrLexer lexer = new BladeAntlrLexer(cs); + Vocabulary vocabulary = lexer.getVocabulary(); CommonTokenStream tokens = new CommonTokenStream(lexer); tokens.fill(); Document doc = viewer.getDocument(); @@ -109,60 +111,21 @@ protected void initComponents() { doc.remove(0, doc.getLength()); StringBuilder result = new StringBuilder(); - int lastLine = 0; for (Token token : tokens.getTokens()) { - if (lastLine != token.getLine()) { - lastLine = token.getLine(); - if (lastLine > 1) { - result.append("\n"); - } - result.append("L"); - result.append(lastLine); - result.append(": ").append(lastLine); - } - switch (token.getType()) { - case BLADE_EXPR_LPAREN: - result.append(" '('"); - break; - case BLADE_EXPR_RPAREN: - result.append(" ')'"); - break; - case HTML: - result.append(" (HTML)"); - result.append(token.getText()); - break; - case HTML_COMPONENT_PREFIX: - result.append(" (HTML_COMPONENT_PREFIX)"); - result.append(token.getText()); - break; - case PHP_NEW: - result.append(" (\n)"); - break; - case PHP_EXPRESSION: - result.append(" (PHP_EXPRESSION)"); - result.append(token.getText()); - break; - case PHP_NAMESPACE_PATH: - result.append(" (PHP_NAMESPACE_PATH)"); - result.append(token.getText()); - break; - case PHP_IDENTIFIER: - result.append(" (PHP_IDENTIFIER)"); - result.append(token.getText()); - break; - case PHP_VARIABLE: - result.append(" (PHP_VARIABLE)"); - result.append(token.getText()); - break; - default: - result.append(token.getType()); - if (token.getText().startsWith("@")) { - result.append(" (DIRECTIVE)"); - } - } - if (token.getType() > -1) { - result.append(" | "); + int tokenId = token.getType(); + String text = token.getText(); + result.append("Token #"); + result.append(tokenId); + result.append(" "); + result.append(vocabulary.getDisplayName(tokenId)); + String tokenText = BladeUtils.replaceLinesAndTabs(text); + if (!tokenText.isEmpty()) { + result.append(" "); + result.append("["); + result.append(token); + result.append("]"); } + result.append("\n"); } EditorKit kit = viewer.getEditorKit(); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatter.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatter.java index 06c29099f1f7..08a20900d4a8 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatter.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatter.java @@ -27,16 +27,13 @@ import org.netbeans.modules.csl.api.Formatter; import org.netbeans.modules.csl.spi.ParserResult; import org.netbeans.modules.editor.indent.spi.Context; - import org.netbeans.api.editor.document.LineDocument; import org.netbeans.api.editor.document.LineDocumentUtils; import org.netbeans.api.editor.settings.SimpleValueNames; -import org.netbeans.api.project.Project; -import org.netbeans.modules.editor.NbEditorUtilities; import org.netbeans.modules.editor.indent.spi.CodeStylePreferences; import org.netbeans.modules.php.blade.editor.preferences.GeneralPreferencesUtils; -import org.netbeans.spi.project.ui.support.ProjectConvertors; -import org.openide.filesystems.FileObject; +import org.openide.util.Exceptions; +import org.openide.util.Lookup; /** * @@ -60,13 +57,6 @@ public void reformat(Context context, ParserResult compilationInfo) { } else if (!isBladeFormattingEnabled(doc)) { return; } - //todo - //check tab context - FileObject file = NbEditorUtilities.getFileObject(doc); - Project projectOwner = ProjectConvertors.getNonConvertorOwner(file); - if (projectOwner == null) { - return; - } int indentSize = getIndentSize(context.document()); @@ -92,13 +82,21 @@ public void run() { (new BladeFormatterService()).format(context, currentText, indentSize); } catch (BadLocationException ex) { + Exceptions.printStackTrace(ex); } } }; + String lookupClassName = Lookup.getDefault().getClass().getSimpleName(); + if (lookupClassName.equals("MockLookup")) { + //test mode + rn.run(); + } else { + SwingUtilities.invokeLater(rn); + } //run after html indent is finished - SwingUtilities.invokeLater(rn); + if (LOGGER.isLoggable(Level.FINE)) { long end = System.currentTimeMillis(); LOGGER.log(Level.FINE, "Reformat took: {0} ms", (end - start)); //NOI18N diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterService.java index 566af88e242d..9ba1292981c7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterService.java @@ -20,8 +20,6 @@ import java.util.Map; import java.util.TreeMap; -import java.util.logging.Level; -import java.util.logging.Logger; import javax.swing.text.BadLocationException; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; @@ -40,10 +38,9 @@ * @author bhaidu */ public class BladeFormatterService { - private static final Logger LOGGER = Logger.getLogger(BladeFormatterService.class.getName()); public final Map formattedLineIndentList = new TreeMap<>(); - boolean debugMode = false; - public boolean isIndentation; + private boolean debugMode = false; + private boolean isIndentation; public void format(Context context, String text, int indentSize) { isIndentation = context.isIndent(); @@ -58,7 +55,6 @@ public void format(Context context, String text, int indentSize) { final int cstart = context.startOffset(); final int cend = context.endOffset(); int textDelta = 0; - LOGGER.log(Level.INFO, "Starting formatting from caret {0}:\n", cstart); for (Map.Entry entry : formattedLineIndentList.entrySet()) { int tstart = entry.getValue().tokenStart; @@ -113,14 +109,14 @@ public void exitBlock_start(BladeAntlrFormatterParser.Block_startContext ctx) { Token start = ctx.getStart(); blockBalance++; - if (ctx.getStop() != null && !formattedLineIndentList.containsKey(start.getLine())) { - Token endDefinition = ctx.getStop(); + + if (!formattedLineIndentList.containsKey(start.getLine())) { //hack to indent after blade block int offset = isIndentation ? 1 : 0; - formattedLineIndentList.put(endDefinition.getLine(), - new FormatToken(endDefinition.getStopIndex() + 1 + offset, indent+offset, htmlBlockBalance, null)); + formattedLineIndentList.put(start.getLine(), + new FormatToken(start.getStopIndex() + 1 + offset, indent+offset, htmlBlockBalance, null)); + indent++; } - indent++; } @Override @@ -143,11 +139,12 @@ public void exitBlock_end(BladeAntlrFormatterParser.Block_endContext ctx) { } @Override - public void exitSection_block_start(BladeAntlrFormatterParser.Section_block_startContext ctx) { + public void enterSection_block(BladeAntlrFormatterParser.Section_blockContext ctx) { Token start = ctx.getStart(); + blockBalance++; - if (ctx.getStop() != null && !formattedLineIndentList.containsKey(start.getLine())) { - Token rArgParent = ctx.getStop(); + if (!formattedLineIndentList.containsKey(start.getLine())) { + Token rArgParent = ctx.getStart(); String debugText = debugMode ? rArgParent.getText() : null; formattedLineIndentList.put(rArgParent.getLine(), new FormatToken(rArgParent.getStopIndex() + 1, indent, htmlBlockBalance, debugText)); indent++; @@ -155,15 +152,16 @@ public void exitSection_block_start(BladeAntlrFormatterParser.Section_block_star } @Override - public void exitSection_block_end(BladeAntlrFormatterParser.Section_block_endContext ctx) { - Token start = ctx.getStart(); - int line = start.getLine(); + public void exitSection_block(BladeAntlrFormatterParser.Section_blockContext ctx) { + Token end = ctx.getStop(); + + int line = end.getLine(); if (!formattedLineIndentList.containsKey(line)) { indent--; if (indent < 0) { indent = 0; } - formattedLineIndentList.put(line, new FormatToken(start.getStartIndex(), indent, htmlBlockBalance, start.getText())); + formattedLineIndentList.put(line, new FormatToken(end.getStartIndex(), indent, htmlBlockBalance, end.getText())); } else { formattedLineIndentList.remove(line); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java index 52767eb34478..a952d3a209ac 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java @@ -100,7 +100,7 @@ public void computeHints(HintsManager manager, RuleContext context, List h for (OffsetRange range : entry.getValue()) { OffsetRange hintRange = new OffsetRange(range.getStart(), range.getEnd() + 1); hints.add(new Hint(new BladeRule(HintSeverity.WARNING), - "Blade path not found.\nFor custom blade context you can try to set the root folder using:\nProject -> Properties -> Laravel Blade -> Views Folder", + "Blade path not found.\nFor custom blade context you can try to set the root folder using:\nProject -> Properties -> Laravel Blade -> Views Folder", //NOI18N context.parserResult.getSnapshot().getSource().getFileObject(), hintRange, Collections.emptyList(), @@ -133,9 +133,7 @@ public void computeSelectionHints(HintsManager manager, RuleContext context, Lis */ @Override public void computeErrors(HintsManager manager, RuleContext context, List hints, List unhandled) { - BladeParserResult parserResult = (BladeParserResult) context.parserResult; - - unhandled.addAll(parserResult.getDiagnostics()); + unhandled.addAll(context.parserResult.getDiagnostics()); } /** @@ -143,7 +141,7 @@ public void computeErrors(HintsManager manager, RuleContext context, List */ @Override public void cancel() { - //todo implement + //not required } /** @@ -168,7 +166,7 @@ public void cancel() { */ @Override public List getBuiltinRules() { - return null; + return Collections.emptyList(); } /** diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeError.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeError.java new file mode 100644 index 000000000000..6fd2bfb6e33c --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeError.java @@ -0,0 +1,95 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.parser; + +import org.netbeans.modules.csl.api.Severity; +import org.openide.filesystems.FileObject; + +/** + * + * @author Petr Pisl + */ +@org.netbeans.api.annotations.common.SuppressWarnings({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) +public class BladeError implements org.netbeans.modules.csl.api.Error.Badging { + private static final boolean SILENT_ERROR_BADGE = Boolean.getBoolean("nb.php.silent.error.badge"); //NOI18N + private final String displayName; + private final FileObject file; + private final int startPosition; + private final int endPosition; + private final Severity severity; + + public BladeError(String displayName, FileObject file, int startPosition, int endPosition, Severity severity) { + this.displayName = displayName; + this.file = file; + this.startPosition = startPosition; + this.endPosition = endPosition; + this.severity = severity; + } + + + @Override + public String getDisplayName() { + return this.displayName; + } + + @Override + public String getDescription() { + return null; + } + + @Override + public String getKey() { + return "[" + startPosition + "," + endPosition + "]-" + displayName; + } + + @Override + public FileObject getFile() { + return this.file; + } + + @Override + public int getStartPosition() { + return this.startPosition; + } + + @Override + public int getEndPosition() { + return this.endPosition; + } + + @Override + public Severity getSeverity() { + return this.severity; + } + + @Override + public Object[] getParameters() { + return new Object[]{}; + } + + @Override + public boolean isLineError() { + return true; + } + + @Override + public boolean showExplorerBadge() { + return !SILENT_ERROR_BADGE; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java index 2468b5504aa1..5f5bd3137dbf 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; @@ -833,7 +834,7 @@ public void exitEndif(BladeAntlrParser.EndifContext ctx) { @Override public void exitFile(BladeAntlrParser.FileContext ctx) { if (ifBalance != 0) { - errors.add(new BladeError(null, "Unclosed @if", null, getFileObject(), ifStart, ctx.getStart().getStopIndex(), Severity.ERROR)); + errors.add(new BladeError("Unclosed @if", getFileObject(), ifStart, ctx.getStart().getStopIndex(), Severity.ERROR)); } } @@ -857,7 +858,7 @@ protected boolean processingFinished() { @Override public List getDiagnostics() { - return errors; + return new ArrayList<>(errors); } @Override @@ -881,7 +882,7 @@ public void syntaxError(Recognizer recognizer, Object offendingSymbol, int if (offendingSymbol instanceof Token offendingToken) { errorPosition = offendingToken.getStartIndex(); } - errors.add(new BladeError(null, msg, null, getFileObject(), errorPosition, errorPosition, Severity.ERROR)); + errors.add(new BladeError(msg, getFileObject(), errorPosition, errorPosition, Severity.ERROR)); } }; @@ -953,18 +954,4 @@ public class ForeachVariables { public String itemVariable; } - public static class BladeError extends DefaultError implements org.netbeans.modules.csl.api.Error.Badging { - - public BladeError(@NullAllowed String key, @NonNull String displayName, - @NullAllowed String description, @NonNull FileObject file, - @NonNull int start, @NonNull int end, @NonNull Severity severity) { - super(key, displayName, description, file, start, end, severity); - } - - @Override - public boolean showExplorerBadge() { - return true; - } - - } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.g4 index 58eb0e223347..2818e0b5b9f2 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.g4 @@ -155,7 +155,7 @@ D_PHP : '@php' {this._input.LA(1) == ' ' || this._input.LA(1) == '\n'}?->pushMod AT : '@' ->skip; WS : ((' ') | [\t])+; -NL : [\r\n]; +NL : [\r\n]+; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.java index 95718dabbbfa..b6760dc7259b 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.java @@ -294,7 +294,7 @@ private boolean D_PHP_sempred(RuleContext _localctx, int predIndex) { } public static final String _serializedATN = - "\u0004\u00002\u04bf\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ + "\u0004\u00002\u04c2\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000\u0007"+ "\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007"+ "\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007"+ @@ -461,300 +461,300 @@ private boolean D_PHP_sempred(RuleContext _localctx, int predIndex) { "\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e"+ "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ "\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001"+ - "!\u0004!\u044b\b!\u000b!\f!\u044c\u0001\"\u0001\"\u0001#\u0001#\u0001"+ - "#\u0001#\u0001$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001&\u0001&\u0001"+ - "&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001"+ - ")\u0001)\u0001)\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001"+ - "+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u00010\u0001"+ - "0\u00010\u00010\u00011\u00011\u00011\u00011\u00012\u00012\u00012\u0001"+ - "2\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u0001"+ - "3\u00014\u00044\u049b\b4\u000b4\f4\u049c\u00014\u00014\u00015\u00015\u0001"+ - "5\u00015\u00016\u00016\u00016\u00016\u00016\u00017\u00017\u00017\u0001"+ - "7\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u00019\u00019\u0001"+ - "9\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0004\u00a0"+ - "\u0148\u0156\u02d6\u0000<\u0006\u0000\b\u0000\n\u0000\f\u0000\u000e\u0000"+ - "\u0010\u0000\u0012\u0000\u0014\u0004\u0016\u0000\u0018\u0005\u001a\u0000"+ - "\u001c\u0006\u001e\u0007 \b\"\t$\n&\u000b(\f*\r,\u000e.\u000f0\u00102"+ - "\u00114\u00126\u00138\u0014:\u0015<\u0016>\u0017@\u0018B\u0019D\u001a"+ - "F\u001bH\u001cJ\u001dL\u001eN\u001fP R\u0000T!V\"X#Z$\\%^&`\'b(d)f\u0000"+ - "h*j+l,n\u0000p\u0000r-t.v/x0z1|2\u0006\u0000\u0001\u0002\u0003\u0004\u0005"+ - "$\u0003\u0000AZaz\u0080\u8000\ufffe\u0005\u000009AZ__az\u0080\u8000\ufffe"+ - "\u0006\u0000..0:AZ__az\u0080\u8000\ufffe\u0002\u0000\"\"\\\\\u0002\u0000"+ - "\'\'\\\\\u0002\u0000AAaa\u0002\u0000UUuu\u0002\u0000TTtt\u0002\u0000H"+ - "Hhh\u0002\u0000GGgg\u0002\u0000EEee\u0002\u0000SSss\u0002\u0000IIii\u0002"+ - "\u0000FFff\u0002\u0000CCcc\u0002\u0000NNnn\u0002\u0000YYyy\u0002\u0000"+ - "OOoo\u0002\u0000RRrr\u0002\u0000LLll\u0002\u0000WWww\u0002\u0000MMmm\u0002"+ - "\u0000VVvv\u0002\u0000BBbb\u0002\u0000PPpp\u0002\u0000DDdd\u0001\u0000"+ - " \u0002\u0000KKkk\u0006\u0000..09AZ__az\u0080\u8000\ufffe\u0002\u0000"+ - "XXxx\u0002\u0000QQqq\u0001\u000019\u0006\u0000ABIIPQabiipq\u0002\u0000"+ - "\t\t \u0002\u0000\n\n\r\r\u0001\u0000@@\u0545\u0000\u0014\u0001\u0000"+ - "\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000"+ - "\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000"+ - "\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000"+ - "\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000"+ - "\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*"+ - "\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000"+ - "\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000"+ - "\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008"+ - "\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000"+ - "\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000"+ - "\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F"+ - "\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000\u0000\u0000J\u0001\u0000"+ - "\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0001N\u0001\u0000\u0000\u0000"+ - "\u0001P\u0001\u0000\u0000\u0000\u0001R\u0001\u0000\u0000\u0000\u0001T"+ - "\u0001\u0000\u0000\u0000\u0001V\u0001\u0000\u0000\u0000\u0002X\u0001\u0000"+ - "\u0000\u0000\u0002Z\u0001\u0000\u0000\u0000\u0002\\\u0001\u0000\u0000"+ - "\u0000\u0002^\u0001\u0000\u0000\u0000\u0002`\u0001\u0000\u0000\u0000\u0002"+ - "b\u0001\u0000\u0000\u0000\u0002d\u0001\u0000\u0000\u0000\u0002f\u0001"+ - "\u0000\u0000\u0000\u0002h\u0001\u0000\u0000\u0000\u0002j\u0001\u0000\u0000"+ - "\u0000\u0003l\u0001\u0000\u0000\u0000\u0003n\u0001\u0000\u0000\u0000\u0003"+ - "p\u0001\u0000\u0000\u0000\u0004r\u0001\u0000\u0000\u0000\u0004t\u0001"+ - "\u0000\u0000\u0000\u0004v\u0001\u0000\u0000\u0000\u0005x\u0001\u0000\u0000"+ - "\u0000\u0005z\u0001\u0000\u0000\u0000\u0005|\u0001\u0000\u0000\u0000\u0006"+ - "~\u0001\u0000\u0000\u0000\b\u0085\u0001\u0000\u0000\u0000\n\u008c\u0001"+ - "\u0000\u0000\u0000\f\u0096\u0001\u0000\u0000\u0000\u000e\u009b\u0001\u0000"+ - "\u0000\u0000\u0010\u00a5\u0001\u0000\u0000\u0000\u0012\u013f\u0001\u0000"+ - "\u0000\u0000\u0014\u015b\u0001\u0000\u0000\u0000\u0016\u01e4\u0001\u0000"+ - "\u0000\u0000\u0018\u01e8\u0001\u0000\u0000\u0000\u001a\u01ee\u0001\u0000"+ - "\u0000\u0000\u001c\u020e\u0001\u0000\u0000\u0000\u001e\u0210\u0001\u0000"+ - "\u0000\u0000 \u0239\u0001\u0000\u0000\u0000\"\u024d\u0001\u0000\u0000"+ - "\u0000$\u025e\u0001\u0000\u0000\u0000&\u0269\u0001\u0000\u0000\u0000("+ - "\u026d\u0001\u0000\u0000\u0000*\u026f\u0001\u0000\u0000\u0000,\u0274\u0001"+ - "\u0000\u0000\u0000.\u027a\u0001\u0000\u0000\u00000\u027c\u0001\u0000\u0000"+ - "\u00002\u02cc\u0001\u0000\u0000\u00004\u02ce\u0001\u0000\u0000\u00006"+ - "\u02dd\u0001\u0000\u0000\u00008\u03ff\u0001\u0000\u0000\u0000:\u0431\u0001"+ - "\u0000\u0000\u0000<\u0433\u0001\u0000\u0000\u0000>\u0435\u0001\u0000\u0000"+ - "\u0000@\u0437\u0001\u0000\u0000\u0000B\u043a\u0001\u0000\u0000\u0000D"+ - "\u043c\u0001\u0000\u0000\u0000F\u0445\u0001\u0000\u0000\u0000H\u044a\u0001"+ - "\u0000\u0000\u0000J\u044e\u0001\u0000\u0000\u0000L\u0450\u0001\u0000\u0000"+ - "\u0000N\u0454\u0001\u0000\u0000\u0000P\u0457\u0001\u0000\u0000\u0000R"+ - "\u045a\u0001\u0000\u0000\u0000T\u045e\u0001\u0000\u0000\u0000V\u0462\u0001"+ - "\u0000\u0000\u0000X\u0466\u0001\u0000\u0000\u0000Z\u0469\u0001\u0000\u0000"+ - "\u0000\\\u046c\u0001\u0000\u0000\u0000^\u0471\u0001\u0000\u0000\u0000"+ - "`\u0476\u0001\u0000\u0000\u0000b\u047b\u0001\u0000\u0000\u0000d\u0480"+ - "\u0001\u0000\u0000\u0000f\u0483\u0001\u0000\u0000\u0000h\u0487\u0001\u0000"+ - "\u0000\u0000j\u048b\u0001\u0000\u0000\u0000l\u048f\u0001\u0000\u0000\u0000"+ - "n\u049a\u0001\u0000\u0000\u0000p\u04a0\u0001\u0000\u0000\u0000r\u04a4"+ - "\u0001\u0000\u0000\u0000t\u04a9\u0001\u0000\u0000\u0000v\u04ad\u0001\u0000"+ - "\u0000\u0000x\u04b1\u0001\u0000\u0000\u0000z\u04b7\u0001\u0000\u0000\u0000"+ - "|\u04bb\u0001\u0000\u0000\u0000~\u0082\u0007\u0000\u0000\u0000\u007f\u0081"+ - "\u0007\u0001\u0000\u0000\u0080\u007f\u0001\u0000\u0000\u0000\u0081\u0084"+ - "\u0001\u0000\u0000\u0000\u0082\u0080\u0001\u0000\u0000\u0000\u0082\u0083"+ - "\u0001\u0000\u0000\u0000\u0083\u0007\u0001\u0000\u0000\u0000\u0084\u0082"+ - "\u0001\u0000\u0000\u0000\u0085\u0089\u0007\u0000\u0000\u0000\u0086\u0088"+ - "\u0007\u0001\u0000\u0000\u0087\u0086\u0001\u0000\u0000\u0000\u0088\u008b"+ - "\u0001\u0000\u0000\u0000\u0089\u0087\u0001\u0000\u0000\u0000\u0089\u008a"+ - "\u0001\u0000\u0000\u0000\u008a\t\u0001\u0000\u0000\u0000\u008b\u0089\u0001"+ - "\u0000\u0000\u0000\u008c\u0090\u0007\u0000\u0000\u0000\u008d\u008f\u0007"+ - "\u0002\u0000\u0000\u008e\u008d\u0001\u0000\u0000\u0000\u008f\u0092\u0001"+ - "\u0000\u0000\u0000\u0090\u008e\u0001\u0000\u0000\u0000\u0090\u0091\u0001"+ - "\u0000\u0000\u0000\u0091\u000b\u0001\u0000\u0000\u0000\u0092\u0090\u0001"+ - "\u0000\u0000\u0000\u0093\u0095\u0005 \u0000\u0000\u0094\u0093\u0001\u0000"+ - "\u0000\u0000\u0095\u0098\u0001\u0000\u0000\u0000\u0096\u0094\u0001\u0000"+ - "\u0000\u0000\u0096\u0097\u0001\u0000\u0000\u0000\u0097\u0099\u0001\u0000"+ - "\u0000\u0000\u0098\u0096\u0001\u0000\u0000\u0000\u0099\u009a\u0004\u0003"+ - "\u0000\u0000\u009a\r\u0001\u0000\u0000\u0000\u009b\u00a0\u0005\"\u0000"+ - "\u0000\u009c\u009f\u0007\u0003\u0000\u0000\u009d\u009f\t\u0000\u0000\u0000"+ - "\u009e\u009c\u0001\u0000\u0000\u0000\u009e\u009d\u0001\u0000\u0000\u0000"+ - "\u009f\u00a2\u0001\u0000\u0000\u0000\u00a0\u00a1\u0001\u0000\u0000\u0000"+ - "\u00a0\u009e\u0001\u0000\u0000\u0000\u00a1\u00a3\u0001\u0000\u0000\u0000"+ - "\u00a2\u00a0\u0001\u0000\u0000\u0000\u00a3\u00a4\u0005\"\u0000\u0000\u00a4"+ - "\u000f\u0001\u0000\u0000\u0000\u00a5\u00ab\u0005\'\u0000\u0000\u00a6\u00aa"+ - "\b\u0004\u0000\u0000\u00a7\u00a8\u0005\\\u0000\u0000\u00a8\u00aa\t\u0000"+ - "\u0000\u0000\u00a9\u00a6\u0001\u0000\u0000\u0000\u00a9\u00a7\u0001\u0000"+ - "\u0000\u0000\u00aa\u00ad\u0001\u0000\u0000\u0000\u00ab\u00a9\u0001\u0000"+ - "\u0000\u0000\u00ab\u00ac\u0001\u0000\u0000\u0000\u00ac\u00ae\u0001\u0000"+ - "\u0000\u0000\u00ad\u00ab\u0001\u0000\u0000\u0000\u00ae\u00af\u0005\'\u0000"+ - "\u0000\u00af\u0011\u0001\u0000\u0000\u0000\u00b0\u00b1\u0007\u0005\u0000"+ - "\u0000\u00b1\u00b2\u0007\u0006\u0000\u0000\u00b2\u00b3\u0007\u0007\u0000"+ - "\u0000\u00b3\u0140\u0007\b\u0000\u0000\u00b4\u00b5\u0007\t\u0000\u0000"+ - "\u00b5\u00b6\u0007\u0006\u0000\u0000\u00b6\u00b7\u0007\n\u0000\u0000\u00b7"+ - "\u00b8\u0007\u000b\u0000\u0000\u00b8\u0140\u0007\u0007\u0000\u0000\u00b9"+ - "\u00ba\u0007\f\u0000\u0000\u00ba\u0140\u0007\r\u0000\u0000\u00bb\u00bc"+ - "\u0007\u000e\u0000\u0000\u00bc\u00bd\u0007\u0005\u0000\u0000\u00bd\u00be"+ - "\u0007\u000f\u0000\u0000\u00be\u00c5\u0001\u0000\u0000\u0000\u00bf\u00c0"+ - "\u0007\u0005\u0000\u0000\u00c0\u00c1\u0007\u000f\u0000\u0000\u00c1\u00c6"+ - "\u0007\u0010\u0000\u0000\u00c2\u00c3\u0007\u000f\u0000\u0000\u00c3\u00c4"+ - "\u0007\u0011\u0000\u0000\u00c4\u00c6\u0007\u0007\u0000\u0000\u00c5\u00bf"+ - "\u0001\u0000\u0000\u0000\u00c5\u00c2\u0001\u0000\u0000\u0000\u00c5\u00c6"+ - "\u0001\u0000\u0000\u0000\u00c6\u0140\u0001\u0000\u0000\u0000\u00c7\u00c8"+ - "\u0007\r\u0000\u0000\u00c8\u00c9\u0007\u0011\u0000\u0000\u00c9\u00ca\u0007"+ - "\u0012\u0000\u0000\u00ca\u00d3\u0001\u0000\u0000\u0000\u00cb\u00cc\u0007"+ - "\n\u0000\u0000\u00cc\u00cd\u0007\u0005\u0000\u0000\u00cd\u00ce\u0007\u000e"+ - "\u0000\u0000\u00ce\u00d4\u0007\b\u0000\u0000\u00cf\u00d0\u0007\n\u0000"+ - "\u0000\u00d0\u00d1\u0007\u0013\u0000\u0000\u00d1\u00d2\u0007\u000b\u0000"+ - "\u0000\u00d2\u00d4\u0007\n\u0000\u0000\u00d3\u00cb\u0001\u0000\u0000\u0000"+ - "\u00d3\u00cf\u0001\u0000\u0000\u0000\u00d3\u00d4\u0001\u0000\u0000\u0000"+ - "\u00d4\u0140\u0001\u0000\u0000\u0000\u00d5\u00d6\u0007\u0014\u0000\u0000"+ - "\u00d6\u00d7\u0007\b\u0000\u0000\u00d7\u00d8\u0007\f\u0000\u0000\u00d8"+ - "\u00d9\u0007\u0013\u0000\u0000\u00d9\u0140\u0007\n\u0000\u0000\u00da\u00db"+ - "\u0007\b\u0000\u0000\u00db\u00dc\u0007\u0005\u0000\u0000\u00dc\u00dd\u0007"+ - "\u000b\u0000\u0000\u00dd\u00de\u0007\u000b\u0000\u0000\u00de\u00df\u0007"+ - "\n\u0000\u0000\u00df\u00e0\u0007\u000e\u0000\u0000\u00e0\u00e1\u0007\u0007"+ - "\u0000\u0000\u00e1\u00e2\u0007\f\u0000\u0000\u00e2\u00e3\u0007\u0011\u0000"+ - "\u0000\u00e3\u0140\u0007\u000f\u0000\u0000\u00e4\u00e5\u0007\u000b\u0000"+ - "\u0000\u00e5\u00e6\u0007\n\u0000\u0000\u00e6\u00e7\u0007\u000e\u0000\u0000"+ - "\u00e7\u00e8\u0007\u0007\u0000\u0000\u00e8\u00e9\u0007\f\u0000\u0000\u00e9"+ - "\u00ea\u0007\u0011\u0000\u0000\u00ea\u00eb\u0007\u000f\u0000\u0000\u00eb"+ - "\u00ec\u0007\u0015\u0000\u0000\u00ec\u00ed\u0007\f\u0000\u0000\u00ed\u00ee"+ - "\u0007\u000b\u0000\u0000\u00ee\u00ef\u0007\u000b\u0000\u0000\u00ef\u00f0"+ - "\u0007\f\u0000\u0000\u00f0\u00f1\u0007\u000f\u0000\u0000\u00f1\u0140\u0007"+ - "\t\u0000\u0000\u00f2\u00f3\u0007\r\u0000\u0000\u00f3\u00f4\u0007\u0012"+ - "\u0000\u0000\u00f4\u00f5\u0007\u0005\u0000\u0000\u00f5\u00f6\u0007\t\u0000"+ - "\u0000\u00f6\u00f7\u0007\u0015\u0000\u0000\u00f7\u00f8\u0007\n\u0000\u0000"+ - "\u00f8\u00f9\u0007\u000f\u0000\u0000\u00f9\u0140\u0007\u0007\u0000\u0000"+ - "\u00fa\u00fb\u0007\u0016\u0000\u0000\u00fb\u00fc\u0007\n\u0000\u0000\u00fc"+ - "\u00fd\u0007\u0012\u0000\u0000\u00fd\u00fe\u0007\u0017\u0000\u0000\u00fe"+ - "\u00ff\u0007\u0005\u0000\u0000\u00ff\u0100\u0007\u0007\u0000\u0000\u0100"+ - "\u0101\u0007\f\u0000\u0000\u0101\u0140\u0007\u0015\u0000\u0000\u0102\u0103"+ - "\u0007\f\u0000\u0000\u0103\u0104\u0007\u000b\u0000\u0000\u0104\u0105\u0007"+ - "\u000b\u0000\u0000\u0105\u0106\u0007\n\u0000\u0000\u0106\u0140\u0007\u0007"+ - "\u0000\u0000\u0107\u0108\u0007\u0006\u0000\u0000\u0108\u0109\u0007\u000f"+ - "\u0000\u0000\u0109\u010a\u0007\u0013\u0000\u0000\u010a\u010b\u0007\n\u0000"+ - "\u0000\u010b\u010c\u0007\u000b\u0000\u0000\u010c\u0140\u0007\u000b\u0000"+ - "\u0000\u010d\u010e\u0007\n\u0000\u0000\u010e\u010f\u0007\u0015\u0000\u0000"+ - "\u010f\u0110\u0007\u0018\u0000\u0000\u0110\u0111\u0007\u0007\u0000\u0000"+ - "\u0111\u0140\u0007\u0010\u0000\u0000\u0112\u0113\u0007\u000b\u0000\u0000"+ - "\u0113\u0114\u0007\n\u0000\u0000\u0114\u0115\u0007\u000b\u0000\u0000\u0115"+ - "\u0116\u0007\u000b\u0000\u0000\u0116\u0117\u0007\f\u0000\u0000\u0117\u0118"+ - "\u0007\u0011\u0000\u0000\u0118\u0140\u0007\u000f\u0000\u0000\u0119\u011a"+ - "\u0007\n\u0000\u0000\u011a\u011b\u0007\u000f\u0000\u0000\u011b\u0140\u0007"+ - "\u0016\u0000\u0000\u011c\u011d\u0007\u0011\u0000\u0000\u011d\u011e\u0007"+ - "\u000f\u0000\u0000\u011e\u011f\u0007\u000e\u0000\u0000\u011f\u0140\u0007"+ - "\n\u0000\u0000\u0120\u0121\u0007\n\u0000\u0000\u0121\u0122\u0007\u0012"+ - "\u0000\u0000\u0122\u0123\u0007\u0012\u0000\u0000\u0123\u0124\u0007\u0011"+ - "\u0000\u0000\u0124\u0140\u0007\u0012\u0000\u0000\u0125\u0126\u0007\u0018"+ - "\u0000\u0000\u0126\u0127\u0007\u0006\u0000\u0000\u0127\u0128\u0007\u000b"+ - "\u0000\u0000\u0128\u0129\u0007\b\u0000\u0000\u0129\u0130\u0001\u0000\u0000"+ - "\u0000\u012a\u012b\u0007\f\u0000\u0000\u012b\u0131\u0007\r\u0000\u0000"+ - "\u012c\u012d\u0007\u0011\u0000\u0000\u012d\u012e\u0007\u000f\u0000\u0000"+ - "\u012e\u012f\u0007\u000e\u0000\u0000\u012f\u0131\u0007\n\u0000\u0000\u0130"+ - "\u012a\u0001\u0000\u0000\u0000\u0130\u012c\u0001\u0000\u0000\u0000\u0130"+ - "\u0131\u0001\u0000\u0000\u0000\u0131\u0140\u0001\u0000\u0000\u0000\u0132"+ - "\u0133\u0007\u0018\u0000\u0000\u0133\u0134\u0007\u0012\u0000\u0000\u0134"+ - "\u0135\u0007\n\u0000\u0000\u0135\u0136\u0007\u0018\u0000\u0000\u0136\u0137"+ - "\u0007\n\u0000\u0000\u0137\u0138\u0007\u000f\u0000\u0000\u0138\u0140\u0007"+ - "\u0019\u0000\u0000\u0139\u013a\u0007\u000b\u0000\u0000\u013a\u013b\u0007"+ - "\u0014\u0000\u0000\u013b\u013c\u0007\f\u0000\u0000\u013c\u013d\u0007\u0007"+ - "\u0000\u0000\u013d\u013e\u0007\u000e\u0000\u0000\u013e\u0140\u0007\b\u0000"+ - "\u0000\u013f\u00b0\u0001\u0000\u0000\u0000\u013f\u00b4\u0001\u0000\u0000"+ - "\u0000\u013f\u00b9\u0001\u0000\u0000\u0000\u013f\u00bb\u0001\u0000\u0000"+ - "\u0000\u013f\u00c7\u0001\u0000\u0000\u0000\u013f\u00d5\u0001\u0000\u0000"+ - "\u0000\u013f\u00da\u0001\u0000\u0000\u0000\u013f\u00e4\u0001\u0000\u0000"+ - "\u0000\u013f\u00f2\u0001\u0000\u0000\u0000\u013f\u00fa\u0001\u0000\u0000"+ - "\u0000\u013f\u0102\u0001\u0000\u0000\u0000\u013f\u0107\u0001\u0000\u0000"+ - "\u0000\u013f\u010d\u0001\u0000\u0000\u0000\u013f\u0112\u0001\u0000\u0000"+ - "\u0000\u013f\u0119\u0001\u0000\u0000\u0000\u013f\u011c\u0001\u0000\u0000"+ - "\u0000\u013f\u0120\u0001\u0000\u0000\u0000\u013f\u0125\u0001\u0000\u0000"+ - "\u0000\u013f\u0132\u0001\u0000\u0000\u0000\u013f\u0139\u0001\u0000\u0000"+ - "\u0000\u0140\u0013\u0001\u0000\u0000\u0000\u0141\u0142\u0005<\u0000\u0000"+ - "\u0142\u0143\u0005?\u0000\u0000\u0143\u0144\u0005=\u0000\u0000\u0144\u0148"+ - "\u0001\u0000\u0000\u0000\u0145\u0147\t\u0000\u0000\u0000\u0146\u0145\u0001"+ - "\u0000\u0000\u0000\u0147\u014a\u0001\u0000\u0000\u0000\u0148\u0149\u0001"+ - "\u0000\u0000\u0000\u0148\u0146\u0001\u0000\u0000\u0000\u0149\u014b\u0001"+ - "\u0000\u0000\u0000\u014a\u0148\u0001\u0000\u0000\u0000\u014b\u014c\u0005"+ - "?\u0000\u0000\u014c\u015c\u0005>\u0000\u0000\u014d\u014e\u0005<\u0000"+ - "\u0000\u014e\u014f\u0005?\u0000\u0000\u014f\u0150\u0007\u0018\u0000\u0000"+ - "\u0150\u0151\u0007\b\u0000\u0000\u0151\u0152\u0007\u0018\u0000\u0000\u0152"+ - "\u0156\u0001\u0000\u0000\u0000\u0153\u0155\t\u0000\u0000\u0000\u0154\u0153"+ - "\u0001\u0000\u0000\u0000\u0155\u0158\u0001\u0000\u0000\u0000\u0156\u0157"+ - "\u0001\u0000\u0000\u0000\u0156\u0154\u0001\u0000\u0000\u0000\u0157\u0159"+ - "\u0001\u0000\u0000\u0000\u0158\u0156\u0001\u0000\u0000\u0000\u0159\u015a"+ - "\u0005?\u0000\u0000\u015a\u015c\u0005>\u0000\u0000\u015b\u0141\u0001\u0000"+ - "\u0000\u0000\u015b\u014d\u0001\u0000\u0000\u0000\u015c\u0015\u0001\u0000"+ - "\u0000\u0000\u015d\u015e\u0005{\u0000\u0000\u015e\u015f\u0005{\u0000\u0000"+ - "\u015f\u01e5\u0005{\u0000\u0000\u0160\u0161\u0005@\u0000\u0000\u0161\u0162"+ - "\u0005@\u0000\u0000\u0162\u0164\u0001\u0000\u0000\u0000\u0163\u0165\u0005"+ - "@\u0000\u0000\u0164\u0163\u0001\u0000\u0000\u0000\u0164\u0165\u0001\u0000"+ - "\u0000\u0000\u0165\u01e5\u0001\u0000\u0000\u0000\u0166\u0167\u0005@\u0000"+ - "\u0000\u0167\u0168\u0005{\u0000\u0000\u0168\u016a\u0001\u0000\u0000\u0000"+ - "\u0169\u016b\u0005{\u0000\u0000\u016a\u0169\u0001\u0000\u0000\u0000\u016a"+ - "\u016b\u0001\u0000\u0000\u0000\u016b\u01e5\u0001\u0000\u0000\u0000\u016c"+ - "\u016d\u0005@\u0000\u0000\u016d\u016e\u0007\u0015\u0000\u0000\u016e\u016f"+ - "\u0007\n\u0000\u0000\u016f\u0170\u0007\u0019\u0000\u0000\u0170\u0171\u0007"+ - "\f\u0000\u0000\u0171\u0172\u0007\u0005\u0000\u0000\u0172\u0176\u0001\u0000"+ - "\u0000\u0000\u0173\u0175\u0007\u001a\u0000\u0000\u0174\u0173\u0001\u0000"+ - "\u0000\u0000\u0175\u0178\u0001\u0000\u0000\u0000\u0176\u0174\u0001\u0000"+ - "\u0000\u0000\u0176\u0177\u0001\u0000\u0000\u0000\u0177\u01e5\u0001\u0000"+ - "\u0000\u0000\u0178\u0176\u0001\u0000\u0000\u0000\u0179\u017a\u0005@\u0000"+ - "\u0000\u017a\u017b\u0007\u000e\u0000\u0000\u017b\u017c\u0007\b\u0000\u0000"+ - "\u017c\u017d\u0007\u0005\u0000\u0000\u017d\u017e\u0007\u0012\u0000\u0000"+ - "\u017e\u017f\u0007\u000b\u0000\u0000\u017f\u0180\u0007\n\u0000\u0000\u0180"+ - "\u01e5\u0007\u0007\u0000\u0000\u0181\u0182\u0005@\u0000\u0000\u0182\u0183"+ - "\u0007\f\u0000\u0000\u0183\u0184\u0007\u0015\u0000\u0000\u0184\u0185\u0007"+ - "\u0018\u0000\u0000\u0185\u0186\u0007\u0011\u0000\u0000\u0186\u0187\u0007"+ - "\u0012\u0000\u0000\u0187\u01e5\u0007\u0007\u0000\u0000\u0188\u0189\u0005"+ - "@\u0000\u0000\u0189\u018a\u0007\u000f\u0000\u0000\u018a\u018b\u0007\u0005"+ - "\u0000\u0000\u018b\u018c\u0007\u0015\u0000\u0000\u018c\u018d\u0007\n\u0000"+ - "\u0000\u018d\u018e\u0007\u000b\u0000\u0000\u018e\u018f\u0007\u0018\u0000"+ - "\u0000\u018f\u0190\u0007\u0005\u0000\u0000\u0190\u0191\u0007\u000e\u0000"+ - "\u0000\u0191\u01e5\u0007\n\u0000\u0000\u0192\u0193\u0005@\u0000\u0000"+ - "\u0193\u0194\u0007\u0019\u0000\u0000\u0194\u0195\u0007\u0011\u0000\u0000"+ - "\u0195\u0196\u0007\u000e\u0000\u0000\u0196\u0197\u0007\u0006\u0000\u0000"+ - "\u0197\u0198\u0007\u0015\u0000\u0000\u0198\u0199\u0007\n\u0000\u0000\u0199"+ - "\u019a\u0007\u000f\u0000\u0000\u019a\u01e5\u0007\u0007\u0000\u0000\u019b"+ - "\u019c\u0005@\u0000\u0000\u019c\u019d\u0007\r\u0000\u0000\u019d\u019e"+ - "\u0007\u0011\u0000\u0000\u019e\u019f\u0007\u000f\u0000\u0000\u019f\u01a0"+ - "\u0007\u0007\u0000\u0000\u01a0\u01a1\u0005-\u0000\u0000\u01a1\u01a2\u0007"+ - "\r\u0000\u0000\u01a2\u01a3\u0007\u0005\u0000\u0000\u01a3\u01a4\u0007\u000e"+ - "\u0000\u0000\u01a4\u01e5\u0007\n\u0000\u0000\u01a5\u01a6\u0005@\u0000"+ - "\u0000\u01a6\u01a7\u0007\u0018\u0000\u0000\u01a7\u01a8\u0007\u0005\u0000"+ - "\u0000\u01a8\u01a9\u0007\t\u0000\u0000\u01a9\u01e5\u0007\n\u0000\u0000"+ - "\u01aa\u01ab\u0005@\u0000\u0000\u01ab\u01ac\u0007\u000b\u0000\u0000\u01ac"+ - "\u01ad\u0007\u0006\u0000\u0000\u01ad\u01ae\u0007\u0018\u0000\u0000\u01ae"+ - "\u01af\u0007\u0018\u0000\u0000\u01af\u01b0\u0007\u0011\u0000\u0000\u01b0"+ - "\u01b1\u0007\u0012\u0000\u0000\u01b1\u01b2\u0007\u0007\u0000\u0000\u01b2"+ - "\u01e5\u0007\u000b\u0000\u0000\u01b3\u01b4\u0005@\u0000\u0000\u01b4\u01b5"+ - "\u0007\u0013\u0000\u0000\u01b5\u01b6\u0007\u0005\u0000\u0000\u01b6\u01b7"+ - "\u0007\u0010\u0000\u0000\u01b7\u01b8\u0007\n\u0000\u0000\u01b8\u01e5\u0007"+ - "\u0012\u0000\u0000\u01b9\u01ba\u0005@\u0000\u0000\u01ba\u01bb\u0007\u0007"+ - "\u0000\u0000\u01bb\u01bc\u0007\u0005\u0000\u0000\u01bc\u01bd\u0007\f\u0000"+ - "\u0000\u01bd\u01be\u0007\u0013\u0000\u0000\u01be\u01bf\u0007\u0014\u0000"+ - "\u0000\u01bf\u01c0\u0007\f\u0000\u0000\u01c0\u01c1\u0007\u000f\u0000\u0000"+ - "\u01c1\u01e5\u0007\u0019\u0000\u0000\u01c2\u01c3\u0005@\u0000\u0000\u01c3"+ - "\u01c4\u0007\u0005\u0000\u0000\u01c4\u01c5\u0007\u0018\u0000\u0000\u01c5"+ - "\u01c6\u0007\u0018\u0000\u0000\u01c6\u01c7\u0007\u0013\u0000\u0000\u01c7"+ - "\u01e5\u0007\u0010\u0000\u0000\u01c8\u01c9\u0005@\u0000\u0000\u01c9\u01ca"+ - "\u0005-\u0000\u0000\u01ca\u01cb\u0007\u0014\u0000\u0000\u01cb\u01cc\u0007"+ - "\n\u0000\u0000\u01cc\u01cd\u0007\u0017\u0000\u0000\u01cd\u01ce\u0007\u001b"+ - "\u0000\u0000\u01ce\u01cf\u0007\f\u0000\u0000\u01cf\u01d0\u0007\u0007\u0000"+ - "\u0000\u01d0\u01d1\u0005-\u0000\u0000\u01d1\u01d2\u0007\u001b\u0000\u0000"+ - "\u01d2\u01d3\u0007\n\u0000\u0000\u01d3\u01d4\u0007\u0010\u0000\u0000\u01d4"+ - "\u01d5\u0007\r\u0000\u0000\u01d5\u01d6\u0007\u0012\u0000\u0000\u01d6\u01d7"+ - "\u0007\u0005\u0000\u0000\u01d7\u01d8\u0007\u0015\u0000\u0000\u01d8\u01d9"+ - "\u0007\n\u0000\u0000\u01d9\u01e5\u0007\u000b\u0000\u0000\u01da\u01db\u0005"+ - "@\u0000\u0000\u01db\u01dc\u0007\u001b\u0000\u0000\u01dc\u01dd\u0007\n"+ - "\u0000\u0000\u01dd\u01de\u0007\u0010\u0000\u0000\u01de\u01df\u0007\r\u0000"+ - "\u0000\u01df\u01e0\u0007\u0012\u0000\u0000\u01e0\u01e1\u0007\u0005\u0000"+ - "\u0000\u01e1\u01e2\u0007\u0015\u0000\u0000\u01e2\u01e3\u0007\n\u0000\u0000"+ - "\u01e3\u01e5\u0007\u000b\u0000\u0000\u01e4\u015d\u0001\u0000\u0000\u0000"+ - "\u01e4\u0160\u0001\u0000\u0000\u0000\u01e4\u0166\u0001\u0000\u0000\u0000"+ - "\u01e4\u016c\u0001\u0000\u0000\u0000\u01e4\u0179\u0001\u0000\u0000\u0000"+ - "\u01e4\u0181\u0001\u0000\u0000\u0000\u01e4\u0188\u0001\u0000\u0000\u0000"+ - "\u01e4\u0192\u0001\u0000\u0000\u0000\u01e4\u019b\u0001\u0000\u0000\u0000"+ - "\u01e4\u01a5\u0001\u0000\u0000\u0000\u01e4\u01aa\u0001\u0000\u0000\u0000"+ - "\u01e4\u01b3\u0001\u0000\u0000\u0000\u01e4\u01b9\u0001\u0000\u0000\u0000"+ - "\u01e4\u01c2\u0001\u0000\u0000\u0000\u01e4\u01c8\u0001\u0000\u0000\u0000"+ - "\u01e4\u01da\u0001\u0000\u0000\u0000\u01e5\u01e6\u0001\u0000\u0000\u0000"+ - "\u01e6\u01e7\u0006\b\u0000\u0000\u01e7\u0017\u0001\u0000\u0000\u0000\u01e8"+ - "\u01e9\u0005@\u0000\u0000\u01e9\u01ea\u0003\u0012\u0006\u0000\u01ea\u01eb"+ - "\u0003\f\u0003\u0000\u01eb\u01ec\u0001\u0000\u0000\u0000\u01ec\u01ed\u0006"+ - "\t\u0001\u0000\u01ed\u0019\u0001\u0000\u0000\u0000\u01ee\u01fd\u0005@"+ - "\u0000\u0000\u01ef\u01f0\u0007\u0005\u0000\u0000\u01f0\u01f1\u0007\u0006"+ - "\u0000\u0000\u01f1\u01f2\u0007\u0007\u0000\u0000\u01f2\u01fe\u0007\b\u0000"+ - "\u0000\u01f3\u01f4\u0007\u0018\u0000\u0000\u01f4\u01f5\u0007\u0012\u0000"+ - "\u0000\u01f5\u01f6\u0007\u0011\u0000\u0000\u01f6\u01f7\u0007\u0019\u0000"+ - "\u0000\u01f7\u01f8\u0007\u0006\u0000\u0000\u01f8\u01f9\u0007\u000e\u0000"+ - "\u0000\u01f9\u01fa\u0007\u0007\u0000\u0000\u01fa\u01fb\u0007\f\u0000\u0000"+ - "\u01fb\u01fc\u0007\u0011\u0000\u0000\u01fc\u01fe\u0007\u000f\u0000\u0000"+ - "\u01fd\u01ef\u0001\u0000\u0000\u0000\u01fd\u01f3\u0001\u0000\u0000\u0000"+ - "\u01fe\u01ff\u0001\u0000\u0000\u0000\u01ff\u0200\u0006\n\u0002\u0000\u0200"+ - "\u001b\u0001\u0000\u0000\u0000\u0201\u0202\u0005@\u0000\u0000\u0202\u0203"+ - "\u0007\n\u0000\u0000\u0203\u0204\u0007\u000f\u0000\u0000\u0204\u0205\u0007"+ - "\u0019\u0000\u0000\u0205\u0206\u0001\u0000\u0000\u0000\u0206\u020f\u0003"+ - "\u0012\u0006\u0000\u0207\u0208\u0005@\u0000\u0000\u0208\u0209\u0007\n"+ - "\u0000\u0000\u0209\u020a\u0007\u000f\u0000\u0000\u020a\u020b\u0007\u0019"+ + "!\u0004!\u044b\b!\u000b!\f!\u044c\u0001\"\u0004\"\u0450\b\"\u000b\"\f"+ + "\"\u0451\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001%\u0001"+ + "%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ + "(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001"+ + "+\u0001+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + "/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00011\u00011\u00011\u0001"+ + "1\u00012\u00012\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u0001"+ + "3\u00013\u00013\u00013\u00013\u00014\u00044\u049e\b4\u000b4\f4\u049f\u0001"+ + "4\u00014\u00015\u00015\u00015\u00015\u00016\u00016\u00016\u00016\u0001"+ + "6\u00017\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u00019\u0001"+ + "9\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0001;\u0001"+ + ";\u0001;\u0001;\u0004\u00a0\u0148\u0156\u02d6\u0000<\u0006\u0000\b\u0000"+ + "\n\u0000\f\u0000\u000e\u0000\u0010\u0000\u0012\u0000\u0014\u0004\u0016"+ + "\u0000\u0018\u0005\u001a\u0000\u001c\u0006\u001e\u0007 \b\"\t$\n&\u000b"+ + "(\f*\r,\u000e.\u000f0\u00102\u00114\u00126\u00138\u0014:\u0015<\u0016"+ + ">\u0017@\u0018B\u0019D\u001aF\u001bH\u001cJ\u001dL\u001eN\u001fP R\u0000"+ + "T!V\"X#Z$\\%^&`\'b(d)f\u0000h*j+l,n\u0000p\u0000r-t.v/x0z1|2\u0006\u0000"+ + "\u0001\u0002\u0003\u0004\u0005$\u0003\u0000AZaz\u0080\u8000\ufffe\u0005"+ + "\u000009AZ__az\u0080\u8000\ufffe\u0006\u0000..0:AZ__az\u0080\u8000\ufffe"+ + "\u0002\u0000\"\"\\\\\u0002\u0000\'\'\\\\\u0002\u0000AAaa\u0002\u0000U"+ + "Uuu\u0002\u0000TTtt\u0002\u0000HHhh\u0002\u0000GGgg\u0002\u0000EEee\u0002"+ + "\u0000SSss\u0002\u0000IIii\u0002\u0000FFff\u0002\u0000CCcc\u0002\u0000"+ + "NNnn\u0002\u0000YYyy\u0002\u0000OOoo\u0002\u0000RRrr\u0002\u0000LLll\u0002"+ + "\u0000WWww\u0002\u0000MMmm\u0002\u0000VVvv\u0002\u0000BBbb\u0002\u0000"+ + "PPpp\u0002\u0000DDdd\u0001\u0000 \u0002\u0000KKkk\u0006\u0000..09AZ_"+ + "_az\u0080\u8000\ufffe\u0002\u0000XXxx\u0002\u0000QQqq\u0001\u000019\u0006"+ + "\u0000ABIIPQabiipq\u0002\u0000\t\t \u0002\u0000\n\n\r\r\u0001\u0000@"+ + "@\u0549\u0000\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000\u0000"+ + "\u0000\u0000\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000"+ + "\u0000\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000"+ + "\u0000\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000"+ + "\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000("+ + "\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000"+ + "\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000"+ + "\u00002\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006"+ + "\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000"+ + "\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000"+ + "\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000D"+ + "\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001\u0000"+ + "\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000\u0000"+ + "\u0001N\u0001\u0000\u0000\u0000\u0001P\u0001\u0000\u0000\u0000\u0001R"+ + "\u0001\u0000\u0000\u0000\u0001T\u0001\u0000\u0000\u0000\u0001V\u0001\u0000"+ + "\u0000\u0000\u0002X\u0001\u0000\u0000\u0000\u0002Z\u0001\u0000\u0000\u0000"+ + "\u0002\\\u0001\u0000\u0000\u0000\u0002^\u0001\u0000\u0000\u0000\u0002"+ + "`\u0001\u0000\u0000\u0000\u0002b\u0001\u0000\u0000\u0000\u0002d\u0001"+ + "\u0000\u0000\u0000\u0002f\u0001\u0000\u0000\u0000\u0002h\u0001\u0000\u0000"+ + "\u0000\u0002j\u0001\u0000\u0000\u0000\u0003l\u0001\u0000\u0000\u0000\u0003"+ + "n\u0001\u0000\u0000\u0000\u0003p\u0001\u0000\u0000\u0000\u0004r\u0001"+ + "\u0000\u0000\u0000\u0004t\u0001\u0000\u0000\u0000\u0004v\u0001\u0000\u0000"+ + "\u0000\u0005x\u0001\u0000\u0000\u0000\u0005z\u0001\u0000\u0000\u0000\u0005"+ + "|\u0001\u0000\u0000\u0000\u0006~\u0001\u0000\u0000\u0000\b\u0085\u0001"+ + "\u0000\u0000\u0000\n\u008c\u0001\u0000\u0000\u0000\f\u0096\u0001\u0000"+ + "\u0000\u0000\u000e\u009b\u0001\u0000\u0000\u0000\u0010\u00a5\u0001\u0000"+ + "\u0000\u0000\u0012\u013f\u0001\u0000\u0000\u0000\u0014\u015b\u0001\u0000"+ + "\u0000\u0000\u0016\u01e4\u0001\u0000\u0000\u0000\u0018\u01e8\u0001\u0000"+ + "\u0000\u0000\u001a\u01ee\u0001\u0000\u0000\u0000\u001c\u020e\u0001\u0000"+ + "\u0000\u0000\u001e\u0210\u0001\u0000\u0000\u0000 \u0239\u0001\u0000\u0000"+ + "\u0000\"\u024d\u0001\u0000\u0000\u0000$\u025e\u0001\u0000\u0000\u0000"+ + "&\u0269\u0001\u0000\u0000\u0000(\u026d\u0001\u0000\u0000\u0000*\u026f"+ + "\u0001\u0000\u0000\u0000,\u0274\u0001\u0000\u0000\u0000.\u027a\u0001\u0000"+ + "\u0000\u00000\u027c\u0001\u0000\u0000\u00002\u02cc\u0001\u0000\u0000\u0000"+ + "4\u02ce\u0001\u0000\u0000\u00006\u02dd\u0001\u0000\u0000\u00008\u03ff"+ + "\u0001\u0000\u0000\u0000:\u0431\u0001\u0000\u0000\u0000<\u0433\u0001\u0000"+ + "\u0000\u0000>\u0435\u0001\u0000\u0000\u0000@\u0437\u0001\u0000\u0000\u0000"+ + "B\u043a\u0001\u0000\u0000\u0000D\u043c\u0001\u0000\u0000\u0000F\u0445"+ + "\u0001\u0000\u0000\u0000H\u044a\u0001\u0000\u0000\u0000J\u044f\u0001\u0000"+ + "\u0000\u0000L\u0453\u0001\u0000\u0000\u0000N\u0457\u0001\u0000\u0000\u0000"+ + "P\u045a\u0001\u0000\u0000\u0000R\u045d\u0001\u0000\u0000\u0000T\u0461"+ + "\u0001\u0000\u0000\u0000V\u0465\u0001\u0000\u0000\u0000X\u0469\u0001\u0000"+ + "\u0000\u0000Z\u046c\u0001\u0000\u0000\u0000\\\u046f\u0001\u0000\u0000"+ + "\u0000^\u0474\u0001\u0000\u0000\u0000`\u0479\u0001\u0000\u0000\u0000b"+ + "\u047e\u0001\u0000\u0000\u0000d\u0483\u0001\u0000\u0000\u0000f\u0486\u0001"+ + "\u0000\u0000\u0000h\u048a\u0001\u0000\u0000\u0000j\u048e\u0001\u0000\u0000"+ + "\u0000l\u0492\u0001\u0000\u0000\u0000n\u049d\u0001\u0000\u0000\u0000p"+ + "\u04a3\u0001\u0000\u0000\u0000r\u04a7\u0001\u0000\u0000\u0000t\u04ac\u0001"+ + "\u0000\u0000\u0000v\u04b0\u0001\u0000\u0000\u0000x\u04b4\u0001\u0000\u0000"+ + "\u0000z\u04ba\u0001\u0000\u0000\u0000|\u04be\u0001\u0000\u0000\u0000~"+ + "\u0082\u0007\u0000\u0000\u0000\u007f\u0081\u0007\u0001\u0000\u0000\u0080"+ + "\u007f\u0001\u0000\u0000\u0000\u0081\u0084\u0001\u0000\u0000\u0000\u0082"+ + "\u0080\u0001\u0000\u0000\u0000\u0082\u0083\u0001\u0000\u0000\u0000\u0083"+ + "\u0007\u0001\u0000\u0000\u0000\u0084\u0082\u0001\u0000\u0000\u0000\u0085"+ + "\u0089\u0007\u0000\u0000\u0000\u0086\u0088\u0007\u0001\u0000\u0000\u0087"+ + "\u0086\u0001\u0000\u0000\u0000\u0088\u008b\u0001\u0000\u0000\u0000\u0089"+ + "\u0087\u0001\u0000\u0000\u0000\u0089\u008a\u0001\u0000\u0000\u0000\u008a"+ + "\t\u0001\u0000\u0000\u0000\u008b\u0089\u0001\u0000\u0000\u0000\u008c\u0090"+ + "\u0007\u0000\u0000\u0000\u008d\u008f\u0007\u0002\u0000\u0000\u008e\u008d"+ + "\u0001\u0000\u0000\u0000\u008f\u0092\u0001\u0000\u0000\u0000\u0090\u008e"+ + "\u0001\u0000\u0000\u0000\u0090\u0091\u0001\u0000\u0000\u0000\u0091\u000b"+ + "\u0001\u0000\u0000\u0000\u0092\u0090\u0001\u0000\u0000\u0000\u0093\u0095"+ + "\u0005 \u0000\u0000\u0094\u0093\u0001\u0000\u0000\u0000\u0095\u0098\u0001"+ + "\u0000\u0000\u0000\u0096\u0094\u0001\u0000\u0000\u0000\u0096\u0097\u0001"+ + "\u0000\u0000\u0000\u0097\u0099\u0001\u0000\u0000\u0000\u0098\u0096\u0001"+ + "\u0000\u0000\u0000\u0099\u009a\u0004\u0003\u0000\u0000\u009a\r\u0001\u0000"+ + "\u0000\u0000\u009b\u00a0\u0005\"\u0000\u0000\u009c\u009f\u0007\u0003\u0000"+ + "\u0000\u009d\u009f\t\u0000\u0000\u0000\u009e\u009c\u0001\u0000\u0000\u0000"+ + "\u009e\u009d\u0001\u0000\u0000\u0000\u009f\u00a2\u0001\u0000\u0000\u0000"+ + "\u00a0\u00a1\u0001\u0000\u0000\u0000\u00a0\u009e\u0001\u0000\u0000\u0000"+ + "\u00a1\u00a3\u0001\u0000\u0000\u0000\u00a2\u00a0\u0001\u0000\u0000\u0000"+ + "\u00a3\u00a4\u0005\"\u0000\u0000\u00a4\u000f\u0001\u0000\u0000\u0000\u00a5"+ + "\u00ab\u0005\'\u0000\u0000\u00a6\u00aa\b\u0004\u0000\u0000\u00a7\u00a8"+ + "\u0005\\\u0000\u0000\u00a8\u00aa\t\u0000\u0000\u0000\u00a9\u00a6\u0001"+ + "\u0000\u0000\u0000\u00a9\u00a7\u0001\u0000\u0000\u0000\u00aa\u00ad\u0001"+ + "\u0000\u0000\u0000\u00ab\u00a9\u0001\u0000\u0000\u0000\u00ab\u00ac\u0001"+ + "\u0000\u0000\u0000\u00ac\u00ae\u0001\u0000\u0000\u0000\u00ad\u00ab\u0001"+ + "\u0000\u0000\u0000\u00ae\u00af\u0005\'\u0000\u0000\u00af\u0011\u0001\u0000"+ + "\u0000\u0000\u00b0\u00b1\u0007\u0005\u0000\u0000\u00b1\u00b2\u0007\u0006"+ + "\u0000\u0000\u00b2\u00b3\u0007\u0007\u0000\u0000\u00b3\u0140\u0007\b\u0000"+ + "\u0000\u00b4\u00b5\u0007\t\u0000\u0000\u00b5\u00b6\u0007\u0006\u0000\u0000"+ + "\u00b6\u00b7\u0007\n\u0000\u0000\u00b7\u00b8\u0007\u000b\u0000\u0000\u00b8"+ + "\u0140\u0007\u0007\u0000\u0000\u00b9\u00ba\u0007\f\u0000\u0000\u00ba\u0140"+ + "\u0007\r\u0000\u0000\u00bb\u00bc\u0007\u000e\u0000\u0000\u00bc\u00bd\u0007"+ + "\u0005\u0000\u0000\u00bd\u00be\u0007\u000f\u0000\u0000\u00be\u00c5\u0001"+ + "\u0000\u0000\u0000\u00bf\u00c0\u0007\u0005\u0000\u0000\u00c0\u00c1\u0007"+ + "\u000f\u0000\u0000\u00c1\u00c6\u0007\u0010\u0000\u0000\u00c2\u00c3\u0007"+ + "\u000f\u0000\u0000\u00c3\u00c4\u0007\u0011\u0000\u0000\u00c4\u00c6\u0007"+ + "\u0007\u0000\u0000\u00c5\u00bf\u0001\u0000\u0000\u0000\u00c5\u00c2\u0001"+ + "\u0000\u0000\u0000\u00c5\u00c6\u0001\u0000\u0000\u0000\u00c6\u0140\u0001"+ + "\u0000\u0000\u0000\u00c7\u00c8\u0007\r\u0000\u0000\u00c8\u00c9\u0007\u0011"+ + "\u0000\u0000\u00c9\u00ca\u0007\u0012\u0000\u0000\u00ca\u00d3\u0001\u0000"+ + "\u0000\u0000\u00cb\u00cc\u0007\n\u0000\u0000\u00cc\u00cd\u0007\u0005\u0000"+ + "\u0000\u00cd\u00ce\u0007\u000e\u0000\u0000\u00ce\u00d4\u0007\b\u0000\u0000"+ + "\u00cf\u00d0\u0007\n\u0000\u0000\u00d0\u00d1\u0007\u0013\u0000\u0000\u00d1"+ + "\u00d2\u0007\u000b\u0000\u0000\u00d2\u00d4\u0007\n\u0000\u0000\u00d3\u00cb"+ + "\u0001\u0000\u0000\u0000\u00d3\u00cf\u0001\u0000\u0000\u0000\u00d3\u00d4"+ + "\u0001\u0000\u0000\u0000\u00d4\u0140\u0001\u0000\u0000\u0000\u00d5\u00d6"+ + "\u0007\u0014\u0000\u0000\u00d6\u00d7\u0007\b\u0000\u0000\u00d7\u00d8\u0007"+ + "\f\u0000\u0000\u00d8\u00d9\u0007\u0013\u0000\u0000\u00d9\u0140\u0007\n"+ + "\u0000\u0000\u00da\u00db\u0007\b\u0000\u0000\u00db\u00dc\u0007\u0005\u0000"+ + "\u0000\u00dc\u00dd\u0007\u000b\u0000\u0000\u00dd\u00de\u0007\u000b\u0000"+ + "\u0000\u00de\u00df\u0007\n\u0000\u0000\u00df\u00e0\u0007\u000e\u0000\u0000"+ + "\u00e0\u00e1\u0007\u0007\u0000\u0000\u00e1\u00e2\u0007\f\u0000\u0000\u00e2"+ + "\u00e3\u0007\u0011\u0000\u0000\u00e3\u0140\u0007\u000f\u0000\u0000\u00e4"+ + "\u00e5\u0007\u000b\u0000\u0000\u00e5\u00e6\u0007\n\u0000\u0000\u00e6\u00e7"+ + "\u0007\u000e\u0000\u0000\u00e7\u00e8\u0007\u0007\u0000\u0000\u00e8\u00e9"+ + "\u0007\f\u0000\u0000\u00e9\u00ea\u0007\u0011\u0000\u0000\u00ea\u00eb\u0007"+ + "\u000f\u0000\u0000\u00eb\u00ec\u0007\u0015\u0000\u0000\u00ec\u00ed\u0007"+ + "\f\u0000\u0000\u00ed\u00ee\u0007\u000b\u0000\u0000\u00ee\u00ef\u0007\u000b"+ + "\u0000\u0000\u00ef\u00f0\u0007\f\u0000\u0000\u00f0\u00f1\u0007\u000f\u0000"+ + "\u0000\u00f1\u0140\u0007\t\u0000\u0000\u00f2\u00f3\u0007\r\u0000\u0000"+ + "\u00f3\u00f4\u0007\u0012\u0000\u0000\u00f4\u00f5\u0007\u0005\u0000\u0000"+ + "\u00f5\u00f6\u0007\t\u0000\u0000\u00f6\u00f7\u0007\u0015\u0000\u0000\u00f7"+ + "\u00f8\u0007\n\u0000\u0000\u00f8\u00f9\u0007\u000f\u0000\u0000\u00f9\u0140"+ + "\u0007\u0007\u0000\u0000\u00fa\u00fb\u0007\u0016\u0000\u0000\u00fb\u00fc"+ + "\u0007\n\u0000\u0000\u00fc\u00fd\u0007\u0012\u0000\u0000\u00fd\u00fe\u0007"+ + "\u0017\u0000\u0000\u00fe\u00ff\u0007\u0005\u0000\u0000\u00ff\u0100\u0007"+ + "\u0007\u0000\u0000\u0100\u0101\u0007\f\u0000\u0000\u0101\u0140\u0007\u0015"+ + "\u0000\u0000\u0102\u0103\u0007\f\u0000\u0000\u0103\u0104\u0007\u000b\u0000"+ + "\u0000\u0104\u0105\u0007\u000b\u0000\u0000\u0105\u0106\u0007\n\u0000\u0000"+ + "\u0106\u0140\u0007\u0007\u0000\u0000\u0107\u0108\u0007\u0006\u0000\u0000"+ + "\u0108\u0109\u0007\u000f\u0000\u0000\u0109\u010a\u0007\u0013\u0000\u0000"+ + "\u010a\u010b\u0007\n\u0000\u0000\u010b\u010c\u0007\u000b\u0000\u0000\u010c"+ + "\u0140\u0007\u000b\u0000\u0000\u010d\u010e\u0007\n\u0000\u0000\u010e\u010f"+ + "\u0007\u0015\u0000\u0000\u010f\u0110\u0007\u0018\u0000\u0000\u0110\u0111"+ + "\u0007\u0007\u0000\u0000\u0111\u0140\u0007\u0010\u0000\u0000\u0112\u0113"+ + "\u0007\u000b\u0000\u0000\u0113\u0114\u0007\n\u0000\u0000\u0114\u0115\u0007"+ + "\u000b\u0000\u0000\u0115\u0116\u0007\u000b\u0000\u0000\u0116\u0117\u0007"+ + "\f\u0000\u0000\u0117\u0118\u0007\u0011\u0000\u0000\u0118\u0140\u0007\u000f"+ + "\u0000\u0000\u0119\u011a\u0007\n\u0000\u0000\u011a\u011b\u0007\u000f\u0000"+ + "\u0000\u011b\u0140\u0007\u0016\u0000\u0000\u011c\u011d\u0007\u0011\u0000"+ + "\u0000\u011d\u011e\u0007\u000f\u0000\u0000\u011e\u011f\u0007\u000e\u0000"+ + "\u0000\u011f\u0140\u0007\n\u0000\u0000\u0120\u0121\u0007\n\u0000\u0000"+ + "\u0121\u0122\u0007\u0012\u0000\u0000\u0122\u0123\u0007\u0012\u0000\u0000"+ + "\u0123\u0124\u0007\u0011\u0000\u0000\u0124\u0140\u0007\u0012\u0000\u0000"+ + "\u0125\u0126\u0007\u0018\u0000\u0000\u0126\u0127\u0007\u0006\u0000\u0000"+ + "\u0127\u0128\u0007\u000b\u0000\u0000\u0128\u0129\u0007\b\u0000\u0000\u0129"+ + "\u0130\u0001\u0000\u0000\u0000\u012a\u012b\u0007\f\u0000\u0000\u012b\u0131"+ + "\u0007\r\u0000\u0000\u012c\u012d\u0007\u0011\u0000\u0000\u012d\u012e\u0007"+ + "\u000f\u0000\u0000\u012e\u012f\u0007\u000e\u0000\u0000\u012f\u0131\u0007"+ + "\n\u0000\u0000\u0130\u012a\u0001\u0000\u0000\u0000\u0130\u012c\u0001\u0000"+ + "\u0000\u0000\u0130\u0131\u0001\u0000\u0000\u0000\u0131\u0140\u0001\u0000"+ + "\u0000\u0000\u0132\u0133\u0007\u0018\u0000\u0000\u0133\u0134\u0007\u0012"+ + "\u0000\u0000\u0134\u0135\u0007\n\u0000\u0000\u0135\u0136\u0007\u0018\u0000"+ + "\u0000\u0136\u0137\u0007\n\u0000\u0000\u0137\u0138\u0007\u000f\u0000\u0000"+ + "\u0138\u0140\u0007\u0019\u0000\u0000\u0139\u013a\u0007\u000b\u0000\u0000"+ + "\u013a\u013b\u0007\u0014\u0000\u0000\u013b\u013c\u0007\f\u0000\u0000\u013c"+ + "\u013d\u0007\u0007\u0000\u0000\u013d\u013e\u0007\u000e\u0000\u0000\u013e"+ + "\u0140\u0007\b\u0000\u0000\u013f\u00b0\u0001\u0000\u0000\u0000\u013f\u00b4"+ + "\u0001\u0000\u0000\u0000\u013f\u00b9\u0001\u0000\u0000\u0000\u013f\u00bb"+ + "\u0001\u0000\u0000\u0000\u013f\u00c7\u0001\u0000\u0000\u0000\u013f\u00d5"+ + "\u0001\u0000\u0000\u0000\u013f\u00da\u0001\u0000\u0000\u0000\u013f\u00e4"+ + "\u0001\u0000\u0000\u0000\u013f\u00f2\u0001\u0000\u0000\u0000\u013f\u00fa"+ + "\u0001\u0000\u0000\u0000\u013f\u0102\u0001\u0000\u0000\u0000\u013f\u0107"+ + "\u0001\u0000\u0000\u0000\u013f\u010d\u0001\u0000\u0000\u0000\u013f\u0112"+ + "\u0001\u0000\u0000\u0000\u013f\u0119\u0001\u0000\u0000\u0000\u013f\u011c"+ + "\u0001\u0000\u0000\u0000\u013f\u0120\u0001\u0000\u0000\u0000\u013f\u0125"+ + "\u0001\u0000\u0000\u0000\u013f\u0132\u0001\u0000\u0000\u0000\u013f\u0139"+ + "\u0001\u0000\u0000\u0000\u0140\u0013\u0001\u0000\u0000\u0000\u0141\u0142"+ + "\u0005<\u0000\u0000\u0142\u0143\u0005?\u0000\u0000\u0143\u0144\u0005="+ + "\u0000\u0000\u0144\u0148\u0001\u0000\u0000\u0000\u0145\u0147\t\u0000\u0000"+ + "\u0000\u0146\u0145\u0001\u0000\u0000\u0000\u0147\u014a\u0001\u0000\u0000"+ + "\u0000\u0148\u0149\u0001\u0000\u0000\u0000\u0148\u0146\u0001\u0000\u0000"+ + "\u0000\u0149\u014b\u0001\u0000\u0000\u0000\u014a\u0148\u0001\u0000\u0000"+ + "\u0000\u014b\u014c\u0005?\u0000\u0000\u014c\u015c\u0005>\u0000\u0000\u014d"+ + "\u014e\u0005<\u0000\u0000\u014e\u014f\u0005?\u0000\u0000\u014f\u0150\u0007"+ + "\u0018\u0000\u0000\u0150\u0151\u0007\b\u0000\u0000\u0151\u0152\u0007\u0018"+ + "\u0000\u0000\u0152\u0156\u0001\u0000\u0000\u0000\u0153\u0155\t\u0000\u0000"+ + "\u0000\u0154\u0153\u0001\u0000\u0000\u0000\u0155\u0158\u0001\u0000\u0000"+ + "\u0000\u0156\u0157\u0001\u0000\u0000\u0000\u0156\u0154\u0001\u0000\u0000"+ + "\u0000\u0157\u0159\u0001\u0000\u0000\u0000\u0158\u0156\u0001\u0000\u0000"+ + "\u0000\u0159\u015a\u0005?\u0000\u0000\u015a\u015c\u0005>\u0000\u0000\u015b"+ + "\u0141\u0001\u0000\u0000\u0000\u015b\u014d\u0001\u0000\u0000\u0000\u015c"+ + "\u0015\u0001\u0000\u0000\u0000\u015d\u015e\u0005{\u0000\u0000\u015e\u015f"+ + "\u0005{\u0000\u0000\u015f\u01e5\u0005{\u0000\u0000\u0160\u0161\u0005@"+ + "\u0000\u0000\u0161\u0162\u0005@\u0000\u0000\u0162\u0164\u0001\u0000\u0000"+ + "\u0000\u0163\u0165\u0005@\u0000\u0000\u0164\u0163\u0001\u0000\u0000\u0000"+ + "\u0164\u0165\u0001\u0000\u0000\u0000\u0165\u01e5\u0001\u0000\u0000\u0000"+ + "\u0166\u0167\u0005@\u0000\u0000\u0167\u0168\u0005{\u0000\u0000\u0168\u016a"+ + "\u0001\u0000\u0000\u0000\u0169\u016b\u0005{\u0000\u0000\u016a\u0169\u0001"+ + "\u0000\u0000\u0000\u016a\u016b\u0001\u0000\u0000\u0000\u016b\u01e5\u0001"+ + "\u0000\u0000\u0000\u016c\u016d\u0005@\u0000\u0000\u016d\u016e\u0007\u0015"+ + "\u0000\u0000\u016e\u016f\u0007\n\u0000\u0000\u016f\u0170\u0007\u0019\u0000"+ + "\u0000\u0170\u0171\u0007\f\u0000\u0000\u0171\u0172\u0007\u0005\u0000\u0000"+ + "\u0172\u0176\u0001\u0000\u0000\u0000\u0173\u0175\u0007\u001a\u0000\u0000"+ + "\u0174\u0173\u0001\u0000\u0000\u0000\u0175\u0178\u0001\u0000\u0000\u0000"+ + "\u0176\u0174\u0001\u0000\u0000\u0000\u0176\u0177\u0001\u0000\u0000\u0000"+ + "\u0177\u01e5\u0001\u0000\u0000\u0000\u0178\u0176\u0001\u0000\u0000\u0000"+ + "\u0179\u017a\u0005@\u0000\u0000\u017a\u017b\u0007\u000e\u0000\u0000\u017b"+ + "\u017c\u0007\b\u0000\u0000\u017c\u017d\u0007\u0005\u0000\u0000\u017d\u017e"+ + "\u0007\u0012\u0000\u0000\u017e\u017f\u0007\u000b\u0000\u0000\u017f\u0180"+ + "\u0007\n\u0000\u0000\u0180\u01e5\u0007\u0007\u0000\u0000\u0181\u0182\u0005"+ + "@\u0000\u0000\u0182\u0183\u0007\f\u0000\u0000\u0183\u0184\u0007\u0015"+ + "\u0000\u0000\u0184\u0185\u0007\u0018\u0000\u0000\u0185\u0186\u0007\u0011"+ + "\u0000\u0000\u0186\u0187\u0007\u0012\u0000\u0000\u0187\u01e5\u0007\u0007"+ + "\u0000\u0000\u0188\u0189\u0005@\u0000\u0000\u0189\u018a\u0007\u000f\u0000"+ + "\u0000\u018a\u018b\u0007\u0005\u0000\u0000\u018b\u018c\u0007\u0015\u0000"+ + "\u0000\u018c\u018d\u0007\n\u0000\u0000\u018d\u018e\u0007\u000b\u0000\u0000"+ + "\u018e\u018f\u0007\u0018\u0000\u0000\u018f\u0190\u0007\u0005\u0000\u0000"+ + "\u0190\u0191\u0007\u000e\u0000\u0000\u0191\u01e5\u0007\n\u0000\u0000\u0192"+ + "\u0193\u0005@\u0000\u0000\u0193\u0194\u0007\u0019\u0000\u0000\u0194\u0195"+ + "\u0007\u0011\u0000\u0000\u0195\u0196\u0007\u000e\u0000\u0000\u0196\u0197"+ + "\u0007\u0006\u0000\u0000\u0197\u0198\u0007\u0015\u0000\u0000\u0198\u0199"+ + "\u0007\n\u0000\u0000\u0199\u019a\u0007\u000f\u0000\u0000\u019a\u01e5\u0007"+ + "\u0007\u0000\u0000\u019b\u019c\u0005@\u0000\u0000\u019c\u019d\u0007\r"+ + "\u0000\u0000\u019d\u019e\u0007\u0011\u0000\u0000\u019e\u019f\u0007\u000f"+ + "\u0000\u0000\u019f\u01a0\u0007\u0007\u0000\u0000\u01a0\u01a1\u0005-\u0000"+ + "\u0000\u01a1\u01a2\u0007\r\u0000\u0000\u01a2\u01a3\u0007\u0005\u0000\u0000"+ + "\u01a3\u01a4\u0007\u000e\u0000\u0000\u01a4\u01e5\u0007\n\u0000\u0000\u01a5"+ + "\u01a6\u0005@\u0000\u0000\u01a6\u01a7\u0007\u0018\u0000\u0000\u01a7\u01a8"+ + "\u0007\u0005\u0000\u0000\u01a8\u01a9\u0007\t\u0000\u0000\u01a9\u01e5\u0007"+ + "\n\u0000\u0000\u01aa\u01ab\u0005@\u0000\u0000\u01ab\u01ac\u0007\u000b"+ + "\u0000\u0000\u01ac\u01ad\u0007\u0006\u0000\u0000\u01ad\u01ae\u0007\u0018"+ + "\u0000\u0000\u01ae\u01af\u0007\u0018\u0000\u0000\u01af\u01b0\u0007\u0011"+ + "\u0000\u0000\u01b0\u01b1\u0007\u0012\u0000\u0000\u01b1\u01b2\u0007\u0007"+ + "\u0000\u0000\u01b2\u01e5\u0007\u000b\u0000\u0000\u01b3\u01b4\u0005@\u0000"+ + "\u0000\u01b4\u01b5\u0007\u0013\u0000\u0000\u01b5\u01b6\u0007\u0005\u0000"+ + "\u0000\u01b6\u01b7\u0007\u0010\u0000\u0000\u01b7\u01b8\u0007\n\u0000\u0000"+ + "\u01b8\u01e5\u0007\u0012\u0000\u0000\u01b9\u01ba\u0005@\u0000\u0000\u01ba"+ + "\u01bb\u0007\u0007\u0000\u0000\u01bb\u01bc\u0007\u0005\u0000\u0000\u01bc"+ + "\u01bd\u0007\f\u0000\u0000\u01bd\u01be\u0007\u0013\u0000\u0000\u01be\u01bf"+ + "\u0007\u0014\u0000\u0000\u01bf\u01c0\u0007\f\u0000\u0000\u01c0\u01c1\u0007"+ + "\u000f\u0000\u0000\u01c1\u01e5\u0007\u0019\u0000\u0000\u01c2\u01c3\u0005"+ + "@\u0000\u0000\u01c3\u01c4\u0007\u0005\u0000\u0000\u01c4\u01c5\u0007\u0018"+ + "\u0000\u0000\u01c5\u01c6\u0007\u0018\u0000\u0000\u01c6\u01c7\u0007\u0013"+ + "\u0000\u0000\u01c7\u01e5\u0007\u0010\u0000\u0000\u01c8\u01c9\u0005@\u0000"+ + "\u0000\u01c9\u01ca\u0005-\u0000\u0000\u01ca\u01cb\u0007\u0014\u0000\u0000"+ + "\u01cb\u01cc\u0007\n\u0000\u0000\u01cc\u01cd\u0007\u0017\u0000\u0000\u01cd"+ + "\u01ce\u0007\u001b\u0000\u0000\u01ce\u01cf\u0007\f\u0000\u0000\u01cf\u01d0"+ + "\u0007\u0007\u0000\u0000\u01d0\u01d1\u0005-\u0000\u0000\u01d1\u01d2\u0007"+ + "\u001b\u0000\u0000\u01d2\u01d3\u0007\n\u0000\u0000\u01d3\u01d4\u0007\u0010"+ + "\u0000\u0000\u01d4\u01d5\u0007\r\u0000\u0000\u01d5\u01d6\u0007\u0012\u0000"+ + "\u0000\u01d6\u01d7\u0007\u0005\u0000\u0000\u01d7\u01d8\u0007\u0015\u0000"+ + "\u0000\u01d8\u01d9\u0007\n\u0000\u0000\u01d9\u01e5\u0007\u000b\u0000\u0000"+ + "\u01da\u01db\u0005@\u0000\u0000\u01db\u01dc\u0007\u001b\u0000\u0000\u01dc"+ + "\u01dd\u0007\n\u0000\u0000\u01dd\u01de\u0007\u0010\u0000\u0000\u01de\u01df"+ + "\u0007\r\u0000\u0000\u01df\u01e0\u0007\u0012\u0000\u0000\u01e0\u01e1\u0007"+ + "\u0005\u0000\u0000\u01e1\u01e2\u0007\u0015\u0000\u0000\u01e2\u01e3\u0007"+ + "\n\u0000\u0000\u01e3\u01e5\u0007\u000b\u0000\u0000\u01e4\u015d\u0001\u0000"+ + "\u0000\u0000\u01e4\u0160\u0001\u0000\u0000\u0000\u01e4\u0166\u0001\u0000"+ + "\u0000\u0000\u01e4\u016c\u0001\u0000\u0000\u0000\u01e4\u0179\u0001\u0000"+ + "\u0000\u0000\u01e4\u0181\u0001\u0000\u0000\u0000\u01e4\u0188\u0001\u0000"+ + "\u0000\u0000\u01e4\u0192\u0001\u0000\u0000\u0000\u01e4\u019b\u0001\u0000"+ + "\u0000\u0000\u01e4\u01a5\u0001\u0000\u0000\u0000\u01e4\u01aa\u0001\u0000"+ + "\u0000\u0000\u01e4\u01b3\u0001\u0000\u0000\u0000\u01e4\u01b9\u0001\u0000"+ + "\u0000\u0000\u01e4\u01c2\u0001\u0000\u0000\u0000\u01e4\u01c8\u0001\u0000"+ + "\u0000\u0000\u01e4\u01da\u0001\u0000\u0000\u0000\u01e5\u01e6\u0001\u0000"+ + "\u0000\u0000\u01e6\u01e7\u0006\b\u0000\u0000\u01e7\u0017\u0001\u0000\u0000"+ + "\u0000\u01e8\u01e9\u0005@\u0000\u0000\u01e9\u01ea\u0003\u0012\u0006\u0000"+ + "\u01ea\u01eb\u0003\f\u0003\u0000\u01eb\u01ec\u0001\u0000\u0000\u0000\u01ec"+ + "\u01ed\u0006\t\u0001\u0000\u01ed\u0019\u0001\u0000\u0000\u0000\u01ee\u01fd"+ + "\u0005@\u0000\u0000\u01ef\u01f0\u0007\u0005\u0000\u0000\u01f0\u01f1\u0007"+ + "\u0006\u0000\u0000\u01f1\u01f2\u0007\u0007\u0000\u0000\u01f2\u01fe\u0007"+ + "\b\u0000\u0000\u01f3\u01f4\u0007\u0018\u0000\u0000\u01f4\u01f5\u0007\u0012"+ + "\u0000\u0000\u01f5\u01f6\u0007\u0011\u0000\u0000\u01f6\u01f7\u0007\u0019"+ + "\u0000\u0000\u01f7\u01f8\u0007\u0006\u0000\u0000\u01f8\u01f9\u0007\u000e"+ + "\u0000\u0000\u01f9\u01fa\u0007\u0007\u0000\u0000\u01fa\u01fb\u0007\f\u0000"+ + "\u0000\u01fb\u01fc\u0007\u0011\u0000\u0000\u01fc\u01fe\u0007\u000f\u0000"+ + "\u0000\u01fd\u01ef\u0001\u0000\u0000\u0000\u01fd\u01f3\u0001\u0000\u0000"+ + "\u0000\u01fe\u01ff\u0001\u0000\u0000\u0000\u01ff\u0200\u0006\n\u0002\u0000"+ + "\u0200\u001b\u0001\u0000\u0000\u0000\u0201\u0202\u0005@\u0000\u0000\u0202"+ + "\u0203\u0007\n\u0000\u0000\u0203\u0204\u0007\u000f\u0000\u0000\u0204\u0205"+ + "\u0007\u0019\u0000\u0000\u0205\u0206\u0001\u0000\u0000\u0000\u0206\u020f"+ + "\u0003\u0012\u0006\u0000\u0207\u0208\u0005@\u0000\u0000\u0208\u0209\u0007"+ + "\n\u0000\u0000\u0209\u020a\u0007\u000f\u0000\u0000\u020a\u020b\u0007\u0019"+ "\u0000\u0000\u020b\u020c\u0007\u0018\u0000\u0000\u020c\u020d\u0007\b\u0000"+ "\u0000\u020d\u020f\u0007\u0018\u0000\u0000\u020e\u0201\u0001\u0000\u0000"+ "\u0000\u020e\u0207\u0001\u0000\u0000\u0000\u020f\u001d\u0001\u0000\u0000"+ @@ -1076,62 +1076,64 @@ private boolean D_PHP_sempred(RuleContext _localctx, int predIndex) { "G\u0001\u0000\u0000\u0000\u0449\u044b\u0007!\u0000\u0000\u044a\u0449\u0001"+ "\u0000\u0000\u0000\u044b\u044c\u0001\u0000\u0000\u0000\u044c\u044a\u0001"+ "\u0000\u0000\u0000\u044c\u044d\u0001\u0000\u0000\u0000\u044dI\u0001\u0000"+ - "\u0000\u0000\u044e\u044f\u0007\"\u0000\u0000\u044fK\u0001\u0000\u0000"+ - "\u0000\u0450\u0451\t\u0000\u0000\u0000\u0451\u0452\u0001\u0000\u0000\u0000"+ - "\u0452\u0453\u0006#\u0007\u0000\u0453M\u0001\u0000\u0000\u0000\u0454\u0455"+ - "\u0005(\u0000\u0000\u0455\u0456\u0006$\b\u0000\u0456O\u0001\u0000\u0000"+ - "\u0000\u0457\u0458\u0005)\u0000\u0000\u0458\u0459\u0006%\t\u0000\u0459"+ - "Q\u0001\u0000\u0000\u0000\u045a\u045b\u0007\"\u0000\u0000\u045b\u045c"+ - "\u0001\u0000\u0000\u0000\u045c\u045d\u0006&\n\u0000\u045dS\u0001\u0000"+ - "\u0000\u0000\u045e\u045f\t\u0000\u0000\u0000\u045f\u0460\u0001\u0000\u0000"+ - "\u0000\u0460\u0461\u0006\'\u0007\u0000\u0461U\u0001\u0000\u0000\u0000"+ - "\u0462\u0463\u0005\u0000\u0000\u0001\u0463\u0464\u0001\u0000\u0000\u0000"+ - "\u0464\u0465\u0006(\u000b\u0000\u0465W\u0001\u0000\u0000\u0000\u0466\u0467"+ - "\u0005(\u0000\u0000\u0467\u0468\u0006)\f\u0000\u0468Y\u0001\u0000\u0000"+ - "\u0000\u0469\u046a\u0005)\u0000\u0000\u046a\u046b\u0006*\r\u0000\u046b"+ - "[\u0001\u0000\u0000\u0000\u046c\u046d\u0005[\u0000\u0000\u046d\u046e\u0006"+ - "+\u000e\u0000\u046e\u046f\u0001\u0000\u0000\u0000\u046f\u0470\u0006+\u0007"+ - "\u0000\u0470]\u0001\u0000\u0000\u0000\u0471\u0472\u0005]\u0000\u0000\u0472"+ - "\u0473\u0006,\u000f\u0000\u0473\u0474\u0001\u0000\u0000\u0000\u0474\u0475"+ - "\u0006,\u0007\u0000\u0475_\u0001\u0000\u0000\u0000\u0476\u0477\u0005{"+ - "\u0000\u0000\u0477\u0478\u0006-\u0010\u0000\u0478\u0479\u0001\u0000\u0000"+ - "\u0000\u0479\u047a\u0006-\u0007\u0000\u047aa\u0001\u0000\u0000\u0000\u047b"+ - "\u047c\u0005}\u0000\u0000\u047c\u047d\u0006.\u0011\u0000\u047d\u047e\u0001"+ - "\u0000\u0000\u0000\u047e\u047f\u0006.\u0007\u0000\u047fc\u0001\u0000\u0000"+ - "\u0000\u0480\u0481\u0005,\u0000\u0000\u0481\u0482\u0006/\u0012\u0000\u0482"+ - "e\u0001\u0000\u0000\u0000\u0483\u0484\u0007\"\u0000\u0000\u0484\u0485"+ - "\u0001\u0000\u0000\u0000\u0485\u0486\u00060\n\u0000\u0486g\u0001\u0000"+ - "\u0000\u0000\u0487\u0488\t\u0000\u0000\u0000\u0488\u0489\u0001\u0000\u0000"+ - "\u0000\u0489\u048a\u00061\u0007\u0000\u048ai\u0001\u0000\u0000\u0000\u048b"+ - "\u048c\u0005\u0000\u0000\u0001\u048c\u048d\u0001\u0000\u0000\u0000\u048d"+ - "\u048e\u00062\u000b\u0000\u048ek\u0001\u0000\u0000\u0000\u048f\u0490\u0005"+ - "@\u0000\u0000\u0490\u0491\u0007\n\u0000\u0000\u0491\u0492\u0007\u000f"+ - "\u0000\u0000\u0492\u0493\u0007\u0019\u0000\u0000\u0493\u0494\u0007\u0018"+ - "\u0000\u0000\u0494\u0495\u0007\b\u0000\u0000\u0495\u0496\u0007\u0018\u0000"+ - "\u0000\u0496\u0497\u0001\u0000\u0000\u0000\u0497\u0498\u00063\u000b\u0000"+ - "\u0498m\u0001\u0000\u0000\u0000\u0499\u049b\b#\u0000\u0000\u049a\u0499"+ - "\u0001\u0000\u0000\u0000\u049b\u049c\u0001\u0000\u0000\u0000\u049c\u049a"+ - "\u0001\u0000\u0000\u0000\u049c\u049d\u0001\u0000\u0000\u0000\u049d\u049e"+ - "\u0001\u0000\u0000\u0000\u049e\u049f\u00064\u0013\u0000\u049fo\u0001\u0000"+ - "\u0000\u0000\u04a0\u04a1\t\u0000\u0000\u0000\u04a1\u04a2\u0001\u0000\u0000"+ - "\u0000\u04a2\u04a3\u00065\u0013\u0000\u04a3q\u0001\u0000\u0000\u0000\u04a4"+ - "\u04a5\u0005}\u0000\u0000\u04a5\u04a6\u0005}\u0000\u0000\u04a6\u04a7\u0001"+ - "\u0000\u0000\u0000\u04a7\u04a8\u00066\u000b\u0000\u04a8s\u0001\u0000\u0000"+ - "\u0000\u04a9\u04aa\t\u0000\u0000\u0000\u04aa\u04ab\u0001\u0000\u0000\u0000"+ - "\u04ab\u04ac\u00067\u0007\u0000\u04acu\u0001\u0000\u0000\u0000\u04ad\u04ae"+ - "\u0005\u0000\u0000\u0001\u04ae\u04af\u0001\u0000\u0000\u0000\u04af\u04b0"+ - "\u00068\u000b\u0000\u04b0w\u0001\u0000\u0000\u0000\u04b1\u04b2\u0005!"+ - "\u0000\u0000\u04b2\u04b3\u0005!\u0000\u0000\u04b3\u04b4\u0005}\u0000\u0000"+ - "\u04b4\u04b5\u0001\u0000\u0000\u0000\u04b5\u04b6\u00069\u000b\u0000\u04b6"+ - "y\u0001\u0000\u0000\u0000\u04b7\u04b8\t\u0000\u0000\u0000\u04b8\u04b9"+ - "\u0001\u0000\u0000\u0000\u04b9\u04ba\u0006:\u0007\u0000\u04ba{\u0001\u0000"+ - "\u0000\u0000\u04bb\u04bc\u0005\u0000\u0000\u0001\u04bc\u04bd\u0001\u0000"+ - "\u0000\u0000\u04bd\u04be\u0006;\u000b\u0000\u04be}\u0001\u0000\u0000\u0000"+ - "2\u0000\u0001\u0002\u0003\u0004\u0005\u0082\u0089\u0090\u0096\u009e\u00a0"+ - "\u00a9\u00ab\u00c5\u00d3\u0130\u013f\u0148\u0156\u015b\u0164\u016a\u0176"+ - "\u01e4\u01fd\u020e\u0239\u024d\u025e\u0269\u026d\u0282\u0289\u0290\u0296"+ - "\u02a0\u02ae\u02bf\u02c2\u02c7\u02cc\u02d6\u03fb\u0414\u0423\u0431\u044a"+ - "\u044c\u049c\u0014\u0007\u0001\u0000\u0005\u0001\u0000\u0007\u0005\u0000"+ + "\u0000\u0000\u044e\u0450\u0007\"\u0000\u0000\u044f\u044e\u0001\u0000\u0000"+ + "\u0000\u0450\u0451\u0001\u0000\u0000\u0000\u0451\u044f\u0001\u0000\u0000"+ + "\u0000\u0451\u0452\u0001\u0000\u0000\u0000\u0452K\u0001\u0000\u0000\u0000"+ + "\u0453\u0454\t\u0000\u0000\u0000\u0454\u0455\u0001\u0000\u0000\u0000\u0455"+ + "\u0456\u0006#\u0007\u0000\u0456M\u0001\u0000\u0000\u0000\u0457\u0458\u0005"+ + "(\u0000\u0000\u0458\u0459\u0006$\b\u0000\u0459O\u0001\u0000\u0000\u0000"+ + "\u045a\u045b\u0005)\u0000\u0000\u045b\u045c\u0006%\t\u0000\u045cQ\u0001"+ + "\u0000\u0000\u0000\u045d\u045e\u0007\"\u0000\u0000\u045e\u045f\u0001\u0000"+ + "\u0000\u0000\u045f\u0460\u0006&\n\u0000\u0460S\u0001\u0000\u0000\u0000"+ + "\u0461\u0462\t\u0000\u0000\u0000\u0462\u0463\u0001\u0000\u0000\u0000\u0463"+ + "\u0464\u0006\'\u0007\u0000\u0464U\u0001\u0000\u0000\u0000\u0465\u0466"+ + "\u0005\u0000\u0000\u0001\u0466\u0467\u0001\u0000\u0000\u0000\u0467\u0468"+ + "\u0006(\u000b\u0000\u0468W\u0001\u0000\u0000\u0000\u0469\u046a\u0005("+ + "\u0000\u0000\u046a\u046b\u0006)\f\u0000\u046bY\u0001\u0000\u0000\u0000"+ + "\u046c\u046d\u0005)\u0000\u0000\u046d\u046e\u0006*\r\u0000\u046e[\u0001"+ + "\u0000\u0000\u0000\u046f\u0470\u0005[\u0000\u0000\u0470\u0471\u0006+\u000e"+ + "\u0000\u0471\u0472\u0001\u0000\u0000\u0000\u0472\u0473\u0006+\u0007\u0000"+ + "\u0473]\u0001\u0000\u0000\u0000\u0474\u0475\u0005]\u0000\u0000\u0475\u0476"+ + "\u0006,\u000f\u0000\u0476\u0477\u0001\u0000\u0000\u0000\u0477\u0478\u0006"+ + ",\u0007\u0000\u0478_\u0001\u0000\u0000\u0000\u0479\u047a\u0005{\u0000"+ + "\u0000\u047a\u047b\u0006-\u0010\u0000\u047b\u047c\u0001\u0000\u0000\u0000"+ + "\u047c\u047d\u0006-\u0007\u0000\u047da\u0001\u0000\u0000\u0000\u047e\u047f"+ + "\u0005}\u0000\u0000\u047f\u0480\u0006.\u0011\u0000\u0480\u0481\u0001\u0000"+ + "\u0000\u0000\u0481\u0482\u0006.\u0007\u0000\u0482c\u0001\u0000\u0000\u0000"+ + "\u0483\u0484\u0005,\u0000\u0000\u0484\u0485\u0006/\u0012\u0000\u0485e"+ + "\u0001\u0000\u0000\u0000\u0486\u0487\u0007\"\u0000\u0000\u0487\u0488\u0001"+ + "\u0000\u0000\u0000\u0488\u0489\u00060\n\u0000\u0489g\u0001\u0000\u0000"+ + "\u0000\u048a\u048b\t\u0000\u0000\u0000\u048b\u048c\u0001\u0000\u0000\u0000"+ + "\u048c\u048d\u00061\u0007\u0000\u048di\u0001\u0000\u0000\u0000\u048e\u048f"+ + "\u0005\u0000\u0000\u0001\u048f\u0490\u0001\u0000\u0000\u0000\u0490\u0491"+ + "\u00062\u000b\u0000\u0491k\u0001\u0000\u0000\u0000\u0492\u0493\u0005@"+ + "\u0000\u0000\u0493\u0494\u0007\n\u0000\u0000\u0494\u0495\u0007\u000f\u0000"+ + "\u0000\u0495\u0496\u0007\u0019\u0000\u0000\u0496\u0497\u0007\u0018\u0000"+ + "\u0000\u0497\u0498\u0007\b\u0000\u0000\u0498\u0499\u0007\u0018\u0000\u0000"+ + "\u0499\u049a\u0001\u0000\u0000\u0000\u049a\u049b\u00063\u000b\u0000\u049b"+ + "m\u0001\u0000\u0000\u0000\u049c\u049e\b#\u0000\u0000\u049d\u049c\u0001"+ + "\u0000\u0000\u0000\u049e\u049f\u0001\u0000\u0000\u0000\u049f\u049d\u0001"+ + "\u0000\u0000\u0000\u049f\u04a0\u0001\u0000\u0000\u0000\u04a0\u04a1\u0001"+ + "\u0000\u0000\u0000\u04a1\u04a2\u00064\u0013\u0000\u04a2o\u0001\u0000\u0000"+ + "\u0000\u04a3\u04a4\t\u0000\u0000\u0000\u04a4\u04a5\u0001\u0000\u0000\u0000"+ + "\u04a5\u04a6\u00065\u0013\u0000\u04a6q\u0001\u0000\u0000\u0000\u04a7\u04a8"+ + "\u0005}\u0000\u0000\u04a8\u04a9\u0005}\u0000\u0000\u04a9\u04aa\u0001\u0000"+ + "\u0000\u0000\u04aa\u04ab\u00066\u000b\u0000\u04abs\u0001\u0000\u0000\u0000"+ + "\u04ac\u04ad\t\u0000\u0000\u0000\u04ad\u04ae\u0001\u0000\u0000\u0000\u04ae"+ + "\u04af\u00067\u0007\u0000\u04afu\u0001\u0000\u0000\u0000\u04b0\u04b1\u0005"+ + "\u0000\u0000\u0001\u04b1\u04b2\u0001\u0000\u0000\u0000\u04b2\u04b3\u0006"+ + "8\u000b\u0000\u04b3w\u0001\u0000\u0000\u0000\u04b4\u04b5\u0005!\u0000"+ + "\u0000\u04b5\u04b6\u0005!\u0000\u0000\u04b6\u04b7\u0005}\u0000\u0000\u04b7"+ + "\u04b8\u0001\u0000\u0000\u0000\u04b8\u04b9\u00069\u000b\u0000\u04b9y\u0001"+ + "\u0000\u0000\u0000\u04ba\u04bb\t\u0000\u0000\u0000\u04bb\u04bc\u0001\u0000"+ + "\u0000\u0000\u04bc\u04bd\u0006:\u0007\u0000\u04bd{\u0001\u0000\u0000\u0000"+ + "\u04be\u04bf\u0005\u0000\u0000\u0001\u04bf\u04c0\u0001\u0000\u0000\u0000"+ + "\u04c0\u04c1\u0006;\u000b\u0000\u04c1}\u0001\u0000\u0000\u00003\u0000"+ + "\u0001\u0002\u0003\u0004\u0005\u0082\u0089\u0090\u0096\u009e\u00a0\u00a9"+ + "\u00ab\u00c5\u00d3\u0130\u013f\u0148\u0156\u015b\u0164\u016a\u0176\u01e4"+ + "\u01fd\u020e\u0239\u024d\u025e\u0269\u026d\u0282\u0289\u0290\u0296\u02a0"+ + "\u02ae\u02bf\u02c2\u02c7\u02cc\u02d6\u03fb\u0414\u0423\u0431\u044a\u044c"+ + "\u0451\u049f\u0014\u0007\u0001\u0000\u0005\u0001\u0000\u0007\u0005\u0000"+ "\u0005\u0002\u0000\u0005\u0004\u0000\u0005\u0005\u0000\u0005\u0003\u0000"+ "\u0006\u0000\u0000\u0001$\u0000\u0001%\u0001\u0007\u001d\u0000\u0004\u0000"+ "\u0000\u0001)\u0002\u0001*\u0003\u0001+\u0004\u0001,\u0005\u0001-\u0006"+ diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.g4 index b915b9c25d0b..e03478370132 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.g4 @@ -36,7 +36,7 @@ statement: | inline_identable_element | block_aligned_directive | static_element - | nl_with_space_before + | nl_with_space_after | blade_echo | block_end | html_close_tag @@ -67,8 +67,8 @@ html_close_tag : HTML_CLOSE_TAG; html_indent : (HTML_START_BLOCK_TAG | COMPONENT_TAG) inline_tag_statement* GT_SYMBOL NL WS*; html_tag : (HTML_START_BLOCK_TAG | COMPONENT_TAG) inline_tag_statement* GT_SYMBOL; self_closed_tag : HTML_SELF_CLOSE_TAG | ((HTML_START_BLOCK_TAG | COMPONENT_TAG) inline_tag_statement* INLINE_GT_SYMBOL); -block_start : ws_before=nl_with_space_before? block_directive_name D_ARG_LPAREN D_ARG_RPAREN; -block_directive_name : D_BLOCK_DIRECTIVE_START; +//block_start : ws_before=nl_with_space_before? block_directive_name D_ARG_LPAREN D_ARG_RPAREN ; +block_start : D_BLOCK_DIRECTIVE_START D_ARG_LPAREN D_ARG_RPAREN ws_after=nl_with_space_after*; block_end : D_BLOCK_DIRECTIVE_END; block_aligned_directive : D_BLOCK_ALIGNED_DIRECTIVE; inline_identable_element : D_INLINE_DIRECTIVE | NON_PARAM_DIRECTIVE | section_inline @@ -76,10 +76,8 @@ inline_identable_element : D_INLINE_DIRECTIVE | NON_PARAM_DIRECTIVE | section_in ; section_inline : D_SECTION D_ARG_LPAREN PARAM_COMMA D_ARG_RPAREN; -section_block : section_block_start (statement)+ section_block_end; -section_block_end : D_ENDSECTION; -section_block_start : D_SECTION D_ARG_LPAREN D_ARG_RPAREN; -nl_with_space_before : NL WS*; +section_block : D_SECTION D_ARG_LPAREN D_ARG_RPAREN ws_after=nl_with_space_after* (statement)+ D_ENDSECTION; +nl_with_space_after : NL+ WS*; nl_with_space : NL WS*; static_element : HTML_COMMENT diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.java index 119eb541fad2..b0529a981d3e 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.java @@ -51,16 +51,14 @@ public class BladeAntlrFormatterParser extends Parser { public static final int RULE_file = 0, RULE_statement = 1, RULE_inline_tag_statement = 2, RULE_html_close_tag = 3, RULE_html_indent = 4, RULE_html_tag = 5, RULE_self_closed_tag = 6, RULE_block_start = 7, - RULE_block_directive_name = 8, RULE_block_end = 9, RULE_block_aligned_directive = 10, - RULE_inline_identable_element = 11, RULE_section_inline = 12, RULE_section_block = 13, - RULE_section_block_end = 14, RULE_section_block_start = 15, RULE_nl_with_space_before = 16, - RULE_nl_with_space = 17, RULE_static_element = 18, RULE_blade_echo = 19; + RULE_block_end = 8, RULE_block_aligned_directive = 9, RULE_inline_identable_element = 10, + RULE_section_inline = 11, RULE_section_block = 12, RULE_nl_with_space_after = 13, + RULE_nl_with_space = 14, RULE_static_element = 15, RULE_blade_echo = 16; private static String[] makeRuleNames() { return new String[] { "file", "statement", "inline_tag_statement", "html_close_tag", "html_indent", - "html_tag", "self_closed_tag", "block_start", "block_directive_name", - "block_end", "block_aligned_directive", "inline_identable_element", "section_inline", - "section_block", "section_block_end", "section_block_start", "nl_with_space_before", + "html_tag", "self_closed_tag", "block_start", "block_end", "block_aligned_directive", + "inline_identable_element", "section_inline", "section_block", "nl_with_space_after", "nl_with_space", "static_element", "blade_echo" }; } @@ -171,21 +169,21 @@ public final FileContext file() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(43); + setState(37); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2000678626L) != 0)) { { { - setState(40); + setState(34); statement(); } } - setState(45); + setState(39); _errHandler.sync(this); _la = _input.LA(1); } - setState(46); + setState(40); match(EOF); } } @@ -229,8 +227,8 @@ public Block_aligned_directiveContext block_aligned_directive() { public Static_elementContext static_element() { return getRuleContext(Static_elementContext.class,0); } - public Nl_with_space_beforeContext nl_with_space_before() { - return getRuleContext(Nl_with_space_beforeContext.class,0); + public Nl_with_space_afterContext nl_with_space_after() { + return getRuleContext(Nl_with_space_afterContext.class,0); } public Blade_echoContext blade_echo() { return getRuleContext(Blade_echoContext.class,0); @@ -263,104 +261,104 @@ public final StatementContext statement() throws RecognitionException { enterRule(_localctx, 2, RULE_statement); int _la; try { - setState(65); + setState(59); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(48); + setState(42); html_indent(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(49); + setState(43); block_start(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(50); + setState(44); block_end(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(51); + setState(45); html_tag(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(52); + setState(46); self_closed_tag(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(53); + setState(47); section_block(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(54); + setState(48); inline_identable_element(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(55); + setState(49); block_aligned_directive(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(56); + setState(50); static_element(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(57); - nl_with_space_before(); + setState(51); + nl_with_space_after(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(58); + setState(52); blade_echo(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(59); + setState(53); block_end(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(60); + setState(54); html_close_tag(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(61); + setState(55); _la = _input.LA(1); if ( !(_la==SG_QUOTE || _la==DB_QUOTE) ) { _errHandler.recoverInline(this); @@ -375,21 +373,21 @@ public final StatementContext statement() throws RecognitionException { case 15: enterOuterAlt(_localctx, 15); { - setState(62); + setState(56); match(INLINE_GT_SYMBOL); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(63); + setState(57); match(GT_SYMBOL); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(64); + setState(58); _la = _input.LA(1); if ( !(_la==WS || _la==NL) ) { _errHandler.recoverInline(this); @@ -454,105 +452,105 @@ public final Inline_tag_statementContext inline_tag_statement() throws Recogniti Inline_tag_statementContext _localctx = new Inline_tag_statementContext(_ctx, getState()); enterRule(_localctx, 4, RULE_inline_tag_statement); try { - setState(84); + setState(78); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(67); + setState(61); match(IDENTIFIER); - setState(68); + setState(62); match(EQ); - setState(69); + setState(63); match(IDENTIFIER); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(70); + setState(64); block_start(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(71); + setState(65); block_end(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(72); + setState(66); blade_echo(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(73); + setState(67); match(D_INLINE_DIRECTIVE); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(74); + setState(68); match(NON_PARAM_DIRECTIVE); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(75); + setState(69); match(D_BLOCK_ALIGNED_DIRECTIVE); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(76); + setState(70); match(IDENTIFIER); - setState(77); + setState(71); match(EQ); - setState(78); + setState(72); match(STRING); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(79); + setState(73); match(IDENTIFIER); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(80); + setState(74); match(STRING); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(81); + setState(75); match(EQ); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(82); + setState(76); match(WS); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(83); + setState(77); match(NL); } break; @@ -592,7 +590,7 @@ public final Html_close_tagContext html_close_tag() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(86); + setState(80); match(HTML_CLOSE_TAG); } } @@ -645,7 +643,7 @@ public final Html_indentContext html_indent() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(88); + setState(82); _la = _input.LA(1); if ( !(_la==HTML_START_BLOCK_TAG || _la==COMPONENT_TAG) ) { _errHandler.recoverInline(this); @@ -655,37 +653,37 @@ public final Html_indentContext html_indent() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(92); + setState(86); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 817921632L) != 0)) { { { - setState(89); + setState(83); inline_tag_statement(); } } - setState(94); + setState(88); _errHandler.sync(this); _la = _input.LA(1); } - setState(95); + setState(89); match(GT_SYMBOL); - setState(96); + setState(90); match(NL); - setState(100); + setState(94); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,4,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(97); + setState(91); match(WS); } } } - setState(102); + setState(96); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,4,_ctx); } @@ -734,7 +732,7 @@ public final Html_tagContext html_tag() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(103); + setState(97); _la = _input.LA(1); if ( !(_la==HTML_START_BLOCK_TAG || _la==COMPONENT_TAG) ) { _errHandler.recoverInline(this); @@ -744,21 +742,21 @@ public final Html_tagContext html_tag() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(107); + setState(101); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 817921632L) != 0)) { { { - setState(104); + setState(98); inline_tag_statement(); } } - setState(109); + setState(103); _errHandler.sync(this); _la = _input.LA(1); } - setState(110); + setState(104); match(GT_SYMBOL); } } @@ -804,13 +802,13 @@ public final Self_closed_tagContext self_closed_tag() throws RecognitionExceptio enterRule(_localctx, 12, RULE_self_closed_tag); int _la; try { - setState(121); + setState(115); _errHandler.sync(this); switch (_input.LA(1)) { case HTML_SELF_CLOSE_TAG: enterOuterAlt(_localctx, 1); { - setState(112); + setState(106); match(HTML_SELF_CLOSE_TAG); } break; @@ -819,7 +817,7 @@ public final Self_closed_tagContext self_closed_tag() throws RecognitionExceptio enterOuterAlt(_localctx, 2); { { - setState(113); + setState(107); _la = _input.LA(1); if ( !(_la==HTML_START_BLOCK_TAG || _la==COMPONENT_TAG) ) { _errHandler.recoverInline(this); @@ -829,21 +827,21 @@ public final Self_closed_tagContext self_closed_tag() throws RecognitionExceptio _errHandler.reportMatch(this); consume(); } - setState(117); + setState(111); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 817921632L) != 0)) { { { - setState(114); + setState(108); inline_tag_statement(); } } - setState(119); + setState(113); _errHandler.sync(this); _la = _input.LA(1); } - setState(120); + setState(114); match(INLINE_GT_SYMBOL); } } @@ -865,14 +863,15 @@ public final Self_closed_tagContext self_closed_tag() throws RecognitionExceptio @SuppressWarnings("CheckReturnValue") public static class Block_startContext extends ParserRuleContext { - public Nl_with_space_beforeContext ws_before; - public Block_directive_nameContext block_directive_name() { - return getRuleContext(Block_directive_nameContext.class,0); - } + public Nl_with_space_afterContext ws_after; + public TerminalNode D_BLOCK_DIRECTIVE_START() { return getToken(BladeAntlrFormatterParser.D_BLOCK_DIRECTIVE_START, 0); } public TerminalNode D_ARG_LPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_LPAREN, 0); } public TerminalNode D_ARG_RPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_RPAREN, 0); } - public Nl_with_space_beforeContext nl_with_space_before() { - return getRuleContext(Nl_with_space_beforeContext.class,0); + public List nl_with_space_after() { + return getRuleContexts(Nl_with_space_afterContext.class); + } + public Nl_with_space_afterContext nl_with_space_after(int i) { + return getRuleContext(Nl_with_space_afterContext.class,i); } public Block_startContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -891,64 +890,32 @@ public void exitRule(ParseTreeListener listener) { public final Block_startContext block_start() throws RecognitionException { Block_startContext _localctx = new Block_startContext(_ctx, getState()); enterRule(_localctx, 14, RULE_block_start); - int _la; try { + int _alt; enterOuterAlt(_localctx, 1); { - setState(124); + setState(117); + match(D_BLOCK_DIRECTIVE_START); + setState(118); + match(D_ARG_LPAREN); + setState(119); + match(D_ARG_RPAREN); + setState(123); _errHandler.sync(this); - _la = _input.LA(1); - if (_la==NL) { - { - setState(123); - ((Block_startContext)_localctx).ws_before = nl_with_space_before(); + _alt = getInterpreter().adaptivePredict(_input,8,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(120); + ((Block_startContext)_localctx).ws_after = nl_with_space_after(); + } + } } + setState(125); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,8,_ctx); } - - setState(126); - block_directive_name(); - setState(127); - match(D_ARG_LPAREN); - setState(128); - match(D_ARG_RPAREN); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Block_directive_nameContext extends ParserRuleContext { - public TerminalNode D_BLOCK_DIRECTIVE_START() { return getToken(BladeAntlrFormatterParser.D_BLOCK_DIRECTIVE_START, 0); } - public Block_directive_nameContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_block_directive_name; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterBlock_directive_name(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitBlock_directive_name(this); - } - } - - public final Block_directive_nameContext block_directive_name() throws RecognitionException { - Block_directive_nameContext _localctx = new Block_directive_nameContext(_ctx, getState()); - enterRule(_localctx, 16, RULE_block_directive_name); - try { - enterOuterAlt(_localctx, 1); - { - setState(130); - match(D_BLOCK_DIRECTIVE_START); } } catch (RecognitionException re) { @@ -981,11 +948,11 @@ public void exitRule(ParseTreeListener listener) { public final Block_endContext block_end() throws RecognitionException { Block_endContext _localctx = new Block_endContext(_ctx, getState()); - enterRule(_localctx, 18, RULE_block_end); + enterRule(_localctx, 16, RULE_block_end); try { enterOuterAlt(_localctx, 1); { - setState(132); + setState(126); match(D_BLOCK_DIRECTIVE_END); } } @@ -1019,11 +986,11 @@ public void exitRule(ParseTreeListener listener) { public final Block_aligned_directiveContext block_aligned_directive() throws RecognitionException { Block_aligned_directiveContext _localctx = new Block_aligned_directiveContext(_ctx, getState()); - enterRule(_localctx, 20, RULE_block_aligned_directive); + enterRule(_localctx, 18, RULE_block_aligned_directive); try { enterOuterAlt(_localctx, 1); { - setState(134); + setState(128); match(D_BLOCK_ALIGNED_DIRECTIVE); } } @@ -1070,30 +1037,30 @@ public void exitRule(ParseTreeListener listener) { public final Inline_identable_elementContext inline_identable_element() throws RecognitionException { Inline_identable_elementContext _localctx = new Inline_identable_elementContext(_ctx, getState()); - enterRule(_localctx, 22, RULE_inline_identable_element); + enterRule(_localctx, 20, RULE_inline_identable_element); int _la; try { - setState(147); + setState(141); _errHandler.sync(this); switch (_input.LA(1)) { case D_INLINE_DIRECTIVE: enterOuterAlt(_localctx, 1); { - setState(136); + setState(130); match(D_INLINE_DIRECTIVE); } break; case NON_PARAM_DIRECTIVE: enterOuterAlt(_localctx, 2); { - setState(137); + setState(131); match(NON_PARAM_DIRECTIVE); } break; case D_SECTION: enterOuterAlt(_localctx, 3); { - setState(138); + setState(132); section_inline(); } break; @@ -1101,30 +1068,30 @@ public final Inline_identable_elementContext inline_identable_element() throws R case RAW_TAG_OPEN: enterOuterAlt(_localctx, 4); { - setState(139); + setState(133); blade_echo(); } break; case D_PHP: enterOuterAlt(_localctx, 5); { - setState(140); + setState(134); match(D_PHP); - setState(142); + setState(136); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(141); + setState(135); match(PHP_CODE); } } - setState(144); + setState(138); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==PHP_CODE ); - setState(146); + setState(140); match(D_ENDPHP); } break; @@ -1165,17 +1132,17 @@ public void exitRule(ParseTreeListener listener) { public final Section_inlineContext section_inline() throws RecognitionException { Section_inlineContext _localctx = new Section_inlineContext(_ctx, getState()); - enterRule(_localctx, 24, RULE_section_inline); + enterRule(_localctx, 22, RULE_section_inline); try { enterOuterAlt(_localctx, 1); { - setState(149); + setState(143); match(D_SECTION); - setState(150); + setState(144); match(D_ARG_LPAREN); - setState(151); + setState(145); match(PARAM_COMMA); - setState(152); + setState(146); match(D_ARG_RPAREN); } } @@ -1192,18 +1159,23 @@ public final Section_inlineContext section_inline() throws RecognitionException @SuppressWarnings("CheckReturnValue") public static class Section_blockContext extends ParserRuleContext { - public Section_block_startContext section_block_start() { - return getRuleContext(Section_block_startContext.class,0); - } - public Section_block_endContext section_block_end() { - return getRuleContext(Section_block_endContext.class,0); - } + public Nl_with_space_afterContext ws_after; + public TerminalNode D_SECTION() { return getToken(BladeAntlrFormatterParser.D_SECTION, 0); } + public TerminalNode D_ARG_LPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_LPAREN, 0); } + public TerminalNode D_ARG_RPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_RPAREN, 0); } + public TerminalNode D_ENDSECTION() { return getToken(BladeAntlrFormatterParser.D_ENDSECTION, 0); } public List statement() { return getRuleContexts(StatementContext.class); } public StatementContext statement(int i) { return getRuleContext(StatementContext.class,i); } + public List nl_with_space_after() { + return getRuleContexts(Nl_with_space_afterContext.class); + } + public Nl_with_space_afterContext nl_with_space_after(int i) { + return getRuleContext(Nl_with_space_afterContext.class,i); + } public Section_blockContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -1220,65 +1192,48 @@ public void exitRule(ParseTreeListener listener) { public final Section_blockContext section_block() throws RecognitionException { Section_blockContext _localctx = new Section_blockContext(_ctx, getState()); - enterRule(_localctx, 26, RULE_section_block); + enterRule(_localctx, 24, RULE_section_block); int _la; try { + int _alt; enterOuterAlt(_localctx, 1); { + setState(148); + match(D_SECTION); + setState(149); + match(D_ARG_LPAREN); + setState(150); + match(D_ARG_RPAREN); setState(154); - section_block_start(); - setState(156); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,11,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(151); + ((Section_blockContext)_localctx).ws_after = nl_with_space_after(); + } + } + } + setState(156); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,11,_ctx); + } + setState(158); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(155); + setState(157); statement(); } } - setState(158); + setState(160); _errHandler.sync(this); _la = _input.LA(1); } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 2000678626L) != 0) ); - setState(160); - section_block_end(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Section_block_endContext extends ParserRuleContext { - public TerminalNode D_ENDSECTION() { return getToken(BladeAntlrFormatterParser.D_ENDSECTION, 0); } - public Section_block_endContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_section_block_end; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterSection_block_end(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitSection_block_end(this); - } - } - - public final Section_block_endContext section_block_end() throws RecognitionException { - Section_block_endContext _localctx = new Section_block_endContext(_ctx, getState()); - enterRule(_localctx, 28, RULE_section_block_end); - try { - enterOuterAlt(_localctx, 1); - { setState(162); match(D_ENDSECTION); } @@ -1295,82 +1250,59 @@ public final Section_block_endContext section_block_end() throws RecognitionExce } @SuppressWarnings("CheckReturnValue") - public static class Section_block_startContext extends ParserRuleContext { - public TerminalNode D_SECTION() { return getToken(BladeAntlrFormatterParser.D_SECTION, 0); } - public TerminalNode D_ARG_LPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_LPAREN, 0); } - public TerminalNode D_ARG_RPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_RPAREN, 0); } - public Section_block_startContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_section_block_start; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterSection_block_start(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitSection_block_start(this); - } - } - - public final Section_block_startContext section_block_start() throws RecognitionException { - Section_block_startContext _localctx = new Section_block_startContext(_ctx, getState()); - enterRule(_localctx, 30, RULE_section_block_start); - try { - enterOuterAlt(_localctx, 1); - { - setState(164); - match(D_SECTION); - setState(165); - match(D_ARG_LPAREN); - setState(166); - match(D_ARG_RPAREN); - } + public static class Nl_with_space_afterContext extends ParserRuleContext { + public List NL() { return getTokens(BladeAntlrFormatterParser.NL); } + public TerminalNode NL(int i) { + return getToken(BladeAntlrFormatterParser.NL, i); } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Nl_with_space_beforeContext extends ParserRuleContext { - public TerminalNode NL() { return getToken(BladeAntlrFormatterParser.NL, 0); } public List WS() { return getTokens(BladeAntlrFormatterParser.WS); } public TerminalNode WS(int i) { return getToken(BladeAntlrFormatterParser.WS, i); } - public Nl_with_space_beforeContext(ParserRuleContext parent, int invokingState) { + public Nl_with_space_afterContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_nl_with_space_before; } + @Override public int getRuleIndex() { return RULE_nl_with_space_after; } @Override public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterNl_with_space_before(this); + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterNl_with_space_after(this); } @Override public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitNl_with_space_before(this); + if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitNl_with_space_after(this); } } - public final Nl_with_space_beforeContext nl_with_space_before() throws RecognitionException { - Nl_with_space_beforeContext _localctx = new Nl_with_space_beforeContext(_ctx, getState()); - enterRule(_localctx, 32, RULE_nl_with_space_before); + public final Nl_with_space_afterContext nl_with_space_after() throws RecognitionException { + Nl_with_space_afterContext _localctx = new Nl_with_space_afterContext(_ctx, getState()); + enterRule(_localctx, 26, RULE_nl_with_space_after); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(168); - match(NL); + setState(165); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(164); + match(NL); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(167); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,13,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); setState(172); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,12,_ctx); + _alt = getInterpreter().adaptivePredict(_input,14,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { @@ -1382,7 +1314,7 @@ public final Nl_with_space_beforeContext nl_with_space_before() throws Recogniti } setState(174); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,12,_ctx); + _alt = getInterpreter().adaptivePredict(_input,14,_ctx); } } } @@ -1420,7 +1352,7 @@ public void exitRule(ParseTreeListener listener) { public final Nl_with_spaceContext nl_with_space() throws RecognitionException { Nl_with_spaceContext _localctx = new Nl_with_spaceContext(_ctx, getState()); - enterRule(_localctx, 34, RULE_nl_with_space); + enterRule(_localctx, 28, RULE_nl_with_space); int _la; try { enterOuterAlt(_localctx, 1); @@ -1475,7 +1407,7 @@ public void exitRule(ParseTreeListener listener) { public final Static_elementContext static_element() throws RecognitionException { Static_elementContext _localctx = new Static_elementContext(_ctx, getState()); - enterRule(_localctx, 36, RULE_static_element); + enterRule(_localctx, 30, RULE_static_element); int _la; try { enterOuterAlt(_localctx, 1); @@ -1525,7 +1457,7 @@ public void exitRule(ParseTreeListener listener) { public final Blade_echoContext blade_echo() throws RecognitionException { Blade_echoContext _localctx = new Blade_echoContext(_ctx, getState()); - enterRule(_localctx, 38, RULE_blade_echo); + enterRule(_localctx, 32, RULE_blade_echo); try { setState(188); _errHandler.sync(this); @@ -1573,123 +1505,124 @@ public final Blade_echoContext blade_echo() throws RecognitionException { "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"+ - "\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012"+ - "\u0002\u0013\u0007\u0013\u0001\u0000\u0005\u0000*\b\u0000\n\u0000\f\u0000"+ - "-\t\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0002\u0010\u0007\u0010\u0001\u0000\u0005\u0000$\b\u0000\n\u0000\f\u0000"+ + "\'\t\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001"+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0003\u0001B\b\u0001\u0001\u0002\u0001\u0002"+ + "\u0001\u0001\u0001\u0001\u0003\u0001<\b\u0001\u0001\u0002\u0001\u0002"+ "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ - "\u0001\u0002\u0001\u0002\u0001\u0002\u0003\u0002U\b\u0002\u0001\u0003"+ - "\u0001\u0003\u0001\u0004\u0001\u0004\u0005\u0004[\b\u0004\n\u0004\f\u0004"+ - "^\t\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0005\u0004c\b\u0004\n\u0004"+ - "\f\u0004f\t\u0004\u0001\u0005\u0001\u0005\u0005\u0005j\b\u0005\n\u0005"+ - "\f\u0005m\t\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0005\u0006t\b\u0006\n\u0006\f\u0006w\t\u0006\u0001\u0006\u0003"+ - "\u0006z\b\u0006\u0001\u0007\u0003\u0007}\b\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\t\u0001\t\u0001\n\u0001"+ - "\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0004\u000b\u008f\b\u000b\u000b\u000b\f\u000b\u0090\u0001\u000b\u0003"+ - "\u000b\u0094\b\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001"+ - "\r\u0004\r\u009d\b\r\u000b\r\f\r\u009e\u0001\r\u0001\r\u0001\u000e\u0001"+ - "\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001"+ - "\u0010\u0005\u0010\u00ab\b\u0010\n\u0010\f\u0010\u00ae\t\u0010\u0001\u0011"+ - "\u0001\u0011\u0005\u0011\u00b2\b\u0011\n\u0011\f\u0011\u00b5\t\u0011\u0001"+ - "\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0003"+ - "\u0013\u00bd\b\u0013\u0001\u0013\u0000\u0000\u0014\u0000\u0002\u0004\u0006"+ - "\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&\u0000"+ - "\u0004\u0001\u0000\u000f\u0010\u0001\u0000\u001c\u001d\u0002\u0000\u0013"+ - "\u0013\u0015\u0015\u0003\u0000\u0001\u0001\u0012\u0012\u001e\u001e\u00d6"+ - "\u0000+\u0001\u0000\u0000\u0000\u0002A\u0001\u0000\u0000\u0000\u0004T"+ - "\u0001\u0000\u0000\u0000\u0006V\u0001\u0000\u0000\u0000\bX\u0001\u0000"+ - "\u0000\u0000\ng\u0001\u0000\u0000\u0000\fy\u0001\u0000\u0000\u0000\u000e"+ - "|\u0001\u0000\u0000\u0000\u0010\u0082\u0001\u0000\u0000\u0000\u0012\u0084"+ - "\u0001\u0000\u0000\u0000\u0014\u0086\u0001\u0000\u0000\u0000\u0016\u0093"+ - "\u0001\u0000\u0000\u0000\u0018\u0095\u0001\u0000\u0000\u0000\u001a\u009a"+ - "\u0001\u0000\u0000\u0000\u001c\u00a2\u0001\u0000\u0000\u0000\u001e\u00a4"+ - "\u0001\u0000\u0000\u0000 \u00a8\u0001\u0000\u0000\u0000\"\u00af\u0001"+ - "\u0000\u0000\u0000$\u00b6\u0001\u0000\u0000\u0000&\u00bc\u0001\u0000\u0000"+ - "\u0000(*\u0003\u0002\u0001\u0000)(\u0001\u0000\u0000\u0000*-\u0001\u0000"+ - "\u0000\u0000+)\u0001\u0000\u0000\u0000+,\u0001\u0000\u0000\u0000,.\u0001"+ - "\u0000\u0000\u0000-+\u0001\u0000\u0000\u0000./\u0005\u0000\u0000\u0001"+ - "/\u0001\u0001\u0000\u0000\u00000B\u0003\b\u0004\u00001B\u0003\u000e\u0007"+ - "\u00002B\u0003\u0012\t\u00003B\u0003\n\u0005\u00004B\u0003\f\u0006\u0000"+ - "5B\u0003\u001a\r\u00006B\u0003\u0016\u000b\u00007B\u0003\u0014\n\u0000"+ - "8B\u0003$\u0012\u00009B\u0003 \u0010\u0000:B\u0003&\u0013\u0000;B\u0003"+ - "\u0012\t\u0000B\u0005"+ - "\u0018\u0000\u0000?B\u0005\u0019\u0000\u0000@B\u0007\u0001\u0000\u0000"+ - "A0\u0001\u0000\u0000\u0000A1\u0001\u0000\u0000\u0000A2\u0001\u0000\u0000"+ - "\u0000A3\u0001\u0000\u0000\u0000A4\u0001\u0000\u0000\u0000A5\u0001\u0000"+ - "\u0000\u0000A6\u0001\u0000\u0000\u0000A7\u0001\u0000\u0000\u0000A8\u0001"+ - "\u0000\u0000\u0000A9\u0001\u0000\u0000\u0000A:\u0001\u0000\u0000\u0000"+ - "A;\u0001\u0000\u0000\u0000A<\u0001\u0000\u0000\u0000A=\u0001\u0000\u0000"+ - "\u0000A>\u0001\u0000\u0000\u0000A?\u0001\u0000\u0000\u0000A@\u0001\u0000"+ - "\u0000\u0000B\u0003\u0001\u0000\u0000\u0000CD\u0005\u0017\u0000\u0000"+ - "DE\u0005\u0016\u0000\u0000EU\u0005\u0017\u0000\u0000FU\u0003\u000e\u0007"+ - "\u0000GU\u0003\u0012\t\u0000HU\u0003&\u0013\u0000IU\u0005\u000b\u0000"+ - "\u0000JU\u0005\n\u0000\u0000KU\u0005\t\u0000\u0000LM\u0005\u0017\u0000"+ - "\u0000MN\u0005\u0016\u0000\u0000NU\u0005\f\u0000\u0000OU\u0005\u0017\u0000"+ - "\u0000PU\u0005\f\u0000\u0000QU\u0005\u0016\u0000\u0000RU\u0005\u001c\u0000"+ - "\u0000SU\u0005\u001d\u0000\u0000TC\u0001\u0000\u0000\u0000TF\u0001\u0000"+ - "\u0000\u0000TG\u0001\u0000\u0000\u0000TH\u0001\u0000\u0000\u0000TI\u0001"+ - "\u0000\u0000\u0000TJ\u0001\u0000\u0000\u0000TK\u0001\u0000\u0000\u0000"+ - "TL\u0001\u0000\u0000\u0000TO\u0001\u0000\u0000\u0000TP\u0001\u0000\u0000"+ - "\u0000TQ\u0001\u0000\u0000\u0000TR\u0001\u0000\u0000\u0000TS\u0001\u0000"+ - "\u0000\u0000U\u0005\u0001\u0000\u0000\u0000VW\u0005\u0011\u0000\u0000"+ - "W\u0007\u0001\u0000\u0000\u0000X\\\u0007\u0002\u0000\u0000Y[\u0003\u0004"+ - "\u0002\u0000ZY\u0001\u0000\u0000\u0000[^\u0001\u0000\u0000\u0000\\Z\u0001"+ - "\u0000\u0000\u0000\\]\u0001\u0000\u0000\u0000]_\u0001\u0000\u0000\u0000"+ - "^\\\u0001\u0000\u0000\u0000_`\u0005\u0019\u0000\u0000`d\u0005\u001d\u0000"+ - "\u0000ac\u0005\u001c\u0000\u0000ba\u0001\u0000\u0000\u0000cf\u0001\u0000"+ - "\u0000\u0000db\u0001\u0000\u0000\u0000de\u0001\u0000\u0000\u0000e\t\u0001"+ - "\u0000\u0000\u0000fd\u0001\u0000\u0000\u0000gk\u0007\u0002\u0000\u0000"+ - "hj\u0003\u0004\u0002\u0000ih\u0001\u0000\u0000\u0000jm\u0001\u0000\u0000"+ - "\u0000ki\u0001\u0000\u0000\u0000kl\u0001\u0000\u0000\u0000ln\u0001\u0000"+ - "\u0000\u0000mk\u0001\u0000\u0000\u0000no\u0005\u0019\u0000\u0000o\u000b"+ - "\u0001\u0000\u0000\u0000pz\u0005\u0014\u0000\u0000qu\u0007\u0002\u0000"+ - "\u0000rt\u0003\u0004\u0002\u0000sr\u0001\u0000\u0000\u0000tw\u0001\u0000"+ - "\u0000\u0000us\u0001\u0000\u0000\u0000uv\u0001\u0000\u0000\u0000vx\u0001"+ - "\u0000\u0000\u0000wu\u0001\u0000\u0000\u0000xz\u0005\u0018\u0000\u0000"+ - "yp\u0001\u0000\u0000\u0000yq\u0001\u0000\u0000\u0000z\r\u0001\u0000\u0000"+ - "\u0000{}\u0003 \u0010\u0000|{\u0001\u0000\u0000\u0000|}\u0001\u0000\u0000"+ - "\u0000}~\u0001\u0000\u0000\u0000~\u007f\u0003\u0010\b\u0000\u007f\u0080"+ - "\u0005\u001f\u0000\u0000\u0080\u0081\u0005 \u0000\u0000\u0081\u000f\u0001"+ - "\u0000\u0000\u0000\u0082\u0083\u0005\u0005\u0000\u0000\u0083\u0011\u0001"+ - "\u0000\u0000\u0000\u0084\u0085\u0005\u0006\u0000\u0000\u0085\u0013\u0001"+ - "\u0000\u0000\u0000\u0086\u0087\u0005\t\u0000\u0000\u0087\u0015\u0001\u0000"+ - "\u0000\u0000\u0088\u0094\u0005\u000b\u0000\u0000\u0089\u0094\u0005\n\u0000"+ - "\u0000\u008a\u0094\u0003\u0018\f\u0000\u008b\u0094\u0003&\u0013\u0000"+ - "\u008c\u008e\u0005\u001a\u0000\u0000\u008d\u008f\u0005\u0002\u0000\u0000"+ - "\u008e\u008d\u0001\u0000\u0000\u0000\u008f\u0090\u0001\u0000\u0000\u0000"+ - "\u0090\u008e\u0001\u0000\u0000\u0000\u0090\u0091\u0001\u0000\u0000\u0000"+ - "\u0091\u0092\u0001\u0000\u0000\u0000\u0092\u0094\u0005,\u0000\u0000\u0093"+ - "\u0088\u0001\u0000\u0000\u0000\u0093\u0089\u0001\u0000\u0000\u0000\u0093"+ - "\u008a\u0001\u0000\u0000\u0000\u0093\u008b\u0001\u0000\u0000\u0000\u0093"+ - "\u008c\u0001\u0000\u0000\u0000\u0094\u0017\u0001\u0000\u0000\u0000\u0095"+ - "\u0096\u0005\u0007\u0000\u0000\u0096\u0097\u0005\u001f\u0000\u0000\u0097"+ - "\u0098\u0005\u0003\u0000\u0000\u0098\u0099\u0005 \u0000\u0000\u0099\u0019"+ - "\u0001\u0000\u0000\u0000\u009a\u009c\u0003\u001e\u000f\u0000\u009b\u009d"+ - "\u0003\u0002\u0001\u0000\u009c\u009b\u0001\u0000\u0000\u0000\u009d\u009e"+ - "\u0001\u0000\u0000\u0000\u009e\u009c\u0001\u0000\u0000\u0000\u009e\u009f"+ - "\u0001\u0000\u0000\u0000\u009f\u00a0\u0001\u0000\u0000\u0000\u00a0\u00a1"+ - "\u0003\u001c\u000e\u0000\u00a1\u001b\u0001\u0000\u0000\u0000\u00a2\u00a3"+ - "\u0005\b\u0000\u0000\u00a3\u001d\u0001\u0000\u0000\u0000\u00a4\u00a5\u0005"+ - "\u0007\u0000\u0000\u00a5\u00a6\u0005\u001f\u0000\u0000\u00a6\u00a7\u0005"+ - " \u0000\u0000\u00a7\u001f\u0001\u0000\u0000\u0000\u00a8\u00ac\u0005\u001d"+ - "\u0000\u0000\u00a9\u00ab\u0005\u001c\u0000\u0000\u00aa\u00a9\u0001\u0000"+ - "\u0000\u0000\u00ab\u00ae\u0001\u0000\u0000\u0000\u00ac\u00aa\u0001\u0000"+ - "\u0000\u0000\u00ac\u00ad\u0001\u0000\u0000\u0000\u00ad!\u0001\u0000\u0000"+ - "\u0000\u00ae\u00ac\u0001\u0000\u0000\u0000\u00af\u00b3\u0005\u001d\u0000"+ - "\u0000\u00b0\u00b2\u0005\u001c\u0000\u0000\u00b1\u00b0\u0001\u0000\u0000"+ - "\u0000\u00b2\u00b5\u0001\u0000\u0000\u0000\u00b3\u00b1\u0001\u0000\u0000"+ - "\u0000\u00b3\u00b4\u0001\u0000\u0000\u0000\u00b4#\u0001\u0000\u0000\u0000"+ - "\u00b5\u00b3\u0001\u0000\u0000\u0000\u00b6\u00b7\u0007\u0003\u0000\u0000"+ - "\u00b7%\u0001\u0000\u0000\u0000\u00b8\u00b9\u0005\r\u0000\u0000\u00b9"+ - "\u00bd\u0005-\u0000\u0000\u00ba\u00bb\u0005\u000e\u0000\u0000\u00bb\u00bd"+ - "\u00050\u0000\u0000\u00bc\u00b8\u0001\u0000\u0000\u0000\u00bc\u00ba\u0001"+ - "\u0000\u0000\u0000\u00bd\'\u0001\u0000\u0000\u0000\u000f+AT\\dkuy|\u0090"+ - "\u0093\u009e\u00ac\u00b3\u00bc"; + "\u0001\u0002\u0001\u0002\u0001\u0002\u0003\u0002O\b\u0002\u0001\u0003"+ + "\u0001\u0003\u0001\u0004\u0001\u0004\u0005\u0004U\b\u0004\n\u0004\f\u0004"+ + "X\t\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0005\u0004]\b\u0004\n\u0004"+ + "\f\u0004`\t\u0004\u0001\u0005\u0001\u0005\u0005\u0005d\b\u0005\n\u0005"+ + "\f\u0005g\t\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0005\u0006n\b\u0006\n\u0006\f\u0006q\t\u0006\u0001\u0006\u0003"+ + "\u0006t\b\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0005"+ + "\u0007z\b\u0007\n\u0007\f\u0007}\t\u0007\u0001\b\u0001\b\u0001\t\u0001"+ + "\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0004\n\u0089\b\n\u000b"+ + "\n\f\n\u008a\u0001\n\u0003\n\u008e\b\n\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0005\f\u0099"+ + "\b\f\n\f\f\f\u009c\t\f\u0001\f\u0004\f\u009f\b\f\u000b\f\f\f\u00a0\u0001"+ + "\f\u0001\f\u0001\r\u0004\r\u00a6\b\r\u000b\r\f\r\u00a7\u0001\r\u0005\r"+ + "\u00ab\b\r\n\r\f\r\u00ae\t\r\u0001\u000e\u0001\u000e\u0005\u000e\u00b2"+ + "\b\u000e\n\u000e\f\u000e\u00b5\t\u000e\u0001\u000f\u0001\u000f\u0001\u0010"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u00bd\b\u0010\u0001\u0010"+ + "\u0000\u0000\u0011\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014"+ + "\u0016\u0018\u001a\u001c\u001e \u0000\u0004\u0001\u0000\u000f\u0010\u0001"+ + "\u0000\u001c\u001d\u0002\u0000\u0013\u0013\u0015\u0015\u0003\u0000\u0001"+ + "\u0001\u0012\u0012\u001e\u001e\u00db\u0000%\u0001\u0000\u0000\u0000\u0002"+ + ";\u0001\u0000\u0000\u0000\u0004N\u0001\u0000\u0000\u0000\u0006P\u0001"+ + "\u0000\u0000\u0000\bR\u0001\u0000\u0000\u0000\na\u0001\u0000\u0000\u0000"+ + "\fs\u0001\u0000\u0000\u0000\u000eu\u0001\u0000\u0000\u0000\u0010~\u0001"+ + "\u0000\u0000\u0000\u0012\u0080\u0001\u0000\u0000\u0000\u0014\u008d\u0001"+ + "\u0000\u0000\u0000\u0016\u008f\u0001\u0000\u0000\u0000\u0018\u0094\u0001"+ + "\u0000\u0000\u0000\u001a\u00a5\u0001\u0000\u0000\u0000\u001c\u00af\u0001"+ + "\u0000\u0000\u0000\u001e\u00b6\u0001\u0000\u0000\u0000 \u00bc\u0001\u0000"+ + "\u0000\u0000\"$\u0003\u0002\u0001\u0000#\"\u0001\u0000\u0000\u0000$\'"+ + "\u0001\u0000\u0000\u0000%#\u0001\u0000\u0000\u0000%&\u0001\u0000\u0000"+ + "\u0000&(\u0001\u0000\u0000\u0000\'%\u0001\u0000\u0000\u0000()\u0005\u0000"+ + "\u0000\u0001)\u0001\u0001\u0000\u0000\u0000*<\u0003\b\u0004\u0000+<\u0003"+ + "\u000e\u0007\u0000,<\u0003\u0010\b\u0000-<\u0003\n\u0005\u0000.<\u0003"+ + "\f\u0006\u0000/<\u0003\u0018\f\u00000<\u0003\u0014\n\u00001<\u0003\u0012"+ + "\t\u00002<\u0003\u001e\u000f\u00003<\u0003\u001a\r\u00004<\u0003 \u0010"+ + "\u00005<\u0003\u0010\b\u00006<\u0003\u0006\u0003\u00007<\u0007\u0000\u0000"+ + "\u00008<\u0005\u0018\u0000\u00009<\u0005\u0019\u0000\u0000:<\u0007\u0001"+ + "\u0000\u0000;*\u0001\u0000\u0000\u0000;+\u0001\u0000\u0000\u0000;,\u0001"+ + "\u0000\u0000\u0000;-\u0001\u0000\u0000\u0000;.\u0001\u0000\u0000\u0000"+ + ";/\u0001\u0000\u0000\u0000;0\u0001\u0000\u0000\u0000;1\u0001\u0000\u0000"+ + "\u0000;2\u0001\u0000\u0000\u0000;3\u0001\u0000\u0000\u0000;4\u0001\u0000"+ + "\u0000\u0000;5\u0001\u0000\u0000\u0000;6\u0001\u0000\u0000\u0000;7\u0001"+ + "\u0000\u0000\u0000;8\u0001\u0000\u0000\u0000;9\u0001\u0000\u0000\u0000"+ + ";:\u0001\u0000\u0000\u0000<\u0003\u0001\u0000\u0000\u0000=>\u0005\u0017"+ + "\u0000\u0000>?\u0005\u0016\u0000\u0000?O\u0005\u0017\u0000\u0000@O\u0003"+ + "\u000e\u0007\u0000AO\u0003\u0010\b\u0000BO\u0003 \u0010\u0000CO\u0005"+ + "\u000b\u0000\u0000DO\u0005\n\u0000\u0000EO\u0005\t\u0000\u0000FG\u0005"+ + "\u0017\u0000\u0000GH\u0005\u0016\u0000\u0000HO\u0005\f\u0000\u0000IO\u0005"+ + "\u0017\u0000\u0000JO\u0005\f\u0000\u0000KO\u0005\u0016\u0000\u0000LO\u0005"+ + "\u001c\u0000\u0000MO\u0005\u001d\u0000\u0000N=\u0001\u0000\u0000\u0000"+ + "N@\u0001\u0000\u0000\u0000NA\u0001\u0000\u0000\u0000NB\u0001\u0000\u0000"+ + "\u0000NC\u0001\u0000\u0000\u0000ND\u0001\u0000\u0000\u0000NE\u0001\u0000"+ + "\u0000\u0000NF\u0001\u0000\u0000\u0000NI\u0001\u0000\u0000\u0000NJ\u0001"+ + "\u0000\u0000\u0000NK\u0001\u0000\u0000\u0000NL\u0001\u0000\u0000\u0000"+ + "NM\u0001\u0000\u0000\u0000O\u0005\u0001\u0000\u0000\u0000PQ\u0005\u0011"+ + "\u0000\u0000Q\u0007\u0001\u0000\u0000\u0000RV\u0007\u0002\u0000\u0000"+ + "SU\u0003\u0004\u0002\u0000TS\u0001\u0000\u0000\u0000UX\u0001\u0000\u0000"+ + "\u0000VT\u0001\u0000\u0000\u0000VW\u0001\u0000\u0000\u0000WY\u0001\u0000"+ + "\u0000\u0000XV\u0001\u0000\u0000\u0000YZ\u0005\u0019\u0000\u0000Z^\u0005"+ + "\u001d\u0000\u0000[]\u0005\u001c\u0000\u0000\\[\u0001\u0000\u0000\u0000"+ + "]`\u0001\u0000\u0000\u0000^\\\u0001\u0000\u0000\u0000^_\u0001\u0000\u0000"+ + "\u0000_\t\u0001\u0000\u0000\u0000`^\u0001\u0000\u0000\u0000ae\u0007\u0002"+ + "\u0000\u0000bd\u0003\u0004\u0002\u0000cb\u0001\u0000\u0000\u0000dg\u0001"+ + "\u0000\u0000\u0000ec\u0001\u0000\u0000\u0000ef\u0001\u0000\u0000\u0000"+ + "fh\u0001\u0000\u0000\u0000ge\u0001\u0000\u0000\u0000hi\u0005\u0019\u0000"+ + "\u0000i\u000b\u0001\u0000\u0000\u0000jt\u0005\u0014\u0000\u0000ko\u0007"+ + "\u0002\u0000\u0000ln\u0003\u0004\u0002\u0000ml\u0001\u0000\u0000\u0000"+ + "nq\u0001\u0000\u0000\u0000om\u0001\u0000\u0000\u0000op\u0001\u0000\u0000"+ + "\u0000pr\u0001\u0000\u0000\u0000qo\u0001\u0000\u0000\u0000rt\u0005\u0018"+ + "\u0000\u0000sj\u0001\u0000\u0000\u0000sk\u0001\u0000\u0000\u0000t\r\u0001"+ + "\u0000\u0000\u0000uv\u0005\u0005\u0000\u0000vw\u0005\u001f\u0000\u0000"+ + "w{\u0005 \u0000\u0000xz\u0003\u001a\r\u0000yx\u0001\u0000\u0000\u0000"+ + "z}\u0001\u0000\u0000\u0000{y\u0001\u0000\u0000\u0000{|\u0001\u0000\u0000"+ + "\u0000|\u000f\u0001\u0000\u0000\u0000}{\u0001\u0000\u0000\u0000~\u007f"+ + "\u0005\u0006\u0000\u0000\u007f\u0011\u0001\u0000\u0000\u0000\u0080\u0081"+ + "\u0005\t\u0000\u0000\u0081\u0013\u0001\u0000\u0000\u0000\u0082\u008e\u0005"+ + "\u000b\u0000\u0000\u0083\u008e\u0005\n\u0000\u0000\u0084\u008e\u0003\u0016"+ + "\u000b\u0000\u0085\u008e\u0003 \u0010\u0000\u0086\u0088\u0005\u001a\u0000"+ + "\u0000\u0087\u0089\u0005\u0002\u0000\u0000\u0088\u0087\u0001\u0000\u0000"+ + "\u0000\u0089\u008a\u0001\u0000\u0000\u0000\u008a\u0088\u0001\u0000\u0000"+ + "\u0000\u008a\u008b\u0001\u0000\u0000\u0000\u008b\u008c\u0001\u0000\u0000"+ + "\u0000\u008c\u008e\u0005,\u0000\u0000\u008d\u0082\u0001\u0000\u0000\u0000"+ + "\u008d\u0083\u0001\u0000\u0000\u0000\u008d\u0084\u0001\u0000\u0000\u0000"+ + "\u008d\u0085\u0001\u0000\u0000\u0000\u008d\u0086\u0001\u0000\u0000\u0000"+ + "\u008e\u0015\u0001\u0000\u0000\u0000\u008f\u0090\u0005\u0007\u0000\u0000"+ + "\u0090\u0091\u0005\u001f\u0000\u0000\u0091\u0092\u0005\u0003\u0000\u0000"+ + "\u0092\u0093\u0005 \u0000\u0000\u0093\u0017\u0001\u0000\u0000\u0000\u0094"+ + "\u0095\u0005\u0007\u0000\u0000\u0095\u0096\u0005\u001f\u0000\u0000\u0096"+ + "\u009a\u0005 \u0000\u0000\u0097\u0099\u0003\u001a\r\u0000\u0098\u0097"+ + "\u0001\u0000\u0000\u0000\u0099\u009c\u0001\u0000\u0000\u0000\u009a\u0098"+ + "\u0001\u0000\u0000\u0000\u009a\u009b\u0001\u0000\u0000\u0000\u009b\u009e"+ + "\u0001\u0000\u0000\u0000\u009c\u009a\u0001\u0000\u0000\u0000\u009d\u009f"+ + "\u0003\u0002\u0001\u0000\u009e\u009d\u0001\u0000\u0000\u0000\u009f\u00a0"+ + "\u0001\u0000\u0000\u0000\u00a0\u009e\u0001\u0000\u0000\u0000\u00a0\u00a1"+ + "\u0001\u0000\u0000\u0000\u00a1\u00a2\u0001\u0000\u0000\u0000\u00a2\u00a3"+ + "\u0005\b\u0000\u0000\u00a3\u0019\u0001\u0000\u0000\u0000\u00a4\u00a6\u0005"+ + "\u001d\u0000\u0000\u00a5\u00a4\u0001\u0000\u0000\u0000\u00a6\u00a7\u0001"+ + "\u0000\u0000\u0000\u00a7\u00a5\u0001\u0000\u0000\u0000\u00a7\u00a8\u0001"+ + "\u0000\u0000\u0000\u00a8\u00ac\u0001\u0000\u0000\u0000\u00a9\u00ab\u0005"+ + "\u001c\u0000\u0000\u00aa\u00a9\u0001\u0000\u0000\u0000\u00ab\u00ae\u0001"+ + "\u0000\u0000\u0000\u00ac\u00aa\u0001\u0000\u0000\u0000\u00ac\u00ad\u0001"+ + "\u0000\u0000\u0000\u00ad\u001b\u0001\u0000\u0000\u0000\u00ae\u00ac\u0001"+ + "\u0000\u0000\u0000\u00af\u00b3\u0005\u001d\u0000\u0000\u00b0\u00b2\u0005"+ + "\u001c\u0000\u0000\u00b1\u00b0\u0001\u0000\u0000\u0000\u00b2\u00b5\u0001"+ + "\u0000\u0000\u0000\u00b3\u00b1\u0001\u0000\u0000\u0000\u00b3\u00b4\u0001"+ + "\u0000\u0000\u0000\u00b4\u001d\u0001\u0000\u0000\u0000\u00b5\u00b3\u0001"+ + "\u0000\u0000\u0000\u00b6\u00b7\u0007\u0003\u0000\u0000\u00b7\u001f\u0001"+ + "\u0000\u0000\u0000\u00b8\u00b9\u0005\r\u0000\u0000\u00b9\u00bd\u0005-"+ + "\u0000\u0000\u00ba\u00bb\u0005\u000e\u0000\u0000\u00bb\u00bd\u00050\u0000"+ + "\u0000\u00bc\u00b8\u0001\u0000\u0000\u0000\u00bc\u00ba\u0001\u0000\u0000"+ + "\u0000\u00bd!\u0001\u0000\u0000\u0000\u0011%;NV^eos{\u008a\u008d\u009a"+ + "\u00a0\u00a7\u00ac\u00b3\u00bc"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserBaseListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserBaseListener.java index 4f4a78b3ad34..e761c5f48790 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserBaseListener.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserBaseListener.java @@ -128,18 +128,6 @@ public class BladeAntlrFormatterParserBaseListener implements BladeAntlrFormatte *

      The default implementation does nothing.

      */ @Override public void exitBlock_start(BladeAntlrFormatterParser.Block_startContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterBlock_directive_name(BladeAntlrFormatterParser.Block_directive_nameContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitBlock_directive_name(BladeAntlrFormatterParser.Block_directive_nameContext ctx) { } /** * {@inheritDoc} * @@ -205,37 +193,13 @@ public class BladeAntlrFormatterParserBaseListener implements BladeAntlrFormatte * *

      The default implementation does nothing.

      */ - @Override public void enterSection_block_end(BladeAntlrFormatterParser.Section_block_endContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitSection_block_end(BladeAntlrFormatterParser.Section_block_endContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterSection_block_start(BladeAntlrFormatterParser.Section_block_startContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitSection_block_start(BladeAntlrFormatterParser.Section_block_startContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterNl_with_space_before(BladeAntlrFormatterParser.Nl_with_space_beforeContext ctx) { } + @Override public void enterNl_with_space_after(BladeAntlrFormatterParser.Nl_with_space_afterContext ctx) { } /** * {@inheritDoc} * *

      The default implementation does nothing.

      */ - @Override public void exitNl_with_space_before(BladeAntlrFormatterParser.Nl_with_space_beforeContext ctx) { } + @Override public void exitNl_with_space_after(BladeAntlrFormatterParser.Nl_with_space_afterContext ctx) { } /** * {@inheritDoc} * diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserListener.java index 6a90aee9a583..8284a1e2faf1 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserListener.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserListener.java @@ -107,16 +107,6 @@ public interface BladeAntlrFormatterParserListener extends ParseTreeListener { * @param ctx the parse tree */ void exitBlock_start(BladeAntlrFormatterParser.Block_startContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrFormatterParser#block_directive_name}. - * @param ctx the parse tree - */ - void enterBlock_directive_name(BladeAntlrFormatterParser.Block_directive_nameContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrFormatterParser#block_directive_name}. - * @param ctx the parse tree - */ - void exitBlock_directive_name(BladeAntlrFormatterParser.Block_directive_nameContext ctx); /** * Enter a parse tree produced by {@link BladeAntlrFormatterParser#block_end}. * @param ctx the parse tree @@ -168,35 +158,15 @@ public interface BladeAntlrFormatterParserListener extends ParseTreeListener { */ void exitSection_block(BladeAntlrFormatterParser.Section_blockContext ctx); /** - * Enter a parse tree produced by {@link BladeAntlrFormatterParser#section_block_end}. - * @param ctx the parse tree - */ - void enterSection_block_end(BladeAntlrFormatterParser.Section_block_endContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrFormatterParser#section_block_end}. - * @param ctx the parse tree - */ - void exitSection_block_end(BladeAntlrFormatterParser.Section_block_endContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrFormatterParser#section_block_start}. - * @param ctx the parse tree - */ - void enterSection_block_start(BladeAntlrFormatterParser.Section_block_startContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrFormatterParser#section_block_start}. - * @param ctx the parse tree - */ - void exitSection_block_start(BladeAntlrFormatterParser.Section_block_startContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrFormatterParser#nl_with_space_before}. + * Enter a parse tree produced by {@link BladeAntlrFormatterParser#nl_with_space_after}. * @param ctx the parse tree */ - void enterNl_with_space_before(BladeAntlrFormatterParser.Nl_with_space_beforeContext ctx); + void enterNl_with_space_after(BladeAntlrFormatterParser.Nl_with_space_afterContext ctx); /** - * Exit a parse tree produced by {@link BladeAntlrFormatterParser#nl_with_space_before}. + * Exit a parse tree produced by {@link BladeAntlrFormatterParser#nl_with_space_after}. * @param ctx the parse tree */ - void exitNl_with_space_before(BladeAntlrFormatterParser.Nl_with_space_beforeContext ctx); + void exitNl_with_space_after(BladeAntlrFormatterParser.Nl_with_space_afterContext ctx); /** * Enter a parse tree produced by {@link BladeAntlrFormatterParser#nl_with_space}. * @param ctx the parse tree diff --git a/php/php.blade/test/unit/data/testfiles/format/directive_blocks_01.blade.php b/php/php.blade/test/unit/data/testfiles/format/directive_blocks_01.blade.php new file mode 100644 index 000000000000..c82e64bfcfe2 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/format/directive_blocks_01.blade.php @@ -0,0 +1,4 @@ +@if($x) +@section($y) +@endsection +@endif \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/format/directive_blocks_01.blade.php.formatted b/php/php.blade/test/unit/data/testfiles/format/directive_blocks_01.blade.php.formatted new file mode 100644 index 000000000000..0cb15e640471 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/format/directive_blocks_01.blade.php.formatted @@ -0,0 +1,4 @@ +@if($x) + @section($y) + @endsection +@endif \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/format/directive_blocks_02.blade.php b/php/php.blade/test/unit/data/testfiles/format/directive_blocks_02.blade.php new file mode 100644 index 000000000000..e13a820af8f2 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/format/directive_blocks_02.blade.php @@ -0,0 +1,6 @@ +@if($x) +@section($y) +@if($x) +@endif +@endsection +@endif \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/format/directive_blocks_02.blade.php.formatted b/php/php.blade/test/unit/data/testfiles/format/directive_blocks_02.blade.php.formatted new file mode 100644 index 000000000000..2d8b0adeb035 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/format/directive_blocks_02.blade.php.formatted @@ -0,0 +1,6 @@ +@if($x) + @section($y) + @if($x) + @endif + @endsection +@endif \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/format/if_block_01.blade.php.formatted b/php/php.blade/test/unit/data/testfiles/format/if_block_01.blade.php.formatted index ea4a045ce5c3..c2e578b75a3f 100644 --- a/php/php.blade/test/unit/data/testfiles/format/if_block_01.blade.php.formatted +++ b/php/php.blade/test/unit/data/testfiles/format/if_block_01.blade.php.formatted @@ -1,4 +1,4 @@ @if($x) -@if($y) -@endif + @if($y) + @endif @endif \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterTest.java index 9cba5c68d8d6..247d2169be26 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterTest.java @@ -30,7 +30,14 @@ public BladeFormatterTest(String testName) { } public void testIfBlockFormat_01() throws Exception{ - format("if_block_01"); + reformatFile("if_block_01"); + } + + public void testDirectiveBlocksFormat_01() throws Exception{ + reformatFile("directive_blocks_01"); + } + + public void testDirectiveBlocksFormat_02() throws Exception{ + reformatFile("directive_blocks_02"); } - } diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterTestBase.java index 52446f6595f2..1451bfbaf1ce 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterTestBase.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterTestBase.java @@ -96,11 +96,11 @@ protected boolean runInEQ() { return true; } - protected void format(String fileName) throws Exception { - format(fileName, new IndentPrefs(4, 4)); + protected void reformatFile(String fileName) throws Exception { + reformatFile(fileName, new IndentPrefs(4, 4)); } - protected void format(String fileName, IndentPrefs indentPreferences) throws Exception { + protected void reformatFile(String fileName, IndentPrefs indentPreferences) throws Exception { assert fileName != null; reformatFileContents("testfiles/format/" + fileName + ".blade.php", indentPreferences); //NOI18N } From f6cefc5c637275be691c6a19c53946ba73b0acdb Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Tue, 8 Oct 2024 20:29:25 +0300 Subject: [PATCH 25/43] using set.of for immutable sets, reset parse error tests --- .../modules/php/blade/editor/BladeBracesMatcher.java | 8 ++++---- .../modules/php/blade/editor/BladeDeclarationFinder.java | 2 +- .../editor/completion/BladePhpCompletionProvider.java | 2 +- .../modules/php/blade/editor/lexer/BladeLexerUtils.java | 6 +++--- .../parser/unopend/unopend_set_error_01.blade.php.errors | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java index 104c5bdbb2d0..c52431097c2f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -198,7 +198,7 @@ private int[] findDirectiveEnd(String directive) { return null; } Set startDirectiveForBalance = new HashSet<>(); - Set stopDirectives = new HashSet<>(Arrays.asList(pair)); + Set stopDirectives = Set.of(pair); for (String endDirective : pair) { String[] startDirectives = BladeDirectivesUtils.directiveEnd2StartPair(endDirective); @@ -226,8 +226,8 @@ private int[] findDirectiveEnd(String directive) { private int[] findCustomDirectiveEnd(String directive) { String endPrefix = BladeDirectivesUtils.END_DIRECTIVE_PREFIX; String[] pair = new String[]{endPrefix + directive.substring(1)}; - Set stopDirectives = new HashSet<>(Arrays.asList(pair)); - Set startDirectiveForBalance = new HashSet<>(Arrays.asList(new String[]{directive})); + Set stopDirectives = Set.of(pair); + Set startDirectiveForBalance = Set.of(directive); Token endToken = BladeAntlrUtils.findForward(context.getDocument(), originToken, @@ -247,7 +247,7 @@ private int[] findCustomDirectiveEnd(String directive) { private int[] findOriginForDirectiveEnd(String directive) { String[] pair = BladeDirectivesUtils.directiveEnd2StartPair(directive); Set endDirectivesForBalance = new HashSet<>(); - Set openDirectives = new HashSet<>(Arrays.asList(pair)); + Set openDirectives = Set.of(pair); for (String startDirective : pair) { String[] endDirectives = BladeDirectivesUtils.directiveStart2EndPair(startDirective); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java index 3f452202a779..9b9bbacc0541 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java @@ -124,7 +124,7 @@ public OffsetRange getReferenceSpan(Document document, int caretOffset) { if (nt.getType() == BL_PARAM_STRING || nt.getType() == EXPR_STRING) { Set tokensToMatch = BladeLexerUtils.TOKENS_WITH_IDENTIFIABLE_PARAM; - Set tokensStop = new HashSet<>(Arrays.asList(new Integer[]{HTML})); + Set tokensStop = Set.of(HTML); org.antlr.v4.runtime.Token matchedToken = BladeAntlrUtils.findBackward(tokens, tokensToMatch, tokensStop); int offsetCorrection = caretOffset - lineOffset; if (matchedToken != null) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java index 3cd99e7f83f7..db26afd93ae0 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java @@ -177,7 +177,7 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse case BL_PARAM_STRING -> { String pathName = EditorStringUtils.stripSurroundingQuotes(currentToken.getText()); Set tokensToMatch = BladeLexerUtils.TOKENS_WITH_IDENTIFIABLE_PARAM; - Set tokensStop = new HashSet<>(Arrays.asList(new Integer[]{HTML, BL_COMMA, BL_PARAM_CONCAT_OPERATOR})); + Set tokensStop = Set.of(HTML, BL_COMMA, BL_PARAM_CONCAT_OPERATOR); Token directiveToken = BladeAntlrUtils.findBackward(tokens, tokensToMatch, tokensStop); if (directiveToken == null) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java index 79e347faee77..53ded031355e 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java @@ -38,12 +38,12 @@ public final class BladeLexerUtils { private BladeLexerUtils() { } - public static final Integer[] TOKENS_WITH_IDENTIFIABLE_PARAM_VALUES = new Integer[] { + + public static final Set TOKENS_WITH_IDENTIFIABLE_PARAM = Set.of( D_EXTENDS, D_INCLUDE, D_INCLUDE_IF, D_INCLUDE_WHEN, D_INCLUDE_UNLESS, D_EACH, D_SECTION, D_HAS_SECTION, D_SECTION_MISSING, D_PUSH, D_PUSH_IF, D_PREPEND, D_USE, D_INJECT, D_ASSET_BUNDLER - }; - public static final Set TOKENS_WITH_IDENTIFIABLE_PARAM = new HashSet<>(Arrays.asList(TOKENS_WITH_IDENTIFIABLE_PARAM_VALUES)); + );; public static TokenSequence getPhpTokenSequence(TokenHierarchy th, final int offset) { return getTokenSequence(th, offset, PHPTokenId.language()); diff --git a/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors b/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors index 118b39ce090f..fbdadaa275b4 100644 --- a/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors +++ b/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors @@ -1 +1 @@ -15-15:extraneous input '@endif' expecting {, HTML, '@if', '@else', '@switch', '@case', '@default', '@empty', D_COND_BLOCK_START, '@foreach', '@for', '@forelse', '@while', '@break', D_LOOP_ACTION, '@include', '@includeIf', '@includeWhen', '@includeFirst', '@includeUnless', '@each', '@extends', '@js', '@json', '@section', '@hasSection', '@sectionMissing', '@yield', '@once', '@stack', '@push', '@pushIf', '@prepend', '@props', '@fragment', '@csrf', '@method', '@error', '@production', '@env', D_AUTH_START, D_PERMISSION_START, D_PERMISSION_ELSE, '@class', '@style', D_HTML_ATTR_EXPR, '@aware', '@session', D_DD, '@lang', '@use', '@inject', D_PHP, '@verbatim', D_LIVEWIRE, '@vite', '@viteReactRefresh', D_CUSTOM, D_UNKNOWN_ATTR_ENC, D_UNKNOWN, '{{', '{!!', PHP_INLINE_START, HTML_COMPONENT_PREFIX, HTML_TAG_START, HTML_IDENTIFIER, '='} +[[15,15]-extraneous input '@endif' expecting {, HTML, '@if', '@else', '@switch', '@case', '@default', '@empty', D_COND_BLOCK_START, '@foreach', '@for', '@forelse', '@while', '@break', D_LOOP_ACTION, '@include', '@includeIf', '@includeWhen', '@includeFirst', '@includeUnless', '@each', '@extends', '@js', '@json', '@section', '@hasSection', '@sectionMissing', '@yield', '@once', '@stack', '@push', '@pushIf', '@prepend', '@props', '@fragment', '@csrf', '@method', '@error', '@production', '@env', D_AUTH_START, D_PERMISSION_START, D_PERMISSION_ELSE, '@class', '@style', D_HTML_ATTR_EXPR, '@aware', '@session', D_DD, '@lang', '@use', '@inject', D_PHP, '@verbatim', D_LIVEWIRE, '@vite', '@viteReactRefresh', D_CUSTOM, D_UNKNOWN_ATTR_ENC, D_UNKNOWN, '{{', '{!!', PHP_INLINE_START, HTML_COMPONENT_PREFIX, HTML_TAG_START, HTML_IDENTIFIER, '='}] 15-15:extraneous input '@endif' expecting {, HTML, '@if', '@else', '@switch', '@case', '@default', '@empty', D_COND_BLOCK_START, '@foreach', '@for', '@forelse', '@while', '@break', D_LOOP_ACTION, '@include', '@includeIf', '@includeWhen', '@includeFirst', '@includeUnless', '@each', '@extends', '@js', '@json', '@section', '@hasSection', '@sectionMissing', '@yield', '@once', '@stack', '@push', '@pushIf', '@prepend', '@props', '@fragment', '@csrf', '@method', '@error', '@production', '@env', D_AUTH_START, D_PERMISSION_START, D_PERMISSION_ELSE, '@class', '@style', D_HTML_ATTR_EXPR, '@aware', '@session', D_DD, '@lang', '@use', '@inject', D_PHP, '@verbatim', D_LIVEWIRE, '@vite', '@viteReactRefresh', D_CUSTOM, D_UNKNOWN_ATTR_ENC, D_UNKNOWN, '{{', '{!!', PHP_INLINE_START, HTML_COMPONENT_PREFIX, HTML_TAG_START, HTML_IDENTIFIER, '='} From dad0e658afb7421e5e63c85fcbba491d73974008 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Wed, 9 Oct 2024 07:39:41 +0300 Subject: [PATCH 26/43] add new parser tests, exclude directive parenteshis from php emebedded tokens, rename braces golden file for unix detection --- .../php/blade/editor/lexer/BladeLexer.java | 3 +- .../php/blade/editor/lexer/BladeTokenId.java | 26 +- .../antlr4/v10/BladeAntlrColoringLexer.g4 | 21 +- .../antlr4/v10/BladeAntlrColoringLexer.java | 2032 +++++++++-------- .../syntax/antlr4/v10/BladeAntlrLexer.g4 | 38 +- .../syntax/antlr4/v10/BladeAntlrLexer.java | 38 +- .../antlr4/v10/ColoringLexerAdaptor.java | 15 +- .../blade/syntax/antlr4/v10/LexerAdaptor.java | 62 +- .../lexer/BladeLexerTest/css_at_rules.pass | 28 +- .../BladeLexerTest/html_javascript_01.pass | 22 +- .../lexer/BladeLexerTest/include_01.pass | 6 +- .../AntlrColoringLexerTest/content_tag.pass | 6 - .../AntlrColoringLexerTest/escaped_tag.pass | 7 - .../lexer/blade/content_tag.pass | 10 +- .../lexer/blade/escaped_tag.pass | 12 +- .../lexer/blade/raw_tag.pass | 10 +- .../v10/AntlrColoringLexerTest/raw_tag.pass | 6 - ...01.testUnclosedSectionDirective_01.braces} | 0 .../inline_section_noerror_01.blade.php | 1 + ...inline_section_noerror_01.blade.php.errors | 0 ...losed_directive_bracket_error_01.blade.php | 1 + ...irective_bracket_error_01.blade.php.errors | 1 + .../unclosed_section_error_01.blade.php | 1 + ...unclosed_section_error_01.blade.php.errors | 1 + .../editor/parser/BladeParserErrorTest.java | 12 + 25 files changed, 1211 insertions(+), 1148 deletions(-) delete mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/content_tag.pass delete mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/escaped_tag.pass delete mode 100644 php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/raw_tag.pass rename php/php.blade/test/unit/data/testfiles/braces/{testUnClosedSectionDirective_01.testUnClosedSectionDirective_01.braces => testUnclosedSectionDirective_01.testUnclosedSectionDirective_01.braces} (100%) create mode 100644 php/php.blade/test/unit/data/testfiles/parser/unopend/inline_section_noerror_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/parser/unopend/inline_section_noerror_01.blade.php.errors create mode 100644 php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_directive_bracket_error_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_directive_bracket_error_01.blade.php.errors create mode 100644 php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_section_error_01.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_section_error_01.blade.php.errors diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexer.java index b91d0bc13072..5b837df496a1 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexer.java @@ -46,6 +46,8 @@ protected Token mapToken(org.antlr.v4.runtime.Token antlrToken) { int type = antlrToken.getType(); //System.out.println(text + " " + type); switch (type) { + case BladeAntlrColoringLexer.BLADE_PAREN: + return token(BLADE_PAREN); case BladeAntlrColoringLexer.BLADE_COMMENT_START: return token(BLADE_COMMENT_START); case BladeAntlrColoringLexer.BLADE_COMMENT: @@ -76,7 +78,6 @@ protected Token mapToken(org.antlr.v4.runtime.Token antlrToken) { case BladeAntlrColoringLexer.D_AT: return token(BLADE_DIRECTIVE_UNKNOWN); case BladeAntlrColoringLexer.ERROR: - case BladeAntlrColoringLexer.WS_EXPR: return token(WS_D); default: return token(OTHER); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java index a69f39d90e80..cd1126e90f71 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java @@ -42,6 +42,7 @@ public enum BladeTokenId implements TokenId { BLADE_COMMENT_END("blade_comment"), BLADE_DIRECTIVE("blade_directive"), BLADE_ECHO_DELIMITOR("blade_echo_delimiters"), + BLADE_PAREN(""), HTML("html"), WS_D("html"), BLADE_DIRECTIVE_UNKNOWN("at_string"), @@ -84,17 +85,36 @@ protected LanguageEmbedding embedding(Token tok //php brace matcher freeze issue patch String tokenText = token.text().toString(); - int startOffset = 1; - int endOffset = 1; + int startOffset = 0; + int endOffset = 0; + if (!tokenText.startsWith("(") && !tokenText.startsWith("[")){ + return LanguageEmbedding.create(phpLanguage, startOffset, endOffset, false); + } + + //php brace matcher freeze issue patch if (tokenText.startsWith("((") && tokenText.endsWith("))")){ //NOI18N startOffset = 2; endOffset = 2; + } else if (tokenText.startsWith("[[") && tokenText.endsWith("]]")){ //NOI18N + startOffset = 2; + endOffset = 2; } else if (tokenText.startsWith("([") && tokenText.endsWith("])")){ //NOI18N startOffset = 2; endOffset = 2; - } else if (tokenText.startsWith("([")){ //NOI18N + } else if (tokenText.startsWith("[(") && tokenText.endsWith(")]")){ //NOI18N + startOffset = 2; + endOffset = 2; + } else if (tokenText.startsWith("([") || tokenText.startsWith("[(")){ //NOI18N startOffset = 2; + } else if (tokenText.startsWith("(") && tokenText.endsWith(")")){ //NOI18N + startOffset = 1; + endOffset = 1; + } else if (tokenText.startsWith("[") && tokenText.endsWith("]")){ //NOI18N + startOffset = 1; + endOffset = 1; + } else if (tokenText.startsWith("(") || tokenText.startsWith("[")){ //NOI18N + startOffset = 1; } return LanguageEmbedding.create(phpLanguage, startOffset, endOffset, false); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 index be75c6f37770..f043c562cacb 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 @@ -50,6 +50,7 @@ channels {PHP_CODE} tokens { DIRECTIVE, + BLADE_PAREN, PHP_EXPRESSION, BLADE_PHP_ECHO_EXPR, RAW_TAG, @@ -75,7 +76,7 @@ fragment SpecialChars : '°'; PHP_INLINE : '' | '' | EOF); -D_GENERIC_BLOCK_DIRECTIVES : ('@' DirectivesWithEndTag | '@sectionMissing' | '@hasSection')->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); +D_GENERIC_BLOCK_DIRECTIVES : ('@' DirectivesWithEndTag | '@sectionMissing' | '@hasSection') (' ')* {this._input.LA(1) == '('}? ->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); D_GENERIC_INLINE_DIRECTIVES : ('@elseif' | Include | '@extends' | '@each' | '@yield' | '@props' | '@method' | '@class' | '@style' | '@aware' | '@break' | '@continue' | '@selected' | '@disabled' | '@readonly' | '@required') (' ')* {this._input.LA(1) == '('}? ->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); @@ -88,7 +89,7 @@ D_GENERIC_END_TAGS : ('@stop' | '@show' | '@overwrite' | '@viteReactRefresh' | ' D_VERBATIM : '@verbatim' ->pushMode(VERBATIM_MODE), type(DIRECTIVE); D_ENDVERBATIM : '@endverbatim'->type(DIRECTIVE); -D_MISC : ('@dd' | '@dump' | '@js' | '@json' | '@inject')->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); +D_MISC : ('@dd' | '@dump' | '@js' | '@json' | '@inject') (' ')* {this._input.LA(1) == '('}? ->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); D_SIMPLE : ('@else' | '@csrf' | '@default' | '@append' | '@parent')->type(DIRECTIVE); @@ -97,15 +98,15 @@ D_PHP_SHORT : '@php' (' ')? {this._input.LA(1) == '('}? ->type(D_PHP),pushMode(L D_PHP : '@php'->pushMode(BLADE_INLINE_PHP); //allow php expression highlight for custom directives which start with 'end' also -D_END : ('@end' NameString)->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); +D_END_ARG : ('@end' NameString) (' ')* {this._input.LA(1) == '('}?->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); +D_END : ('@end' NameString)->type(DIRECTIVE); //known plugins D_LIVEWIRE : ('@livewireStyles' | '@bukStyles' | '@livewireScripts' | '@bukScripts' | '@click' ('.away')? '=')->type(DIRECTIVE); -D_ASSET_BUNDLER : '@vite'->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); +D_ASSET_BUNDLER : '@vite' (' ')* {this._input.LA(1) == '('}? ->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); //we will decide that a custom directive has expression to avoid email matching -D_CUSTOM : ('@' NameString {this._input.LA(1) == '(' || - (this._input.LA(1) == ' ' && this._input.LA(2) == '(')}? ) ->pushMode(LOOK_FOR_PHP_EXPRESSION); +D_CUSTOM : ('@' NameString (' ')* {this._input.LA(1) == '('}? ) ->pushMode(LOOK_FOR_PHP_EXPRESSION); D_UNKNOWN : '@' NameString; @@ -166,8 +167,7 @@ EXIT_RAW_ECHO_EOF : EOF->type(ERROR),popMode; // @directive ()? mode LOOK_FOR_PHP_EXPRESSION; -WS_EXPR : [ ]+ {this._input.LA(1) == '('}? ->pushMode(INSIDE_PHP_EXPRESSION); -OPEN_EXPR_PAREN_MORE : '(' {this.increaseRoundParenBalance();} ->more,pushMode(INSIDE_PHP_EXPRESSION); +BLADE_PAREN : '(' {this.increaseRoundParenBalance();} ->pushMode(INSIDE_PHP_EXPRESSION); AFTER_DIRECTIVE : NameString->type(ERROR), popMode; L_OTHER : . ->type(ERROR), popMode; @@ -176,14 +176,13 @@ L_OTHER : . ->type(ERROR), popMode; mode INSIDE_PHP_EXPRESSION; OPEN_EXPR_PAREN : {this.getRoundParenBalance() == 0}? '(' {this.increaseRoundParenBalance();} {this.consumeExprToken();}; -CLOSE_EXPR_PAREN : {this.getRoundParenBalance() == 1}? ')' - {this.decreaseRoundParenBalance();}->type(PHP_EXPRESSION),mode(DEFAULT_MODE); +CLOSE_EXPR_PAREN : {this.getRoundParenBalance() <= 1}? ')' {this.resetRoundParenBalance();}->type(BLADE_PAREN),mode(DEFAULT_MODE); LPAREN : {this.getRoundParenBalance() > 0}? '(' {this.increaseRoundParenBalance();} {this.consumeExprToken();}; RPAREN : {this.getRoundParenBalance() > 0}? ')' {this.decreaseRoundParenBalance();} {this.consumeExprToken();}; //in case of lexer restart context -EXIT_RPAREN : ')' {this.getRoundParenBalance() == 0}?->type(PHP_EXPRESSION),mode(DEFAULT_MODE); +EXIT_RPAREN : . {this._input.LA(1) == ')' && this.getRoundParenBalance() <= 1}?->type(PHP_EXPRESSION); PHP_EXPRESSION_COMMENT : ('/*' .*? '*/')->skip; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java index 829f5d615c3a..aef6bcbbcd7a 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java @@ -37,10 +37,10 @@ public class BladeAntlrColoringLexer extends ColoringLexerAdaptor { protected static final PredictionContextCache _sharedContextCache = new PredictionContextCache(); public static final int - DIRECTIVE=1, PHP_EXPRESSION=2, BLADE_PHP_ECHO_EXPR=3, RAW_TAG=4, CONTENT_TAG=5, - HTML=6, HTML_TAG=7, ERROR=8, BLADE_COMMENT=9, PHP_INLINE=10, D_PHP=11, - D_CUSTOM=12, D_UNKNOWN=13, D_AT=14, BLADE_COMMENT_START=15, GREEDY_REGULAR_ECHO_EXPR=16, - ESCAPED_ECHO_EXPR=17, RAW_ECHO_EXPR=18, RAW_ECHO_EXPR_MORE=19, WS_EXPR=20, + DIRECTIVE=1, BLADE_PAREN=2, PHP_EXPRESSION=3, BLADE_PHP_ECHO_EXPR=4, RAW_TAG=5, + CONTENT_TAG=6, HTML=7, HTML_TAG=8, ERROR=9, BLADE_COMMENT=10, PHP_INLINE=11, + D_PHP=12, D_CUSTOM=13, D_UNKNOWN=14, D_AT=15, BLADE_COMMENT_START=16, + GREEDY_REGULAR_ECHO_EXPR=17, ESCAPED_ECHO_EXPR=18, RAW_ECHO_EXPR=19, RAW_ECHO_EXPR_MORE=20, OPEN_EXPR_PAREN=21, LPAREN=22, RPAREN=23, PHP_EXPRESSION_COMMENT=24, PHP_EXPRESSION_MORE=25, D_ENDPHP=26, BLADE_PHP_INLINE=27, BLADE_COMMENT_END=28, D_ENDVERBATIM=29, EXIT_HTML_COMPONENT=30, EXIT_COMPONENT_PHP_EXPRESSION=31, DB_QUOTE_MORE=32; @@ -66,19 +66,19 @@ private static String[] makeRuleNames() { "DirectivesWithEndTag", "Include", "ComponentTagIdentifier", "SpecialChars", "PHP_INLINE", "D_GENERIC_BLOCK_DIRECTIVES", "D_GENERIC_INLINE_DIRECTIVES", "D_GENERIC_INLINE_MIXED_DIRECTIVES", "D_GENERIC_END_TAGS", "D_VERBATIM", - "D_ENDVERBATIM", "D_MISC", "D_SIMPLE", "D_PHP_SHORT", "D_PHP", "D_END", - "D_LIVEWIRE", "D_ASSET_BUNDLER", "D_CUSTOM", "D_UNKNOWN", "D_AT", "CONTENT_TAG_OPEN", - "RAW_TAG_OPEN", "CSS_COMMENT", "HTML_X", "CLOSE_TAG", "HTML", "HTML_MISC", - "HTML_WS", "INCOMPLETE_BLADE_TAG", "OTHER", "NameString", "BladeLabel", - "FullIdentifier", "ESC_DOUBLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING_FRAGMENT", + "D_ENDVERBATIM", "D_MISC", "D_SIMPLE", "D_PHP_SHORT", "D_PHP", "D_END_ARG", + "D_END", "D_LIVEWIRE", "D_ASSET_BUNDLER", "D_CUSTOM", "D_UNKNOWN", "D_AT", + "CONTENT_TAG_OPEN", "RAW_TAG_OPEN", "CSS_COMMENT", "HTML_X", "CLOSE_TAG", + "HTML", "HTML_MISC", "HTML_WS", "INCOMPLETE_BLADE_TAG", "OTHER", "NameString", + "BladeLabel", "FullIdentifier", "ESC_DOUBLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING_FRAGMENT", "SINGLE_QUOTED_STRING_FRAGMENT", "LineComment", "PhpVariable", "PhpKeyword", "Digit", "BLADE_COMMENT_START", "EMAIL_SUBSTRING", "VERSION_WITH_AT", "D_ESCAPES", "OTHER_HTML_POP", "OTHER_HTML", "HTML_EOF", "CONTENT_TAG_CLOSE", "GREEDY_REGULAR_ECHO_EXPR", "ESCAPED_ECHO_EXPR", "EXIT_ECHO_EOF", "RAW_TAG_CLOSE", - "RAW_ECHO_EXPR", "RAW_ECHO_EXPR_MORE", "EXIT_RAW_ECHO_EOF", "WS_EXPR", - "OPEN_EXPR_PAREN_MORE", "AFTER_DIRECTIVE", "L_OTHER", "OPEN_EXPR_PAREN", - "CLOSE_EXPR_PAREN", "LPAREN", "RPAREN", "EXIT_RPAREN", "PHP_EXPRESSION_COMMENT", - "PHP_EXPRESSION_MORE", "EXIT_EOF", "D_ENDPHP", "BLADE_PHP_INLINE", "BLADE_PHP_INLINE_MORE", + "RAW_ECHO_EXPR", "RAW_ECHO_EXPR_MORE", "EXIT_RAW_ECHO_EOF", "BLADE_PAREN", + "AFTER_DIRECTIVE", "L_OTHER", "OPEN_EXPR_PAREN", "CLOSE_EXPR_PAREN", + "LPAREN", "RPAREN", "EXIT_RPAREN", "PHP_EXPRESSION_COMMENT", "PHP_EXPRESSION_MORE", + "EXIT_EOF", "D_ENDPHP", "BLADE_PHP_INLINE", "BLADE_PHP_INLINE_MORE", "EXIT_INLINE_PHP_EOF", "D_ENDVERBATIM_IN_MODE", "VERBATIM_HTML", "VERBATIM_HTML_MORE", "EXIT_VERBATIM_MOD_EOF", "COMPONENT_ATTRIBUTE", "COMPONENT_CONTENT_TAG_OPEN", "COMPONENT_RAW_TAG_OPEN", "EXIT_HTML_COMPONENT", "HTML_COMPONENT_ANY", @@ -93,18 +93,18 @@ private static String[] makeRuleNames() { private static String[] makeLiteralNames() { return new String[] { - null, null, null, null, null, null, null, null, null, null, null, "'@php'", - null, null, null, "'{{--'", null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + "'@php'", null, null, null, "'{{--'", null, null, null, null, null, null, null, null, null, "'@endphp'", null, "'--}}'", null, "'>'", null, "'\\\"'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); private static String[] makeSymbolicNames() { return new String[] { - null, "DIRECTIVE", "PHP_EXPRESSION", "BLADE_PHP_ECHO_EXPR", "RAW_TAG", - "CONTENT_TAG", "HTML", "HTML_TAG", "ERROR", "BLADE_COMMENT", "PHP_INLINE", - "D_PHP", "D_CUSTOM", "D_UNKNOWN", "D_AT", "BLADE_COMMENT_START", "GREEDY_REGULAR_ECHO_EXPR", - "ESCAPED_ECHO_EXPR", "RAW_ECHO_EXPR", "RAW_ECHO_EXPR_MORE", "WS_EXPR", + null, "DIRECTIVE", "BLADE_PAREN", "PHP_EXPRESSION", "BLADE_PHP_ECHO_EXPR", + "RAW_TAG", "CONTENT_TAG", "HTML", "HTML_TAG", "ERROR", "BLADE_COMMENT", + "PHP_INLINE", "D_PHP", "D_CUSTOM", "D_UNKNOWN", "D_AT", "BLADE_COMMENT_START", + "GREEDY_REGULAR_ECHO_EXPR", "ESCAPED_ECHO_EXPR", "RAW_ECHO_EXPR", "RAW_ECHO_EXPR_MORE", "OPEN_EXPR_PAREN", "LPAREN", "RPAREN", "PHP_EXPRESSION_COMMENT", "PHP_EXPRESSION_MORE", "D_ENDPHP", "BLADE_PHP_INLINE", "BLADE_COMMENT_END", "D_ENDVERBATIM", "EXIT_HTML_COMPONENT", "EXIT_COMPONENT_PHP_EXPRESSION", "DB_QUOTE_MORE" @@ -171,20 +171,20 @@ public BladeAntlrColoringLexer(CharStream input) { @Override public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { switch (ruleIndex) { - case 49: + case 50: GREEDY_REGULAR_ECHO_EXPR_action((RuleContext)_localctx, actionIndex); break; - case 50: + case 51: ESCAPED_ECHO_EXPR_action((RuleContext)_localctx, actionIndex); break; - case 53: + case 54: RAW_ECHO_EXPR_action((RuleContext)_localctx, actionIndex); break; - case 54: + case 55: RAW_ECHO_EXPR_MORE_action((RuleContext)_localctx, actionIndex); break; case 57: - OPEN_EXPR_PAREN_MORE_action((RuleContext)_localctx, actionIndex); + BLADE_PAREN_action((RuleContext)_localctx, actionIndex); break; case 60: OPEN_EXPR_PAREN_action((RuleContext)_localctx, actionIndex); @@ -231,7 +231,7 @@ private void RAW_ECHO_EXPR_MORE_action(RuleContext _localctx, int actionIndex) { break; } } - private void OPEN_EXPR_PAREN_MORE_action(RuleContext _localctx, int actionIndex) { + private void BLADE_PAREN_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { case 4: this.increaseRoundParenBalance(); @@ -251,7 +251,7 @@ private void OPEN_EXPR_PAREN_action(RuleContext _localctx, int actionIndex) { private void CLOSE_EXPR_PAREN_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { case 7: - this.decreaseRoundParenBalance(); + this.resetRoundParenBalance(); break; } } @@ -285,20 +285,26 @@ private void PHP_EXPRESSION_MORE_action(RuleContext _localctx, int actionIndex) @Override public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { + case 5: + return D_GENERIC_BLOCK_DIRECTIVES_sempred((RuleContext)_localctx, predIndex); case 6: return D_GENERIC_INLINE_DIRECTIVES_sempred((RuleContext)_localctx, predIndex); + case 11: + return D_MISC_sempred((RuleContext)_localctx, predIndex); case 13: return D_PHP_SHORT_sempred((RuleContext)_localctx, predIndex); + case 15: + return D_END_ARG_sempred((RuleContext)_localctx, predIndex); case 18: + return D_ASSET_BUNDLER_sempred((RuleContext)_localctx, predIndex); + case 19: return D_CUSTOM_sempred((RuleContext)_localctx, predIndex); - case 26: - return HTML_sempred((RuleContext)_localctx, predIndex); case 27: + return HTML_sempred((RuleContext)_localctx, predIndex); + case 28: return HTML_MISC_sempred((RuleContext)_localctx, predIndex); - case 45: + case 46: return OTHER_HTML_POP_sempred((RuleContext)_localctx, predIndex); - case 56: - return WS_EXPR_sempred((RuleContext)_localctx, predIndex); case 60: return OPEN_EXPR_PAREN_sempred((RuleContext)_localctx, predIndex); case 61: @@ -320,98 +326,118 @@ public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { } return true; } - private boolean D_GENERIC_INLINE_DIRECTIVES_sempred(RuleContext _localctx, int predIndex) { + private boolean D_GENERIC_BLOCK_DIRECTIVES_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 0: return this._input.LA(1) == '('; } return true; } - private boolean D_PHP_SHORT_sempred(RuleContext _localctx, int predIndex) { + private boolean D_GENERIC_INLINE_DIRECTIVES_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 1: return this._input.LA(1) == '('; } return true; } - private boolean D_CUSTOM_sempred(RuleContext _localctx, int predIndex) { + private boolean D_MISC_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 2: - return this._input.LA(1) == '(' || - (this._input.LA(1) == ' ' && this._input.LA(2) == '('); + return this._input.LA(1) == '('; } return true; } - private boolean HTML_sempred(RuleContext _localctx, int predIndex) { + private boolean D_PHP_SHORT_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 3: - return this._input.LA(1) != '@'; + return this._input.LA(1) == '('; + } + return true; + } + private boolean D_END_ARG_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { case 4: - return this._input.LA(1) != '@'; + return this._input.LA(1) == '('; + } + return true; + } + private boolean D_ASSET_BUNDLER_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { case 5: - return this._input.LA(1) != 'x' && this._input.LA(1) != '?' && this._input.LA(2) != 'p'; + return this._input.LA(1) == '('; } return true; } - private boolean HTML_MISC_sempred(RuleContext _localctx, int predIndex) { + private boolean D_CUSTOM_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 6: - return this._input.LA(1) != '@'; + return this._input.LA(1) == '('; } return true; } - private boolean OTHER_HTML_POP_sempred(RuleContext _localctx, int predIndex) { + private boolean HTML_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 7: - return this._input.LA(1) == '@' || this._input.LA(1) == '{' || (this._input.LA(1) == '<' && (this._input.LA(2) == 'x' || this._input.LA(2) == '?')); + return this._input.LA(1) != '@'; + case 8: + return this._input.LA(1) != '@'; + case 9: + return this._input.LA(1) != 'x' && this._input.LA(1) != '?' && this._input.LA(2) != 'p'; } return true; } - private boolean WS_EXPR_sempred(RuleContext _localctx, int predIndex) { + private boolean HTML_MISC_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { - case 8: - return this._input.LA(1) == '('; + case 10: + return this._input.LA(1) != '@'; + } + return true; + } + private boolean OTHER_HTML_POP_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 11: + return this._input.LA(1) == '@' || this._input.LA(1) == '{' || (this._input.LA(1) == '<' && (this._input.LA(2) == 'x' || this._input.LA(2) == '?')); } return true; } private boolean OPEN_EXPR_PAREN_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { - case 9: + case 12: return this.getRoundParenBalance() == 0; } return true; } private boolean CLOSE_EXPR_PAREN_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { - case 10: - return this.getRoundParenBalance() == 1; + case 13: + return this.getRoundParenBalance() <= 1; } return true; } private boolean LPAREN_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { - case 11: + case 14: return this.getRoundParenBalance() > 0; } return true; } private boolean RPAREN_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { - case 12: + case 15: return this.getRoundParenBalance() > 0; } return true; } private boolean EXIT_RPAREN_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { - case 13: - return this.getRoundParenBalance() == 0; + case 16: + return this._input.LA(1) == ')' && this.getRoundParenBalance() <= 1; } return true; } private boolean BLADE_PHP_INLINE_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { - case 14: + case 17: return this._input.LA(1) == '@' && this._input.LA(2) == 'e' && @@ -426,7 +452,7 @@ private boolean BLADE_PHP_INLINE_sempred(RuleContext _localctx, int predIndex) { } private boolean VERBATIM_HTML_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { - case 15: + case 18: return this._input.LA(1) == '@' && this._input.LA(2) == 'e' && @@ -441,14 +467,14 @@ private boolean VERBATIM_HTML_sempred(RuleContext _localctx, int predIndex) { } private boolean COMPONENT_PHP_EXPRESSION_LAST_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { - case 16: + case 19: return this._input.LA(1) == '"'; } return true; } private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { - case 17: + case 20: return this._input.LA(1) == '-' && this._input.LA(2) == '-' && @@ -460,7 +486,7 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) } public static final String _serializedATN = - "\u0004\u0000 \u0706\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ + "\u0004\u0000 \u072a\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002"+ @@ -519,7 +545,9 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0003\u0005\u0194\b\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0003\u0005\u0194\b\u0005\u0001\u0005\u0005\u0005\u0197\b\u0005"+ + "\n\u0005\f\u0005\u019a\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ @@ -537,167 +565,171 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0003\u0006\u0206\b\u0006\u0001\u0006\u0005\u0006\u0209\b\u0006"+ - "\n\u0006\f\u0006\u020c\t\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ - "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ - "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0003\u0007\u0222"+ - "\b\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0003\u0006\u020e\b\u0006\u0001\u0006\u0005"+ + "\u0006\u0211\b\u0006\n\u0006\f\u0006\u0214\t\u0006\u0001\u0006\u0001\u0006"+ + "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0003\u0007\u022a\b\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001"+ "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0003\b\u0251\b\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0003\b\u0259\b\b\u0001\b\u0001\b\u0001"+ "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ - "\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b\u0288\b\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b"+ + "\u0290\b\u000b\u0001\u000b\u0005\u000b\u0293\b\u000b\n\u000b\f\u000b\u0296"+ + "\t\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+ "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\f\u0003\f\u02ad\b\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\r\u0001\r\u0003\r\u02b7\b\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ - "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0003\f\u02bd\b\f\u0001\f\u0001\f\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0003\r\u02c7\b\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0005\u000f"+ + "\u02dd\b\u000f\n\u000f\f\u000f\u02e0\t\u000f\u0001\u000f\u0001\u000f\u0001"+ + "\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u030f\b\u0010\u0001\u0010\u0003"+ - "\u0010\u0312\b\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001"+ "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0003"+ - "\u0014\u032a\b\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+ - "\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ - "\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001"+ - "\u0017\u0005\u0017\u033d\b\u0017\n\u0017\f\u0017\u0340\t\u0017\u0001\u0017"+ - "\u0001\u0017\u0001\u0017\u0001\u0017\u0003\u0017\u0346\b\u0017\u0001\u0017"+ - "\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ - "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ - "\u0004\u0018\u0355\b\u0018\u000b\u0018\f\u0018\u0356\u0003\u0018\u0359"+ - "\b\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001"+ - "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0005\u0019\u0364\b\u0019\n"+ - "\u0019\f\u0019\u0367\t\u0019\u0004\u0019\u0369\b\u0019\u000b\u0019\f\u0019"+ - "\u036a\u0001\u0019\u0001\u0019\u0001\u001a\u0004\u001a\u0370\b\u001a\u000b"+ - "\u001a\f\u001a\u0371\u0001\u001a\u0004\u001a\u0375\b\u001a\u000b\u001a"+ - "\f\u001a\u0376\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ - "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0004\u001a"+ - "\u0383\b\u001a\u000b\u001a\f\u001a\u0384\u0001\u001a\u0005\u001a\u0388"+ - "\b\u001a\n\u001a\f\u001a\u038b\t\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ - "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0004\u001b\u0394\b\u001b"+ - "\u000b\u001b\f\u001b\u0395\u0001\u001b\u0004\u001b\u0399\b\u001b\u000b"+ - "\u001b\f\u001b\u039a\u0001\u001b\u0003\u001b\u039e\b\u001b\u0001\u001b"+ - "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+ - "\u0001\u001b\u0001\u001b\u0004\u001b\u03a9\b\u001b\u000b\u001b\f\u001b"+ - "\u03aa\u0001\u001b\u0004\u001b\u03ae\b\u001b\u000b\u001b\f\u001b\u03af"+ - "\u0001\u001b\u0001\u001b\u0001\u001c\u0004\u001c\u03b5\b\u001c\u000b\u001c"+ - "\f\u001c\u03b6\u0001\u001c\u0004\u001c\u03ba\b\u001c\u000b\u001c\f\u001c"+ - "\u03bb\u0003\u001c\u03be\b\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001"+ - "\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0003\u001d\u03c7\b\u001d\u0001"+ - "\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001"+ - "\u001f\u0001\u001f\u0005\u001f\u03d1\b\u001f\n\u001f\f\u001f\u03d4\t\u001f"+ - "\u0001 \u0001 \u0005 \u03d8\b \n \f \u03db\t \u0001!\u0001!\u0005!\u03df"+ - "\b!\n!\f!\u03e2\t!\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0005#\u03e9\b"+ - "#\n#\f#\u03ec\t#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0005$\u03f4"+ - "\b$\n$\f$\u03f7\t$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0005%\u03ff"+ - "\b%\n%\f%\u0402\t%\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001"+ - "\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ - "\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0003\'\u0419\b\'\u0001(\u0001"+ - "(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0001"+ - "*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0003+\u042d\b+\u0004+\u042f"+ - "\b+\u000b+\f+\u0430\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0003,\u043c\b,\u0001,\u0001,\u0001,\u0001,\u0003,\u0442\b,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0004,\u044c\b,\u000b"+ - ",\f,\u044d\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0004"+ - ",\u0458\b,\u000b,\f,\u0459\u0001,\u0001,\u0001,\u0003,\u045f\b,\u0003"+ - ",\u0461\b,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0003,\u0562\b,\u0001,\u0005"+ - ",\u0565\b,\n,\f,\u0568\t,\u0003,\u056a\b,\u0001,\u0001,\u0001-\u0001-"+ - "\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u0001"+ - "1\u00041\u0584\b1\u000b1\f1\u0585\u00011\u00011\u00012\u00012\u00052\u058c"+ - "\b2\n2\f2\u058f\t2\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u0001"+ - "4\u00014\u00014\u00014\u00014\u00014\u00014\u00015\u00045\u05a0\b5\u000b"+ - "5\f5\u05a1\u00015\u00015\u00016\u00016\u00056\u05a8\b6\n6\f6\u05ab\t6"+ - "\u00016\u00016\u00017\u00017\u00017\u00017\u00017\u00018\u00048\u05b5"+ - "\b8\u000b8\f8\u05b6\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0003\u0011\u0330\b\u0011\u0001"+ + "\u0011\u0003\u0011\u0333\b\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0005"+ + "\u0012\u033e\b\u0012\n\u0012\f\u0012\u0341\t\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013"+ + "\u0005\u0013\u034b\b\u0013\n\u0013\f\u0013\u034e\t\u0013\u0001\u0013\u0001"+ + "\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ + "\u0015\u0001\u0015\u0003\u0015\u0359\b\u0015\u0001\u0016\u0001\u0016\u0001"+ + "\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001"+ + "\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0005\u0018\u036c\b\u0018\n\u0018\f\u0018"+ + "\u036f\t\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0003\u0018"+ + "\u0375\b\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019"+ + "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+ + "\u0001\u0019\u0001\u0019\u0004\u0019\u0384\b\u0019\u000b\u0019\f\u0019"+ + "\u0385\u0003\u0019\u0388\b\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ + "\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0005"+ + "\u001a\u0393\b\u001a\n\u001a\f\u001a\u0396\t\u001a\u0004\u001a\u0398\b"+ + "\u001a\u000b\u001a\f\u001a\u0399\u0001\u001a\u0001\u001a\u0001\u001b\u0004"+ + "\u001b\u039f\b\u001b\u000b\u001b\f\u001b\u03a0\u0001\u001b\u0004\u001b"+ + "\u03a4\b\u001b\u000b\u001b\f\u001b\u03a5\u0001\u001b\u0001\u001b\u0001"+ + "\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001"+ + "\u001b\u0001\u001b\u0004\u001b\u03b2\b\u001b\u000b\u001b\f\u001b\u03b3"+ + "\u0001\u001b\u0005\u001b\u03b7\b\u001b\n\u001b\f\u001b\u03ba\t\u001b\u0001"+ + "\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001"+ + "\u001c\u0004\u001c\u03c3\b\u001c\u000b\u001c\f\u001c\u03c4\u0001\u001c"+ + "\u0004\u001c\u03c8\b\u001c\u000b\u001c\f\u001c\u03c9\u0001\u001c\u0003"+ + "\u001c\u03cd\b\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001"+ + "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0004\u001c\u03d8"+ + "\b\u001c\u000b\u001c\f\u001c\u03d9\u0001\u001c\u0004\u001c\u03dd\b\u001c"+ + "\u000b\u001c\f\u001c\u03de\u0001\u001c\u0001\u001c\u0001\u001d\u0004\u001d"+ + "\u03e4\b\u001d\u000b\u001d\f\u001d\u03e5\u0001\u001d\u0004\u001d\u03e9"+ + "\b\u001d\u000b\u001d\f\u001d\u03ea\u0003\u001d\u03ed\b\u001d\u0001\u001d"+ + "\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ + "\u0003\u001e\u03f6\b\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001\u001f\u0001 \u0001 \u0005 \u0400\b \n \f \u0403\t "+ + "\u0001!\u0001!\u0005!\u0407\b!\n!\f!\u040a\t!\u0001\"\u0001\"\u0005\""+ + "\u040e\b\"\n\"\f\"\u0411\t\"\u0001#\u0001#\u0001$\u0001$\u0001$\u0005"+ + "$\u0418\b$\n$\f$\u041b\t$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0005"+ + "%\u0423\b%\n%\f%\u0426\t%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0005"+ + "&\u042e\b&\n&\f&\u0431\t&\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001"+ + "(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001"+ + "(\u0001(\u0001(\u0001(\u0001(\u0001(\u0003(\u0448\b(\u0001)\u0001)\u0001"+ + "*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001"+ + "+\u0001+\u0001+\u0001,\u0001,\u0001,\u0003,\u045c\b,\u0004,\u045e\b,\u000b"+ + ",\f,\u045f\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0003-\u046b\b-\u0001-\u0001-\u0001-\u0001-\u0003-\u0471\b-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0004-\u047b\b-\u000b-\f-"+ + "\u047c\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0004-"+ + "\u0487\b-\u000b-\f-\u0488\u0001-\u0001-\u0001-\u0003-\u048e\b-\u0003-"+ + "\u0490\b-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0003-\u0591\b-\u0001-\u0005"+ + "-\u0594\b-\n-\f-\u0597\t-\u0003-\u0599\b-\u0001-\u0001-\u0001.\u0001."+ + "\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u00010\u0001"+ + "0\u00010\u00010\u00010\u00011\u00011\u00011\u00011\u00011\u00011\u0001"+ + "2\u00042\u05b3\b2\u000b2\f2\u05b4\u00012\u00012\u00013\u00013\u00053\u05bb"+ + "\b3\n3\f3\u05be\t3\u00013\u00013\u00014\u00014\u00014\u00014\u00014\u0001"+ + "5\u00015\u00015\u00015\u00015\u00015\u00015\u00016\u00046\u05cf\b6\u000b"+ + "6\f6\u05d0\u00016\u00016\u00017\u00017\u00057\u05d7\b7\n7\f7\u05da\t7"+ + "\u00017\u00017\u00018\u00018\u00018\u00018\u00018\u00019\u00019\u0001"+ "9\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001"+ ";\u0001;\u0001;\u0001<\u0001<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001"+ "=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001>\u0001"+ "?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ - "@\u0001A\u0001A\u0001A\u0001A\u0005A\u05ed\bA\nA\fA\u05f0\tA\u0001A\u0001"+ - "A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ - "D\u0001D\u0001E\u0001E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001F\u0001"+ - "F\u0001G\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001"+ + "A\u0001A\u0001A\u0001A\u0005A\u0611\bA\nA\fA\u0614\tA\u0001A\u0001A\u0001"+ + "A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001"+ + "C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ + "D\u0001E\u0001E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001"+ + "G\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001H\u0001"+ "H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001"+ - "H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001"+ - "J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001"+ - "L\u0001L\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001"+ - "N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001"+ - "O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ - "Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001"+ - "S\u0001T\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+ - "V\u0001V\u0003V\u066d\bV\u0001V\u0001V\u0003V\u0671\bV\u0001V\u0004V\u0674"+ - "\bV\u000bV\fV\u0675\u0001V\u0003V\u0679\bV\u0001V\u0003V\u067c\bV\u0001"+ - "V\u0003V\u067f\bV\u0001V\u0001V\u0003V\u0683\bV\u0001V\u0001V\u0003V\u0687"+ - "\bV\u0001V\u0004V\u068a\bV\u000bV\fV\u068b\u0001V\u0003V\u068f\bV\u0001"+ - "V\u0001V\u0003V\u0693\bV\u0005V\u0695\bV\nV\fV\u0698\tV\u0001V\u0003V"+ - "\u069b\bV\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001"+ - "W\u0001W\u0001W\u0001W\u0001W\u0005W\u06aa\bW\nW\fW\u06ad\tW\u0001W\u0001"+ + "H\u0001I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001"+ + "K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ + "L\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001"+ + "N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0001"+ + "O\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ + "T\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001U\u0001V\u0001"+ + "V\u0003V\u0691\bV\u0001V\u0001V\u0003V\u0695\bV\u0001V\u0004V\u0698\b"+ + "V\u000bV\fV\u0699\u0001V\u0003V\u069d\bV\u0001V\u0003V\u06a0\bV\u0001"+ + "V\u0003V\u06a3\bV\u0001V\u0001V\u0003V\u06a7\bV\u0001V\u0001V\u0003V\u06ab"+ + "\bV\u0001V\u0004V\u06ae\bV\u000bV\fV\u06af\u0001V\u0003V\u06b3\bV\u0001"+ + "V\u0001V\u0003V\u06b7\bV\u0005V\u06b9\bV\nV\fV\u06bc\tV\u0001V\u0003V"+ + "\u06bf\bV\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001"+ + "W\u0001W\u0001W\u0001W\u0001W\u0005W\u06ce\bW\nW\fW\u06d1\tW\u0001W\u0001"+ "W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001"+ - "X\u0001X\u0001X\u0003X\u06bd\bX\u0001X\u0001X\u0005X\u06c1\bX\nX\fX\u06c4"+ - "\tX\u0001X\u0001X\u0004X\u06c8\bX\u000bX\fX\u06c9\u0001X\u0003X\u06cd"+ - "\bX\u0001X\u0001X\u0003X\u06d1\bX\u0004X\u06d3\bX\u000bX\fX\u06d4\u0001"+ - "X\u0001X\u0001X\u0001X\u0003X\u06db\bX\u0001X\u0001X\u0001Y\u0001Y\u0001"+ + "X\u0001X\u0001X\u0003X\u06e1\bX\u0001X\u0001X\u0005X\u06e5\bX\nX\fX\u06e8"+ + "\tX\u0001X\u0001X\u0004X\u06ec\bX\u000bX\fX\u06ed\u0001X\u0003X\u06f1"+ + "\bX\u0001X\u0001X\u0003X\u06f5\bX\u0004X\u06f7\bX\u000bX\fX\u06f8\u0001"+ + "X\u0001X\u0001X\u0001X\u0003X\u06ff\bX\u0001X\u0001X\u0001Y\u0001Y\u0001"+ "Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001"+ "[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]"+ "\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001^\u0001"+ "_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001`\u0005\u015f"+ - "\u016d\u033e\u03ea\u05ee\u0000a\u000b\u0000\r\u0000\u000f\u0000\u0011"+ - "\u0000\u0013\n\u0015\u0000\u0017\u0000\u0019\u0000\u001b\u0000\u001d\u0000"+ - "\u001f\u001d!\u0000#\u0000%\u0000\'\u000b)\u0000+\u0000-\u0000/\f1\r3"+ - "\u000e5\u00007\u00009\u0000;\u0000=\u0000?\u0006A\u0000C\u0000E\u0000"+ + "\u016d\u036d\u0419\u0612\u0000a\u000b\u0000\r\u0000\u000f\u0000\u0011"+ + "\u0000\u0013\u000b\u0015\u0000\u0017\u0000\u0019\u0000\u001b\u0000\u001d"+ + "\u0000\u001f\u001d!\u0000#\u0000%\u0000\'\f)\u0000+\u0000-\u0000/\u0000"+ + "1\r3\u000e5\u000f7\u00009\u0000;\u0000=\u0000?\u0000A\u0007C\u0000E\u0000"+ "G\u0000I\u0000K\u0000M\u0000O\u0000Q\u0000S\u0000U\u0000W\u0000Y\u0000"+ - "[\u0000]\u000f_\u0000a\u0000c\u0000e\u0000g\u0000i\u0000k\u0000m\u0010"+ - "o\u0011q\u0000s\u0000u\u0012w\u0013y\u0000{\u0014}\u0000\u007f\u0000\u0081"+ + "[\u0000]\u0000_\u0010a\u0000c\u0000e\u0000g\u0000i\u0000k\u0000m\u0000"+ + "o\u0011q\u0012s\u0000u\u0000w\u0013y\u0014{\u0000}\u0002\u007f\u0000\u0081"+ "\u0000\u0083\u0015\u0085\u0000\u0087\u0016\u0089\u0017\u008b\u0000\u008d"+ "\u0018\u008f\u0019\u0091\u0000\u0093\u001a\u0095\u001b\u0097\u0000\u0099"+ "\u0000\u009b\u0000\u009d\u0000\u009f\u0000\u00a1\u0000\u00a3\u0000\u00a5"+ @@ -717,7 +749,7 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "09AZ__az\u0080\u8000\ufffe\u0003\u0000AZaz\u0080\u8000\ufffe\u0006\u0000"+ "..09AZ__az\u0080\u8000\ufffe\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002"+ "\u0000\"\"\\\\\u0002\u0000\'\'\\\\\u0001\u0000 \u0003\u0000 {{}}\u0003"+ - "\u0000 !{{}}\u079c\u0000\u0013\u0001\u0000\u0000\u0000\u0000\u0015\u0001"+ + "\u0000 !{{}}\u07c4\u0000\u0013\u0001\u0000\u0000\u0000\u0000\u0015\u0001"+ "\u0000\u0000\u0000\u0000\u0017\u0001\u0000\u0000\u0000\u0000\u0019\u0001"+ "\u0000\u0000\u0000\u0000\u001b\u0001\u0000\u0000\u0000\u0000\u001d\u0001"+ "\u0000\u0000\u0000\u0000\u001f\u0001\u0000\u0000\u0000\u0000!\u0001\u0000"+ @@ -729,13 +761,13 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "9\u0001\u0000\u0000\u0000\u0000;\u0001\u0000\u0000\u0000\u0000=\u0001"+ "\u0000\u0000\u0000\u0000?\u0001\u0000\u0000\u0000\u0000A\u0001\u0000\u0000"+ "\u0000\u0000C\u0001\u0000\u0000\u0000\u0000E\u0001\u0000\u0000\u0000\u0000"+ - "G\u0001\u0000\u0000\u0000\u0000]\u0001\u0000\u0000\u0000\u0000_\u0001"+ + "G\u0001\u0000\u0000\u0000\u0000I\u0001\u0000\u0000\u0000\u0000_\u0001"+ "\u0000\u0000\u0000\u0000a\u0001\u0000\u0000\u0000\u0000c\u0001\u0000\u0000"+ - "\u0000\u0001e\u0001\u0000\u0000\u0000\u0001g\u0001\u0000\u0000\u0000\u0001"+ - "i\u0001\u0000\u0000\u0000\u0002k\u0001\u0000\u0000\u0000\u0002m\u0001"+ + "\u0000\u0000e\u0001\u0000\u0000\u0000\u0001g\u0001\u0000\u0000\u0000\u0001"+ + "i\u0001\u0000\u0000\u0000\u0001k\u0001\u0000\u0000\u0000\u0002m\u0001"+ "\u0000\u0000\u0000\u0002o\u0001\u0000\u0000\u0000\u0002q\u0001\u0000\u0000"+ - "\u0000\u0003s\u0001\u0000\u0000\u0000\u0003u\u0001\u0000\u0000\u0000\u0003"+ - "w\u0001\u0000\u0000\u0000\u0003y\u0001\u0000\u0000\u0000\u0004{\u0001"+ + "\u0000\u0002s\u0001\u0000\u0000\u0000\u0003u\u0001\u0000\u0000\u0000\u0003"+ + "w\u0001\u0000\u0000\u0000\u0003y\u0001\u0000\u0000\u0000\u0003{\u0001"+ "\u0000\u0000\u0000\u0004}\u0001\u0000\u0000\u0000\u0004\u007f\u0001\u0000"+ "\u0000\u0000\u0004\u0081\u0001\u0000\u0000\u0000\u0005\u0083\u0001\u0000"+ "\u0000\u0000\u0005\u0085\u0001\u0000\u0000\u0000\u0005\u0087\u0001\u0000"+ @@ -758,48 +790,48 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "\u0000\u0000\u000b\u0131\u0001\u0000\u0000\u0000\r\u0133\u0001\u0000\u0000"+ "\u0000\u000f\u014f\u0001\u0000\u0000\u0000\u0011\u0156\u0001\u0000\u0000"+ "\u0000\u0013\u0175\u0001\u0000\u0000\u0000\u0015\u0193\u0001\u0000\u0000"+ - "\u0000\u0017\u0205\u0001\u0000\u0000\u0000\u0019\u0221\u0001\u0000\u0000"+ - "\u0000\u001b\u0250\u0001\u0000\u0000\u0000\u001d\u0254\u0001\u0000\u0000"+ - "\u0000\u001f\u0261\u0001\u0000\u0000\u0000!\u0287\u0001\u0000\u0000\u0000"+ - "#\u02ac\u0001\u0000\u0000\u0000%\u02b0\u0001\u0000\u0000\u0000\'\u02bd"+ - "\u0001\u0000\u0000\u0000)\u02c4\u0001\u0000\u0000\u0000+\u0311\u0001\u0000"+ - "\u0000\u0000-\u0315\u0001\u0000\u0000\u0000/\u031e\u0001\u0000\u0000\u0000"+ - "1\u0324\u0001\u0000\u0000\u00003\u0327\u0001\u0000\u0000\u00005\u032b"+ - "\u0001\u0000\u0000\u00007\u0331\u0001\u0000\u0000\u00009\u0345\u0001\u0000"+ - "\u0000\u0000;\u0358\u0001\u0000\u0000\u0000=\u0368\u0001\u0000\u0000\u0000"+ - "?\u0389\u0001\u0000\u0000\u0000A\u03ad\u0001\u0000\u0000\u0000C\u03bd"+ - "\u0001\u0000\u0000\u0000E\u03c6\u0001\u0000\u0000\u0000G\u03ca\u0001\u0000"+ - "\u0000\u0000I\u03ce\u0001\u0000\u0000\u0000K\u03d5\u0001\u0000\u0000\u0000"+ - "M\u03dc\u0001\u0000\u0000\u0000O\u03e3\u0001\u0000\u0000\u0000Q\u03e5"+ - "\u0001\u0000\u0000\u0000S\u03ef\u0001\u0000\u0000\u0000U\u03fa\u0001\u0000"+ - "\u0000\u0000W\u0403\u0001\u0000\u0000\u0000Y\u0418\u0001\u0000\u0000\u0000"+ - "[\u041a\u0001\u0000\u0000\u0000]\u041c\u0001\u0000\u0000\u0000_\u0423"+ - "\u0001\u0000\u0000\u0000a\u0429\u0001\u0000\u0000\u0000c\u0569\u0001\u0000"+ - "\u0000\u0000e\u056d\u0001\u0000\u0000\u0000g\u0573\u0001\u0000\u0000\u0000"+ - "i\u0577\u0001\u0000\u0000\u0000k\u057c\u0001\u0000\u0000\u0000m\u0583"+ - "\u0001\u0000\u0000\u0000o\u0589\u0001\u0000\u0000\u0000q\u0592\u0001\u0000"+ - "\u0000\u0000s\u0597\u0001\u0000\u0000\u0000u\u059f\u0001\u0000\u0000\u0000"+ - "w\u05a5\u0001\u0000\u0000\u0000y\u05ae\u0001\u0000\u0000\u0000{\u05b4"+ - "\u0001\u0000\u0000\u0000}\u05bc\u0001\u0000\u0000\u0000\u007f\u05c2\u0001"+ - "\u0000\u0000\u0000\u0081\u05c7\u0001\u0000\u0000\u0000\u0083\u05cc\u0001"+ - "\u0000\u0000\u0000\u0085\u05d1\u0001\u0000\u0000\u0000\u0087\u05d8\u0001"+ - "\u0000\u0000\u0000\u0089\u05dd\u0001\u0000\u0000\u0000\u008b\u05e2\u0001"+ - "\u0000\u0000\u0000\u008d\u05e8\u0001\u0000\u0000\u0000\u008f\u05f6\u0001"+ - "\u0000\u0000\u0000\u0091\u05f9\u0001\u0000\u0000\u0000\u0093\u05fe\u0001"+ - "\u0000\u0000\u0000\u0095\u0608\u0001\u0000\u0000\u0000\u0097\u060d\u0001"+ - "\u0000\u0000\u0000\u0099\u0611\u0001\u0000\u0000\u0000\u009b\u0616\u0001"+ - "\u0000\u0000\u0000\u009d\u0626\u0001\u0000\u0000\u0000\u009f\u062b\u0001"+ - "\u0000\u0000\u0000\u00a1\u062f\u0001\u0000\u0000\u0000\u00a3\u0634\u0001"+ - "\u0000\u0000\u0000\u00a5\u063c\u0001\u0000\u0000\u0000\u00a7\u0642\u0001"+ - "\u0000\u0000\u0000\u00a9\u0649\u0001\u0000\u0000\u0000\u00ab\u064e\u0001"+ - "\u0000\u0000\u0000\u00ad\u0652\u0001\u0000\u0000\u0000\u00af\u0657\u0001"+ - "\u0000\u0000\u0000\u00b1\u065c\u0001\u0000\u0000\u0000\u00b3\u0661\u0001"+ - "\u0000\u0000\u0000\u00b5\u0665\u0001\u0000\u0000\u0000\u00b7\u066a\u0001"+ - "\u0000\u0000\u0000\u00b9\u06a0\u0001\u0000\u0000\u0000\u00bb\u06da\u0001"+ - "\u0000\u0000\u0000\u00bd\u06de\u0001\u0000\u0000\u0000\u00bf\u06e3\u0001"+ - "\u0000\u0000\u0000\u00c1\u06e8\u0001\u0000\u0000\u0000\u00c3\u06ec\u0001"+ - "\u0000\u0000\u0000\u00c5\u06f1\u0001\u0000\u0000\u0000\u00c7\u06f8\u0001"+ - "\u0000\u0000\u0000\u00c9\u06fd\u0001\u0000\u0000\u0000\u00cb\u0701\u0001"+ + "\u0000\u0017\u020d\u0001\u0000\u0000\u0000\u0019\u0229\u0001\u0000\u0000"+ + "\u0000\u001b\u0258\u0001\u0000\u0000\u0000\u001d\u025c\u0001\u0000\u0000"+ + "\u0000\u001f\u0269\u0001\u0000\u0000\u0000!\u028f\u0001\u0000\u0000\u0000"+ + "#\u02bc\u0001\u0000\u0000\u0000%\u02c0\u0001\u0000\u0000\u0000\'\u02cd"+ + "\u0001\u0000\u0000\u0000)\u02d4\u0001\u0000\u0000\u0000+\u02e6\u0001\u0000"+ + "\u0000\u0000-\u0332\u0001\u0000\u0000\u0000/\u0336\u0001\u0000\u0000\u0000"+ + "1\u0347\u0001\u0000\u0000\u00003\u0353\u0001\u0000\u0000\u00005\u0356"+ + "\u0001\u0000\u0000\u00007\u035a\u0001\u0000\u0000\u00009\u0360\u0001\u0000"+ + "\u0000\u0000;\u0374\u0001\u0000\u0000\u0000=\u0387\u0001\u0000\u0000\u0000"+ + "?\u0397\u0001\u0000\u0000\u0000A\u03b8\u0001\u0000\u0000\u0000C\u03dc"+ + "\u0001\u0000\u0000\u0000E\u03ec\u0001\u0000\u0000\u0000G\u03f5\u0001\u0000"+ + "\u0000\u0000I\u03f9\u0001\u0000\u0000\u0000K\u03fd\u0001\u0000\u0000\u0000"+ + "M\u0404\u0001\u0000\u0000\u0000O\u040b\u0001\u0000\u0000\u0000Q\u0412"+ + "\u0001\u0000\u0000\u0000S\u0414\u0001\u0000\u0000\u0000U\u041e\u0001\u0000"+ + "\u0000\u0000W\u0429\u0001\u0000\u0000\u0000Y\u0432\u0001\u0000\u0000\u0000"+ + "[\u0447\u0001\u0000\u0000\u0000]\u0449\u0001\u0000\u0000\u0000_\u044b"+ + "\u0001\u0000\u0000\u0000a\u0452\u0001\u0000\u0000\u0000c\u0458\u0001\u0000"+ + "\u0000\u0000e\u0598\u0001\u0000\u0000\u0000g\u059c\u0001\u0000\u0000\u0000"+ + "i\u05a2\u0001\u0000\u0000\u0000k\u05a6\u0001\u0000\u0000\u0000m\u05ab"+ + "\u0001\u0000\u0000\u0000o\u05b2\u0001\u0000\u0000\u0000q\u05b8\u0001\u0000"+ + "\u0000\u0000s\u05c1\u0001\u0000\u0000\u0000u\u05c6\u0001\u0000\u0000\u0000"+ + "w\u05ce\u0001\u0000\u0000\u0000y\u05d4\u0001\u0000\u0000\u0000{\u05dd"+ + "\u0001\u0000\u0000\u0000}\u05e2\u0001\u0000\u0000\u0000\u007f\u05e7\u0001"+ + "\u0000\u0000\u0000\u0081\u05ec\u0001\u0000\u0000\u0000\u0083\u05f1\u0001"+ + "\u0000\u0000\u0000\u0085\u05f6\u0001\u0000\u0000\u0000\u0087\u05fd\u0001"+ + "\u0000\u0000\u0000\u0089\u0602\u0001\u0000\u0000\u0000\u008b\u0607\u0001"+ + "\u0000\u0000\u0000\u008d\u060c\u0001\u0000\u0000\u0000\u008f\u061a\u0001"+ + "\u0000\u0000\u0000\u0091\u061d\u0001\u0000\u0000\u0000\u0093\u0622\u0001"+ + "\u0000\u0000\u0000\u0095\u062c\u0001\u0000\u0000\u0000\u0097\u0631\u0001"+ + "\u0000\u0000\u0000\u0099\u0635\u0001\u0000\u0000\u0000\u009b\u063a\u0001"+ + "\u0000\u0000\u0000\u009d\u064a\u0001\u0000\u0000\u0000\u009f\u064f\u0001"+ + "\u0000\u0000\u0000\u00a1\u0653\u0001\u0000\u0000\u0000\u00a3\u0658\u0001"+ + "\u0000\u0000\u0000\u00a5\u0660\u0001\u0000\u0000\u0000\u00a7\u0666\u0001"+ + "\u0000\u0000\u0000\u00a9\u066d\u0001\u0000\u0000\u0000\u00ab\u0672\u0001"+ + "\u0000\u0000\u0000\u00ad\u0676\u0001\u0000\u0000\u0000\u00af\u067b\u0001"+ + "\u0000\u0000\u0000\u00b1\u0680\u0001\u0000\u0000\u0000\u00b3\u0685\u0001"+ + "\u0000\u0000\u0000\u00b5\u0689\u0001\u0000\u0000\u0000\u00b7\u068e\u0001"+ + "\u0000\u0000\u0000\u00b9\u06c4\u0001\u0000\u0000\u0000\u00bb\u06fe\u0001"+ + "\u0000\u0000\u0000\u00bd\u0702\u0001\u0000\u0000\u0000\u00bf\u0707\u0001"+ + "\u0000\u0000\u0000\u00c1\u070c\u0001\u0000\u0000\u0000\u00c3\u0710\u0001"+ + "\u0000\u0000\u0000\u00c5\u0715\u0001\u0000\u0000\u0000\u00c7\u071c\u0001"+ + "\u0000\u0000\u0000\u00c9\u0721\u0001\u0000\u0000\u0000\u00cb\u0725\u0001"+ "\u0000\u0000\u0000\u00cd\u00ce\u0007\u0000\u0000\u0000\u00ce\u00cf\u0007"+ "\u0001\u0000\u0000\u00cf\u00d0\u0007\u0002\u0000\u0000\u00d0\u00d5\u0001"+ "\u0000\u0000\u0000\u00d1\u00d2\u0007\u0003\u0000\u0000\u00d2\u00d3\u0007"+ @@ -909,750 +941,770 @@ private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) "\u0000\u0000\u018f\u0190\u0007\u000b\u0000\u0000\u0190\u0191\u0007\u0007"+ "\u0000\u0000\u0191\u0192\u0007\u0001\u0000\u0000\u0192\u0194\u0007\f\u0000"+ "\u0000\u0193\u0177\u0001\u0000\u0000\u0000\u0193\u0179\u0001\u0000\u0000"+ - "\u0000\u0193\u0188\u0001\u0000\u0000\u0000\u0194\u0195\u0001\u0000\u0000"+ - "\u0000\u0195\u0196\u0006\u0005\u0000\u0000\u0196\u0197\u0006\u0005\u0001"+ - "\u0000\u0197\u0016\u0001\u0000\u0000\u0000\u0198\u0199\u0005@\u0000\u0000"+ - "\u0199\u019a\u0007\u0003\u0000\u0000\u019a\u019b\u0007\t\u0000\u0000\u019b"+ - "\u019c\u0007\n\u0000\u0000\u019c\u019d\u0007\u0003\u0000\u0000\u019d\u019e"+ - "\u0007\u0007\u0000\u0000\u019e\u0206\u0007\u0000\u0000\u0000\u019f\u0206"+ - "\u0003\r\u0001\u0000\u01a0\u01a1\u0005@\u0000\u0000\u01a1\u01a2\u0007"+ - "\u0003\u0000\u0000\u01a2\u01a3\u0007\u0015\u0000\u0000\u01a3\u01a4\u0007"+ - "\u000b\u0000\u0000\u01a4\u01a5\u0007\u0003\u0000\u0000\u01a5\u01a6\u0007"+ - "\f\u0000\u0000\u01a6\u01a7\u0007\u0011\u0000\u0000\u01a7\u0206\u0007\n"+ - "\u0000\u0000\u01a8\u01a9\u0005@\u0000\u0000\u01a9\u01aa\u0007\u0003\u0000"+ - "\u0000\u01aa\u01ab\u0007\u0004\u0000\u0000\u01ab\u01ac\u0007\u0005\u0000"+ - "\u0000\u01ac\u0206\u0007\u0006\u0000\u0000\u01ad\u01ae\u0005@\u0000\u0000"+ - "\u01ae\u01af\u0007\u000f\u0000\u0000\u01af\u01b0\u0007\u0007\u0000\u0000"+ - "\u01b0\u01b1\u0007\u0003\u0000\u0000\u01b1\u01b2\u0007\t\u0000\u0000\u01b2"+ - "\u0206\u0007\u0011\u0000\u0000\u01b3\u01b4\u0005@\u0000\u0000\u01b4\u01b5"+ - "\u0007\r\u0000\u0000\u01b5\u01b6\u0007\u0002\u0000\u0000\u01b6\u01b7\u0007"+ - "\u0001\u0000\u0000\u01b7\u01b8\u0007\r\u0000\u0000\u01b8\u0206\u0007\n"+ - "\u0000\u0000\u01b9\u01ba\u0005@\u0000\u0000\u01ba\u01bb\u0007\u0012\u0000"+ - "\u0000\u01bb\u01bc\u0007\u0003\u0000\u0000\u01bc\u01bd\u0007\u000b\u0000"+ - "\u0000\u01bd\u01be\u0007\u0006\u0000\u0000\u01be\u01bf\u0007\u0001\u0000"+ - "\u0000\u01bf\u0206\u0007\u0011\u0000\u0000\u01c0\u01c1\u0005@\u0000\u0000"+ - "\u01c1\u01c2\u0007\u0005\u0000\u0000\u01c2\u01c3\u0007\t\u0000\u0000\u01c3"+ - "\u01c4\u0007\u0004\u0000\u0000\u01c4\u01c5\u0007\n\u0000\u0000\u01c5\u0206"+ - "\u0007\n\u0000\u0000\u01c6\u01c7\u0005@\u0000\u0000\u01c7\u01c8\u0007"+ - "\n\u0000\u0000\u01c8\u01c9\u0007\u000b\u0000\u0000\u01c9\u01ca\u0007\u000f"+ - "\u0000\u0000\u01ca\u01cb\u0007\t\u0000\u0000\u01cb\u0206\u0007\u0003\u0000"+ - "\u0000\u01cc\u01cd\u0005@\u0000\u0000\u01cd\u01ce\u0007\u0004\u0000\u0000"+ - "\u01ce\u01cf\u0007\b\u0000\u0000\u01cf\u01d0\u0007\u0004\u0000\u0000\u01d0"+ - "\u01d1\u0007\u0002\u0000\u0000\u01d1\u0206\u0007\u0003\u0000\u0000\u01d2"+ - "\u01d3\u0005@\u0000\u0000\u01d3\u01d4\u0007\u0016\u0000\u0000\u01d4\u01d5"+ - "\u0007\u0002\u0000\u0000\u01d5\u01d6\u0007\u0003\u0000\u0000\u01d6\u01d7"+ - "\u0007\u0004\u0000\u0000\u01d7\u0206\u0007\u0017\u0000\u0000\u01d8\u01d9"+ - "\u0005@\u0000\u0000\u01d9\u01da\u0007\u0005\u0000\u0000\u01da\u01db\u0007"+ - "\u0001\u0000\u0000\u01db\u01dc\u0007\f\u0000\u0000\u01dc\u01dd\u0007\u000b"+ - "\u0000\u0000\u01dd\u01de\u0007\u0007\u0000\u0000\u01de\u01df\u0007\f\u0000"+ - "\u0000\u01df\u01e0\u0007\u000e\u0000\u0000\u01e0\u0206\u0007\u0003\u0000"+ - "\u0000\u01e1\u01e2\u0005@\u0000\u0000\u01e2\u01e3\u0007\n\u0000\u0000"+ - "\u01e3\u01e4\u0007\u0003\u0000\u0000\u01e4\u01e5\u0007\t\u0000\u0000\u01e5"+ - "\u01e6\u0007\u0003\u0000\u0000\u01e6\u01e7\u0007\u0005\u0000\u0000\u01e7"+ - "\u01e8\u0007\u000b\u0000\u0000\u01e8\u01e9\u0007\u0003\u0000\u0000\u01e9"+ - "\u0206\u0007\u0011\u0000\u0000\u01ea\u01eb\u0005@\u0000\u0000\u01eb\u01ec"+ - "\u0007\u0011\u0000\u0000\u01ec\u01ed\u0007\u0007\u0000\u0000\u01ed\u01ee"+ - "\u0007\n\u0000\u0000\u01ee\u01ef\u0007\u0004\u0000\u0000\u01ef\u01f0\u0007"+ - "\u0016\u0000\u0000\u01f0\u01f1\u0007\t\u0000\u0000\u01f1\u01f2\u0007\u0003"+ - "\u0000\u0000\u01f2\u0206\u0007\u0011\u0000\u0000\u01f3\u01f4\u0005@\u0000"+ - "\u0000\u01f4\u01f5\u0007\u0002\u0000\u0000\u01f5\u01f6\u0007\u0003\u0000"+ - "\u0000\u01f6\u01f7\u0007\u0004\u0000\u0000\u01f7\u01f8\u0007\u0011\u0000"+ - "\u0000\u01f8\u01f9\u0007\u0001\u0000\u0000\u01f9\u01fa\u0007\f\u0000\u0000"+ - "\u01fa\u01fb\u0007\t\u0000\u0000\u01fb\u0206\u0007\u000f\u0000\u0000\u01fc"+ - "\u01fd\u0005@\u0000\u0000\u01fd\u01fe\u0007\u0002\u0000\u0000\u01fe\u01ff"+ - "\u0007\u0003\u0000\u0000\u01ff\u0200\u0007\u0018\u0000\u0000\u0200\u0201"+ - "\u0007\u000e\u0000\u0000\u0201\u0202\u0007\u0007\u0000\u0000\u0202\u0203"+ - "\u0007\u0002\u0000\u0000\u0203\u0204\u0007\u0003\u0000\u0000\u0204\u0206"+ - "\u0007\u0011\u0000\u0000\u0205\u0198\u0001\u0000\u0000\u0000\u0205\u019f"+ - "\u0001\u0000\u0000\u0000\u0205\u01a0\u0001\u0000\u0000\u0000\u0205\u01a8"+ - "\u0001\u0000\u0000\u0000\u0205\u01ad\u0001\u0000\u0000\u0000\u0205\u01b3"+ - "\u0001\u0000\u0000\u0000\u0205\u01b9\u0001\u0000\u0000\u0000\u0205\u01c0"+ - "\u0001\u0000\u0000\u0000\u0205\u01c6\u0001\u0000\u0000\u0000\u0205\u01cc"+ - "\u0001\u0000\u0000\u0000\u0205\u01d2\u0001\u0000\u0000\u0000\u0205\u01d8"+ - "\u0001\u0000\u0000\u0000\u0205\u01e1\u0001\u0000\u0000\u0000\u0205\u01ea"+ - "\u0001\u0000\u0000\u0000\u0205\u01f3\u0001\u0000\u0000\u0000\u0205\u01fc"+ - "\u0001\u0000\u0000\u0000\u0206\u020a\u0001\u0000\u0000\u0000\u0207\u0209"+ - "\u0005 \u0000\u0000\u0208\u0207\u0001\u0000\u0000\u0000\u0209\u020c\u0001"+ - "\u0000\u0000\u0000\u020a\u0208\u0001\u0000\u0000\u0000\u020a\u020b\u0001"+ - "\u0000\u0000\u0000\u020b\u020d\u0001\u0000\u0000\u0000\u020c\u020a\u0001"+ - "\u0000\u0000\u0000\u020d\u020e\u0004\u0006\u0000\u0000\u020e\u020f\u0001"+ - "\u0000\u0000\u0000\u020f\u0210\u0006\u0006\u0000\u0000\u0210\u0211\u0006"+ - "\u0006\u0001\u0000\u0211\u0018\u0001\u0000\u0000\u0000\u0212\u0213\u0005"+ - "@\u0000\u0000\u0213\u0214\u0007\u0016\u0000\u0000\u0214\u0215\u0007\u0002"+ - "\u0000\u0000\u0215\u0216\u0007\u0003\u0000\u0000\u0216\u0217\u0007\u0004"+ - "\u0000\u0000\u0217\u0222\u0007\u0017\u0000\u0000\u0218\u0219\u0005@\u0000"+ - "\u0000\u0219\u021a\u0007\u0005\u0000\u0000\u021a\u021b\u0007\u0001\u0000"+ - "\u0000\u021b\u021c\u0007\f\u0000\u0000\u021c\u021d\u0007\u000b\u0000\u0000"+ - "\u021d\u021e\u0007\u0007\u0000\u0000\u021e\u021f\u0007\f\u0000\u0000\u021f"+ - "\u0220\u0007\u000e\u0000\u0000\u0220\u0222\u0007\u0003\u0000\u0000\u0221"+ - "\u0212\u0001\u0000\u0000\u0000\u0221\u0218\u0001\u0000\u0000\u0000\u0222"+ - "\u0223\u0001\u0000\u0000\u0000\u0223\u0224\u0006\u0007\u0001\u0000\u0224"+ - "\u001a\u0001\u0000\u0000\u0000\u0225\u0226\u0005@\u0000\u0000\u0226\u0227"+ - "\u0007\n\u0000\u0000\u0227\u0228\u0007\u000b\u0000\u0000\u0228\u0229\u0007"+ - "\u0001\u0000\u0000\u0229\u0251\u0007\r\u0000\u0000\u022a\u022b\u0005@"+ - "\u0000\u0000\u022b\u022c\u0007\n\u0000\u0000\u022c\u022d\u0007\u0006\u0000"+ - "\u0000\u022d\u022e\u0007\u0001\u0000\u0000\u022e\u0251\u0007\b\u0000\u0000"+ - "\u022f\u0230\u0005@\u0000\u0000\u0230\u0231\u0007\u0001\u0000\u0000\u0231"+ - "\u0232\u0007\u0019\u0000\u0000\u0232\u0233\u0007\u0003\u0000\u0000\u0233"+ - "\u0234\u0007\u0002\u0000\u0000\u0234\u0235\u0007\b\u0000\u0000\u0235\u0236"+ - "\u0007\u0002\u0000\u0000\u0236\u0237\u0007\u0007\u0000\u0000\u0237\u0238"+ - "\u0007\u000b\u0000\u0000\u0238\u0251\u0007\u0003\u0000\u0000\u0239\u023a"+ - "\u0005@\u0000\u0000\u023a\u023b\u0007\u0019\u0000\u0000\u023b\u023c\u0007"+ - "\u0007\u0000\u0000\u023c\u023d\u0007\u000b\u0000\u0000\u023d\u023e\u0007"+ - "\u0003\u0000\u0000\u023e\u023f\u0007\u0002\u0000\u0000\u023f\u0240\u0007"+ - "\u0003\u0000\u0000\u0240\u0241\u0007\u0004\u0000\u0000\u0241\u0242\u0007"+ - "\u0005\u0000\u0000\u0242\u0243\u0007\u000b\u0000\u0000\u0243\u0244\u0007"+ - "\u0002\u0000\u0000\u0244\u0245\u0007\u0003\u0000\u0000\u0245\u0246\u0007"+ - "\u0000\u0000\u0000\u0246\u0247\u0007\u0002\u0000\u0000\u0247\u0248\u0007"+ - "\u0003\u0000\u0000\u0248\u0249\u0007\n\u0000\u0000\u0249\u0251\u0007\u0006"+ - "\u0000\u0000\u024a\u024b\u0005@\u0000\u0000\u024b\u024c\u0007\u0003\u0000"+ - "\u0000\u024c\u024d\u0007\f\u0000\u0000\u024d\u024e\u0007\u0011\u0000\u0000"+ - "\u024e\u024f\u0001\u0000\u0000\u0000\u024f\u0251\u0003\u000b\u0000\u0000"+ - "\u0250\u0225\u0001\u0000\u0000\u0000\u0250\u022a\u0001\u0000\u0000\u0000"+ - "\u0250\u022f\u0001\u0000\u0000\u0000\u0250\u0239\u0001\u0000\u0000\u0000"+ - "\u0250\u024a\u0001\u0000\u0000\u0000\u0251\u0252\u0001\u0000\u0000\u0000"+ - "\u0252\u0253\u0006\b\u0001\u0000\u0253\u001c\u0001\u0000\u0000\u0000\u0254"+ - "\u0255\u0005@\u0000\u0000\u0255\u0256\u0007\u0019\u0000\u0000\u0256\u0257"+ - "\u0007\u0003\u0000\u0000\u0257\u0258\u0007\u0002\u0000\u0000\u0258\u0259"+ - "\u0007\u0016\u0000\u0000\u0259\u025a\u0007\u0004\u0000\u0000\u025a\u025b"+ - "\u0007\u000b\u0000\u0000\u025b\u025c\u0007\u0007\u0000\u0000\u025c\u025d"+ - "\u0007\u0012\u0000\u0000\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u025f"+ - "\u0006\t\u0002\u0000\u025f\u0260\u0006\t\u0001\u0000\u0260\u001e\u0001"+ - "\u0000\u0000\u0000\u0261\u0262\u0005@\u0000\u0000\u0262\u0263\u0007\u0003"+ - "\u0000\u0000\u0263\u0264\u0007\f\u0000\u0000\u0264\u0265\u0007\u0011\u0000"+ - "\u0000\u0265\u0266\u0007\u0019\u0000\u0000\u0266\u0267\u0007\u0003\u0000"+ - "\u0000\u0267\u0268\u0007\u0002\u0000\u0000\u0268\u0269\u0007\u0016\u0000"+ - "\u0000\u0269\u026a\u0007\u0004\u0000\u0000\u026a\u026b\u0007\u000b\u0000"+ - "\u0000\u026b\u026c\u0007\u0007\u0000\u0000\u026c\u026d\u0007\u0012\u0000"+ - "\u0000\u026d\u026e\u0001\u0000\u0000\u0000\u026e\u026f\u0006\n\u0001\u0000"+ - "\u026f \u0001\u0000\u0000\u0000\u0270\u0271\u0005@\u0000\u0000\u0271\u0272"+ - "\u0007\u0011\u0000\u0000\u0272\u0288\u0007\u0011\u0000\u0000\u0273\u0274"+ - "\u0005@\u0000\u0000\u0274\u0275\u0007\u0011\u0000\u0000\u0275\u0276\u0007"+ - "\u000e\u0000\u0000\u0276\u0277\u0007\u0012\u0000\u0000\u0277\u0288\u0007"+ - "\r\u0000\u0000\u0278\u0279\u0005@\u0000\u0000\u0279\u027a\u0007\u001a"+ - "\u0000\u0000\u027a\u0288\u0007\n\u0000\u0000\u027b\u027c\u0005@\u0000"+ - "\u0000\u027c\u027d\u0007\u001a\u0000\u0000\u027d\u027e\u0007\n\u0000\u0000"+ - "\u027e\u027f\u0007\u0001\u0000\u0000\u027f\u0288\u0007\f\u0000\u0000\u0280"+ - "\u0281\u0005@\u0000\u0000\u0281\u0282\u0007\u0007\u0000\u0000\u0282\u0283"+ - "\u0007\f\u0000\u0000\u0283\u0284\u0007\u001a\u0000\u0000\u0284\u0285\u0007"+ - "\u0003\u0000\u0000\u0285\u0286\u0007\u0005\u0000\u0000\u0286\u0288\u0007"+ - "\u000b\u0000\u0000\u0287\u0270\u0001\u0000\u0000\u0000\u0287\u0273\u0001"+ - "\u0000\u0000\u0000\u0287\u0278\u0001\u0000\u0000\u0000\u0287\u027b\u0001"+ - "\u0000\u0000\u0000\u0287\u0280\u0001\u0000\u0000\u0000\u0288\u0289\u0001"+ - "\u0000\u0000\u0000\u0289\u028a\u0006\u000b\u0000\u0000\u028a\u028b\u0006"+ - "\u000b\u0001\u0000\u028b\"\u0001\u0000\u0000\u0000\u028c\u028d\u0005@"+ - "\u0000\u0000\u028d\u028e\u0007\u0003\u0000\u0000\u028e\u028f\u0007\t\u0000"+ - "\u0000\u028f\u0290\u0007\n\u0000\u0000\u0290\u02ad\u0007\u0003\u0000\u0000"+ - "\u0291\u0292\u0005@\u0000\u0000\u0292\u0293\u0007\u0005\u0000\u0000\u0293"+ - "\u0294\u0007\n\u0000\u0000\u0294\u0295\u0007\u0002\u0000\u0000\u0295\u02ad"+ - "\u0007\u0000\u0000\u0000\u0296\u0297\u0005@\u0000\u0000\u0297\u0298\u0007"+ - "\u0011\u0000\u0000\u0298\u0299\u0007\u0003\u0000\u0000\u0299\u029a\u0007"+ - "\u0000\u0000\u0000\u029a\u029b\u0007\u0004\u0000\u0000\u029b\u029c\u0007"+ - "\u000e\u0000\u0000\u029c\u029d\u0007\t\u0000\u0000\u029d\u02ad\u0007\u000b"+ - "\u0000\u0000\u029e\u029f\u0005@\u0000\u0000\u029f\u02a0\u0007\u0004\u0000"+ - "\u0000\u02a0\u02a1\u0007\r\u0000\u0000\u02a1\u02a2\u0007\r\u0000\u0000"+ - "\u02a2\u02a3\u0007\u0003\u0000\u0000\u02a3\u02a4\u0007\f\u0000\u0000\u02a4"+ - "\u02ad\u0007\u0011\u0000\u0000\u02a5\u02a6\u0005@\u0000\u0000\u02a6\u02a7"+ - "\u0007\r\u0000\u0000\u02a7\u02a8\u0007\u0004\u0000\u0000\u02a8\u02a9\u0007"+ - "\u0002\u0000\u0000\u02a9\u02aa\u0007\u0003\u0000\u0000\u02aa\u02ab\u0007"+ - "\f\u0000\u0000\u02ab\u02ad\u0007\u000b\u0000\u0000\u02ac\u028c\u0001\u0000"+ - "\u0000\u0000\u02ac\u0291\u0001\u0000\u0000\u0000\u02ac\u0296\u0001\u0000"+ - "\u0000\u0000\u02ac\u029e\u0001\u0000\u0000\u0000\u02ac\u02a5\u0001\u0000"+ - "\u0000\u0000\u02ad\u02ae\u0001\u0000\u0000\u0000\u02ae\u02af\u0006\f\u0001"+ - "\u0000\u02af$\u0001\u0000\u0000\u0000\u02b0\u02b1\u0005@\u0000\u0000\u02b1"+ - "\u02b2\u0007\r\u0000\u0000\u02b2\u02b3\u0007\u0006\u0000\u0000\u02b3\u02b4"+ - "\u0007\r\u0000\u0000\u02b4\u02b6\u0001\u0000\u0000\u0000\u02b5\u02b7\u0005"+ - " \u0000\u0000\u02b6\u02b5\u0001\u0000\u0000\u0000\u02b6\u02b7\u0001\u0000"+ - "\u0000\u0000\u02b7\u02b8\u0001\u0000\u0000\u0000\u02b8\u02b9\u0004\r\u0001"+ - "\u0000\u02b9\u02ba\u0001\u0000\u0000\u0000\u02ba\u02bb\u0006\r\u0003\u0000"+ - "\u02bb\u02bc\u0006\r\u0000\u0000\u02bc&\u0001\u0000\u0000\u0000\u02bd"+ - "\u02be\u0005@\u0000\u0000\u02be\u02bf\u0007\r\u0000\u0000\u02bf\u02c0"+ - "\u0007\u0006\u0000\u0000\u02c0\u02c1\u0007\r\u0000\u0000\u02c1\u02c2\u0001"+ - "\u0000\u0000\u0000\u02c2\u02c3\u0006\u000e\u0004\u0000\u02c3(\u0001\u0000"+ - "\u0000\u0000\u02c4\u02c5\u0005@\u0000\u0000\u02c5\u02c6\u0007\u0003\u0000"+ - "\u0000\u02c6\u02c7\u0007\f\u0000\u0000\u02c7\u02c8\u0007\u0011\u0000\u0000"+ - "\u02c8\u02c9\u0001\u0000\u0000\u0000\u02c9\u02ca\u0003I\u001f\u0000\u02ca"+ - "\u02cb\u0001\u0000\u0000\u0000\u02cb\u02cc\u0006\u000f\u0000\u0000\u02cc"+ - "\u02cd\u0006\u000f\u0001\u0000\u02cd*\u0001\u0000\u0000\u0000\u02ce\u02cf"+ - "\u0005@\u0000\u0000\u02cf\u02d0\u0007\t\u0000\u0000\u02d0\u02d1\u0007"+ - "\u0007\u0000\u0000\u02d1\u02d2\u0007\u0019\u0000\u0000\u02d2\u02d3\u0007"+ - "\u0003\u0000\u0000\u02d3\u02d4\u0007\b\u0000\u0000\u02d4\u02d5\u0007\u0007"+ - "\u0000\u0000\u02d5\u02d6\u0007\u0002\u0000\u0000\u02d6\u02d7\u0007\u0003"+ - "\u0000\u0000\u02d7\u02d8\u0007\n\u0000\u0000\u02d8\u02d9\u0007\u000b\u0000"+ - "\u0000\u02d9\u02da\u0007\u000f\u0000\u0000\u02da\u02db\u0007\t\u0000\u0000"+ - "\u02db\u02dc\u0007\u0003\u0000\u0000\u02dc\u0312\u0007\n\u0000\u0000\u02dd"+ - "\u02de\u0005@\u0000\u0000\u02de\u02df\u0007\u0016\u0000\u0000\u02df\u02e0"+ - "\u0007\u000e\u0000\u0000\u02e0\u02e1\u0007\u0017\u0000\u0000\u02e1\u02e2"+ - "\u0007\n\u0000\u0000\u02e2\u02e3\u0007\u000b\u0000\u0000\u02e3\u02e4\u0007"+ - "\u000f\u0000\u0000\u02e4\u02e5\u0007\t\u0000\u0000\u02e5\u02e6\u0007\u0003"+ - "\u0000\u0000\u02e6\u0312\u0007\n\u0000\u0000\u02e7\u02e8\u0005@\u0000"+ - "\u0000\u02e8\u02e9\u0007\t\u0000\u0000\u02e9\u02ea\u0007\u0007\u0000\u0000"+ - "\u02ea\u02eb\u0007\u0019\u0000\u0000\u02eb\u02ec\u0007\u0003\u0000\u0000"+ - "\u02ec\u02ed\u0007\b\u0000\u0000\u02ed\u02ee\u0007\u0007\u0000\u0000\u02ee"+ - "\u02ef\u0007\u0002\u0000\u0000\u02ef\u02f0\u0007\u0003\u0000\u0000\u02f0"+ - "\u02f1\u0007\n\u0000\u0000\u02f1\u02f2\u0007\u0005\u0000\u0000\u02f2\u02f3"+ - "\u0007\u0002\u0000\u0000\u02f3\u02f4\u0007\u0007\u0000\u0000\u02f4\u02f5"+ - "\u0007\r\u0000\u0000\u02f5\u02f6\u0007\u000b\u0000\u0000\u02f6\u0312\u0007"+ - "\n\u0000\u0000\u02f7\u02f8\u0005@\u0000\u0000\u02f8\u02f9\u0007\u0016"+ - "\u0000\u0000\u02f9\u02fa\u0007\u000e\u0000\u0000\u02fa\u02fb\u0007\u0017"+ - "\u0000\u0000\u02fb\u02fc\u0007\n\u0000\u0000\u02fc\u02fd\u0007\u0005\u0000"+ - "\u0000\u02fd\u02fe\u0007\u0002\u0000\u0000\u02fe\u02ff\u0007\u0007\u0000"+ - "\u0000\u02ff\u0300\u0007\r\u0000\u0000\u0300\u0301\u0007\u000b\u0000\u0000"+ - "\u0301\u0312\u0007\n\u0000\u0000\u0302\u0303\u0005@\u0000\u0000\u0303"+ - "\u0304\u0007\u0005\u0000\u0000\u0304\u0305\u0007\t\u0000\u0000\u0305\u0306"+ - "\u0007\u0007\u0000\u0000\u0306\u0307\u0007\u0005\u0000\u0000\u0307\u0308"+ - "\u0007\u0017\u0000\u0000\u0308\u030e\u0001\u0000\u0000\u0000\u0309\u030a"+ - "\u0005.\u0000\u0000\u030a\u030b\u0007\u0004\u0000\u0000\u030b\u030c\u0007"+ - "\b\u0000\u0000\u030c\u030d\u0007\u0004\u0000\u0000\u030d\u030f\u0007\u000f"+ - "\u0000\u0000\u030e\u0309\u0001\u0000\u0000\u0000\u030e\u030f\u0001\u0000"+ - "\u0000\u0000\u030f\u0310\u0001\u0000\u0000\u0000\u0310\u0312\u0005=\u0000"+ - "\u0000\u0311\u02ce\u0001\u0000\u0000\u0000\u0311\u02dd\u0001\u0000\u0000"+ - "\u0000\u0311\u02e7\u0001\u0000\u0000\u0000\u0311\u02f7\u0001\u0000\u0000"+ - "\u0000\u0311\u0302\u0001\u0000\u0000\u0000\u0312\u0313\u0001\u0000\u0000"+ - "\u0000\u0313\u0314\u0006\u0010\u0001\u0000\u0314,\u0001\u0000\u0000\u0000"+ - "\u0315\u0316\u0005@\u0000\u0000\u0316\u0317\u0007\u0019\u0000\u0000\u0317"+ - "\u0318\u0007\u0007\u0000\u0000\u0318\u0319\u0007\u000b\u0000\u0000\u0319"+ - "\u031a\u0007\u0003\u0000\u0000\u031a\u031b\u0001\u0000\u0000\u0000\u031b"+ - "\u031c\u0006\u0011\u0000\u0000\u031c\u031d\u0006\u0011\u0001\u0000\u031d"+ - ".\u0001\u0000\u0000\u0000\u031e\u031f\u0005@\u0000\u0000\u031f\u0320\u0003"+ - "I\u001f\u0000\u0320\u0321\u0004\u0012\u0002\u0000\u0321\u0322\u0001\u0000"+ - "\u0000\u0000\u0322\u0323\u0006\u0012\u0000\u0000\u03230\u0001\u0000\u0000"+ - "\u0000\u0324\u0325\u0005@\u0000\u0000\u0325\u0326\u0003I\u001f\u0000\u0326"+ - "2\u0001\u0000\u0000\u0000\u0327\u0329\u0005@\u0000\u0000\u0328\u032a\u0007"+ - "\u001b\u0000\u0000\u0329\u0328\u0001\u0000\u0000\u0000\u0329\u032a\u0001"+ - "\u0000\u0000\u0000\u032a4\u0001\u0000\u0000\u0000\u032b\u032c\u0005{\u0000"+ - "\u0000\u032c\u032d\u0005{\u0000\u0000\u032d\u032e\u0001\u0000\u0000\u0000"+ - "\u032e\u032f\u0006\u0015\u0005\u0000\u032f\u0330\u0006\u0015\u0006\u0000"+ - "\u03306\u0001\u0000\u0000\u0000\u0331\u0332\u0005{\u0000\u0000\u0332\u0333"+ - "\u0005!\u0000\u0000\u0333\u0334\u0005!\u0000\u0000\u0334\u0335\u0001\u0000"+ - "\u0000\u0000\u0335\u0336\u0006\u0016\u0007\u0000\u0336\u0337\u0006\u0016"+ - "\b\u0000\u03378\u0001\u0000\u0000\u0000\u0338\u0339\u0005/\u0000\u0000"+ - "\u0339\u033a\u0005*\u0000\u0000\u033a\u033e\u0001\u0000\u0000\u0000\u033b"+ - "\u033d\t\u0000\u0000\u0000\u033c\u033b\u0001\u0000\u0000\u0000\u033d\u0340"+ - "\u0001\u0000\u0000\u0000\u033e\u033f\u0001\u0000\u0000\u0000\u033e\u033c"+ - "\u0001\u0000\u0000\u0000\u033f\u0341\u0001\u0000\u0000\u0000\u0340\u033e"+ - "\u0001\u0000\u0000\u0000\u0341\u0342\u0005*\u0000\u0000\u0342\u0346\u0005"+ - "/\u0000\u0000\u0343\u0344\u0005/\u0000\u0000\u0344\u0346\u0005/\u0000"+ - "\u0000\u0345\u0338\u0001\u0000\u0000\u0000\u0345\u0343\u0001\u0000\u0000"+ - "\u0000\u0346\u0347\u0001\u0000\u0000\u0000\u0347\u0348\u0006\u0017\t\u0000"+ - "\u0348:\u0001\u0000\u0000\u0000\u0349\u034a\u0005<\u0000\u0000\u034a\u034b"+ - "\u0007\u0015\u0000\u0000\u034b\u034c\u0005-\u0000\u0000\u034c\u034d\u0001"+ - "\u0000\u0000\u0000\u034d\u0359\u0003\u000f\u0002\u0000\u034e\u034f\u0005"+ - "<\u0000\u0000\u034f\u0354\u0003\u000f\u0002\u0000\u0350\u0351\u0005:\u0000"+ - "\u0000\u0351\u0352\u0005:\u0000\u0000\u0352\u0353\u0001\u0000\u0000\u0000"+ - "\u0353\u0355\u0003\u000f\u0002\u0000\u0354\u0350\u0001\u0000\u0000\u0000"+ - "\u0355\u0356\u0001\u0000\u0000\u0000\u0356\u0354\u0001\u0000\u0000\u0000"+ - "\u0356\u0357\u0001\u0000\u0000\u0000\u0357\u0359\u0001\u0000\u0000\u0000"+ - "\u0358\u0349\u0001\u0000\u0000\u0000\u0358\u034e\u0001\u0000\u0000\u0000"+ - "\u0359\u035a\u0001\u0000\u0000\u0000\u035a\u035b\u0006\u0018\t\u0000\u035b"+ - "\u035c\u0006\u0018\n\u0000\u035c<\u0001\u0000\u0000\u0000\u035d\u035e"+ - "\u0005<\u0000\u0000\u035e\u035f\u0005/\u0000\u0000\u035f\u0360\u0001\u0000"+ - "\u0000\u0000\u0360\u0361\u0003M!\u0000\u0361\u0365\u0005>\u0000\u0000"+ - "\u0362\u0364\u0007\u001c\u0000\u0000\u0363\u0362\u0001\u0000\u0000\u0000"+ - "\u0364\u0367\u0001\u0000\u0000\u0000\u0365\u0363\u0001\u0000\u0000\u0000"+ - "\u0365\u0366\u0001\u0000\u0000\u0000\u0366\u0369\u0001\u0000\u0000\u0000"+ - "\u0367\u0365\u0001\u0000\u0000\u0000\u0368\u035d\u0001\u0000\u0000\u0000"+ - "\u0369\u036a\u0001\u0000\u0000\u0000\u036a\u0368\u0001\u0000\u0000\u0000"+ - "\u036a\u036b\u0001\u0000\u0000\u0000\u036b\u036c\u0001\u0000\u0000\u0000"+ - "\u036c\u036d\u0006\u0019\t\u0000\u036d>\u0001\u0000\u0000\u0000\u036e"+ - "\u0370\u0005 \u0000\u0000\u036f\u036e\u0001\u0000\u0000\u0000\u0370\u0371"+ - "\u0001\u0000\u0000\u0000\u0371\u036f\u0001\u0000\u0000\u0000\u0371\u0372"+ - "\u0001\u0000\u0000\u0000\u0372\u0388\u0001\u0000\u0000\u0000\u0373\u0375"+ - "\u0007\u001d\u0000\u0000\u0374\u0373\u0001\u0000\u0000\u0000\u0375\u0376"+ - "\u0001\u0000\u0000\u0000\u0376\u0374\u0001\u0000\u0000\u0000\u0376\u0377"+ - "\u0001\u0000\u0000\u0000\u0377\u0388\u0001\u0000\u0000\u0000\u0378\u0388"+ - "\u0003\u000f\u0002\u0000\u0379\u0388\u0003\u0011\u0003\u0000\u037a\u037b"+ - "\u0005\"\u0000\u0000\u037b\u0388\u0004\u001a\u0003\u0000\u037c\u037d\u0005"+ - "\\\u0000\u0000\u037d\u037e\u0005\'\u0000\u0000\u037e\u037f\u0001\u0000"+ - "\u0000\u0000\u037f\u0388\u0004\u001a\u0004\u0000\u0380\u0388\u0007\u001e"+ - "\u0000\u0000\u0381\u0383\u0007\u001f\u0000\u0000\u0382\u0381\u0001\u0000"+ - "\u0000\u0000\u0383\u0384\u0001\u0000\u0000\u0000\u0384\u0382\u0001\u0000"+ - "\u0000\u0000\u0384\u0385\u0001\u0000\u0000\u0000\u0385\u0388\u0001\u0000"+ - "\u0000\u0000\u0386\u0388\u0007 \u0000\u0000\u0387\u036f\u0001\u0000\u0000"+ - "\u0000\u0387\u0374\u0001\u0000\u0000\u0000\u0387\u0378\u0001\u0000\u0000"+ - "\u0000\u0387\u0379\u0001\u0000\u0000\u0000\u0387\u037a\u0001\u0000\u0000"+ - "\u0000\u0387\u037c\u0001\u0000\u0000\u0000\u0387\u0380\u0001\u0000\u0000"+ - "\u0000\u0387\u0382\u0001\u0000\u0000\u0000\u0387\u0386\u0001\u0000\u0000"+ - "\u0000\u0388\u038b\u0001\u0000\u0000\u0000\u0389\u0387\u0001\u0000\u0000"+ - "\u0000\u0389\u038a\u0001\u0000\u0000\u0000\u038a\u038c\u0001\u0000\u0000"+ - "\u0000\u038b\u0389\u0001\u0000\u0000\u0000\u038c\u038d\u0005<\u0000\u0000"+ - "\u038d\u038e\u0004\u001a\u0005\u0000\u038e\u038f\u0001\u0000\u0000\u0000"+ - "\u038f\u0390\u0006\u001a\u000b\u0000\u0390\u0391\u0006\u001a\f\u0000\u0391"+ - "@\u0001\u0000\u0000\u0000\u0392\u0394\u0005 \u0000\u0000\u0393\u0392\u0001"+ - "\u0000\u0000\u0000\u0394\u0395\u0001\u0000\u0000\u0000\u0395\u0393\u0001"+ - "\u0000\u0000\u0000\u0395\u0396\u0001\u0000\u0000\u0000\u0396\u03ae\u0001"+ - "\u0000\u0000\u0000\u0397\u0399\u0007\u001d\u0000\u0000\u0398\u0397\u0001"+ - "\u0000\u0000\u0000\u0399\u039a\u0001\u0000\u0000\u0000\u039a\u0398\u0001"+ - "\u0000\u0000\u0000\u039a\u039b\u0001\u0000\u0000\u0000\u039b\u03ae\u0001"+ - "\u0000\u0000\u0000\u039c\u039e\u0007!\u0000\u0000\u039d\u039c\u0001\u0000"+ - "\u0000\u0000\u039d\u039e\u0001\u0000\u0000\u0000\u039e\u039f\u0001\u0000"+ - "\u0000\u0000\u039f\u03ae\u0003\u000f\u0002\u0000\u03a0\u03ae\u0003\u0011"+ - "\u0003\u0000\u03a1\u03a2\u0005\"\u0000\u0000\u03a2\u03ae\u0004\u001b\u0006"+ - "\u0000\u03a3\u03ae\u0005,\u0000\u0000\u03a4\u03a5\u0005\\\u0000\u0000"+ - "\u03a5\u03ae\u0005\'\u0000\u0000\u03a6\u03ae\u0007\"\u0000\u0000\u03a7"+ - "\u03a9\u0007\u001f\u0000\u0000\u03a8\u03a7\u0001\u0000\u0000\u0000\u03a9"+ - "\u03aa\u0001\u0000\u0000\u0000\u03aa\u03a8\u0001\u0000\u0000\u0000\u03aa"+ - "\u03ab\u0001\u0000\u0000\u0000\u03ab\u03ae\u0001\u0000\u0000\u0000\u03ac"+ - "\u03ae\u0007 \u0000\u0000\u03ad\u0393\u0001\u0000\u0000\u0000\u03ad\u0398"+ - "\u0001\u0000\u0000\u0000\u03ad\u039d\u0001\u0000\u0000\u0000\u03ad\u03a0"+ - "\u0001\u0000\u0000\u0000\u03ad\u03a1\u0001\u0000\u0000\u0000\u03ad\u03a3"+ - "\u0001\u0000\u0000\u0000\u03ad\u03a4\u0001\u0000\u0000\u0000\u03ad\u03a6"+ - "\u0001\u0000\u0000\u0000\u03ad\u03a8\u0001\u0000\u0000\u0000\u03ad\u03ac"+ - "\u0001\u0000\u0000\u0000\u03ae\u03af\u0001\u0000\u0000\u0000\u03af\u03ad"+ - "\u0001\u0000\u0000\u0000\u03af\u03b0\u0001\u0000\u0000\u0000\u03b0\u03b1"+ - "\u0001\u0000\u0000\u0000\u03b1\u03b2\u0006\u001b\t\u0000\u03b2B\u0001"+ - "\u0000\u0000\u0000\u03b3\u03b5\u0005 \u0000\u0000\u03b4\u03b3\u0001\u0000"+ - "\u0000\u0000\u03b5\u03b6\u0001\u0000\u0000\u0000\u03b6\u03b4\u0001\u0000"+ - "\u0000\u0000\u03b6\u03b7\u0001\u0000\u0000\u0000\u03b7\u03be\u0001\u0000"+ - "\u0000\u0000\u03b8\u03ba\u0007\u001d\u0000\u0000\u03b9\u03b8\u0001\u0000"+ - "\u0000\u0000\u03ba\u03bb\u0001\u0000\u0000\u0000\u03bb\u03b9\u0001\u0000"+ - "\u0000\u0000\u03bb\u03bc\u0001\u0000\u0000\u0000\u03bc\u03be\u0001\u0000"+ - "\u0000\u0000\u03bd\u03b4\u0001\u0000\u0000\u0000\u03bd\u03b9\u0001\u0000"+ - "\u0000\u0000\u03be\u03bf\u0001\u0000\u0000\u0000\u03bf\u03c0\u0006\u001c"+ - "\t\u0000\u03c0D\u0001\u0000\u0000\u0000\u03c1\u03c2\u0005{\u0000\u0000"+ - "\u03c2\u03c7\u0005!\u0000\u0000\u03c3\u03c4\u0005{\u0000\u0000\u03c4\u03c5"+ - "\u0005{\u0000\u0000\u03c5\u03c7\u0005-\u0000\u0000\u03c6\u03c1\u0001\u0000"+ - "\u0000\u0000\u03c6\u03c3\u0001\u0000\u0000\u0000\u03c7\u03c8\u0001\u0000"+ - "\u0000\u0000\u03c8\u03c9\u0006\u001d\t\u0000\u03c9F\u0001\u0000\u0000"+ - "\u0000\u03ca\u03cb\t\u0000\u0000\u0000\u03cb\u03cc\u0001\u0000\u0000\u0000"+ - "\u03cc\u03cd\u0006\u001e\t\u0000\u03cdH\u0001\u0000\u0000\u0000\u03ce"+ - "\u03d2\u0007\u0013\u0000\u0000\u03cf\u03d1\u0007#\u0000\u0000\u03d0\u03cf"+ - "\u0001\u0000\u0000\u0000\u03d1\u03d4\u0001\u0000\u0000\u0000\u03d2\u03d0"+ - "\u0001\u0000\u0000\u0000\u03d2\u03d3\u0001\u0000\u0000\u0000\u03d3J\u0001"+ - "\u0000\u0000\u0000\u03d4\u03d2\u0001\u0000\u0000\u0000\u03d5\u03d9\u0007"+ - "$\u0000\u0000\u03d6\u03d8\u0007%\u0000\u0000\u03d7\u03d6\u0001\u0000\u0000"+ - "\u0000\u03d8\u03db\u0001\u0000\u0000\u0000\u03d9\u03d7\u0001\u0000\u0000"+ - "\u0000\u03d9\u03da\u0001\u0000\u0000\u0000\u03daL\u0001\u0000\u0000\u0000"+ - "\u03db\u03d9\u0001\u0000\u0000\u0000\u03dc\u03e0\u0007\u0013\u0000\u0000"+ - "\u03dd\u03df\u0007&\u0000\u0000\u03de\u03dd\u0001\u0000\u0000\u0000\u03df"+ - "\u03e2\u0001\u0000\u0000\u0000\u03e0\u03de\u0001\u0000\u0000\u0000\u03e0"+ - "\u03e1\u0001\u0000\u0000\u0000\u03e1N\u0001\u0000\u0000\u0000\u03e2\u03e0"+ - "\u0001\u0000\u0000\u0000\u03e3\u03e4\u0007\'\u0000\u0000\u03e4P\u0001"+ - "\u0000\u0000\u0000\u03e5\u03ea\u0005\"\u0000\u0000\u03e6\u03e9\u0003O"+ - "\"\u0000\u03e7\u03e9\t\u0000\u0000\u0000\u03e8\u03e6\u0001\u0000\u0000"+ - "\u0000\u03e8\u03e7\u0001\u0000\u0000\u0000\u03e9\u03ec\u0001\u0000\u0000"+ - "\u0000\u03ea\u03eb\u0001\u0000\u0000\u0000\u03ea\u03e8\u0001\u0000\u0000"+ - "\u0000\u03eb\u03ed\u0001\u0000\u0000\u0000\u03ec\u03ea\u0001\u0000\u0000"+ - "\u0000\u03ed\u03ee\u0005\"\u0000\u0000\u03eeR\u0001\u0000\u0000\u0000"+ - "\u03ef\u03f5\u0005\'\u0000\u0000\u03f0\u03f4\b(\u0000\u0000\u03f1\u03f2"+ - "\u0005\\\u0000\u0000\u03f2\u03f4\t\u0000\u0000\u0000\u03f3\u03f0\u0001"+ - "\u0000\u0000\u0000\u03f3\u03f1\u0001\u0000\u0000\u0000\u03f4\u03f7\u0001"+ - "\u0000\u0000\u0000\u03f5\u03f3\u0001\u0000\u0000\u0000\u03f5\u03f6\u0001"+ - "\u0000\u0000\u0000\u03f6\u03f8\u0001\u0000\u0000\u0000\u03f7\u03f5\u0001"+ - "\u0000\u0000\u0000\u03f8\u03f9\u0005\'\u0000\u0000\u03f9T\u0001\u0000"+ - "\u0000\u0000\u03fa\u03fb\u0005/\u0000\u0000\u03fb\u03fc\u0005/\u0000\u0000"+ - "\u03fc\u0400\u0001\u0000\u0000\u0000\u03fd\u03ff\b\u001d\u0000\u0000\u03fe"+ - "\u03fd\u0001\u0000\u0000\u0000\u03ff\u0402\u0001\u0000\u0000\u0000\u0400"+ - "\u03fe\u0001\u0000\u0000\u0000\u0400\u0401\u0001\u0000\u0000\u0000\u0401"+ - "V\u0001\u0000\u0000\u0000\u0402\u0400\u0001\u0000\u0000\u0000\u0403\u0404"+ - "\u0005$\u0000\u0000\u0404\u0405\u0003I\u001f\u0000\u0405X\u0001\u0000"+ - "\u0000\u0000\u0406\u0407\u0007\u0004\u0000\u0000\u0407\u0408\u0007\u0002"+ - "\u0000\u0000\u0408\u0409\u0007\u0002\u0000\u0000\u0409\u040a\u0007\u0004"+ - "\u0000\u0000\u040a\u0419\u0007\u000f\u0000\u0000\u040b\u040c\u0007\u0005"+ - "\u0000\u0000\u040c\u040d\u0007\t\u0000\u0000\u040d\u040e\u0007\u0004\u0000"+ - "\u0000\u040e\u040f\u0007\n\u0000\u0000\u040f\u0419\u0007\n\u0000\u0000"+ - "\u0410\u0411\u0007\u0003\u0000\u0000\u0411\u0412\u0007\u0012\u0000\u0000"+ - "\u0412\u0413\u0007\r\u0000\u0000\u0413\u0414\u0007\u000b\u0000\u0000\u0414"+ - "\u0419\u0007\u000f\u0000\u0000\u0415\u0416\u0007\u000e\u0000\u0000\u0416"+ - "\u0417\u0007\n\u0000\u0000\u0417\u0419\u0007\u0003\u0000\u0000\u0418\u0406"+ - "\u0001\u0000\u0000\u0000\u0418\u040b\u0001\u0000\u0000\u0000\u0418\u0410"+ - "\u0001\u0000\u0000\u0000\u0418\u0415\u0001\u0000\u0000\u0000\u0419Z\u0001"+ - "\u0000\u0000\u0000\u041a\u041b\u000209\u0000\u041b\\\u0001\u0000\u0000"+ - "\u0000\u041c\u041d\u0005{\u0000\u0000\u041d\u041e\u0005{\u0000\u0000\u041e"+ - "\u041f\u0005-\u0000\u0000\u041f\u0420\u0005-\u0000\u0000\u0420\u0421\u0001"+ - "\u0000\u0000\u0000\u0421\u0422\u0006)\r\u0000\u0422^\u0001\u0000\u0000"+ - "\u0000\u0423\u0424\u0005@\u0000\u0000\u0424\u0425\u0003M!\u0000\u0425"+ - "\u0426\u0005.\u0000\u0000\u0426\u0427\u0001\u0000\u0000\u0000\u0427\u0428"+ - "\u0006*\t\u0000\u0428`\u0001\u0000\u0000\u0000\u0429\u042e\u0005@\u0000"+ - "\u0000\u042a\u042c\u0003[(\u0000\u042b\u042d\u0005.\u0000\u0000\u042c"+ - "\u042b\u0001\u0000\u0000\u0000\u042c\u042d\u0001\u0000\u0000\u0000\u042d"+ - "\u042f\u0001\u0000\u0000\u0000\u042e\u042a\u0001\u0000\u0000\u0000\u042f"+ - "\u0430\u0001\u0000\u0000\u0000\u0430\u042e\u0001\u0000\u0000\u0000\u0430"+ - "\u0431\u0001\u0000\u0000\u0000\u0431\u0432\u0001\u0000\u0000\u0000\u0432"+ - "\u0433\u0006+\t\u0000\u0433b\u0001\u0000\u0000\u0000\u0434\u0435\u0005"+ - "{\u0000\u0000\u0435\u0436\u0005{\u0000\u0000\u0436\u056a\u0005{\u0000"+ - "\u0000\u0437\u0438\u0005@\u0000\u0000\u0438\u0439\u0005@\u0000\u0000\u0439"+ - "\u043b\u0001\u0000\u0000\u0000\u043a\u043c\u0005@\u0000\u0000\u043b\u043a"+ - "\u0001\u0000\u0000\u0000\u043b\u043c\u0001\u0000\u0000\u0000\u043c\u056a"+ - "\u0001\u0000\u0000\u0000\u043d\u043e\u0005@\u0000\u0000\u043e\u043f\u0005"+ - "{\u0000\u0000\u043f\u0441\u0001\u0000\u0000\u0000\u0440\u0442\u0005{\u0000"+ - "\u0000\u0441\u0440\u0001\u0000\u0000\u0000\u0441\u0442\u0001\u0000\u0000"+ - "\u0000\u0442\u056a\u0001\u0000\u0000\u0000\u0443\u0444\u0005@\u0000\u0000"+ - "\u0444\u0445\u0007\u0012\u0000\u0000\u0445\u0446\u0007\u0003\u0000\u0000"+ - "\u0446\u0447\u0007\u0011\u0000\u0000\u0447\u0448\u0007\u0007\u0000\u0000"+ - "\u0448\u0449\u0007\u0004\u0000\u0000\u0449\u044b\u0001\u0000\u0000\u0000"+ - "\u044a\u044c\u0007)\u0000\u0000\u044b\u044a\u0001\u0000\u0000\u0000\u044c"+ - "\u044d\u0001\u0000\u0000\u0000\u044d\u044b\u0001\u0000\u0000\u0000\u044d"+ - "\u044e\u0001\u0000\u0000\u0000\u044e\u0460\u0001\u0000\u0000\u0000\u044f"+ - "\u0450\u0007\n\u0000\u0000\u0450\u0451\u0007\u0005\u0000\u0000\u0451\u0452"+ - "\u0007\u0002\u0000\u0000\u0452\u0453\u0007\u0003\u0000\u0000\u0453\u0454"+ - "\u0007\u0003\u0000\u0000\u0454\u0455\u0007\f\u0000\u0000\u0455\u0457\u0001"+ - "\u0000\u0000\u0000\u0456\u0458\u0007)\u0000\u0000\u0457\u0456\u0001\u0000"+ - "\u0000\u0000\u0458\u0459\u0001\u0000\u0000\u0000\u0459\u0457\u0001\u0000"+ - "\u0000\u0000\u0459\u045a\u0001\u0000\u0000\u0000\u045a\u045e\u0001\u0000"+ - "\u0000\u0000\u045b\u045c\u0007\u0004\u0000\u0000\u045c\u045d\u0007\f\u0000"+ - "\u0000\u045d\u045f\u0007\u0011\u0000\u0000\u045e\u045b\u0001\u0000\u0000"+ - "\u0000\u045e\u045f\u0001\u0000\u0000\u0000\u045f\u0461\u0001\u0000\u0000"+ - "\u0000\u0460\u044f\u0001\u0000\u0000\u0000\u0460\u0461\u0001\u0000\u0000"+ - "\u0000\u0461\u056a\u0001\u0000\u0000\u0000\u0462\u0463\u0005@\u0000\u0000"+ - "\u0463\u0464\u0007\u0005\u0000\u0000\u0464\u0465\u0007\u0006\u0000\u0000"+ - "\u0465\u0466\u0007\u0004\u0000\u0000\u0466\u0467\u0007\u0002\u0000\u0000"+ - "\u0467\u0468\u0007\n\u0000\u0000\u0468\u0469\u0007\u0003\u0000\u0000\u0469"+ - "\u0562\u0007\u000b\u0000\u0000\u046a\u046b\u0005@\u0000\u0000\u046b\u046c"+ - "\u0007\u0007\u0000\u0000\u046c\u046d\u0007\u0012\u0000\u0000\u046d\u046e"+ - "\u0007\r\u0000\u0000\u046e\u046f\u0007\u0001\u0000\u0000\u046f\u0470\u0007"+ - "\u0002\u0000\u0000\u0470\u0562\u0007\u000b\u0000\u0000\u0471\u0472\u0005"+ - "@\u0000\u0000\u0472\u0473\u0007\f\u0000\u0000\u0473\u0474\u0007\u0004"+ - "\u0000\u0000\u0474\u0475\u0007\u0012\u0000\u0000\u0475\u0476\u0007\u0003"+ - "\u0000\u0000\u0476\u0477\u0007\n\u0000\u0000\u0477\u0478\u0007\r\u0000"+ - "\u0000\u0478\u0479\u0007\u0004\u0000\u0000\u0479\u047a\u0007\u0005\u0000"+ - "\u0000\u047a\u0562\u0007\u0003\u0000\u0000\u047b\u047c\u0005@\u0000\u0000"+ - "\u047c\u047d\u0007\u0011\u0000\u0000\u047d\u047e\u0007\u0001\u0000\u0000"+ - "\u047e\u047f\u0007\u0005\u0000\u0000\u047f\u0480\u0007\u000e\u0000\u0000"+ - "\u0480\u0481\u0007\u0012\u0000\u0000\u0481\u0482\u0007\u0003\u0000\u0000"+ - "\u0482\u0483\u0007\f\u0000\u0000\u0483\u0562\u0007\u000b\u0000\u0000\u0484"+ - "\u0485\u0005@\u0000\u0000\u0485\u0486\u0007\u0000\u0000\u0000\u0486\u0487"+ - "\u0007\u0001\u0000\u0000\u0487\u0488\u0007\f\u0000\u0000\u0488\u0489\u0007"+ - "\u000b\u0000\u0000\u0489\u048a\u0005-\u0000\u0000\u048a\u048b\u0007\u0000"+ - "\u0000\u0000\u048b\u048c\u0007\u0004\u0000\u0000\u048c\u048d\u0007\u0005"+ - "\u0000\u0000\u048d\u0562\u0007\u0003\u0000\u0000\u048e\u048f\u0005@\u0000"+ - "\u0000\u048f\u0490\u0007\r\u0000\u0000\u0490\u0491\u0007\u0004\u0000\u0000"+ - "\u0491\u0492\u0007\u0010\u0000\u0000\u0492\u0562\u0007\u0003\u0000\u0000"+ - "\u0493\u0494\u0005@\u0000\u0000\u0494\u0495\u0007\t\u0000\u0000\u0495"+ - "\u0496\u0007\u0004\u0000\u0000\u0496\u0497\u0007\u000f\u0000\u0000\u0497"+ - "\u0498\u0007\u0003\u0000\u0000\u0498\u0562\u0007\u0002\u0000\u0000\u0499"+ - "\u049a\u0005@\u0000\u0000\u049a\u049b\u0007\n\u0000\u0000\u049b\u049c"+ - "\u0007\u000e\u0000\u0000\u049c\u049d\u0007\r\u0000\u0000\u049d\u049e\u0007"+ - "\r\u0000\u0000\u049e\u049f\u0007\u0001\u0000\u0000\u049f\u04a0\u0007\u0002"+ - "\u0000\u0000\u04a0\u04a1\u0007\u000b\u0000\u0000\u04a1\u0562\u0007\n\u0000"+ - "\u0000\u04a2\u04a3\u0005@\u0000\u0000\u04a3\u04a4\u0007\u000b\u0000\u0000"+ - "\u04a4\u04a5\u0007\u0004\u0000\u0000\u04a5\u04a6\u0007\u0007\u0000\u0000"+ - "\u04a6\u04a7\u0007\t\u0000\u0000\u04a7\u04a8\u0007\b\u0000\u0000\u04a8"+ - "\u04a9\u0007\u0007\u0000\u0000\u04a9\u04aa\u0007\f\u0000\u0000\u04aa\u0562"+ - "\u0007\u0011\u0000\u0000\u04ab\u04ac\u0005@\u0000\u0000\u04ac\u04ad\u0007"+ - "\u0004\u0000\u0000\u04ad\u04ae\u0007\r\u0000\u0000\u04ae\u04af\u0007\r"+ - "\u0000\u0000\u04af\u04b0\u0007\t\u0000\u0000\u04b0\u0562\u0007\u000f\u0000"+ - "\u0000\u04b1\u04b2\u0005@\u0000\u0000\u04b2\u04b3\u0005-\u0000\u0000\u04b3"+ - "\u04b4\u0007\b\u0000\u0000\u04b4\u04b5\u0007\u0003\u0000\u0000\u04b5\u04b6"+ - "\u0007\u0016\u0000\u0000\u04b6\u04b7\u0007\u0017\u0000\u0000\u04b7\u04b8"+ - "\u0007\u0007\u0000\u0000\u04b8\u04b9\u0007\u000b\u0000\u0000\u04b9\u04ba"+ - "\u0005-\u0000\u0000\u04ba\u04bb\u0007\u0017\u0000\u0000\u04bb\u04bc\u0007"+ - "\u0003\u0000\u0000\u04bc\u04bd\u0007\u000f\u0000\u0000\u04bd\u04be\u0007"+ - "\u0000\u0000\u0000\u04be\u04bf\u0007\u0002\u0000\u0000\u04bf\u04c0\u0007"+ - "\u0004\u0000\u0000\u04c0\u04c1\u0007\u0012\u0000\u0000\u04c1\u04c2\u0007"+ - "\u0003\u0000\u0000\u04c2\u0562\u0007\n\u0000\u0000\u04c3\u04c4\u0005@"+ - "\u0000\u0000\u04c4\u04c5\u0007\u0017\u0000\u0000\u04c5\u04c6\u0007\u0003"+ - "\u0000\u0000\u04c6\u04c7\u0007\u000f\u0000\u0000\u04c7\u04c8\u0007\u0000"+ - "\u0000\u0000\u04c8\u04c9\u0007\u0002\u0000\u0000\u04c9\u04ca\u0007\u0004"+ - "\u0000\u0000\u04ca\u04cb\u0007\u0012\u0000\u0000\u04cb\u04cc\u0007\u0003"+ - "\u0000\u0000\u04cc\u0562\u0007\n\u0000\u0000\u04cd\u04ce\u0005@\u0000"+ - "\u0000\u04ce\u04cf\u0007\u0005\u0000\u0000\u04cf\u04d0\u0007\u0001\u0000"+ - "\u0000\u04d0\u04d1\u0007\u000e\u0000\u0000\u04d1\u04d2\u0007\f\u0000\u0000"+ - "\u04d2\u04d3\u0007\u000b\u0000\u0000\u04d3\u04d4\u0007\u0003\u0000\u0000"+ - "\u04d4\u04d5\u0007\u0002\u0000\u0000\u04d5\u04d6\u0005-\u0000\u0000\u04d6"+ - "\u04d7\u0007\n\u0000\u0000\u04d7\u04d8\u0007\u000b\u0000\u0000\u04d8\u04d9"+ - "\u0007\u000f\u0000\u0000\u04d9\u04da\u0007\t\u0000\u0000\u04da\u0562\u0007"+ - "\u0003\u0000\u0000\u04db\u04dc\u0005@\u0000\u0000\u04dc\u04dd\u0007\u0000"+ - "\u0000\u0000\u04dd\u04de\u0007\u0001\u0000\u0000\u04de\u04df\u0007\f\u0000"+ - "\u0000\u04df\u04e0\u0007\u000b\u0000\u0000\u04e0\u04e1\u0005-\u0000\u0000"+ - "\u04e1\u04e2\u0007\u0000\u0000\u0000\u04e2\u04e3\u0007\u0003\u0000\u0000"+ - "\u04e3\u04e4\u0007\u0004\u0000\u0000\u04e4\u04e5\u0007\u000b\u0000\u0000"+ - "\u04e5\u04e6\u0007\u000e\u0000\u0000\u04e6\u04e7\u0007\u0002\u0000\u0000"+ - "\u04e7\u04e8\u0007\u0003\u0000\u0000\u04e8\u04e9\u0005-\u0000\u0000\u04e9"+ - "\u04ea\u0007\u0019\u0000\u0000\u04ea\u04eb\u0007\u0004\u0000\u0000\u04eb"+ - "\u04ec\u0007\t\u0000\u0000\u04ec\u04ed\u0007\u000e\u0000\u0000\u04ed\u04ee"+ - "\u0007\u0003\u0000\u0000\u04ee\u0562\u0007\n\u0000\u0000\u04ef\u04f0\u0005"+ - "@\u0000\u0000\u04f0\u04f1\u0007\r\u0000\u0000\u04f1\u04f2\u0007\u0002"+ - "\u0000\u0000\u04f2\u04f3\u0007\u0001\u0000\u0000\u04f3\u04f4\u0007\r\u0000"+ - "\u0000\u04f4\u04f5\u0007\u0003\u0000\u0000\u04f5\u04f6\u0007\u0002\u0000"+ - "\u0000\u04f6\u04f7\u0007\u000b\u0000\u0000\u04f7\u0562\u0007\u000f\u0000"+ - "\u0000\u04f8\u04f9\u0005@\u0000\u0000\u04f9\u04fa\u0007\n\u0000\u0000"+ - "\u04fa\u04fb\u0007\u0005\u0000\u0000\u04fb\u04fc\u0007\u0001\u0000\u0000"+ - "\u04fc\u04fd\u0007\r\u0000\u0000\u04fd\u0562\u0007\u0003\u0000\u0000\u04fe"+ - "\u04ff\u0005@\u0000\u0000\u04ff\u0500\u0007\n\u0000\u0000\u0500\u0501"+ - "\u0007\u000b\u0000\u0000\u0501\u0502\u0007\u0004\u0000\u0000\u0502\u0503"+ - "\u0007\u0002\u0000\u0000\u0503\u0504\u0007\u000b\u0000\u0000\u0504\u0505"+ - "\u0007\u0007\u0000\u0000\u0505\u0506\u0007\f\u0000\u0000\u0506\u0507\u0007"+ - "\u0010\u0000\u0000\u0507\u0508\u0005-\u0000\u0000\u0508\u0509\u0007\n"+ - "\u0000\u0000\u0509\u050a\u0007\u000b\u0000\u0000\u050a\u050b\u0007\u000f"+ - "\u0000\u0000\u050b\u050c\u0007\t\u0000\u0000\u050c\u0562\u0007\u0003\u0000"+ - "\u0000\u050d\u050e\u0005@\u0000\u0000\u050e\u050f\u0007\n\u0000\u0000"+ - "\u050f\u0510\u0007\u000e\u0000\u0000\u0510\u0511\u0007\r\u0000\u0000\u0511"+ - "\u0512\u0007\r\u0000\u0000\u0512\u0513\u0007\u0001\u0000\u0000\u0513\u0514"+ - "\u0007\u0002\u0000\u0000\u0514\u0515\u0007\u000b\u0000\u0000\u0515\u0562"+ - "\u0007\n\u0000\u0000\u0516\u0517\u0005@\u0000\u0000\u0517\u0518\u0007"+ - "\u0019\u0000\u0000\u0518\u0519\u0007\u0007\u0000\u0000\u0519\u051a\u0007"+ - "\u0003\u0000\u0000\u051a\u051b\u0007\b\u0000\u0000\u051b\u051c\u0005-"+ - "\u0000\u0000\u051c\u051d\u0007\u000b\u0000\u0000\u051d\u051e\u0007\u0002"+ - "\u0000\u0000\u051e\u051f\u0007\u0004\u0000\u0000\u051f\u0520\u0007\f\u0000"+ - "\u0000\u0520\u0521\u0007\n\u0000\u0000\u0521\u0522\u0007\u0007\u0000\u0000"+ - "\u0522\u0523\u0007\u000b\u0000\u0000\u0523\u0524\u0007\u0007\u0000\u0000"+ - "\u0524\u0525\u0007\u0001\u0000\u0000\u0525\u0562\u0007\f\u0000\u0000\u0526"+ - "\u0527\u0005@\u0000\u0000\u0527\u0528\u0007\u0005\u0000\u0000\u0528\u0529"+ - "\u0007\u0001\u0000\u0000\u0529\u052a\u0007\f\u0000\u0000\u052a\u052b\u0007"+ - "\u000b\u0000\u0000\u052b\u052c\u0007\u0004\u0000\u0000\u052c\u052d\u0007"+ - "\u0007\u0000\u0000\u052d\u052e\u0007\f\u0000\u0000\u052e\u052f\u0007\u0003"+ - "\u0000\u0000\u052f\u0562\u0007\u0002\u0000\u0000\u0530\u0531\u0005@\u0000"+ - "\u0000\u0531\u0532\u0007\u0005\u0000\u0000\u0532\u0533\u0007\u0001\u0000"+ - "\u0000\u0533\u0534\u0007\t\u0000\u0000\u0534\u0535\u0007\u0001\u0000\u0000"+ - "\u0535\u0536\u0007\u0002\u0000\u0000\u0536\u0537\u0005-\u0000\u0000\u0537"+ - "\u0538\u0007\r\u0000\u0000\u0538\u0539\u0007\u0002\u0000\u0000\u0539\u053a"+ - "\u0007\u0001\u0000\u0000\u053a\u053b\u0007\u0000\u0000\u0000\u053b\u053c"+ - "\u0007\u0007\u0000\u0000\u053c\u053d\u0007\t\u0000\u0000\u053d\u0562\u0007"+ - "\u0003\u0000\u0000\u053e\u053f\u0005@\u0000\u0000\u053f\u0540\u0007\n"+ - "\u0000\u0000\u0540\u0541\u0007\u000b\u0000\u0000\u0541\u0542\u0007\u000f"+ - "\u0000\u0000\u0542\u0543\u0007\t\u0000\u0000\u0543\u0544\u0007\u0003\u0000"+ - "\u0000\u0544\u0545\u0007\n\u0000\u0000\u0545\u0546\u0007\u0003\u0000\u0000"+ - "\u0546\u0562\u0007\u000b\u0000\u0000\u0547\u0548\u0005@\u0000\u0000\u0548"+ - "\u0549\u0007\u0000\u0000\u0000\u0549\u054a\u0007\u0001\u0000\u0000\u054a"+ - "\u054b\u0007\f\u0000\u0000\u054b\u054c\u0007\u000b\u0000\u0000\u054c\u054d"+ - "\u0005-\u0000\u0000\u054d\u054e\u0007\r\u0000\u0000\u054e\u054f\u0007"+ - "\u0004\u0000\u0000\u054f\u0550\u0007\t\u0000\u0000\u0550\u0551\u0007\u0003"+ - "\u0000\u0000\u0551\u0552\u0007\u000b\u0000\u0000\u0552\u0553\u0007\u000b"+ - "\u0000\u0000\u0553\u0554\u0007\u0003\u0000\u0000\u0554\u0555\u0005-\u0000"+ - "\u0000\u0555\u0556\u0007\u0019\u0000\u0000\u0556\u0557\u0007\u0004\u0000"+ - "\u0000\u0557\u0558\u0007\t\u0000\u0000\u0558\u0559\u0007\u000e\u0000\u0000"+ - "\u0559\u055a\u0007\u0003\u0000\u0000\u055a\u0562\u0007\n\u0000\u0000\u055b"+ - "\u055c\u0005@\u0000\u0000\u055c\u055d\u0007\u0012\u0000\u0000\u055d\u055e"+ - "\u0007\u0003\u0000\u0000\u055e\u055f\u0007\u0011\u0000\u0000\u055f\u0560"+ - "\u0007\u0007\u0000\u0000\u0560\u0562\u0007\u0004\u0000\u0000\u0561\u0462"+ - "\u0001\u0000\u0000\u0000\u0561\u046a\u0001\u0000\u0000\u0000\u0561\u0471"+ - "\u0001\u0000\u0000\u0000\u0561\u047b\u0001\u0000\u0000\u0000\u0561\u0484"+ - "\u0001\u0000\u0000\u0000\u0561\u048e\u0001\u0000\u0000\u0000\u0561\u0493"+ - "\u0001\u0000\u0000\u0000\u0561\u0499\u0001\u0000\u0000\u0000\u0561\u04a2"+ - "\u0001\u0000\u0000\u0000\u0561\u04ab\u0001\u0000\u0000\u0000\u0561\u04b1"+ - "\u0001\u0000\u0000\u0000\u0561\u04c3\u0001\u0000\u0000\u0000\u0561\u04cd"+ - "\u0001\u0000\u0000\u0000\u0561\u04db\u0001\u0000\u0000\u0000\u0561\u04ef"+ - "\u0001\u0000\u0000\u0000\u0561\u04f8\u0001\u0000\u0000\u0000\u0561\u04fe"+ - "\u0001\u0000\u0000\u0000\u0561\u050d\u0001\u0000\u0000\u0000\u0561\u0516"+ - "\u0001\u0000\u0000\u0000\u0561\u0526\u0001\u0000\u0000\u0000\u0561\u0530"+ - "\u0001\u0000\u0000\u0000\u0561\u053e\u0001\u0000\u0000\u0000\u0561\u0547"+ - "\u0001\u0000\u0000\u0000\u0561\u055b\u0001\u0000\u0000\u0000\u0562\u0566"+ - "\u0001\u0000\u0000\u0000\u0563\u0565\u0007)\u0000\u0000\u0564\u0563\u0001"+ - "\u0000\u0000\u0000\u0565\u0568\u0001\u0000\u0000\u0000\u0566\u0564\u0001"+ - "\u0000\u0000\u0000\u0566\u0567\u0001\u0000\u0000\u0000\u0567\u056a\u0001"+ - "\u0000\u0000\u0000\u0568\u0566\u0001\u0000\u0000\u0000\u0569\u0434\u0001"+ - "\u0000\u0000\u0000\u0569\u0437\u0001\u0000\u0000\u0000\u0569\u043d\u0001"+ - "\u0000\u0000\u0000\u0569\u0443\u0001\u0000\u0000\u0000\u0569\u0561\u0001"+ - "\u0000\u0000\u0000\u056a\u056b\u0001\u0000\u0000\u0000\u056b\u056c\u0006"+ - ",\t\u0000\u056cd\u0001\u0000\u0000\u0000\u056d\u056e\t\u0000\u0000\u0000"+ - "\u056e\u056f\u0004-\u0007\u0000\u056f\u0570\u0001\u0000\u0000\u0000\u0570"+ - "\u0571\u0006-\u000e\u0000\u0571\u0572\u0006-\u000f\u0000\u0572f\u0001"+ - "\u0000\u0000\u0000\u0573\u0574\t\u0000\u0000\u0000\u0574\u0575\u0001\u0000"+ - "\u0000\u0000\u0575\u0576\u0006.\f\u0000\u0576h\u0001\u0000\u0000\u0000"+ - "\u0577\u0578\u0005\u0000\u0000\u0001\u0578\u0579\u0001\u0000\u0000\u0000"+ - "\u0579\u057a\u0006/\u000e\u0000\u057a\u057b\u0006/\u000f\u0000\u057bj"+ - "\u0001\u0000\u0000\u0000\u057c\u057d\u0005}\u0000\u0000\u057d\u057e\u0005"+ - "}\u0000\u0000\u057e\u057f\u0001\u0000\u0000\u0000\u057f\u0580\u00060\u000f"+ - "\u0000\u0580\u0581\u00060\u0006\u0000\u0581l\u0001\u0000\u0000\u0000\u0582"+ - "\u0584\b*\u0000\u0000\u0583\u0582\u0001\u0000\u0000\u0000\u0584\u0585"+ - "\u0001\u0000\u0000\u0000\u0585\u0583\u0001\u0000\u0000\u0000\u0585\u0586"+ - "\u0001\u0000\u0000\u0000\u0586\u0587\u0001\u0000\u0000\u0000\u0587\u0588"+ - "\u00061\u0010\u0000\u0588n\u0001\u0000\u0000\u0000\u0589\u058d\t\u0000"+ - "\u0000\u0000\u058a\u058c\u0007)\u0000\u0000\u058b\u058a\u0001\u0000\u0000"+ - "\u0000\u058c\u058f\u0001\u0000\u0000\u0000\u058d\u058b\u0001\u0000\u0000"+ - "\u0000\u058d\u058e\u0001\u0000\u0000\u0000\u058e\u0590\u0001\u0000\u0000"+ - "\u0000\u058f\u058d\u0001\u0000\u0000\u0000\u0590\u0591\u00062\u0011\u0000"+ - "\u0591p\u0001\u0000\u0000\u0000\u0592\u0593\u0005\u0000\u0000\u0001\u0593"+ - "\u0594\u0001\u0000\u0000\u0000\u0594\u0595\u00063\u0012\u0000\u0595\u0596"+ - "\u00063\u000f\u0000\u0596r\u0001\u0000\u0000\u0000\u0597\u0598\u0005!"+ - "\u0000\u0000\u0598\u0599\u0005!\u0000\u0000\u0599\u059a\u0005}\u0000\u0000"+ - "\u059a\u059b\u0001\u0000\u0000\u0000\u059b\u059c\u00064\u000f\u0000\u059c"+ - "\u059d\u00064\b\u0000\u059dt\u0001\u0000\u0000\u0000\u059e\u05a0\b+\u0000"+ - "\u0000\u059f\u059e\u0001\u0000\u0000\u0000\u05a0\u05a1\u0001\u0000\u0000"+ - "\u0000\u05a1\u059f\u0001\u0000\u0000\u0000\u05a1\u05a2\u0001\u0000\u0000"+ - "\u0000\u05a2\u05a3\u0001\u0000\u0000\u0000\u05a3\u05a4\u00065\u0013\u0000"+ - "\u05a4v\u0001\u0000\u0000\u0000\u05a5\u05a9\t\u0000\u0000\u0000\u05a6"+ - "\u05a8\u0007)\u0000\u0000\u05a7\u05a6\u0001\u0000\u0000\u0000\u05a8\u05ab"+ - "\u0001\u0000\u0000\u0000\u05a9\u05a7\u0001\u0000\u0000\u0000\u05a9\u05aa"+ - "\u0001\u0000\u0000\u0000\u05aa\u05ac\u0001\u0000\u0000\u0000\u05ab\u05a9"+ - "\u0001\u0000\u0000\u0000\u05ac\u05ad\u00066\u0014\u0000\u05adx\u0001\u0000"+ - "\u0000\u0000\u05ae\u05af\u0005\u0000\u0000\u0001\u05af\u05b0\u0001\u0000"+ - "\u0000\u0000\u05b0\u05b1\u00067\u0012\u0000\u05b1\u05b2\u00067\u000f\u0000"+ - "\u05b2z\u0001\u0000\u0000\u0000\u05b3\u05b5\u0007)\u0000\u0000\u05b4\u05b3"+ - "\u0001\u0000\u0000\u0000\u05b5\u05b6\u0001\u0000\u0000\u0000\u05b6\u05b4"+ - "\u0001\u0000\u0000\u0000\u05b6\u05b7\u0001\u0000\u0000\u0000\u05b7\u05b8"+ - "\u0001\u0000\u0000\u0000\u05b8\u05b9\u00048\b\u0000\u05b9\u05ba\u0001"+ - "\u0000\u0000\u0000\u05ba\u05bb\u00068\u0015\u0000\u05bb|\u0001\u0000\u0000"+ - "\u0000\u05bc\u05bd\u0005(\u0000\u0000\u05bd\u05be\u00069\u0016\u0000\u05be"+ - "\u05bf\u0001\u0000\u0000\u0000\u05bf\u05c0\u00069\f\u0000\u05c0\u05c1"+ - "\u00069\u0015\u0000\u05c1~\u0001\u0000\u0000\u0000\u05c2\u05c3\u0003I"+ - "\u001f\u0000\u05c3\u05c4\u0001\u0000\u0000\u0000\u05c4\u05c5\u0006:\u0012"+ - "\u0000\u05c5\u05c6\u0006:\u000f\u0000\u05c6\u0080\u0001\u0000\u0000\u0000"+ - "\u05c7\u05c8\t\u0000\u0000\u0000\u05c8\u05c9\u0001\u0000\u0000\u0000\u05c9"+ - "\u05ca\u0006;\u0012\u0000\u05ca\u05cb\u0006;\u000f\u0000\u05cb\u0082\u0001"+ - "\u0000\u0000\u0000\u05cc\u05cd\u0004<\t\u0000\u05cd\u05ce\u0005(\u0000"+ - "\u0000\u05ce\u05cf\u0006<\u0017\u0000\u05cf\u05d0\u0006<\u0018\u0000\u05d0"+ - "\u0084\u0001\u0000\u0000\u0000\u05d1\u05d2\u0004=\n\u0000\u05d2\u05d3"+ - "\u0005)\u0000\u0000\u05d3\u05d4\u0006=\u0019\u0000\u05d4\u05d5\u0001\u0000"+ - "\u0000\u0000\u05d5\u05d6\u0006=\u001a\u0000\u05d6\u05d7\u0006=\u001b\u0000"+ - "\u05d7\u0086\u0001\u0000\u0000\u0000\u05d8\u05d9\u0004>\u000b\u0000\u05d9"+ - "\u05da\u0005(\u0000\u0000\u05da\u05db\u0006>\u001c\u0000\u05db\u05dc\u0006"+ - ">\u001d\u0000\u05dc\u0088\u0001\u0000\u0000\u0000\u05dd\u05de\u0004?\f"+ - "\u0000\u05de\u05df\u0005)\u0000\u0000\u05df\u05e0\u0006?\u001e\u0000\u05e0"+ - "\u05e1\u0006?\u001f\u0000\u05e1\u008a\u0001\u0000\u0000\u0000\u05e2\u05e3"+ - "\u0005)\u0000\u0000\u05e3\u05e4\u0004@\r\u0000\u05e4\u05e5\u0001\u0000"+ - "\u0000\u0000\u05e5\u05e6\u0006@\u001a\u0000\u05e6\u05e7\u0006@\u001b\u0000"+ - "\u05e7\u008c\u0001\u0000\u0000\u0000\u05e8\u05e9\u0005/\u0000\u0000\u05e9"+ - "\u05ea\u0005*\u0000\u0000\u05ea\u05ee\u0001\u0000\u0000\u0000\u05eb\u05ed"+ - "\t\u0000\u0000\u0000\u05ec\u05eb\u0001\u0000\u0000\u0000\u05ed\u05f0\u0001"+ - "\u0000\u0000\u0000\u05ee\u05ef\u0001\u0000\u0000\u0000\u05ee\u05ec\u0001"+ - "\u0000\u0000\u0000\u05ef\u05f1\u0001\u0000\u0000\u0000\u05f0\u05ee\u0001"+ - "\u0000\u0000\u0000\u05f1\u05f2\u0005*\u0000\u0000\u05f2\u05f3\u0005/\u0000"+ - "\u0000\u05f3\u05f4\u0001\u0000\u0000\u0000\u05f4\u05f5\u0006A \u0000\u05f5"+ - "\u008e\u0001\u0000\u0000\u0000\u05f6\u05f7\t\u0000\u0000\u0000\u05f7\u05f8"+ - "\u0006B!\u0000\u05f8\u0090\u0001\u0000\u0000\u0000\u05f9\u05fa\u0005\u0000"+ - "\u0000\u0001\u05fa\u05fb\u0001\u0000\u0000\u0000\u05fb\u05fc\u0006C\u0012"+ - "\u0000\u05fc\u05fd\u0006C\u001b\u0000\u05fd\u0092\u0001\u0000\u0000\u0000"+ - "\u05fe\u05ff\u0005@\u0000\u0000\u05ff\u0600\u0007\u0003\u0000\u0000\u0600"+ - "\u0601\u0007\f\u0000\u0000\u0601\u0602\u0007\u0011\u0000\u0000\u0602\u0603"+ - "\u0007\r\u0000\u0000\u0603\u0604\u0007\u0006\u0000\u0000\u0604\u0605\u0007"+ - "\r\u0000\u0000\u0605\u0606\u0001\u0000\u0000\u0000\u0606\u0607\u0006D"+ - "\u000f\u0000\u0607\u0094\u0001\u0000\u0000\u0000\u0608\u0609\t\u0000\u0000"+ - "\u0000\u0609\u060a\u0004E\u000e\u0000\u060a\u060b\u0001\u0000\u0000\u0000"+ - "\u060b\u060c\u0006E\"\u0000\u060c\u0096\u0001\u0000\u0000\u0000\u060d"+ - "\u060e\t\u0000\u0000\u0000\u060e\u060f\u0001\u0000\u0000\u0000\u060f\u0610"+ - "\u0006F\f\u0000\u0610\u0098\u0001\u0000\u0000\u0000\u0611\u0612\u0005"+ - "\u0000\u0000\u0001\u0612\u0613\u0001\u0000\u0000\u0000\u0613\u0614\u0006"+ - "G\u0012\u0000\u0614\u0615\u0006G\u000f\u0000\u0615\u009a\u0001\u0000\u0000"+ - "\u0000\u0616\u0617\u0005@\u0000\u0000\u0617\u0618\u0007\u0003\u0000\u0000"+ - "\u0618\u0619\u0007\f\u0000\u0000\u0619\u061a\u0007\u0011\u0000\u0000\u061a"+ - "\u061b\u0007\u0019\u0000\u0000\u061b\u061c\u0007\u0003\u0000\u0000\u061c"+ - "\u061d\u0007\u0002\u0000\u0000\u061d\u061e\u0007\u0016\u0000\u0000\u061e"+ - "\u061f\u0007\u0004\u0000\u0000\u061f\u0620\u0007\u000b\u0000\u0000\u0620"+ - "\u0621\u0007\u0007\u0000\u0000\u0621\u0622\u0007\u0012\u0000\u0000\u0622"+ - "\u0623\u0001\u0000\u0000\u0000\u0623\u0624\u0006H\u0001\u0000\u0624\u0625"+ - "\u0006H\u000f\u0000\u0625\u009c\u0001\u0000\u0000\u0000\u0626\u0627\t"+ - "\u0000\u0000\u0000\u0627\u0628\u0004I\u000f\u0000\u0628\u0629\u0001\u0000"+ - "\u0000\u0000\u0629\u062a\u0006I\t\u0000\u062a\u009e\u0001\u0000\u0000"+ - "\u0000\u062b\u062c\t\u0000\u0000\u0000\u062c\u062d\u0001\u0000\u0000\u0000"+ - "\u062d\u062e\u0006J\f\u0000\u062e\u00a0\u0001\u0000\u0000\u0000\u062f"+ - "\u0630\u0005\u0000\u0000\u0001\u0630\u0631\u0001\u0000\u0000\u0000\u0631"+ - "\u0632\u0006K\u0012\u0000\u0632\u0633\u0006K\u000f\u0000\u0633\u00a2\u0001"+ - "\u0000\u0000\u0000\u0634\u0635\u0005:\u0000\u0000\u0635\u0636\u0003M!"+ - "\u0000\u0636\u0637\u0005=\u0000\u0000\u0637\u0638\u0005\"\u0000\u0000"+ - "\u0638\u0639\u0001\u0000\u0000\u0000\u0639\u063a\u0006L\t\u0000\u063a"+ - "\u063b\u0006L#\u0000\u063b\u00a4\u0001\u0000\u0000\u0000\u063c\u063d\u0005"+ - "{\u0000\u0000\u063d\u063e\u0005{\u0000\u0000\u063e\u063f\u0001\u0000\u0000"+ - "\u0000\u063f\u0640\u0006M\u0005\u0000\u0640\u0641\u0006M\u0006\u0000\u0641"+ - "\u00a6\u0001\u0000\u0000\u0000\u0642\u0643\u0005{\u0000\u0000\u0643\u0644"+ - "\u0005!\u0000\u0000\u0644\u0645\u0005!\u0000\u0000\u0645\u0646\u0001\u0000"+ - "\u0000\u0000\u0646\u0647\u0006N\u0007\u0000\u0647\u0648\u0006N\b\u0000"+ - "\u0648\u00a8\u0001\u0000\u0000\u0000\u0649\u064a\u0005>\u0000\u0000\u064a"+ - "\u064b\u0001\u0000\u0000\u0000\u064b\u064c\u0006O\t\u0000\u064c\u064d"+ - "\u0006O\u000f\u0000\u064d\u00aa\u0001\u0000\u0000\u0000\u064e\u064f\t"+ - "\u0000\u0000\u0000\u064f\u0650\u0001\u0000\u0000\u0000\u0650\u0651\u0006"+ - "P\t\u0000\u0651\u00ac\u0001\u0000\u0000\u0000\u0652\u0653\u0005\u0000"+ - "\u0000\u0001\u0653\u0654\u0001\u0000\u0000\u0000\u0654\u0655\u0006Q\u0012"+ - "\u0000\u0655\u0656\u0006Q\u000f\u0000\u0656\u00ae\u0001\u0000\u0000\u0000"+ - "\u0657\u0658\u0005\"\u0000\u0000\u0658\u0659\u0001\u0000\u0000\u0000\u0659"+ - "\u065a\u0006R\t\u0000\u065a\u065b\u0006R\u000f\u0000\u065b\u00b0\u0001"+ - "\u0000\u0000\u0000\u065c\u065d\t\u0000\u0000\u0000\u065d\u065e\u0004S"+ - "\u0010\u0000\u065e\u065f\u0001\u0000\u0000\u0000\u065f\u0660\u0006S\u001a"+ - "\u0000\u0660\u00b2\u0001\u0000\u0000\u0000\u0661\u0662\t\u0000\u0000\u0000"+ - "\u0662\u0663\u0001\u0000\u0000\u0000\u0663\u0664\u0006T\f\u0000\u0664"+ - "\u00b4\u0001\u0000\u0000\u0000\u0665\u0666\u0005\u0000\u0000\u0001\u0666"+ - "\u0667\u0001\u0000\u0000\u0000\u0667\u0668\u0006U\u0012\u0000\u0668\u0669"+ - "\u0006U\u000f\u0000\u0669\u00b6\u0001\u0000\u0000\u0000\u066a\u066c\u0005"+ - "{\u0000\u0000\u066b\u066d\u0007(\u0000\u0000\u066c\u066b\u0001\u0000\u0000"+ - "\u0000\u066c\u066d\u0001\u0000\u0000\u0000\u066d\u066e\u0001\u0000\u0000"+ - "\u0000\u066e\u0670\u0003M!\u0000\u066f\u0671\u0007(\u0000\u0000\u0670"+ - "\u066f\u0001\u0000\u0000\u0000\u0670\u0671\u0001\u0000\u0000\u0000\u0671"+ - "\u0673\u0001\u0000\u0000\u0000\u0672\u0674\u0005:\u0000\u0000\u0673\u0672"+ - "\u0001\u0000\u0000\u0000\u0674\u0675\u0001\u0000\u0000\u0000\u0675\u0673"+ - "\u0001\u0000\u0000\u0000\u0675\u0676\u0001\u0000\u0000\u0000\u0676\u0678"+ - "\u0001\u0000\u0000\u0000\u0677\u0679\u0007(\u0000\u0000\u0678\u0677\u0001"+ - "\u0000\u0000\u0000\u0678\u0679\u0001\u0000\u0000\u0000\u0679\u067b\u0001"+ - "\u0000\u0000\u0000\u067a\u067c\u0003M!\u0000\u067b\u067a\u0001\u0000\u0000"+ - "\u0000\u067b\u067c\u0001\u0000\u0000\u0000\u067c\u067e\u0001\u0000\u0000"+ - "\u0000\u067d\u067f\u0007(\u0000\u0000\u067e\u067d\u0001\u0000\u0000\u0000"+ - "\u067e\u067f\u0001\u0000\u0000\u0000\u067f\u0696\u0001\u0000\u0000\u0000"+ - "\u0680\u0682\u0005,\u0000\u0000\u0681\u0683\u0007(\u0000\u0000\u0682\u0681"+ - "\u0001\u0000\u0000\u0000\u0682\u0683\u0001\u0000\u0000\u0000\u0683\u0684"+ - "\u0001\u0000\u0000\u0000\u0684\u0686\u0003M!\u0000\u0685\u0687\u0007("+ - "\u0000\u0000\u0686\u0685\u0001\u0000\u0000\u0000\u0686\u0687\u0001\u0000"+ - "\u0000\u0000\u0687\u0689\u0001\u0000\u0000\u0000\u0688\u068a\u0005:\u0000"+ - "\u0000\u0689\u0688\u0001\u0000\u0000\u0000\u068a\u068b\u0001\u0000\u0000"+ - "\u0000\u068b\u0689\u0001\u0000\u0000\u0000\u068b\u068c\u0001\u0000\u0000"+ - "\u0000\u068c\u068e\u0001\u0000\u0000\u0000\u068d\u068f\u0007(\u0000\u0000"+ - "\u068e\u068d\u0001\u0000\u0000\u0000\u068e\u068f\u0001\u0000\u0000\u0000"+ - "\u068f\u0690\u0001\u0000\u0000\u0000\u0690\u0692\u0003M!\u0000\u0691\u0693"+ - "\u0007(\u0000\u0000\u0692\u0691\u0001\u0000\u0000\u0000\u0692\u0693\u0001"+ - "\u0000\u0000\u0000\u0693\u0695\u0001\u0000\u0000\u0000\u0694\u0680\u0001"+ - "\u0000\u0000\u0000\u0695\u0698\u0001\u0000\u0000\u0000\u0696\u0694\u0001"+ - "\u0000\u0000\u0000\u0696\u0697\u0001\u0000\u0000\u0000\u0697\u069a\u0001"+ - "\u0000\u0000\u0000\u0698\u0696\u0001\u0000\u0000\u0000\u0699\u069b\u0005"+ - ",\u0000\u0000\u069a\u0699\u0001\u0000\u0000\u0000\u069a\u069b\u0001\u0000"+ - "\u0000\u0000\u069b\u069c\u0001\u0000\u0000\u0000\u069c\u069d\u0005}\u0000"+ - "\u0000\u069d\u069e\u0001\u0000\u0000\u0000\u069e\u069f\u0006V\f\u0000"+ - "\u069f\u00b8\u0001\u0000\u0000\u0000\u06a0\u06a1\u0005{\u0000\u0000\u06a1"+ - "\u06a2\u0005$\u0000\u0000\u06a2\u06ab\u0003M!\u0000\u06a3\u06a4\u0005"+ - "[\u0000\u0000\u06a4\u06a5\u0007(\u0000\u0000\u06a5\u06a6\u0003M!\u0000"+ - "\u06a6\u06a7\u0007(\u0000\u0000\u06a7\u06a8\u0005]\u0000\u0000\u06a8\u06aa"+ - "\u0001\u0000\u0000\u0000\u06a9\u06a3\u0001\u0000\u0000\u0000\u06aa\u06ad"+ - "\u0001\u0000\u0000\u0000\u06ab\u06a9\u0001\u0000\u0000\u0000\u06ab\u06ac"+ - "\u0001\u0000\u0000\u0000\u06ac\u06ae\u0001\u0000\u0000\u0000\u06ad\u06ab"+ - "\u0001\u0000\u0000\u0000\u06ae\u06af\u0005:\u0000\u0000\u06af\u06b0\u0005"+ - ":\u0000\u0000\u06b0\u06b1\u0001\u0000\u0000\u0000\u06b1\u06b2\u0003M!"+ - "\u0000\u06b2\u06b3\u0005}\u0000\u0000\u06b3\u06b4\u0001\u0000\u0000\u0000"+ - "\u06b4\u06b5\u0006W\f\u0000\u06b5\u00ba\u0001\u0000\u0000\u0000\u06b6"+ - "\u06b7\u0005{\u0000\u0000\u06b7\u06b8\u0005$\u0000\u0000\u06b8\u06c2\u0003"+ - "M!\u0000\u06b9\u06ba\u0005[\u0000\u0000\u06ba\u06bc\u0007(\u0000\u0000"+ - "\u06bb\u06bd\u0003M!\u0000\u06bc\u06bb\u0001\u0000\u0000\u0000\u06bc\u06bd"+ - "\u0001\u0000\u0000\u0000\u06bd\u06be\u0001\u0000\u0000\u0000\u06be\u06bf"+ - "\u0007(\u0000\u0000\u06bf\u06c1\u0005]\u0000\u0000\u06c0\u06b9\u0001\u0000"+ - "\u0000\u0000\u06c1\u06c4\u0001\u0000\u0000\u0000\u06c2\u06c0\u0001\u0000"+ - "\u0000\u0000\u06c2\u06c3\u0001\u0000\u0000\u0000\u06c3\u06cc\u0001\u0000"+ - "\u0000\u0000\u06c4\u06c2\u0001\u0000\u0000\u0000\u06c5\u06c6\u0005:\u0000"+ - "\u0000\u06c6\u06c8\u0005:\u0000\u0000\u06c7\u06c5\u0001\u0000\u0000\u0000"+ - "\u06c8\u06c9\u0001\u0000\u0000\u0000\u06c9\u06c7\u0001\u0000\u0000\u0000"+ - "\u06c9\u06ca\u0001\u0000\u0000\u0000\u06ca\u06cb\u0001\u0000\u0000\u0000"+ - "\u06cb\u06cd\u0003M!\u0000\u06cc\u06c7\u0001\u0000\u0000\u0000\u06cc\u06cd"+ - "\u0001\u0000\u0000\u0000\u06cd\u06d2\u0001\u0000\u0000\u0000\u06ce\u06d0"+ - "\u0005:\u0000\u0000\u06cf\u06d1\u0003M!\u0000\u06d0\u06cf\u0001\u0000"+ - "\u0000\u0000\u06d0\u06d1\u0001\u0000\u0000\u0000\u06d1\u06d3\u0001\u0000"+ - "\u0000\u0000\u06d2\u06ce\u0001\u0000\u0000\u0000\u06d3\u06d4\u0001\u0000"+ - "\u0000\u0000\u06d4\u06d2\u0001\u0000\u0000\u0000\u06d4\u06d5\u0001\u0000"+ - "\u0000\u0000\u06d5\u06d6\u0001\u0000\u0000\u0000\u06d6\u06d7\u0005}\u0000"+ - "\u0000\u06d7\u06db\u0001\u0000\u0000\u0000\u06d8\u06d9\u0005:\u0000\u0000"+ - "\u06d9\u06db\u0005$\u0000\u0000\u06da\u06b6\u0001\u0000\u0000\u0000\u06da"+ - "\u06d8\u0001\u0000\u0000\u0000\u06db\u06dc\u0001\u0000\u0000\u0000\u06dc"+ - "\u06dd\u0006X\u0012\u0000\u06dd\u00bc\u0001\u0000\u0000\u0000\u06de\u06df"+ - "\u0005\\\u0000\u0000\u06df\u06e0\u0005\"\u0000\u0000\u06e0\u06e1\u0001"+ - "\u0000\u0000\u0000\u06e1\u06e2\u0006Y\f\u0000\u06e2\u00be\u0001\u0000"+ - "\u0000\u0000\u06e3\u06e4\u0005\"\u0000\u0000\u06e4\u06e5\u0001\u0000\u0000"+ - "\u0000\u06e5\u06e6\u0006Z\f\u0000\u06e6\u06e7\u0006Z\u000f\u0000\u06e7"+ - "\u00c0\u0001\u0000\u0000\u0000\u06e8\u06e9\t\u0000\u0000\u0000\u06e9\u06ea"+ - "\u0001\u0000\u0000\u0000\u06ea\u06eb\u0006[\f\u0000\u06eb\u00c2\u0001"+ - "\u0000\u0000\u0000\u06ec\u06ed\u0005\u0000\u0000\u0001\u06ed\u06ee\u0001"+ - "\u0000\u0000\u0000\u06ee\u06ef\u0006\\\u0012\u0000\u06ef\u06f0\u0006\\"+ - "\u000f\u0000\u06f0\u00c4\u0001\u0000\u0000\u0000\u06f1\u06f2\u0005-\u0000"+ - "\u0000\u06f2\u06f3\u0005-\u0000\u0000\u06f3\u06f4\u0005}\u0000\u0000\u06f4"+ - "\u06f5\u0005}\u0000\u0000\u06f5\u06f6\u0001\u0000\u0000\u0000\u06f6\u06f7"+ - "\u0006]\u000f\u0000\u06f7\u00c6\u0001\u0000\u0000\u0000\u06f8\u06f9\t"+ - "\u0000\u0000\u0000\u06f9\u06fa\u0004^\u0011\u0000\u06fa\u06fb\u0001\u0000"+ - "\u0000\u0000\u06fb\u06fc\u0006^$\u0000\u06fc\u00c8\u0001\u0000\u0000\u0000"+ - "\u06fd\u06fe\t\u0000\u0000\u0000\u06fe\u06ff\u0001\u0000\u0000\u0000\u06ff"+ - "\u0700\u0006_\f\u0000\u0700\u00ca\u0001\u0000\u0000\u0000\u0701\u0702"+ - "\u0005\u0000\u0000\u0001\u0702\u0703\u0001\u0000\u0000\u0000\u0703\u0704"+ - "\u0006`$\u0000\u0704\u0705\u0006`\u000f\u0000\u0705\u00cc\u0001\u0000"+ - "\u0000\u0000c\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u00d5"+ - "\u0112\u0131\u014d\u0153\u015f\u016d\u0173\u0175\u0193\u0205\u020a\u0221"+ - "\u0250\u0287\u02ac\u02b6\u030e\u0311\u0329\u033e\u0345\u0356\u0358\u0365"+ - "\u036a\u0371\u0376\u0384\u0387\u0389\u0395\u039a\u039d\u03aa\u03ad\u03af"+ - "\u03b6\u03bb\u03bd\u03c6\u03d2\u03d9\u03e0\u03e8\u03ea\u03f3\u03f5\u0400"+ - "\u0418\u042c\u0430\u043b\u0441\u044d\u0459\u045e\u0460\u0561\u0566\u0569"+ - "\u0585\u058d\u05a1\u05a9\u05b6\u05ee\u066c\u0670\u0675\u0678\u067b\u067e"+ - "\u0682\u0686\u068b\u068e\u0692\u0696\u069a\u06ab\u06bc\u06c2\u06c9\u06cc"+ - "\u06d0\u06d4\u06da%\u0005\u0004\u0000\u0007\u0001\u0000\u0005\u0007\u0000"+ - "\u0007\u000b\u0000\u0005\u0006\u0000\u0005\u0002\u0000\u0007\u0005\u0000"+ - "\u0005\u0003\u0000\u0007\u0004\u0000\u0007\u0006\u0000\u0005\b\u0000\u0005"+ - "\u0001\u0000\u0003\u0000\u0000\u0005\n\u0000\u0007\u0007\u0000\u0004\u0000"+ - "\u0000\u00011\u0000\u00012\u0001\u0007\b\u0000\u00015\u0002\u00016\u0003"+ - "\u0005\u0005\u0000\u00019\u0004\u0001<\u0005\u0001<\u0006\u0001=\u0007"+ - "\u0007\u0002\u0000\u0002\u0000\u0000\u0001>\b\u0001>\t\u0001?\n\u0001"+ - "?\u000b\u0006\u0000\u0000\u0001B\f\u0000\u0002\u0000\u0005\t\u0000\u0007"+ - "\t\u0000"; + "\u0000\u0193\u0188\u0001\u0000\u0000\u0000\u0194\u0198\u0001\u0000\u0000"+ + "\u0000\u0195\u0197\u0005 \u0000\u0000\u0196\u0195\u0001\u0000\u0000\u0000"+ + "\u0197\u019a\u0001\u0000\u0000\u0000\u0198\u0196\u0001\u0000\u0000\u0000"+ + "\u0198\u0199\u0001\u0000\u0000\u0000\u0199\u019b\u0001\u0000\u0000\u0000"+ + "\u019a\u0198\u0001\u0000\u0000\u0000\u019b\u019c\u0004\u0005\u0000\u0000"+ + "\u019c\u019d\u0001\u0000\u0000\u0000\u019d\u019e\u0006\u0005\u0000\u0000"+ + "\u019e\u019f\u0006\u0005\u0001\u0000\u019f\u0016\u0001\u0000\u0000\u0000"+ + "\u01a0\u01a1\u0005@\u0000\u0000\u01a1\u01a2\u0007\u0003\u0000\u0000\u01a2"+ + "\u01a3\u0007\t\u0000\u0000\u01a3\u01a4\u0007\n\u0000\u0000\u01a4\u01a5"+ + "\u0007\u0003\u0000\u0000\u01a5\u01a6\u0007\u0007\u0000\u0000\u01a6\u020e"+ + "\u0007\u0000\u0000\u0000\u01a7\u020e\u0003\r\u0001\u0000\u01a8\u01a9\u0005"+ + "@\u0000\u0000\u01a9\u01aa\u0007\u0003\u0000\u0000\u01aa\u01ab\u0007\u0015"+ + "\u0000\u0000\u01ab\u01ac\u0007\u000b\u0000\u0000\u01ac\u01ad\u0007\u0003"+ + "\u0000\u0000\u01ad\u01ae\u0007\f\u0000\u0000\u01ae\u01af\u0007\u0011\u0000"+ + "\u0000\u01af\u020e\u0007\n\u0000\u0000\u01b0\u01b1\u0005@\u0000\u0000"+ + "\u01b1\u01b2\u0007\u0003\u0000\u0000\u01b2\u01b3\u0007\u0004\u0000\u0000"+ + "\u01b3\u01b4\u0007\u0005\u0000\u0000\u01b4\u020e\u0007\u0006\u0000\u0000"+ + "\u01b5\u01b6\u0005@\u0000\u0000\u01b6\u01b7\u0007\u000f\u0000\u0000\u01b7"+ + "\u01b8\u0007\u0007\u0000\u0000\u01b8\u01b9\u0007\u0003\u0000\u0000\u01b9"+ + "\u01ba\u0007\t\u0000\u0000\u01ba\u020e\u0007\u0011\u0000\u0000\u01bb\u01bc"+ + "\u0005@\u0000\u0000\u01bc\u01bd\u0007\r\u0000\u0000\u01bd\u01be\u0007"+ + "\u0002\u0000\u0000\u01be\u01bf\u0007\u0001\u0000\u0000\u01bf\u01c0\u0007"+ + "\r\u0000\u0000\u01c0\u020e\u0007\n\u0000\u0000\u01c1\u01c2\u0005@\u0000"+ + "\u0000\u01c2\u01c3\u0007\u0012\u0000\u0000\u01c3\u01c4\u0007\u0003\u0000"+ + "\u0000\u01c4\u01c5\u0007\u000b\u0000\u0000\u01c5\u01c6\u0007\u0006\u0000"+ + "\u0000\u01c6\u01c7\u0007\u0001\u0000\u0000\u01c7\u020e\u0007\u0011\u0000"+ + "\u0000\u01c8\u01c9\u0005@\u0000\u0000\u01c9\u01ca\u0007\u0005\u0000\u0000"+ + "\u01ca\u01cb\u0007\t\u0000\u0000\u01cb\u01cc\u0007\u0004\u0000\u0000\u01cc"+ + "\u01cd\u0007\n\u0000\u0000\u01cd\u020e\u0007\n\u0000\u0000\u01ce\u01cf"+ + "\u0005@\u0000\u0000\u01cf\u01d0\u0007\n\u0000\u0000\u01d0\u01d1\u0007"+ + "\u000b\u0000\u0000\u01d1\u01d2\u0007\u000f\u0000\u0000\u01d2\u01d3\u0007"+ + "\t\u0000\u0000\u01d3\u020e\u0007\u0003\u0000\u0000\u01d4\u01d5\u0005@"+ + "\u0000\u0000\u01d5\u01d6\u0007\u0004\u0000\u0000\u01d6\u01d7\u0007\b\u0000"+ + "\u0000\u01d7\u01d8\u0007\u0004\u0000\u0000\u01d8\u01d9\u0007\u0002\u0000"+ + "\u0000\u01d9\u020e\u0007\u0003\u0000\u0000\u01da\u01db\u0005@\u0000\u0000"+ + "\u01db\u01dc\u0007\u0016\u0000\u0000\u01dc\u01dd\u0007\u0002\u0000\u0000"+ + "\u01dd\u01de\u0007\u0003\u0000\u0000\u01de\u01df\u0007\u0004\u0000\u0000"+ + "\u01df\u020e\u0007\u0017\u0000\u0000\u01e0\u01e1\u0005@\u0000\u0000\u01e1"+ + "\u01e2\u0007\u0005\u0000\u0000\u01e2\u01e3\u0007\u0001\u0000\u0000\u01e3"+ + "\u01e4\u0007\f\u0000\u0000\u01e4\u01e5\u0007\u000b\u0000\u0000\u01e5\u01e6"+ + "\u0007\u0007\u0000\u0000\u01e6\u01e7\u0007\f\u0000\u0000\u01e7\u01e8\u0007"+ + "\u000e\u0000\u0000\u01e8\u020e\u0007\u0003\u0000\u0000\u01e9\u01ea\u0005"+ + "@\u0000\u0000\u01ea\u01eb\u0007\n\u0000\u0000\u01eb\u01ec\u0007\u0003"+ + "\u0000\u0000\u01ec\u01ed\u0007\t\u0000\u0000\u01ed\u01ee\u0007\u0003\u0000"+ + "\u0000\u01ee\u01ef\u0007\u0005\u0000\u0000\u01ef\u01f0\u0007\u000b\u0000"+ + "\u0000\u01f0\u01f1\u0007\u0003\u0000\u0000\u01f1\u020e\u0007\u0011\u0000"+ + "\u0000\u01f2\u01f3\u0005@\u0000\u0000\u01f3\u01f4\u0007\u0011\u0000\u0000"+ + "\u01f4\u01f5\u0007\u0007\u0000\u0000\u01f5\u01f6\u0007\n\u0000\u0000\u01f6"+ + "\u01f7\u0007\u0004\u0000\u0000\u01f7\u01f8\u0007\u0016\u0000\u0000\u01f8"+ + "\u01f9\u0007\t\u0000\u0000\u01f9\u01fa\u0007\u0003\u0000\u0000\u01fa\u020e"+ + "\u0007\u0011\u0000\u0000\u01fb\u01fc\u0005@\u0000\u0000\u01fc\u01fd\u0007"+ + "\u0002\u0000\u0000\u01fd\u01fe\u0007\u0003\u0000\u0000\u01fe\u01ff\u0007"+ + "\u0004\u0000\u0000\u01ff\u0200\u0007\u0011\u0000\u0000\u0200\u0201\u0007"+ + "\u0001\u0000\u0000\u0201\u0202\u0007\f\u0000\u0000\u0202\u0203\u0007\t"+ + "\u0000\u0000\u0203\u020e\u0007\u000f\u0000\u0000\u0204\u0205\u0005@\u0000"+ + "\u0000\u0205\u0206\u0007\u0002\u0000\u0000\u0206\u0207\u0007\u0003\u0000"+ + "\u0000\u0207\u0208\u0007\u0018\u0000\u0000\u0208\u0209\u0007\u000e\u0000"+ + "\u0000\u0209\u020a\u0007\u0007\u0000\u0000\u020a\u020b\u0007\u0002\u0000"+ + "\u0000\u020b\u020c\u0007\u0003\u0000\u0000\u020c\u020e\u0007\u0011\u0000"+ + "\u0000\u020d\u01a0\u0001\u0000\u0000\u0000\u020d\u01a7\u0001\u0000\u0000"+ + "\u0000\u020d\u01a8\u0001\u0000\u0000\u0000\u020d\u01b0\u0001\u0000\u0000"+ + "\u0000\u020d\u01b5\u0001\u0000\u0000\u0000\u020d\u01bb\u0001\u0000\u0000"+ + "\u0000\u020d\u01c1\u0001\u0000\u0000\u0000\u020d\u01c8\u0001\u0000\u0000"+ + "\u0000\u020d\u01ce\u0001\u0000\u0000\u0000\u020d\u01d4\u0001\u0000\u0000"+ + "\u0000\u020d\u01da\u0001\u0000\u0000\u0000\u020d\u01e0\u0001\u0000\u0000"+ + "\u0000\u020d\u01e9\u0001\u0000\u0000\u0000\u020d\u01f2\u0001\u0000\u0000"+ + "\u0000\u020d\u01fb\u0001\u0000\u0000\u0000\u020d\u0204\u0001\u0000\u0000"+ + "\u0000\u020e\u0212\u0001\u0000\u0000\u0000\u020f\u0211\u0005 \u0000\u0000"+ + "\u0210\u020f\u0001\u0000\u0000\u0000\u0211\u0214\u0001\u0000\u0000\u0000"+ + "\u0212\u0210\u0001\u0000\u0000\u0000\u0212\u0213\u0001\u0000\u0000\u0000"+ + "\u0213\u0215\u0001\u0000\u0000\u0000\u0214\u0212\u0001\u0000\u0000\u0000"+ + "\u0215\u0216\u0004\u0006\u0001\u0000\u0216\u0217\u0001\u0000\u0000\u0000"+ + "\u0217\u0218\u0006\u0006\u0000\u0000\u0218\u0219\u0006\u0006\u0001\u0000"+ + "\u0219\u0018\u0001\u0000\u0000\u0000\u021a\u021b\u0005@\u0000\u0000\u021b"+ + "\u021c\u0007\u0016\u0000\u0000\u021c\u021d\u0007\u0002\u0000\u0000\u021d"+ + "\u021e\u0007\u0003\u0000\u0000\u021e\u021f\u0007\u0004\u0000\u0000\u021f"+ + "\u022a\u0007\u0017\u0000\u0000\u0220\u0221\u0005@\u0000\u0000\u0221\u0222"+ + "\u0007\u0005\u0000\u0000\u0222\u0223\u0007\u0001\u0000\u0000\u0223\u0224"+ + "\u0007\f\u0000\u0000\u0224\u0225\u0007\u000b\u0000\u0000\u0225\u0226\u0007"+ + "\u0007\u0000\u0000\u0226\u0227\u0007\f\u0000\u0000\u0227\u0228\u0007\u000e"+ + "\u0000\u0000\u0228\u022a\u0007\u0003\u0000\u0000\u0229\u021a\u0001\u0000"+ + "\u0000\u0000\u0229\u0220\u0001\u0000\u0000\u0000\u022a\u022b\u0001\u0000"+ + "\u0000\u0000\u022b\u022c\u0006\u0007\u0001\u0000\u022c\u001a\u0001\u0000"+ + "\u0000\u0000\u022d\u022e\u0005@\u0000\u0000\u022e\u022f\u0007\n\u0000"+ + "\u0000\u022f\u0230\u0007\u000b\u0000\u0000\u0230\u0231\u0007\u0001\u0000"+ + "\u0000\u0231\u0259\u0007\r\u0000\u0000\u0232\u0233\u0005@\u0000\u0000"+ + "\u0233\u0234\u0007\n\u0000\u0000\u0234\u0235\u0007\u0006\u0000\u0000\u0235"+ + "\u0236\u0007\u0001\u0000\u0000\u0236\u0259\u0007\b\u0000\u0000\u0237\u0238"+ + "\u0005@\u0000\u0000\u0238\u0239\u0007\u0001\u0000\u0000\u0239\u023a\u0007"+ + "\u0019\u0000\u0000\u023a\u023b\u0007\u0003\u0000\u0000\u023b\u023c\u0007"+ + "\u0002\u0000\u0000\u023c\u023d\u0007\b\u0000\u0000\u023d\u023e\u0007\u0002"+ + "\u0000\u0000\u023e\u023f\u0007\u0007\u0000\u0000\u023f\u0240\u0007\u000b"+ + "\u0000\u0000\u0240\u0259\u0007\u0003\u0000\u0000\u0241\u0242\u0005@\u0000"+ + "\u0000\u0242\u0243\u0007\u0019\u0000\u0000\u0243\u0244\u0007\u0007\u0000"+ + "\u0000\u0244\u0245\u0007\u000b\u0000\u0000\u0245\u0246\u0007\u0003\u0000"+ + "\u0000\u0246\u0247\u0007\u0002\u0000\u0000\u0247\u0248\u0007\u0003\u0000"+ + "\u0000\u0248\u0249\u0007\u0004\u0000\u0000\u0249\u024a\u0007\u0005\u0000"+ + "\u0000\u024a\u024b\u0007\u000b\u0000\u0000\u024b\u024c\u0007\u0002\u0000"+ + "\u0000\u024c\u024d\u0007\u0003\u0000\u0000\u024d\u024e\u0007\u0000\u0000"+ + "\u0000\u024e\u024f\u0007\u0002\u0000\u0000\u024f\u0250\u0007\u0003\u0000"+ + "\u0000\u0250\u0251\u0007\n\u0000\u0000\u0251\u0259\u0007\u0006\u0000\u0000"+ + "\u0252\u0253\u0005@\u0000\u0000\u0253\u0254\u0007\u0003\u0000\u0000\u0254"+ + "\u0255\u0007\f\u0000\u0000\u0255\u0256\u0007\u0011\u0000\u0000\u0256\u0257"+ + "\u0001\u0000\u0000\u0000\u0257\u0259\u0003\u000b\u0000\u0000\u0258\u022d"+ + "\u0001\u0000\u0000\u0000\u0258\u0232\u0001\u0000\u0000\u0000\u0258\u0237"+ + "\u0001\u0000\u0000\u0000\u0258\u0241\u0001\u0000\u0000\u0000\u0258\u0252"+ + "\u0001\u0000\u0000\u0000\u0259\u025a\u0001\u0000\u0000\u0000\u025a\u025b"+ + "\u0006\b\u0001\u0000\u025b\u001c\u0001\u0000\u0000\u0000\u025c\u025d\u0005"+ + "@\u0000\u0000\u025d\u025e\u0007\u0019\u0000\u0000\u025e\u025f\u0007\u0003"+ + "\u0000\u0000\u025f\u0260\u0007\u0002\u0000\u0000\u0260\u0261\u0007\u0016"+ + "\u0000\u0000\u0261\u0262\u0007\u0004\u0000\u0000\u0262\u0263\u0007\u000b"+ + "\u0000\u0000\u0263\u0264\u0007\u0007\u0000\u0000\u0264\u0265\u0007\u0012"+ + "\u0000\u0000\u0265\u0266\u0001\u0000\u0000\u0000\u0266\u0267\u0006\t\u0002"+ + "\u0000\u0267\u0268\u0006\t\u0001\u0000\u0268\u001e\u0001\u0000\u0000\u0000"+ + "\u0269\u026a\u0005@\u0000\u0000\u026a\u026b\u0007\u0003\u0000\u0000\u026b"+ + "\u026c\u0007\f\u0000\u0000\u026c\u026d\u0007\u0011\u0000\u0000\u026d\u026e"+ + "\u0007\u0019\u0000\u0000\u026e\u026f\u0007\u0003\u0000\u0000\u026f\u0270"+ + "\u0007\u0002\u0000\u0000\u0270\u0271\u0007\u0016\u0000\u0000\u0271\u0272"+ + "\u0007\u0004\u0000\u0000\u0272\u0273\u0007\u000b\u0000\u0000\u0273\u0274"+ + "\u0007\u0007\u0000\u0000\u0274\u0275\u0007\u0012\u0000\u0000\u0275\u0276"+ + "\u0001\u0000\u0000\u0000\u0276\u0277\u0006\n\u0001\u0000\u0277 \u0001"+ + "\u0000\u0000\u0000\u0278\u0279\u0005@\u0000\u0000\u0279\u027a\u0007\u0011"+ + "\u0000\u0000\u027a\u0290\u0007\u0011\u0000\u0000\u027b\u027c\u0005@\u0000"+ + "\u0000\u027c\u027d\u0007\u0011\u0000\u0000\u027d\u027e\u0007\u000e\u0000"+ + "\u0000\u027e\u027f\u0007\u0012\u0000\u0000\u027f\u0290\u0007\r\u0000\u0000"+ + "\u0280\u0281\u0005@\u0000\u0000\u0281\u0282\u0007\u001a\u0000\u0000\u0282"+ + "\u0290\u0007\n\u0000\u0000\u0283\u0284\u0005@\u0000\u0000\u0284\u0285"+ + "\u0007\u001a\u0000\u0000\u0285\u0286\u0007\n\u0000\u0000\u0286\u0287\u0007"+ + "\u0001\u0000\u0000\u0287\u0290\u0007\f\u0000\u0000\u0288\u0289\u0005@"+ + "\u0000\u0000\u0289\u028a\u0007\u0007\u0000\u0000\u028a\u028b\u0007\f\u0000"+ + "\u0000\u028b\u028c\u0007\u001a\u0000\u0000\u028c\u028d\u0007\u0003\u0000"+ + "\u0000\u028d\u028e\u0007\u0005\u0000\u0000\u028e\u0290\u0007\u000b\u0000"+ + "\u0000\u028f\u0278\u0001\u0000\u0000\u0000\u028f\u027b\u0001\u0000\u0000"+ + "\u0000\u028f\u0280\u0001\u0000\u0000\u0000\u028f\u0283\u0001\u0000\u0000"+ + "\u0000\u028f\u0288\u0001\u0000\u0000\u0000\u0290\u0294\u0001\u0000\u0000"+ + "\u0000\u0291\u0293\u0005 \u0000\u0000\u0292\u0291\u0001\u0000\u0000\u0000"+ + "\u0293\u0296\u0001\u0000\u0000\u0000\u0294\u0292\u0001\u0000\u0000\u0000"+ + "\u0294\u0295\u0001\u0000\u0000\u0000\u0295\u0297\u0001\u0000\u0000\u0000"+ + "\u0296\u0294\u0001\u0000\u0000\u0000\u0297\u0298\u0004\u000b\u0002\u0000"+ + "\u0298\u0299\u0001\u0000\u0000\u0000\u0299\u029a\u0006\u000b\u0000\u0000"+ + "\u029a\u029b\u0006\u000b\u0001\u0000\u029b\"\u0001\u0000\u0000\u0000\u029c"+ + "\u029d\u0005@\u0000\u0000\u029d\u029e\u0007\u0003\u0000\u0000\u029e\u029f"+ + "\u0007\t\u0000\u0000\u029f\u02a0\u0007\n\u0000\u0000\u02a0\u02bd\u0007"+ + "\u0003\u0000\u0000\u02a1\u02a2\u0005@\u0000\u0000\u02a2\u02a3\u0007\u0005"+ + "\u0000\u0000\u02a3\u02a4\u0007\n\u0000\u0000\u02a4\u02a5\u0007\u0002\u0000"+ + "\u0000\u02a5\u02bd\u0007\u0000\u0000\u0000\u02a6\u02a7\u0005@\u0000\u0000"+ + "\u02a7\u02a8\u0007\u0011\u0000\u0000\u02a8\u02a9\u0007\u0003\u0000\u0000"+ + "\u02a9\u02aa\u0007\u0000\u0000\u0000\u02aa\u02ab\u0007\u0004\u0000\u0000"+ + "\u02ab\u02ac\u0007\u000e\u0000\u0000\u02ac\u02ad\u0007\t\u0000\u0000\u02ad"+ + "\u02bd\u0007\u000b\u0000\u0000\u02ae\u02af\u0005@\u0000\u0000\u02af\u02b0"+ + "\u0007\u0004\u0000\u0000\u02b0\u02b1\u0007\r\u0000\u0000\u02b1\u02b2\u0007"+ + "\r\u0000\u0000\u02b2\u02b3\u0007\u0003\u0000\u0000\u02b3\u02b4\u0007\f"+ + "\u0000\u0000\u02b4\u02bd\u0007\u0011\u0000\u0000\u02b5\u02b6\u0005@\u0000"+ + "\u0000\u02b6\u02b7\u0007\r\u0000\u0000\u02b7\u02b8\u0007\u0004\u0000\u0000"+ + "\u02b8\u02b9\u0007\u0002\u0000\u0000\u02b9\u02ba\u0007\u0003\u0000\u0000"+ + "\u02ba\u02bb\u0007\f\u0000\u0000\u02bb\u02bd\u0007\u000b\u0000\u0000\u02bc"+ + "\u029c\u0001\u0000\u0000\u0000\u02bc\u02a1\u0001\u0000\u0000\u0000\u02bc"+ + "\u02a6\u0001\u0000\u0000\u0000\u02bc\u02ae\u0001\u0000\u0000\u0000\u02bc"+ + "\u02b5\u0001\u0000\u0000\u0000\u02bd\u02be\u0001\u0000\u0000\u0000\u02be"+ + "\u02bf\u0006\f\u0001\u0000\u02bf$\u0001\u0000\u0000\u0000\u02c0\u02c1"+ + "\u0005@\u0000\u0000\u02c1\u02c2\u0007\r\u0000\u0000\u02c2\u02c3\u0007"+ + "\u0006\u0000\u0000\u02c3\u02c4\u0007\r\u0000\u0000\u02c4\u02c6\u0001\u0000"+ + "\u0000\u0000\u02c5\u02c7\u0005 \u0000\u0000\u02c6\u02c5\u0001\u0000\u0000"+ + "\u0000\u02c6\u02c7\u0001\u0000\u0000\u0000\u02c7\u02c8\u0001\u0000\u0000"+ + "\u0000\u02c8\u02c9\u0004\r\u0003\u0000\u02c9\u02ca\u0001\u0000\u0000\u0000"+ + "\u02ca\u02cb\u0006\r\u0003\u0000\u02cb\u02cc\u0006\r\u0000\u0000\u02cc"+ + "&\u0001\u0000\u0000\u0000\u02cd\u02ce\u0005@\u0000\u0000\u02ce\u02cf\u0007"+ + "\r\u0000\u0000\u02cf\u02d0\u0007\u0006\u0000\u0000\u02d0\u02d1\u0007\r"+ + "\u0000\u0000\u02d1\u02d2\u0001\u0000\u0000\u0000\u02d2\u02d3\u0006\u000e"+ + "\u0004\u0000\u02d3(\u0001\u0000\u0000\u0000\u02d4\u02d5\u0005@\u0000\u0000"+ + "\u02d5\u02d6\u0007\u0003\u0000\u0000\u02d6\u02d7\u0007\f\u0000\u0000\u02d7"+ + "\u02d8\u0007\u0011\u0000\u0000\u02d8\u02d9\u0001\u0000\u0000\u0000\u02d9"+ + "\u02da\u0003K \u0000\u02da\u02de\u0001\u0000\u0000\u0000\u02db\u02dd\u0005"+ + " \u0000\u0000\u02dc\u02db\u0001\u0000\u0000\u0000\u02dd\u02e0\u0001\u0000"+ + "\u0000\u0000\u02de\u02dc\u0001\u0000\u0000\u0000\u02de\u02df\u0001\u0000"+ + "\u0000\u0000\u02df\u02e1\u0001\u0000\u0000\u0000\u02e0\u02de\u0001\u0000"+ + "\u0000\u0000\u02e1\u02e2\u0004\u000f\u0004\u0000\u02e2\u02e3\u0001\u0000"+ + "\u0000\u0000\u02e3\u02e4\u0006\u000f\u0000\u0000\u02e4\u02e5\u0006\u000f"+ + "\u0001\u0000\u02e5*\u0001\u0000\u0000\u0000\u02e6\u02e7\u0005@\u0000\u0000"+ + "\u02e7\u02e8\u0007\u0003\u0000\u0000\u02e8\u02e9\u0007\f\u0000\u0000\u02e9"+ + "\u02ea\u0007\u0011\u0000\u0000\u02ea\u02eb\u0001\u0000\u0000\u0000\u02eb"+ + "\u02ec\u0003K \u0000\u02ec\u02ed\u0001\u0000\u0000\u0000\u02ed\u02ee\u0006"+ + "\u0010\u0001\u0000\u02ee,\u0001\u0000\u0000\u0000\u02ef\u02f0\u0005@\u0000"+ + "\u0000\u02f0\u02f1\u0007\t\u0000\u0000\u02f1\u02f2\u0007\u0007\u0000\u0000"+ + "\u02f2\u02f3\u0007\u0019\u0000\u0000\u02f3\u02f4\u0007\u0003\u0000\u0000"+ + "\u02f4\u02f5\u0007\b\u0000\u0000\u02f5\u02f6\u0007\u0007\u0000\u0000\u02f6"+ + "\u02f7\u0007\u0002\u0000\u0000\u02f7\u02f8\u0007\u0003\u0000\u0000\u02f8"+ + "\u02f9\u0007\n\u0000\u0000\u02f9\u02fa\u0007\u000b\u0000\u0000\u02fa\u02fb"+ + "\u0007\u000f\u0000\u0000\u02fb\u02fc\u0007\t\u0000\u0000\u02fc\u02fd\u0007"+ + "\u0003\u0000\u0000\u02fd\u0333\u0007\n\u0000\u0000\u02fe\u02ff\u0005@"+ + "\u0000\u0000\u02ff\u0300\u0007\u0016\u0000\u0000\u0300\u0301\u0007\u000e"+ + "\u0000\u0000\u0301\u0302\u0007\u0017\u0000\u0000\u0302\u0303\u0007\n\u0000"+ + "\u0000\u0303\u0304\u0007\u000b\u0000\u0000\u0304\u0305\u0007\u000f\u0000"+ + "\u0000\u0305\u0306\u0007\t\u0000\u0000\u0306\u0307\u0007\u0003\u0000\u0000"+ + "\u0307\u0333\u0007\n\u0000\u0000\u0308\u0309\u0005@\u0000\u0000\u0309"+ + "\u030a\u0007\t\u0000\u0000\u030a\u030b\u0007\u0007\u0000\u0000\u030b\u030c"+ + "\u0007\u0019\u0000\u0000\u030c\u030d\u0007\u0003\u0000\u0000\u030d\u030e"+ + "\u0007\b\u0000\u0000\u030e\u030f\u0007\u0007\u0000\u0000\u030f\u0310\u0007"+ + "\u0002\u0000\u0000\u0310\u0311\u0007\u0003\u0000\u0000\u0311\u0312\u0007"+ + "\n\u0000\u0000\u0312\u0313\u0007\u0005\u0000\u0000\u0313\u0314\u0007\u0002"+ + "\u0000\u0000\u0314\u0315\u0007\u0007\u0000\u0000\u0315\u0316\u0007\r\u0000"+ + "\u0000\u0316\u0317\u0007\u000b\u0000\u0000\u0317\u0333\u0007\n\u0000\u0000"+ + "\u0318\u0319\u0005@\u0000\u0000\u0319\u031a\u0007\u0016\u0000\u0000\u031a"+ + "\u031b\u0007\u000e\u0000\u0000\u031b\u031c\u0007\u0017\u0000\u0000\u031c"+ + "\u031d\u0007\n\u0000\u0000\u031d\u031e\u0007\u0005\u0000\u0000\u031e\u031f"+ + "\u0007\u0002\u0000\u0000\u031f\u0320\u0007\u0007\u0000\u0000\u0320\u0321"+ + "\u0007\r\u0000\u0000\u0321\u0322\u0007\u000b\u0000\u0000\u0322\u0333\u0007"+ + "\n\u0000\u0000\u0323\u0324\u0005@\u0000\u0000\u0324\u0325\u0007\u0005"+ + "\u0000\u0000\u0325\u0326\u0007\t\u0000\u0000\u0326\u0327\u0007\u0007\u0000"+ + "\u0000\u0327\u0328\u0007\u0005\u0000\u0000\u0328\u0329\u0007\u0017\u0000"+ + "\u0000\u0329\u032f\u0001\u0000\u0000\u0000\u032a\u032b\u0005.\u0000\u0000"+ + "\u032b\u032c\u0007\u0004\u0000\u0000\u032c\u032d\u0007\b\u0000\u0000\u032d"+ + "\u032e\u0007\u0004\u0000\u0000\u032e\u0330\u0007\u000f\u0000\u0000\u032f"+ + "\u032a\u0001\u0000\u0000\u0000\u032f\u0330\u0001\u0000\u0000\u0000\u0330"+ + "\u0331\u0001\u0000\u0000\u0000\u0331\u0333\u0005=\u0000\u0000\u0332\u02ef"+ + "\u0001\u0000\u0000\u0000\u0332\u02fe\u0001\u0000\u0000\u0000\u0332\u0308"+ + "\u0001\u0000\u0000\u0000\u0332\u0318\u0001\u0000\u0000\u0000\u0332\u0323"+ + "\u0001\u0000\u0000\u0000\u0333\u0334\u0001\u0000\u0000\u0000\u0334\u0335"+ + "\u0006\u0011\u0001\u0000\u0335.\u0001\u0000\u0000\u0000\u0336\u0337\u0005"+ + "@\u0000\u0000\u0337\u0338\u0007\u0019\u0000\u0000\u0338\u0339\u0007\u0007"+ + "\u0000\u0000\u0339\u033a\u0007\u000b\u0000\u0000\u033a\u033b\u0007\u0003"+ + "\u0000\u0000\u033b\u033f\u0001\u0000\u0000\u0000\u033c\u033e\u0005 \u0000"+ + "\u0000\u033d\u033c\u0001\u0000\u0000\u0000\u033e\u0341\u0001\u0000\u0000"+ + "\u0000\u033f\u033d\u0001\u0000\u0000\u0000\u033f\u0340\u0001\u0000\u0000"+ + "\u0000\u0340\u0342\u0001\u0000\u0000\u0000\u0341\u033f\u0001\u0000\u0000"+ + "\u0000\u0342\u0343\u0004\u0012\u0005\u0000\u0343\u0344\u0001\u0000\u0000"+ + "\u0000\u0344\u0345\u0006\u0012\u0000\u0000\u0345\u0346\u0006\u0012\u0001"+ + "\u0000\u03460\u0001\u0000\u0000\u0000\u0347\u0348\u0005@\u0000\u0000\u0348"+ + "\u034c\u0003K \u0000\u0349\u034b\u0005 \u0000\u0000\u034a\u0349\u0001"+ + "\u0000\u0000\u0000\u034b\u034e\u0001\u0000\u0000\u0000\u034c\u034a\u0001"+ + "\u0000\u0000\u0000\u034c\u034d\u0001\u0000\u0000\u0000\u034d\u034f\u0001"+ + "\u0000\u0000\u0000\u034e\u034c\u0001\u0000\u0000\u0000\u034f\u0350\u0004"+ + "\u0013\u0006\u0000\u0350\u0351\u0001\u0000\u0000\u0000\u0351\u0352\u0006"+ + "\u0013\u0000\u0000\u03522\u0001\u0000\u0000\u0000\u0353\u0354\u0005@\u0000"+ + "\u0000\u0354\u0355\u0003K \u0000\u03554\u0001\u0000\u0000\u0000\u0356"+ + "\u0358\u0005@\u0000\u0000\u0357\u0359\u0007\u001b\u0000\u0000\u0358\u0357"+ + "\u0001\u0000\u0000\u0000\u0358\u0359\u0001\u0000\u0000\u0000\u03596\u0001"+ + "\u0000\u0000\u0000\u035a\u035b\u0005{\u0000\u0000\u035b\u035c\u0005{\u0000"+ + "\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d\u035e\u0006\u0016\u0005"+ + "\u0000\u035e\u035f\u0006\u0016\u0006\u0000\u035f8\u0001\u0000\u0000\u0000"+ + "\u0360\u0361\u0005{\u0000\u0000\u0361\u0362\u0005!\u0000\u0000\u0362\u0363"+ + "\u0005!\u0000\u0000\u0363\u0364\u0001\u0000\u0000\u0000\u0364\u0365\u0006"+ + "\u0017\u0007\u0000\u0365\u0366\u0006\u0017\b\u0000\u0366:\u0001\u0000"+ + "\u0000\u0000\u0367\u0368\u0005/\u0000\u0000\u0368\u0369\u0005*\u0000\u0000"+ + "\u0369\u036d\u0001\u0000\u0000\u0000\u036a\u036c\t\u0000\u0000\u0000\u036b"+ + "\u036a\u0001\u0000\u0000\u0000\u036c\u036f\u0001\u0000\u0000\u0000\u036d"+ + "\u036e\u0001\u0000\u0000\u0000\u036d\u036b\u0001\u0000\u0000\u0000\u036e"+ + "\u0370\u0001\u0000\u0000\u0000\u036f\u036d\u0001\u0000\u0000\u0000\u0370"+ + "\u0371\u0005*\u0000\u0000\u0371\u0375\u0005/\u0000\u0000\u0372\u0373\u0005"+ + "/\u0000\u0000\u0373\u0375\u0005/\u0000\u0000\u0374\u0367\u0001\u0000\u0000"+ + "\u0000\u0374\u0372\u0001\u0000\u0000\u0000\u0375\u0376\u0001\u0000\u0000"+ + "\u0000\u0376\u0377\u0006\u0018\t\u0000\u0377<\u0001\u0000\u0000\u0000"+ + "\u0378\u0379\u0005<\u0000\u0000\u0379\u037a\u0007\u0015\u0000\u0000\u037a"+ + "\u037b\u0005-\u0000\u0000\u037b\u037c\u0001\u0000\u0000\u0000\u037c\u0388"+ + "\u0003\u000f\u0002\u0000\u037d\u037e\u0005<\u0000\u0000\u037e\u0383\u0003"+ + "\u000f\u0002\u0000\u037f\u0380\u0005:\u0000\u0000\u0380\u0381\u0005:\u0000"+ + "\u0000\u0381\u0382\u0001\u0000\u0000\u0000\u0382\u0384\u0003\u000f\u0002"+ + "\u0000\u0383\u037f\u0001\u0000\u0000\u0000\u0384\u0385\u0001\u0000\u0000"+ + "\u0000\u0385\u0383\u0001\u0000\u0000\u0000\u0385\u0386\u0001\u0000\u0000"+ + "\u0000\u0386\u0388\u0001\u0000\u0000\u0000\u0387\u0378\u0001\u0000\u0000"+ + "\u0000\u0387\u037d\u0001\u0000\u0000\u0000\u0388\u0389\u0001\u0000\u0000"+ + "\u0000\u0389\u038a\u0006\u0019\t\u0000\u038a\u038b\u0006\u0019\n\u0000"+ + "\u038b>\u0001\u0000\u0000\u0000\u038c\u038d\u0005<\u0000\u0000\u038d\u038e"+ + "\u0005/\u0000\u0000\u038e\u038f\u0001\u0000\u0000\u0000\u038f\u0390\u0003"+ + "O\"\u0000\u0390\u0394\u0005>\u0000\u0000\u0391\u0393\u0007\u001c\u0000"+ + "\u0000\u0392\u0391\u0001\u0000\u0000\u0000\u0393\u0396\u0001\u0000\u0000"+ + "\u0000\u0394\u0392\u0001\u0000\u0000\u0000\u0394\u0395\u0001\u0000\u0000"+ + "\u0000\u0395\u0398\u0001\u0000\u0000\u0000\u0396\u0394\u0001\u0000\u0000"+ + "\u0000\u0397\u038c\u0001\u0000\u0000\u0000\u0398\u0399\u0001\u0000\u0000"+ + "\u0000\u0399\u0397\u0001\u0000\u0000\u0000\u0399\u039a\u0001\u0000\u0000"+ + "\u0000\u039a\u039b\u0001\u0000\u0000\u0000\u039b\u039c\u0006\u001a\t\u0000"+ + "\u039c@\u0001\u0000\u0000\u0000\u039d\u039f\u0005 \u0000\u0000\u039e\u039d"+ + "\u0001\u0000\u0000\u0000\u039f\u03a0\u0001\u0000\u0000\u0000\u03a0\u039e"+ + "\u0001\u0000\u0000\u0000\u03a0\u03a1\u0001\u0000\u0000\u0000\u03a1\u03b7"+ + "\u0001\u0000\u0000\u0000\u03a2\u03a4\u0007\u001d\u0000\u0000\u03a3\u03a2"+ + "\u0001\u0000\u0000\u0000\u03a4\u03a5\u0001\u0000\u0000\u0000\u03a5\u03a3"+ + "\u0001\u0000\u0000\u0000\u03a5\u03a6\u0001\u0000\u0000\u0000\u03a6\u03b7"+ + "\u0001\u0000\u0000\u0000\u03a7\u03b7\u0003\u000f\u0002\u0000\u03a8\u03b7"+ + "\u0003\u0011\u0003\u0000\u03a9\u03aa\u0005\"\u0000\u0000\u03aa\u03b7\u0004"+ + "\u001b\u0007\u0000\u03ab\u03ac\u0005\\\u0000\u0000\u03ac\u03ad\u0005\'"+ + "\u0000\u0000\u03ad\u03ae\u0001\u0000\u0000\u0000\u03ae\u03b7\u0004\u001b"+ + "\b\u0000\u03af\u03b7\u0007\u001e\u0000\u0000\u03b0\u03b2\u0007\u001f\u0000"+ + "\u0000\u03b1\u03b0\u0001\u0000\u0000\u0000\u03b2\u03b3\u0001\u0000\u0000"+ + "\u0000\u03b3\u03b1\u0001\u0000\u0000\u0000\u03b3\u03b4\u0001\u0000\u0000"+ + "\u0000\u03b4\u03b7\u0001\u0000\u0000\u0000\u03b5\u03b7\u0007 \u0000\u0000"+ + "\u03b6\u039e\u0001\u0000\u0000\u0000\u03b6\u03a3\u0001\u0000\u0000\u0000"+ + "\u03b6\u03a7\u0001\u0000\u0000\u0000\u03b6\u03a8\u0001\u0000\u0000\u0000"+ + "\u03b6\u03a9\u0001\u0000\u0000\u0000\u03b6\u03ab\u0001\u0000\u0000\u0000"+ + "\u03b6\u03af\u0001\u0000\u0000\u0000\u03b6\u03b1\u0001\u0000\u0000\u0000"+ + "\u03b6\u03b5\u0001\u0000\u0000\u0000\u03b7\u03ba\u0001\u0000\u0000\u0000"+ + "\u03b8\u03b6\u0001\u0000\u0000\u0000\u03b8\u03b9\u0001\u0000\u0000\u0000"+ + "\u03b9\u03bb\u0001\u0000\u0000\u0000\u03ba\u03b8\u0001\u0000\u0000\u0000"+ + "\u03bb\u03bc\u0005<\u0000\u0000\u03bc\u03bd\u0004\u001b\t\u0000\u03bd"+ + "\u03be\u0001\u0000\u0000\u0000\u03be\u03bf\u0006\u001b\u000b\u0000\u03bf"+ + "\u03c0\u0006\u001b\f\u0000\u03c0B\u0001\u0000\u0000\u0000\u03c1\u03c3"+ + "\u0005 \u0000\u0000\u03c2\u03c1\u0001\u0000\u0000\u0000\u03c3\u03c4\u0001"+ + "\u0000\u0000\u0000\u03c4\u03c2\u0001\u0000\u0000\u0000\u03c4\u03c5\u0001"+ + "\u0000\u0000\u0000\u03c5\u03dd\u0001\u0000\u0000\u0000\u03c6\u03c8\u0007"+ + "\u001d\u0000\u0000\u03c7\u03c6\u0001\u0000\u0000\u0000\u03c8\u03c9\u0001"+ + "\u0000\u0000\u0000\u03c9\u03c7\u0001\u0000\u0000\u0000\u03c9\u03ca\u0001"+ + "\u0000\u0000\u0000\u03ca\u03dd\u0001\u0000\u0000\u0000\u03cb\u03cd\u0007"+ + "!\u0000\u0000\u03cc\u03cb\u0001\u0000\u0000\u0000\u03cc\u03cd\u0001\u0000"+ + "\u0000\u0000\u03cd\u03ce\u0001\u0000\u0000\u0000\u03ce\u03dd\u0003\u000f"+ + "\u0002\u0000\u03cf\u03dd\u0003\u0011\u0003\u0000\u03d0\u03d1\u0005\"\u0000"+ + "\u0000\u03d1\u03dd\u0004\u001c\n\u0000\u03d2\u03dd\u0005,\u0000\u0000"+ + "\u03d3\u03d4\u0005\\\u0000\u0000\u03d4\u03dd\u0005\'\u0000\u0000\u03d5"+ + "\u03dd\u0007\"\u0000\u0000\u03d6\u03d8\u0007\u001f\u0000\u0000\u03d7\u03d6"+ + "\u0001\u0000\u0000\u0000\u03d8\u03d9\u0001\u0000\u0000\u0000\u03d9\u03d7"+ + "\u0001\u0000\u0000\u0000\u03d9\u03da\u0001\u0000\u0000\u0000\u03da\u03dd"+ + "\u0001\u0000\u0000\u0000\u03db\u03dd\u0007 \u0000\u0000\u03dc\u03c2\u0001"+ + "\u0000\u0000\u0000\u03dc\u03c7\u0001\u0000\u0000\u0000\u03dc\u03cc\u0001"+ + "\u0000\u0000\u0000\u03dc\u03cf\u0001\u0000\u0000\u0000\u03dc\u03d0\u0001"+ + "\u0000\u0000\u0000\u03dc\u03d2\u0001\u0000\u0000\u0000\u03dc\u03d3\u0001"+ + "\u0000\u0000\u0000\u03dc\u03d5\u0001\u0000\u0000\u0000\u03dc\u03d7\u0001"+ + "\u0000\u0000\u0000\u03dc\u03db\u0001\u0000\u0000\u0000\u03dd\u03de\u0001"+ + "\u0000\u0000\u0000\u03de\u03dc\u0001\u0000\u0000\u0000\u03de\u03df\u0001"+ + "\u0000\u0000\u0000\u03df\u03e0\u0001\u0000\u0000\u0000\u03e0\u03e1\u0006"+ + "\u001c\t\u0000\u03e1D\u0001\u0000\u0000\u0000\u03e2\u03e4\u0005 \u0000"+ + "\u0000\u03e3\u03e2\u0001\u0000\u0000\u0000\u03e4\u03e5\u0001\u0000\u0000"+ + "\u0000\u03e5\u03e3\u0001\u0000\u0000\u0000\u03e5\u03e6\u0001\u0000\u0000"+ + "\u0000\u03e6\u03ed\u0001\u0000\u0000\u0000\u03e7\u03e9\u0007\u001d\u0000"+ + "\u0000\u03e8\u03e7\u0001\u0000\u0000\u0000\u03e9\u03ea\u0001\u0000\u0000"+ + "\u0000\u03ea\u03e8\u0001\u0000\u0000\u0000\u03ea\u03eb\u0001\u0000\u0000"+ + "\u0000\u03eb\u03ed\u0001\u0000\u0000\u0000\u03ec\u03e3\u0001\u0000\u0000"+ + "\u0000\u03ec\u03e8\u0001\u0000\u0000\u0000\u03ed\u03ee\u0001\u0000\u0000"+ + "\u0000\u03ee\u03ef\u0006\u001d\t\u0000\u03efF\u0001\u0000\u0000\u0000"+ + "\u03f0\u03f1\u0005{\u0000\u0000\u03f1\u03f6\u0005!\u0000\u0000\u03f2\u03f3"+ + "\u0005{\u0000\u0000\u03f3\u03f4\u0005{\u0000\u0000\u03f4\u03f6\u0005-"+ + "\u0000\u0000\u03f5\u03f0\u0001\u0000\u0000\u0000\u03f5\u03f2\u0001\u0000"+ + "\u0000\u0000\u03f6\u03f7\u0001\u0000\u0000\u0000\u03f7\u03f8\u0006\u001e"+ + "\t\u0000\u03f8H\u0001\u0000\u0000\u0000\u03f9\u03fa\t\u0000\u0000\u0000"+ + "\u03fa\u03fb\u0001\u0000\u0000\u0000\u03fb\u03fc\u0006\u001f\t\u0000\u03fc"+ + "J\u0001\u0000\u0000\u0000\u03fd\u0401\u0007\u0013\u0000\u0000\u03fe\u0400"+ + "\u0007#\u0000\u0000\u03ff\u03fe\u0001\u0000\u0000\u0000\u0400\u0403\u0001"+ + "\u0000\u0000\u0000\u0401\u03ff\u0001\u0000\u0000\u0000\u0401\u0402\u0001"+ + "\u0000\u0000\u0000\u0402L\u0001\u0000\u0000\u0000\u0403\u0401\u0001\u0000"+ + "\u0000\u0000\u0404\u0408\u0007$\u0000\u0000\u0405\u0407\u0007%\u0000\u0000"+ + "\u0406\u0405\u0001\u0000\u0000\u0000\u0407\u040a\u0001\u0000\u0000\u0000"+ + "\u0408\u0406\u0001\u0000\u0000\u0000\u0408\u0409\u0001\u0000\u0000\u0000"+ + "\u0409N\u0001\u0000\u0000\u0000\u040a\u0408\u0001\u0000\u0000\u0000\u040b"+ + "\u040f\u0007\u0013\u0000\u0000\u040c\u040e\u0007&\u0000\u0000\u040d\u040c"+ + "\u0001\u0000\u0000\u0000\u040e\u0411\u0001\u0000\u0000\u0000\u040f\u040d"+ + "\u0001\u0000\u0000\u0000\u040f\u0410\u0001\u0000\u0000\u0000\u0410P\u0001"+ + "\u0000\u0000\u0000\u0411\u040f\u0001\u0000\u0000\u0000\u0412\u0413\u0007"+ + "\'\u0000\u0000\u0413R\u0001\u0000\u0000\u0000\u0414\u0419\u0005\"\u0000"+ + "\u0000\u0415\u0418\u0003Q#\u0000\u0416\u0418\t\u0000\u0000\u0000\u0417"+ + "\u0415\u0001\u0000\u0000\u0000\u0417\u0416\u0001\u0000\u0000\u0000\u0418"+ + "\u041b\u0001\u0000\u0000\u0000\u0419\u041a\u0001\u0000\u0000\u0000\u0419"+ + "\u0417\u0001\u0000\u0000\u0000\u041a\u041c\u0001\u0000\u0000\u0000\u041b"+ + "\u0419\u0001\u0000\u0000\u0000\u041c\u041d\u0005\"\u0000\u0000\u041dT"+ + "\u0001\u0000\u0000\u0000\u041e\u0424\u0005\'\u0000\u0000\u041f\u0423\b"+ + "(\u0000\u0000\u0420\u0421\u0005\\\u0000\u0000\u0421\u0423\t\u0000\u0000"+ + "\u0000\u0422\u041f\u0001\u0000\u0000\u0000\u0422\u0420\u0001\u0000\u0000"+ + "\u0000\u0423\u0426\u0001\u0000\u0000\u0000\u0424\u0422\u0001\u0000\u0000"+ + "\u0000\u0424\u0425\u0001\u0000\u0000\u0000\u0425\u0427\u0001\u0000\u0000"+ + "\u0000\u0426\u0424\u0001\u0000\u0000\u0000\u0427\u0428\u0005\'\u0000\u0000"+ + "\u0428V\u0001\u0000\u0000\u0000\u0429\u042a\u0005/\u0000\u0000\u042a\u042b"+ + "\u0005/\u0000\u0000\u042b\u042f\u0001\u0000\u0000\u0000\u042c\u042e\b"+ + "\u001d\u0000\u0000\u042d\u042c\u0001\u0000\u0000\u0000\u042e\u0431\u0001"+ + "\u0000\u0000\u0000\u042f\u042d\u0001\u0000\u0000\u0000\u042f\u0430\u0001"+ + "\u0000\u0000\u0000\u0430X\u0001\u0000\u0000\u0000\u0431\u042f\u0001\u0000"+ + "\u0000\u0000\u0432\u0433\u0005$\u0000\u0000\u0433\u0434\u0003K \u0000"+ + "\u0434Z\u0001\u0000\u0000\u0000\u0435\u0436\u0007\u0004\u0000\u0000\u0436"+ + "\u0437\u0007\u0002\u0000\u0000\u0437\u0438\u0007\u0002\u0000\u0000\u0438"+ + "\u0439\u0007\u0004\u0000\u0000\u0439\u0448\u0007\u000f\u0000\u0000\u043a"+ + "\u043b\u0007\u0005\u0000\u0000\u043b\u043c\u0007\t\u0000\u0000\u043c\u043d"+ + "\u0007\u0004\u0000\u0000\u043d\u043e\u0007\n\u0000\u0000\u043e\u0448\u0007"+ + "\n\u0000\u0000\u043f\u0440\u0007\u0003\u0000\u0000\u0440\u0441\u0007\u0012"+ + "\u0000\u0000\u0441\u0442\u0007\r\u0000\u0000\u0442\u0443\u0007\u000b\u0000"+ + "\u0000\u0443\u0448\u0007\u000f\u0000\u0000\u0444\u0445\u0007\u000e\u0000"+ + "\u0000\u0445\u0446\u0007\n\u0000\u0000\u0446\u0448\u0007\u0003\u0000\u0000"+ + "\u0447\u0435\u0001\u0000\u0000\u0000\u0447\u043a\u0001\u0000\u0000\u0000"+ + "\u0447\u043f\u0001\u0000\u0000\u0000\u0447\u0444\u0001\u0000\u0000\u0000"+ + "\u0448\\\u0001\u0000\u0000\u0000\u0449\u044a\u000209\u0000\u044a^\u0001"+ + "\u0000\u0000\u0000\u044b\u044c\u0005{\u0000\u0000\u044c\u044d\u0005{\u0000"+ + "\u0000\u044d\u044e\u0005-\u0000\u0000\u044e\u044f\u0005-\u0000\u0000\u044f"+ + "\u0450\u0001\u0000\u0000\u0000\u0450\u0451\u0006*\r\u0000\u0451`\u0001"+ + "\u0000\u0000\u0000\u0452\u0453\u0005@\u0000\u0000\u0453\u0454\u0003O\""+ + "\u0000\u0454\u0455\u0005.\u0000\u0000\u0455\u0456\u0001\u0000\u0000\u0000"+ + "\u0456\u0457\u0006+\t\u0000\u0457b\u0001\u0000\u0000\u0000\u0458\u045d"+ + "\u0005@\u0000\u0000\u0459\u045b\u0003])\u0000\u045a\u045c\u0005.\u0000"+ + "\u0000\u045b\u045a\u0001\u0000\u0000\u0000\u045b\u045c\u0001\u0000\u0000"+ + "\u0000\u045c\u045e\u0001\u0000\u0000\u0000\u045d\u0459\u0001\u0000\u0000"+ + "\u0000\u045e\u045f\u0001\u0000\u0000\u0000\u045f\u045d\u0001\u0000\u0000"+ + "\u0000\u045f\u0460\u0001\u0000\u0000\u0000\u0460\u0461\u0001\u0000\u0000"+ + "\u0000\u0461\u0462\u0006,\t\u0000\u0462d\u0001\u0000\u0000\u0000\u0463"+ + "\u0464\u0005{\u0000\u0000\u0464\u0465\u0005{\u0000\u0000\u0465\u0599\u0005"+ + "{\u0000\u0000\u0466\u0467\u0005@\u0000\u0000\u0467\u0468\u0005@\u0000"+ + "\u0000\u0468\u046a\u0001\u0000\u0000\u0000\u0469\u046b\u0005@\u0000\u0000"+ + "\u046a\u0469\u0001\u0000\u0000\u0000\u046a\u046b\u0001\u0000\u0000\u0000"+ + "\u046b\u0599\u0001\u0000\u0000\u0000\u046c\u046d\u0005@\u0000\u0000\u046d"+ + "\u046e\u0005{\u0000\u0000\u046e\u0470\u0001\u0000\u0000\u0000\u046f\u0471"+ + "\u0005{\u0000\u0000\u0470\u046f\u0001\u0000\u0000\u0000\u0470\u0471\u0001"+ + "\u0000\u0000\u0000\u0471\u0599\u0001\u0000\u0000\u0000\u0472\u0473\u0005"+ + "@\u0000\u0000\u0473\u0474\u0007\u0012\u0000\u0000\u0474\u0475\u0007\u0003"+ + "\u0000\u0000\u0475\u0476\u0007\u0011\u0000\u0000\u0476\u0477\u0007\u0007"+ + "\u0000\u0000\u0477\u0478\u0007\u0004\u0000\u0000\u0478\u047a\u0001\u0000"+ + "\u0000\u0000\u0479\u047b\u0007)\u0000\u0000\u047a\u0479\u0001\u0000\u0000"+ + "\u0000\u047b\u047c\u0001\u0000\u0000\u0000\u047c\u047a\u0001\u0000\u0000"+ + "\u0000\u047c\u047d\u0001\u0000\u0000\u0000\u047d\u048f\u0001\u0000\u0000"+ + "\u0000\u047e\u047f\u0007\n\u0000\u0000\u047f\u0480\u0007\u0005\u0000\u0000"+ + "\u0480\u0481\u0007\u0002\u0000\u0000\u0481\u0482\u0007\u0003\u0000\u0000"+ + "\u0482\u0483\u0007\u0003\u0000\u0000\u0483\u0484\u0007\f\u0000\u0000\u0484"+ + "\u0486\u0001\u0000\u0000\u0000\u0485\u0487\u0007)\u0000\u0000\u0486\u0485"+ + "\u0001\u0000\u0000\u0000\u0487\u0488\u0001\u0000\u0000\u0000\u0488\u0486"+ + "\u0001\u0000\u0000\u0000\u0488\u0489\u0001\u0000\u0000\u0000\u0489\u048d"+ + "\u0001\u0000\u0000\u0000\u048a\u048b\u0007\u0004\u0000\u0000\u048b\u048c"+ + "\u0007\f\u0000\u0000\u048c\u048e\u0007\u0011\u0000\u0000\u048d\u048a\u0001"+ + "\u0000\u0000\u0000\u048d\u048e\u0001\u0000\u0000\u0000\u048e\u0490\u0001"+ + "\u0000\u0000\u0000\u048f\u047e\u0001\u0000\u0000\u0000\u048f\u0490\u0001"+ + "\u0000\u0000\u0000\u0490\u0599\u0001\u0000\u0000\u0000\u0491\u0492\u0005"+ + "@\u0000\u0000\u0492\u0493\u0007\u0005\u0000\u0000\u0493\u0494\u0007\u0006"+ + "\u0000\u0000\u0494\u0495\u0007\u0004\u0000\u0000\u0495\u0496\u0007\u0002"+ + "\u0000\u0000\u0496\u0497\u0007\n\u0000\u0000\u0497\u0498\u0007\u0003\u0000"+ + "\u0000\u0498\u0591\u0007\u000b\u0000\u0000\u0499\u049a\u0005@\u0000\u0000"+ + "\u049a\u049b\u0007\u0007\u0000\u0000\u049b\u049c\u0007\u0012\u0000\u0000"+ + "\u049c\u049d\u0007\r\u0000\u0000\u049d\u049e\u0007\u0001\u0000\u0000\u049e"+ + "\u049f\u0007\u0002\u0000\u0000\u049f\u0591\u0007\u000b\u0000\u0000\u04a0"+ + "\u04a1\u0005@\u0000\u0000\u04a1\u04a2\u0007\f\u0000\u0000\u04a2\u04a3"+ + "\u0007\u0004\u0000\u0000\u04a3\u04a4\u0007\u0012\u0000\u0000\u04a4\u04a5"+ + "\u0007\u0003\u0000\u0000\u04a5\u04a6\u0007\n\u0000\u0000\u04a6\u04a7\u0007"+ + "\r\u0000\u0000\u04a7\u04a8\u0007\u0004\u0000\u0000\u04a8\u04a9\u0007\u0005"+ + "\u0000\u0000\u04a9\u0591\u0007\u0003\u0000\u0000\u04aa\u04ab\u0005@\u0000"+ + "\u0000\u04ab\u04ac\u0007\u0011\u0000\u0000\u04ac\u04ad\u0007\u0001\u0000"+ + "\u0000\u04ad\u04ae\u0007\u0005\u0000\u0000\u04ae\u04af\u0007\u000e\u0000"+ + "\u0000\u04af\u04b0\u0007\u0012\u0000\u0000\u04b0\u04b1\u0007\u0003\u0000"+ + "\u0000\u04b1\u04b2\u0007\f\u0000\u0000\u04b2\u0591\u0007\u000b\u0000\u0000"+ + "\u04b3\u04b4\u0005@\u0000\u0000\u04b4\u04b5\u0007\u0000\u0000\u0000\u04b5"+ + "\u04b6\u0007\u0001\u0000\u0000\u04b6\u04b7\u0007\f\u0000\u0000\u04b7\u04b8"+ + "\u0007\u000b\u0000\u0000\u04b8\u04b9\u0005-\u0000\u0000\u04b9\u04ba\u0007"+ + "\u0000\u0000\u0000\u04ba\u04bb\u0007\u0004\u0000\u0000\u04bb\u04bc\u0007"+ + "\u0005\u0000\u0000\u04bc\u0591\u0007\u0003\u0000\u0000\u04bd\u04be\u0005"+ + "@\u0000\u0000\u04be\u04bf\u0007\r\u0000\u0000\u04bf\u04c0\u0007\u0004"+ + "\u0000\u0000\u04c0\u04c1\u0007\u0010\u0000\u0000\u04c1\u0591\u0007\u0003"+ + "\u0000\u0000\u04c2\u04c3\u0005@\u0000\u0000\u04c3\u04c4\u0007\t\u0000"+ + "\u0000\u04c4\u04c5\u0007\u0004\u0000\u0000\u04c5\u04c6\u0007\u000f\u0000"+ + "\u0000\u04c6\u04c7\u0007\u0003\u0000\u0000\u04c7\u0591\u0007\u0002\u0000"+ + "\u0000\u04c8\u04c9\u0005@\u0000\u0000\u04c9\u04ca\u0007\n\u0000\u0000"+ + "\u04ca\u04cb\u0007\u000e\u0000\u0000\u04cb\u04cc\u0007\r\u0000\u0000\u04cc"+ + "\u04cd\u0007\r\u0000\u0000\u04cd\u04ce\u0007\u0001\u0000\u0000\u04ce\u04cf"+ + "\u0007\u0002\u0000\u0000\u04cf\u04d0\u0007\u000b\u0000\u0000\u04d0\u0591"+ + "\u0007\n\u0000\u0000\u04d1\u04d2\u0005@\u0000\u0000\u04d2\u04d3\u0007"+ + "\u000b\u0000\u0000\u04d3\u04d4\u0007\u0004\u0000\u0000\u04d4\u04d5\u0007"+ + "\u0007\u0000\u0000\u04d5\u04d6\u0007\t\u0000\u0000\u04d6\u04d7\u0007\b"+ + "\u0000\u0000\u04d7\u04d8\u0007\u0007\u0000\u0000\u04d8\u04d9\u0007\f\u0000"+ + "\u0000\u04d9\u0591\u0007\u0011\u0000\u0000\u04da\u04db\u0005@\u0000\u0000"+ + "\u04db\u04dc\u0007\u0004\u0000\u0000\u04dc\u04dd\u0007\r\u0000\u0000\u04dd"+ + "\u04de\u0007\r\u0000\u0000\u04de\u04df\u0007\t\u0000\u0000\u04df\u0591"+ + "\u0007\u000f\u0000\u0000\u04e0\u04e1\u0005@\u0000\u0000\u04e1\u04e2\u0005"+ + "-\u0000\u0000\u04e2\u04e3\u0007\b\u0000\u0000\u04e3\u04e4\u0007\u0003"+ + "\u0000\u0000\u04e4\u04e5\u0007\u0016\u0000\u0000\u04e5\u04e6\u0007\u0017"+ + "\u0000\u0000\u04e6\u04e7\u0007\u0007\u0000\u0000\u04e7\u04e8\u0007\u000b"+ + "\u0000\u0000\u04e8\u04e9\u0005-\u0000\u0000\u04e9\u04ea\u0007\u0017\u0000"+ + "\u0000\u04ea\u04eb\u0007\u0003\u0000\u0000\u04eb\u04ec\u0007\u000f\u0000"+ + "\u0000\u04ec\u04ed\u0007\u0000\u0000\u0000\u04ed\u04ee\u0007\u0002\u0000"+ + "\u0000\u04ee\u04ef\u0007\u0004\u0000\u0000\u04ef\u04f0\u0007\u0012\u0000"+ + "\u0000\u04f0\u04f1\u0007\u0003\u0000\u0000\u04f1\u0591\u0007\n\u0000\u0000"+ + "\u04f2\u04f3\u0005@\u0000\u0000\u04f3\u04f4\u0007\u0017\u0000\u0000\u04f4"+ + "\u04f5\u0007\u0003\u0000\u0000\u04f5\u04f6\u0007\u000f\u0000\u0000\u04f6"+ + "\u04f7\u0007\u0000\u0000\u0000\u04f7\u04f8\u0007\u0002\u0000\u0000\u04f8"+ + "\u04f9\u0007\u0004\u0000\u0000\u04f9\u04fa\u0007\u0012\u0000\u0000\u04fa"+ + "\u04fb\u0007\u0003\u0000\u0000\u04fb\u0591\u0007\n\u0000\u0000\u04fc\u04fd"+ + "\u0005@\u0000\u0000\u04fd\u04fe\u0007\u0005\u0000\u0000\u04fe\u04ff\u0007"+ + "\u0001\u0000\u0000\u04ff\u0500\u0007\u000e\u0000\u0000\u0500\u0501\u0007"+ + "\f\u0000\u0000\u0501\u0502\u0007\u000b\u0000\u0000\u0502\u0503\u0007\u0003"+ + "\u0000\u0000\u0503\u0504\u0007\u0002\u0000\u0000\u0504\u0505\u0005-\u0000"+ + "\u0000\u0505\u0506\u0007\n\u0000\u0000\u0506\u0507\u0007\u000b\u0000\u0000"+ + "\u0507\u0508\u0007\u000f\u0000\u0000\u0508\u0509\u0007\t\u0000\u0000\u0509"+ + "\u0591\u0007\u0003\u0000\u0000\u050a\u050b\u0005@\u0000\u0000\u050b\u050c"+ + "\u0007\u0000\u0000\u0000\u050c\u050d\u0007\u0001\u0000\u0000\u050d\u050e"+ + "\u0007\f\u0000\u0000\u050e\u050f\u0007\u000b\u0000\u0000\u050f\u0510\u0005"+ + "-\u0000\u0000\u0510\u0511\u0007\u0000\u0000\u0000\u0511\u0512\u0007\u0003"+ + "\u0000\u0000\u0512\u0513\u0007\u0004\u0000\u0000\u0513\u0514\u0007\u000b"+ + "\u0000\u0000\u0514\u0515\u0007\u000e\u0000\u0000\u0515\u0516\u0007\u0002"+ + "\u0000\u0000\u0516\u0517\u0007\u0003\u0000\u0000\u0517\u0518\u0005-\u0000"+ + "\u0000\u0518\u0519\u0007\u0019\u0000\u0000\u0519\u051a\u0007\u0004\u0000"+ + "\u0000\u051a\u051b\u0007\t\u0000\u0000\u051b\u051c\u0007\u000e\u0000\u0000"+ + "\u051c\u051d\u0007\u0003\u0000\u0000\u051d\u0591\u0007\n\u0000\u0000\u051e"+ + "\u051f\u0005@\u0000\u0000\u051f\u0520\u0007\r\u0000\u0000\u0520\u0521"+ + "\u0007\u0002\u0000\u0000\u0521\u0522\u0007\u0001\u0000\u0000\u0522\u0523"+ + "\u0007\r\u0000\u0000\u0523\u0524\u0007\u0003\u0000\u0000\u0524\u0525\u0007"+ + "\u0002\u0000\u0000\u0525\u0526\u0007\u000b\u0000\u0000\u0526\u0591\u0007"+ + "\u000f\u0000\u0000\u0527\u0528\u0005@\u0000\u0000\u0528\u0529\u0007\n"+ + "\u0000\u0000\u0529\u052a\u0007\u0005\u0000\u0000\u052a\u052b\u0007\u0001"+ + "\u0000\u0000\u052b\u052c\u0007\r\u0000\u0000\u052c\u0591\u0007\u0003\u0000"+ + "\u0000\u052d\u052e\u0005@\u0000\u0000\u052e\u052f\u0007\n\u0000\u0000"+ + "\u052f\u0530\u0007\u000b\u0000\u0000\u0530\u0531\u0007\u0004\u0000\u0000"+ + "\u0531\u0532\u0007\u0002\u0000\u0000\u0532\u0533\u0007\u000b\u0000\u0000"+ + "\u0533\u0534\u0007\u0007\u0000\u0000\u0534\u0535\u0007\f\u0000\u0000\u0535"+ + "\u0536\u0007\u0010\u0000\u0000\u0536\u0537\u0005-\u0000\u0000\u0537\u0538"+ + "\u0007\n\u0000\u0000\u0538\u0539\u0007\u000b\u0000\u0000\u0539\u053a\u0007"+ + "\u000f\u0000\u0000\u053a\u053b\u0007\t\u0000\u0000\u053b\u0591\u0007\u0003"+ + "\u0000\u0000\u053c\u053d\u0005@\u0000\u0000\u053d\u053e\u0007\n\u0000"+ + "\u0000\u053e\u053f\u0007\u000e\u0000\u0000\u053f\u0540\u0007\r\u0000\u0000"+ + "\u0540\u0541\u0007\r\u0000\u0000\u0541\u0542\u0007\u0001\u0000\u0000\u0542"+ + "\u0543\u0007\u0002\u0000\u0000\u0543\u0544\u0007\u000b\u0000\u0000\u0544"+ + "\u0591\u0007\n\u0000\u0000\u0545\u0546\u0005@\u0000\u0000\u0546\u0547"+ + "\u0007\u0019\u0000\u0000\u0547\u0548\u0007\u0007\u0000\u0000\u0548\u0549"+ + "\u0007\u0003\u0000\u0000\u0549\u054a\u0007\b\u0000\u0000\u054a\u054b\u0005"+ + "-\u0000\u0000\u054b\u054c\u0007\u000b\u0000\u0000\u054c\u054d\u0007\u0002"+ + "\u0000\u0000\u054d\u054e\u0007\u0004\u0000\u0000\u054e\u054f\u0007\f\u0000"+ + "\u0000\u054f\u0550\u0007\n\u0000\u0000\u0550\u0551\u0007\u0007\u0000\u0000"+ + "\u0551\u0552\u0007\u000b\u0000\u0000\u0552\u0553\u0007\u0007\u0000\u0000"+ + "\u0553\u0554\u0007\u0001\u0000\u0000\u0554\u0591\u0007\f\u0000\u0000\u0555"+ + "\u0556\u0005@\u0000\u0000\u0556\u0557\u0007\u0005\u0000\u0000\u0557\u0558"+ + "\u0007\u0001\u0000\u0000\u0558\u0559\u0007\f\u0000\u0000\u0559\u055a\u0007"+ + "\u000b\u0000\u0000\u055a\u055b\u0007\u0004\u0000\u0000\u055b\u055c\u0007"+ + "\u0007\u0000\u0000\u055c\u055d\u0007\f\u0000\u0000\u055d\u055e\u0007\u0003"+ + "\u0000\u0000\u055e\u0591\u0007\u0002\u0000\u0000\u055f\u0560\u0005@\u0000"+ + "\u0000\u0560\u0561\u0007\u0005\u0000\u0000\u0561\u0562\u0007\u0001\u0000"+ + "\u0000\u0562\u0563\u0007\t\u0000\u0000\u0563\u0564\u0007\u0001\u0000\u0000"+ + "\u0564\u0565\u0007\u0002\u0000\u0000\u0565\u0566\u0005-\u0000\u0000\u0566"+ + "\u0567\u0007\r\u0000\u0000\u0567\u0568\u0007\u0002\u0000\u0000\u0568\u0569"+ + "\u0007\u0001\u0000\u0000\u0569\u056a\u0007\u0000\u0000\u0000\u056a\u056b"+ + "\u0007\u0007\u0000\u0000\u056b\u056c\u0007\t\u0000\u0000\u056c\u0591\u0007"+ + "\u0003\u0000\u0000\u056d\u056e\u0005@\u0000\u0000\u056e\u056f\u0007\n"+ + "\u0000\u0000\u056f\u0570\u0007\u000b\u0000\u0000\u0570\u0571\u0007\u000f"+ + "\u0000\u0000\u0571\u0572\u0007\t\u0000\u0000\u0572\u0573\u0007\u0003\u0000"+ + "\u0000\u0573\u0574\u0007\n\u0000\u0000\u0574\u0575\u0007\u0003\u0000\u0000"+ + "\u0575\u0591\u0007\u000b\u0000\u0000\u0576\u0577\u0005@\u0000\u0000\u0577"+ + "\u0578\u0007\u0000\u0000\u0000\u0578\u0579\u0007\u0001\u0000\u0000\u0579"+ + "\u057a\u0007\f\u0000\u0000\u057a\u057b\u0007\u000b\u0000\u0000\u057b\u057c"+ + "\u0005-\u0000\u0000\u057c\u057d\u0007\r\u0000\u0000\u057d\u057e\u0007"+ + "\u0004\u0000\u0000\u057e\u057f\u0007\t\u0000\u0000\u057f\u0580\u0007\u0003"+ + "\u0000\u0000\u0580\u0581\u0007\u000b\u0000\u0000\u0581\u0582\u0007\u000b"+ + "\u0000\u0000\u0582\u0583\u0007\u0003\u0000\u0000\u0583\u0584\u0005-\u0000"+ + "\u0000\u0584\u0585\u0007\u0019\u0000\u0000\u0585\u0586\u0007\u0004\u0000"+ + "\u0000\u0586\u0587\u0007\t\u0000\u0000\u0587\u0588\u0007\u000e\u0000\u0000"+ + "\u0588\u0589\u0007\u0003\u0000\u0000\u0589\u0591\u0007\n\u0000\u0000\u058a"+ + "\u058b\u0005@\u0000\u0000\u058b\u058c\u0007\u0012\u0000\u0000\u058c\u058d"+ + "\u0007\u0003\u0000\u0000\u058d\u058e\u0007\u0011\u0000\u0000\u058e\u058f"+ + "\u0007\u0007\u0000\u0000\u058f\u0591\u0007\u0004\u0000\u0000\u0590\u0491"+ + "\u0001\u0000\u0000\u0000\u0590\u0499\u0001\u0000\u0000\u0000\u0590\u04a0"+ + "\u0001\u0000\u0000\u0000\u0590\u04aa\u0001\u0000\u0000\u0000\u0590\u04b3"+ + "\u0001\u0000\u0000\u0000\u0590\u04bd\u0001\u0000\u0000\u0000\u0590\u04c2"+ + "\u0001\u0000\u0000\u0000\u0590\u04c8\u0001\u0000\u0000\u0000\u0590\u04d1"+ + "\u0001\u0000\u0000\u0000\u0590\u04da\u0001\u0000\u0000\u0000\u0590\u04e0"+ + "\u0001\u0000\u0000\u0000\u0590\u04f2\u0001\u0000\u0000\u0000\u0590\u04fc"+ + "\u0001\u0000\u0000\u0000\u0590\u050a\u0001\u0000\u0000\u0000\u0590\u051e"+ + "\u0001\u0000\u0000\u0000\u0590\u0527\u0001\u0000\u0000\u0000\u0590\u052d"+ + "\u0001\u0000\u0000\u0000\u0590\u053c\u0001\u0000\u0000\u0000\u0590\u0545"+ + "\u0001\u0000\u0000\u0000\u0590\u0555\u0001\u0000\u0000\u0000\u0590\u055f"+ + "\u0001\u0000\u0000\u0000\u0590\u056d\u0001\u0000\u0000\u0000\u0590\u0576"+ + "\u0001\u0000\u0000\u0000\u0590\u058a\u0001\u0000\u0000\u0000\u0591\u0595"+ + "\u0001\u0000\u0000\u0000\u0592\u0594\u0007)\u0000\u0000\u0593\u0592\u0001"+ + "\u0000\u0000\u0000\u0594\u0597\u0001\u0000\u0000\u0000\u0595\u0593\u0001"+ + "\u0000\u0000\u0000\u0595\u0596\u0001\u0000\u0000\u0000\u0596\u0599\u0001"+ + "\u0000\u0000\u0000\u0597\u0595\u0001\u0000\u0000\u0000\u0598\u0463\u0001"+ + "\u0000\u0000\u0000\u0598\u0466\u0001\u0000\u0000\u0000\u0598\u046c\u0001"+ + "\u0000\u0000\u0000\u0598\u0472\u0001\u0000\u0000\u0000\u0598\u0590\u0001"+ + "\u0000\u0000\u0000\u0599\u059a\u0001\u0000\u0000\u0000\u059a\u059b\u0006"+ + "-\t\u0000\u059bf\u0001\u0000\u0000\u0000\u059c\u059d\t\u0000\u0000\u0000"+ + "\u059d\u059e\u0004.\u000b\u0000\u059e\u059f\u0001\u0000\u0000\u0000\u059f"+ + "\u05a0\u0006.\u000e\u0000\u05a0\u05a1\u0006.\u000f\u0000\u05a1h\u0001"+ + "\u0000\u0000\u0000\u05a2\u05a3\t\u0000\u0000\u0000\u05a3\u05a4\u0001\u0000"+ + "\u0000\u0000\u05a4\u05a5\u0006/\f\u0000\u05a5j\u0001\u0000\u0000\u0000"+ + "\u05a6\u05a7\u0005\u0000\u0000\u0001\u05a7\u05a8\u0001\u0000\u0000\u0000"+ + "\u05a8\u05a9\u00060\u000e\u0000\u05a9\u05aa\u00060\u000f\u0000\u05aal"+ + "\u0001\u0000\u0000\u0000\u05ab\u05ac\u0005}\u0000\u0000\u05ac\u05ad\u0005"+ + "}\u0000\u0000\u05ad\u05ae\u0001\u0000\u0000\u0000\u05ae\u05af\u00061\u000f"+ + "\u0000\u05af\u05b0\u00061\u0006\u0000\u05b0n\u0001\u0000\u0000\u0000\u05b1"+ + "\u05b3\b*\u0000\u0000\u05b2\u05b1\u0001\u0000\u0000\u0000\u05b3\u05b4"+ + "\u0001\u0000\u0000\u0000\u05b4\u05b2\u0001\u0000\u0000\u0000\u05b4\u05b5"+ + "\u0001\u0000\u0000\u0000\u05b5\u05b6\u0001\u0000\u0000\u0000\u05b6\u05b7"+ + "\u00062\u0010\u0000\u05b7p\u0001\u0000\u0000\u0000\u05b8\u05bc\t\u0000"+ + "\u0000\u0000\u05b9\u05bb\u0007)\u0000\u0000\u05ba\u05b9\u0001\u0000\u0000"+ + "\u0000\u05bb\u05be\u0001\u0000\u0000\u0000\u05bc\u05ba\u0001\u0000\u0000"+ + "\u0000\u05bc\u05bd\u0001\u0000\u0000\u0000\u05bd\u05bf\u0001\u0000\u0000"+ + "\u0000\u05be\u05bc\u0001\u0000\u0000\u0000\u05bf\u05c0\u00063\u0011\u0000"+ + "\u05c0r\u0001\u0000\u0000\u0000\u05c1\u05c2\u0005\u0000\u0000\u0001\u05c2"+ + "\u05c3\u0001\u0000\u0000\u0000\u05c3\u05c4\u00064\u0012\u0000\u05c4\u05c5"+ + "\u00064\u000f\u0000\u05c5t\u0001\u0000\u0000\u0000\u05c6\u05c7\u0005!"+ + "\u0000\u0000\u05c7\u05c8\u0005!\u0000\u0000\u05c8\u05c9\u0005}\u0000\u0000"+ + "\u05c9\u05ca\u0001\u0000\u0000\u0000\u05ca\u05cb\u00065\u000f\u0000\u05cb"+ + "\u05cc\u00065\b\u0000\u05ccv\u0001\u0000\u0000\u0000\u05cd\u05cf\b+\u0000"+ + "\u0000\u05ce\u05cd\u0001\u0000\u0000\u0000\u05cf\u05d0\u0001\u0000\u0000"+ + "\u0000\u05d0\u05ce\u0001\u0000\u0000\u0000\u05d0\u05d1\u0001\u0000\u0000"+ + "\u0000\u05d1\u05d2\u0001\u0000\u0000\u0000\u05d2\u05d3\u00066\u0013\u0000"+ + "\u05d3x\u0001\u0000\u0000\u0000\u05d4\u05d8\t\u0000\u0000\u0000\u05d5"+ + "\u05d7\u0007)\u0000\u0000\u05d6\u05d5\u0001\u0000\u0000\u0000\u05d7\u05da"+ + "\u0001\u0000\u0000\u0000\u05d8\u05d6\u0001\u0000\u0000\u0000\u05d8\u05d9"+ + "\u0001\u0000\u0000\u0000\u05d9\u05db\u0001\u0000\u0000\u0000\u05da\u05d8"+ + "\u0001\u0000\u0000\u0000\u05db\u05dc\u00067\u0014\u0000\u05dcz\u0001\u0000"+ + "\u0000\u0000\u05dd\u05de\u0005\u0000\u0000\u0001\u05de\u05df\u0001\u0000"+ + "\u0000\u0000\u05df\u05e0\u00068\u0012\u0000\u05e0\u05e1\u00068\u000f\u0000"+ + "\u05e1|\u0001\u0000\u0000\u0000\u05e2\u05e3\u0005(\u0000\u0000\u05e3\u05e4"+ + "\u00069\u0015\u0000\u05e4\u05e5\u0001\u0000\u0000\u0000\u05e5\u05e6\u0006"+ + "9\u0016\u0000\u05e6~\u0001\u0000\u0000\u0000\u05e7\u05e8\u0003K \u0000"+ + "\u05e8\u05e9\u0001\u0000\u0000\u0000\u05e9\u05ea\u0006:\u0012\u0000\u05ea"+ + "\u05eb\u0006:\u000f\u0000\u05eb\u0080\u0001\u0000\u0000\u0000\u05ec\u05ed"+ + "\t\u0000\u0000\u0000\u05ed\u05ee\u0001\u0000\u0000\u0000\u05ee\u05ef\u0006"+ + ";\u0012\u0000\u05ef\u05f0\u0006;\u000f\u0000\u05f0\u0082\u0001\u0000\u0000"+ + "\u0000\u05f1\u05f2\u0004<\f\u0000\u05f2\u05f3\u0005(\u0000\u0000\u05f3"+ + "\u05f4\u0006<\u0017\u0000\u05f4\u05f5\u0006<\u0018\u0000\u05f5\u0084\u0001"+ + "\u0000\u0000\u0000\u05f6\u05f7\u0004=\r\u0000\u05f7\u05f8\u0005)\u0000"+ + "\u0000\u05f8\u05f9\u0006=\u0019\u0000\u05f9\u05fa\u0001\u0000\u0000\u0000"+ + "\u05fa\u05fb\u0006=\u001a\u0000\u05fb\u05fc\u0006=\u001b\u0000\u05fc\u0086"+ + "\u0001\u0000\u0000\u0000\u05fd\u05fe\u0004>\u000e\u0000\u05fe\u05ff\u0005"+ + "(\u0000\u0000\u05ff\u0600\u0006>\u001c\u0000\u0600\u0601\u0006>\u001d"+ + "\u0000\u0601\u0088\u0001\u0000\u0000\u0000\u0602\u0603\u0004?\u000f\u0000"+ + "\u0603\u0604\u0005)\u0000\u0000\u0604\u0605\u0006?\u001e\u0000\u0605\u0606"+ + "\u0006?\u001f\u0000\u0606\u008a\u0001\u0000\u0000\u0000\u0607\u0608\t"+ + "\u0000\u0000\u0000\u0608\u0609\u0004@\u0010\u0000\u0609\u060a\u0001\u0000"+ + "\u0000\u0000\u060a\u060b\u0006@ \u0000\u060b\u008c\u0001\u0000\u0000\u0000"+ + "\u060c\u060d\u0005/\u0000\u0000\u060d\u060e\u0005*\u0000\u0000\u060e\u0612"+ + "\u0001\u0000\u0000\u0000\u060f\u0611\t\u0000\u0000\u0000\u0610\u060f\u0001"+ + "\u0000\u0000\u0000\u0611\u0614\u0001\u0000\u0000\u0000\u0612\u0613\u0001"+ + "\u0000\u0000\u0000\u0612\u0610\u0001\u0000\u0000\u0000\u0613\u0615\u0001"+ + "\u0000\u0000\u0000\u0614\u0612\u0001\u0000\u0000\u0000\u0615\u0616\u0005"+ + "*\u0000\u0000\u0616\u0617\u0005/\u0000\u0000\u0617\u0618\u0001\u0000\u0000"+ + "\u0000\u0618\u0619\u0006A!\u0000\u0619\u008e\u0001\u0000\u0000\u0000\u061a"+ + "\u061b\t\u0000\u0000\u0000\u061b\u061c\u0006B\"\u0000\u061c\u0090\u0001"+ + "\u0000\u0000\u0000\u061d\u061e\u0005\u0000\u0000\u0001\u061e\u061f\u0001"+ + "\u0000\u0000\u0000\u061f\u0620\u0006C\u0012\u0000\u0620\u0621\u0006C\u001b"+ + "\u0000\u0621\u0092\u0001\u0000\u0000\u0000\u0622\u0623\u0005@\u0000\u0000"+ + "\u0623\u0624\u0007\u0003\u0000\u0000\u0624\u0625\u0007\f\u0000\u0000\u0625"+ + "\u0626\u0007\u0011\u0000\u0000\u0626\u0627\u0007\r\u0000\u0000\u0627\u0628"+ + "\u0007\u0006\u0000\u0000\u0628\u0629\u0007\r\u0000\u0000\u0629\u062a\u0001"+ + "\u0000\u0000\u0000\u062a\u062b\u0006D\u000f\u0000\u062b\u0094\u0001\u0000"+ + "\u0000\u0000\u062c\u062d\t\u0000\u0000\u0000\u062d\u062e\u0004E\u0011"+ + "\u0000\u062e\u062f\u0001\u0000\u0000\u0000\u062f\u0630\u0006E#\u0000\u0630"+ + "\u0096\u0001\u0000\u0000\u0000\u0631\u0632\t\u0000\u0000\u0000\u0632\u0633"+ + "\u0001\u0000\u0000\u0000\u0633\u0634\u0006F\f\u0000\u0634\u0098\u0001"+ + "\u0000\u0000\u0000\u0635\u0636\u0005\u0000\u0000\u0001\u0636\u0637\u0001"+ + "\u0000\u0000\u0000\u0637\u0638\u0006G\u0012\u0000\u0638\u0639\u0006G\u000f"+ + "\u0000\u0639\u009a\u0001\u0000\u0000\u0000\u063a\u063b\u0005@\u0000\u0000"+ + "\u063b\u063c\u0007\u0003\u0000\u0000\u063c\u063d\u0007\f\u0000\u0000\u063d"+ + "\u063e\u0007\u0011\u0000\u0000\u063e\u063f\u0007\u0019\u0000\u0000\u063f"+ + "\u0640\u0007\u0003\u0000\u0000\u0640\u0641\u0007\u0002\u0000\u0000\u0641"+ + "\u0642\u0007\u0016\u0000\u0000\u0642\u0643\u0007\u0004\u0000\u0000\u0643"+ + "\u0644\u0007\u000b\u0000\u0000\u0644\u0645\u0007\u0007\u0000\u0000\u0645"+ + "\u0646\u0007\u0012\u0000\u0000\u0646\u0647\u0001\u0000\u0000\u0000\u0647"+ + "\u0648\u0006H\u0001\u0000\u0648\u0649\u0006H\u000f\u0000\u0649\u009c\u0001"+ + "\u0000\u0000\u0000\u064a\u064b\t\u0000\u0000\u0000\u064b\u064c\u0004I"+ + "\u0012\u0000\u064c\u064d\u0001\u0000\u0000\u0000\u064d\u064e\u0006I\t"+ + "\u0000\u064e\u009e\u0001\u0000\u0000\u0000\u064f\u0650\t\u0000\u0000\u0000"+ + "\u0650\u0651\u0001\u0000\u0000\u0000\u0651\u0652\u0006J\f\u0000\u0652"+ + "\u00a0\u0001\u0000\u0000\u0000\u0653\u0654\u0005\u0000\u0000\u0001\u0654"+ + "\u0655\u0001\u0000\u0000\u0000\u0655\u0656\u0006K\u0012\u0000\u0656\u0657"+ + "\u0006K\u000f\u0000\u0657\u00a2\u0001\u0000\u0000\u0000\u0658\u0659\u0005"+ + ":\u0000\u0000\u0659\u065a\u0003O\"\u0000\u065a\u065b\u0005=\u0000\u0000"+ + "\u065b\u065c\u0005\"\u0000\u0000\u065c\u065d\u0001\u0000\u0000\u0000\u065d"+ + "\u065e\u0006L\t\u0000\u065e\u065f\u0006L$\u0000\u065f\u00a4\u0001\u0000"+ + "\u0000\u0000\u0660\u0661\u0005{\u0000\u0000\u0661\u0662\u0005{\u0000\u0000"+ + "\u0662\u0663\u0001\u0000\u0000\u0000\u0663\u0664\u0006M\u0005\u0000\u0664"+ + "\u0665\u0006M\u0006\u0000\u0665\u00a6\u0001\u0000\u0000\u0000\u0666\u0667"+ + "\u0005{\u0000\u0000\u0667\u0668\u0005!\u0000\u0000\u0668\u0669\u0005!"+ + "\u0000\u0000\u0669\u066a\u0001\u0000\u0000\u0000\u066a\u066b\u0006N\u0007"+ + "\u0000\u066b\u066c\u0006N\b\u0000\u066c\u00a8\u0001\u0000\u0000\u0000"+ + "\u066d\u066e\u0005>\u0000\u0000\u066e\u066f\u0001\u0000\u0000\u0000\u066f"+ + "\u0670\u0006O\t\u0000\u0670\u0671\u0006O\u000f\u0000\u0671\u00aa\u0001"+ + "\u0000\u0000\u0000\u0672\u0673\t\u0000\u0000\u0000\u0673\u0674\u0001\u0000"+ + "\u0000\u0000\u0674\u0675\u0006P\t\u0000\u0675\u00ac\u0001\u0000\u0000"+ + "\u0000\u0676\u0677\u0005\u0000\u0000\u0001\u0677\u0678\u0001\u0000\u0000"+ + "\u0000\u0678\u0679\u0006Q\u0012\u0000\u0679\u067a\u0006Q\u000f\u0000\u067a"+ + "\u00ae\u0001\u0000\u0000\u0000\u067b\u067c\u0005\"\u0000\u0000\u067c\u067d"+ + "\u0001\u0000\u0000\u0000\u067d\u067e\u0006R\t\u0000\u067e\u067f\u0006"+ + "R\u000f\u0000\u067f\u00b0\u0001\u0000\u0000\u0000\u0680\u0681\t\u0000"+ + "\u0000\u0000\u0681\u0682\u0004S\u0013\u0000\u0682\u0683\u0001\u0000\u0000"+ + "\u0000\u0683\u0684\u0006S \u0000\u0684\u00b2\u0001\u0000\u0000\u0000\u0685"+ + "\u0686\t\u0000\u0000\u0000\u0686\u0687\u0001\u0000\u0000\u0000\u0687\u0688"+ + "\u0006T\f\u0000\u0688\u00b4\u0001\u0000\u0000\u0000\u0689\u068a\u0005"+ + "\u0000\u0000\u0001\u068a\u068b\u0001\u0000\u0000\u0000\u068b\u068c\u0006"+ + "U\u0012\u0000\u068c\u068d\u0006U\u000f\u0000\u068d\u00b6\u0001\u0000\u0000"+ + "\u0000\u068e\u0690\u0005{\u0000\u0000\u068f\u0691\u0007(\u0000\u0000\u0690"+ + "\u068f\u0001\u0000\u0000\u0000\u0690\u0691\u0001\u0000\u0000\u0000\u0691"+ + "\u0692\u0001\u0000\u0000\u0000\u0692\u0694\u0003O\"\u0000\u0693\u0695"+ + "\u0007(\u0000\u0000\u0694\u0693\u0001\u0000\u0000\u0000\u0694\u0695\u0001"+ + "\u0000\u0000\u0000\u0695\u0697\u0001\u0000\u0000\u0000\u0696\u0698\u0005"+ + ":\u0000\u0000\u0697\u0696\u0001\u0000\u0000\u0000\u0698\u0699\u0001\u0000"+ + "\u0000\u0000\u0699\u0697\u0001\u0000\u0000\u0000\u0699\u069a\u0001\u0000"+ + "\u0000\u0000\u069a\u069c\u0001\u0000\u0000\u0000\u069b\u069d\u0007(\u0000"+ + "\u0000\u069c\u069b\u0001\u0000\u0000\u0000\u069c\u069d\u0001\u0000\u0000"+ + "\u0000\u069d\u069f\u0001\u0000\u0000\u0000\u069e\u06a0\u0003O\"\u0000"+ + "\u069f\u069e\u0001\u0000\u0000\u0000\u069f\u06a0\u0001\u0000\u0000\u0000"+ + "\u06a0\u06a2\u0001\u0000\u0000\u0000\u06a1\u06a3\u0007(\u0000\u0000\u06a2"+ + "\u06a1\u0001\u0000\u0000\u0000\u06a2\u06a3\u0001\u0000\u0000\u0000\u06a3"+ + "\u06ba\u0001\u0000\u0000\u0000\u06a4\u06a6\u0005,\u0000\u0000\u06a5\u06a7"+ + "\u0007(\u0000\u0000\u06a6\u06a5\u0001\u0000\u0000\u0000\u06a6\u06a7\u0001"+ + "\u0000\u0000\u0000\u06a7\u06a8\u0001\u0000\u0000\u0000\u06a8\u06aa\u0003"+ + "O\"\u0000\u06a9\u06ab\u0007(\u0000\u0000\u06aa\u06a9\u0001\u0000\u0000"+ + "\u0000\u06aa\u06ab\u0001\u0000\u0000\u0000\u06ab\u06ad\u0001\u0000\u0000"+ + "\u0000\u06ac\u06ae\u0005:\u0000\u0000\u06ad\u06ac\u0001\u0000\u0000\u0000"+ + "\u06ae\u06af\u0001\u0000\u0000\u0000\u06af\u06ad\u0001\u0000\u0000\u0000"+ + "\u06af\u06b0\u0001\u0000\u0000\u0000\u06b0\u06b2\u0001\u0000\u0000\u0000"+ + "\u06b1\u06b3\u0007(\u0000\u0000\u06b2\u06b1\u0001\u0000\u0000\u0000\u06b2"+ + "\u06b3\u0001\u0000\u0000\u0000\u06b3\u06b4\u0001\u0000\u0000\u0000\u06b4"+ + "\u06b6\u0003O\"\u0000\u06b5\u06b7\u0007(\u0000\u0000\u06b6\u06b5\u0001"+ + "\u0000\u0000\u0000\u06b6\u06b7\u0001\u0000\u0000\u0000\u06b7\u06b9\u0001"+ + "\u0000\u0000\u0000\u06b8\u06a4\u0001\u0000\u0000\u0000\u06b9\u06bc\u0001"+ + "\u0000\u0000\u0000\u06ba\u06b8\u0001\u0000\u0000\u0000\u06ba\u06bb\u0001"+ + "\u0000\u0000\u0000\u06bb\u06be\u0001\u0000\u0000\u0000\u06bc\u06ba\u0001"+ + "\u0000\u0000\u0000\u06bd\u06bf\u0005,\u0000\u0000\u06be\u06bd\u0001\u0000"+ + "\u0000\u0000\u06be\u06bf\u0001\u0000\u0000\u0000\u06bf\u06c0\u0001\u0000"+ + "\u0000\u0000\u06c0\u06c1\u0005}\u0000\u0000\u06c1\u06c2\u0001\u0000\u0000"+ + "\u0000\u06c2\u06c3\u0006V\f\u0000\u06c3\u00b8\u0001\u0000\u0000\u0000"+ + "\u06c4\u06c5\u0005{\u0000\u0000\u06c5\u06c6\u0005$\u0000\u0000\u06c6\u06cf"+ + "\u0003O\"\u0000\u06c7\u06c8\u0005[\u0000\u0000\u06c8\u06c9\u0007(\u0000"+ + "\u0000\u06c9\u06ca\u0003O\"\u0000\u06ca\u06cb\u0007(\u0000\u0000\u06cb"+ + "\u06cc\u0005]\u0000\u0000\u06cc\u06ce\u0001\u0000\u0000\u0000\u06cd\u06c7"+ + "\u0001\u0000\u0000\u0000\u06ce\u06d1\u0001\u0000\u0000\u0000\u06cf\u06cd"+ + "\u0001\u0000\u0000\u0000\u06cf\u06d0\u0001\u0000\u0000\u0000\u06d0\u06d2"+ + "\u0001\u0000\u0000\u0000\u06d1\u06cf\u0001\u0000\u0000\u0000\u06d2\u06d3"+ + "\u0005:\u0000\u0000\u06d3\u06d4\u0005:\u0000\u0000\u06d4\u06d5\u0001\u0000"+ + "\u0000\u0000\u06d5\u06d6\u0003O\"\u0000\u06d6\u06d7\u0005}\u0000\u0000"+ + "\u06d7\u06d8\u0001\u0000\u0000\u0000\u06d8\u06d9\u0006W\f\u0000\u06d9"+ + "\u00ba\u0001\u0000\u0000\u0000\u06da\u06db\u0005{\u0000\u0000\u06db\u06dc"+ + "\u0005$\u0000\u0000\u06dc\u06e6\u0003O\"\u0000\u06dd\u06de\u0005[\u0000"+ + "\u0000\u06de\u06e0\u0007(\u0000\u0000\u06df\u06e1\u0003O\"\u0000\u06e0"+ + "\u06df\u0001\u0000\u0000\u0000\u06e0\u06e1\u0001\u0000\u0000\u0000\u06e1"+ + "\u06e2\u0001\u0000\u0000\u0000\u06e2\u06e3\u0007(\u0000\u0000\u06e3\u06e5"+ + "\u0005]\u0000\u0000\u06e4\u06dd\u0001\u0000\u0000\u0000\u06e5\u06e8\u0001"+ + "\u0000\u0000\u0000\u06e6\u06e4\u0001\u0000\u0000\u0000\u06e6\u06e7\u0001"+ + "\u0000\u0000\u0000\u06e7\u06f0\u0001\u0000\u0000\u0000\u06e8\u06e6\u0001"+ + "\u0000\u0000\u0000\u06e9\u06ea\u0005:\u0000\u0000\u06ea\u06ec\u0005:\u0000"+ + "\u0000\u06eb\u06e9\u0001\u0000\u0000\u0000\u06ec\u06ed\u0001\u0000\u0000"+ + "\u0000\u06ed\u06eb\u0001\u0000\u0000\u0000\u06ed\u06ee\u0001\u0000\u0000"+ + "\u0000\u06ee\u06ef\u0001\u0000\u0000\u0000\u06ef\u06f1\u0003O\"\u0000"+ + "\u06f0\u06eb\u0001\u0000\u0000\u0000\u06f0\u06f1\u0001\u0000\u0000\u0000"+ + "\u06f1\u06f6\u0001\u0000\u0000\u0000\u06f2\u06f4\u0005:\u0000\u0000\u06f3"+ + "\u06f5\u0003O\"\u0000\u06f4\u06f3\u0001\u0000\u0000\u0000\u06f4\u06f5"+ + "\u0001\u0000\u0000\u0000\u06f5\u06f7\u0001\u0000\u0000\u0000\u06f6\u06f2"+ + "\u0001\u0000\u0000\u0000\u06f7\u06f8\u0001\u0000\u0000\u0000\u06f8\u06f6"+ + "\u0001\u0000\u0000\u0000\u06f8\u06f9\u0001\u0000\u0000\u0000\u06f9\u06fa"+ + "\u0001\u0000\u0000\u0000\u06fa\u06fb\u0005}\u0000\u0000\u06fb\u06ff\u0001"+ + "\u0000\u0000\u0000\u06fc\u06fd\u0005:\u0000\u0000\u06fd\u06ff\u0005$\u0000"+ + "\u0000\u06fe\u06da\u0001\u0000\u0000\u0000\u06fe\u06fc\u0001\u0000\u0000"+ + "\u0000\u06ff\u0700\u0001\u0000\u0000\u0000\u0700\u0701\u0006X\u0012\u0000"+ + "\u0701\u00bc\u0001\u0000\u0000\u0000\u0702\u0703\u0005\\\u0000\u0000\u0703"+ + "\u0704\u0005\"\u0000\u0000\u0704\u0705\u0001\u0000\u0000\u0000\u0705\u0706"+ + "\u0006Y\f\u0000\u0706\u00be\u0001\u0000\u0000\u0000\u0707\u0708\u0005"+ + "\"\u0000\u0000\u0708\u0709\u0001\u0000\u0000\u0000\u0709\u070a\u0006Z"+ + "\f\u0000\u070a\u070b\u0006Z\u000f\u0000\u070b\u00c0\u0001\u0000\u0000"+ + "\u0000\u070c\u070d\t\u0000\u0000\u0000\u070d\u070e\u0001\u0000\u0000\u0000"+ + "\u070e\u070f\u0006[\f\u0000\u070f\u00c2\u0001\u0000\u0000\u0000\u0710"+ + "\u0711\u0005\u0000\u0000\u0001\u0711\u0712\u0001\u0000\u0000\u0000\u0712"+ + "\u0713\u0006\\\u0012\u0000\u0713\u0714\u0006\\\u000f\u0000\u0714\u00c4"+ + "\u0001\u0000\u0000\u0000\u0715\u0716\u0005-\u0000\u0000\u0716\u0717\u0005"+ + "-\u0000\u0000\u0717\u0718\u0005}\u0000\u0000\u0718\u0719\u0005}\u0000"+ + "\u0000\u0719\u071a\u0001\u0000\u0000\u0000\u071a\u071b\u0006]\u000f\u0000"+ + "\u071b\u00c6\u0001\u0000\u0000\u0000\u071c\u071d\t\u0000\u0000\u0000\u071d"+ + "\u071e\u0004^\u0014\u0000\u071e\u071f\u0001\u0000\u0000\u0000\u071f\u0720"+ + "\u0006^%\u0000\u0720\u00c8\u0001\u0000\u0000\u0000\u0721\u0722\t\u0000"+ + "\u0000\u0000\u0722\u0723\u0001\u0000\u0000\u0000\u0723\u0724\u0006_\f"+ + "\u0000\u0724\u00ca\u0001\u0000\u0000\u0000\u0725\u0726\u0005\u0000\u0000"+ + "\u0001\u0726\u0727\u0001\u0000\u0000\u0000\u0727\u0728\u0006`%\u0000\u0728"+ + "\u0729\u0006`\u000f\u0000\u0729\u00cc\u0001\u0000\u0000\u0000g\u0000\u0001"+ + "\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u00d5\u0112\u0131\u014d\u0153"+ + "\u015f\u016d\u0173\u0175\u0193\u0198\u020d\u0212\u0229\u0258\u028f\u0294"+ + "\u02bc\u02c6\u02de\u032f\u0332\u033f\u034c\u0358\u036d\u0374\u0385\u0387"+ + "\u0394\u0399\u03a0\u03a5\u03b3\u03b6\u03b8\u03c4\u03c9\u03cc\u03d9\u03dc"+ + "\u03de\u03e5\u03ea\u03ec\u03f5\u0401\u0408\u040f\u0417\u0419\u0422\u0424"+ + "\u042f\u0447\u045b\u045f\u046a\u0470\u047c\u0488\u048d\u048f\u0590\u0595"+ + "\u0598\u05b4\u05bc\u05d0\u05d8\u0612\u0690\u0694\u0699\u069c\u069f\u06a2"+ + "\u06a6\u06aa\u06af\u06b2\u06b6\u06ba\u06be\u06cf\u06e0\u06e6\u06ed\u06f0"+ + "\u06f4\u06f8\u06fe&\u0005\u0004\u0000\u0007\u0001\u0000\u0005\u0007\u0000"+ + "\u0007\f\u0000\u0005\u0006\u0000\u0005\u0002\u0000\u0007\u0006\u0000\u0005"+ + "\u0003\u0000\u0007\u0005\u0000\u0007\u0007\u0000\u0005\b\u0000\u0005\u0001"+ + "\u0000\u0003\u0000\u0000\u0005\n\u0000\u0007\b\u0000\u0004\u0000\u0000"+ + "\u00012\u0000\u00013\u0001\u0007\t\u0000\u00016\u0002\u00017\u0003\u0001"+ + "9\u0004\u0005\u0005\u0000\u0001<\u0005\u0001<\u0006\u0001=\u0007\u0007"+ + "\u0002\u0000\u0002\u0000\u0000\u0001>\b\u0001>\t\u0001?\n\u0001?\u000b"+ + "\u0007\u0003\u0000\u0006\u0000\u0000\u0001B\f\u0000\u0002\u0000\u0005"+ + "\t\u0000\u0007\n\u0000"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 index 2a9635e5c4df..c285838d54a3 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 @@ -233,13 +233,13 @@ PHP_INLINE_START : ('pushMode(INSIDE_PHP_INLINE); -HTML_COMPONENT_PREFIX : ''}? ->type(HTML_COMPONENT_PREFIX); JS_SCRIPT : ('$'? '(' StringParam | FullIdentifier ')' ('.' NameString)? | JsFunctionStart ('.' JsFunctionStart)*) ->skip; HTML_TAG_START : '<' FullIdentifier; HTML_CLOSE_TAG : ('')+ ->skip; -HTML_TAG_SELF_CLOSE : '/>' {this.compomentTagOpen = false;}->type(HTML); -HTML_CLOSE_SYMBOL : '>' {this.compomentTagOpen = false;} ->type(HTML); +HTML_TAG_SELF_CLOSE : '/>' {this.setComponentTagOpenStatus(false);}->type(HTML); +HTML_CLOSE_SYMBOL : '>' {this.setComponentTagOpenStatus(false);} ->type(HTML); STRING_PATH : ('"' HTML_PATH* '"' | [\\'] HTML_PATH [\\'])->skip; HTML_PATH : (' ')* FullIdentifier ('/' FullIdentifier)+ ('.' NameString)? ('?' NameString (EQ NameString)*)? ->skip; HTML_TEXT : (' ')* FullIdentifier ((' ')+ FullIdentifier)+ ->skip; @@ -303,15 +303,15 @@ L_OTHER : . ->type(HTML), popMode; //{{}}, @if, @foreach mode INSIDE_PHP_EXPRESSION; -OPEN_EXPR_PAREN : {this.roundParenBalance == 0}? '(' {this.increaseRoundParenBalance();} ->more; -CLOSE_EXPR_PAREN : {this.roundParenBalance == 1}? ')' +OPEN_EXPR_PAREN : {this.getRoundParenBalance() == 0}? '(' {this.increaseRoundParenBalance();} ->more; +CLOSE_EXPR_PAREN : {this.getRoundParenBalance() == 1}? ')' {this.decreaseRoundParenBalance();}->type(PHP_EXPRESSION),mode(DEFAULT_MODE); -LPAREN : {this.roundParenBalance > 0}? '(' {this.increaseRoundParenBalance();}->more; -RPAREN : {this.roundParenBalance > 0}? ')' {this.decreaseRoundParenBalance();}->more; +LPAREN : {this.getRoundParenBalance() > 0}? '(' {this.increaseRoundParenBalance();}->more; +RPAREN : {this.getRoundParenBalance() > 0}? ')' {this.decreaseRoundParenBalance();}->more; //in case of lexer restart context -EXIT_RPAREN : ')' {this.roundParenBalance == 0}?->type(PHP_EXPRESSION),mode(DEFAULT_MODE); +EXIT_RPAREN : ')' {this.getRoundParenBalance() == 0}?->type(PHP_EXPRESSION),mode(DEFAULT_MODE); PHP_EXPRESSION_MORE : . ->more; @@ -321,18 +321,18 @@ EXIT_EOF : EOF->type(ERROR),popMode; mode LOOK_FOR_PHP_COMPOSED_EXPRESSION; WS_COMPOSED_EXPR : [ ]+->skip; -BLADE_EXPR_LPAREN : '(' {this.roundParenBalance = 0;} ->pushMode(INSIDE_PHP_COMPOSED_EXPRESSION); +BLADE_EXPR_LPAREN : '(' {this.resetRoundParenBalance();} ->pushMode(INSIDE_PHP_COMPOSED_EXPRESSION); L_COMPOSED_EXPR_OTHER : . ->type(HTML), popMode; //{{}}, @if, @foreach mode INSIDE_PHP_COMPOSED_EXPRESSION; -EXPR_SQ_LPAREN : '[' {this.squareParenBalance++;}->type(BL_SQ_LPAREN); -EXPR_SQ_RPAREN : ']' {this.squareParenBalance--;}->type(BL_SQ_RPAREN); +EXPR_SQ_LPAREN : '[' {this.increaseSquareParenBalance();}->type(BL_SQ_LPAREN); +EXPR_SQ_RPAREN : ']' {this.decreaseSquareParenBalance();}->type(BL_SQ_RPAREN); -EXPR_CURLY_LPAREN : '{' {this.curlyParenBalance++;}->type(PHP_EXPRESSION); -EXPR_CURLY_RPAREN : '}' {this.curlyParenBalance--;}->type(PHP_EXPRESSION); +EXPR_CURLY_LPAREN : '{' {this.increaseCurlyParenBalance();}->type(PHP_EXPRESSION); +EXPR_CURLY_RPAREN : '}' {this.decreaseCurlyParenBalance();}->type(PHP_EXPRESSION); EXPR_STRING : DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT; @@ -356,7 +356,7 @@ EXIT_COMPOSED_EXPRESSION_EOF : EOF->type(ERROR),popMode; mode LOOK_FOR_BLADE_PARAMETERS; WS_BL_PARAM : [ ]+->skip; -OPEN_BL_PARAM_PAREN_MORE : '(' {this.roundParenBalance = 0;} ->type(BLADE_PARAM_LPAREN),pushMode(INSIDE_BLADE_PARAMETERS); +OPEN_BL_PARAM_PAREN_MORE : '(' {this.resetRoundParenBalance();} ->type(BLADE_PARAM_LPAREN),pushMode(INSIDE_BLADE_PARAMETERS); L_BL_PARAM_OTHER : . ->type(HTML), popMode; @@ -364,7 +364,7 @@ mode FOREACH_LOOP_EXPRESSION; FOREACH_WS_EXPR : [ ]+->skip; FOREACH_LOOP_LPAREN : '(' {this.increaseRoundParenBalance();}; -FOREACH_LOOP_RPAREN : ')' {this.decreaseRoundParenBalance(); if (this.roundParenBalance == 0){this.popMode();}}; +FOREACH_LOOP_RPAREN : ')' {this.decreaseRoundParenBalance(); if (this.getRoundParenBalance() == 0){this.popMode();}}; FOREACH_AS : 'as'; @@ -385,11 +385,11 @@ mode INSIDE_BLADE_PARAMETERS; BL_PARAM_LINE_COMMENT : LineComment->channel(COMMENT); -BL_SQ_LPAREN : '[' {this.squareParenBalance++;}; -BL_SQ_RPAREN : ']' {this.squareParenBalance--;}; +BL_SQ_LPAREN : '[' {this.increaseSquareParenBalance();}; +BL_SQ_RPAREN : ']' {this.decreaseSquareParenBalance();}; -BL_CURLY_LPAREN : '{' {this.curlyParenBalance++;}->type(BLADE_PARAM_EXTRA); -BL_CURLY_RPAREN : '}' {this.curlyParenBalance--;}->type(BLADE_PARAM_EXTRA); +BL_CURLY_LPAREN : '{' {this.increaseCurlyParenBalance();}->type(BLADE_PARAM_EXTRA); +BL_CURLY_RPAREN : '}' {this.decreaseCurlyParenBalance();}->type(BLADE_PARAM_EXTRA); BL_PARAM_LPAREN : '(' {this.increaseRoundParenBalance();}->type(BLADE_PARAM_EXTRA); BL_PARAM_RPAREN : ')' {consumeParamRParen();}; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java index 5ef4791a09e7..e2070f8713c7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java @@ -372,21 +372,21 @@ public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { private void HTML_COMPONENT_PREFIX_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { case 0: - this.compomentTagOpen = true; + this.setComponentTagOpenStatus(true); break; } } private void HTML_TAG_SELF_CLOSE_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { case 1: - this.compomentTagOpen = false; + this.setComponentTagOpenStatus(false); break; } } private void HTML_CLOSE_SYMBOL_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { case 2: - this.compomentTagOpen = false; + this.setComponentTagOpenStatus(false); break; } } @@ -428,35 +428,35 @@ private void RPAREN_action(RuleContext _localctx, int actionIndex) { private void BLADE_EXPR_LPAREN_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { case 8: - this.roundParenBalance = 0; + this.resetRoundParenBalance(); break; } } private void EXPR_SQ_LPAREN_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { case 9: - this.squareParenBalance++; + this.increaseSquareParenBalance(); break; } } private void EXPR_SQ_RPAREN_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { case 10: - this.squareParenBalance--; + this.decreaseSquareParenBalance(); break; } } private void EXPR_CURLY_LPAREN_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { case 11: - this.curlyParenBalance++; + this.increaseCurlyParenBalance(); break; } } private void EXPR_CURLY_RPAREN_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { case 12: - this.curlyParenBalance--; + this.decreaseCurlyParenBalance(); break; } } @@ -477,7 +477,7 @@ private void COMPOSED_EXPR_RPAREN_action(RuleContext _localctx, int actionIndex) private void OPEN_BL_PARAM_PAREN_MORE_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { case 15: - this.roundParenBalance = 0; + this.resetRoundParenBalance(); break; } } @@ -491,35 +491,35 @@ private void FOREACH_LOOP_LPAREN_action(RuleContext _localctx, int actionIndex) private void FOREACH_LOOP_RPAREN_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { case 17: - this.decreaseRoundParenBalance(); if (this.roundParenBalance == 0){this.popMode();} + this.decreaseRoundParenBalance(); if (this.getRoundParenBalance() == 0){this.popMode();} break; } } private void BL_SQ_LPAREN_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { case 18: - this.squareParenBalance++; + this.increaseSquareParenBalance(); break; } } private void BL_SQ_RPAREN_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { case 19: - this.squareParenBalance--; + this.decreaseSquareParenBalance(); break; } } private void BL_CURLY_LPAREN_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { case 20: - this.curlyParenBalance++; + this.increaseCurlyParenBalance(); break; } } private void BL_CURLY_RPAREN_action(RuleContext _localctx, int actionIndex) { switch (actionIndex) { case 21: - this.curlyParenBalance--; + this.decreaseCurlyParenBalance(); break; } } @@ -651,35 +651,35 @@ private boolean L_OHTER_ESCAPE_sempred(RuleContext _localctx, int predIndex) { private boolean OPEN_EXPR_PAREN_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 9: - return this.roundParenBalance == 0; + return this.getRoundParenBalance() == 0; } return true; } private boolean CLOSE_EXPR_PAREN_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 10: - return this.roundParenBalance == 1; + return this.getRoundParenBalance() == 1; } return true; } private boolean LPAREN_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 11: - return this.roundParenBalance > 0; + return this.getRoundParenBalance() > 0; } return true; } private boolean RPAREN_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 12: - return this.roundParenBalance > 0; + return this.getRoundParenBalance() > 0; } return true; } private boolean EXIT_RPAREN_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 13: - return this.roundParenBalance == 0; + return this.getRoundParenBalance() == 0; } return true; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java index 6724a8c447d2..9b86fe5199eb 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java @@ -88,6 +88,10 @@ public void increaseRoundParenBalance() { public void decreaseRoundParenBalance() { this.roundParenBalance--; } + + public void resetRoundParenBalance() { + this.roundParenBalance = 0; + } public boolean endsWith(char ch1, char ch2) { return this._input.LA(1) == ch1 && this._input.LA(2) == ch2; @@ -120,16 +124,5 @@ public void consumeNotEscapedEchoToken() { public void consumeExprToken(){ this.more(); } - - public void testForFreezeCombination(){ - if (this.roundParenBalance <= 1 && - (this._input.LA(1) == ')' - || this._input.LA(1) == ']')){ - this.setType(BladeAntlrColoringLexer.ERROR); - } else { - this.consumeExprToken(); - } - } - } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java index 45188124859c..13e667c3021e 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java @@ -21,8 +21,6 @@ import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.atn.ATN; -import org.antlr.v4.runtime.misc.Interval; /** * @@ -31,11 +29,10 @@ public abstract class LexerAdaptor extends Lexer { private int _currentRuleType = Token.INVALID_TYPE; - public int roundParenBalance = 0; - public int squareParenBalance = 0; - public int curlyParenBalance = 0; - public int exitIfModePosition = 0; - public boolean compomentTagOpen = false; + private int roundParenBalance = 0; + private int squareParenBalance = 0; + private int curlyParenBalance = 0; + private boolean compomentTagOpen = false; public LexerAdaptor(CharStream input) { super(input); @@ -59,27 +56,13 @@ public void reset() { setCurrentRuleType(Token.INVALID_TYPE); super.reset(); } - - /** - * eager check to see if the character position in a line is at the start - * - * @return - */ - public boolean IsNewLineOrStart() { - return this._tokenStartCharPositionInLine <= 2; - } - - public boolean peekNextChar(char peekChar) { - return (char) this._input.LA(1) == peekChar; + + public int getRoundParenBalance(){ + return this.roundParenBalance; } - - public boolean peekNextChars(char peekChar, int number) { - for (int i = 1; i < number; i++) { - if ((char) this._input.LA(i) != peekChar) { - return false; - } - } - return true; + + public void resetRoundParenBalance(){ + this.roundParenBalance = 0; } public void increaseRoundParenBalance() { @@ -89,17 +72,27 @@ public void increaseRoundParenBalance() { public void decreaseRoundParenBalance() { this.roundParenBalance--; } + + public int getSquareParenBalance(){ + return this.squareParenBalance; + } + + public void increaseSquareParenBalance() { + this.squareParenBalance++; + } - public boolean endsWith(char ch1, char ch2) { - return this._input.LA(1) == ch1 && this._input.LA(2) == ch2; + public void decreaseSquareParenBalance() { + this.squareParenBalance--; } - public boolean endsWith(char ch1, char ch2, char ch3) { - return this._input.LA(1) == ch1 - && this._input.LA(2) == ch2 - && this._input.LA(3) == ch3; + public void increaseCurlyParenBalance() { + this.curlyParenBalance++; } + public void decreaseCurlyParenBalance() { + this.curlyParenBalance--; + } + public boolean hasNoBladeParamOpenBracket() { return this.roundParenBalance == 0 && this.squareParenBalance == 0 @@ -148,6 +141,9 @@ public void consumeExprRParen(){ } } + public void setComponentTagOpenStatus(boolean status){ + this.compomentTagOpen = status; + } public void consumeHtmlIdentifier(){ if (this.compomentTagOpen == true) { diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass index 5e37b1080811..b0b7da2c04a4 100644 --- a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass @@ -14,20 +14,20 @@ Token #12 HTML [}] Token #13 HTML [\n ] Token #14 HTML [}] Token #15 HTML [\n ] -Token #16 HTML [@supports ] -Token #17 HTML [(transform-origin: 5] -Token #18 HTML [%] -Token #19 HTML [ 5] -Token #20 HTML [%] -Token #21 HTML [) ] -Token #22 HTML [{] -Token #23 HTML [\n ] -Token #24 HTML [}] -Token #25 HTML [\n ] -Token #26 HTML [@container ] -Token #27 HTML [(width ] -Token #28 HTML [>] -Token #29 HTML [ 400px) ] +Token #16 BLADE_DIRECTIVE [@supports ] +Token #17 BLADE_PAREN [(] +Token #18 PHP_BLADE_EXPRESSION [transform-origin: 5% 5%] +Token #19 BLADE_PAREN [)] +Token #20 HTML [ ] +Token #21 HTML [{] +Token #22 HTML [\n ] +Token #23 HTML [}] +Token #24 HTML [\n ] +Token #25 BLADE_DIRECTIVE [@container ] +Token #26 BLADE_PAREN [(] +Token #27 PHP_BLADE_EXPRESSION [width > 400px] +Token #28 BLADE_PAREN [)] +Token #29 HTML [ ] Token #30 HTML [{] Token #31 HTML [\n h2 ] Token #32 HTML [{] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/html_javascript_01.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/html_javascript_01.pass index 6b24efbaf2bd..055e4f470e6a 100644 --- a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/html_javascript_01.pass +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/html_javascript_01.pass @@ -1,14 +1,16 @@ Token #0 HTML [\n] +Token #13 HTML [test2] +Token #14 HTML ['] +Token #15 HTML [);\n\n] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/include_01.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/include_01.pass index 990d06c4a62e..ba42c9bdc214 100644 --- a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/include_01.pass +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/include_01.pass @@ -1,3 +1,5 @@ Token #0 BLADE_DIRECTIVE [@include] -Token #1 PHP_BLADE_EXPRESSION [('path', ['key' => 'value'])] -Token #2 HTML [\n] +Token #1 BLADE_PAREN [(] +Token #2 PHP_BLADE_EXPRESSION ['path', ['key' => 'value']] +Token #3 BLADE_PAREN [)] +Token #4 HTML [\n] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/content_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/content_tag.pass deleted file mode 100644 index 2d8358ce0466..000000000000 --- a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/content_tag.pass +++ /dev/null @@ -1,6 +0,0 @@ -Token #6 HTML [[@0,0:6='Hello, ',<6>,1:0]] -Token #5 CONTENT_TAG [[@1,7:8='{{',<5>,1:7]] -Token #3 BLADE_PHP_ECHO_EXPR [[@2,9:15=' $name ',<3>,1:9]] -Token #5 CONTENT_TAG [[@3,16:17='}}',<5>,1:16]] -Token #6 HTML [[@4,18:19='.\n',<6>,1:18]] -Token #-1 EOF [[@5,20:19='',<-1>,2:0]] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/escaped_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/escaped_tag.pass deleted file mode 100644 index 1516d27bfc42..000000000000 --- a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/escaped_tag.pass +++ /dev/null @@ -1,7 +0,0 @@ -Token #7 HTML_TAG [[@0,0:25='

      Laravel

      \n \nHello, ',<7>,1:0]] -Token #6 HTML [[@1,26:28='@{{',<6>,3:7]] -Token #6 HTML [[@2,29:34=' name ',<6>,3:10]] -Token #6 HTML [[@3,35:35='}',<6>,3:16]] -Token #6 HTML [[@4,36:36='}',<6>,3:17]] -Token #6 HTML [[@5,37:38='.\n',<6>,3:18]] -Token #-1 EOF [[@6,39:38='',<-1>,4:0]] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/content_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/content_tag.pass index 2d8358ce0466..332f302adeb9 100644 --- a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/content_tag.pass +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/content_tag.pass @@ -1,6 +1,6 @@ -Token #6 HTML [[@0,0:6='Hello, ',<6>,1:0]] -Token #5 CONTENT_TAG [[@1,7:8='{{',<5>,1:7]] -Token #3 BLADE_PHP_ECHO_EXPR [[@2,9:15=' $name ',<3>,1:9]] -Token #5 CONTENT_TAG [[@3,16:17='}}',<5>,1:16]] -Token #6 HTML [[@4,18:19='.\n',<6>,1:18]] +Token #7 HTML [[@0,0:6='Hello, ',<7>,1:0]] +Token #6 CONTENT_TAG [[@1,7:8='{{',<6>,1:7]] +Token #4 BLADE_PHP_ECHO_EXPR [[@2,9:15=' $name ',<4>,1:9]] +Token #6 CONTENT_TAG [[@3,16:17='}}',<6>,1:16]] +Token #7 HTML [[@4,18:19='.\n',<7>,1:18]] Token #-1 EOF [[@5,20:19='',<-1>,2:0]] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/escaped_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/escaped_tag.pass index 1516d27bfc42..6d7baaa77fde 100644 --- a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/escaped_tag.pass +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/escaped_tag.pass @@ -1,7 +1,7 @@ -Token #7 HTML_TAG [[@0,0:25='

      Laravel

      \n \nHello, ',<7>,1:0]] -Token #6 HTML [[@1,26:28='@{{',<6>,3:7]] -Token #6 HTML [[@2,29:34=' name ',<6>,3:10]] -Token #6 HTML [[@3,35:35='}',<6>,3:16]] -Token #6 HTML [[@4,36:36='}',<6>,3:17]] -Token #6 HTML [[@5,37:38='.\n',<6>,3:18]] +Token #8 HTML_TAG [[@0,0:25='

      Laravel

      \n \nHello, ',<8>,1:0]] +Token #7 HTML [[@1,26:28='@{{',<7>,3:7]] +Token #7 HTML [[@2,29:34=' name ',<7>,3:10]] +Token #7 HTML [[@3,35:35='}',<7>,3:16]] +Token #7 HTML [[@4,36:36='}',<7>,3:17]] +Token #7 HTML [[@5,37:38='.\n',<7>,3:18]] Token #-1 EOF [[@6,39:38='',<-1>,4:0]] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/raw_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/raw_tag.pass index 6b9d29e50f18..f67a19437698 100644 --- a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/raw_tag.pass +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/raw_tag.pass @@ -1,6 +1,6 @@ -Token #6 HTML [[@0,0:6='Hello, ',<6>,1:0]] -Token #4 RAW_TAG [[@1,7:9='{!!',<4>,1:7]] -Token #3 BLADE_PHP_ECHO_EXPR [[@2,10:16=' $name ',<3>,1:10]] -Token #4 RAW_TAG [[@3,17:19='!!}',<4>,1:17]] -Token #6 HTML [[@4,20:21='.\n',<6>,1:20]] +Token #7 HTML [[@0,0:6='Hello, ',<7>,1:0]] +Token #5 RAW_TAG [[@1,7:9='{!!',<5>,1:7]] +Token #4 BLADE_PHP_ECHO_EXPR [[@2,10:16=' $name ',<4>,1:10]] +Token #5 RAW_TAG [[@3,17:19='!!}',<5>,1:17]] +Token #7 HTML [[@4,20:21='.\n',<7>,1:20]] Token #-1 EOF [[@5,22:21='',<-1>,2:0]] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/raw_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/raw_tag.pass deleted file mode 100644 index 6b9d29e50f18..000000000000 --- a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/raw_tag.pass +++ /dev/null @@ -1,6 +0,0 @@ -Token #6 HTML [[@0,0:6='Hello, ',<6>,1:0]] -Token #4 RAW_TAG [[@1,7:9='{!!',<4>,1:7]] -Token #3 BLADE_PHP_ECHO_EXPR [[@2,10:16=' $name ',<3>,1:10]] -Token #4 RAW_TAG [[@3,17:19='!!}',<4>,1:17]] -Token #6 HTML [[@4,20:21='.\n',<6>,1:20]] -Token #-1 EOF [[@5,22:21='',<-1>,2:0]] diff --git a/php/php.blade/test/unit/data/testfiles/braces/testUnClosedSectionDirective_01.testUnClosedSectionDirective_01.braces b/php/php.blade/test/unit/data/testfiles/braces/testUnclosedSectionDirective_01.testUnclosedSectionDirective_01.braces similarity index 100% rename from php/php.blade/test/unit/data/testfiles/braces/testUnClosedSectionDirective_01.testUnClosedSectionDirective_01.braces rename to php/php.blade/test/unit/data/testfiles/braces/testUnclosedSectionDirective_01.testUnclosedSectionDirective_01.braces diff --git a/php/php.blade/test/unit/data/testfiles/parser/unopend/inline_section_noerror_01.blade.php b/php/php.blade/test/unit/data/testfiles/parser/unopend/inline_section_noerror_01.blade.php new file mode 100644 index 000000000000..c7138cccd4c5 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/parser/unopend/inline_section_noerror_01.blade.php @@ -0,0 +1 @@ +@section('x', ['var']) \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/parser/unopend/inline_section_noerror_01.blade.php.errors b/php/php.blade/test/unit/data/testfiles/parser/unopend/inline_section_noerror_01.blade.php.errors new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_directive_bracket_error_01.blade.php b/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_directive_bracket_error_01.blade.php new file mode 100644 index 000000000000..f3b73db6eb9f --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_directive_bracket_error_01.blade.php @@ -0,0 +1 @@ +@test([[]) \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_directive_bracket_error_01.blade.php.errors b/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_directive_bracket_error_01.blade.php.errors new file mode 100644 index 000000000000..53553cdb60f2 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_directive_bracket_error_01.blade.php.errors @@ -0,0 +1 @@ +[[9,9]-extraneous input ')' expecting {PHP_VARIABLE, PHP_KEYWORD, BLADE_PARAM_EXTRA, BL_SQ_LPAREN, BL_PARAM_STRING, BL_PARAM_ASSIGN, BL_PARAM_COMMA, BL_SQ_RPAREN, '.', BL_NAME_STRING}] 9-9:extraneous input ')' expecting {PHP_VARIABLE, PHP_KEYWORD, BLADE_PARAM_EXTRA, BL_SQ_LPAREN, BL_PARAM_STRING, BL_PARAM_ASSIGN, BL_PARAM_COMMA, BL_SQ_RPAREN, '.', BL_NAME_STRING} diff --git a/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_section_error_01.blade.php b/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_section_error_01.blade.php new file mode 100644 index 000000000000..53be5e00c00a --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_section_error_01.blade.php @@ -0,0 +1 @@ +@section('x') \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_section_error_01.blade.php.errors b/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_section_error_01.blade.php.errors new file mode 100644 index 000000000000..1a63fb4530c0 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_section_error_01.blade.php.errors @@ -0,0 +1 @@ +[[13,13]-mismatched input '' expecting {HTML, '@if', '@else', '@switch', '@case', '@default', '@empty', D_COND_BLOCK_START, '@foreach', '@for', '@forelse', '@while', '@break', D_LOOP_ACTION, '@include', '@includeIf', '@includeWhen', '@includeFirst', '@includeUnless', '@each', '@extends', '@js', '@json', '@section', '@hasSection', '@sectionMissing', '@endsection', '@yield', '@parent', '@show', '@overwrite', '@stop', '@append', '@once', '@stack', '@push', '@pushIf', '@prepend', '@props', '@fragment', '@csrf', '@method', '@error', '@production', '@env', D_AUTH_START, D_PERMISSION_START, D_PERMISSION_ELSE, '@class', '@style', D_HTML_ATTR_EXPR, '@aware', '@session', D_DD, '@lang', '@use', '@inject', D_PHP, '@verbatim', D_LIVEWIRE, '@vite', '@viteReactRefresh', D_CUSTOM, D_UNKNOWN_ATTR_ENC, D_UNKNOWN, '{{', '{!!', PHP_INLINE_START, HTML_COMPONENT_PREFIX, HTML_TAG_START, HTML_IDENTIFIER, '='}] 13-13:mismatched input '' expecting {HTML, '@if', '@else', '@switch', '@case', '@default', '@empty', D_COND_BLOCK_START, '@foreach', '@for', '@forelse', '@while', '@break', D_LOOP_ACTION, '@include', '@includeIf', '@includeWhen', '@includeFirst', '@includeUnless', '@each', '@extends', '@js', '@json', '@section', '@hasSection', '@sectionMissing', '@endsection', '@yield', '@parent', '@show', '@overwrite', '@stop', '@append', '@once', '@stack', '@push', '@pushIf', '@prepend', '@props', '@fragment', '@csrf', '@method', '@error', '@production', '@env', D_AUTH_START, D_PERMISSION_START, D_PERMISSION_ELSE, '@class', '@style', D_HTML_ATTR_EXPR, '@aware', '@session', D_DD, '@lang', '@use', '@inject', D_PHP, '@verbatim', D_LIVEWIRE, '@vite', '@viteReactRefresh', D_CUSTOM, D_UNKNOWN_ATTR_ENC, D_UNKNOWN, '{{', '{!!', PHP_INLINE_START, HTML_COMPONENT_PREFIX, HTML_TAG_START, HTML_IDENTIFIER, '='} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/BladeParserErrorTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/BladeParserErrorTest.java index 3fa71b9fbc8b..6a3f77f8b29f 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/BladeParserErrorTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/BladeParserErrorTest.java @@ -33,4 +33,16 @@ public BladeParserErrorTest(String testName) { public void testUnopendSetError_01() throws Exception { checkErrors("testfiles/parser/unopend/unopend_set_error_01.blade.php"); } + + public void testUclosedSectionError_01() throws Exception { + checkErrors("testfiles/parser/unopend/unclosed_section_error_01.blade.php"); + } + + public void testInlineSectionNoError_01() throws Exception { + checkErrors("testfiles/parser/unopend/inline_section_noerror_01.blade.php"); + } + + public void testUnclosedDirectiveBracketError_01() throws Exception { + checkErrors("testfiles/parser/unopend/unclosed_directive_bracket_error_01.blade.php"); + } } From 5eab624ee981e3a327dc485259d81042f095f53a Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Thu, 10 Oct 2024 08:13:43 +0300 Subject: [PATCH 27/43] //NOI18N, move folder and names to constant, encapsulation --- .../blade/editor/BladeDeclarationFinder.java | 4 +- .../php/blade/editor/BladeLanguage.java | 8 +- .../completion/BladeCompletionHandler.java | 6 +- .../completion/BladeCompletionItem.java | 5 +- .../completion/BladeCompletionProvider.java | 4 +- .../BladePhpCompletionProvider.java | 11 ++- .../ComponentDeclarationService.java | 3 +- .../editor/directives/CustomDirectives.java | 89 +++++++++++-------- .../embedding/BladeHtmlEmbeddingProvider.java | 9 +- .../embedding/BladePhpEmbeddingProvider.java | 10 ++- .../blade/editor/format/BladeFormatter.java | 4 +- .../editor/format/BladeFormatterService.java | 4 +- .../php/blade/editor/format/FormatToken.java | 2 +- .../php/blade/editor/path/BladePathUtils.java | 46 +++++++--- .../ui/wizard/NewFileWizardIterator.java | 12 +-- 15 files changed, 129 insertions(+), 88 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java index 9b9bbacc0541..e4e0f3ea78d9 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java @@ -275,9 +275,9 @@ public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) { CustomDirectives.getInstance(projectOwner).filterAction(new CustomDirectives.FilterCallbackDeclaration(dlcustomDirective) { @Override public void filterDirectiveName(CustomDirective directive, FileObject file) { - if (directive.name.equals(directiveNameFound)) { + if (directive.getName().equals(directiveNameFound)) { NamedElement customDirectiveHandle = new NamedElement(directiveNameFound, file, ElementType.CUSTOM_DIRECTIVE); - DeclarationFinder.DeclarationLocation newLoc = new DeclarationFinder.DeclarationLocation(file, directive.offset, customDirectiveHandle); + DeclarationFinder.DeclarationLocation newLoc = new DeclarationFinder.DeclarationLocation(file, directive.getOffset(), customDirectiveHandle); this.location.addAlternative(new AlternativeLocationImpl(newLoc)); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java index 68dba851c4cb..d871175ce64d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java @@ -90,6 +90,8 @@ public BladeLanguage() { public static final String ACTIONS = "Loaders/" + BladeLanguage.MIME_TYPE + "/Actions"; //NOI18N public static final String MIME_TYPE = "text/x-blade"; //NOI18N + public static final String FILE_EXTENSION_SUFFIX = ".blade"; //NOI18N + public static final String FILE_EXTENSION = "blade.php"; //NOI18N @Override public Language getLexerLanguage() { @@ -103,7 +105,7 @@ public String getDisplayName() { @Override public String getPreferredExtension() { - return "blade.php"; // NOI18N + return FILE_EXTENSION; } @Override @@ -203,10 +205,10 @@ protected Lexer createLexer(LexerRestartInfo info) { @NbBundle.Messages("Source=&Source Blade") @MultiViewElement.Registration( - displayName = "#Source", //NOI18N + displayName = "#Source", persistenceType = TopComponent.PERSISTENCE_ONLY_OPENED, mimeType = BladeLanguage.MIME_TYPE, - preferredID = "blade.source", //NOI18N + preferredID = "blade.source", position = 100 ) public static MultiViewEditorElement createMultiViewEditorElement(Lookup context) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java index 26d84bea25cf..10997bd3751f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java @@ -232,14 +232,14 @@ private void completeDirectives(final List completionProposa CustomDirectives.getInstance(project).filterAction(new CustomDirectives.FilterCallback() { @Override public void filterDirectiveName(CustomDirectives.CustomDirective directive, FileObject file) { - DirectiveElement directiveEl = new DirectiveElement(directive.name, file); - if (directive.name.startsWith(prefix)) { + DirectiveElement directiveEl = new DirectiveElement(directive.getName(), file); + if (directive.getName().startsWith(prefix)) { int anchorOffset = computeAnchorOffset(prefix, completionContext.getCaretOffset()); completionProposals.add( new BladeCompletionProposal.CustomDirective( directiveEl, anchorOffset, - directive.name + directive.getName() )); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java index 2e55d0209b18..b7c72735d1d9 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java @@ -31,7 +31,9 @@ import org.netbeans.editor.BaseDocument; import org.netbeans.lib.editor.codetemplates.api.CodeTemplateManager; import org.netbeans.modules.php.blade.editor.ResourceUtilities; +import org.netbeans.modules.php.blade.editor.path.BladePathUtils; import org.netbeans.modules.php.blade.syntax.BladeDirectivesUtils; +import org.netbeans.modules.php.blade.syntax.StringUtils; import org.netbeans.spi.editor.completion.CompletionItem; import org.netbeans.spi.editor.completion.CompletionTask; import org.netbeans.spi.editor.completion.support.CompletionUtilities; @@ -351,8 +353,7 @@ protected ImageIcon getIcon() { @Override protected String getRightHtmlText() { - int viewsPos = filePath.indexOf("/views/"); // NOI18N - return filePath.substring(viewsPos, filePath.length()); + return BladePathUtils.removeViewsFolderFromPath(filePath); } } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java index 01e38ecce770..4ab80e7ae1a3 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java @@ -218,9 +218,9 @@ private void completeDirectives(String prefix, Document doc, int carretOffset, C CustomDirectives.getInstance(project).filterAction(new CustomDirectives.FilterCallback() { @Override public void filterDirectiveName(CustomDirective customDirective, FileObject file) { - if (customDirective.name.startsWith(prefix)) { + if (customDirective.getName().startsWith(prefix)) { resultSet.addItem(DirectiveCompletionBuilder.itemWithArg( - startOffset, carretOffset, prefix, customDirective.name, + startOffset, carretOffset, prefix, customDirective.getName(), "custom directive", doc, file)); // NOI18N } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java index db26afd93ae0..e6e62c46e3d0 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java @@ -187,15 +187,15 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse case D_EXTENDS, D_INCLUDE, D_INCLUDE_IF, D_INCLUDE_WHEN, D_INCLUDE_UNLESS, D_EACH -> { int lastDotPos; - if (pathName.endsWith(".")) { + if (pathName.endsWith(StringUtils.DOT)) { lastDotPos = pathName.length(); } else { - lastDotPos = pathName.lastIndexOf("."); + lastDotPos = pathName.lastIndexOf(StringUtils.DOT); } int pathOffset; if (lastDotPos > 0) { - int dotFix = pathName.endsWith(".") ? 0 : 1; + int dotFix = pathName.endsWith(StringUtils.DOT) ? 0 : 1; pathOffset = caretOffset - pathName.length() + lastDotPos + dotFix; } else { pathOffset = caretOffset - pathName.length(); @@ -204,7 +204,7 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse for (FileObject file : childrenFiles) { String pathFileName = file.getName(); if (!file.isFolder()) { - pathFileName = pathFileName.replace(".blade", ""); // NOI18N + pathFileName = pathFileName.replace(BladeLanguage.FILE_EXTENSION_SUFFIX, ""); // NOI18N } completeBladePath(pathFileName, file, pathOffset, resultSet); } @@ -323,13 +323,12 @@ private void addYieldIdCompletionItem(String identifier, FileObject fo, int caretOffset, CompletionResultSet resultSet) { String filePath = fo.getPath(); - int viewsPos = filePath.indexOf("/views/"); // NOI18N CompletionItem item = CompletionUtilities.newCompletionItemBuilder(identifier) .iconResource(getReferenceIcon(CompletionType.YIELD_ID)) .startOffset(caretOffset) .leftHtmlText(identifier) - .rightHtmlText(filePath.substring(viewsPos, filePath.length())) + .rightHtmlText(BladePathUtils.removeViewsFolderFromPath(filePath)) .sortPriority(1) .build(); resultSet.addItem(item); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java index 6551a264860f..36ccd003cd92 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java @@ -23,6 +23,7 @@ import java.util.Map; import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.editor.BladeLanguage; import org.netbeans.modules.php.blade.editor.components.annotation.Namespace; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; @@ -73,7 +74,7 @@ public FileObject getLivewireComponentResourceFile(String componentId, FileObjec return null; } - FileObject componentResource = project.getProjectDirectory().getFileObject("resources/views/livewire/" + componentId + ".blade.php"); // NOI18N + FileObject componentResource = project.getProjectDirectory().getFileObject("resources/views/livewire/" + componentId + "." + BladeLanguage.FILE_EXTENSION); // NOI18N if (componentResource != null && componentResource.isValid()){ return componentResource; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java index 82141ef945a3..8ec1e0b57cac 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java @@ -51,12 +51,12 @@ public final class CustomDirectives { private static final Map INSTANCES = new WeakHashMap<>(); private final Map> customDirectives = new LinkedHashMap<>(); - public List customDirectiveList = new ArrayList<>(); + private List customDirectiveList = new ArrayList<>(); private final FileChangeListener fileChangeListener = new FileChangeListenerImpl(); - + private static final Logger LOGGER = Logger.getLogger(CustomDirectives.class.getName()); - + public static CustomDirectives getInstance(Project project) { if (project == null) { return new CustomDirectives(); @@ -84,27 +84,33 @@ private CustomDirectives() { private CustomDirectives(Project project) { this.project = project; extractCustomDirectives(); - LOGGER.log(Level.INFO, "Finished extracting directives. Found ({0})", customDirectives.size()); + LOGGER.log(Level.INFO, "Finished extracting directives. Found ({0})", customDirectives.size()); // NOI18N } private void extractCustomDirectives() { - LOGGER.info("Extracting custom directives"); - String[] compilerPathList = BladeProjectProperties.getInstance(project).getDirectiveRegistrationsPathList(); + LOGGER.info("Extracting custom directives"); // NOI18N + BladeProjectProperties bladeProperties = BladeProjectProperties.getInstance(project); + + if (bladeProperties == null) { + return; + } + + String[] compilerPathList = bladeProperties.getDirectiveRegistrationsPathList(); FileObject defaultAppProvider = project.getProjectDirectory().getFileObject("app/Providers/AppServiceProvider.php"); // NOI18N String defaultAppPath = ""; - - if (defaultAppProvider != null){ + + if (defaultAppProvider != null) { addDirectiveNamesFromFile(defaultAppProvider); File defaultAppFile = new File(defaultAppProvider.getPath()); defaultAppPath = defaultAppFile.getAbsolutePath(); FileUtil.addRecursiveListener(fileChangeListener, defaultAppFile); } - + if (compilerPathList.length == 0) { return; } for (String path : compilerPathList) { - if (path.equals("")) { + if (path.equals("")) { // NOI18N continue; } File file = new File(path); @@ -112,9 +118,9 @@ private void extractCustomDirectives() { //remove continue; } - + String filePath = file.getPath(); - if (defaultAppPath.equals(filePath)){ + if (defaultAppPath.equals(filePath)) { continue; } FileUtil.addRecursiveListener(fileChangeListener, file); @@ -142,7 +148,7 @@ public void addDirectiveNamesFromFile(FileObject file) { if (directiveList.isEmpty()) { return; } - + customDirectiveList.addAll(directiveList); customDirectives.put(file, directiveList); } @@ -171,6 +177,7 @@ public List getList() { * directive name */ private class FunctionInvocationVisitor extends org.netbeans.modules.php.editor.parser.astnodes.visitors.DefaultVisitor { + private final String[] validFunctions = new String[]{"directive", "if"}; // NOI18N private final List directives; @@ -199,7 +206,7 @@ public void visit(FunctionInvocation node) { String escapedDirectiveName = name.getStringValue().replaceAll("^[\"|\']|[\"|[\']]$", ""); // NOI18N directives.add(new CustomDirective("@" + escapedDirectiveName, name.getStartOffset())); //Custom If Statements - if (functionName.equals("if")){ + if (functionName.equals("if")) { directives.add(new CustomDirective("@unless" + escapedDirectiveName, name.getStartOffset())); // NOI18N directives.add(new CustomDirective("@else" + escapedDirectiveName, name.getStartOffset())); // NOI18N directives.add(new CustomDirective("@end" + escapedDirectiveName, name.getStartOffset())); // NOI18N @@ -243,12 +250,12 @@ public void filterAction(FilterCallback callback) { } for (CustomDirective directive : entry.getValue()) { - callback.filterDirectiveName(directive, entry.getKey()); + callback.filterDirectiveName(directive, entry.getKey()); } - + } } - + public void filterAction(FilterCallbackDeclaration callback) { for (Map.Entry> entry : customDirectives.entrySet()) { if (!entry.getKey().isValid()) { @@ -256,15 +263,15 @@ public void filterAction(FilterCallbackDeclaration callback) { } for (CustomDirective directive : entry.getValue()) { - callback.filterDirectiveName(directive, entry.getKey()); + callback.filterDirectiveName(directive, entry.getKey()); } - + } } - - public boolean customDirectiveConfigured(String query){ - for (CustomDirectives.CustomDirective customDirective : customDirectiveList){ - if (customDirective.name.equals(query)){ + + public boolean customDirectiveConfigured(String query) { + for (CustomDirectives.CustomDirective customDirective : customDirectiveList) { + if (customDirective.name.equals(query)) { return true; } } @@ -275,28 +282,40 @@ public static interface FilterCallback { public void filterDirectiveName(CustomDirective directive, FileObject file); } - + public static abstract class FilterCallbackDeclaration { - protected DeclarationFinder.DeclarationLocation location ; - - public FilterCallbackDeclaration(DeclarationFinder.DeclarationLocation location){ + + protected DeclarationFinder.DeclarationLocation location; + + public FilterCallbackDeclaration(DeclarationFinder.DeclarationLocation location) { this.location = location; } - public void filterDirectiveName(CustomDirective directive, FileObject file){} + public void filterDirectiveName(CustomDirective directive, FileObject file) { + } } - + public static class CustomDirective { - public String name; - public int offset = 0; - - public CustomDirective(String name){ + + private final String name; + private int offset = 0; + + public CustomDirective(String name) { this.name = name; + this.offset = 0; } - - public CustomDirective(String name, int offset){ + + public CustomDirective(String name, int offset) { this.name = name; this.offset = offset; } + + public String getName() { + return name; + } + + public int getOffset() { + return offset; + } } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProvider.java index f2e9da7b7c08..7f00011194f3 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladeHtmlEmbeddingProvider.java @@ -40,7 +40,7 @@ mimeType = BladeLanguage.MIME_TYPE, targetMimeType = "text/html") public class BladeHtmlEmbeddingProvider extends EmbeddingProvider { - public static final String FILLER = " "; + public static final String FILLER = " "; //NOI18N public static final String TARGET_MIME_TYPE = "text/html"; //NOI18N @Override @@ -72,19 +72,16 @@ public List getEmbeddings(final Snapshot snapshot) { if (id.equals(BladeTokenId.HTML)) { embeddings.add(snapshot.create(offset, t.length(), TARGET_MIME_TYPE)); } else { - fake = new String(new char[tText.length()]).replace("\0", FILLER); + fake = new String(new char[tText.length()]).replace("\0", FILLER); //NOI18N embeddings.add(snapshot.create(fake, TARGET_MIME_TYPE)); } } } catch (Exception ex) { - //Exceptions.printStackTrace(ex); return Collections.emptyList(); } - //LOGGER.log(Level.INFO, "html ebedding finished for {0}, it took " + (System.currentTimeMillis() - startTime), snapshot.getSource().getFileObject().getName()); - if (embeddings.isEmpty()) { - return Collections.singletonList(snapshot.create("", TARGET_MIME_TYPE)); + return Collections.singletonList(snapshot.create("", TARGET_MIME_TYPE)); //NOI18N } else { return Collections.singletonList(Embedding.create(embeddings)); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java index 7493ad3274bd..8cde5cbd8179 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/embedding/BladePhpEmbeddingProvider.java @@ -31,15 +31,17 @@ import org.netbeans.modules.php.api.util.FileUtils; import org.netbeans.modules.php.blade.editor.BladeLanguage; import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; + /** - * + * only for simple content + * * @author bogdan */ @EmbeddingProvider.Registration( mimeType = BladeLanguage.MIME_TYPE, targetMimeType = FileUtils.PHP_MIME_TYPE) public class BladePhpEmbeddingProvider extends EmbeddingProvider { - public static final String TARGET_MIME_TYPE = FileUtils.PHP_MIME_TYPE; //NOI18N + public static final String TARGET_MIME_TYPE = FileUtils.PHP_MIME_TYPE; @Override public List getEmbeddings(final Snapshot snapshot) { @@ -68,13 +70,13 @@ public List getEmbeddings(final Snapshot snapshot) { if (id.equals(BladeTokenId.PHP_INLINE)) { embeddings.add(snapshot.create(offset, t.length(), TARGET_MIME_TYPE)); } else { - fake = new String(new char[tText.length()]).replace("\0", "@"); + fake = new String(new char[tText.length()]).replace("\0", "@"); //NOI18N embeddings.add(snapshot.create(fake, TARGET_MIME_TYPE)); } } if (embeddings.isEmpty()) { - return Collections.singletonList(snapshot.create("", TARGET_MIME_TYPE)); + return Collections.singletonList(snapshot.create("", TARGET_MIME_TYPE)); //NOI18N } else { return Collections.singletonList(Embedding.create(embeddings)); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatter.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatter.java index 08a20900d4a8..84286e0b3d66 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatter.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatter.java @@ -75,7 +75,7 @@ public void run() { if (context.isIndent()) { int lineStart = context.lineStartOffset(context.caretOffset()); String lineText = doc.getText(lineStart, context.caretOffset() - lineStart); - if (!lineText.isEmpty() && lineText.replaceAll(" ", "").isEmpty()) { + if (!lineText.isEmpty() && lineText.replaceAll(" ", "").isEmpty()) { //NOI18N return; } } @@ -89,7 +89,7 @@ public void run() { }; String lookupClassName = Lookup.getDefault().getClass().getSimpleName(); - if (lookupClassName.equals("MockLookup")) { + if (lookupClassName.equals("MockLookup")) { //NOI18N //test mode rn.run(); } else { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterService.java index 9ba1292981c7..bd3c0c71096c 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/BladeFormatterService.java @@ -61,9 +61,9 @@ public void format(Context context, String text, int indentSize) { int indent = entry.getValue().indent; int htmlIndent = entry.getValue().htmlIndent; if (tstart < context.document().getLength()) { - int existingLineIndent = 0; try { - existingLineIndent = context.lineIndent(tstart); + //safety check of offset position + context.lineIndent(tstart); } catch (BadLocationException ex) { Exceptions.printStackTrace(ex); break; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/FormatToken.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/FormatToken.java index 2503109a0c8a..b3a70ffd76d2 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/FormatToken.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/format/FormatToken.java @@ -45,6 +45,6 @@ public FormatToken(int tokenStart, int indent, int htmlIndent, String directive) @Override public String toString() { - return this.directive + ", " + this.indent * 4 + ", " + this.tokenStart; + return this.directive + ", " + this.indent * 4 + ", " + this.tokenStart; //NOI18N } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java index b4aca72b9f11..fc13e922114f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Map; import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.editor.BladeLanguage; import org.netbeans.modules.php.blade.project.BladeProjectProperties; import org.netbeans.modules.php.blade.project.ProjectUtils; import org.netbeans.modules.php.blade.syntax.StringUtils; @@ -40,8 +41,9 @@ public final class BladePathUtils { public static final String LARAVEL_RESOURCES = "resources"; //NOI18N - public static final String LARAVEL_VIEW_PATH = "resources/views"; //NOI18N - public static final String BLADE_EXT = ".blade.php"; //NOI18N + public static final String LARAVEL_VIEW_FOLDER = "views"; //NOI18N + public static final String LARAVEL_VIEW_PATH = LARAVEL_RESOURCES + StringUtils.FORWARD_SLASH + LARAVEL_VIEW_FOLDER; + public static final String BLADE_EXT = "." + BladeLanguage.FILE_EXTENSION; //NOI18N private BladePathUtils() { @@ -70,7 +72,7 @@ public static List findFileObjectsForBladeViewPath(FileObject contex return fileViewAssociationList; } - String sanitizedBladePath = viewPathToFilePath(viewPath); //NOI18N + String sanitizedBladePath = viewPathToFilePath(viewPath); for (FileObject viewRoot : viewRoots) { FileObject includedFile = viewRoot.getFileObject(sanitizedBladePath, true); @@ -181,7 +183,7 @@ public static List getParentChildrenFromPrefixPath(FileObject contex //filter by filename in relative context for (FileObject rootFolder : filteredViewRoots) { for (FileObject file : rootFolder.getChildren()) { - String filePath = file.getPath().replace(rootFolder.getPath() + StringUtils.FORWARD_SLASH, ""); + String filePath = file.getPath().replace(rootFolder.getPath() + StringUtils.FORWARD_SLASH, ""); //NOI18N if (filePath.startsWith(relativePrefixToCompare)) { list.add(file); } @@ -205,7 +207,11 @@ public static List getParentChildrenFromPrefixPath(FileObject contex public static List getCustomViewsRoots(Project project, FileObject contextFile) { List list = new ArrayList<>(); - String[] views = BladeProjectProperties.getInstance(project).getViewsFolderPathList(); + BladeProjectProperties bladeProperties = BladeProjectProperties.getInstance(project); + if (bladeProperties == null) { + return list; + } + String[] views = bladeProperties.getViewsFolderPathList(); if (views.length > 0) { views = Arrays.stream(views).filter(s -> !s.isEmpty()).toArray(String[]::new); @@ -246,16 +252,22 @@ public static String toBladeViewPath(FileObject file) { //belongs to the default folder String viewFolderPath = defaultLaravelPath.getPath(); if (filePath.startsWith(viewFolderPath)) { - String bladePath = BladePathUtils.toBladeViewPath(filePath.replace(viewFolderPath, "")); + String bladePath = BladePathUtils.toBladeViewPath(filePath.replace(viewFolderPath, "")); //NOI18N //starting slash - if (bladePath.startsWith(".")) { + if (bladePath.startsWith(StringUtils.DOT)) { bladePath = bladePath.substring(1, bladePath.length()); } return bladePath; } } - String[] viewFolders = BladeProjectProperties.getInstance(project).getViewsFolderPathList(); + BladeProjectProperties bladeProperties = BladeProjectProperties.getInstance(project); + + if (bladeProperties == null) { + return path; + } + + String[] viewFolders = bladeProperties.getViewsFolderPathList(); for (String viewFolder : viewFolders) { if (viewFolder.length() == 0) { @@ -270,7 +282,7 @@ public static String toBladeViewPath(FileObject file) { FileObject viewFile = FileUtil.toFileObject(viewPath); String viewFileAbsPath = viewFile.getPath(); if (filePath.startsWith(viewFileAbsPath)) { - String relativePath = filePath.replace(viewFileAbsPath, ""); + String relativePath = filePath.replace(viewFileAbsPath, ""); //NOI18N if (!relativePath.startsWith(StringUtils.FORWARD_SLASH)) { //it doesn't belong to the folder continue; @@ -285,22 +297,22 @@ public static String toBladeViewPath(FileObject file) { public static String getRelativeProjectPath(FileObject currentFile) { Project projectOwner = ProjectConvertors.getNonConvertorOwner(currentFile); if (projectOwner == null) { - return ""; + return ""; //NOI18N } String dirPath = projectOwner.getProjectDirectory().getPath(); - String relativePath = currentFile.getPath().replace(dirPath, ""); + String relativePath = currentFile.getPath().replace(dirPath, ""); //NOI18N //only if we found the relative project path if (currentFile.getPath().length() > relativePath.length()) { return relativePath; } - return ""; + return ""; //NOI18N } public static String toBladeViewPath(String filePath) { - return filePath.replace(BLADE_EXT, "").replace(StringUtils.FORWARD_SLASH, StringUtils.DOT); + return filePath.replace(BLADE_EXT, "").replace(StringUtils.FORWARD_SLASH, StringUtils.DOT); //NOI18N } public static String viewPathToFilePath(String viewPath) { @@ -321,4 +333,12 @@ public static HashSet getDefaultRoots(Project project) { public static String toBladeToProjectFilePath(String path) { return LARAVEL_VIEW_PATH + StringUtils.FORWARD_SLASH + viewPathToFilePath(path); } + + public static String removeViewsFolderFromPath(String filePath) { + int viewsPos = filePath.indexOf(StringUtils.FORWARD_SLASH + BladePathUtils.LARAVEL_VIEW_FOLDER + StringUtils.FORWARD_SLASH); + if (viewsPos < 0) { + return filePath; + } + return filePath.substring(viewsPos, filePath.length()); + } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/wizard/NewFileWizardIterator.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/wizard/NewFileWizardIterator.java index 661da7979c26..04d36d21b5ee 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/wizard/NewFileWizardIterator.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/wizard/NewFileWizardIterator.java @@ -27,6 +27,7 @@ import org.netbeans.api.project.SourceGroup; import org.netbeans.api.project.Sources; import org.netbeans.api.templates.TemplateRegistration; +import org.netbeans.modules.php.blade.editor.BladeLanguage; import org.openide.WizardDescriptor; import org.openide.filesystems.FileObject; import org.openide.loaders.DataFolder; @@ -39,7 +40,8 @@ */ public class NewFileWizardIterator implements WizardDescriptor.InstantiatingIterator { - WizardDescriptor wizard; + private WizardDescriptor wizard; + public static final String DEFAULT_FILENAME = "myfile"; //NOI18N private WizardDescriptor.Panel wizardPanel; private NewFileWizardIterator() { @@ -57,21 +59,19 @@ public static WizardDescriptor.InstantiatingIterator createBla @Override public Set instantiate() throws IOException { - // getBottomPanel().save(); - FileObject dir = Templates.getTargetFolder(wizard); FileObject template = Templates.getTemplate(wizard); DataFolder dataFolder = DataFolder.findFolder(dir); DataObject dataTemplate = DataObject.find(template); - DataObject createdFile = dataTemplate.createFromTemplate(dataFolder, Templates.getTargetName(wizard) + ".blade"); + DataObject createdFile = dataTemplate.createFromTemplate(dataFolder, Templates.getTargetName(wizard) + BladeLanguage.FILE_EXTENSION_SUFFIX); return Collections.singleton(createdFile.getPrimaryFile()); } @Override public void initialize(WizardDescriptor wizard) { this.wizard = wizard; - Templates.setTargetName(wizard, "myfile"); + Templates.setTargetName(wizard, DEFAULT_FILENAME); wizardPanel = createWizardPanel(); } @@ -88,7 +88,7 @@ public WizardDescriptor.Panel current() { @Override public String name() { - return "new php file wizaed"; // NOI18N + return "new blade php file wizard"; // NOI18N } @Override From 8867b054ebea804aae0673ca7d9948ce6d2166b6 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Fri, 11 Oct 2024 08:10:24 +0300 Subject: [PATCH 28/43] remove antlr generated files --- .gitignore | 3 + php/php.blade/build.xml | 2 +- .../formatter/BladeAntlrFormatterLexer.java | 1149 --- .../formatter/BladeAntlrFormatterParser.java | 1634 ----- ...BladeAntlrFormatterParserBaseListener.java | 264 - .../BladeAntlrFormatterParserListener.java | 200 - .../antlr4/v10/BladeAntlrColoringLexer.java | 1716 ----- .../syntax/antlr4/v10/BladeAntlrLexer.java | 2653 ------- .../syntax/antlr4/v10/BladeAntlrParser.java | 6269 ----------------- .../v10/BladeAntlrParserBaseListener.java | 897 --- .../antlr4/v10/BladeAntlrParserListener.java | 729 -- 11 files changed, 4 insertions(+), 15512 deletions(-) delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserBaseListener.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserListener.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserBaseListener.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserListener.java diff --git a/.gitignore b/.gitignore index 50efd8725540..7cbeab916600 100644 --- a/.gitignore +++ b/.gitignore @@ -119,5 +119,8 @@ derby.log /webcommon/javascript2.json/src/org/netbeans/modules/javascript2/json/parser/Json*.java +php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlr*.java +php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlr*.java + # idea .idea diff --git a/php/php.blade/build.xml b/php/php.blade/build.xml index 2b4b2d193870..409c84c8400b 100644 --- a/php/php.blade/build.xml +++ b/php/php.blade/build.xml @@ -22,7 +22,7 @@ Builds, tests, and runs the project org.netbeans.modules.php.blade - + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.java deleted file mode 100644 index b6760dc7259b..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterLexer.java +++ /dev/null @@ -1,1149 +0,0 @@ -// Generated from BladeAntlrFormatterLexer.g4 by ANTLR 4.13.0 - - /* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.syntax.antlr4.formatter; - -import org.antlr.v4.runtime.Lexer; -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.TokenStream; -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.atn.*; -import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.misc.*; - -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) -public class BladeAntlrFormatterLexer extends LexerAdaptor { - static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } - - protected static final DFA[] _decisionToDFA; - protected static final PredictionContextCache _sharedContextCache = - new PredictionContextCache(); - public static final int - HTML=1, PHP_CODE=2, PARAM_COMMA=3, PHP_INLINE=4, D_BLOCK_DIRECTIVE_START=5, - D_BLOCK_DIRECTIVE_END=6, D_SECTION=7, D_ENDSECTION=8, D_BLOCK_ALIGNED_DIRECTIVE=9, - NON_PARAM_DIRECTIVE=10, D_INLINE_DIRECTIVE=11, STRING=12, CONTENT_TAG_OPEN=13, - RAW_TAG_OPEN=14, SG_QUOTE=15, DB_QUOTE=16, HTML_CLOSE_TAG=17, HTML_COMMENT=18, - HTML_START_BLOCK_TAG=19, HTML_SELF_CLOSE_TAG=20, COMPONENT_TAG=21, EQ=22, - IDENTIFIER=23, INLINE_GT_SYMBOL=24, GT_SYMBOL=25, D_PHP=26, AT=27, WS=28, - NL=29, OTHER=30, D_ARG_LPAREN=31, D_ARG_RPAREN=32, PHP_EXPR=33, EXIT_EOF=34, - D_ARG_PARAM_LPAREN=35, D_ARG_PARAM_RPAREN=36, BL_SQ_LPAREN=37, BL_SQ_RPAREN=38, - BL_CURLY_LPAREN=39, BL_CURLY_RPAREN=40, D_ARG_COMMA_EL=41, BL_PHP_EXPR=42, - BL_EXIT_EOF=43, D_ENDPHP=44, CONTENT_TAG_CLOSE=45, CONTENT_OTHER=46, EXIT_REGULAR_ECHO_EOF=47, - RAW_TAG_CLOSE=48, RAW_CONTENT_OTHER=49, EXIT_RAW_ECHO_EOF=50; - public static final int - COMMENT=2; - public static final int - DIRECTIVE_ARG=1, DIRECTIVE_ARG_WITH_PARAM=2, BLADE_INLINE_PHP=3, INSIDE_REGULAR_ECHO=4, - INSIDE_RAW_ECHO=5; - public static String[] channelNames = { - "DEFAULT_TOKEN_CHANNEL", "HIDDEN", "COMMENT" - }; - - public static String[] modeNames = { - "DEFAULT_MODE", "DIRECTIVE_ARG", "DIRECTIVE_ARG_WITH_PARAM", "BLADE_INLINE_PHP", - "INSIDE_REGULAR_ECHO", "INSIDE_RAW_ECHO" - }; - - private static String[] makeRuleNames() { - return new String[] { - "DirectiveLabel", "Identifier", "CompomentIdentifier", "DirectiveArgLookup", - "DOUBLE_QUOTED_STRING_FRAGMENT", "SINGLE_QUOTED_STRING_FRAGMENT", "BlockDirectiveName", - "PHP_INLINE", "D_ESCAPES", "D_BLOCK_DIRECTIVE_START", "D_BLOCK_DIRECTIVE_START_NO_ARG", - "D_BLOCK_DIRECTIVE_END", "D_SECTION", "D_ENDSECTION", "D_BLOCK_ALIGNED_DIRECTIVE", - "NON_PARAM_DIRECTIVE", "D_INLINE_DIRECTIVE", "STRING", "CONTENT_TAG_OPEN", - "RAW_TAG_OPEN", "SG_QUOTE", "DB_QUOTE", "HTML_CLOSE_TAG", "HTML_COMMENT", - "HTML_START_BLOCK_TAG", "HTML_SELF_CLOSE_TAG", "COMPONENT_TAG", "EQ", - "IDENTIFIER", "INLINE_GT_SYMBOL", "GT_SYMBOL", "D_PHP", "AT", "WS", "NL", - "OTHER", "D_ARG_LPAREN", "D_ARG_RPAREN", "D_ARG_NL", "PHP_EXPR", "EXIT_EOF", - "D_ARG_PARAM_LPAREN", "D_ARG_PARAM_RPAREN", "BL_SQ_LPAREN", "BL_SQ_RPAREN", - "BL_CURLY_LPAREN", "BL_CURLY_RPAREN", "D_ARG_COMMA_EL", "D_ARG_PARAM_NL", - "BL_PHP_EXPR", "BL_EXIT_EOF", "D_ENDPHP", "PHP_CODE_GREEDY", "PHP_CODE_COMPLETION", - "CONTENT_TAG_CLOSE", "CONTENT_OTHER", "EXIT_REGULAR_ECHO_EOF", "RAW_TAG_CLOSE", - "RAW_CONTENT_OTHER", "EXIT_RAW_ECHO_EOF" - }; - } - public static final String[] ruleNames = makeRuleNames(); - - private static String[] makeLiteralNames() { - return new String[] { - null, null, null, null, null, null, null, null, null, null, null, null, - null, "'{{'", "'{!!'", "'''", "'\"'", null, null, null, null, null, "'='", - null, "'/>'", "'>'", null, "'@'", null, null, null, null, null, null, - null, null, null, null, null, null, null, "','", null, null, "'@endphp'" - }; - } - private static final String[] _LITERAL_NAMES = makeLiteralNames(); - private static String[] makeSymbolicNames() { - return new String[] { - null, "HTML", "PHP_CODE", "PARAM_COMMA", "PHP_INLINE", "D_BLOCK_DIRECTIVE_START", - "D_BLOCK_DIRECTIVE_END", "D_SECTION", "D_ENDSECTION", "D_BLOCK_ALIGNED_DIRECTIVE", - "NON_PARAM_DIRECTIVE", "D_INLINE_DIRECTIVE", "STRING", "CONTENT_TAG_OPEN", - "RAW_TAG_OPEN", "SG_QUOTE", "DB_QUOTE", "HTML_CLOSE_TAG", "HTML_COMMENT", - "HTML_START_BLOCK_TAG", "HTML_SELF_CLOSE_TAG", "COMPONENT_TAG", "EQ", - "IDENTIFIER", "INLINE_GT_SYMBOL", "GT_SYMBOL", "D_PHP", "AT", "WS", "NL", - "OTHER", "D_ARG_LPAREN", "D_ARG_RPAREN", "PHP_EXPR", "EXIT_EOF", "D_ARG_PARAM_LPAREN", - "D_ARG_PARAM_RPAREN", "BL_SQ_LPAREN", "BL_SQ_RPAREN", "BL_CURLY_LPAREN", - "BL_CURLY_RPAREN", "D_ARG_COMMA_EL", "BL_PHP_EXPR", "BL_EXIT_EOF", "D_ENDPHP", - "CONTENT_TAG_CLOSE", "CONTENT_OTHER", "EXIT_REGULAR_ECHO_EOF", "RAW_TAG_CLOSE", - "RAW_CONTENT_OTHER", "EXIT_RAW_ECHO_EOF" - }; - } - private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); - public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); - - /** - * @deprecated Use {@link #VOCABULARY} instead. - */ - @Deprecated - public static final String[] tokenNames; - static { - tokenNames = new String[_SYMBOLIC_NAMES.length]; - for (int i = 0; i < tokenNames.length; i++) { - tokenNames[i] = VOCABULARY.getLiteralName(i); - if (tokenNames[i] == null) { - tokenNames[i] = VOCABULARY.getSymbolicName(i); - } - - if (tokenNames[i] == null) { - tokenNames[i] = ""; - } - } - } - - @Override - @Deprecated - public String[] getTokenNames() { - return tokenNames; - } - - @Override - - public Vocabulary getVocabulary() { - return VOCABULARY; - } - - - public BladeAntlrFormatterLexer(CharStream input) { - super(input); - _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); - } - - @Override - public String getGrammarFileName() { return "BladeAntlrFormatterLexer.g4"; } - - @Override - public String[] getRuleNames() { return ruleNames; } - - @Override - public String getSerializedATN() { return _serializedATN; } - - @Override - public String[] getChannelNames() { return channelNames; } - - @Override - public String[] getModeNames() { return modeNames; } - - @Override - public ATN getATN() { return _ATN; } - - @Override - public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { - switch (ruleIndex) { - case 36: - D_ARG_LPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 37: - D_ARG_RPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 41: - D_ARG_PARAM_LPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 42: - D_ARG_PARAM_RPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 43: - BL_SQ_LPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 44: - BL_SQ_RPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 45: - BL_CURLY_LPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 46: - BL_CURLY_RPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 47: - D_ARG_COMMA_EL_action((RuleContext)_localctx, actionIndex); - break; - } - } - private void D_ARG_LPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 0: - this.consumeDirectiveArgLParen(); - break; - } - } - private void D_ARG_RPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 1: - this.consumeDirectiveArgRParen(); - break; - } - } - private void D_ARG_PARAM_LPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 2: - this.consumeDirectiveArgLParen(); - break; - } - } - private void D_ARG_PARAM_RPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 3: - this.consumeDirectiveArgRParen(); - break; - } - } - private void BL_SQ_LPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 4: - this.squareParenBalance++; - break; - } - } - private void BL_SQ_RPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 5: - this.squareParenBalance--; - break; - } - } - private void BL_CURLY_LPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 6: - this.curlyParenBalance++; - break; - } - } - private void BL_CURLY_RPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 7: - this.curlyParenBalance--; - break; - } - } - private void D_ARG_COMMA_EL_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 8: - this.consumeBladeParamComma(); - break; - } - } - @Override - public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { - switch (ruleIndex) { - case 3: - return DirectiveArgLookup_sempred((RuleContext)_localctx, predIndex); - case 24: - return HTML_START_BLOCK_TAG_sempred((RuleContext)_localctx, predIndex); - case 31: - return D_PHP_sempred((RuleContext)_localctx, predIndex); - } - return true; - } - private boolean DirectiveArgLookup_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 0: - return this._input.LA(1) == '('; - } - return true; - } - private boolean HTML_START_BLOCK_TAG_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 1: - return this._input.LA(1) == '>' || this._input.LA(1) == '@' || this._input.LA(1) == ' ' || this._input.LA(1) == '\n'; - } - return true; - } - private boolean D_PHP_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 2: - return this._input.LA(1) == ' ' || this._input.LA(1) == '\n'; - } - return true; - } - - public static final String _serializedATN = - "\u0004\u00002\u04c2\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ - "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000\u0007"+ - "\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007"+ - "\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007"+ - "\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n"+ - "\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002"+ - "\u000e\u0007\u000e\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002"+ - "\u0011\u0007\u0011\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002"+ - "\u0014\u0007\u0014\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002"+ - "\u0017\u0007\u0017\u0002\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002"+ - "\u001a\u0007\u001a\u0002\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002"+ - "\u001d\u0007\u001d\u0002\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002"+ - " \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002"+ - "%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002"+ - "*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002"+ - "/\u0007/\u00020\u00070\u00021\u00071\u00022\u00072\u00023\u00073\u0002"+ - "4\u00074\u00025\u00075\u00026\u00076\u00027\u00077\u00028\u00078\u0002"+ - "9\u00079\u0002:\u0007:\u0002;\u0007;\u0001\u0000\u0001\u0000\u0005\u0000"+ - "\u0081\b\u0000\n\u0000\f\u0000\u0084\t\u0000\u0001\u0001\u0001\u0001\u0005"+ - "\u0001\u0088\b\u0001\n\u0001\f\u0001\u008b\t\u0001\u0001\u0002\u0001\u0002"+ - "\u0005\u0002\u008f\b\u0002\n\u0002\f\u0002\u0092\t\u0002\u0001\u0003\u0005"+ - "\u0003\u0095\b\u0003\n\u0003\f\u0003\u0098\t\u0003\u0001\u0003\u0001\u0003"+ - "\u0001\u0004\u0001\u0004\u0001\u0004\u0005\u0004\u009f\b\u0004\n\u0004"+ - "\f\u0004\u00a2\t\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005"+ - "\u0001\u0005\u0001\u0005\u0005\u0005\u00aa\b\u0005\n\u0005\f\u0005\u00ad"+ - "\t\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003"+ - "\u0006\u00c6\b\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0003\u0006\u00d4\b\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003\u0006\u0131"+ - "\b\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0003\u0006\u0140\b\u0006\u0001\u0007\u0001\u0007\u0001"+ - "\u0007\u0001\u0007\u0001\u0007\u0005\u0007\u0147\b\u0007\n\u0007\f\u0007"+ - "\u014a\t\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0005\u0007\u0155\b\u0007"+ - "\n\u0007\f\u0007\u0158\t\u0007\u0001\u0007\u0001\u0007\u0003\u0007\u015c"+ - "\b\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0003"+ - "\b\u0165\b\b\u0001\b\u0001\b\u0001\b\u0001\b\u0003\b\u016b\b\b\u0001\b"+ - "\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0005\b\u0175"+ - "\b\b\n\b\f\b\u0178\t\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b"+ - "\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0003\b\u01e5\b\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001"+ - "\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0003\n\u01fe\b\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b\u020f\b\u000b"+ - "\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0003\r\u023a\b\r\u0001\u000e"+ - "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ - "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ - "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0003\u000e"+ - "\u024e\b\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ - "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ - "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0003\u000f\u025f\b\u000f"+ - "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ - "\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u026a\b\u0010\u0001\u0011"+ - "\u0001\u0011\u0003\u0011\u026e\b\u0011\u0001\u0012\u0001\u0012\u0001\u0012"+ - "\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ - "\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015"+ - "\u0001\u0016\u0001\u0016\u0005\u0016\u0281\b\u0016\n\u0016\f\u0016\u0284"+ - "\t\u0016\u0001\u0016\u0001\u0016\u0005\u0016\u0288\b\u0016\n\u0016\f\u0016"+ - "\u028b\t\u0016\u0001\u0016\u0001\u0016\u0005\u0016\u028f\b\u0016\n\u0016"+ - "\f\u0016\u0292\t\u0016\u0001\u0016\u0005\u0016\u0295\b\u0016\n\u0016\f"+ - "\u0016\u0298\t\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ - "\u0016\u0005\u0016\u029f\b\u0016\n\u0016\f\u0016\u02a2\t\u0016\u0001\u0016"+ - "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+ - "\u0001\u0016\u0001\u0016\u0004\u0016\u02ad\b\u0016\u000b\u0016\f\u0016"+ - "\u02ae\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ - "\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ - "\u0016\u0001\u0016\u0005\u0016\u02be\b\u0016\n\u0016\f\u0016\u02c1\t\u0016"+ - "\u0003\u0016\u02c3\b\u0016\u0001\u0016\u0005\u0016\u02c6\b\u0016\n\u0016"+ - "\f\u0016\u02c9\t\u0016\u0001\u0016\u0001\u0016\u0003\u0016\u02cd\b\u0016"+ - "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ - "\u0005\u0017\u02d5\b\u0017\n\u0017\f\u0017\u02d8\t\u0017\u0001\u0017\u0001"+ - "\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0003\u0018\u03fc\b\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001"+ - "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ - "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ - "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ - "\u0019\u0001\u0019\u0003\u0019\u0415\b\u0019\u0001\u001a\u0001\u001a\u0001"+ - "\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001"+ - "\u001a\u0001\u001a\u0001\u001a\u0004\u001a\u0422\b\u001a\u000b\u001a\f"+ - "\u001a\u0423\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ - "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ - "\u0001\u001a\u0003\u001a\u0432\b\u001a\u0001\u001b\u0001\u001b\u0001\u001c"+ - "\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e"+ - "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ - "\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001"+ - "!\u0004!\u044b\b!\u000b!\f!\u044c\u0001\"\u0004\"\u0450\b\"\u000b\"\f"+ - "\"\u0451\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001%\u0001"+ - "%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ - "(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001"+ - "+\u0001+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - "/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00011\u00011\u00011\u0001"+ - "1\u00012\u00012\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u0001"+ - "3\u00013\u00013\u00013\u00013\u00014\u00044\u049e\b4\u000b4\f4\u049f\u0001"+ - "4\u00014\u00015\u00015\u00015\u00015\u00016\u00016\u00016\u00016\u0001"+ - "6\u00017\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u00019\u0001"+ - "9\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0001;\u0001"+ - ";\u0001;\u0001;\u0004\u00a0\u0148\u0156\u02d6\u0000<\u0006\u0000\b\u0000"+ - "\n\u0000\f\u0000\u000e\u0000\u0010\u0000\u0012\u0000\u0014\u0004\u0016"+ - "\u0000\u0018\u0005\u001a\u0000\u001c\u0006\u001e\u0007 \b\"\t$\n&\u000b"+ - "(\f*\r,\u000e.\u000f0\u00102\u00114\u00126\u00138\u0014:\u0015<\u0016"+ - ">\u0017@\u0018B\u0019D\u001aF\u001bH\u001cJ\u001dL\u001eN\u001fP R\u0000"+ - "T!V\"X#Z$\\%^&`\'b(d)f\u0000h*j+l,n\u0000p\u0000r-t.v/x0z1|2\u0006\u0000"+ - "\u0001\u0002\u0003\u0004\u0005$\u0003\u0000AZaz\u0080\u8000\ufffe\u0005"+ - "\u000009AZ__az\u0080\u8000\ufffe\u0006\u0000..0:AZ__az\u0080\u8000\ufffe"+ - "\u0002\u0000\"\"\\\\\u0002\u0000\'\'\\\\\u0002\u0000AAaa\u0002\u0000U"+ - "Uuu\u0002\u0000TTtt\u0002\u0000HHhh\u0002\u0000GGgg\u0002\u0000EEee\u0002"+ - "\u0000SSss\u0002\u0000IIii\u0002\u0000FFff\u0002\u0000CCcc\u0002\u0000"+ - "NNnn\u0002\u0000YYyy\u0002\u0000OOoo\u0002\u0000RRrr\u0002\u0000LLll\u0002"+ - "\u0000WWww\u0002\u0000MMmm\u0002\u0000VVvv\u0002\u0000BBbb\u0002\u0000"+ - "PPpp\u0002\u0000DDdd\u0001\u0000 \u0002\u0000KKkk\u0006\u0000..09AZ_"+ - "_az\u0080\u8000\ufffe\u0002\u0000XXxx\u0002\u0000QQqq\u0001\u000019\u0006"+ - "\u0000ABIIPQabiipq\u0002\u0000\t\t \u0002\u0000\n\n\r\r\u0001\u0000@"+ - "@\u0549\u0000\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000\u0000"+ - "\u0000\u0000\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000"+ - "\u0000\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000"+ - "\u0000\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000"+ - "\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000("+ - "\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000"+ - "\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000"+ - "\u00002\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006"+ - "\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000"+ - "\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000"+ - "\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000D"+ - "\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001\u0000"+ - "\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000\u0000"+ - "\u0001N\u0001\u0000\u0000\u0000\u0001P\u0001\u0000\u0000\u0000\u0001R"+ - "\u0001\u0000\u0000\u0000\u0001T\u0001\u0000\u0000\u0000\u0001V\u0001\u0000"+ - "\u0000\u0000\u0002X\u0001\u0000\u0000\u0000\u0002Z\u0001\u0000\u0000\u0000"+ - "\u0002\\\u0001\u0000\u0000\u0000\u0002^\u0001\u0000\u0000\u0000\u0002"+ - "`\u0001\u0000\u0000\u0000\u0002b\u0001\u0000\u0000\u0000\u0002d\u0001"+ - "\u0000\u0000\u0000\u0002f\u0001\u0000\u0000\u0000\u0002h\u0001\u0000\u0000"+ - "\u0000\u0002j\u0001\u0000\u0000\u0000\u0003l\u0001\u0000\u0000\u0000\u0003"+ - "n\u0001\u0000\u0000\u0000\u0003p\u0001\u0000\u0000\u0000\u0004r\u0001"+ - "\u0000\u0000\u0000\u0004t\u0001\u0000\u0000\u0000\u0004v\u0001\u0000\u0000"+ - "\u0000\u0005x\u0001\u0000\u0000\u0000\u0005z\u0001\u0000\u0000\u0000\u0005"+ - "|\u0001\u0000\u0000\u0000\u0006~\u0001\u0000\u0000\u0000\b\u0085\u0001"+ - "\u0000\u0000\u0000\n\u008c\u0001\u0000\u0000\u0000\f\u0096\u0001\u0000"+ - "\u0000\u0000\u000e\u009b\u0001\u0000\u0000\u0000\u0010\u00a5\u0001\u0000"+ - "\u0000\u0000\u0012\u013f\u0001\u0000\u0000\u0000\u0014\u015b\u0001\u0000"+ - "\u0000\u0000\u0016\u01e4\u0001\u0000\u0000\u0000\u0018\u01e8\u0001\u0000"+ - "\u0000\u0000\u001a\u01ee\u0001\u0000\u0000\u0000\u001c\u020e\u0001\u0000"+ - "\u0000\u0000\u001e\u0210\u0001\u0000\u0000\u0000 \u0239\u0001\u0000\u0000"+ - "\u0000\"\u024d\u0001\u0000\u0000\u0000$\u025e\u0001\u0000\u0000\u0000"+ - "&\u0269\u0001\u0000\u0000\u0000(\u026d\u0001\u0000\u0000\u0000*\u026f"+ - "\u0001\u0000\u0000\u0000,\u0274\u0001\u0000\u0000\u0000.\u027a\u0001\u0000"+ - "\u0000\u00000\u027c\u0001\u0000\u0000\u00002\u02cc\u0001\u0000\u0000\u0000"+ - "4\u02ce\u0001\u0000\u0000\u00006\u02dd\u0001\u0000\u0000\u00008\u03ff"+ - "\u0001\u0000\u0000\u0000:\u0431\u0001\u0000\u0000\u0000<\u0433\u0001\u0000"+ - "\u0000\u0000>\u0435\u0001\u0000\u0000\u0000@\u0437\u0001\u0000\u0000\u0000"+ - "B\u043a\u0001\u0000\u0000\u0000D\u043c\u0001\u0000\u0000\u0000F\u0445"+ - "\u0001\u0000\u0000\u0000H\u044a\u0001\u0000\u0000\u0000J\u044f\u0001\u0000"+ - "\u0000\u0000L\u0453\u0001\u0000\u0000\u0000N\u0457\u0001\u0000\u0000\u0000"+ - "P\u045a\u0001\u0000\u0000\u0000R\u045d\u0001\u0000\u0000\u0000T\u0461"+ - "\u0001\u0000\u0000\u0000V\u0465\u0001\u0000\u0000\u0000X\u0469\u0001\u0000"+ - "\u0000\u0000Z\u046c\u0001\u0000\u0000\u0000\\\u046f\u0001\u0000\u0000"+ - "\u0000^\u0474\u0001\u0000\u0000\u0000`\u0479\u0001\u0000\u0000\u0000b"+ - "\u047e\u0001\u0000\u0000\u0000d\u0483\u0001\u0000\u0000\u0000f\u0486\u0001"+ - "\u0000\u0000\u0000h\u048a\u0001\u0000\u0000\u0000j\u048e\u0001\u0000\u0000"+ - "\u0000l\u0492\u0001\u0000\u0000\u0000n\u049d\u0001\u0000\u0000\u0000p"+ - "\u04a3\u0001\u0000\u0000\u0000r\u04a7\u0001\u0000\u0000\u0000t\u04ac\u0001"+ - "\u0000\u0000\u0000v\u04b0\u0001\u0000\u0000\u0000x\u04b4\u0001\u0000\u0000"+ - "\u0000z\u04ba\u0001\u0000\u0000\u0000|\u04be\u0001\u0000\u0000\u0000~"+ - "\u0082\u0007\u0000\u0000\u0000\u007f\u0081\u0007\u0001\u0000\u0000\u0080"+ - "\u007f\u0001\u0000\u0000\u0000\u0081\u0084\u0001\u0000\u0000\u0000\u0082"+ - "\u0080\u0001\u0000\u0000\u0000\u0082\u0083\u0001\u0000\u0000\u0000\u0083"+ - "\u0007\u0001\u0000\u0000\u0000\u0084\u0082\u0001\u0000\u0000\u0000\u0085"+ - "\u0089\u0007\u0000\u0000\u0000\u0086\u0088\u0007\u0001\u0000\u0000\u0087"+ - "\u0086\u0001\u0000\u0000\u0000\u0088\u008b\u0001\u0000\u0000\u0000\u0089"+ - "\u0087\u0001\u0000\u0000\u0000\u0089\u008a\u0001\u0000\u0000\u0000\u008a"+ - "\t\u0001\u0000\u0000\u0000\u008b\u0089\u0001\u0000\u0000\u0000\u008c\u0090"+ - "\u0007\u0000\u0000\u0000\u008d\u008f\u0007\u0002\u0000\u0000\u008e\u008d"+ - "\u0001\u0000\u0000\u0000\u008f\u0092\u0001\u0000\u0000\u0000\u0090\u008e"+ - "\u0001\u0000\u0000\u0000\u0090\u0091\u0001\u0000\u0000\u0000\u0091\u000b"+ - "\u0001\u0000\u0000\u0000\u0092\u0090\u0001\u0000\u0000\u0000\u0093\u0095"+ - "\u0005 \u0000\u0000\u0094\u0093\u0001\u0000\u0000\u0000\u0095\u0098\u0001"+ - "\u0000\u0000\u0000\u0096\u0094\u0001\u0000\u0000\u0000\u0096\u0097\u0001"+ - "\u0000\u0000\u0000\u0097\u0099\u0001\u0000\u0000\u0000\u0098\u0096\u0001"+ - "\u0000\u0000\u0000\u0099\u009a\u0004\u0003\u0000\u0000\u009a\r\u0001\u0000"+ - "\u0000\u0000\u009b\u00a0\u0005\"\u0000\u0000\u009c\u009f\u0007\u0003\u0000"+ - "\u0000\u009d\u009f\t\u0000\u0000\u0000\u009e\u009c\u0001\u0000\u0000\u0000"+ - "\u009e\u009d\u0001\u0000\u0000\u0000\u009f\u00a2\u0001\u0000\u0000\u0000"+ - "\u00a0\u00a1\u0001\u0000\u0000\u0000\u00a0\u009e\u0001\u0000\u0000\u0000"+ - "\u00a1\u00a3\u0001\u0000\u0000\u0000\u00a2\u00a0\u0001\u0000\u0000\u0000"+ - "\u00a3\u00a4\u0005\"\u0000\u0000\u00a4\u000f\u0001\u0000\u0000\u0000\u00a5"+ - "\u00ab\u0005\'\u0000\u0000\u00a6\u00aa\b\u0004\u0000\u0000\u00a7\u00a8"+ - "\u0005\\\u0000\u0000\u00a8\u00aa\t\u0000\u0000\u0000\u00a9\u00a6\u0001"+ - "\u0000\u0000\u0000\u00a9\u00a7\u0001\u0000\u0000\u0000\u00aa\u00ad\u0001"+ - "\u0000\u0000\u0000\u00ab\u00a9\u0001\u0000\u0000\u0000\u00ab\u00ac\u0001"+ - "\u0000\u0000\u0000\u00ac\u00ae\u0001\u0000\u0000\u0000\u00ad\u00ab\u0001"+ - "\u0000\u0000\u0000\u00ae\u00af\u0005\'\u0000\u0000\u00af\u0011\u0001\u0000"+ - "\u0000\u0000\u00b0\u00b1\u0007\u0005\u0000\u0000\u00b1\u00b2\u0007\u0006"+ - "\u0000\u0000\u00b2\u00b3\u0007\u0007\u0000\u0000\u00b3\u0140\u0007\b\u0000"+ - "\u0000\u00b4\u00b5\u0007\t\u0000\u0000\u00b5\u00b6\u0007\u0006\u0000\u0000"+ - "\u00b6\u00b7\u0007\n\u0000\u0000\u00b7\u00b8\u0007\u000b\u0000\u0000\u00b8"+ - "\u0140\u0007\u0007\u0000\u0000\u00b9\u00ba\u0007\f\u0000\u0000\u00ba\u0140"+ - "\u0007\r\u0000\u0000\u00bb\u00bc\u0007\u000e\u0000\u0000\u00bc\u00bd\u0007"+ - "\u0005\u0000\u0000\u00bd\u00be\u0007\u000f\u0000\u0000\u00be\u00c5\u0001"+ - "\u0000\u0000\u0000\u00bf\u00c0\u0007\u0005\u0000\u0000\u00c0\u00c1\u0007"+ - "\u000f\u0000\u0000\u00c1\u00c6\u0007\u0010\u0000\u0000\u00c2\u00c3\u0007"+ - "\u000f\u0000\u0000\u00c3\u00c4\u0007\u0011\u0000\u0000\u00c4\u00c6\u0007"+ - "\u0007\u0000\u0000\u00c5\u00bf\u0001\u0000\u0000\u0000\u00c5\u00c2\u0001"+ - "\u0000\u0000\u0000\u00c5\u00c6\u0001\u0000\u0000\u0000\u00c6\u0140\u0001"+ - "\u0000\u0000\u0000\u00c7\u00c8\u0007\r\u0000\u0000\u00c8\u00c9\u0007\u0011"+ - "\u0000\u0000\u00c9\u00ca\u0007\u0012\u0000\u0000\u00ca\u00d3\u0001\u0000"+ - "\u0000\u0000\u00cb\u00cc\u0007\n\u0000\u0000\u00cc\u00cd\u0007\u0005\u0000"+ - "\u0000\u00cd\u00ce\u0007\u000e\u0000\u0000\u00ce\u00d4\u0007\b\u0000\u0000"+ - "\u00cf\u00d0\u0007\n\u0000\u0000\u00d0\u00d1\u0007\u0013\u0000\u0000\u00d1"+ - "\u00d2\u0007\u000b\u0000\u0000\u00d2\u00d4\u0007\n\u0000\u0000\u00d3\u00cb"+ - "\u0001\u0000\u0000\u0000\u00d3\u00cf\u0001\u0000\u0000\u0000\u00d3\u00d4"+ - "\u0001\u0000\u0000\u0000\u00d4\u0140\u0001\u0000\u0000\u0000\u00d5\u00d6"+ - "\u0007\u0014\u0000\u0000\u00d6\u00d7\u0007\b\u0000\u0000\u00d7\u00d8\u0007"+ - "\f\u0000\u0000\u00d8\u00d9\u0007\u0013\u0000\u0000\u00d9\u0140\u0007\n"+ - "\u0000\u0000\u00da\u00db\u0007\b\u0000\u0000\u00db\u00dc\u0007\u0005\u0000"+ - "\u0000\u00dc\u00dd\u0007\u000b\u0000\u0000\u00dd\u00de\u0007\u000b\u0000"+ - "\u0000\u00de\u00df\u0007\n\u0000\u0000\u00df\u00e0\u0007\u000e\u0000\u0000"+ - "\u00e0\u00e1\u0007\u0007\u0000\u0000\u00e1\u00e2\u0007\f\u0000\u0000\u00e2"+ - "\u00e3\u0007\u0011\u0000\u0000\u00e3\u0140\u0007\u000f\u0000\u0000\u00e4"+ - "\u00e5\u0007\u000b\u0000\u0000\u00e5\u00e6\u0007\n\u0000\u0000\u00e6\u00e7"+ - "\u0007\u000e\u0000\u0000\u00e7\u00e8\u0007\u0007\u0000\u0000\u00e8\u00e9"+ - "\u0007\f\u0000\u0000\u00e9\u00ea\u0007\u0011\u0000\u0000\u00ea\u00eb\u0007"+ - "\u000f\u0000\u0000\u00eb\u00ec\u0007\u0015\u0000\u0000\u00ec\u00ed\u0007"+ - "\f\u0000\u0000\u00ed\u00ee\u0007\u000b\u0000\u0000\u00ee\u00ef\u0007\u000b"+ - "\u0000\u0000\u00ef\u00f0\u0007\f\u0000\u0000\u00f0\u00f1\u0007\u000f\u0000"+ - "\u0000\u00f1\u0140\u0007\t\u0000\u0000\u00f2\u00f3\u0007\r\u0000\u0000"+ - "\u00f3\u00f4\u0007\u0012\u0000\u0000\u00f4\u00f5\u0007\u0005\u0000\u0000"+ - "\u00f5\u00f6\u0007\t\u0000\u0000\u00f6\u00f7\u0007\u0015\u0000\u0000\u00f7"+ - "\u00f8\u0007\n\u0000\u0000\u00f8\u00f9\u0007\u000f\u0000\u0000\u00f9\u0140"+ - "\u0007\u0007\u0000\u0000\u00fa\u00fb\u0007\u0016\u0000\u0000\u00fb\u00fc"+ - "\u0007\n\u0000\u0000\u00fc\u00fd\u0007\u0012\u0000\u0000\u00fd\u00fe\u0007"+ - "\u0017\u0000\u0000\u00fe\u00ff\u0007\u0005\u0000\u0000\u00ff\u0100\u0007"+ - "\u0007\u0000\u0000\u0100\u0101\u0007\f\u0000\u0000\u0101\u0140\u0007\u0015"+ - "\u0000\u0000\u0102\u0103\u0007\f\u0000\u0000\u0103\u0104\u0007\u000b\u0000"+ - "\u0000\u0104\u0105\u0007\u000b\u0000\u0000\u0105\u0106\u0007\n\u0000\u0000"+ - "\u0106\u0140\u0007\u0007\u0000\u0000\u0107\u0108\u0007\u0006\u0000\u0000"+ - "\u0108\u0109\u0007\u000f\u0000\u0000\u0109\u010a\u0007\u0013\u0000\u0000"+ - "\u010a\u010b\u0007\n\u0000\u0000\u010b\u010c\u0007\u000b\u0000\u0000\u010c"+ - "\u0140\u0007\u000b\u0000\u0000\u010d\u010e\u0007\n\u0000\u0000\u010e\u010f"+ - "\u0007\u0015\u0000\u0000\u010f\u0110\u0007\u0018\u0000\u0000\u0110\u0111"+ - "\u0007\u0007\u0000\u0000\u0111\u0140\u0007\u0010\u0000\u0000\u0112\u0113"+ - "\u0007\u000b\u0000\u0000\u0113\u0114\u0007\n\u0000\u0000\u0114\u0115\u0007"+ - "\u000b\u0000\u0000\u0115\u0116\u0007\u000b\u0000\u0000\u0116\u0117\u0007"+ - "\f\u0000\u0000\u0117\u0118\u0007\u0011\u0000\u0000\u0118\u0140\u0007\u000f"+ - "\u0000\u0000\u0119\u011a\u0007\n\u0000\u0000\u011a\u011b\u0007\u000f\u0000"+ - "\u0000\u011b\u0140\u0007\u0016\u0000\u0000\u011c\u011d\u0007\u0011\u0000"+ - "\u0000\u011d\u011e\u0007\u000f\u0000\u0000\u011e\u011f\u0007\u000e\u0000"+ - "\u0000\u011f\u0140\u0007\n\u0000\u0000\u0120\u0121\u0007\n\u0000\u0000"+ - "\u0121\u0122\u0007\u0012\u0000\u0000\u0122\u0123\u0007\u0012\u0000\u0000"+ - "\u0123\u0124\u0007\u0011\u0000\u0000\u0124\u0140\u0007\u0012\u0000\u0000"+ - "\u0125\u0126\u0007\u0018\u0000\u0000\u0126\u0127\u0007\u0006\u0000\u0000"+ - "\u0127\u0128\u0007\u000b\u0000\u0000\u0128\u0129\u0007\b\u0000\u0000\u0129"+ - "\u0130\u0001\u0000\u0000\u0000\u012a\u012b\u0007\f\u0000\u0000\u012b\u0131"+ - "\u0007\r\u0000\u0000\u012c\u012d\u0007\u0011\u0000\u0000\u012d\u012e\u0007"+ - "\u000f\u0000\u0000\u012e\u012f\u0007\u000e\u0000\u0000\u012f\u0131\u0007"+ - "\n\u0000\u0000\u0130\u012a\u0001\u0000\u0000\u0000\u0130\u012c\u0001\u0000"+ - "\u0000\u0000\u0130\u0131\u0001\u0000\u0000\u0000\u0131\u0140\u0001\u0000"+ - "\u0000\u0000\u0132\u0133\u0007\u0018\u0000\u0000\u0133\u0134\u0007\u0012"+ - "\u0000\u0000\u0134\u0135\u0007\n\u0000\u0000\u0135\u0136\u0007\u0018\u0000"+ - "\u0000\u0136\u0137\u0007\n\u0000\u0000\u0137\u0138\u0007\u000f\u0000\u0000"+ - "\u0138\u0140\u0007\u0019\u0000\u0000\u0139\u013a\u0007\u000b\u0000\u0000"+ - "\u013a\u013b\u0007\u0014\u0000\u0000\u013b\u013c\u0007\f\u0000\u0000\u013c"+ - "\u013d\u0007\u0007\u0000\u0000\u013d\u013e\u0007\u000e\u0000\u0000\u013e"+ - "\u0140\u0007\b\u0000\u0000\u013f\u00b0\u0001\u0000\u0000\u0000\u013f\u00b4"+ - "\u0001\u0000\u0000\u0000\u013f\u00b9\u0001\u0000\u0000\u0000\u013f\u00bb"+ - "\u0001\u0000\u0000\u0000\u013f\u00c7\u0001\u0000\u0000\u0000\u013f\u00d5"+ - "\u0001\u0000\u0000\u0000\u013f\u00da\u0001\u0000\u0000\u0000\u013f\u00e4"+ - "\u0001\u0000\u0000\u0000\u013f\u00f2\u0001\u0000\u0000\u0000\u013f\u00fa"+ - "\u0001\u0000\u0000\u0000\u013f\u0102\u0001\u0000\u0000\u0000\u013f\u0107"+ - "\u0001\u0000\u0000\u0000\u013f\u010d\u0001\u0000\u0000\u0000\u013f\u0112"+ - "\u0001\u0000\u0000\u0000\u013f\u0119\u0001\u0000\u0000\u0000\u013f\u011c"+ - "\u0001\u0000\u0000\u0000\u013f\u0120\u0001\u0000\u0000\u0000\u013f\u0125"+ - "\u0001\u0000\u0000\u0000\u013f\u0132\u0001\u0000\u0000\u0000\u013f\u0139"+ - "\u0001\u0000\u0000\u0000\u0140\u0013\u0001\u0000\u0000\u0000\u0141\u0142"+ - "\u0005<\u0000\u0000\u0142\u0143\u0005?\u0000\u0000\u0143\u0144\u0005="+ - "\u0000\u0000\u0144\u0148\u0001\u0000\u0000\u0000\u0145\u0147\t\u0000\u0000"+ - "\u0000\u0146\u0145\u0001\u0000\u0000\u0000\u0147\u014a\u0001\u0000\u0000"+ - "\u0000\u0148\u0149\u0001\u0000\u0000\u0000\u0148\u0146\u0001\u0000\u0000"+ - "\u0000\u0149\u014b\u0001\u0000\u0000\u0000\u014a\u0148\u0001\u0000\u0000"+ - "\u0000\u014b\u014c\u0005?\u0000\u0000\u014c\u015c\u0005>\u0000\u0000\u014d"+ - "\u014e\u0005<\u0000\u0000\u014e\u014f\u0005?\u0000\u0000\u014f\u0150\u0007"+ - "\u0018\u0000\u0000\u0150\u0151\u0007\b\u0000\u0000\u0151\u0152\u0007\u0018"+ - "\u0000\u0000\u0152\u0156\u0001\u0000\u0000\u0000\u0153\u0155\t\u0000\u0000"+ - "\u0000\u0154\u0153\u0001\u0000\u0000\u0000\u0155\u0158\u0001\u0000\u0000"+ - "\u0000\u0156\u0157\u0001\u0000\u0000\u0000\u0156\u0154\u0001\u0000\u0000"+ - "\u0000\u0157\u0159\u0001\u0000\u0000\u0000\u0158\u0156\u0001\u0000\u0000"+ - "\u0000\u0159\u015a\u0005?\u0000\u0000\u015a\u015c\u0005>\u0000\u0000\u015b"+ - "\u0141\u0001\u0000\u0000\u0000\u015b\u014d\u0001\u0000\u0000\u0000\u015c"+ - "\u0015\u0001\u0000\u0000\u0000\u015d\u015e\u0005{\u0000\u0000\u015e\u015f"+ - "\u0005{\u0000\u0000\u015f\u01e5\u0005{\u0000\u0000\u0160\u0161\u0005@"+ - "\u0000\u0000\u0161\u0162\u0005@\u0000\u0000\u0162\u0164\u0001\u0000\u0000"+ - "\u0000\u0163\u0165\u0005@\u0000\u0000\u0164\u0163\u0001\u0000\u0000\u0000"+ - "\u0164\u0165\u0001\u0000\u0000\u0000\u0165\u01e5\u0001\u0000\u0000\u0000"+ - "\u0166\u0167\u0005@\u0000\u0000\u0167\u0168\u0005{\u0000\u0000\u0168\u016a"+ - "\u0001\u0000\u0000\u0000\u0169\u016b\u0005{\u0000\u0000\u016a\u0169\u0001"+ - "\u0000\u0000\u0000\u016a\u016b\u0001\u0000\u0000\u0000\u016b\u01e5\u0001"+ - "\u0000\u0000\u0000\u016c\u016d\u0005@\u0000\u0000\u016d\u016e\u0007\u0015"+ - "\u0000\u0000\u016e\u016f\u0007\n\u0000\u0000\u016f\u0170\u0007\u0019\u0000"+ - "\u0000\u0170\u0171\u0007\f\u0000\u0000\u0171\u0172\u0007\u0005\u0000\u0000"+ - "\u0172\u0176\u0001\u0000\u0000\u0000\u0173\u0175\u0007\u001a\u0000\u0000"+ - "\u0174\u0173\u0001\u0000\u0000\u0000\u0175\u0178\u0001\u0000\u0000\u0000"+ - "\u0176\u0174\u0001\u0000\u0000\u0000\u0176\u0177\u0001\u0000\u0000\u0000"+ - "\u0177\u01e5\u0001\u0000\u0000\u0000\u0178\u0176\u0001\u0000\u0000\u0000"+ - "\u0179\u017a\u0005@\u0000\u0000\u017a\u017b\u0007\u000e\u0000\u0000\u017b"+ - "\u017c\u0007\b\u0000\u0000\u017c\u017d\u0007\u0005\u0000\u0000\u017d\u017e"+ - "\u0007\u0012\u0000\u0000\u017e\u017f\u0007\u000b\u0000\u0000\u017f\u0180"+ - "\u0007\n\u0000\u0000\u0180\u01e5\u0007\u0007\u0000\u0000\u0181\u0182\u0005"+ - "@\u0000\u0000\u0182\u0183\u0007\f\u0000\u0000\u0183\u0184\u0007\u0015"+ - "\u0000\u0000\u0184\u0185\u0007\u0018\u0000\u0000\u0185\u0186\u0007\u0011"+ - "\u0000\u0000\u0186\u0187\u0007\u0012\u0000\u0000\u0187\u01e5\u0007\u0007"+ - "\u0000\u0000\u0188\u0189\u0005@\u0000\u0000\u0189\u018a\u0007\u000f\u0000"+ - "\u0000\u018a\u018b\u0007\u0005\u0000\u0000\u018b\u018c\u0007\u0015\u0000"+ - "\u0000\u018c\u018d\u0007\n\u0000\u0000\u018d\u018e\u0007\u000b\u0000\u0000"+ - "\u018e\u018f\u0007\u0018\u0000\u0000\u018f\u0190\u0007\u0005\u0000\u0000"+ - "\u0190\u0191\u0007\u000e\u0000\u0000\u0191\u01e5\u0007\n\u0000\u0000\u0192"+ - "\u0193\u0005@\u0000\u0000\u0193\u0194\u0007\u0019\u0000\u0000\u0194\u0195"+ - "\u0007\u0011\u0000\u0000\u0195\u0196\u0007\u000e\u0000\u0000\u0196\u0197"+ - "\u0007\u0006\u0000\u0000\u0197\u0198\u0007\u0015\u0000\u0000\u0198\u0199"+ - "\u0007\n\u0000\u0000\u0199\u019a\u0007\u000f\u0000\u0000\u019a\u01e5\u0007"+ - "\u0007\u0000\u0000\u019b\u019c\u0005@\u0000\u0000\u019c\u019d\u0007\r"+ - "\u0000\u0000\u019d\u019e\u0007\u0011\u0000\u0000\u019e\u019f\u0007\u000f"+ - "\u0000\u0000\u019f\u01a0\u0007\u0007\u0000\u0000\u01a0\u01a1\u0005-\u0000"+ - "\u0000\u01a1\u01a2\u0007\r\u0000\u0000\u01a2\u01a3\u0007\u0005\u0000\u0000"+ - "\u01a3\u01a4\u0007\u000e\u0000\u0000\u01a4\u01e5\u0007\n\u0000\u0000\u01a5"+ - "\u01a6\u0005@\u0000\u0000\u01a6\u01a7\u0007\u0018\u0000\u0000\u01a7\u01a8"+ - "\u0007\u0005\u0000\u0000\u01a8\u01a9\u0007\t\u0000\u0000\u01a9\u01e5\u0007"+ - "\n\u0000\u0000\u01aa\u01ab\u0005@\u0000\u0000\u01ab\u01ac\u0007\u000b"+ - "\u0000\u0000\u01ac\u01ad\u0007\u0006\u0000\u0000\u01ad\u01ae\u0007\u0018"+ - "\u0000\u0000\u01ae\u01af\u0007\u0018\u0000\u0000\u01af\u01b0\u0007\u0011"+ - "\u0000\u0000\u01b0\u01b1\u0007\u0012\u0000\u0000\u01b1\u01b2\u0007\u0007"+ - "\u0000\u0000\u01b2\u01e5\u0007\u000b\u0000\u0000\u01b3\u01b4\u0005@\u0000"+ - "\u0000\u01b4\u01b5\u0007\u0013\u0000\u0000\u01b5\u01b6\u0007\u0005\u0000"+ - "\u0000\u01b6\u01b7\u0007\u0010\u0000\u0000\u01b7\u01b8\u0007\n\u0000\u0000"+ - "\u01b8\u01e5\u0007\u0012\u0000\u0000\u01b9\u01ba\u0005@\u0000\u0000\u01ba"+ - "\u01bb\u0007\u0007\u0000\u0000\u01bb\u01bc\u0007\u0005\u0000\u0000\u01bc"+ - "\u01bd\u0007\f\u0000\u0000\u01bd\u01be\u0007\u0013\u0000\u0000\u01be\u01bf"+ - "\u0007\u0014\u0000\u0000\u01bf\u01c0\u0007\f\u0000\u0000\u01c0\u01c1\u0007"+ - "\u000f\u0000\u0000\u01c1\u01e5\u0007\u0019\u0000\u0000\u01c2\u01c3\u0005"+ - "@\u0000\u0000\u01c3\u01c4\u0007\u0005\u0000\u0000\u01c4\u01c5\u0007\u0018"+ - "\u0000\u0000\u01c5\u01c6\u0007\u0018\u0000\u0000\u01c6\u01c7\u0007\u0013"+ - "\u0000\u0000\u01c7\u01e5\u0007\u0010\u0000\u0000\u01c8\u01c9\u0005@\u0000"+ - "\u0000\u01c9\u01ca\u0005-\u0000\u0000\u01ca\u01cb\u0007\u0014\u0000\u0000"+ - "\u01cb\u01cc\u0007\n\u0000\u0000\u01cc\u01cd\u0007\u0017\u0000\u0000\u01cd"+ - "\u01ce\u0007\u001b\u0000\u0000\u01ce\u01cf\u0007\f\u0000\u0000\u01cf\u01d0"+ - "\u0007\u0007\u0000\u0000\u01d0\u01d1\u0005-\u0000\u0000\u01d1\u01d2\u0007"+ - "\u001b\u0000\u0000\u01d2\u01d3\u0007\n\u0000\u0000\u01d3\u01d4\u0007\u0010"+ - "\u0000\u0000\u01d4\u01d5\u0007\r\u0000\u0000\u01d5\u01d6\u0007\u0012\u0000"+ - "\u0000\u01d6\u01d7\u0007\u0005\u0000\u0000\u01d7\u01d8\u0007\u0015\u0000"+ - "\u0000\u01d8\u01d9\u0007\n\u0000\u0000\u01d9\u01e5\u0007\u000b\u0000\u0000"+ - "\u01da\u01db\u0005@\u0000\u0000\u01db\u01dc\u0007\u001b\u0000\u0000\u01dc"+ - "\u01dd\u0007\n\u0000\u0000\u01dd\u01de\u0007\u0010\u0000\u0000\u01de\u01df"+ - "\u0007\r\u0000\u0000\u01df\u01e0\u0007\u0012\u0000\u0000\u01e0\u01e1\u0007"+ - "\u0005\u0000\u0000\u01e1\u01e2\u0007\u0015\u0000\u0000\u01e2\u01e3\u0007"+ - "\n\u0000\u0000\u01e3\u01e5\u0007\u000b\u0000\u0000\u01e4\u015d\u0001\u0000"+ - "\u0000\u0000\u01e4\u0160\u0001\u0000\u0000\u0000\u01e4\u0166\u0001\u0000"+ - "\u0000\u0000\u01e4\u016c\u0001\u0000\u0000\u0000\u01e4\u0179\u0001\u0000"+ - "\u0000\u0000\u01e4\u0181\u0001\u0000\u0000\u0000\u01e4\u0188\u0001\u0000"+ - "\u0000\u0000\u01e4\u0192\u0001\u0000\u0000\u0000\u01e4\u019b\u0001\u0000"+ - "\u0000\u0000\u01e4\u01a5\u0001\u0000\u0000\u0000\u01e4\u01aa\u0001\u0000"+ - "\u0000\u0000\u01e4\u01b3\u0001\u0000\u0000\u0000\u01e4\u01b9\u0001\u0000"+ - "\u0000\u0000\u01e4\u01c2\u0001\u0000\u0000\u0000\u01e4\u01c8\u0001\u0000"+ - "\u0000\u0000\u01e4\u01da\u0001\u0000\u0000\u0000\u01e5\u01e6\u0001\u0000"+ - "\u0000\u0000\u01e6\u01e7\u0006\b\u0000\u0000\u01e7\u0017\u0001\u0000\u0000"+ - "\u0000\u01e8\u01e9\u0005@\u0000\u0000\u01e9\u01ea\u0003\u0012\u0006\u0000"+ - "\u01ea\u01eb\u0003\f\u0003\u0000\u01eb\u01ec\u0001\u0000\u0000\u0000\u01ec"+ - "\u01ed\u0006\t\u0001\u0000\u01ed\u0019\u0001\u0000\u0000\u0000\u01ee\u01fd"+ - "\u0005@\u0000\u0000\u01ef\u01f0\u0007\u0005\u0000\u0000\u01f0\u01f1\u0007"+ - "\u0006\u0000\u0000\u01f1\u01f2\u0007\u0007\u0000\u0000\u01f2\u01fe\u0007"+ - "\b\u0000\u0000\u01f3\u01f4\u0007\u0018\u0000\u0000\u01f4\u01f5\u0007\u0012"+ - "\u0000\u0000\u01f5\u01f6\u0007\u0011\u0000\u0000\u01f6\u01f7\u0007\u0019"+ - "\u0000\u0000\u01f7\u01f8\u0007\u0006\u0000\u0000\u01f8\u01f9\u0007\u000e"+ - "\u0000\u0000\u01f9\u01fa\u0007\u0007\u0000\u0000\u01fa\u01fb\u0007\f\u0000"+ - "\u0000\u01fb\u01fc\u0007\u0011\u0000\u0000\u01fc\u01fe\u0007\u000f\u0000"+ - "\u0000\u01fd\u01ef\u0001\u0000\u0000\u0000\u01fd\u01f3\u0001\u0000\u0000"+ - "\u0000\u01fe\u01ff\u0001\u0000\u0000\u0000\u01ff\u0200\u0006\n\u0002\u0000"+ - "\u0200\u001b\u0001\u0000\u0000\u0000\u0201\u0202\u0005@\u0000\u0000\u0202"+ - "\u0203\u0007\n\u0000\u0000\u0203\u0204\u0007\u000f\u0000\u0000\u0204\u0205"+ - "\u0007\u0019\u0000\u0000\u0205\u0206\u0001\u0000\u0000\u0000\u0206\u020f"+ - "\u0003\u0012\u0006\u0000\u0207\u0208\u0005@\u0000\u0000\u0208\u0209\u0007"+ - "\n\u0000\u0000\u0209\u020a\u0007\u000f\u0000\u0000\u020a\u020b\u0007\u0019"+ - "\u0000\u0000\u020b\u020c\u0007\u0018\u0000\u0000\u020c\u020d\u0007\b\u0000"+ - "\u0000\u020d\u020f\u0007\u0018\u0000\u0000\u020e\u0201\u0001\u0000\u0000"+ - "\u0000\u020e\u0207\u0001\u0000\u0000\u0000\u020f\u001d\u0001\u0000\u0000"+ - "\u0000\u0210\u0211\u0005@\u0000\u0000\u0211\u0212\u0007\u000b\u0000\u0000"+ - "\u0212\u0213\u0007\n\u0000\u0000\u0213\u0214\u0007\u000e\u0000\u0000\u0214"+ - "\u0215\u0007\u0007\u0000\u0000\u0215\u0216\u0007\f\u0000\u0000\u0216\u0217"+ - "\u0007\u0011\u0000\u0000\u0217\u0218\u0007\u000f\u0000\u0000\u0218\u0219"+ - "\u0001\u0000\u0000\u0000\u0219\u021a\u0003\f\u0003\u0000\u021a\u021b\u0001"+ - "\u0000\u0000\u0000\u021b\u021c\u0006\f\u0003\u0000\u021c\u001f\u0001\u0000"+ - "\u0000\u0000\u021d\u021e\u0005@\u0000\u0000\u021e\u021f\u0007\n\u0000"+ - "\u0000\u021f\u0220\u0007\u000f\u0000\u0000\u0220\u0221\u0007\u0019\u0000"+ - "\u0000\u0221\u0222\u0007\u000b\u0000\u0000\u0222\u0223\u0007\n\u0000\u0000"+ - "\u0223\u0224\u0007\u000e\u0000\u0000\u0224\u0225\u0007\u0007\u0000\u0000"+ - "\u0225\u0226\u0007\f\u0000\u0000\u0226\u0227\u0007\u0011\u0000\u0000\u0227"+ - "\u023a\u0007\u000f\u0000\u0000\u0228\u0229\u0005@\u0000\u0000\u0229\u022a"+ - "\u0007\u000b\u0000\u0000\u022a\u022b\u0007\b\u0000\u0000\u022b\u022c\u0007"+ - "\u0011\u0000\u0000\u022c\u023a\u0007\u0014\u0000\u0000\u022d\u022e\u0005"+ - "@\u0000\u0000\u022e\u022f\u0007\u0005\u0000\u0000\u022f\u0230\u0007\u0018"+ - "\u0000\u0000\u0230\u0231\u0007\u0018\u0000\u0000\u0231\u0232\u0007\n\u0000"+ - "\u0000\u0232\u0233\u0007\u000f\u0000\u0000\u0233\u023a\u0007\u0019\u0000"+ - "\u0000\u0234\u0235\u0005@\u0000\u0000\u0235\u0236\u0007\u000b\u0000\u0000"+ - "\u0236\u0237\u0007\u0007\u0000\u0000\u0237\u0238\u0007\u0011\u0000\u0000"+ - "\u0238\u023a\u0007\u0018\u0000\u0000\u0239\u021d\u0001\u0000\u0000\u0000"+ - "\u0239\u0228\u0001\u0000\u0000\u0000\u0239\u022d\u0001\u0000\u0000\u0000"+ - "\u0239\u0234\u0001\u0000\u0000\u0000\u023a!\u0001\u0000\u0000\u0000\u023b"+ - "\u023c\u0005@\u0000\u0000\u023c\u023d\u0007\n\u0000\u0000\u023d\u023e"+ - "\u0007\u0013\u0000\u0000\u023e\u023f\u0007\u000b\u0000\u0000\u023f\u024e"+ - "\u0007\n\u0000\u0000\u0240\u0241\u0005@\u0000\u0000\u0241\u0242\u0007"+ - "\n\u0000\u0000\u0242\u0243\u0007\u0013\u0000\u0000\u0243\u0244\u0007\u000b"+ - "\u0000\u0000\u0244\u0245\u0007\n\u0000\u0000\u0245\u0246\u0007\f\u0000"+ - "\u0000\u0246\u024e\u0007\r\u0000\u0000\u0247\u0248\u0005@\u0000\u0000"+ - "\u0248\u0249\u0007\n\u0000\u0000\u0249\u024a\u0007\u0015\u0000\u0000\u024a"+ - "\u024b\u0007\u0018\u0000\u0000\u024b\u024c\u0007\u0007\u0000\u0000\u024c"+ - "\u024e\u0007\u0010\u0000\u0000\u024d\u023b\u0001\u0000\u0000\u0000\u024d"+ - "\u0240\u0001\u0000\u0000\u0000\u024d\u0247\u0001\u0000\u0000\u0000\u024e"+ - "#\u0001\u0000\u0000\u0000\u024f\u0250\u0005@\u0000\u0000\u0250\u0251\u0007"+ - "\u000e\u0000\u0000\u0251\u0252\u0007\u0011\u0000\u0000\u0252\u0253\u0007"+ - "\u000f\u0000\u0000\u0253\u0254\u0007\u0007\u0000\u0000\u0254\u0255\u0007"+ - "\f\u0000\u0000\u0255\u0256\u0007\u000f\u0000\u0000\u0256\u0257\u0007\u0006"+ - "\u0000\u0000\u0257\u025f\u0007\n\u0000\u0000\u0258\u0259\u0005@\u0000"+ - "\u0000\u0259\u025a\u0007\u0017\u0000\u0000\u025a\u025b\u0007\u0012\u0000"+ - "\u0000\u025b\u025c\u0007\n\u0000\u0000\u025c\u025d\u0007\u0005\u0000\u0000"+ - "\u025d\u025f\u0007\u001b\u0000\u0000\u025e\u024f\u0001\u0000\u0000\u0000"+ - "\u025e\u0258\u0001\u0000\u0000\u0000\u025f%\u0001\u0000\u0000\u0000\u0260"+ - "\u0261\u0005@\u0000\u0000\u0261\u0262\u0003\u0006\u0000\u0000\u0262\u0263"+ - "\u0003\f\u0003\u0000\u0263\u026a\u0001\u0000\u0000\u0000\u0264\u0265\u0005"+ - "@\u0000\u0000\u0265\u0266\u0007\u000e\u0000\u0000\u0266\u0267\u0007\u000b"+ - "\u0000\u0000\u0267\u0268\u0007\u0012\u0000\u0000\u0268\u026a\u0007\r\u0000"+ - "\u0000\u0269\u0260\u0001\u0000\u0000\u0000\u0269\u0264\u0001\u0000\u0000"+ - "\u0000\u026a\'\u0001\u0000\u0000\u0000\u026b\u026e\u0003\u000e\u0004\u0000"+ - "\u026c\u026e\u0003\u0010\u0005\u0000\u026d\u026b\u0001\u0000\u0000\u0000"+ - "\u026d\u026c\u0001\u0000\u0000\u0000\u026e)\u0001\u0000\u0000\u0000\u026f"+ - "\u0270\u0005{\u0000\u0000\u0270\u0271\u0005{\u0000\u0000\u0271\u0272\u0001"+ - "\u0000\u0000\u0000\u0272\u0273\u0006\u0012\u0004\u0000\u0273+\u0001\u0000"+ - "\u0000\u0000\u0274\u0275\u0005{\u0000\u0000\u0275\u0276\u0005!\u0000\u0000"+ - "\u0276\u0277\u0005!\u0000\u0000\u0277\u0278\u0001\u0000\u0000\u0000\u0278"+ - "\u0279\u0006\u0013\u0005\u0000\u0279-\u0001\u0000\u0000\u0000\u027a\u027b"+ - "\u0005\'\u0000\u0000\u027b/\u0001\u0000\u0000\u0000\u027c\u027d\u0005"+ - "\"\u0000\u0000\u027d1\u0001\u0000\u0000\u0000\u027e\u0282\u0005<\u0000"+ - "\u0000\u027f\u0281\u0005 \u0000\u0000\u0280\u027f\u0001\u0000\u0000\u0000"+ - "\u0281\u0284\u0001\u0000\u0000\u0000\u0282\u0280\u0001\u0000\u0000\u0000"+ - "\u0282\u0283\u0001\u0000\u0000\u0000\u0283\u0285\u0001\u0000\u0000\u0000"+ - "\u0284\u0282\u0001\u0000\u0000\u0000\u0285\u0289\u0005/\u0000\u0000\u0286"+ - "\u0288\u0005 \u0000\u0000\u0287\u0286\u0001\u0000\u0000\u0000\u0288\u028b"+ - "\u0001\u0000\u0000\u0000\u0289\u0287\u0001\u0000\u0000\u0000\u0289\u028a"+ - "\u0001\u0000\u0000\u0000\u028a\u028c\u0001\u0000\u0000\u0000\u028b\u0289"+ - "\u0001\u0000\u0000\u0000\u028c\u0290\u0007\u0000\u0000\u0000\u028d\u028f"+ - "\u0007\u001c\u0000\u0000\u028e\u028d\u0001\u0000\u0000\u0000\u028f\u0292"+ - "\u0001\u0000\u0000\u0000\u0290\u028e\u0001\u0000\u0000\u0000\u0290\u0291"+ - "\u0001\u0000\u0000\u0000\u0291\u0296\u0001\u0000\u0000\u0000\u0292\u0290"+ - "\u0001\u0000\u0000\u0000\u0293\u0295\u0005 \u0000\u0000\u0294\u0293\u0001"+ - "\u0000\u0000\u0000\u0295\u0298\u0001\u0000\u0000\u0000\u0296\u0294\u0001"+ - "\u0000\u0000\u0000\u0296\u0297\u0001\u0000\u0000\u0000\u0297\u0299\u0001"+ - "\u0000\u0000\u0000\u0298\u0296\u0001\u0000\u0000\u0000\u0299\u02cd\u0005"+ - ">\u0000\u0000\u029a\u029b\u0005<\u0000\u0000\u029b\u029c\u0005/\u0000"+ - "\u0000\u029c\u02a0\u0001\u0000\u0000\u0000\u029d\u029f\u0005 \u0000\u0000"+ - "\u029e\u029d\u0001\u0000\u0000\u0000\u029f\u02a2\u0001\u0000\u0000\u0000"+ - "\u02a0\u029e\u0001\u0000\u0000\u0000\u02a0\u02a1\u0001\u0000\u0000\u0000"+ - "\u02a1\u02c2\u0001\u0000\u0000\u0000\u02a2\u02a0\u0001\u0000\u0000\u0000"+ - "\u02a3\u02a4\u0007\u001d\u0000\u0000\u02a4\u02a5\u0005-\u0000\u0000\u02a5"+ - "\u02a6\u0001\u0000\u0000\u0000\u02a6\u02c3\u0003\n\u0002\u0000\u02a7\u02ac"+ - "\u0003\n\u0002\u0000\u02a8\u02a9\u0005:\u0000\u0000\u02a9\u02aa\u0005"+ - ":\u0000\u0000\u02aa\u02ab\u0001\u0000\u0000\u0000\u02ab\u02ad\u0003\n"+ - "\u0002\u0000\u02ac\u02a8\u0001\u0000\u0000\u0000\u02ad\u02ae\u0001\u0000"+ - "\u0000\u0000\u02ae\u02ac\u0001\u0000\u0000\u0000\u02ae\u02af\u0001\u0000"+ - "\u0000\u0000\u02af\u02c3\u0001\u0000\u0000\u0000\u02b0\u02b1\u0007\u0013"+ - "\u0000\u0000\u02b1\u02b2\u0007\f\u0000\u0000\u02b2\u02b3\u0007\u0016\u0000"+ - "\u0000\u02b3\u02b4\u0007\n\u0000\u0000\u02b4\u02b5\u0007\u0014\u0000\u0000"+ - "\u02b5\u02b6\u0007\f\u0000\u0000\u02b6\u02b7\u0007\u0012\u0000\u0000\u02b7"+ - "\u02b8\u0007\n\u0000\u0000\u02b8\u02b9\u0005:\u0000\u0000\u02b9\u02ba"+ - "\u0001\u0000\u0000\u0000\u02ba\u02bf\u0003\n\u0002\u0000\u02bb\u02bc\u0005"+ - "-\u0000\u0000\u02bc\u02be\u0003\n\u0002\u0000\u02bd\u02bb\u0001\u0000"+ - "\u0000\u0000\u02be\u02c1\u0001\u0000\u0000\u0000\u02bf\u02bd\u0001\u0000"+ - "\u0000\u0000\u02bf\u02c0\u0001\u0000\u0000\u0000\u02c0\u02c3\u0001\u0000"+ - "\u0000\u0000\u02c1\u02bf\u0001\u0000\u0000\u0000\u02c2\u02a3\u0001\u0000"+ - "\u0000\u0000\u02c2\u02a7\u0001\u0000\u0000\u0000\u02c2\u02b0\u0001\u0000"+ - "\u0000\u0000\u02c3\u02c7\u0001\u0000\u0000\u0000\u02c4\u02c6\u0005 \u0000"+ - "\u0000\u02c5\u02c4\u0001\u0000\u0000\u0000\u02c6\u02c9\u0001\u0000\u0000"+ - "\u0000\u02c7\u02c5\u0001\u0000\u0000\u0000\u02c7\u02c8\u0001\u0000\u0000"+ - "\u0000\u02c8\u02ca\u0001\u0000\u0000\u0000\u02c9\u02c7\u0001\u0000\u0000"+ - "\u0000\u02ca\u02cb\u0005>\u0000\u0000\u02cb\u02cd\u0001\u0000\u0000\u0000"+ - "\u02cc\u027e\u0001\u0000\u0000\u0000\u02cc\u029a\u0001\u0000\u0000\u0000"+ - "\u02cd3\u0001\u0000\u0000\u0000\u02ce\u02cf\u0005<\u0000\u0000\u02cf\u02d0"+ - "\u0005!\u0000\u0000\u02d0\u02d1\u0005-\u0000\u0000\u02d1\u02d2\u0005-"+ - "\u0000\u0000\u02d2\u02d6\u0001\u0000\u0000\u0000\u02d3\u02d5\t\u0000\u0000"+ - "\u0000\u02d4\u02d3\u0001\u0000\u0000\u0000\u02d5\u02d8\u0001\u0000\u0000"+ - "\u0000\u02d6\u02d7\u0001\u0000\u0000\u0000\u02d6\u02d4\u0001\u0000\u0000"+ - "\u0000\u02d7\u02d9\u0001\u0000\u0000\u0000\u02d8\u02d6\u0001\u0000\u0000"+ - "\u0000\u02d9\u02da\u0005-\u0000\u0000\u02da\u02db\u0005-\u0000\u0000\u02db"+ - "\u02dc\u0005>\u0000\u0000\u02dc5\u0001\u0000\u0000\u0000\u02dd\u03fb\u0005"+ - "<\u0000\u0000\u02de\u02df\u0007\u0019\u0000\u0000\u02df\u02e0\u0007\f"+ - "\u0000\u0000\u02e0\u03fc\u0007\u0016\u0000\u0000\u02e1\u02e2\u0007\u000b"+ - "\u0000\u0000\u02e2\u02e3\u0007\n\u0000\u0000\u02e3\u02e4\u0007\u000e\u0000"+ - "\u0000\u02e4\u02e5\u0007\u0007\u0000\u0000\u02e5\u02e6\u0007\f\u0000\u0000"+ - "\u02e6\u02e7\u0007\u0011\u0000\u0000\u02e7\u03fc\u0007\u000f\u0000\u0000"+ - "\u02e8\u02e9\u0007\u0015\u0000\u0000\u02e9\u02ea\u0007\u0005\u0000\u0000"+ - "\u02ea\u02eb\u0007\f\u0000\u0000\u02eb\u03fc\u0007\u000f\u0000\u0000\u02ec"+ - "\u02ed\u0007\u0005\u0000\u0000\u02ed\u02ee\u0007\u0012\u0000\u0000\u02ee"+ - "\u02ef\u0007\u0007\u0000\u0000\u02ef\u02f0\u0007\f\u0000\u0000\u02f0\u02f1"+ - "\u0007\u000e\u0000\u0000\u02f1\u02f2\u0007\u0013\u0000\u0000\u02f2\u03fc"+ - "\u0007\n\u0000\u0000\u02f3\u02f4\u0007\b\u0000\u0000\u02f4\u02f5\u0007"+ - "\u0007\u0000\u0000\u02f5\u02f6\u0007\u0015\u0000\u0000\u02f6\u03fc\u0007"+ - "\u0013\u0000\u0000\u02f7\u02f8\u0007\u0007\u0000\u0000\u02f8\u02f9\u0007"+ - "\f\u0000\u0000\u02f9\u02fa\u0007\u0007\u0000\u0000\u02fa\u02fb\u0007\u0013"+ - "\u0000\u0000\u02fb\u03fc\u0007\n\u0000\u0000\u02fc\u02fd\u0007\b\u0000"+ - "\u0000\u02fd\u02fe\u0007\n\u0000\u0000\u02fe\u02ff\u0007\u0005\u0000\u0000"+ - "\u02ff\u03fc\u0007\u0019\u0000\u0000\u0300\u0301\u0007\u000b\u0000\u0000"+ - "\u0301\u0302\u0007\u0007\u0000\u0000\u0302\u0303\u0007\u0010\u0000\u0000"+ - "\u0303\u0304\u0007\u0013\u0000\u0000\u0304\u03fc\u0007\n\u0000\u0000\u0305"+ - "\u0306\u0007\u000b\u0000\u0000\u0306\u0307\u0007\u000e\u0000\u0000\u0307"+ - "\u0308\u0007\u0012\u0000\u0000\u0308\u0309\u0007\f\u0000\u0000\u0309\u030a"+ - "\u0007\u0018\u0000\u0000\u030a\u03fc\u0007\u0007\u0000\u0000\u030b\u030c"+ - "\u0007\r\u0000\u0000\u030c\u030d\u0007\u0011\u0000\u0000\u030d\u030e\u0007"+ - "\u0011\u0000\u0000\u030e\u030f\u0007\u0007\u0000\u0000\u030f\u0310\u0007"+ - "\n\u0000\u0000\u0310\u03fc\u0007\u0012\u0000\u0000\u0311\u0312\u0007\u0018"+ - "\u0000\u0000\u0312\u0313\u0007\u0012\u0000\u0000\u0313\u03fc\u0007\n\u0000"+ - "\u0000\u0314\u0315\u0007\u000e\u0000\u0000\u0315\u0316\u0007\u0011\u0000"+ - "\u0000\u0316\u0317\u0007\u0019\u0000\u0000\u0317\u03fc\u0007\n\u0000\u0000"+ - "\u0318\u0319\u0007\u0017\u0000\u0000\u0319\u031a\u0007\u0013\u0000\u0000"+ - "\u031a\u031b\u0007\u0011\u0000\u0000\u031b\u031c\u0007\u000e\u0000\u0000"+ - "\u031c\u031d\u0007\u001b\u0000\u0000\u031d\u031e\u0007\u001e\u0000\u0000"+ - "\u031e\u031f\u0007\u0006\u0000\u0000\u031f\u0320\u0007\u0011\u0000\u0000"+ - "\u0320\u0321\u0007\u0007\u0000\u0000\u0321\u03fc\u0007\n\u0000\u0000\u0322"+ - "\u0323\u0007\u0019\u0000\u0000\u0323\u03fc\u0007\u0007\u0000\u0000\u0324"+ - "\u0325\u0007\u0019\u0000\u0000\u0325\u03fc\u0007\u0013\u0000\u0000\u0326"+ - "\u0327\u0007\u0016\u0000\u0000\u0327\u0328\u0007\f\u0000\u0000\u0328\u0329"+ - "\u0007\u0019\u0000\u0000\u0329\u032a\u0007\n\u0000\u0000\u032a\u03fc\u0007"+ - "\u0011\u0000\u0000\u032b\u032c\u0007\u0007\u0000\u0000\u032c\u032d\u0007"+ - "\n\u0000\u0000\u032d\u032e\u0007\u0015\u0000\u0000\u032e\u032f\u0007\u0018"+ - "\u0000\u0000\u032f\u0330\u0007\u0013\u0000\u0000\u0330\u0331\u0007\u0005"+ - "\u0000\u0000\u0331\u0332\u0007\u0007\u0000\u0000\u0332\u03fc\u0007\n\u0000"+ - "\u0000\u0333\u0334\u0007\u000b\u0000\u0000\u0334\u0335\u0007\u0018\u0000"+ - "\u0000\u0335\u0336\u0007\u0005\u0000\u0000\u0336\u03fc\u0007\u000f\u0000"+ - "\u0000\u0337\u0338\u0007\u000b\u0000\u0000\u0338\u0339\u0007\u0007\u0000"+ - "\u0000\u0339\u033a\u0007\u0012\u0000\u0000\u033a\u033b\u0007\u0011\u0000"+ - "\u0000\u033b\u033c\u0007\u000f\u0000\u0000\u033c\u03fc\u0007\t\u0000\u0000"+ - "\u033d\u033e\u0007\n\u0000\u0000\u033e\u03fc\u0007\u0015\u0000\u0000\u033f"+ - "\u0340\u0007\u000b\u0000\u0000\u0340\u0341\u0007\u0015\u0000\u0000\u0341"+ - "\u0342\u0007\u0005\u0000\u0000\u0342\u0343\u0007\u0013\u0000\u0000\u0343"+ - "\u03fc\u0007\u0013\u0000\u0000\u0344\u0345\u0007\u000b\u0000\u0000\u0345"+ - "\u0346\u0007\u0006\u0000\u0000\u0346\u03fc\u0007\u0017\u0000\u0000\u0347"+ - "\u0348\u0007\u000b\u0000\u0000\u0348\u0349\u0007\u0006\u0000\u0000\u0349"+ - "\u03fc\u0007\u0018\u0000\u0000\u034a\u034b\u0007\r\u0000\u0000\u034b\u034c"+ - "\u0007\f\u0000\u0000\u034c\u034d\u0007\t\u0000\u0000\u034d\u034e\u0007"+ - "\u0006\u0000\u0000\u034e\u034f\u0007\u0012\u0000\u0000\u034f\u03fc\u0007"+ - "\n\u0000\u0000\u0350\u0351\u0007\u000e\u0000\u0000\u0351\u0352\u0007\u0005"+ - "\u0000\u0000\u0352\u0353\u0007\u000f\u0000\u0000\u0353\u0354\u0007\u0016"+ - "\u0000\u0000\u0354\u0355\u0007\u0005\u0000\u0000\u0355\u03fc\u0007\u000b"+ - "\u0000\u0000\u0356\u0357\u0007\u000b\u0000\u0000\u0357\u0358\u0007\u0016"+ - "\u0000\u0000\u0358\u03fc\u0007\t\u0000\u0000\u0359\u035a\u0007\u0006\u0000"+ - "\u0000\u035a\u035b\u0007\u000b\u0000\u0000\u035b\u03fc\u0007\n\u0000\u0000"+ - "\u035c\u035d\u0007\u0018\u0000\u0000\u035d\u035e\u0007\u0005\u0000\u0000"+ - "\u035e\u035f\u0007\u0007\u0000\u0000\u035f\u03fc\u0007\b\u0000\u0000\u0360"+ - "\u0361\u0007\u0018\u0000\u0000\u0361\u0362\u0007\u0011\u0000\u0000\u0362"+ - "\u0363\u0007\u0013\u0000\u0000\u0363\u0364\u0007\u0010\u0000\u0000\u0364"+ - "\u0365\u0007\t\u0000\u0000\u0365\u0366\u0007\u0011\u0000\u0000\u0366\u03fc"+ - "\u0007\u000f\u0000\u0000\u0367\u0368\u0007\u0018\u0000\u0000\u0368\u0369"+ - "\u0007\f\u0000\u0000\u0369\u036a\u0007\u000e\u0000\u0000\u036a\u036b\u0007"+ - "\u0007\u0000\u0000\u036b\u036c\u0007\u0006\u0000\u0000\u036c\u036d\u0007"+ - "\u0012\u0000\u0000\u036d\u03fc\u0007\n\u0000\u0000\u036e\u036f\u0007\b"+ - "\u0000\u0000\u036f\u0370\u0007\n\u0000\u0000\u0370\u0371\u0007\u0005\u0000"+ - "\u0000\u0371\u0372\u0007\u0019\u0000\u0000\u0372\u0373\u0007\n\u0000\u0000"+ - "\u0373\u03fc\u0007\u0012\u0000\u0000\u0374\u0375\u0007\b\u0000\u0000\u0375"+ - "\u03fc\u0007\u001f\u0000\u0000\u0376\u0377\u0007\u000f\u0000\u0000\u0377"+ - "\u0378\u0007\u0005\u0000\u0000\u0378\u03fc\u0007\u0016\u0000\u0000\u0379"+ - "\u037a\u0007\u0019\u0000\u0000\u037a\u037b\u0007\f\u0000\u0000\u037b\u037c"+ - "\u0007\u0005\u0000\u0000\u037c\u037d\u0007\u0013\u0000\u0000\u037d\u037e"+ - "\u0007\u0011\u0000\u0000\u037e\u03fc\u0007\t\u0000\u0000\u037f\u0380\u0007"+ - "\u000b\u0000\u0000\u0380\u0381\u0007\u0006\u0000\u0000\u0381\u0382\u0007"+ - "\u0015\u0000\u0000\u0382\u0383\u0007\u0015\u0000\u0000\u0383\u0384\u0007"+ - "\u0005\u0000\u0000\u0384\u0385\u0007\u0012\u0000\u0000\u0385\u03fc\u0007"+ - "\u0010\u0000\u0000\u0386\u0387\u0007\u0019\u0000\u0000\u0387\u0388\u0007"+ - "\n\u0000\u0000\u0388\u0389\u0007\u0007\u0000\u0000\u0389\u038a\u0007\u0005"+ - "\u0000\u0000\u038a\u038b\u0007\f\u0000\u0000\u038b\u038c\u0007\u0013\u0000"+ - "\u0000\u038c\u03fc\u0007\u000b\u0000\u0000\u038d\u038e\u0007\u000b\u0000"+ - "\u0000\u038e\u038f\u0007\u0013\u0000\u0000\u038f\u0390\u0007\u0011\u0000"+ - "\u0000\u0390\u03fc\u0007\u0007\u0000\u0000\u0391\u0392\u0007\u0013\u0000"+ - "\u0000\u0392\u0393\u0007\u0005\u0000\u0000\u0393\u0394\u0007\u0017\u0000"+ - "\u0000\u0394\u0395\u0007\n\u0000\u0000\u0395\u03fc\u0007\u0013\u0000\u0000"+ - "\u0396\u0397\u0007\u000b\u0000\u0000\u0397\u0398\u0007\n\u0000\u0000\u0398"+ - "\u0399\u0007\u0013\u0000\u0000\u0399\u039a\u0007\n\u0000\u0000\u039a\u039b"+ - "\u0007\u000e\u0000\u0000\u039b\u03fc\u0007\u0007\u0000\u0000\u039c\u039d"+ - "\u0007\u0011\u0000\u0000\u039d\u039e\u0007\u0018\u0000\u0000\u039e\u039f"+ - "\u0007\u0007\u0000\u0000\u039f\u03a0\u0007\t\u0000\u0000\u03a0\u03a1\u0007"+ - "\u0012\u0000\u0000\u03a1\u03a2\u0007\u0011\u0000\u0000\u03a2\u03a3\u0007"+ - "\u0006\u0000\u0000\u03a3\u03fc\u0007\u0018\u0000\u0000\u03a4\u03a5\u0007"+ - "\u0011\u0000\u0000\u03a5\u03a6\u0007\u0018\u0000\u0000\u03a6\u03a7\u0007"+ - "\u0007\u0000\u0000\u03a7\u03a8\u0007\f\u0000\u0000\u03a8\u03a9\u0007\u0011"+ - "\u0000\u0000\u03a9\u03fc\u0007\u000f\u0000\u0000\u03aa\u03ab\u0007\r\u0000"+ - "\u0000\u03ab\u03ac\u0007\f\u0000\u0000\u03ac\u03ad\u0007\n\u0000\u0000"+ - "\u03ad\u03ae\u0007\u0013\u0000\u0000\u03ae\u03af\u0007\u0019\u0000\u0000"+ - "\u03af\u03b0\u0007\u000b\u0000\u0000\u03b0\u03b1\u0007\n\u0000\u0000\u03b1"+ - "\u03fc\u0007\u0007\u0000\u0000\u03b2\u03b3\u0007\u0007\u0000\u0000\u03b3"+ - "\u03b4\u0007\n\u0000\u0000\u03b4\u03b5\u0007\u001d\u0000\u0000\u03b5\u03b6"+ - "\u0007\u0007\u0000\u0000\u03b6\u03b7\u0007\u0005\u0000\u0000\u03b7\u03b8"+ - "\u0007\u0012\u0000\u0000\u03b8\u03b9\u0007\n\u0000\u0000\u03b9\u03fc\u0007"+ - "\u0005\u0000\u0000\u03ba\u03bb\u0007\u0017\u0000\u0000\u03bb\u03bc\u0007"+ - "\u0006\u0000\u0000\u03bc\u03bd\u0007\u0007\u0000\u0000\u03bd\u03be\u0007"+ - "\u0007\u0000\u0000\u03be\u03bf\u0007\u0011\u0000\u0000\u03bf\u03fc\u0007"+ - "\u000f\u0000\u0000\u03c0\u03c1\u0007\r\u0000\u0000\u03c1\u03c2\u0007\u0011"+ - "\u0000\u0000\u03c2\u03c3\u0007\u0012\u0000\u0000\u03c3\u03fc\u0007\u0015"+ - "\u0000\u0000\u03c4\u03c5\u0007\u000b\u0000\u0000\u03c5\u03c6\u0007\n\u0000"+ - "\u0000\u03c6\u03c7\u0007\u0005\u0000\u0000\u03c7\u03c8\u0007\u0012\u0000"+ - "\u0000\u03c8\u03c9\u0007\u000e\u0000\u0000\u03c9\u03fc\u0007\b\u0000\u0000"+ - "\u03ca\u03cb\u0007\u0006\u0000\u0000\u03cb\u03fc\u0007\u0013\u0000\u0000"+ - "\u03cc\u03cd\u0007\u0011\u0000\u0000\u03cd\u03fc\u0007\u0013\u0000\u0000"+ - "\u03ce\u03cf\u0007\u0013\u0000\u0000\u03cf\u03fc\u0007\f\u0000\u0000\u03d0"+ - "\u03d1\u0007\u0007\u0000\u0000\u03d1\u03d2\u0007\u0005\u0000\u0000\u03d2"+ - "\u03d3\u0007\u0017\u0000\u0000\u03d3\u03d4\u0007\u0013\u0000\u0000\u03d4"+ - "\u03fc\u0007\n\u0000\u0000\u03d5\u03d6\u0007\u0007\u0000\u0000\u03d6\u03fc"+ - "\u0007\u0012\u0000\u0000\u03d7\u03d8\u0007\u0007\u0000\u0000\u03d8\u03fc"+ - "\u0007\u0019\u0000\u0000\u03d9\u03da\u0007\u0007\u0000\u0000\u03da\u03fc"+ - "\u0007\b\u0000\u0000\u03db\u03dc\u0007\u0007\u0000\u0000\u03dc\u03dd\u0007"+ - "\u0017\u0000\u0000\u03dd\u03de\u0007\u0011\u0000\u0000\u03de\u03df\u0007"+ - "\u0019\u0000\u0000\u03df\u03fc\u0007\u0010\u0000\u0000\u03e0\u03e1\u0007"+ - "\u0007\u0000\u0000\u03e1\u03e2\u0007\b\u0000\u0000\u03e2\u03e3\u0007\n"+ - "\u0000\u0000\u03e3\u03e4\u0007\u0005\u0000\u0000\u03e4\u03fc\u0007\u0019"+ - "\u0000\u0000\u03e5\u03e6\u0007\u0007\u0000\u0000\u03e6\u03e7\u0007\r\u0000"+ - "\u0000\u03e7\u03e8\u0007\u0011\u0000\u0000\u03e8\u03e9\u0007\u0011\u0000"+ - "\u0000\u03e9\u03fc\u0007\u0007\u0000\u0000\u03ea\u03eb\u0007\u000e\u0000"+ - "\u0000\u03eb\u03ec\u0007\u0005\u0000\u0000\u03ec\u03ed\u0007\u0018\u0000"+ - "\u0000\u03ed\u03ee\u0007\u0007\u0000\u0000\u03ee\u03ef\u0007\f\u0000\u0000"+ - "\u03ef\u03f0\u0007\u0011\u0000\u0000\u03f0\u03fc\u0007\u000f\u0000\u0000"+ - "\u03f1\u03fc\u0001\u0000\u0000\u0000\u03f2\u03f3\u0007\u0007\u0000\u0000"+ - "\u03f3\u03f4\u0007\f\u0000\u0000\u03f4\u03f5\u0007\u0015\u0000\u0000\u03f5"+ - "\u03fc\u0007\n\u0000\u0000\u03f6\u03fc\u0001\u0000\u0000\u0000\u03f7\u03f8"+ - "\u0007\u0016\u0000\u0000\u03f8\u03f9\u0007\u0005\u0000\u0000\u03f9\u03fc"+ - "\u0007\u0012\u0000\u0000\u03fa\u03fc\u0007 \u0000\u0000\u03fb\u02de\u0001"+ - "\u0000\u0000\u0000\u03fb\u02e1\u0001\u0000\u0000\u0000\u03fb\u02e8\u0001"+ - "\u0000\u0000\u0000\u03fb\u02ec\u0001\u0000\u0000\u0000\u03fb\u02f3\u0001"+ - "\u0000\u0000\u0000\u03fb\u02f7\u0001\u0000\u0000\u0000\u03fb\u02fc\u0001"+ - "\u0000\u0000\u0000\u03fb\u0300\u0001\u0000\u0000\u0000\u03fb\u0305\u0001"+ - "\u0000\u0000\u0000\u03fb\u030b\u0001\u0000\u0000\u0000\u03fb\u0311\u0001"+ - "\u0000\u0000\u0000\u03fb\u0314\u0001\u0000\u0000\u0000\u03fb\u0318\u0001"+ - "\u0000\u0000\u0000\u03fb\u0322\u0001\u0000\u0000\u0000\u03fb\u0324\u0001"+ - "\u0000\u0000\u0000\u03fb\u0326\u0001\u0000\u0000\u0000\u03fb\u032b\u0001"+ - "\u0000\u0000\u0000\u03fb\u0333\u0001\u0000\u0000\u0000\u03fb\u0337\u0001"+ - "\u0000\u0000\u0000\u03fb\u033d\u0001\u0000\u0000\u0000\u03fb\u033f\u0001"+ - "\u0000\u0000\u0000\u03fb\u0344\u0001\u0000\u0000\u0000\u03fb\u0347\u0001"+ - "\u0000\u0000\u0000\u03fb\u034a\u0001\u0000\u0000\u0000\u03fb\u0350\u0001"+ - "\u0000\u0000\u0000\u03fb\u0356\u0001\u0000\u0000\u0000\u03fb\u0359\u0001"+ - "\u0000\u0000\u0000\u03fb\u035c\u0001\u0000\u0000\u0000\u03fb\u0360\u0001"+ - "\u0000\u0000\u0000\u03fb\u0367\u0001\u0000\u0000\u0000\u03fb\u036e\u0001"+ - "\u0000\u0000\u0000\u03fb\u0374\u0001\u0000\u0000\u0000\u03fb\u0376\u0001"+ - "\u0000\u0000\u0000\u03fb\u0379\u0001\u0000\u0000\u0000\u03fb\u037f\u0001"+ - "\u0000\u0000\u0000\u03fb\u0386\u0001\u0000\u0000\u0000\u03fb\u038d\u0001"+ - "\u0000\u0000\u0000\u03fb\u0391\u0001\u0000\u0000\u0000\u03fb\u0396\u0001"+ - "\u0000\u0000\u0000\u03fb\u039c\u0001\u0000\u0000\u0000\u03fb\u03a4\u0001"+ - "\u0000\u0000\u0000\u03fb\u03aa\u0001\u0000\u0000\u0000\u03fb\u03b2\u0001"+ - "\u0000\u0000\u0000\u03fb\u03ba\u0001\u0000\u0000\u0000\u03fb\u03c0\u0001"+ - "\u0000\u0000\u0000\u03fb\u03c4\u0001\u0000\u0000\u0000\u03fb\u03ca\u0001"+ - "\u0000\u0000\u0000\u03fb\u03cc\u0001\u0000\u0000\u0000\u03fb\u03ce\u0001"+ - "\u0000\u0000\u0000\u03fb\u03d0\u0001\u0000\u0000\u0000\u03fb\u03d5\u0001"+ - "\u0000\u0000\u0000\u03fb\u03d7\u0001\u0000\u0000\u0000\u03fb\u03d9\u0001"+ - "\u0000\u0000\u0000\u03fb\u03db\u0001\u0000\u0000\u0000\u03fb\u03e0\u0001"+ - "\u0000\u0000\u0000\u03fb\u03e5\u0001\u0000\u0000\u0000\u03fb\u03ea\u0001"+ - "\u0000\u0000\u0000\u03fb\u03f1\u0001\u0000\u0000\u0000\u03fb\u03f2\u0001"+ - "\u0000\u0000\u0000\u03fb\u03f6\u0001\u0000\u0000\u0000\u03fb\u03f7\u0001"+ - "\u0000\u0000\u0000\u03fb\u03fa\u0001\u0000\u0000\u0000\u03fc\u03fd\u0001"+ - "\u0000\u0000\u0000\u03fd\u03fe\u0004\u0018\u0001\u0000\u03fe7\u0001\u0000"+ - "\u0000\u0000\u03ff\u0414\u0005<\u0000\u0000\u0400\u0401\u0007\f\u0000"+ - "\u0000\u0401\u0402\u0007\u0015\u0000\u0000\u0402\u0415\u0007\t\u0000\u0000"+ - "\u0403\u0404\u0007\f\u0000\u0000\u0404\u0405\u0007\u000f\u0000\u0000\u0405"+ - "\u0406\u0007\u0018\u0000\u0000\u0406\u0407\u0007\u0006\u0000\u0000\u0407"+ - "\u0415\u0007\u0007\u0000\u0000\u0408\u0409\u0007\u0017\u0000\u0000\u0409"+ - "\u0415\u0007\u0012\u0000\u0000\u040a\u040b\u0007\b\u0000\u0000\u040b\u0415"+ - "\u0007\u0012\u0000\u0000\u040c\u040d\u0007\u0013\u0000\u0000\u040d\u040e"+ - "\u0007\f\u0000\u0000\u040e\u040f\u0007\u000f\u0000\u0000\u040f\u0415\u0007"+ - "\u001b\u0000\u0000\u0410\u0411\u0007\u0015\u0000\u0000\u0411\u0412\u0007"+ - "\n\u0000\u0000\u0412\u0413\u0007\u0007\u0000\u0000\u0413\u0415\u0007\u0005"+ - "\u0000\u0000\u0414\u0400\u0001\u0000\u0000\u0000\u0414\u0403\u0001\u0000"+ - "\u0000\u0000\u0414\u0408\u0001\u0000\u0000\u0000\u0414\u040a\u0001\u0000"+ - "\u0000\u0000\u0414\u040c\u0001\u0000\u0000\u0000\u0414\u0410\u0001\u0000"+ - "\u0000\u0000\u04159\u0001\u0000\u0000\u0000\u0416\u0417\u0005<\u0000\u0000"+ - "\u0417\u0418\u0007\u001d\u0000\u0000\u0418\u0419\u0005-\u0000\u0000\u0419"+ - "\u041a\u0001\u0000\u0000\u0000\u041a\u0432\u0003\n\u0002\u0000\u041b\u041c"+ - "\u0005<\u0000\u0000\u041c\u0421\u0003\n\u0002\u0000\u041d\u041e\u0005"+ - ":\u0000\u0000\u041e\u041f\u0005:\u0000\u0000\u041f\u0420\u0001\u0000\u0000"+ - "\u0000\u0420\u0422\u0003\n\u0002\u0000\u0421\u041d\u0001\u0000\u0000\u0000"+ - "\u0422\u0423\u0001\u0000\u0000\u0000\u0423\u0421\u0001\u0000\u0000\u0000"+ - "\u0423\u0424\u0001\u0000\u0000\u0000\u0424\u0432\u0001\u0000\u0000\u0000"+ - "\u0425\u0426\u0005<\u0000\u0000\u0426\u0427\u0007\u0013\u0000\u0000\u0427"+ - "\u0428\u0007\f\u0000\u0000\u0428\u0429\u0007\u0016\u0000\u0000\u0429\u042a"+ - "\u0007\n\u0000\u0000\u042a\u042b\u0007\u0014\u0000\u0000\u042b\u042c\u0007"+ - "\f\u0000\u0000\u042c\u042d\u0007\u0012\u0000\u0000\u042d\u042e\u0007\n"+ - "\u0000\u0000\u042e\u042f\u0005:\u0000\u0000\u042f\u0430\u0001\u0000\u0000"+ - "\u0000\u0430\u0432\u0003\n\u0002\u0000\u0431\u0416\u0001\u0000\u0000\u0000"+ - "\u0431\u041b\u0001\u0000\u0000\u0000\u0431\u0425\u0001\u0000\u0000\u0000"+ - "\u0432;\u0001\u0000\u0000\u0000\u0433\u0434\u0005=\u0000\u0000\u0434="+ - "\u0001\u0000\u0000\u0000\u0435\u0436\u0003\b\u0001\u0000\u0436?\u0001"+ - "\u0000\u0000\u0000\u0437\u0438\u0005/\u0000\u0000\u0438\u0439\u0005>\u0000"+ - "\u0000\u0439A\u0001\u0000\u0000\u0000\u043a\u043b\u0005>\u0000\u0000\u043b"+ - "C\u0001\u0000\u0000\u0000\u043c\u043d\u0005@\u0000\u0000\u043d\u043e\u0007"+ - "\u0018\u0000\u0000\u043e\u043f\u0007\b\u0000\u0000\u043f\u0440\u0007\u0018"+ - "\u0000\u0000\u0440\u0441\u0001\u0000\u0000\u0000\u0441\u0442\u0004\u001f"+ - "\u0002\u0000\u0442\u0443\u0001\u0000\u0000\u0000\u0443\u0444\u0006\u001f"+ - "\u0006\u0000\u0444E\u0001\u0000\u0000\u0000\u0445\u0446\u0005@\u0000\u0000"+ - "\u0446\u0447\u0001\u0000\u0000\u0000\u0447\u0448\u0006 \u0007\u0000\u0448"+ - "G\u0001\u0000\u0000\u0000\u0449\u044b\u0007!\u0000\u0000\u044a\u0449\u0001"+ - "\u0000\u0000\u0000\u044b\u044c\u0001\u0000\u0000\u0000\u044c\u044a\u0001"+ - "\u0000\u0000\u0000\u044c\u044d\u0001\u0000\u0000\u0000\u044dI\u0001\u0000"+ - "\u0000\u0000\u044e\u0450\u0007\"\u0000\u0000\u044f\u044e\u0001\u0000\u0000"+ - "\u0000\u0450\u0451\u0001\u0000\u0000\u0000\u0451\u044f\u0001\u0000\u0000"+ - "\u0000\u0451\u0452\u0001\u0000\u0000\u0000\u0452K\u0001\u0000\u0000\u0000"+ - "\u0453\u0454\t\u0000\u0000\u0000\u0454\u0455\u0001\u0000\u0000\u0000\u0455"+ - "\u0456\u0006#\u0007\u0000\u0456M\u0001\u0000\u0000\u0000\u0457\u0458\u0005"+ - "(\u0000\u0000\u0458\u0459\u0006$\b\u0000\u0459O\u0001\u0000\u0000\u0000"+ - "\u045a\u045b\u0005)\u0000\u0000\u045b\u045c\u0006%\t\u0000\u045cQ\u0001"+ - "\u0000\u0000\u0000\u045d\u045e\u0007\"\u0000\u0000\u045e\u045f\u0001\u0000"+ - "\u0000\u0000\u045f\u0460\u0006&\n\u0000\u0460S\u0001\u0000\u0000\u0000"+ - "\u0461\u0462\t\u0000\u0000\u0000\u0462\u0463\u0001\u0000\u0000\u0000\u0463"+ - "\u0464\u0006\'\u0007\u0000\u0464U\u0001\u0000\u0000\u0000\u0465\u0466"+ - "\u0005\u0000\u0000\u0001\u0466\u0467\u0001\u0000\u0000\u0000\u0467\u0468"+ - "\u0006(\u000b\u0000\u0468W\u0001\u0000\u0000\u0000\u0469\u046a\u0005("+ - "\u0000\u0000\u046a\u046b\u0006)\f\u0000\u046bY\u0001\u0000\u0000\u0000"+ - "\u046c\u046d\u0005)\u0000\u0000\u046d\u046e\u0006*\r\u0000\u046e[\u0001"+ - "\u0000\u0000\u0000\u046f\u0470\u0005[\u0000\u0000\u0470\u0471\u0006+\u000e"+ - "\u0000\u0471\u0472\u0001\u0000\u0000\u0000\u0472\u0473\u0006+\u0007\u0000"+ - "\u0473]\u0001\u0000\u0000\u0000\u0474\u0475\u0005]\u0000\u0000\u0475\u0476"+ - "\u0006,\u000f\u0000\u0476\u0477\u0001\u0000\u0000\u0000\u0477\u0478\u0006"+ - ",\u0007\u0000\u0478_\u0001\u0000\u0000\u0000\u0479\u047a\u0005{\u0000"+ - "\u0000\u047a\u047b\u0006-\u0010\u0000\u047b\u047c\u0001\u0000\u0000\u0000"+ - "\u047c\u047d\u0006-\u0007\u0000\u047da\u0001\u0000\u0000\u0000\u047e\u047f"+ - "\u0005}\u0000\u0000\u047f\u0480\u0006.\u0011\u0000\u0480\u0481\u0001\u0000"+ - "\u0000\u0000\u0481\u0482\u0006.\u0007\u0000\u0482c\u0001\u0000\u0000\u0000"+ - "\u0483\u0484\u0005,\u0000\u0000\u0484\u0485\u0006/\u0012\u0000\u0485e"+ - "\u0001\u0000\u0000\u0000\u0486\u0487\u0007\"\u0000\u0000\u0487\u0488\u0001"+ - "\u0000\u0000\u0000\u0488\u0489\u00060\n\u0000\u0489g\u0001\u0000\u0000"+ - "\u0000\u048a\u048b\t\u0000\u0000\u0000\u048b\u048c\u0001\u0000\u0000\u0000"+ - "\u048c\u048d\u00061\u0007\u0000\u048di\u0001\u0000\u0000\u0000\u048e\u048f"+ - "\u0005\u0000\u0000\u0001\u048f\u0490\u0001\u0000\u0000\u0000\u0490\u0491"+ - "\u00062\u000b\u0000\u0491k\u0001\u0000\u0000\u0000\u0492\u0493\u0005@"+ - "\u0000\u0000\u0493\u0494\u0007\n\u0000\u0000\u0494\u0495\u0007\u000f\u0000"+ - "\u0000\u0495\u0496\u0007\u0019\u0000\u0000\u0496\u0497\u0007\u0018\u0000"+ - "\u0000\u0497\u0498\u0007\b\u0000\u0000\u0498\u0499\u0007\u0018\u0000\u0000"+ - "\u0499\u049a\u0001\u0000\u0000\u0000\u049a\u049b\u00063\u000b\u0000\u049b"+ - "m\u0001\u0000\u0000\u0000\u049c\u049e\b#\u0000\u0000\u049d\u049c\u0001"+ - "\u0000\u0000\u0000\u049e\u049f\u0001\u0000\u0000\u0000\u049f\u049d\u0001"+ - "\u0000\u0000\u0000\u049f\u04a0\u0001\u0000\u0000\u0000\u04a0\u04a1\u0001"+ - "\u0000\u0000\u0000\u04a1\u04a2\u00064\u0013\u0000\u04a2o\u0001\u0000\u0000"+ - "\u0000\u04a3\u04a4\t\u0000\u0000\u0000\u04a4\u04a5\u0001\u0000\u0000\u0000"+ - "\u04a5\u04a6\u00065\u0013\u0000\u04a6q\u0001\u0000\u0000\u0000\u04a7\u04a8"+ - "\u0005}\u0000\u0000\u04a8\u04a9\u0005}\u0000\u0000\u04a9\u04aa\u0001\u0000"+ - "\u0000\u0000\u04aa\u04ab\u00066\u000b\u0000\u04abs\u0001\u0000\u0000\u0000"+ - "\u04ac\u04ad\t\u0000\u0000\u0000\u04ad\u04ae\u0001\u0000\u0000\u0000\u04ae"+ - "\u04af\u00067\u0007\u0000\u04afu\u0001\u0000\u0000\u0000\u04b0\u04b1\u0005"+ - "\u0000\u0000\u0001\u04b1\u04b2\u0001\u0000\u0000\u0000\u04b2\u04b3\u0006"+ - "8\u000b\u0000\u04b3w\u0001\u0000\u0000\u0000\u04b4\u04b5\u0005!\u0000"+ - "\u0000\u04b5\u04b6\u0005!\u0000\u0000\u04b6\u04b7\u0005}\u0000\u0000\u04b7"+ - "\u04b8\u0001\u0000\u0000\u0000\u04b8\u04b9\u00069\u000b\u0000\u04b9y\u0001"+ - "\u0000\u0000\u0000\u04ba\u04bb\t\u0000\u0000\u0000\u04bb\u04bc\u0001\u0000"+ - "\u0000\u0000\u04bc\u04bd\u0006:\u0007\u0000\u04bd{\u0001\u0000\u0000\u0000"+ - "\u04be\u04bf\u0005\u0000\u0000\u0001\u04bf\u04c0\u0001\u0000\u0000\u0000"+ - "\u04c0\u04c1\u0006;\u000b\u0000\u04c1}\u0001\u0000\u0000\u00003\u0000"+ - "\u0001\u0002\u0003\u0004\u0005\u0082\u0089\u0090\u0096\u009e\u00a0\u00a9"+ - "\u00ab\u00c5\u00d3\u0130\u013f\u0148\u0156\u015b\u0164\u016a\u0176\u01e4"+ - "\u01fd\u020e\u0239\u024d\u025e\u0269\u026d\u0282\u0289\u0290\u0296\u02a0"+ - "\u02ae\u02bf\u02c2\u02c7\u02cc\u02d6\u03fb\u0414\u0423\u0431\u044a\u044c"+ - "\u0451\u049f\u0014\u0007\u0001\u0000\u0005\u0001\u0000\u0007\u0005\u0000"+ - "\u0005\u0002\u0000\u0005\u0004\u0000\u0005\u0005\u0000\u0005\u0003\u0000"+ - "\u0006\u0000\u0000\u0001$\u0000\u0001%\u0001\u0007\u001d\u0000\u0004\u0000"+ - "\u0000\u0001)\u0002\u0001*\u0003\u0001+\u0004\u0001,\u0005\u0001-\u0006"+ - "\u0001.\u0007\u0001/\b\u0007\u0002\u0000"; - public static final ATN _ATN = - new ATNDeserializer().deserialize(_serializedATN.toCharArray()); - static { - _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; - for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { - _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); - } - } -} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.java deleted file mode 100644 index b0529a981d3e..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParser.java +++ /dev/null @@ -1,1634 +0,0 @@ -// Generated from BladeAntlrFormatterParser.g4 by ANTLR 4.13.0 - - /* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.syntax.antlr4.formatter; - -import org.antlr.v4.runtime.atn.*; -import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.misc.*; -import org.antlr.v4.runtime.tree.*; -import java.util.List; -import java.util.Iterator; -import java.util.ArrayList; - -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) -public class BladeAntlrFormatterParser extends Parser { - static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } - - protected static final DFA[] _decisionToDFA; - protected static final PredictionContextCache _sharedContextCache = - new PredictionContextCache(); - public static final int - HTML=1, PHP_CODE=2, PARAM_COMMA=3, PHP_INLINE=4, D_BLOCK_DIRECTIVE_START=5, - D_BLOCK_DIRECTIVE_END=6, D_SECTION=7, D_ENDSECTION=8, D_BLOCK_ALIGNED_DIRECTIVE=9, - NON_PARAM_DIRECTIVE=10, D_INLINE_DIRECTIVE=11, STRING=12, CONTENT_TAG_OPEN=13, - RAW_TAG_OPEN=14, SG_QUOTE=15, DB_QUOTE=16, HTML_CLOSE_TAG=17, HTML_COMMENT=18, - HTML_START_BLOCK_TAG=19, HTML_SELF_CLOSE_TAG=20, COMPONENT_TAG=21, EQ=22, - IDENTIFIER=23, INLINE_GT_SYMBOL=24, GT_SYMBOL=25, D_PHP=26, AT=27, WS=28, - NL=29, OTHER=30, D_ARG_LPAREN=31, D_ARG_RPAREN=32, PHP_EXPR=33, EXIT_EOF=34, - D_ARG_PARAM_LPAREN=35, D_ARG_PARAM_RPAREN=36, BL_SQ_LPAREN=37, BL_SQ_RPAREN=38, - BL_CURLY_LPAREN=39, BL_CURLY_RPAREN=40, D_ARG_COMMA_EL=41, BL_PHP_EXPR=42, - BL_EXIT_EOF=43, D_ENDPHP=44, CONTENT_TAG_CLOSE=45, CONTENT_OTHER=46, EXIT_REGULAR_ECHO_EOF=47, - RAW_TAG_CLOSE=48, RAW_CONTENT_OTHER=49, EXIT_RAW_ECHO_EOF=50; - public static final int - RULE_file = 0, RULE_statement = 1, RULE_inline_tag_statement = 2, RULE_html_close_tag = 3, - RULE_html_indent = 4, RULE_html_tag = 5, RULE_self_closed_tag = 6, RULE_block_start = 7, - RULE_block_end = 8, RULE_block_aligned_directive = 9, RULE_inline_identable_element = 10, - RULE_section_inline = 11, RULE_section_block = 12, RULE_nl_with_space_after = 13, - RULE_nl_with_space = 14, RULE_static_element = 15, RULE_blade_echo = 16; - private static String[] makeRuleNames() { - return new String[] { - "file", "statement", "inline_tag_statement", "html_close_tag", "html_indent", - "html_tag", "self_closed_tag", "block_start", "block_end", "block_aligned_directive", - "inline_identable_element", "section_inline", "section_block", "nl_with_space_after", - "nl_with_space", "static_element", "blade_echo" - }; - } - public static final String[] ruleNames = makeRuleNames(); - - private static String[] makeLiteralNames() { - return new String[] { - null, null, null, null, null, null, null, null, null, null, null, null, - null, "'{{'", "'{!!'", "'''", "'\"'", null, null, null, null, null, "'='", - null, "'/>'", "'>'", null, "'@'", null, null, null, null, null, null, - null, null, null, null, null, null, null, "','", null, null, "'@endphp'" - }; - } - private static final String[] _LITERAL_NAMES = makeLiteralNames(); - private static String[] makeSymbolicNames() { - return new String[] { - null, "HTML", "PHP_CODE", "PARAM_COMMA", "PHP_INLINE", "D_BLOCK_DIRECTIVE_START", - "D_BLOCK_DIRECTIVE_END", "D_SECTION", "D_ENDSECTION", "D_BLOCK_ALIGNED_DIRECTIVE", - "NON_PARAM_DIRECTIVE", "D_INLINE_DIRECTIVE", "STRING", "CONTENT_TAG_OPEN", - "RAW_TAG_OPEN", "SG_QUOTE", "DB_QUOTE", "HTML_CLOSE_TAG", "HTML_COMMENT", - "HTML_START_BLOCK_TAG", "HTML_SELF_CLOSE_TAG", "COMPONENT_TAG", "EQ", - "IDENTIFIER", "INLINE_GT_SYMBOL", "GT_SYMBOL", "D_PHP", "AT", "WS", "NL", - "OTHER", "D_ARG_LPAREN", "D_ARG_RPAREN", "PHP_EXPR", "EXIT_EOF", "D_ARG_PARAM_LPAREN", - "D_ARG_PARAM_RPAREN", "BL_SQ_LPAREN", "BL_SQ_RPAREN", "BL_CURLY_LPAREN", - "BL_CURLY_RPAREN", "D_ARG_COMMA_EL", "BL_PHP_EXPR", "BL_EXIT_EOF", "D_ENDPHP", - "CONTENT_TAG_CLOSE", "CONTENT_OTHER", "EXIT_REGULAR_ECHO_EOF", "RAW_TAG_CLOSE", - "RAW_CONTENT_OTHER", "EXIT_RAW_ECHO_EOF" - }; - } - private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); - public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); - - /** - * @deprecated Use {@link #VOCABULARY} instead. - */ - @Deprecated - public static final String[] tokenNames; - static { - tokenNames = new String[_SYMBOLIC_NAMES.length]; - for (int i = 0; i < tokenNames.length; i++) { - tokenNames[i] = VOCABULARY.getLiteralName(i); - if (tokenNames[i] == null) { - tokenNames[i] = VOCABULARY.getSymbolicName(i); - } - - if (tokenNames[i] == null) { - tokenNames[i] = ""; - } - } - } - - @Override - @Deprecated - public String[] getTokenNames() { - return tokenNames; - } - - @Override - - public Vocabulary getVocabulary() { - return VOCABULARY; - } - - @Override - public String getGrammarFileName() { return "BladeAntlrFormatterParser.g4"; } - - @Override - public String[] getRuleNames() { return ruleNames; } - - @Override - public String getSerializedATN() { return _serializedATN; } - - @Override - public ATN getATN() { return _ATN; } - - public BladeAntlrFormatterParser(TokenStream input) { - super(input); - _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); - } - - @SuppressWarnings("CheckReturnValue") - public static class FileContext extends ParserRuleContext { - public TerminalNode EOF() { return getToken(BladeAntlrFormatterParser.EOF, 0); } - public List statement() { - return getRuleContexts(StatementContext.class); - } - public StatementContext statement(int i) { - return getRuleContext(StatementContext.class,i); - } - public FileContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_file; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterFile(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitFile(this); - } - } - - public final FileContext file() throws RecognitionException { - FileContext _localctx = new FileContext(_ctx, getState()); - enterRule(_localctx, 0, RULE_file); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(37); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2000678626L) != 0)) { - { - { - setState(34); - statement(); - } - } - setState(39); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(40); - match(EOF); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class StatementContext extends ParserRuleContext { - public Html_indentContext html_indent() { - return getRuleContext(Html_indentContext.class,0); - } - public Block_startContext block_start() { - return getRuleContext(Block_startContext.class,0); - } - public Block_endContext block_end() { - return getRuleContext(Block_endContext.class,0); - } - public Html_tagContext html_tag() { - return getRuleContext(Html_tagContext.class,0); - } - public Self_closed_tagContext self_closed_tag() { - return getRuleContext(Self_closed_tagContext.class,0); - } - public Section_blockContext section_block() { - return getRuleContext(Section_blockContext.class,0); - } - public Inline_identable_elementContext inline_identable_element() { - return getRuleContext(Inline_identable_elementContext.class,0); - } - public Block_aligned_directiveContext block_aligned_directive() { - return getRuleContext(Block_aligned_directiveContext.class,0); - } - public Static_elementContext static_element() { - return getRuleContext(Static_elementContext.class,0); - } - public Nl_with_space_afterContext nl_with_space_after() { - return getRuleContext(Nl_with_space_afterContext.class,0); - } - public Blade_echoContext blade_echo() { - return getRuleContext(Blade_echoContext.class,0); - } - public Html_close_tagContext html_close_tag() { - return getRuleContext(Html_close_tagContext.class,0); - } - public TerminalNode SG_QUOTE() { return getToken(BladeAntlrFormatterParser.SG_QUOTE, 0); } - public TerminalNode DB_QUOTE() { return getToken(BladeAntlrFormatterParser.DB_QUOTE, 0); } - public TerminalNode INLINE_GT_SYMBOL() { return getToken(BladeAntlrFormatterParser.INLINE_GT_SYMBOL, 0); } - public TerminalNode GT_SYMBOL() { return getToken(BladeAntlrFormatterParser.GT_SYMBOL, 0); } - public TerminalNode NL() { return getToken(BladeAntlrFormatterParser.NL, 0); } - public TerminalNode WS() { return getToken(BladeAntlrFormatterParser.WS, 0); } - public StatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_statement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitStatement(this); - } - } - - public final StatementContext statement() throws RecognitionException { - StatementContext _localctx = new StatementContext(_ctx, getState()); - enterRule(_localctx, 2, RULE_statement); - int _la; - try { - setState(59); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(42); - html_indent(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(43); - block_start(); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(44); - block_end(); - } - break; - case 4: - enterOuterAlt(_localctx, 4); - { - setState(45); - html_tag(); - } - break; - case 5: - enterOuterAlt(_localctx, 5); - { - setState(46); - self_closed_tag(); - } - break; - case 6: - enterOuterAlt(_localctx, 6); - { - setState(47); - section_block(); - } - break; - case 7: - enterOuterAlt(_localctx, 7); - { - setState(48); - inline_identable_element(); - } - break; - case 8: - enterOuterAlt(_localctx, 8); - { - setState(49); - block_aligned_directive(); - } - break; - case 9: - enterOuterAlt(_localctx, 9); - { - setState(50); - static_element(); - } - break; - case 10: - enterOuterAlt(_localctx, 10); - { - setState(51); - nl_with_space_after(); - } - break; - case 11: - enterOuterAlt(_localctx, 11); - { - setState(52); - blade_echo(); - } - break; - case 12: - enterOuterAlt(_localctx, 12); - { - setState(53); - block_end(); - } - break; - case 13: - enterOuterAlt(_localctx, 13); - { - setState(54); - html_close_tag(); - } - break; - case 14: - enterOuterAlt(_localctx, 14); - { - setState(55); - _la = _input.LA(1); - if ( !(_la==SG_QUOTE || _la==DB_QUOTE) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - } - break; - case 15: - enterOuterAlt(_localctx, 15); - { - setState(56); - match(INLINE_GT_SYMBOL); - } - break; - case 16: - enterOuterAlt(_localctx, 16); - { - setState(57); - match(GT_SYMBOL); - } - break; - case 17: - enterOuterAlt(_localctx, 17); - { - setState(58); - _la = _input.LA(1); - if ( !(_la==WS || _la==NL) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Inline_tag_statementContext extends ParserRuleContext { - public List IDENTIFIER() { return getTokens(BladeAntlrFormatterParser.IDENTIFIER); } - public TerminalNode IDENTIFIER(int i) { - return getToken(BladeAntlrFormatterParser.IDENTIFIER, i); - } - public TerminalNode EQ() { return getToken(BladeAntlrFormatterParser.EQ, 0); } - public Block_startContext block_start() { - return getRuleContext(Block_startContext.class,0); - } - public Block_endContext block_end() { - return getRuleContext(Block_endContext.class,0); - } - public Blade_echoContext blade_echo() { - return getRuleContext(Blade_echoContext.class,0); - } - public TerminalNode D_INLINE_DIRECTIVE() { return getToken(BladeAntlrFormatterParser.D_INLINE_DIRECTIVE, 0); } - public TerminalNode NON_PARAM_DIRECTIVE() { return getToken(BladeAntlrFormatterParser.NON_PARAM_DIRECTIVE, 0); } - public TerminalNode D_BLOCK_ALIGNED_DIRECTIVE() { return getToken(BladeAntlrFormatterParser.D_BLOCK_ALIGNED_DIRECTIVE, 0); } - public TerminalNode STRING() { return getToken(BladeAntlrFormatterParser.STRING, 0); } - public TerminalNode WS() { return getToken(BladeAntlrFormatterParser.WS, 0); } - public TerminalNode NL() { return getToken(BladeAntlrFormatterParser.NL, 0); } - public Inline_tag_statementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_inline_tag_statement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterInline_tag_statement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitInline_tag_statement(this); - } - } - - public final Inline_tag_statementContext inline_tag_statement() throws RecognitionException { - Inline_tag_statementContext _localctx = new Inline_tag_statementContext(_ctx, getState()); - enterRule(_localctx, 4, RULE_inline_tag_statement); - try { - setState(78); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(61); - match(IDENTIFIER); - setState(62); - match(EQ); - setState(63); - match(IDENTIFIER); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(64); - block_start(); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(65); - block_end(); - } - break; - case 4: - enterOuterAlt(_localctx, 4); - { - setState(66); - blade_echo(); - } - break; - case 5: - enterOuterAlt(_localctx, 5); - { - setState(67); - match(D_INLINE_DIRECTIVE); - } - break; - case 6: - enterOuterAlt(_localctx, 6); - { - setState(68); - match(NON_PARAM_DIRECTIVE); - } - break; - case 7: - enterOuterAlt(_localctx, 7); - { - setState(69); - match(D_BLOCK_ALIGNED_DIRECTIVE); - } - break; - case 8: - enterOuterAlt(_localctx, 8); - { - setState(70); - match(IDENTIFIER); - setState(71); - match(EQ); - setState(72); - match(STRING); - } - break; - case 9: - enterOuterAlt(_localctx, 9); - { - setState(73); - match(IDENTIFIER); - } - break; - case 10: - enterOuterAlt(_localctx, 10); - { - setState(74); - match(STRING); - } - break; - case 11: - enterOuterAlt(_localctx, 11); - { - setState(75); - match(EQ); - } - break; - case 12: - enterOuterAlt(_localctx, 12); - { - setState(76); - match(WS); - } - break; - case 13: - enterOuterAlt(_localctx, 13); - { - setState(77); - match(NL); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Html_close_tagContext extends ParserRuleContext { - public TerminalNode HTML_CLOSE_TAG() { return getToken(BladeAntlrFormatterParser.HTML_CLOSE_TAG, 0); } - public Html_close_tagContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_html_close_tag; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterHtml_close_tag(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitHtml_close_tag(this); - } - } - - public final Html_close_tagContext html_close_tag() throws RecognitionException { - Html_close_tagContext _localctx = new Html_close_tagContext(_ctx, getState()); - enterRule(_localctx, 6, RULE_html_close_tag); - try { - enterOuterAlt(_localctx, 1); - { - setState(80); - match(HTML_CLOSE_TAG); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Html_indentContext extends ParserRuleContext { - public TerminalNode GT_SYMBOL() { return getToken(BladeAntlrFormatterParser.GT_SYMBOL, 0); } - public TerminalNode NL() { return getToken(BladeAntlrFormatterParser.NL, 0); } - public TerminalNode HTML_START_BLOCK_TAG() { return getToken(BladeAntlrFormatterParser.HTML_START_BLOCK_TAG, 0); } - public TerminalNode COMPONENT_TAG() { return getToken(BladeAntlrFormatterParser.COMPONENT_TAG, 0); } - public List inline_tag_statement() { - return getRuleContexts(Inline_tag_statementContext.class); - } - public Inline_tag_statementContext inline_tag_statement(int i) { - return getRuleContext(Inline_tag_statementContext.class,i); - } - public List WS() { return getTokens(BladeAntlrFormatterParser.WS); } - public TerminalNode WS(int i) { - return getToken(BladeAntlrFormatterParser.WS, i); - } - public Html_indentContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_html_indent; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterHtml_indent(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitHtml_indent(this); - } - } - - public final Html_indentContext html_indent() throws RecognitionException { - Html_indentContext _localctx = new Html_indentContext(_ctx, getState()); - enterRule(_localctx, 8, RULE_html_indent); - int _la; - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(82); - _la = _input.LA(1); - if ( !(_la==HTML_START_BLOCK_TAG || _la==COMPONENT_TAG) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(86); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 817921632L) != 0)) { - { - { - setState(83); - inline_tag_statement(); - } - } - setState(88); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(89); - match(GT_SYMBOL); - setState(90); - match(NL); - setState(94); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,4,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(91); - match(WS); - } - } - } - setState(96); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,4,_ctx); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Html_tagContext extends ParserRuleContext { - public TerminalNode GT_SYMBOL() { return getToken(BladeAntlrFormatterParser.GT_SYMBOL, 0); } - public TerminalNode HTML_START_BLOCK_TAG() { return getToken(BladeAntlrFormatterParser.HTML_START_BLOCK_TAG, 0); } - public TerminalNode COMPONENT_TAG() { return getToken(BladeAntlrFormatterParser.COMPONENT_TAG, 0); } - public List inline_tag_statement() { - return getRuleContexts(Inline_tag_statementContext.class); - } - public Inline_tag_statementContext inline_tag_statement(int i) { - return getRuleContext(Inline_tag_statementContext.class,i); - } - public Html_tagContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_html_tag; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterHtml_tag(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitHtml_tag(this); - } - } - - public final Html_tagContext html_tag() throws RecognitionException { - Html_tagContext _localctx = new Html_tagContext(_ctx, getState()); - enterRule(_localctx, 10, RULE_html_tag); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(97); - _la = _input.LA(1); - if ( !(_la==HTML_START_BLOCK_TAG || _la==COMPONENT_TAG) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(101); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 817921632L) != 0)) { - { - { - setState(98); - inline_tag_statement(); - } - } - setState(103); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(104); - match(GT_SYMBOL); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Self_closed_tagContext extends ParserRuleContext { - public TerminalNode HTML_SELF_CLOSE_TAG() { return getToken(BladeAntlrFormatterParser.HTML_SELF_CLOSE_TAG, 0); } - public TerminalNode INLINE_GT_SYMBOL() { return getToken(BladeAntlrFormatterParser.INLINE_GT_SYMBOL, 0); } - public TerminalNode HTML_START_BLOCK_TAG() { return getToken(BladeAntlrFormatterParser.HTML_START_BLOCK_TAG, 0); } - public TerminalNode COMPONENT_TAG() { return getToken(BladeAntlrFormatterParser.COMPONENT_TAG, 0); } - public List inline_tag_statement() { - return getRuleContexts(Inline_tag_statementContext.class); - } - public Inline_tag_statementContext inline_tag_statement(int i) { - return getRuleContext(Inline_tag_statementContext.class,i); - } - public Self_closed_tagContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_self_closed_tag; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterSelf_closed_tag(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitSelf_closed_tag(this); - } - } - - public final Self_closed_tagContext self_closed_tag() throws RecognitionException { - Self_closed_tagContext _localctx = new Self_closed_tagContext(_ctx, getState()); - enterRule(_localctx, 12, RULE_self_closed_tag); - int _la; - try { - setState(115); - _errHandler.sync(this); - switch (_input.LA(1)) { - case HTML_SELF_CLOSE_TAG: - enterOuterAlt(_localctx, 1); - { - setState(106); - match(HTML_SELF_CLOSE_TAG); - } - break; - case HTML_START_BLOCK_TAG: - case COMPONENT_TAG: - enterOuterAlt(_localctx, 2); - { - { - setState(107); - _la = _input.LA(1); - if ( !(_la==HTML_START_BLOCK_TAG || _la==COMPONENT_TAG) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(111); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 817921632L) != 0)) { - { - { - setState(108); - inline_tag_statement(); - } - } - setState(113); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(114); - match(INLINE_GT_SYMBOL); - } - } - break; - default: - throw new NoViableAltException(this); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Block_startContext extends ParserRuleContext { - public Nl_with_space_afterContext ws_after; - public TerminalNode D_BLOCK_DIRECTIVE_START() { return getToken(BladeAntlrFormatterParser.D_BLOCK_DIRECTIVE_START, 0); } - public TerminalNode D_ARG_LPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_LPAREN, 0); } - public TerminalNode D_ARG_RPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_RPAREN, 0); } - public List nl_with_space_after() { - return getRuleContexts(Nl_with_space_afterContext.class); - } - public Nl_with_space_afterContext nl_with_space_after(int i) { - return getRuleContext(Nl_with_space_afterContext.class,i); - } - public Block_startContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_block_start; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterBlock_start(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitBlock_start(this); - } - } - - public final Block_startContext block_start() throws RecognitionException { - Block_startContext _localctx = new Block_startContext(_ctx, getState()); - enterRule(_localctx, 14, RULE_block_start); - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(117); - match(D_BLOCK_DIRECTIVE_START); - setState(118); - match(D_ARG_LPAREN); - setState(119); - match(D_ARG_RPAREN); - setState(123); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,8,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(120); - ((Block_startContext)_localctx).ws_after = nl_with_space_after(); - } - } - } - setState(125); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,8,_ctx); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Block_endContext extends ParserRuleContext { - public TerminalNode D_BLOCK_DIRECTIVE_END() { return getToken(BladeAntlrFormatterParser.D_BLOCK_DIRECTIVE_END, 0); } - public Block_endContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_block_end; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterBlock_end(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitBlock_end(this); - } - } - - public final Block_endContext block_end() throws RecognitionException { - Block_endContext _localctx = new Block_endContext(_ctx, getState()); - enterRule(_localctx, 16, RULE_block_end); - try { - enterOuterAlt(_localctx, 1); - { - setState(126); - match(D_BLOCK_DIRECTIVE_END); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Block_aligned_directiveContext extends ParserRuleContext { - public TerminalNode D_BLOCK_ALIGNED_DIRECTIVE() { return getToken(BladeAntlrFormatterParser.D_BLOCK_ALIGNED_DIRECTIVE, 0); } - public Block_aligned_directiveContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_block_aligned_directive; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterBlock_aligned_directive(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitBlock_aligned_directive(this); - } - } - - public final Block_aligned_directiveContext block_aligned_directive() throws RecognitionException { - Block_aligned_directiveContext _localctx = new Block_aligned_directiveContext(_ctx, getState()); - enterRule(_localctx, 18, RULE_block_aligned_directive); - try { - enterOuterAlt(_localctx, 1); - { - setState(128); - match(D_BLOCK_ALIGNED_DIRECTIVE); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Inline_identable_elementContext extends ParserRuleContext { - public TerminalNode D_INLINE_DIRECTIVE() { return getToken(BladeAntlrFormatterParser.D_INLINE_DIRECTIVE, 0); } - public TerminalNode NON_PARAM_DIRECTIVE() { return getToken(BladeAntlrFormatterParser.NON_PARAM_DIRECTIVE, 0); } - public Section_inlineContext section_inline() { - return getRuleContext(Section_inlineContext.class,0); - } - public Blade_echoContext blade_echo() { - return getRuleContext(Blade_echoContext.class,0); - } - public TerminalNode D_PHP() { return getToken(BladeAntlrFormatterParser.D_PHP, 0); } - public TerminalNode D_ENDPHP() { return getToken(BladeAntlrFormatterParser.D_ENDPHP, 0); } - public List PHP_CODE() { return getTokens(BladeAntlrFormatterParser.PHP_CODE); } - public TerminalNode PHP_CODE(int i) { - return getToken(BladeAntlrFormatterParser.PHP_CODE, i); - } - public Inline_identable_elementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_inline_identable_element; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterInline_identable_element(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitInline_identable_element(this); - } - } - - public final Inline_identable_elementContext inline_identable_element() throws RecognitionException { - Inline_identable_elementContext _localctx = new Inline_identable_elementContext(_ctx, getState()); - enterRule(_localctx, 20, RULE_inline_identable_element); - int _la; - try { - setState(141); - _errHandler.sync(this); - switch (_input.LA(1)) { - case D_INLINE_DIRECTIVE: - enterOuterAlt(_localctx, 1); - { - setState(130); - match(D_INLINE_DIRECTIVE); - } - break; - case NON_PARAM_DIRECTIVE: - enterOuterAlt(_localctx, 2); - { - setState(131); - match(NON_PARAM_DIRECTIVE); - } - break; - case D_SECTION: - enterOuterAlt(_localctx, 3); - { - setState(132); - section_inline(); - } - break; - case CONTENT_TAG_OPEN: - case RAW_TAG_OPEN: - enterOuterAlt(_localctx, 4); - { - setState(133); - blade_echo(); - } - break; - case D_PHP: - enterOuterAlt(_localctx, 5); - { - setState(134); - match(D_PHP); - setState(136); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(135); - match(PHP_CODE); - } - } - setState(138); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( _la==PHP_CODE ); - setState(140); - match(D_ENDPHP); - } - break; - default: - throw new NoViableAltException(this); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Section_inlineContext extends ParserRuleContext { - public TerminalNode D_SECTION() { return getToken(BladeAntlrFormatterParser.D_SECTION, 0); } - public TerminalNode D_ARG_LPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_LPAREN, 0); } - public TerminalNode PARAM_COMMA() { return getToken(BladeAntlrFormatterParser.PARAM_COMMA, 0); } - public TerminalNode D_ARG_RPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_RPAREN, 0); } - public Section_inlineContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_section_inline; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterSection_inline(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitSection_inline(this); - } - } - - public final Section_inlineContext section_inline() throws RecognitionException { - Section_inlineContext _localctx = new Section_inlineContext(_ctx, getState()); - enterRule(_localctx, 22, RULE_section_inline); - try { - enterOuterAlt(_localctx, 1); - { - setState(143); - match(D_SECTION); - setState(144); - match(D_ARG_LPAREN); - setState(145); - match(PARAM_COMMA); - setState(146); - match(D_ARG_RPAREN); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Section_blockContext extends ParserRuleContext { - public Nl_with_space_afterContext ws_after; - public TerminalNode D_SECTION() { return getToken(BladeAntlrFormatterParser.D_SECTION, 0); } - public TerminalNode D_ARG_LPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_LPAREN, 0); } - public TerminalNode D_ARG_RPAREN() { return getToken(BladeAntlrFormatterParser.D_ARG_RPAREN, 0); } - public TerminalNode D_ENDSECTION() { return getToken(BladeAntlrFormatterParser.D_ENDSECTION, 0); } - public List statement() { - return getRuleContexts(StatementContext.class); - } - public StatementContext statement(int i) { - return getRuleContext(StatementContext.class,i); - } - public List nl_with_space_after() { - return getRuleContexts(Nl_with_space_afterContext.class); - } - public Nl_with_space_afterContext nl_with_space_after(int i) { - return getRuleContext(Nl_with_space_afterContext.class,i); - } - public Section_blockContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_section_block; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterSection_block(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitSection_block(this); - } - } - - public final Section_blockContext section_block() throws RecognitionException { - Section_blockContext _localctx = new Section_blockContext(_ctx, getState()); - enterRule(_localctx, 24, RULE_section_block); - int _la; - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(148); - match(D_SECTION); - setState(149); - match(D_ARG_LPAREN); - setState(150); - match(D_ARG_RPAREN); - setState(154); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,11,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(151); - ((Section_blockContext)_localctx).ws_after = nl_with_space_after(); - } - } - } - setState(156); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,11,_ctx); - } - setState(158); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(157); - statement(); - } - } - setState(160); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 2000678626L) != 0) ); - setState(162); - match(D_ENDSECTION); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Nl_with_space_afterContext extends ParserRuleContext { - public List NL() { return getTokens(BladeAntlrFormatterParser.NL); } - public TerminalNode NL(int i) { - return getToken(BladeAntlrFormatterParser.NL, i); - } - public List WS() { return getTokens(BladeAntlrFormatterParser.WS); } - public TerminalNode WS(int i) { - return getToken(BladeAntlrFormatterParser.WS, i); - } - public Nl_with_space_afterContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_nl_with_space_after; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterNl_with_space_after(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitNl_with_space_after(this); - } - } - - public final Nl_with_space_afterContext nl_with_space_after() throws RecognitionException { - Nl_with_space_afterContext _localctx = new Nl_with_space_afterContext(_ctx, getState()); - enterRule(_localctx, 26, RULE_nl_with_space_after); - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(165); - _errHandler.sync(this); - _alt = 1; - do { - switch (_alt) { - case 1: - { - { - setState(164); - match(NL); - } - } - break; - default: - throw new NoViableAltException(this); - } - setState(167); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,13,_ctx); - } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); - setState(172); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,14,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(169); - match(WS); - } - } - } - setState(174); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,14,_ctx); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Nl_with_spaceContext extends ParserRuleContext { - public TerminalNode NL() { return getToken(BladeAntlrFormatterParser.NL, 0); } - public List WS() { return getTokens(BladeAntlrFormatterParser.WS); } - public TerminalNode WS(int i) { - return getToken(BladeAntlrFormatterParser.WS, i); - } - public Nl_with_spaceContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_nl_with_space; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterNl_with_space(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitNl_with_space(this); - } - } - - public final Nl_with_spaceContext nl_with_space() throws RecognitionException { - Nl_with_spaceContext _localctx = new Nl_with_spaceContext(_ctx, getState()); - enterRule(_localctx, 28, RULE_nl_with_space); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(175); - match(NL); - setState(179); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==WS) { - { - { - setState(176); - match(WS); - } - } - setState(181); - _errHandler.sync(this); - _la = _input.LA(1); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Static_elementContext extends ParserRuleContext { - public TerminalNode HTML_COMMENT() { return getToken(BladeAntlrFormatterParser.HTML_COMMENT, 0); } - public TerminalNode HTML() { return getToken(BladeAntlrFormatterParser.HTML, 0); } - public TerminalNode OTHER() { return getToken(BladeAntlrFormatterParser.OTHER, 0); } - public Static_elementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_static_element; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterStatic_element(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitStatic_element(this); - } - } - - public final Static_elementContext static_element() throws RecognitionException { - Static_elementContext _localctx = new Static_elementContext(_ctx, getState()); - enterRule(_localctx, 30, RULE_static_element); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(182); - _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 1074003970L) != 0)) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Blade_echoContext extends ParserRuleContext { - public TerminalNode CONTENT_TAG_OPEN() { return getToken(BladeAntlrFormatterParser.CONTENT_TAG_OPEN, 0); } - public TerminalNode CONTENT_TAG_CLOSE() { return getToken(BladeAntlrFormatterParser.CONTENT_TAG_CLOSE, 0); } - public TerminalNode RAW_TAG_OPEN() { return getToken(BladeAntlrFormatterParser.RAW_TAG_OPEN, 0); } - public TerminalNode RAW_TAG_CLOSE() { return getToken(BladeAntlrFormatterParser.RAW_TAG_CLOSE, 0); } - public Blade_echoContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_blade_echo; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).enterBlade_echo(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrFormatterParserListener ) ((BladeAntlrFormatterParserListener)listener).exitBlade_echo(this); - } - } - - public final Blade_echoContext blade_echo() throws RecognitionException { - Blade_echoContext _localctx = new Blade_echoContext(_ctx, getState()); - enterRule(_localctx, 32, RULE_blade_echo); - try { - setState(188); - _errHandler.sync(this); - switch (_input.LA(1)) { - case CONTENT_TAG_OPEN: - enterOuterAlt(_localctx, 1); - { - { - setState(184); - match(CONTENT_TAG_OPEN); - setState(185); - match(CONTENT_TAG_CLOSE); - } - } - break; - case RAW_TAG_OPEN: - enterOuterAlt(_localctx, 2); - { - { - setState(186); - match(RAW_TAG_OPEN); - setState(187); - match(RAW_TAG_CLOSE); - } - } - break; - default: - throw new NoViableAltException(this); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static final String _serializedATN = - "\u0004\u00012\u00bf\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ - "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ - "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ - "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ - "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"+ - "\u0002\u0010\u0007\u0010\u0001\u0000\u0005\u0000$\b\u0000\n\u0000\f\u0000"+ - "\'\t\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0003\u0001<\b\u0001\u0001\u0002\u0001\u0002"+ - "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ - "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ - "\u0001\u0002\u0001\u0002\u0001\u0002\u0003\u0002O\b\u0002\u0001\u0003"+ - "\u0001\u0003\u0001\u0004\u0001\u0004\u0005\u0004U\b\u0004\n\u0004\f\u0004"+ - "X\t\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0005\u0004]\b\u0004\n\u0004"+ - "\f\u0004`\t\u0004\u0001\u0005\u0001\u0005\u0005\u0005d\b\u0005\n\u0005"+ - "\f\u0005g\t\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0005\u0006n\b\u0006\n\u0006\f\u0006q\t\u0006\u0001\u0006\u0003"+ - "\u0006t\b\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0005"+ - "\u0007z\b\u0007\n\u0007\f\u0007}\t\u0007\u0001\b\u0001\b\u0001\t\u0001"+ - "\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0004\n\u0089\b\n\u000b"+ - "\n\f\n\u008a\u0001\n\u0003\n\u008e\b\n\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0005\f\u0099"+ - "\b\f\n\f\f\f\u009c\t\f\u0001\f\u0004\f\u009f\b\f\u000b\f\f\f\u00a0\u0001"+ - "\f\u0001\f\u0001\r\u0004\r\u00a6\b\r\u000b\r\f\r\u00a7\u0001\r\u0005\r"+ - "\u00ab\b\r\n\r\f\r\u00ae\t\r\u0001\u000e\u0001\u000e\u0005\u000e\u00b2"+ - "\b\u000e\n\u000e\f\u000e\u00b5\t\u000e\u0001\u000f\u0001\u000f\u0001\u0010"+ - "\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u00bd\b\u0010\u0001\u0010"+ - "\u0000\u0000\u0011\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014"+ - "\u0016\u0018\u001a\u001c\u001e \u0000\u0004\u0001\u0000\u000f\u0010\u0001"+ - "\u0000\u001c\u001d\u0002\u0000\u0013\u0013\u0015\u0015\u0003\u0000\u0001"+ - "\u0001\u0012\u0012\u001e\u001e\u00db\u0000%\u0001\u0000\u0000\u0000\u0002"+ - ";\u0001\u0000\u0000\u0000\u0004N\u0001\u0000\u0000\u0000\u0006P\u0001"+ - "\u0000\u0000\u0000\bR\u0001\u0000\u0000\u0000\na\u0001\u0000\u0000\u0000"+ - "\fs\u0001\u0000\u0000\u0000\u000eu\u0001\u0000\u0000\u0000\u0010~\u0001"+ - "\u0000\u0000\u0000\u0012\u0080\u0001\u0000\u0000\u0000\u0014\u008d\u0001"+ - "\u0000\u0000\u0000\u0016\u008f\u0001\u0000\u0000\u0000\u0018\u0094\u0001"+ - "\u0000\u0000\u0000\u001a\u00a5\u0001\u0000\u0000\u0000\u001c\u00af\u0001"+ - "\u0000\u0000\u0000\u001e\u00b6\u0001\u0000\u0000\u0000 \u00bc\u0001\u0000"+ - "\u0000\u0000\"$\u0003\u0002\u0001\u0000#\"\u0001\u0000\u0000\u0000$\'"+ - "\u0001\u0000\u0000\u0000%#\u0001\u0000\u0000\u0000%&\u0001\u0000\u0000"+ - "\u0000&(\u0001\u0000\u0000\u0000\'%\u0001\u0000\u0000\u0000()\u0005\u0000"+ - "\u0000\u0001)\u0001\u0001\u0000\u0000\u0000*<\u0003\b\u0004\u0000+<\u0003"+ - "\u000e\u0007\u0000,<\u0003\u0010\b\u0000-<\u0003\n\u0005\u0000.<\u0003"+ - "\f\u0006\u0000/<\u0003\u0018\f\u00000<\u0003\u0014\n\u00001<\u0003\u0012"+ - "\t\u00002<\u0003\u001e\u000f\u00003<\u0003\u001a\r\u00004<\u0003 \u0010"+ - "\u00005<\u0003\u0010\b\u00006<\u0003\u0006\u0003\u00007<\u0007\u0000\u0000"+ - "\u00008<\u0005\u0018\u0000\u00009<\u0005\u0019\u0000\u0000:<\u0007\u0001"+ - "\u0000\u0000;*\u0001\u0000\u0000\u0000;+\u0001\u0000\u0000\u0000;,\u0001"+ - "\u0000\u0000\u0000;-\u0001\u0000\u0000\u0000;.\u0001\u0000\u0000\u0000"+ - ";/\u0001\u0000\u0000\u0000;0\u0001\u0000\u0000\u0000;1\u0001\u0000\u0000"+ - "\u0000;2\u0001\u0000\u0000\u0000;3\u0001\u0000\u0000\u0000;4\u0001\u0000"+ - "\u0000\u0000;5\u0001\u0000\u0000\u0000;6\u0001\u0000\u0000\u0000;7\u0001"+ - "\u0000\u0000\u0000;8\u0001\u0000\u0000\u0000;9\u0001\u0000\u0000\u0000"+ - ";:\u0001\u0000\u0000\u0000<\u0003\u0001\u0000\u0000\u0000=>\u0005\u0017"+ - "\u0000\u0000>?\u0005\u0016\u0000\u0000?O\u0005\u0017\u0000\u0000@O\u0003"+ - "\u000e\u0007\u0000AO\u0003\u0010\b\u0000BO\u0003 \u0010\u0000CO\u0005"+ - "\u000b\u0000\u0000DO\u0005\n\u0000\u0000EO\u0005\t\u0000\u0000FG\u0005"+ - "\u0017\u0000\u0000GH\u0005\u0016\u0000\u0000HO\u0005\f\u0000\u0000IO\u0005"+ - "\u0017\u0000\u0000JO\u0005\f\u0000\u0000KO\u0005\u0016\u0000\u0000LO\u0005"+ - "\u001c\u0000\u0000MO\u0005\u001d\u0000\u0000N=\u0001\u0000\u0000\u0000"+ - "N@\u0001\u0000\u0000\u0000NA\u0001\u0000\u0000\u0000NB\u0001\u0000\u0000"+ - "\u0000NC\u0001\u0000\u0000\u0000ND\u0001\u0000\u0000\u0000NE\u0001\u0000"+ - "\u0000\u0000NF\u0001\u0000\u0000\u0000NI\u0001\u0000\u0000\u0000NJ\u0001"+ - "\u0000\u0000\u0000NK\u0001\u0000\u0000\u0000NL\u0001\u0000\u0000\u0000"+ - "NM\u0001\u0000\u0000\u0000O\u0005\u0001\u0000\u0000\u0000PQ\u0005\u0011"+ - "\u0000\u0000Q\u0007\u0001\u0000\u0000\u0000RV\u0007\u0002\u0000\u0000"+ - "SU\u0003\u0004\u0002\u0000TS\u0001\u0000\u0000\u0000UX\u0001\u0000\u0000"+ - "\u0000VT\u0001\u0000\u0000\u0000VW\u0001\u0000\u0000\u0000WY\u0001\u0000"+ - "\u0000\u0000XV\u0001\u0000\u0000\u0000YZ\u0005\u0019\u0000\u0000Z^\u0005"+ - "\u001d\u0000\u0000[]\u0005\u001c\u0000\u0000\\[\u0001\u0000\u0000\u0000"+ - "]`\u0001\u0000\u0000\u0000^\\\u0001\u0000\u0000\u0000^_\u0001\u0000\u0000"+ - "\u0000_\t\u0001\u0000\u0000\u0000`^\u0001\u0000\u0000\u0000ae\u0007\u0002"+ - "\u0000\u0000bd\u0003\u0004\u0002\u0000cb\u0001\u0000\u0000\u0000dg\u0001"+ - "\u0000\u0000\u0000ec\u0001\u0000\u0000\u0000ef\u0001\u0000\u0000\u0000"+ - "fh\u0001\u0000\u0000\u0000ge\u0001\u0000\u0000\u0000hi\u0005\u0019\u0000"+ - "\u0000i\u000b\u0001\u0000\u0000\u0000jt\u0005\u0014\u0000\u0000ko\u0007"+ - "\u0002\u0000\u0000ln\u0003\u0004\u0002\u0000ml\u0001\u0000\u0000\u0000"+ - "nq\u0001\u0000\u0000\u0000om\u0001\u0000\u0000\u0000op\u0001\u0000\u0000"+ - "\u0000pr\u0001\u0000\u0000\u0000qo\u0001\u0000\u0000\u0000rt\u0005\u0018"+ - "\u0000\u0000sj\u0001\u0000\u0000\u0000sk\u0001\u0000\u0000\u0000t\r\u0001"+ - "\u0000\u0000\u0000uv\u0005\u0005\u0000\u0000vw\u0005\u001f\u0000\u0000"+ - "w{\u0005 \u0000\u0000xz\u0003\u001a\r\u0000yx\u0001\u0000\u0000\u0000"+ - "z}\u0001\u0000\u0000\u0000{y\u0001\u0000\u0000\u0000{|\u0001\u0000\u0000"+ - "\u0000|\u000f\u0001\u0000\u0000\u0000}{\u0001\u0000\u0000\u0000~\u007f"+ - "\u0005\u0006\u0000\u0000\u007f\u0011\u0001\u0000\u0000\u0000\u0080\u0081"+ - "\u0005\t\u0000\u0000\u0081\u0013\u0001\u0000\u0000\u0000\u0082\u008e\u0005"+ - "\u000b\u0000\u0000\u0083\u008e\u0005\n\u0000\u0000\u0084\u008e\u0003\u0016"+ - "\u000b\u0000\u0085\u008e\u0003 \u0010\u0000\u0086\u0088\u0005\u001a\u0000"+ - "\u0000\u0087\u0089\u0005\u0002\u0000\u0000\u0088\u0087\u0001\u0000\u0000"+ - "\u0000\u0089\u008a\u0001\u0000\u0000\u0000\u008a\u0088\u0001\u0000\u0000"+ - "\u0000\u008a\u008b\u0001\u0000\u0000\u0000\u008b\u008c\u0001\u0000\u0000"+ - "\u0000\u008c\u008e\u0005,\u0000\u0000\u008d\u0082\u0001\u0000\u0000\u0000"+ - "\u008d\u0083\u0001\u0000\u0000\u0000\u008d\u0084\u0001\u0000\u0000\u0000"+ - "\u008d\u0085\u0001\u0000\u0000\u0000\u008d\u0086\u0001\u0000\u0000\u0000"+ - "\u008e\u0015\u0001\u0000\u0000\u0000\u008f\u0090\u0005\u0007\u0000\u0000"+ - "\u0090\u0091\u0005\u001f\u0000\u0000\u0091\u0092\u0005\u0003\u0000\u0000"+ - "\u0092\u0093\u0005 \u0000\u0000\u0093\u0017\u0001\u0000\u0000\u0000\u0094"+ - "\u0095\u0005\u0007\u0000\u0000\u0095\u0096\u0005\u001f\u0000\u0000\u0096"+ - "\u009a\u0005 \u0000\u0000\u0097\u0099\u0003\u001a\r\u0000\u0098\u0097"+ - "\u0001\u0000\u0000\u0000\u0099\u009c\u0001\u0000\u0000\u0000\u009a\u0098"+ - "\u0001\u0000\u0000\u0000\u009a\u009b\u0001\u0000\u0000\u0000\u009b\u009e"+ - "\u0001\u0000\u0000\u0000\u009c\u009a\u0001\u0000\u0000\u0000\u009d\u009f"+ - "\u0003\u0002\u0001\u0000\u009e\u009d\u0001\u0000\u0000\u0000\u009f\u00a0"+ - "\u0001\u0000\u0000\u0000\u00a0\u009e\u0001\u0000\u0000\u0000\u00a0\u00a1"+ - "\u0001\u0000\u0000\u0000\u00a1\u00a2\u0001\u0000\u0000\u0000\u00a2\u00a3"+ - "\u0005\b\u0000\u0000\u00a3\u0019\u0001\u0000\u0000\u0000\u00a4\u00a6\u0005"+ - "\u001d\u0000\u0000\u00a5\u00a4\u0001\u0000\u0000\u0000\u00a6\u00a7\u0001"+ - "\u0000\u0000\u0000\u00a7\u00a5\u0001\u0000\u0000\u0000\u00a7\u00a8\u0001"+ - "\u0000\u0000\u0000\u00a8\u00ac\u0001\u0000\u0000\u0000\u00a9\u00ab\u0005"+ - "\u001c\u0000\u0000\u00aa\u00a9\u0001\u0000\u0000\u0000\u00ab\u00ae\u0001"+ - "\u0000\u0000\u0000\u00ac\u00aa\u0001\u0000\u0000\u0000\u00ac\u00ad\u0001"+ - "\u0000\u0000\u0000\u00ad\u001b\u0001\u0000\u0000\u0000\u00ae\u00ac\u0001"+ - "\u0000\u0000\u0000\u00af\u00b3\u0005\u001d\u0000\u0000\u00b0\u00b2\u0005"+ - "\u001c\u0000\u0000\u00b1\u00b0\u0001\u0000\u0000\u0000\u00b2\u00b5\u0001"+ - "\u0000\u0000\u0000\u00b3\u00b1\u0001\u0000\u0000\u0000\u00b3\u00b4\u0001"+ - "\u0000\u0000\u0000\u00b4\u001d\u0001\u0000\u0000\u0000\u00b5\u00b3\u0001"+ - "\u0000\u0000\u0000\u00b6\u00b7\u0007\u0003\u0000\u0000\u00b7\u001f\u0001"+ - "\u0000\u0000\u0000\u00b8\u00b9\u0005\r\u0000\u0000\u00b9\u00bd\u0005-"+ - "\u0000\u0000\u00ba\u00bb\u0005\u000e\u0000\u0000\u00bb\u00bd\u00050\u0000"+ - "\u0000\u00bc\u00b8\u0001\u0000\u0000\u0000\u00bc\u00ba\u0001\u0000\u0000"+ - "\u0000\u00bd!\u0001\u0000\u0000\u0000\u0011%;NV^eos{\u008a\u008d\u009a"+ - "\u00a0\u00a7\u00ac\u00b3\u00bc"; - public static final ATN _ATN = - new ATNDeserializer().deserialize(_serializedATN.toCharArray()); - static { - _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; - for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { - _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); - } - } -} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserBaseListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserBaseListener.java deleted file mode 100644 index e761c5f48790..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserBaseListener.java +++ /dev/null @@ -1,264 +0,0 @@ -// Generated from BladeAntlrFormatterParser.g4 by ANTLR 4.13.0 - - /* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.syntax.antlr4.formatter; - - -import org.antlr.v4.runtime.ParserRuleContext; -import org.antlr.v4.runtime.tree.ErrorNode; -import org.antlr.v4.runtime.tree.TerminalNode; - -/** - * This class provides an empty implementation of {@link BladeAntlrFormatterParserListener}, - * which can be extended to create a listener which only needs to handle a subset - * of the available methods. - */ -@SuppressWarnings("CheckReturnValue") -public class BladeAntlrFormatterParserBaseListener implements BladeAntlrFormatterParserListener { - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterFile(BladeAntlrFormatterParser.FileContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitFile(BladeAntlrFormatterParser.FileContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterStatement(BladeAntlrFormatterParser.StatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitStatement(BladeAntlrFormatterParser.StatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterInline_tag_statement(BladeAntlrFormatterParser.Inline_tag_statementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitInline_tag_statement(BladeAntlrFormatterParser.Inline_tag_statementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterHtml_close_tag(BladeAntlrFormatterParser.Html_close_tagContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitHtml_close_tag(BladeAntlrFormatterParser.Html_close_tagContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterHtml_indent(BladeAntlrFormatterParser.Html_indentContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitHtml_indent(BladeAntlrFormatterParser.Html_indentContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterHtml_tag(BladeAntlrFormatterParser.Html_tagContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitHtml_tag(BladeAntlrFormatterParser.Html_tagContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterSelf_closed_tag(BladeAntlrFormatterParser.Self_closed_tagContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitSelf_closed_tag(BladeAntlrFormatterParser.Self_closed_tagContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterBlock_start(BladeAntlrFormatterParser.Block_startContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitBlock_start(BladeAntlrFormatterParser.Block_startContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterBlock_end(BladeAntlrFormatterParser.Block_endContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitBlock_end(BladeAntlrFormatterParser.Block_endContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterBlock_aligned_directive(BladeAntlrFormatterParser.Block_aligned_directiveContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitBlock_aligned_directive(BladeAntlrFormatterParser.Block_aligned_directiveContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterInline_identable_element(BladeAntlrFormatterParser.Inline_identable_elementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitInline_identable_element(BladeAntlrFormatterParser.Inline_identable_elementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterSection_inline(BladeAntlrFormatterParser.Section_inlineContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitSection_inline(BladeAntlrFormatterParser.Section_inlineContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterSection_block(BladeAntlrFormatterParser.Section_blockContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitSection_block(BladeAntlrFormatterParser.Section_blockContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterNl_with_space_after(BladeAntlrFormatterParser.Nl_with_space_afterContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitNl_with_space_after(BladeAntlrFormatterParser.Nl_with_space_afterContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterNl_with_space(BladeAntlrFormatterParser.Nl_with_spaceContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitNl_with_space(BladeAntlrFormatterParser.Nl_with_spaceContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterStatic_element(BladeAntlrFormatterParser.Static_elementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitStatic_element(BladeAntlrFormatterParser.Static_elementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterBlade_echo(BladeAntlrFormatterParser.Blade_echoContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitBlade_echo(BladeAntlrFormatterParser.Blade_echoContext ctx) { } - - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterEveryRule(ParserRuleContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitEveryRule(ParserRuleContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void visitTerminal(TerminalNode node) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void visitErrorNode(ErrorNode node) { } -} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserListener.java deleted file mode 100644 index 8284a1e2faf1..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlrFormatterParserListener.java +++ /dev/null @@ -1,200 +0,0 @@ -// Generated from BladeAntlrFormatterParser.g4 by ANTLR 4.13.0 - - /* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.syntax.antlr4.formatter; - -import org.antlr.v4.runtime.tree.ParseTreeListener; - -/** - * This interface defines a complete listener for a parse tree produced by - * {@link BladeAntlrFormatterParser}. - */ -public interface BladeAntlrFormatterParserListener extends ParseTreeListener { - /** - * Enter a parse tree produced by {@link BladeAntlrFormatterParser#file}. - * @param ctx the parse tree - */ - void enterFile(BladeAntlrFormatterParser.FileContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrFormatterParser#file}. - * @param ctx the parse tree - */ - void exitFile(BladeAntlrFormatterParser.FileContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrFormatterParser#statement}. - * @param ctx the parse tree - */ - void enterStatement(BladeAntlrFormatterParser.StatementContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrFormatterParser#statement}. - * @param ctx the parse tree - */ - void exitStatement(BladeAntlrFormatterParser.StatementContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrFormatterParser#inline_tag_statement}. - * @param ctx the parse tree - */ - void enterInline_tag_statement(BladeAntlrFormatterParser.Inline_tag_statementContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrFormatterParser#inline_tag_statement}. - * @param ctx the parse tree - */ - void exitInline_tag_statement(BladeAntlrFormatterParser.Inline_tag_statementContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrFormatterParser#html_close_tag}. - * @param ctx the parse tree - */ - void enterHtml_close_tag(BladeAntlrFormatterParser.Html_close_tagContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrFormatterParser#html_close_tag}. - * @param ctx the parse tree - */ - void exitHtml_close_tag(BladeAntlrFormatterParser.Html_close_tagContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrFormatterParser#html_indent}. - * @param ctx the parse tree - */ - void enterHtml_indent(BladeAntlrFormatterParser.Html_indentContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrFormatterParser#html_indent}. - * @param ctx the parse tree - */ - void exitHtml_indent(BladeAntlrFormatterParser.Html_indentContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrFormatterParser#html_tag}. - * @param ctx the parse tree - */ - void enterHtml_tag(BladeAntlrFormatterParser.Html_tagContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrFormatterParser#html_tag}. - * @param ctx the parse tree - */ - void exitHtml_tag(BladeAntlrFormatterParser.Html_tagContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrFormatterParser#self_closed_tag}. - * @param ctx the parse tree - */ - void enterSelf_closed_tag(BladeAntlrFormatterParser.Self_closed_tagContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrFormatterParser#self_closed_tag}. - * @param ctx the parse tree - */ - void exitSelf_closed_tag(BladeAntlrFormatterParser.Self_closed_tagContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrFormatterParser#block_start}. - * @param ctx the parse tree - */ - void enterBlock_start(BladeAntlrFormatterParser.Block_startContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrFormatterParser#block_start}. - * @param ctx the parse tree - */ - void exitBlock_start(BladeAntlrFormatterParser.Block_startContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrFormatterParser#block_end}. - * @param ctx the parse tree - */ - void enterBlock_end(BladeAntlrFormatterParser.Block_endContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrFormatterParser#block_end}. - * @param ctx the parse tree - */ - void exitBlock_end(BladeAntlrFormatterParser.Block_endContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrFormatterParser#block_aligned_directive}. - * @param ctx the parse tree - */ - void enterBlock_aligned_directive(BladeAntlrFormatterParser.Block_aligned_directiveContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrFormatterParser#block_aligned_directive}. - * @param ctx the parse tree - */ - void exitBlock_aligned_directive(BladeAntlrFormatterParser.Block_aligned_directiveContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrFormatterParser#inline_identable_element}. - * @param ctx the parse tree - */ - void enterInline_identable_element(BladeAntlrFormatterParser.Inline_identable_elementContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrFormatterParser#inline_identable_element}. - * @param ctx the parse tree - */ - void exitInline_identable_element(BladeAntlrFormatterParser.Inline_identable_elementContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrFormatterParser#section_inline}. - * @param ctx the parse tree - */ - void enterSection_inline(BladeAntlrFormatterParser.Section_inlineContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrFormatterParser#section_inline}. - * @param ctx the parse tree - */ - void exitSection_inline(BladeAntlrFormatterParser.Section_inlineContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrFormatterParser#section_block}. - * @param ctx the parse tree - */ - void enterSection_block(BladeAntlrFormatterParser.Section_blockContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrFormatterParser#section_block}. - * @param ctx the parse tree - */ - void exitSection_block(BladeAntlrFormatterParser.Section_blockContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrFormatterParser#nl_with_space_after}. - * @param ctx the parse tree - */ - void enterNl_with_space_after(BladeAntlrFormatterParser.Nl_with_space_afterContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrFormatterParser#nl_with_space_after}. - * @param ctx the parse tree - */ - void exitNl_with_space_after(BladeAntlrFormatterParser.Nl_with_space_afterContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrFormatterParser#nl_with_space}. - * @param ctx the parse tree - */ - void enterNl_with_space(BladeAntlrFormatterParser.Nl_with_spaceContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrFormatterParser#nl_with_space}. - * @param ctx the parse tree - */ - void exitNl_with_space(BladeAntlrFormatterParser.Nl_with_spaceContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrFormatterParser#static_element}. - * @param ctx the parse tree - */ - void enterStatic_element(BladeAntlrFormatterParser.Static_elementContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrFormatterParser#static_element}. - * @param ctx the parse tree - */ - void exitStatic_element(BladeAntlrFormatterParser.Static_elementContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrFormatterParser#blade_echo}. - * @param ctx the parse tree - */ - void enterBlade_echo(BladeAntlrFormatterParser.Blade_echoContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrFormatterParser#blade_echo}. - * @param ctx the parse tree - */ - void exitBlade_echo(BladeAntlrFormatterParser.Blade_echoContext ctx); -} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java deleted file mode 100644 index aef6bcbbcd7a..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.java +++ /dev/null @@ -1,1716 +0,0 @@ -// Generated from BladeAntlrColoringLexer.g4 by ANTLR 4.13.0 - - /* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - package org.netbeans.modules.php.blade.syntax.antlr4.v10; - -import org.antlr.v4.runtime.Lexer; -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.TokenStream; -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.atn.*; -import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.misc.*; - -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) -public class BladeAntlrColoringLexer extends ColoringLexerAdaptor { - static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } - - protected static final DFA[] _decisionToDFA; - protected static final PredictionContextCache _sharedContextCache = - new PredictionContextCache(); - public static final int - DIRECTIVE=1, BLADE_PAREN=2, PHP_EXPRESSION=3, BLADE_PHP_ECHO_EXPR=4, RAW_TAG=5, - CONTENT_TAG=6, HTML=7, HTML_TAG=8, ERROR=9, BLADE_COMMENT=10, PHP_INLINE=11, - D_PHP=12, D_CUSTOM=13, D_UNKNOWN=14, D_AT=15, BLADE_COMMENT_START=16, - GREEDY_REGULAR_ECHO_EXPR=17, ESCAPED_ECHO_EXPR=18, RAW_ECHO_EXPR=19, RAW_ECHO_EXPR_MORE=20, - OPEN_EXPR_PAREN=21, LPAREN=22, RPAREN=23, PHP_EXPRESSION_COMMENT=24, PHP_EXPRESSION_MORE=25, - D_ENDPHP=26, BLADE_PHP_INLINE=27, BLADE_COMMENT_END=28, D_ENDVERBATIM=29, - EXIT_HTML_COMPONENT=30, EXIT_COMPONENT_PHP_EXPRESSION=31, DB_QUOTE_MORE=32; - public static final int - PHP_CODE=2; - public static final int - INSIDE_HTML_TAG=1, INSIDE_REGULAR_ECHO=2, INSIDE_RAW_ECHO=3, LOOK_FOR_PHP_EXPRESSION=4, - INSIDE_PHP_EXPRESSION=5, BLADE_INLINE_PHP=6, VERBATIM_MODE=7, INSIDE_HTML_COMPONENT_TAG=8, - COMPONENT_PHP_EXPRESSION=9, INSIDE_BLADE_COMMENT=10; - public static String[] channelNames = { - "DEFAULT_TOKEN_CHANNEL", "HIDDEN", "PHP_CODE" - }; - - public static String[] modeNames = { - "DEFAULT_MODE", "INSIDE_HTML_TAG", "INSIDE_REGULAR_ECHO", "INSIDE_RAW_ECHO", - "LOOK_FOR_PHP_EXPRESSION", "INSIDE_PHP_EXPRESSION", "BLADE_INLINE_PHP", - "VERBATIM_MODE", "INSIDE_HTML_COMPONENT_TAG", "COMPONENT_PHP_EXPRESSION", - "INSIDE_BLADE_COMMENT" - }; - - private static String[] makeRuleNames() { - return new String[] { - "DirectivesWithEndTag", "Include", "ComponentTagIdentifier", "SpecialChars", - "PHP_INLINE", "D_GENERIC_BLOCK_DIRECTIVES", "D_GENERIC_INLINE_DIRECTIVES", - "D_GENERIC_INLINE_MIXED_DIRECTIVES", "D_GENERIC_END_TAGS", "D_VERBATIM", - "D_ENDVERBATIM", "D_MISC", "D_SIMPLE", "D_PHP_SHORT", "D_PHP", "D_END_ARG", - "D_END", "D_LIVEWIRE", "D_ASSET_BUNDLER", "D_CUSTOM", "D_UNKNOWN", "D_AT", - "CONTENT_TAG_OPEN", "RAW_TAG_OPEN", "CSS_COMMENT", "HTML_X", "CLOSE_TAG", - "HTML", "HTML_MISC", "HTML_WS", "INCOMPLETE_BLADE_TAG", "OTHER", "NameString", - "BladeLabel", "FullIdentifier", "ESC_DOUBLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING_FRAGMENT", - "SINGLE_QUOTED_STRING_FRAGMENT", "LineComment", "PhpVariable", "PhpKeyword", - "Digit", "BLADE_COMMENT_START", "EMAIL_SUBSTRING", "VERSION_WITH_AT", - "D_ESCAPES", "OTHER_HTML_POP", "OTHER_HTML", "HTML_EOF", "CONTENT_TAG_CLOSE", - "GREEDY_REGULAR_ECHO_EXPR", "ESCAPED_ECHO_EXPR", "EXIT_ECHO_EOF", "RAW_TAG_CLOSE", - "RAW_ECHO_EXPR", "RAW_ECHO_EXPR_MORE", "EXIT_RAW_ECHO_EOF", "BLADE_PAREN", - "AFTER_DIRECTIVE", "L_OTHER", "OPEN_EXPR_PAREN", "CLOSE_EXPR_PAREN", - "LPAREN", "RPAREN", "EXIT_RPAREN", "PHP_EXPRESSION_COMMENT", "PHP_EXPRESSION_MORE", - "EXIT_EOF", "D_ENDPHP", "BLADE_PHP_INLINE", "BLADE_PHP_INLINE_MORE", - "EXIT_INLINE_PHP_EOF", "D_ENDVERBATIM_IN_MODE", "VERBATIM_HTML", "VERBATIM_HTML_MORE", - "EXIT_VERBATIM_MOD_EOF", "COMPONENT_ATTRIBUTE", "COMPONENT_CONTENT_TAG_OPEN", - "COMPONENT_RAW_TAG_OPEN", "EXIT_HTML_COMPONENT", "HTML_COMPONENT_ANY", - "EXIT_HTML_COMPONENT_EOF", "EXIT_COMPONENT_PHP_EXPRESSION", "COMPONENT_PHP_EXPRESSION_LAST", - "COMPONENT_PHP_EXPRESSION", "EXIT_COMPONENT_PHP_EXPRESSION_EOF", "DB_JSON_PAIR", - "PHP_INTERCALATED", "DB_POINT", "DB_QUOTE_MORE", "DB_QUOTE_EXIT", "DB_QUOTE_ANY", - "DB_QUOTE_EOF", "BLADE_COMMENT_END", "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", - "BLADE_COMMENT_EOF" - }; - } - public static final String[] ruleNames = makeRuleNames(); - - private static String[] makeLiteralNames() { - return new String[] { - null, null, null, null, null, null, null, null, null, null, null, null, - "'@php'", null, null, null, "'{{--'", null, null, null, null, null, null, - null, null, null, "'@endphp'", null, "'--}}'", null, "'>'", null, "'\\\"'" - }; - } - private static final String[] _LITERAL_NAMES = makeLiteralNames(); - private static String[] makeSymbolicNames() { - return new String[] { - null, "DIRECTIVE", "BLADE_PAREN", "PHP_EXPRESSION", "BLADE_PHP_ECHO_EXPR", - "RAW_TAG", "CONTENT_TAG", "HTML", "HTML_TAG", "ERROR", "BLADE_COMMENT", - "PHP_INLINE", "D_PHP", "D_CUSTOM", "D_UNKNOWN", "D_AT", "BLADE_COMMENT_START", - "GREEDY_REGULAR_ECHO_EXPR", "ESCAPED_ECHO_EXPR", "RAW_ECHO_EXPR", "RAW_ECHO_EXPR_MORE", - "OPEN_EXPR_PAREN", "LPAREN", "RPAREN", "PHP_EXPRESSION_COMMENT", "PHP_EXPRESSION_MORE", - "D_ENDPHP", "BLADE_PHP_INLINE", "BLADE_COMMENT_END", "D_ENDVERBATIM", - "EXIT_HTML_COMPONENT", "EXIT_COMPONENT_PHP_EXPRESSION", "DB_QUOTE_MORE" - }; - } - private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); - public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); - - /** - * @deprecated Use {@link #VOCABULARY} instead. - */ - @Deprecated - public static final String[] tokenNames; - static { - tokenNames = new String[_SYMBOLIC_NAMES.length]; - for (int i = 0; i < tokenNames.length; i++) { - tokenNames[i] = VOCABULARY.getLiteralName(i); - if (tokenNames[i] == null) { - tokenNames[i] = VOCABULARY.getSymbolicName(i); - } - - if (tokenNames[i] == null) { - tokenNames[i] = ""; - } - } - } - - @Override - @Deprecated - public String[] getTokenNames() { - return tokenNames; - } - - @Override - - public Vocabulary getVocabulary() { - return VOCABULARY; - } - - - public BladeAntlrColoringLexer(CharStream input) { - super(input); - _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); - } - - @Override - public String getGrammarFileName() { return "BladeAntlrColoringLexer.g4"; } - - @Override - public String[] getRuleNames() { return ruleNames; } - - @Override - public String getSerializedATN() { return _serializedATN; } - - @Override - public String[] getChannelNames() { return channelNames; } - - @Override - public String[] getModeNames() { return modeNames; } - - @Override - public ATN getATN() { return _ATN; } - - @Override - public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { - switch (ruleIndex) { - case 50: - GREEDY_REGULAR_ECHO_EXPR_action((RuleContext)_localctx, actionIndex); - break; - case 51: - ESCAPED_ECHO_EXPR_action((RuleContext)_localctx, actionIndex); - break; - case 54: - RAW_ECHO_EXPR_action((RuleContext)_localctx, actionIndex); - break; - case 55: - RAW_ECHO_EXPR_MORE_action((RuleContext)_localctx, actionIndex); - break; - case 57: - BLADE_PAREN_action((RuleContext)_localctx, actionIndex); - break; - case 60: - OPEN_EXPR_PAREN_action((RuleContext)_localctx, actionIndex); - break; - case 61: - CLOSE_EXPR_PAREN_action((RuleContext)_localctx, actionIndex); - break; - case 62: - LPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 63: - RPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 66: - PHP_EXPRESSION_MORE_action((RuleContext)_localctx, actionIndex); - break; - } - } - private void GREEDY_REGULAR_ECHO_EXPR_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 0: - this.consumeEscapedEchoToken(); - break; - } - } - private void ESCAPED_ECHO_EXPR_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 1: - this.consumeEscapedEchoToken(); - break; - } - } - private void RAW_ECHO_EXPR_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 2: - this.consumeNotEscapedEchoToken(); - break; - } - } - private void RAW_ECHO_EXPR_MORE_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 3: - this.consumeNotEscapedEchoToken(); - break; - } - } - private void BLADE_PAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 4: - this.increaseRoundParenBalance(); - break; - } - } - private void OPEN_EXPR_PAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 5: - this.increaseRoundParenBalance(); - break; - case 6: - this.consumeExprToken(); - break; - } - } - private void CLOSE_EXPR_PAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 7: - this.resetRoundParenBalance(); - break; - } - } - private void LPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 8: - this.increaseRoundParenBalance(); - break; - case 9: - this.consumeExprToken(); - break; - } - } - private void RPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 10: - this.decreaseRoundParenBalance(); - break; - case 11: - this.consumeExprToken(); - break; - } - } - private void PHP_EXPRESSION_MORE_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 12: - this.consumeExprToken(); - break; - } - } - @Override - public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { - switch (ruleIndex) { - case 5: - return D_GENERIC_BLOCK_DIRECTIVES_sempred((RuleContext)_localctx, predIndex); - case 6: - return D_GENERIC_INLINE_DIRECTIVES_sempred((RuleContext)_localctx, predIndex); - case 11: - return D_MISC_sempred((RuleContext)_localctx, predIndex); - case 13: - return D_PHP_SHORT_sempred((RuleContext)_localctx, predIndex); - case 15: - return D_END_ARG_sempred((RuleContext)_localctx, predIndex); - case 18: - return D_ASSET_BUNDLER_sempred((RuleContext)_localctx, predIndex); - case 19: - return D_CUSTOM_sempred((RuleContext)_localctx, predIndex); - case 27: - return HTML_sempred((RuleContext)_localctx, predIndex); - case 28: - return HTML_MISC_sempred((RuleContext)_localctx, predIndex); - case 46: - return OTHER_HTML_POP_sempred((RuleContext)_localctx, predIndex); - case 60: - return OPEN_EXPR_PAREN_sempred((RuleContext)_localctx, predIndex); - case 61: - return CLOSE_EXPR_PAREN_sempred((RuleContext)_localctx, predIndex); - case 62: - return LPAREN_sempred((RuleContext)_localctx, predIndex); - case 63: - return RPAREN_sempred((RuleContext)_localctx, predIndex); - case 64: - return EXIT_RPAREN_sempred((RuleContext)_localctx, predIndex); - case 69: - return BLADE_PHP_INLINE_sempred((RuleContext)_localctx, predIndex); - case 73: - return VERBATIM_HTML_sempred((RuleContext)_localctx, predIndex); - case 83: - return COMPONENT_PHP_EXPRESSION_LAST_sempred((RuleContext)_localctx, predIndex); - case 94: - return BLADE_COMMENT_PEEK_sempred((RuleContext)_localctx, predIndex); - } - return true; - } - private boolean D_GENERIC_BLOCK_DIRECTIVES_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 0: - return this._input.LA(1) == '('; - } - return true; - } - private boolean D_GENERIC_INLINE_DIRECTIVES_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 1: - return this._input.LA(1) == '('; - } - return true; - } - private boolean D_MISC_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 2: - return this._input.LA(1) == '('; - } - return true; - } - private boolean D_PHP_SHORT_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 3: - return this._input.LA(1) == '('; - } - return true; - } - private boolean D_END_ARG_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 4: - return this._input.LA(1) == '('; - } - return true; - } - private boolean D_ASSET_BUNDLER_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 5: - return this._input.LA(1) == '('; - } - return true; - } - private boolean D_CUSTOM_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 6: - return this._input.LA(1) == '('; - } - return true; - } - private boolean HTML_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 7: - return this._input.LA(1) != '@'; - case 8: - return this._input.LA(1) != '@'; - case 9: - return this._input.LA(1) != 'x' && this._input.LA(1) != '?' && this._input.LA(2) != 'p'; - } - return true; - } - private boolean HTML_MISC_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 10: - return this._input.LA(1) != '@'; - } - return true; - } - private boolean OTHER_HTML_POP_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 11: - return this._input.LA(1) == '@' || this._input.LA(1) == '{' || (this._input.LA(1) == '<' && (this._input.LA(2) == 'x' || this._input.LA(2) == '?')); - } - return true; - } - private boolean OPEN_EXPR_PAREN_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 12: - return this.getRoundParenBalance() == 0; - } - return true; - } - private boolean CLOSE_EXPR_PAREN_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 13: - return this.getRoundParenBalance() <= 1; - } - return true; - } - private boolean LPAREN_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 14: - return this.getRoundParenBalance() > 0; - } - return true; - } - private boolean RPAREN_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 15: - return this.getRoundParenBalance() > 0; - } - return true; - } - private boolean EXIT_RPAREN_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 16: - return this._input.LA(1) == ')' && this.getRoundParenBalance() <= 1; - } - return true; - } - private boolean BLADE_PHP_INLINE_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 17: - return - this._input.LA(1) == '@' && - this._input.LA(2) == 'e' && - this._input.LA(3) == 'n' && - this._input.LA(4) == 'd' && - this._input.LA(5) == 'p' && - this._input.LA(6) == 'h' && - this._input.LA(7) == 'p' - ; - } - return true; - } - private boolean VERBATIM_HTML_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 18: - return - this._input.LA(1) == '@' && - this._input.LA(2) == 'e' && - this._input.LA(3) == 'n' && - this._input.LA(4) == 'd' && - this._input.LA(5) == 'v' && - this._input.LA(6) == 'e' && - this._input.LA(7) == 'r' - ; - } - return true; - } - private boolean COMPONENT_PHP_EXPRESSION_LAST_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 19: - return this._input.LA(1) == '"'; - } - return true; - } - private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 20: - return - this._input.LA(1) == '-' && - this._input.LA(2) == '-' && - this._input.LA(3) == '}' && - this._input.LA(4) == '}' - ; - } - return true; - } - - public static final String _serializedATN = - "\u0004\u0000 \u072a\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ - "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ - "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ - "\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002"+ - "\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005"+ - "\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002"+ - "\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007\f\u0002"+ - "\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f\u0002\u0010"+ - "\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012\u0002\u0013"+ - "\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015\u0002\u0016"+ - "\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018\u0002\u0019"+ - "\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007\u001b\u0002\u001c"+ - "\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007\u001e\u0002\u001f"+ - "\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002#\u0007"+ - "#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002(\u0007"+ - "(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002-\u0007"+ - "-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u00071\u00022\u0007"+ - "2\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u00076\u00027\u0007"+ - "7\u00028\u00078\u00029\u00079\u0002:\u0007:\u0002;\u0007;\u0002<\u0007"+ - "<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007?\u0002@\u0007@\u0002A\u0007"+ - "A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007D\u0002E\u0007E\u0002F\u0007"+ - "F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007I\u0002J\u0007J\u0002K\u0007"+ - "K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007N\u0002O\u0007O\u0002P\u0007"+ - "P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007S\u0002T\u0007T\u0002U\u0007"+ - "U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007X\u0002Y\u0007Y\u0002Z\u0007"+ - "Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007]\u0002^\u0007^\u0002_\u0007"+ - "_\u0002`\u0007`\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0003\u0000\u00d6\b\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0003\u0000\u0113"+ - "\b\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0003"+ - "\u0000\u0132\b\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u014e\b\u0001\u0001"+ - "\u0002\u0001\u0002\u0005\u0002\u0152\b\u0002\n\u0002\f\u0002\u0155\t\u0002"+ - "\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ - "\u0001\u0004\u0005\u0004\u015e\b\u0004\n\u0004\f\u0004\u0161\t\u0004\u0001"+ - "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ - "\u0004\u0001\u0004\u0001\u0004\u0005\u0004\u016c\b\u0004\n\u0004\f\u0004"+ - "\u016f\t\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0003\u0004\u0174\b"+ - "\u0004\u0003\u0004\u0176\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0003\u0005\u0194\b\u0005\u0001\u0005\u0005\u0005\u0197\b\u0005"+ - "\n\u0005\f\u0005\u019a\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0003\u0006\u020e\b\u0006\u0001\u0006\u0005"+ - "\u0006\u0211\b\u0006\n\u0006\f\u0006\u0214\t\u0006\u0001\u0006\u0001\u0006"+ - "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ - "\u0003\u0007\u022a\b\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0003\b\u0259\b\b\u0001\b\u0001\b\u0001"+ - "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ - "\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b"+ - "\u0290\b\u000b\u0001\u000b\u0005\u000b\u0293\b\u000b\n\u000b\f\u000b\u0296"+ - "\t\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0003\f\u02bd\b\f\u0001\f\u0001\f\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0003\r\u02c7\b\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ - "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f"+ - "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0005\u000f"+ - "\u02dd\b\u000f\n\u000f\f\u000f\u02e0\t\u000f\u0001\u000f\u0001\u000f\u0001"+ - "\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0003\u0011\u0330\b\u0011\u0001"+ - "\u0011\u0003\u0011\u0333\b\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0005"+ - "\u0012\u033e\b\u0012\n\u0012\f\u0012\u0341\t\u0012\u0001\u0012\u0001\u0012"+ - "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013"+ - "\u0005\u0013\u034b\b\u0013\n\u0013\f\u0013\u034e\t\u0013\u0001\u0013\u0001"+ - "\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ - "\u0015\u0001\u0015\u0003\u0015\u0359\b\u0015\u0001\u0016\u0001\u0016\u0001"+ - "\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001"+ - "\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0005\u0018\u036c\b\u0018\n\u0018\f\u0018"+ - "\u036f\t\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0003\u0018"+ - "\u0375\b\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019"+ - "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+ - "\u0001\u0019\u0001\u0019\u0004\u0019\u0384\b\u0019\u000b\u0019\f\u0019"+ - "\u0385\u0003\u0019\u0388\b\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ - "\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0005"+ - "\u001a\u0393\b\u001a\n\u001a\f\u001a\u0396\t\u001a\u0004\u001a\u0398\b"+ - "\u001a\u000b\u001a\f\u001a\u0399\u0001\u001a\u0001\u001a\u0001\u001b\u0004"+ - "\u001b\u039f\b\u001b\u000b\u001b\f\u001b\u03a0\u0001\u001b\u0004\u001b"+ - "\u03a4\b\u001b\u000b\u001b\f\u001b\u03a5\u0001\u001b\u0001\u001b\u0001"+ - "\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001"+ - "\u001b\u0001\u001b\u0004\u001b\u03b2\b\u001b\u000b\u001b\f\u001b\u03b3"+ - "\u0001\u001b\u0005\u001b\u03b7\b\u001b\n\u001b\f\u001b\u03ba\t\u001b\u0001"+ - "\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001"+ - "\u001c\u0004\u001c\u03c3\b\u001c\u000b\u001c\f\u001c\u03c4\u0001\u001c"+ - "\u0004\u001c\u03c8\b\u001c\u000b\u001c\f\u001c\u03c9\u0001\u001c\u0003"+ - "\u001c\u03cd\b\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001"+ - "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0004\u001c\u03d8"+ - "\b\u001c\u000b\u001c\f\u001c\u03d9\u0001\u001c\u0004\u001c\u03dd\b\u001c"+ - "\u000b\u001c\f\u001c\u03de\u0001\u001c\u0001\u001c\u0001\u001d\u0004\u001d"+ - "\u03e4\b\u001d\u000b\u001d\f\u001d\u03e5\u0001\u001d\u0004\u001d\u03e9"+ - "\b\u001d\u000b\u001d\f\u001d\u03ea\u0003\u001d\u03ed\b\u001d\u0001\u001d"+ - "\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ - "\u0003\u001e\u03f6\b\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f"+ - "\u0001\u001f\u0001\u001f\u0001 \u0001 \u0005 \u0400\b \n \f \u0403\t "+ - "\u0001!\u0001!\u0005!\u0407\b!\n!\f!\u040a\t!\u0001\"\u0001\"\u0005\""+ - "\u040e\b\"\n\"\f\"\u0411\t\"\u0001#\u0001#\u0001$\u0001$\u0001$\u0005"+ - "$\u0418\b$\n$\f$\u041b\t$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0005"+ - "%\u0423\b%\n%\f%\u0426\t%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0005"+ - "&\u042e\b&\n&\f&\u0431\t&\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001"+ - "(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001"+ - "(\u0001(\u0001(\u0001(\u0001(\u0001(\u0003(\u0448\b(\u0001)\u0001)\u0001"+ - "*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001"+ - "+\u0001+\u0001+\u0001,\u0001,\u0001,\u0003,\u045c\b,\u0004,\u045e\b,\u000b"+ - ",\f,\u045f\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0003-\u046b\b-\u0001-\u0001-\u0001-\u0001-\u0003-\u0471\b-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0004-\u047b\b-\u000b-\f-"+ - "\u047c\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0004-"+ - "\u0487\b-\u000b-\f-\u0488\u0001-\u0001-\u0001-\u0003-\u048e\b-\u0003-"+ - "\u0490\b-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0003-\u0591\b-\u0001-\u0005"+ - "-\u0594\b-\n-\f-\u0597\t-\u0003-\u0599\b-\u0001-\u0001-\u0001.\u0001."+ - "\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u00010\u0001"+ - "0\u00010\u00010\u00010\u00011\u00011\u00011\u00011\u00011\u00011\u0001"+ - "2\u00042\u05b3\b2\u000b2\f2\u05b4\u00012\u00012\u00013\u00013\u00053\u05bb"+ - "\b3\n3\f3\u05be\t3\u00013\u00013\u00014\u00014\u00014\u00014\u00014\u0001"+ - "5\u00015\u00015\u00015\u00015\u00015\u00015\u00016\u00046\u05cf\b6\u000b"+ - "6\f6\u05d0\u00016\u00016\u00017\u00017\u00057\u05d7\b7\n7\f7\u05da\t7"+ - "\u00017\u00017\u00018\u00018\u00018\u00018\u00018\u00019\u00019\u0001"+ - "9\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001"+ - ";\u0001;\u0001;\u0001<\u0001<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001"+ - "=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001>\u0001"+ - "?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ - "A\u0001A\u0001A\u0001A\u0005A\u0611\bA\nA\fA\u0614\tA\u0001A\u0001A\u0001"+ - "A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ - "D\u0001E\u0001E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001"+ - "G\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001H\u0001"+ - "H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001"+ - "H\u0001I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001"+ - "K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ - "L\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001"+ - "N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0001"+ - "O\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ - "R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ - "T\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001U\u0001V\u0001"+ - "V\u0003V\u0691\bV\u0001V\u0001V\u0003V\u0695\bV\u0001V\u0004V\u0698\b"+ - "V\u000bV\fV\u0699\u0001V\u0003V\u069d\bV\u0001V\u0003V\u06a0\bV\u0001"+ - "V\u0003V\u06a3\bV\u0001V\u0001V\u0003V\u06a7\bV\u0001V\u0001V\u0003V\u06ab"+ - "\bV\u0001V\u0004V\u06ae\bV\u000bV\fV\u06af\u0001V\u0003V\u06b3\bV\u0001"+ - "V\u0001V\u0003V\u06b7\bV\u0005V\u06b9\bV\nV\fV\u06bc\tV\u0001V\u0003V"+ - "\u06bf\bV\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001"+ - "W\u0001W\u0001W\u0001W\u0001W\u0005W\u06ce\bW\nW\fW\u06d1\tW\u0001W\u0001"+ - "W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001"+ - "X\u0001X\u0001X\u0003X\u06e1\bX\u0001X\u0001X\u0005X\u06e5\bX\nX\fX\u06e8"+ - "\tX\u0001X\u0001X\u0004X\u06ec\bX\u000bX\fX\u06ed\u0001X\u0003X\u06f1"+ - "\bX\u0001X\u0001X\u0003X\u06f5\bX\u0004X\u06f7\bX\u000bX\fX\u06f8\u0001"+ - "X\u0001X\u0001X\u0001X\u0003X\u06ff\bX\u0001X\u0001X\u0001Y\u0001Y\u0001"+ - "Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001"+ - "[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]"+ - "\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001^\u0001"+ - "_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001`\u0005\u015f"+ - "\u016d\u036d\u0419\u0612\u0000a\u000b\u0000\r\u0000\u000f\u0000\u0011"+ - "\u0000\u0013\u000b\u0015\u0000\u0017\u0000\u0019\u0000\u001b\u0000\u001d"+ - "\u0000\u001f\u001d!\u0000#\u0000%\u0000\'\f)\u0000+\u0000-\u0000/\u0000"+ - "1\r3\u000e5\u000f7\u00009\u0000;\u0000=\u0000?\u0000A\u0007C\u0000E\u0000"+ - "G\u0000I\u0000K\u0000M\u0000O\u0000Q\u0000S\u0000U\u0000W\u0000Y\u0000"+ - "[\u0000]\u0000_\u0010a\u0000c\u0000e\u0000g\u0000i\u0000k\u0000m\u0000"+ - "o\u0011q\u0012s\u0000u\u0000w\u0013y\u0014{\u0000}\u0002\u007f\u0000\u0081"+ - "\u0000\u0083\u0015\u0085\u0000\u0087\u0016\u0089\u0017\u008b\u0000\u008d"+ - "\u0018\u008f\u0019\u0091\u0000\u0093\u001a\u0095\u001b\u0097\u0000\u0099"+ - "\u0000\u009b\u0000\u009d\u0000\u009f\u0000\u00a1\u0000\u00a3\u0000\u00a5"+ - "\u0000\u00a7\u0000\u00a9\u001e\u00ab\u0000\u00ad\u0000\u00af\u001f\u00b1"+ - "\u0000\u00b3\u0000\u00b5\u0000\u00b7\u0000\u00b9\u0000\u00bb\u0000\u00bd"+ - " \u00bf\u0000\u00c1\u0000\u00c3\u0000\u00c5\u001c\u00c7\u0000\u00c9\u0000"+ - "\u00cb\u0000\u000b\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t"+ - "\n,\u0002\u0000FFff\u0002\u0000OOoo\u0002\u0000RRrr\u0002\u0000EEee\u0002"+ - "\u0000AAaa\u0002\u0000CCcc\u0002\u0000HHhh\u0002\u0000IIii\u0002\u0000"+ - "WWww\u0002\u0000LLll\u0002\u0000SSss\u0002\u0000TTtt\u0002\u0000NNnn\u0002"+ - "\u0000PPpp\u0002\u0000UUuu\u0002\u0000YYyy\u0002\u0000GGgg\u0002\u0000"+ - "DDdd\u0002\u0000MMmm\u0004\u0000AZ__az\u0080\u8000\ufffe\u0005\u0000-"+ - ".0:AZaz\u0080\u8000\ufffe\u0002\u0000XXxx\u0002\u0000BBbb\u0002\u0000"+ - "KKkk\u0002\u0000QQqq\u0002\u0000VVvv\u0002\u0000JJjj\u0004\u0000\n\n\r"+ - "\r >>\u0003\u0000\n\n\r\r \u0002\u0000\n\n\r\r\u0004\u0000,,..==__\u0001"+ - "\u0000(;\u0002\u0000[[]]\u0002\u0000##..\u0003\u0000..==__\u0005\u0000"+ - "09AZ__az\u0080\u8000\ufffe\u0003\u0000AZaz\u0080\u8000\ufffe\u0006\u0000"+ - "..09AZ__az\u0080\u8000\ufffe\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002"+ - "\u0000\"\"\\\\\u0002\u0000\'\'\\\\\u0001\u0000 \u0003\u0000 {{}}\u0003"+ - "\u0000 !{{}}\u07c4\u0000\u0013\u0001\u0000\u0000\u0000\u0000\u0015\u0001"+ - "\u0000\u0000\u0000\u0000\u0017\u0001\u0000\u0000\u0000\u0000\u0019\u0001"+ - "\u0000\u0000\u0000\u0000\u001b\u0001\u0000\u0000\u0000\u0000\u001d\u0001"+ - "\u0000\u0000\u0000\u0000\u001f\u0001\u0000\u0000\u0000\u0000!\u0001\u0000"+ - "\u0000\u0000\u0000#\u0001\u0000\u0000\u0000\u0000%\u0001\u0000\u0000\u0000"+ - "\u0000\'\u0001\u0000\u0000\u0000\u0000)\u0001\u0000\u0000\u0000\u0000"+ - "+\u0001\u0000\u0000\u0000\u0000-\u0001\u0000\u0000\u0000\u0000/\u0001"+ - "\u0000\u0000\u0000\u00001\u0001\u0000\u0000\u0000\u00003\u0001\u0000\u0000"+ - "\u0000\u00005\u0001\u0000\u0000\u0000\u00007\u0001\u0000\u0000\u0000\u0000"+ - "9\u0001\u0000\u0000\u0000\u0000;\u0001\u0000\u0000\u0000\u0000=\u0001"+ - "\u0000\u0000\u0000\u0000?\u0001\u0000\u0000\u0000\u0000A\u0001\u0000\u0000"+ - "\u0000\u0000C\u0001\u0000\u0000\u0000\u0000E\u0001\u0000\u0000\u0000\u0000"+ - "G\u0001\u0000\u0000\u0000\u0000I\u0001\u0000\u0000\u0000\u0000_\u0001"+ - "\u0000\u0000\u0000\u0000a\u0001\u0000\u0000\u0000\u0000c\u0001\u0000\u0000"+ - "\u0000\u0000e\u0001\u0000\u0000\u0000\u0001g\u0001\u0000\u0000\u0000\u0001"+ - "i\u0001\u0000\u0000\u0000\u0001k\u0001\u0000\u0000\u0000\u0002m\u0001"+ - "\u0000\u0000\u0000\u0002o\u0001\u0000\u0000\u0000\u0002q\u0001\u0000\u0000"+ - "\u0000\u0002s\u0001\u0000\u0000\u0000\u0003u\u0001\u0000\u0000\u0000\u0003"+ - "w\u0001\u0000\u0000\u0000\u0003y\u0001\u0000\u0000\u0000\u0003{\u0001"+ - "\u0000\u0000\u0000\u0004}\u0001\u0000\u0000\u0000\u0004\u007f\u0001\u0000"+ - "\u0000\u0000\u0004\u0081\u0001\u0000\u0000\u0000\u0005\u0083\u0001\u0000"+ - "\u0000\u0000\u0005\u0085\u0001\u0000\u0000\u0000\u0005\u0087\u0001\u0000"+ - "\u0000\u0000\u0005\u0089\u0001\u0000\u0000\u0000\u0005\u008b\u0001\u0000"+ - "\u0000\u0000\u0005\u008d\u0001\u0000\u0000\u0000\u0005\u008f\u0001\u0000"+ - "\u0000\u0000\u0005\u0091\u0001\u0000\u0000\u0000\u0006\u0093\u0001\u0000"+ - "\u0000\u0000\u0006\u0095\u0001\u0000\u0000\u0000\u0006\u0097\u0001\u0000"+ - "\u0000\u0000\u0006\u0099\u0001\u0000\u0000\u0000\u0007\u009b\u0001\u0000"+ - "\u0000\u0000\u0007\u009d\u0001\u0000\u0000\u0000\u0007\u009f\u0001\u0000"+ - "\u0000\u0000\u0007\u00a1\u0001\u0000\u0000\u0000\b\u00a3\u0001\u0000\u0000"+ - "\u0000\b\u00a5\u0001\u0000\u0000\u0000\b\u00a7\u0001\u0000\u0000\u0000"+ - "\b\u00a9\u0001\u0000\u0000\u0000\b\u00ab\u0001\u0000\u0000\u0000\b\u00ad"+ - "\u0001\u0000\u0000\u0000\t\u00af\u0001\u0000\u0000\u0000\t\u00b1\u0001"+ - "\u0000\u0000\u0000\t\u00b3\u0001\u0000\u0000\u0000\t\u00b5\u0001\u0000"+ - "\u0000\u0000\t\u00b7\u0001\u0000\u0000\u0000\t\u00b9\u0001\u0000\u0000"+ - "\u0000\t\u00bb\u0001\u0000\u0000\u0000\t\u00bd\u0001\u0000\u0000\u0000"+ - "\t\u00bf\u0001\u0000\u0000\u0000\t\u00c1\u0001\u0000\u0000\u0000\t\u00c3"+ - "\u0001\u0000\u0000\u0000\n\u00c5\u0001\u0000\u0000\u0000\n\u00c7\u0001"+ - "\u0000\u0000\u0000\n\u00c9\u0001\u0000\u0000\u0000\n\u00cb\u0001\u0000"+ - "\u0000\u0000\u000b\u0131\u0001\u0000\u0000\u0000\r\u0133\u0001\u0000\u0000"+ - "\u0000\u000f\u014f\u0001\u0000\u0000\u0000\u0011\u0156\u0001\u0000\u0000"+ - "\u0000\u0013\u0175\u0001\u0000\u0000\u0000\u0015\u0193\u0001\u0000\u0000"+ - "\u0000\u0017\u020d\u0001\u0000\u0000\u0000\u0019\u0229\u0001\u0000\u0000"+ - "\u0000\u001b\u0258\u0001\u0000\u0000\u0000\u001d\u025c\u0001\u0000\u0000"+ - "\u0000\u001f\u0269\u0001\u0000\u0000\u0000!\u028f\u0001\u0000\u0000\u0000"+ - "#\u02bc\u0001\u0000\u0000\u0000%\u02c0\u0001\u0000\u0000\u0000\'\u02cd"+ - "\u0001\u0000\u0000\u0000)\u02d4\u0001\u0000\u0000\u0000+\u02e6\u0001\u0000"+ - "\u0000\u0000-\u0332\u0001\u0000\u0000\u0000/\u0336\u0001\u0000\u0000\u0000"+ - "1\u0347\u0001\u0000\u0000\u00003\u0353\u0001\u0000\u0000\u00005\u0356"+ - "\u0001\u0000\u0000\u00007\u035a\u0001\u0000\u0000\u00009\u0360\u0001\u0000"+ - "\u0000\u0000;\u0374\u0001\u0000\u0000\u0000=\u0387\u0001\u0000\u0000\u0000"+ - "?\u0397\u0001\u0000\u0000\u0000A\u03b8\u0001\u0000\u0000\u0000C\u03dc"+ - "\u0001\u0000\u0000\u0000E\u03ec\u0001\u0000\u0000\u0000G\u03f5\u0001\u0000"+ - "\u0000\u0000I\u03f9\u0001\u0000\u0000\u0000K\u03fd\u0001\u0000\u0000\u0000"+ - "M\u0404\u0001\u0000\u0000\u0000O\u040b\u0001\u0000\u0000\u0000Q\u0412"+ - "\u0001\u0000\u0000\u0000S\u0414\u0001\u0000\u0000\u0000U\u041e\u0001\u0000"+ - "\u0000\u0000W\u0429\u0001\u0000\u0000\u0000Y\u0432\u0001\u0000\u0000\u0000"+ - "[\u0447\u0001\u0000\u0000\u0000]\u0449\u0001\u0000\u0000\u0000_\u044b"+ - "\u0001\u0000\u0000\u0000a\u0452\u0001\u0000\u0000\u0000c\u0458\u0001\u0000"+ - "\u0000\u0000e\u0598\u0001\u0000\u0000\u0000g\u059c\u0001\u0000\u0000\u0000"+ - "i\u05a2\u0001\u0000\u0000\u0000k\u05a6\u0001\u0000\u0000\u0000m\u05ab"+ - "\u0001\u0000\u0000\u0000o\u05b2\u0001\u0000\u0000\u0000q\u05b8\u0001\u0000"+ - "\u0000\u0000s\u05c1\u0001\u0000\u0000\u0000u\u05c6\u0001\u0000\u0000\u0000"+ - "w\u05ce\u0001\u0000\u0000\u0000y\u05d4\u0001\u0000\u0000\u0000{\u05dd"+ - "\u0001\u0000\u0000\u0000}\u05e2\u0001\u0000\u0000\u0000\u007f\u05e7\u0001"+ - "\u0000\u0000\u0000\u0081\u05ec\u0001\u0000\u0000\u0000\u0083\u05f1\u0001"+ - "\u0000\u0000\u0000\u0085\u05f6\u0001\u0000\u0000\u0000\u0087\u05fd\u0001"+ - "\u0000\u0000\u0000\u0089\u0602\u0001\u0000\u0000\u0000\u008b\u0607\u0001"+ - "\u0000\u0000\u0000\u008d\u060c\u0001\u0000\u0000\u0000\u008f\u061a\u0001"+ - "\u0000\u0000\u0000\u0091\u061d\u0001\u0000\u0000\u0000\u0093\u0622\u0001"+ - "\u0000\u0000\u0000\u0095\u062c\u0001\u0000\u0000\u0000\u0097\u0631\u0001"+ - "\u0000\u0000\u0000\u0099\u0635\u0001\u0000\u0000\u0000\u009b\u063a\u0001"+ - "\u0000\u0000\u0000\u009d\u064a\u0001\u0000\u0000\u0000\u009f\u064f\u0001"+ - "\u0000\u0000\u0000\u00a1\u0653\u0001\u0000\u0000\u0000\u00a3\u0658\u0001"+ - "\u0000\u0000\u0000\u00a5\u0660\u0001\u0000\u0000\u0000\u00a7\u0666\u0001"+ - "\u0000\u0000\u0000\u00a9\u066d\u0001\u0000\u0000\u0000\u00ab\u0672\u0001"+ - "\u0000\u0000\u0000\u00ad\u0676\u0001\u0000\u0000\u0000\u00af\u067b\u0001"+ - "\u0000\u0000\u0000\u00b1\u0680\u0001\u0000\u0000\u0000\u00b3\u0685\u0001"+ - "\u0000\u0000\u0000\u00b5\u0689\u0001\u0000\u0000\u0000\u00b7\u068e\u0001"+ - "\u0000\u0000\u0000\u00b9\u06c4\u0001\u0000\u0000\u0000\u00bb\u06fe\u0001"+ - "\u0000\u0000\u0000\u00bd\u0702\u0001\u0000\u0000\u0000\u00bf\u0707\u0001"+ - "\u0000\u0000\u0000\u00c1\u070c\u0001\u0000\u0000\u0000\u00c3\u0710\u0001"+ - "\u0000\u0000\u0000\u00c5\u0715\u0001\u0000\u0000\u0000\u00c7\u071c\u0001"+ - "\u0000\u0000\u0000\u00c9\u0721\u0001\u0000\u0000\u0000\u00cb\u0725\u0001"+ - "\u0000\u0000\u0000\u00cd\u00ce\u0007\u0000\u0000\u0000\u00ce\u00cf\u0007"+ - "\u0001\u0000\u0000\u00cf\u00d0\u0007\u0002\u0000\u0000\u00d0\u00d5\u0001"+ - "\u0000\u0000\u0000\u00d1\u00d2\u0007\u0003\u0000\u0000\u00d2\u00d3\u0007"+ - "\u0004\u0000\u0000\u00d3\u00d4\u0007\u0005\u0000\u0000\u00d4\u00d6\u0007"+ - "\u0006\u0000\u0000\u00d5\u00d1\u0001\u0000\u0000\u0000\u00d5\u00d6\u0001"+ - "\u0000\u0000\u0000\u00d6\u0132\u0001\u0000\u0000\u0000\u00d7\u00d8\u0007"+ - "\u0007\u0000\u0000\u00d8\u0132\u0007\u0000\u0000\u0000\u00d9\u00da\u0007"+ - "\b\u0000\u0000\u00da\u00db\u0007\u0006\u0000\u0000\u00db\u00dc\u0007\u0007"+ - "\u0000\u0000\u00dc\u00dd\u0007\t\u0000\u0000\u00dd\u0132\u0007\u0003\u0000"+ - "\u0000\u00de\u00df\u0007\n\u0000\u0000\u00df\u00e0\u0007\u0003\u0000\u0000"+ - "\u00e0\u00e1\u0007\u0005\u0000\u0000\u00e1\u00e2\u0007\u000b\u0000\u0000"+ - "\u00e2\u00e3\u0007\u0007\u0000\u0000\u00e3\u00e4\u0007\u0001\u0000\u0000"+ - "\u00e4\u0132\u0007\f\u0000\u0000\u00e5\u00e6\u0007\n\u0000\u0000\u00e6"+ - "\u00e7\u0007\u0003\u0000\u0000\u00e7\u00e8\u0007\n\u0000\u0000\u00e8\u00e9"+ - "\u0007\n\u0000\u0000\u00e9\u00ea\u0007\u0007\u0000\u0000\u00ea\u00eb\u0007"+ - "\u0001\u0000\u0000\u00eb\u0132\u0007\f\u0000\u0000\u00ec\u00ed\u0007\u0001"+ - "\u0000\u0000\u00ed\u00ee\u0007\f\u0000\u0000\u00ee\u00ef\u0007\u0005\u0000"+ - "\u0000\u00ef\u0132\u0007\u0003\u0000\u0000\u00f0\u00f1\u0007\r\u0000\u0000"+ - "\u00f1\u00f2\u0007\u000e\u0000\u0000\u00f2\u00f3\u0007\n\u0000\u0000\u00f3"+ - "\u0132\u0007\u0006\u0000\u0000\u00f4\u00f5\u0007\r\u0000\u0000\u00f5\u00f6"+ - "\u0007\u000e\u0000\u0000\u00f6\u00f7\u0007\n\u0000\u0000\u00f7\u00f8\u0007"+ - "\u0006\u0000\u0000\u00f8\u00f9\u0007\u0001\u0000\u0000\u00f9\u00fa\u0007"+ - "\f\u0000\u0000\u00fa\u00fb\u0007\u0005\u0000\u0000\u00fb\u0132\u0007\u0003"+ - "\u0000\u0000\u00fc\u00fd\u0007\n\u0000\u0000\u00fd\u00fe\u0007\b\u0000"+ - "\u0000\u00fe\u00ff\u0007\u0007\u0000\u0000\u00ff\u0100\u0007\u000b\u0000"+ - "\u0000\u0100\u0101\u0007\u0005\u0000\u0000\u0101\u0132\u0007\u0006\u0000"+ - "\u0000\u0102\u0103\u0007\u000e\u0000\u0000\u0103\u0104\u0007\f\u0000\u0000"+ - "\u0104\u0105\u0007\t\u0000\u0000\u0105\u0106\u0007\u0003\u0000\u0000\u0106"+ - "\u0107\u0007\n\u0000\u0000\u0107\u0132\u0007\n\u0000\u0000\u0108\u0109"+ - "\u0007\u0005\u0000\u0000\u0109\u010a\u0007\u0004\u0000\u0000\u010a\u010b"+ - "\u0007\f\u0000\u0000\u010b\u0112\u0001\u0000\u0000\u0000\u010c\u010d\u0007"+ - "\u0004\u0000\u0000\u010d\u010e\u0007\f\u0000\u0000\u010e\u0113\u0007\u000f"+ - "\u0000\u0000\u010f\u0110\u0007\f\u0000\u0000\u0110\u0111\u0007\u0001\u0000"+ - "\u0000\u0111\u0113\u0007\u000b\u0000\u0000\u0112\u010c\u0001\u0000\u0000"+ - "\u0000\u0112\u010f\u0001\u0000\u0000\u0000\u0112\u0113\u0001\u0000\u0000"+ - "\u0000\u0113\u0132\u0001\u0000\u0000\u0000\u0114\u0115\u0007\u0004\u0000"+ - "\u0000\u0115\u0116\u0007\u000e\u0000\u0000\u0116\u0117\u0007\u000b\u0000"+ - "\u0000\u0117\u0132\u0007\u0006\u0000\u0000\u0118\u0119\u0007\u0010\u0000"+ - "\u0000\u0119\u011a\u0007\u000e\u0000\u0000\u011a\u011b\u0007\u0003\u0000"+ - "\u0000\u011b\u011c\u0007\n\u0000\u0000\u011c\u0132\u0007\u000b\u0000\u0000"+ - "\u011d\u011e\u0007\u0003\u0000\u0000\u011e\u011f\u0007\u0002\u0000\u0000"+ - "\u011f\u0120\u0007\u0002\u0000\u0000\u0120\u0121\u0007\u0001\u0000\u0000"+ - "\u0121\u0132\u0007\u0002\u0000\u0000\u0122\u0123\u0007\r\u0000\u0000\u0123"+ - "\u0124\u0007\u0002\u0000\u0000\u0124\u0125\u0007\u0001\u0000\u0000\u0125"+ - "\u0126\u0007\u0011\u0000\u0000\u0126\u0127\u0007\u000e\u0000\u0000\u0127"+ - "\u0128\u0007\u0005\u0000\u0000\u0128\u0129\u0007\u000b\u0000\u0000\u0129"+ - "\u012a\u0007\u0007\u0000\u0000\u012a\u012b\u0007\u0001\u0000\u0000\u012b"+ - "\u0132\u0007\f\u0000\u0000\u012c\u012d\u0007\u0003\u0000\u0000\u012d\u012e"+ - "\u0007\u0012\u0000\u0000\u012e\u012f\u0007\r\u0000\u0000\u012f\u0130\u0007"+ - "\u000b\u0000\u0000\u0130\u0132\u0007\u000f\u0000\u0000\u0131\u00cd\u0001"+ - "\u0000\u0000\u0000\u0131\u00d7\u0001\u0000\u0000\u0000\u0131\u00d9\u0001"+ - "\u0000\u0000\u0000\u0131\u00de\u0001\u0000\u0000\u0000\u0131\u00e5\u0001"+ - "\u0000\u0000\u0000\u0131\u00ec\u0001\u0000\u0000\u0000\u0131\u00f0\u0001"+ - "\u0000\u0000\u0000\u0131\u00f4\u0001\u0000\u0000\u0000\u0131\u00fc\u0001"+ - "\u0000\u0000\u0000\u0131\u0102\u0001\u0000\u0000\u0000\u0131\u0108\u0001"+ - "\u0000\u0000\u0000\u0131\u0114\u0001\u0000\u0000\u0000\u0131\u0118\u0001"+ - "\u0000\u0000\u0000\u0131\u011d\u0001\u0000\u0000\u0000\u0131\u0122\u0001"+ - "\u0000\u0000\u0000\u0131\u012c\u0001\u0000\u0000\u0000\u0132\f\u0001\u0000"+ - "\u0000\u0000\u0133\u0134\u0005@\u0000\u0000\u0134\u0135\u0007\u0007\u0000"+ - "\u0000\u0135\u0136\u0007\f\u0000\u0000\u0136\u0137\u0007\u0005\u0000\u0000"+ - "\u0137\u0138\u0007\t\u0000\u0000\u0138\u0139\u0007\u000e\u0000\u0000\u0139"+ - "\u013a\u0007\u0011\u0000\u0000\u013a\u013b\u0007\u0003\u0000\u0000\u013b"+ - "\u014d\u0001\u0000\u0000\u0000\u013c\u013d\u0007\u0007\u0000\u0000\u013d"+ - "\u014e\u0007\u0000\u0000\u0000\u013e\u013f\u0007\b\u0000\u0000\u013f\u0140"+ - "\u0007\u0006\u0000\u0000\u0140\u0141\u0007\u0003\u0000\u0000\u0141\u014e"+ - "\u0007\f\u0000\u0000\u0142\u0143\u0007\u0000\u0000\u0000\u0143\u0144\u0007"+ - "\u0007\u0000\u0000\u0144\u0145\u0007\u0002\u0000\u0000\u0145\u0146\u0007"+ - "\n\u0000\u0000\u0146\u014e\u0007\u000b\u0000\u0000\u0147\u0148\u0007\u000e"+ - "\u0000\u0000\u0148\u0149\u0007\f\u0000\u0000\u0149\u014a\u0007\t\u0000"+ - "\u0000\u014a\u014b\u0007\u0003\u0000\u0000\u014b\u014c\u0007\n\u0000\u0000"+ - "\u014c\u014e\u0007\n\u0000\u0000\u014d\u013c\u0001\u0000\u0000\u0000\u014d"+ - "\u013e\u0001\u0000\u0000\u0000\u014d\u0142\u0001\u0000\u0000\u0000\u014d"+ - "\u0147\u0001\u0000\u0000\u0000\u014d\u014e\u0001\u0000\u0000\u0000\u014e"+ - "\u000e\u0001\u0000\u0000\u0000\u014f\u0153\u0007\u0013\u0000\u0000\u0150"+ - "\u0152\u0007\u0014\u0000\u0000\u0151\u0150\u0001\u0000\u0000\u0000\u0152"+ - "\u0155\u0001\u0000\u0000\u0000\u0153\u0151\u0001\u0000\u0000\u0000\u0153"+ - "\u0154\u0001\u0000\u0000\u0000\u0154\u0010\u0001\u0000\u0000\u0000\u0155"+ - "\u0153\u0001\u0000\u0000\u0000\u0156\u0157\u0005\u00b0\u0000\u0000\u0157"+ - "\u0012\u0001\u0000\u0000\u0000\u0158\u0159\u0005<\u0000\u0000\u0159\u015a"+ - "\u0005?\u0000\u0000\u015a\u015b\u0005=\u0000\u0000\u015b\u015f\u0001\u0000"+ - "\u0000\u0000\u015c\u015e\t\u0000\u0000\u0000\u015d\u015c\u0001\u0000\u0000"+ - "\u0000\u015e\u0161\u0001\u0000\u0000\u0000\u015f\u0160\u0001\u0000\u0000"+ - "\u0000\u015f\u015d\u0001\u0000\u0000\u0000\u0160\u0162\u0001\u0000\u0000"+ - "\u0000\u0161\u015f\u0001\u0000\u0000\u0000\u0162\u0163\u0005?\u0000\u0000"+ - "\u0163\u0176\u0005>\u0000\u0000\u0164\u0165\u0005<\u0000\u0000\u0165\u0166"+ - "\u0005?\u0000\u0000\u0166\u0167\u0007\r\u0000\u0000\u0167\u0168\u0007"+ - "\u0006\u0000\u0000\u0168\u0169\u0007\r\u0000\u0000\u0169\u016d\u0001\u0000"+ - "\u0000\u0000\u016a\u016c\t\u0000\u0000\u0000\u016b\u016a\u0001\u0000\u0000"+ - "\u0000\u016c\u016f\u0001\u0000\u0000\u0000\u016d\u016e\u0001\u0000\u0000"+ - "\u0000\u016d\u016b\u0001\u0000\u0000\u0000\u016e\u0173\u0001\u0000\u0000"+ - "\u0000\u016f\u016d\u0001\u0000\u0000\u0000\u0170\u0171\u0005?\u0000\u0000"+ - "\u0171\u0174\u0005>\u0000\u0000\u0172\u0174\u0005\u0000\u0000\u0001\u0173"+ - "\u0170\u0001\u0000\u0000\u0000\u0173\u0172\u0001\u0000\u0000\u0000\u0174"+ - "\u0176\u0001\u0000\u0000\u0000\u0175\u0158\u0001\u0000\u0000\u0000\u0175"+ - "\u0164\u0001\u0000\u0000\u0000\u0176\u0014\u0001\u0000\u0000\u0000\u0177"+ - "\u0178\u0005@\u0000\u0000\u0178\u0194\u0003\u000b\u0000\u0000\u0179\u017a"+ - "\u0005@\u0000\u0000\u017a\u017b\u0007\n\u0000\u0000\u017b\u017c\u0007"+ - "\u0003\u0000\u0000\u017c\u017d\u0007\u0005\u0000\u0000\u017d\u017e\u0007"+ - "\u000b\u0000\u0000\u017e\u017f\u0007\u0007\u0000\u0000\u017f\u0180\u0007"+ - "\u0001\u0000\u0000\u0180\u0181\u0007\f\u0000\u0000\u0181\u0182\u0007\u0012"+ - "\u0000\u0000\u0182\u0183\u0007\u0007\u0000\u0000\u0183\u0184\u0007\n\u0000"+ - "\u0000\u0184\u0185\u0007\n\u0000\u0000\u0185\u0186\u0007\u0007\u0000\u0000"+ - "\u0186\u0187\u0007\f\u0000\u0000\u0187\u0194\u0007\u0010\u0000\u0000\u0188"+ - "\u0189\u0005@\u0000\u0000\u0189\u018a\u0007\u0006\u0000\u0000\u018a\u018b"+ - "\u0007\u0004\u0000\u0000\u018b\u018c\u0007\n\u0000\u0000\u018c\u018d\u0007"+ - "\n\u0000\u0000\u018d\u018e\u0007\u0003\u0000\u0000\u018e\u018f\u0007\u0005"+ - "\u0000\u0000\u018f\u0190\u0007\u000b\u0000\u0000\u0190\u0191\u0007\u0007"+ - "\u0000\u0000\u0191\u0192\u0007\u0001\u0000\u0000\u0192\u0194\u0007\f\u0000"+ - "\u0000\u0193\u0177\u0001\u0000\u0000\u0000\u0193\u0179\u0001\u0000\u0000"+ - "\u0000\u0193\u0188\u0001\u0000\u0000\u0000\u0194\u0198\u0001\u0000\u0000"+ - "\u0000\u0195\u0197\u0005 \u0000\u0000\u0196\u0195\u0001\u0000\u0000\u0000"+ - "\u0197\u019a\u0001\u0000\u0000\u0000\u0198\u0196\u0001\u0000\u0000\u0000"+ - "\u0198\u0199\u0001\u0000\u0000\u0000\u0199\u019b\u0001\u0000\u0000\u0000"+ - "\u019a\u0198\u0001\u0000\u0000\u0000\u019b\u019c\u0004\u0005\u0000\u0000"+ - "\u019c\u019d\u0001\u0000\u0000\u0000\u019d\u019e\u0006\u0005\u0000\u0000"+ - "\u019e\u019f\u0006\u0005\u0001\u0000\u019f\u0016\u0001\u0000\u0000\u0000"+ - "\u01a0\u01a1\u0005@\u0000\u0000\u01a1\u01a2\u0007\u0003\u0000\u0000\u01a2"+ - "\u01a3\u0007\t\u0000\u0000\u01a3\u01a4\u0007\n\u0000\u0000\u01a4\u01a5"+ - "\u0007\u0003\u0000\u0000\u01a5\u01a6\u0007\u0007\u0000\u0000\u01a6\u020e"+ - "\u0007\u0000\u0000\u0000\u01a7\u020e\u0003\r\u0001\u0000\u01a8\u01a9\u0005"+ - "@\u0000\u0000\u01a9\u01aa\u0007\u0003\u0000\u0000\u01aa\u01ab\u0007\u0015"+ - "\u0000\u0000\u01ab\u01ac\u0007\u000b\u0000\u0000\u01ac\u01ad\u0007\u0003"+ - "\u0000\u0000\u01ad\u01ae\u0007\f\u0000\u0000\u01ae\u01af\u0007\u0011\u0000"+ - "\u0000\u01af\u020e\u0007\n\u0000\u0000\u01b0\u01b1\u0005@\u0000\u0000"+ - "\u01b1\u01b2\u0007\u0003\u0000\u0000\u01b2\u01b3\u0007\u0004\u0000\u0000"+ - "\u01b3\u01b4\u0007\u0005\u0000\u0000\u01b4\u020e\u0007\u0006\u0000\u0000"+ - "\u01b5\u01b6\u0005@\u0000\u0000\u01b6\u01b7\u0007\u000f\u0000\u0000\u01b7"+ - "\u01b8\u0007\u0007\u0000\u0000\u01b8\u01b9\u0007\u0003\u0000\u0000\u01b9"+ - "\u01ba\u0007\t\u0000\u0000\u01ba\u020e\u0007\u0011\u0000\u0000\u01bb\u01bc"+ - "\u0005@\u0000\u0000\u01bc\u01bd\u0007\r\u0000\u0000\u01bd\u01be\u0007"+ - "\u0002\u0000\u0000\u01be\u01bf\u0007\u0001\u0000\u0000\u01bf\u01c0\u0007"+ - "\r\u0000\u0000\u01c0\u020e\u0007\n\u0000\u0000\u01c1\u01c2\u0005@\u0000"+ - "\u0000\u01c2\u01c3\u0007\u0012\u0000\u0000\u01c3\u01c4\u0007\u0003\u0000"+ - "\u0000\u01c4\u01c5\u0007\u000b\u0000\u0000\u01c5\u01c6\u0007\u0006\u0000"+ - "\u0000\u01c6\u01c7\u0007\u0001\u0000\u0000\u01c7\u020e\u0007\u0011\u0000"+ - "\u0000\u01c8\u01c9\u0005@\u0000\u0000\u01c9\u01ca\u0007\u0005\u0000\u0000"+ - "\u01ca\u01cb\u0007\t\u0000\u0000\u01cb\u01cc\u0007\u0004\u0000\u0000\u01cc"+ - "\u01cd\u0007\n\u0000\u0000\u01cd\u020e\u0007\n\u0000\u0000\u01ce\u01cf"+ - "\u0005@\u0000\u0000\u01cf\u01d0\u0007\n\u0000\u0000\u01d0\u01d1\u0007"+ - "\u000b\u0000\u0000\u01d1\u01d2\u0007\u000f\u0000\u0000\u01d2\u01d3\u0007"+ - "\t\u0000\u0000\u01d3\u020e\u0007\u0003\u0000\u0000\u01d4\u01d5\u0005@"+ - "\u0000\u0000\u01d5\u01d6\u0007\u0004\u0000\u0000\u01d6\u01d7\u0007\b\u0000"+ - "\u0000\u01d7\u01d8\u0007\u0004\u0000\u0000\u01d8\u01d9\u0007\u0002\u0000"+ - "\u0000\u01d9\u020e\u0007\u0003\u0000\u0000\u01da\u01db\u0005@\u0000\u0000"+ - "\u01db\u01dc\u0007\u0016\u0000\u0000\u01dc\u01dd\u0007\u0002\u0000\u0000"+ - "\u01dd\u01de\u0007\u0003\u0000\u0000\u01de\u01df\u0007\u0004\u0000\u0000"+ - "\u01df\u020e\u0007\u0017\u0000\u0000\u01e0\u01e1\u0005@\u0000\u0000\u01e1"+ - "\u01e2\u0007\u0005\u0000\u0000\u01e2\u01e3\u0007\u0001\u0000\u0000\u01e3"+ - "\u01e4\u0007\f\u0000\u0000\u01e4\u01e5\u0007\u000b\u0000\u0000\u01e5\u01e6"+ - "\u0007\u0007\u0000\u0000\u01e6\u01e7\u0007\f\u0000\u0000\u01e7\u01e8\u0007"+ - "\u000e\u0000\u0000\u01e8\u020e\u0007\u0003\u0000\u0000\u01e9\u01ea\u0005"+ - "@\u0000\u0000\u01ea\u01eb\u0007\n\u0000\u0000\u01eb\u01ec\u0007\u0003"+ - "\u0000\u0000\u01ec\u01ed\u0007\t\u0000\u0000\u01ed\u01ee\u0007\u0003\u0000"+ - "\u0000\u01ee\u01ef\u0007\u0005\u0000\u0000\u01ef\u01f0\u0007\u000b\u0000"+ - "\u0000\u01f0\u01f1\u0007\u0003\u0000\u0000\u01f1\u020e\u0007\u0011\u0000"+ - "\u0000\u01f2\u01f3\u0005@\u0000\u0000\u01f3\u01f4\u0007\u0011\u0000\u0000"+ - "\u01f4\u01f5\u0007\u0007\u0000\u0000\u01f5\u01f6\u0007\n\u0000\u0000\u01f6"+ - "\u01f7\u0007\u0004\u0000\u0000\u01f7\u01f8\u0007\u0016\u0000\u0000\u01f8"+ - "\u01f9\u0007\t\u0000\u0000\u01f9\u01fa\u0007\u0003\u0000\u0000\u01fa\u020e"+ - "\u0007\u0011\u0000\u0000\u01fb\u01fc\u0005@\u0000\u0000\u01fc\u01fd\u0007"+ - "\u0002\u0000\u0000\u01fd\u01fe\u0007\u0003\u0000\u0000\u01fe\u01ff\u0007"+ - "\u0004\u0000\u0000\u01ff\u0200\u0007\u0011\u0000\u0000\u0200\u0201\u0007"+ - "\u0001\u0000\u0000\u0201\u0202\u0007\f\u0000\u0000\u0202\u0203\u0007\t"+ - "\u0000\u0000\u0203\u020e\u0007\u000f\u0000\u0000\u0204\u0205\u0005@\u0000"+ - "\u0000\u0205\u0206\u0007\u0002\u0000\u0000\u0206\u0207\u0007\u0003\u0000"+ - "\u0000\u0207\u0208\u0007\u0018\u0000\u0000\u0208\u0209\u0007\u000e\u0000"+ - "\u0000\u0209\u020a\u0007\u0007\u0000\u0000\u020a\u020b\u0007\u0002\u0000"+ - "\u0000\u020b\u020c\u0007\u0003\u0000\u0000\u020c\u020e\u0007\u0011\u0000"+ - "\u0000\u020d\u01a0\u0001\u0000\u0000\u0000\u020d\u01a7\u0001\u0000\u0000"+ - "\u0000\u020d\u01a8\u0001\u0000\u0000\u0000\u020d\u01b0\u0001\u0000\u0000"+ - "\u0000\u020d\u01b5\u0001\u0000\u0000\u0000\u020d\u01bb\u0001\u0000\u0000"+ - "\u0000\u020d\u01c1\u0001\u0000\u0000\u0000\u020d\u01c8\u0001\u0000\u0000"+ - "\u0000\u020d\u01ce\u0001\u0000\u0000\u0000\u020d\u01d4\u0001\u0000\u0000"+ - "\u0000\u020d\u01da\u0001\u0000\u0000\u0000\u020d\u01e0\u0001\u0000\u0000"+ - "\u0000\u020d\u01e9\u0001\u0000\u0000\u0000\u020d\u01f2\u0001\u0000\u0000"+ - "\u0000\u020d\u01fb\u0001\u0000\u0000\u0000\u020d\u0204\u0001\u0000\u0000"+ - "\u0000\u020e\u0212\u0001\u0000\u0000\u0000\u020f\u0211\u0005 \u0000\u0000"+ - "\u0210\u020f\u0001\u0000\u0000\u0000\u0211\u0214\u0001\u0000\u0000\u0000"+ - "\u0212\u0210\u0001\u0000\u0000\u0000\u0212\u0213\u0001\u0000\u0000\u0000"+ - "\u0213\u0215\u0001\u0000\u0000\u0000\u0214\u0212\u0001\u0000\u0000\u0000"+ - "\u0215\u0216\u0004\u0006\u0001\u0000\u0216\u0217\u0001\u0000\u0000\u0000"+ - "\u0217\u0218\u0006\u0006\u0000\u0000\u0218\u0219\u0006\u0006\u0001\u0000"+ - "\u0219\u0018\u0001\u0000\u0000\u0000\u021a\u021b\u0005@\u0000\u0000\u021b"+ - "\u021c\u0007\u0016\u0000\u0000\u021c\u021d\u0007\u0002\u0000\u0000\u021d"+ - "\u021e\u0007\u0003\u0000\u0000\u021e\u021f\u0007\u0004\u0000\u0000\u021f"+ - "\u022a\u0007\u0017\u0000\u0000\u0220\u0221\u0005@\u0000\u0000\u0221\u0222"+ - "\u0007\u0005\u0000\u0000\u0222\u0223\u0007\u0001\u0000\u0000\u0223\u0224"+ - "\u0007\f\u0000\u0000\u0224\u0225\u0007\u000b\u0000\u0000\u0225\u0226\u0007"+ - "\u0007\u0000\u0000\u0226\u0227\u0007\f\u0000\u0000\u0227\u0228\u0007\u000e"+ - "\u0000\u0000\u0228\u022a\u0007\u0003\u0000\u0000\u0229\u021a\u0001\u0000"+ - "\u0000\u0000\u0229\u0220\u0001\u0000\u0000\u0000\u022a\u022b\u0001\u0000"+ - "\u0000\u0000\u022b\u022c\u0006\u0007\u0001\u0000\u022c\u001a\u0001\u0000"+ - "\u0000\u0000\u022d\u022e\u0005@\u0000\u0000\u022e\u022f\u0007\n\u0000"+ - "\u0000\u022f\u0230\u0007\u000b\u0000\u0000\u0230\u0231\u0007\u0001\u0000"+ - "\u0000\u0231\u0259\u0007\r\u0000\u0000\u0232\u0233\u0005@\u0000\u0000"+ - "\u0233\u0234\u0007\n\u0000\u0000\u0234\u0235\u0007\u0006\u0000\u0000\u0235"+ - "\u0236\u0007\u0001\u0000\u0000\u0236\u0259\u0007\b\u0000\u0000\u0237\u0238"+ - "\u0005@\u0000\u0000\u0238\u0239\u0007\u0001\u0000\u0000\u0239\u023a\u0007"+ - "\u0019\u0000\u0000\u023a\u023b\u0007\u0003\u0000\u0000\u023b\u023c\u0007"+ - "\u0002\u0000\u0000\u023c\u023d\u0007\b\u0000\u0000\u023d\u023e\u0007\u0002"+ - "\u0000\u0000\u023e\u023f\u0007\u0007\u0000\u0000\u023f\u0240\u0007\u000b"+ - "\u0000\u0000\u0240\u0259\u0007\u0003\u0000\u0000\u0241\u0242\u0005@\u0000"+ - "\u0000\u0242\u0243\u0007\u0019\u0000\u0000\u0243\u0244\u0007\u0007\u0000"+ - "\u0000\u0244\u0245\u0007\u000b\u0000\u0000\u0245\u0246\u0007\u0003\u0000"+ - "\u0000\u0246\u0247\u0007\u0002\u0000\u0000\u0247\u0248\u0007\u0003\u0000"+ - "\u0000\u0248\u0249\u0007\u0004\u0000\u0000\u0249\u024a\u0007\u0005\u0000"+ - "\u0000\u024a\u024b\u0007\u000b\u0000\u0000\u024b\u024c\u0007\u0002\u0000"+ - "\u0000\u024c\u024d\u0007\u0003\u0000\u0000\u024d\u024e\u0007\u0000\u0000"+ - "\u0000\u024e\u024f\u0007\u0002\u0000\u0000\u024f\u0250\u0007\u0003\u0000"+ - "\u0000\u0250\u0251\u0007\n\u0000\u0000\u0251\u0259\u0007\u0006\u0000\u0000"+ - "\u0252\u0253\u0005@\u0000\u0000\u0253\u0254\u0007\u0003\u0000\u0000\u0254"+ - "\u0255\u0007\f\u0000\u0000\u0255\u0256\u0007\u0011\u0000\u0000\u0256\u0257"+ - "\u0001\u0000\u0000\u0000\u0257\u0259\u0003\u000b\u0000\u0000\u0258\u022d"+ - "\u0001\u0000\u0000\u0000\u0258\u0232\u0001\u0000\u0000\u0000\u0258\u0237"+ - "\u0001\u0000\u0000\u0000\u0258\u0241\u0001\u0000\u0000\u0000\u0258\u0252"+ - "\u0001\u0000\u0000\u0000\u0259\u025a\u0001\u0000\u0000\u0000\u025a\u025b"+ - "\u0006\b\u0001\u0000\u025b\u001c\u0001\u0000\u0000\u0000\u025c\u025d\u0005"+ - "@\u0000\u0000\u025d\u025e\u0007\u0019\u0000\u0000\u025e\u025f\u0007\u0003"+ - "\u0000\u0000\u025f\u0260\u0007\u0002\u0000\u0000\u0260\u0261\u0007\u0016"+ - "\u0000\u0000\u0261\u0262\u0007\u0004\u0000\u0000\u0262\u0263\u0007\u000b"+ - "\u0000\u0000\u0263\u0264\u0007\u0007\u0000\u0000\u0264\u0265\u0007\u0012"+ - "\u0000\u0000\u0265\u0266\u0001\u0000\u0000\u0000\u0266\u0267\u0006\t\u0002"+ - "\u0000\u0267\u0268\u0006\t\u0001\u0000\u0268\u001e\u0001\u0000\u0000\u0000"+ - "\u0269\u026a\u0005@\u0000\u0000\u026a\u026b\u0007\u0003\u0000\u0000\u026b"+ - "\u026c\u0007\f\u0000\u0000\u026c\u026d\u0007\u0011\u0000\u0000\u026d\u026e"+ - "\u0007\u0019\u0000\u0000\u026e\u026f\u0007\u0003\u0000\u0000\u026f\u0270"+ - "\u0007\u0002\u0000\u0000\u0270\u0271\u0007\u0016\u0000\u0000\u0271\u0272"+ - "\u0007\u0004\u0000\u0000\u0272\u0273\u0007\u000b\u0000\u0000\u0273\u0274"+ - "\u0007\u0007\u0000\u0000\u0274\u0275\u0007\u0012\u0000\u0000\u0275\u0276"+ - "\u0001\u0000\u0000\u0000\u0276\u0277\u0006\n\u0001\u0000\u0277 \u0001"+ - "\u0000\u0000\u0000\u0278\u0279\u0005@\u0000\u0000\u0279\u027a\u0007\u0011"+ - "\u0000\u0000\u027a\u0290\u0007\u0011\u0000\u0000\u027b\u027c\u0005@\u0000"+ - "\u0000\u027c\u027d\u0007\u0011\u0000\u0000\u027d\u027e\u0007\u000e\u0000"+ - "\u0000\u027e\u027f\u0007\u0012\u0000\u0000\u027f\u0290\u0007\r\u0000\u0000"+ - "\u0280\u0281\u0005@\u0000\u0000\u0281\u0282\u0007\u001a\u0000\u0000\u0282"+ - "\u0290\u0007\n\u0000\u0000\u0283\u0284\u0005@\u0000\u0000\u0284\u0285"+ - "\u0007\u001a\u0000\u0000\u0285\u0286\u0007\n\u0000\u0000\u0286\u0287\u0007"+ - "\u0001\u0000\u0000\u0287\u0290\u0007\f\u0000\u0000\u0288\u0289\u0005@"+ - "\u0000\u0000\u0289\u028a\u0007\u0007\u0000\u0000\u028a\u028b\u0007\f\u0000"+ - "\u0000\u028b\u028c\u0007\u001a\u0000\u0000\u028c\u028d\u0007\u0003\u0000"+ - "\u0000\u028d\u028e\u0007\u0005\u0000\u0000\u028e\u0290\u0007\u000b\u0000"+ - "\u0000\u028f\u0278\u0001\u0000\u0000\u0000\u028f\u027b\u0001\u0000\u0000"+ - "\u0000\u028f\u0280\u0001\u0000\u0000\u0000\u028f\u0283\u0001\u0000\u0000"+ - "\u0000\u028f\u0288\u0001\u0000\u0000\u0000\u0290\u0294\u0001\u0000\u0000"+ - "\u0000\u0291\u0293\u0005 \u0000\u0000\u0292\u0291\u0001\u0000\u0000\u0000"+ - "\u0293\u0296\u0001\u0000\u0000\u0000\u0294\u0292\u0001\u0000\u0000\u0000"+ - "\u0294\u0295\u0001\u0000\u0000\u0000\u0295\u0297\u0001\u0000\u0000\u0000"+ - "\u0296\u0294\u0001\u0000\u0000\u0000\u0297\u0298\u0004\u000b\u0002\u0000"+ - "\u0298\u0299\u0001\u0000\u0000\u0000\u0299\u029a\u0006\u000b\u0000\u0000"+ - "\u029a\u029b\u0006\u000b\u0001\u0000\u029b\"\u0001\u0000\u0000\u0000\u029c"+ - "\u029d\u0005@\u0000\u0000\u029d\u029e\u0007\u0003\u0000\u0000\u029e\u029f"+ - "\u0007\t\u0000\u0000\u029f\u02a0\u0007\n\u0000\u0000\u02a0\u02bd\u0007"+ - "\u0003\u0000\u0000\u02a1\u02a2\u0005@\u0000\u0000\u02a2\u02a3\u0007\u0005"+ - "\u0000\u0000\u02a3\u02a4\u0007\n\u0000\u0000\u02a4\u02a5\u0007\u0002\u0000"+ - "\u0000\u02a5\u02bd\u0007\u0000\u0000\u0000\u02a6\u02a7\u0005@\u0000\u0000"+ - "\u02a7\u02a8\u0007\u0011\u0000\u0000\u02a8\u02a9\u0007\u0003\u0000\u0000"+ - "\u02a9\u02aa\u0007\u0000\u0000\u0000\u02aa\u02ab\u0007\u0004\u0000\u0000"+ - "\u02ab\u02ac\u0007\u000e\u0000\u0000\u02ac\u02ad\u0007\t\u0000\u0000\u02ad"+ - "\u02bd\u0007\u000b\u0000\u0000\u02ae\u02af\u0005@\u0000\u0000\u02af\u02b0"+ - "\u0007\u0004\u0000\u0000\u02b0\u02b1\u0007\r\u0000\u0000\u02b1\u02b2\u0007"+ - "\r\u0000\u0000\u02b2\u02b3\u0007\u0003\u0000\u0000\u02b3\u02b4\u0007\f"+ - "\u0000\u0000\u02b4\u02bd\u0007\u0011\u0000\u0000\u02b5\u02b6\u0005@\u0000"+ - "\u0000\u02b6\u02b7\u0007\r\u0000\u0000\u02b7\u02b8\u0007\u0004\u0000\u0000"+ - "\u02b8\u02b9\u0007\u0002\u0000\u0000\u02b9\u02ba\u0007\u0003\u0000\u0000"+ - "\u02ba\u02bb\u0007\f\u0000\u0000\u02bb\u02bd\u0007\u000b\u0000\u0000\u02bc"+ - "\u029c\u0001\u0000\u0000\u0000\u02bc\u02a1\u0001\u0000\u0000\u0000\u02bc"+ - "\u02a6\u0001\u0000\u0000\u0000\u02bc\u02ae\u0001\u0000\u0000\u0000\u02bc"+ - "\u02b5\u0001\u0000\u0000\u0000\u02bd\u02be\u0001\u0000\u0000\u0000\u02be"+ - "\u02bf\u0006\f\u0001\u0000\u02bf$\u0001\u0000\u0000\u0000\u02c0\u02c1"+ - "\u0005@\u0000\u0000\u02c1\u02c2\u0007\r\u0000\u0000\u02c2\u02c3\u0007"+ - "\u0006\u0000\u0000\u02c3\u02c4\u0007\r\u0000\u0000\u02c4\u02c6\u0001\u0000"+ - "\u0000\u0000\u02c5\u02c7\u0005 \u0000\u0000\u02c6\u02c5\u0001\u0000\u0000"+ - "\u0000\u02c6\u02c7\u0001\u0000\u0000\u0000\u02c7\u02c8\u0001\u0000\u0000"+ - "\u0000\u02c8\u02c9\u0004\r\u0003\u0000\u02c9\u02ca\u0001\u0000\u0000\u0000"+ - "\u02ca\u02cb\u0006\r\u0003\u0000\u02cb\u02cc\u0006\r\u0000\u0000\u02cc"+ - "&\u0001\u0000\u0000\u0000\u02cd\u02ce\u0005@\u0000\u0000\u02ce\u02cf\u0007"+ - "\r\u0000\u0000\u02cf\u02d0\u0007\u0006\u0000\u0000\u02d0\u02d1\u0007\r"+ - "\u0000\u0000\u02d1\u02d2\u0001\u0000\u0000\u0000\u02d2\u02d3\u0006\u000e"+ - "\u0004\u0000\u02d3(\u0001\u0000\u0000\u0000\u02d4\u02d5\u0005@\u0000\u0000"+ - "\u02d5\u02d6\u0007\u0003\u0000\u0000\u02d6\u02d7\u0007\f\u0000\u0000\u02d7"+ - "\u02d8\u0007\u0011\u0000\u0000\u02d8\u02d9\u0001\u0000\u0000\u0000\u02d9"+ - "\u02da\u0003K \u0000\u02da\u02de\u0001\u0000\u0000\u0000\u02db\u02dd\u0005"+ - " \u0000\u0000\u02dc\u02db\u0001\u0000\u0000\u0000\u02dd\u02e0\u0001\u0000"+ - "\u0000\u0000\u02de\u02dc\u0001\u0000\u0000\u0000\u02de\u02df\u0001\u0000"+ - "\u0000\u0000\u02df\u02e1\u0001\u0000\u0000\u0000\u02e0\u02de\u0001\u0000"+ - "\u0000\u0000\u02e1\u02e2\u0004\u000f\u0004\u0000\u02e2\u02e3\u0001\u0000"+ - "\u0000\u0000\u02e3\u02e4\u0006\u000f\u0000\u0000\u02e4\u02e5\u0006\u000f"+ - "\u0001\u0000\u02e5*\u0001\u0000\u0000\u0000\u02e6\u02e7\u0005@\u0000\u0000"+ - "\u02e7\u02e8\u0007\u0003\u0000\u0000\u02e8\u02e9\u0007\f\u0000\u0000\u02e9"+ - "\u02ea\u0007\u0011\u0000\u0000\u02ea\u02eb\u0001\u0000\u0000\u0000\u02eb"+ - "\u02ec\u0003K \u0000\u02ec\u02ed\u0001\u0000\u0000\u0000\u02ed\u02ee\u0006"+ - "\u0010\u0001\u0000\u02ee,\u0001\u0000\u0000\u0000\u02ef\u02f0\u0005@\u0000"+ - "\u0000\u02f0\u02f1\u0007\t\u0000\u0000\u02f1\u02f2\u0007\u0007\u0000\u0000"+ - "\u02f2\u02f3\u0007\u0019\u0000\u0000\u02f3\u02f4\u0007\u0003\u0000\u0000"+ - "\u02f4\u02f5\u0007\b\u0000\u0000\u02f5\u02f6\u0007\u0007\u0000\u0000\u02f6"+ - "\u02f7\u0007\u0002\u0000\u0000\u02f7\u02f8\u0007\u0003\u0000\u0000\u02f8"+ - "\u02f9\u0007\n\u0000\u0000\u02f9\u02fa\u0007\u000b\u0000\u0000\u02fa\u02fb"+ - "\u0007\u000f\u0000\u0000\u02fb\u02fc\u0007\t\u0000\u0000\u02fc\u02fd\u0007"+ - "\u0003\u0000\u0000\u02fd\u0333\u0007\n\u0000\u0000\u02fe\u02ff\u0005@"+ - "\u0000\u0000\u02ff\u0300\u0007\u0016\u0000\u0000\u0300\u0301\u0007\u000e"+ - "\u0000\u0000\u0301\u0302\u0007\u0017\u0000\u0000\u0302\u0303\u0007\n\u0000"+ - "\u0000\u0303\u0304\u0007\u000b\u0000\u0000\u0304\u0305\u0007\u000f\u0000"+ - "\u0000\u0305\u0306\u0007\t\u0000\u0000\u0306\u0307\u0007\u0003\u0000\u0000"+ - "\u0307\u0333\u0007\n\u0000\u0000\u0308\u0309\u0005@\u0000\u0000\u0309"+ - "\u030a\u0007\t\u0000\u0000\u030a\u030b\u0007\u0007\u0000\u0000\u030b\u030c"+ - "\u0007\u0019\u0000\u0000\u030c\u030d\u0007\u0003\u0000\u0000\u030d\u030e"+ - "\u0007\b\u0000\u0000\u030e\u030f\u0007\u0007\u0000\u0000\u030f\u0310\u0007"+ - "\u0002\u0000\u0000\u0310\u0311\u0007\u0003\u0000\u0000\u0311\u0312\u0007"+ - "\n\u0000\u0000\u0312\u0313\u0007\u0005\u0000\u0000\u0313\u0314\u0007\u0002"+ - "\u0000\u0000\u0314\u0315\u0007\u0007\u0000\u0000\u0315\u0316\u0007\r\u0000"+ - "\u0000\u0316\u0317\u0007\u000b\u0000\u0000\u0317\u0333\u0007\n\u0000\u0000"+ - "\u0318\u0319\u0005@\u0000\u0000\u0319\u031a\u0007\u0016\u0000\u0000\u031a"+ - "\u031b\u0007\u000e\u0000\u0000\u031b\u031c\u0007\u0017\u0000\u0000\u031c"+ - "\u031d\u0007\n\u0000\u0000\u031d\u031e\u0007\u0005\u0000\u0000\u031e\u031f"+ - "\u0007\u0002\u0000\u0000\u031f\u0320\u0007\u0007\u0000\u0000\u0320\u0321"+ - "\u0007\r\u0000\u0000\u0321\u0322\u0007\u000b\u0000\u0000\u0322\u0333\u0007"+ - "\n\u0000\u0000\u0323\u0324\u0005@\u0000\u0000\u0324\u0325\u0007\u0005"+ - "\u0000\u0000\u0325\u0326\u0007\t\u0000\u0000\u0326\u0327\u0007\u0007\u0000"+ - "\u0000\u0327\u0328\u0007\u0005\u0000\u0000\u0328\u0329\u0007\u0017\u0000"+ - "\u0000\u0329\u032f\u0001\u0000\u0000\u0000\u032a\u032b\u0005.\u0000\u0000"+ - "\u032b\u032c\u0007\u0004\u0000\u0000\u032c\u032d\u0007\b\u0000\u0000\u032d"+ - "\u032e\u0007\u0004\u0000\u0000\u032e\u0330\u0007\u000f\u0000\u0000\u032f"+ - "\u032a\u0001\u0000\u0000\u0000\u032f\u0330\u0001\u0000\u0000\u0000\u0330"+ - "\u0331\u0001\u0000\u0000\u0000\u0331\u0333\u0005=\u0000\u0000\u0332\u02ef"+ - "\u0001\u0000\u0000\u0000\u0332\u02fe\u0001\u0000\u0000\u0000\u0332\u0308"+ - "\u0001\u0000\u0000\u0000\u0332\u0318\u0001\u0000\u0000\u0000\u0332\u0323"+ - "\u0001\u0000\u0000\u0000\u0333\u0334\u0001\u0000\u0000\u0000\u0334\u0335"+ - "\u0006\u0011\u0001\u0000\u0335.\u0001\u0000\u0000\u0000\u0336\u0337\u0005"+ - "@\u0000\u0000\u0337\u0338\u0007\u0019\u0000\u0000\u0338\u0339\u0007\u0007"+ - "\u0000\u0000\u0339\u033a\u0007\u000b\u0000\u0000\u033a\u033b\u0007\u0003"+ - "\u0000\u0000\u033b\u033f\u0001\u0000\u0000\u0000\u033c\u033e\u0005 \u0000"+ - "\u0000\u033d\u033c\u0001\u0000\u0000\u0000\u033e\u0341\u0001\u0000\u0000"+ - "\u0000\u033f\u033d\u0001\u0000\u0000\u0000\u033f\u0340\u0001\u0000\u0000"+ - "\u0000\u0340\u0342\u0001\u0000\u0000\u0000\u0341\u033f\u0001\u0000\u0000"+ - "\u0000\u0342\u0343\u0004\u0012\u0005\u0000\u0343\u0344\u0001\u0000\u0000"+ - "\u0000\u0344\u0345\u0006\u0012\u0000\u0000\u0345\u0346\u0006\u0012\u0001"+ - "\u0000\u03460\u0001\u0000\u0000\u0000\u0347\u0348\u0005@\u0000\u0000\u0348"+ - "\u034c\u0003K \u0000\u0349\u034b\u0005 \u0000\u0000\u034a\u0349\u0001"+ - "\u0000\u0000\u0000\u034b\u034e\u0001\u0000\u0000\u0000\u034c\u034a\u0001"+ - "\u0000\u0000\u0000\u034c\u034d\u0001\u0000\u0000\u0000\u034d\u034f\u0001"+ - "\u0000\u0000\u0000\u034e\u034c\u0001\u0000\u0000\u0000\u034f\u0350\u0004"+ - "\u0013\u0006\u0000\u0350\u0351\u0001\u0000\u0000\u0000\u0351\u0352\u0006"+ - "\u0013\u0000\u0000\u03522\u0001\u0000\u0000\u0000\u0353\u0354\u0005@\u0000"+ - "\u0000\u0354\u0355\u0003K \u0000\u03554\u0001\u0000\u0000\u0000\u0356"+ - "\u0358\u0005@\u0000\u0000\u0357\u0359\u0007\u001b\u0000\u0000\u0358\u0357"+ - "\u0001\u0000\u0000\u0000\u0358\u0359\u0001\u0000\u0000\u0000\u03596\u0001"+ - "\u0000\u0000\u0000\u035a\u035b\u0005{\u0000\u0000\u035b\u035c\u0005{\u0000"+ - "\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d\u035e\u0006\u0016\u0005"+ - "\u0000\u035e\u035f\u0006\u0016\u0006\u0000\u035f8\u0001\u0000\u0000\u0000"+ - "\u0360\u0361\u0005{\u0000\u0000\u0361\u0362\u0005!\u0000\u0000\u0362\u0363"+ - "\u0005!\u0000\u0000\u0363\u0364\u0001\u0000\u0000\u0000\u0364\u0365\u0006"+ - "\u0017\u0007\u0000\u0365\u0366\u0006\u0017\b\u0000\u0366:\u0001\u0000"+ - "\u0000\u0000\u0367\u0368\u0005/\u0000\u0000\u0368\u0369\u0005*\u0000\u0000"+ - "\u0369\u036d\u0001\u0000\u0000\u0000\u036a\u036c\t\u0000\u0000\u0000\u036b"+ - "\u036a\u0001\u0000\u0000\u0000\u036c\u036f\u0001\u0000\u0000\u0000\u036d"+ - "\u036e\u0001\u0000\u0000\u0000\u036d\u036b\u0001\u0000\u0000\u0000\u036e"+ - "\u0370\u0001\u0000\u0000\u0000\u036f\u036d\u0001\u0000\u0000\u0000\u0370"+ - "\u0371\u0005*\u0000\u0000\u0371\u0375\u0005/\u0000\u0000\u0372\u0373\u0005"+ - "/\u0000\u0000\u0373\u0375\u0005/\u0000\u0000\u0374\u0367\u0001\u0000\u0000"+ - "\u0000\u0374\u0372\u0001\u0000\u0000\u0000\u0375\u0376\u0001\u0000\u0000"+ - "\u0000\u0376\u0377\u0006\u0018\t\u0000\u0377<\u0001\u0000\u0000\u0000"+ - "\u0378\u0379\u0005<\u0000\u0000\u0379\u037a\u0007\u0015\u0000\u0000\u037a"+ - "\u037b\u0005-\u0000\u0000\u037b\u037c\u0001\u0000\u0000\u0000\u037c\u0388"+ - "\u0003\u000f\u0002\u0000\u037d\u037e\u0005<\u0000\u0000\u037e\u0383\u0003"+ - "\u000f\u0002\u0000\u037f\u0380\u0005:\u0000\u0000\u0380\u0381\u0005:\u0000"+ - "\u0000\u0381\u0382\u0001\u0000\u0000\u0000\u0382\u0384\u0003\u000f\u0002"+ - "\u0000\u0383\u037f\u0001\u0000\u0000\u0000\u0384\u0385\u0001\u0000\u0000"+ - "\u0000\u0385\u0383\u0001\u0000\u0000\u0000\u0385\u0386\u0001\u0000\u0000"+ - "\u0000\u0386\u0388\u0001\u0000\u0000\u0000\u0387\u0378\u0001\u0000\u0000"+ - "\u0000\u0387\u037d\u0001\u0000\u0000\u0000\u0388\u0389\u0001\u0000\u0000"+ - "\u0000\u0389\u038a\u0006\u0019\t\u0000\u038a\u038b\u0006\u0019\n\u0000"+ - "\u038b>\u0001\u0000\u0000\u0000\u038c\u038d\u0005<\u0000\u0000\u038d\u038e"+ - "\u0005/\u0000\u0000\u038e\u038f\u0001\u0000\u0000\u0000\u038f\u0390\u0003"+ - "O\"\u0000\u0390\u0394\u0005>\u0000\u0000\u0391\u0393\u0007\u001c\u0000"+ - "\u0000\u0392\u0391\u0001\u0000\u0000\u0000\u0393\u0396\u0001\u0000\u0000"+ - "\u0000\u0394\u0392\u0001\u0000\u0000\u0000\u0394\u0395\u0001\u0000\u0000"+ - "\u0000\u0395\u0398\u0001\u0000\u0000\u0000\u0396\u0394\u0001\u0000\u0000"+ - "\u0000\u0397\u038c\u0001\u0000\u0000\u0000\u0398\u0399\u0001\u0000\u0000"+ - "\u0000\u0399\u0397\u0001\u0000\u0000\u0000\u0399\u039a\u0001\u0000\u0000"+ - "\u0000\u039a\u039b\u0001\u0000\u0000\u0000\u039b\u039c\u0006\u001a\t\u0000"+ - "\u039c@\u0001\u0000\u0000\u0000\u039d\u039f\u0005 \u0000\u0000\u039e\u039d"+ - "\u0001\u0000\u0000\u0000\u039f\u03a0\u0001\u0000\u0000\u0000\u03a0\u039e"+ - "\u0001\u0000\u0000\u0000\u03a0\u03a1\u0001\u0000\u0000\u0000\u03a1\u03b7"+ - "\u0001\u0000\u0000\u0000\u03a2\u03a4\u0007\u001d\u0000\u0000\u03a3\u03a2"+ - "\u0001\u0000\u0000\u0000\u03a4\u03a5\u0001\u0000\u0000\u0000\u03a5\u03a3"+ - "\u0001\u0000\u0000\u0000\u03a5\u03a6\u0001\u0000\u0000\u0000\u03a6\u03b7"+ - "\u0001\u0000\u0000\u0000\u03a7\u03b7\u0003\u000f\u0002\u0000\u03a8\u03b7"+ - "\u0003\u0011\u0003\u0000\u03a9\u03aa\u0005\"\u0000\u0000\u03aa\u03b7\u0004"+ - "\u001b\u0007\u0000\u03ab\u03ac\u0005\\\u0000\u0000\u03ac\u03ad\u0005\'"+ - "\u0000\u0000\u03ad\u03ae\u0001\u0000\u0000\u0000\u03ae\u03b7\u0004\u001b"+ - "\b\u0000\u03af\u03b7\u0007\u001e\u0000\u0000\u03b0\u03b2\u0007\u001f\u0000"+ - "\u0000\u03b1\u03b0\u0001\u0000\u0000\u0000\u03b2\u03b3\u0001\u0000\u0000"+ - "\u0000\u03b3\u03b1\u0001\u0000\u0000\u0000\u03b3\u03b4\u0001\u0000\u0000"+ - "\u0000\u03b4\u03b7\u0001\u0000\u0000\u0000\u03b5\u03b7\u0007 \u0000\u0000"+ - "\u03b6\u039e\u0001\u0000\u0000\u0000\u03b6\u03a3\u0001\u0000\u0000\u0000"+ - "\u03b6\u03a7\u0001\u0000\u0000\u0000\u03b6\u03a8\u0001\u0000\u0000\u0000"+ - "\u03b6\u03a9\u0001\u0000\u0000\u0000\u03b6\u03ab\u0001\u0000\u0000\u0000"+ - "\u03b6\u03af\u0001\u0000\u0000\u0000\u03b6\u03b1\u0001\u0000\u0000\u0000"+ - "\u03b6\u03b5\u0001\u0000\u0000\u0000\u03b7\u03ba\u0001\u0000\u0000\u0000"+ - "\u03b8\u03b6\u0001\u0000\u0000\u0000\u03b8\u03b9\u0001\u0000\u0000\u0000"+ - "\u03b9\u03bb\u0001\u0000\u0000\u0000\u03ba\u03b8\u0001\u0000\u0000\u0000"+ - "\u03bb\u03bc\u0005<\u0000\u0000\u03bc\u03bd\u0004\u001b\t\u0000\u03bd"+ - "\u03be\u0001\u0000\u0000\u0000\u03be\u03bf\u0006\u001b\u000b\u0000\u03bf"+ - "\u03c0\u0006\u001b\f\u0000\u03c0B\u0001\u0000\u0000\u0000\u03c1\u03c3"+ - "\u0005 \u0000\u0000\u03c2\u03c1\u0001\u0000\u0000\u0000\u03c3\u03c4\u0001"+ - "\u0000\u0000\u0000\u03c4\u03c2\u0001\u0000\u0000\u0000\u03c4\u03c5\u0001"+ - "\u0000\u0000\u0000\u03c5\u03dd\u0001\u0000\u0000\u0000\u03c6\u03c8\u0007"+ - "\u001d\u0000\u0000\u03c7\u03c6\u0001\u0000\u0000\u0000\u03c8\u03c9\u0001"+ - "\u0000\u0000\u0000\u03c9\u03c7\u0001\u0000\u0000\u0000\u03c9\u03ca\u0001"+ - "\u0000\u0000\u0000\u03ca\u03dd\u0001\u0000\u0000\u0000\u03cb\u03cd\u0007"+ - "!\u0000\u0000\u03cc\u03cb\u0001\u0000\u0000\u0000\u03cc\u03cd\u0001\u0000"+ - "\u0000\u0000\u03cd\u03ce\u0001\u0000\u0000\u0000\u03ce\u03dd\u0003\u000f"+ - "\u0002\u0000\u03cf\u03dd\u0003\u0011\u0003\u0000\u03d0\u03d1\u0005\"\u0000"+ - "\u0000\u03d1\u03dd\u0004\u001c\n\u0000\u03d2\u03dd\u0005,\u0000\u0000"+ - "\u03d3\u03d4\u0005\\\u0000\u0000\u03d4\u03dd\u0005\'\u0000\u0000\u03d5"+ - "\u03dd\u0007\"\u0000\u0000\u03d6\u03d8\u0007\u001f\u0000\u0000\u03d7\u03d6"+ - "\u0001\u0000\u0000\u0000\u03d8\u03d9\u0001\u0000\u0000\u0000\u03d9\u03d7"+ - "\u0001\u0000\u0000\u0000\u03d9\u03da\u0001\u0000\u0000\u0000\u03da\u03dd"+ - "\u0001\u0000\u0000\u0000\u03db\u03dd\u0007 \u0000\u0000\u03dc\u03c2\u0001"+ - "\u0000\u0000\u0000\u03dc\u03c7\u0001\u0000\u0000\u0000\u03dc\u03cc\u0001"+ - "\u0000\u0000\u0000\u03dc\u03cf\u0001\u0000\u0000\u0000\u03dc\u03d0\u0001"+ - "\u0000\u0000\u0000\u03dc\u03d2\u0001\u0000\u0000\u0000\u03dc\u03d3\u0001"+ - "\u0000\u0000\u0000\u03dc\u03d5\u0001\u0000\u0000\u0000\u03dc\u03d7\u0001"+ - "\u0000\u0000\u0000\u03dc\u03db\u0001\u0000\u0000\u0000\u03dd\u03de\u0001"+ - "\u0000\u0000\u0000\u03de\u03dc\u0001\u0000\u0000\u0000\u03de\u03df\u0001"+ - "\u0000\u0000\u0000\u03df\u03e0\u0001\u0000\u0000\u0000\u03e0\u03e1\u0006"+ - "\u001c\t\u0000\u03e1D\u0001\u0000\u0000\u0000\u03e2\u03e4\u0005 \u0000"+ - "\u0000\u03e3\u03e2\u0001\u0000\u0000\u0000\u03e4\u03e5\u0001\u0000\u0000"+ - "\u0000\u03e5\u03e3\u0001\u0000\u0000\u0000\u03e5\u03e6\u0001\u0000\u0000"+ - "\u0000\u03e6\u03ed\u0001\u0000\u0000\u0000\u03e7\u03e9\u0007\u001d\u0000"+ - "\u0000\u03e8\u03e7\u0001\u0000\u0000\u0000\u03e9\u03ea\u0001\u0000\u0000"+ - "\u0000\u03ea\u03e8\u0001\u0000\u0000\u0000\u03ea\u03eb\u0001\u0000\u0000"+ - "\u0000\u03eb\u03ed\u0001\u0000\u0000\u0000\u03ec\u03e3\u0001\u0000\u0000"+ - "\u0000\u03ec\u03e8\u0001\u0000\u0000\u0000\u03ed\u03ee\u0001\u0000\u0000"+ - "\u0000\u03ee\u03ef\u0006\u001d\t\u0000\u03efF\u0001\u0000\u0000\u0000"+ - "\u03f0\u03f1\u0005{\u0000\u0000\u03f1\u03f6\u0005!\u0000\u0000\u03f2\u03f3"+ - "\u0005{\u0000\u0000\u03f3\u03f4\u0005{\u0000\u0000\u03f4\u03f6\u0005-"+ - "\u0000\u0000\u03f5\u03f0\u0001\u0000\u0000\u0000\u03f5\u03f2\u0001\u0000"+ - "\u0000\u0000\u03f6\u03f7\u0001\u0000\u0000\u0000\u03f7\u03f8\u0006\u001e"+ - "\t\u0000\u03f8H\u0001\u0000\u0000\u0000\u03f9\u03fa\t\u0000\u0000\u0000"+ - "\u03fa\u03fb\u0001\u0000\u0000\u0000\u03fb\u03fc\u0006\u001f\t\u0000\u03fc"+ - "J\u0001\u0000\u0000\u0000\u03fd\u0401\u0007\u0013\u0000\u0000\u03fe\u0400"+ - "\u0007#\u0000\u0000\u03ff\u03fe\u0001\u0000\u0000\u0000\u0400\u0403\u0001"+ - "\u0000\u0000\u0000\u0401\u03ff\u0001\u0000\u0000\u0000\u0401\u0402\u0001"+ - "\u0000\u0000\u0000\u0402L\u0001\u0000\u0000\u0000\u0403\u0401\u0001\u0000"+ - "\u0000\u0000\u0404\u0408\u0007$\u0000\u0000\u0405\u0407\u0007%\u0000\u0000"+ - "\u0406\u0405\u0001\u0000\u0000\u0000\u0407\u040a\u0001\u0000\u0000\u0000"+ - "\u0408\u0406\u0001\u0000\u0000\u0000\u0408\u0409\u0001\u0000\u0000\u0000"+ - "\u0409N\u0001\u0000\u0000\u0000\u040a\u0408\u0001\u0000\u0000\u0000\u040b"+ - "\u040f\u0007\u0013\u0000\u0000\u040c\u040e\u0007&\u0000\u0000\u040d\u040c"+ - "\u0001\u0000\u0000\u0000\u040e\u0411\u0001\u0000\u0000\u0000\u040f\u040d"+ - "\u0001\u0000\u0000\u0000\u040f\u0410\u0001\u0000\u0000\u0000\u0410P\u0001"+ - "\u0000\u0000\u0000\u0411\u040f\u0001\u0000\u0000\u0000\u0412\u0413\u0007"+ - "\'\u0000\u0000\u0413R\u0001\u0000\u0000\u0000\u0414\u0419\u0005\"\u0000"+ - "\u0000\u0415\u0418\u0003Q#\u0000\u0416\u0418\t\u0000\u0000\u0000\u0417"+ - "\u0415\u0001\u0000\u0000\u0000\u0417\u0416\u0001\u0000\u0000\u0000\u0418"+ - "\u041b\u0001\u0000\u0000\u0000\u0419\u041a\u0001\u0000\u0000\u0000\u0419"+ - "\u0417\u0001\u0000\u0000\u0000\u041a\u041c\u0001\u0000\u0000\u0000\u041b"+ - "\u0419\u0001\u0000\u0000\u0000\u041c\u041d\u0005\"\u0000\u0000\u041dT"+ - "\u0001\u0000\u0000\u0000\u041e\u0424\u0005\'\u0000\u0000\u041f\u0423\b"+ - "(\u0000\u0000\u0420\u0421\u0005\\\u0000\u0000\u0421\u0423\t\u0000\u0000"+ - "\u0000\u0422\u041f\u0001\u0000\u0000\u0000\u0422\u0420\u0001\u0000\u0000"+ - "\u0000\u0423\u0426\u0001\u0000\u0000\u0000\u0424\u0422\u0001\u0000\u0000"+ - "\u0000\u0424\u0425\u0001\u0000\u0000\u0000\u0425\u0427\u0001\u0000\u0000"+ - "\u0000\u0426\u0424\u0001\u0000\u0000\u0000\u0427\u0428\u0005\'\u0000\u0000"+ - "\u0428V\u0001\u0000\u0000\u0000\u0429\u042a\u0005/\u0000\u0000\u042a\u042b"+ - "\u0005/\u0000\u0000\u042b\u042f\u0001\u0000\u0000\u0000\u042c\u042e\b"+ - "\u001d\u0000\u0000\u042d\u042c\u0001\u0000\u0000\u0000\u042e\u0431\u0001"+ - "\u0000\u0000\u0000\u042f\u042d\u0001\u0000\u0000\u0000\u042f\u0430\u0001"+ - "\u0000\u0000\u0000\u0430X\u0001\u0000\u0000\u0000\u0431\u042f\u0001\u0000"+ - "\u0000\u0000\u0432\u0433\u0005$\u0000\u0000\u0433\u0434\u0003K \u0000"+ - "\u0434Z\u0001\u0000\u0000\u0000\u0435\u0436\u0007\u0004\u0000\u0000\u0436"+ - "\u0437\u0007\u0002\u0000\u0000\u0437\u0438\u0007\u0002\u0000\u0000\u0438"+ - "\u0439\u0007\u0004\u0000\u0000\u0439\u0448\u0007\u000f\u0000\u0000\u043a"+ - "\u043b\u0007\u0005\u0000\u0000\u043b\u043c\u0007\t\u0000\u0000\u043c\u043d"+ - "\u0007\u0004\u0000\u0000\u043d\u043e\u0007\n\u0000\u0000\u043e\u0448\u0007"+ - "\n\u0000\u0000\u043f\u0440\u0007\u0003\u0000\u0000\u0440\u0441\u0007\u0012"+ - "\u0000\u0000\u0441\u0442\u0007\r\u0000\u0000\u0442\u0443\u0007\u000b\u0000"+ - "\u0000\u0443\u0448\u0007\u000f\u0000\u0000\u0444\u0445\u0007\u000e\u0000"+ - "\u0000\u0445\u0446\u0007\n\u0000\u0000\u0446\u0448\u0007\u0003\u0000\u0000"+ - "\u0447\u0435\u0001\u0000\u0000\u0000\u0447\u043a\u0001\u0000\u0000\u0000"+ - "\u0447\u043f\u0001\u0000\u0000\u0000\u0447\u0444\u0001\u0000\u0000\u0000"+ - "\u0448\\\u0001\u0000\u0000\u0000\u0449\u044a\u000209\u0000\u044a^\u0001"+ - "\u0000\u0000\u0000\u044b\u044c\u0005{\u0000\u0000\u044c\u044d\u0005{\u0000"+ - "\u0000\u044d\u044e\u0005-\u0000\u0000\u044e\u044f\u0005-\u0000\u0000\u044f"+ - "\u0450\u0001\u0000\u0000\u0000\u0450\u0451\u0006*\r\u0000\u0451`\u0001"+ - "\u0000\u0000\u0000\u0452\u0453\u0005@\u0000\u0000\u0453\u0454\u0003O\""+ - "\u0000\u0454\u0455\u0005.\u0000\u0000\u0455\u0456\u0001\u0000\u0000\u0000"+ - "\u0456\u0457\u0006+\t\u0000\u0457b\u0001\u0000\u0000\u0000\u0458\u045d"+ - "\u0005@\u0000\u0000\u0459\u045b\u0003])\u0000\u045a\u045c\u0005.\u0000"+ - "\u0000\u045b\u045a\u0001\u0000\u0000\u0000\u045b\u045c\u0001\u0000\u0000"+ - "\u0000\u045c\u045e\u0001\u0000\u0000\u0000\u045d\u0459\u0001\u0000\u0000"+ - "\u0000\u045e\u045f\u0001\u0000\u0000\u0000\u045f\u045d\u0001\u0000\u0000"+ - "\u0000\u045f\u0460\u0001\u0000\u0000\u0000\u0460\u0461\u0001\u0000\u0000"+ - "\u0000\u0461\u0462\u0006,\t\u0000\u0462d\u0001\u0000\u0000\u0000\u0463"+ - "\u0464\u0005{\u0000\u0000\u0464\u0465\u0005{\u0000\u0000\u0465\u0599\u0005"+ - "{\u0000\u0000\u0466\u0467\u0005@\u0000\u0000\u0467\u0468\u0005@\u0000"+ - "\u0000\u0468\u046a\u0001\u0000\u0000\u0000\u0469\u046b\u0005@\u0000\u0000"+ - "\u046a\u0469\u0001\u0000\u0000\u0000\u046a\u046b\u0001\u0000\u0000\u0000"+ - "\u046b\u0599\u0001\u0000\u0000\u0000\u046c\u046d\u0005@\u0000\u0000\u046d"+ - "\u046e\u0005{\u0000\u0000\u046e\u0470\u0001\u0000\u0000\u0000\u046f\u0471"+ - "\u0005{\u0000\u0000\u0470\u046f\u0001\u0000\u0000\u0000\u0470\u0471\u0001"+ - "\u0000\u0000\u0000\u0471\u0599\u0001\u0000\u0000\u0000\u0472\u0473\u0005"+ - "@\u0000\u0000\u0473\u0474\u0007\u0012\u0000\u0000\u0474\u0475\u0007\u0003"+ - "\u0000\u0000\u0475\u0476\u0007\u0011\u0000\u0000\u0476\u0477\u0007\u0007"+ - "\u0000\u0000\u0477\u0478\u0007\u0004\u0000\u0000\u0478\u047a\u0001\u0000"+ - "\u0000\u0000\u0479\u047b\u0007)\u0000\u0000\u047a\u0479\u0001\u0000\u0000"+ - "\u0000\u047b\u047c\u0001\u0000\u0000\u0000\u047c\u047a\u0001\u0000\u0000"+ - "\u0000\u047c\u047d\u0001\u0000\u0000\u0000\u047d\u048f\u0001\u0000\u0000"+ - "\u0000\u047e\u047f\u0007\n\u0000\u0000\u047f\u0480\u0007\u0005\u0000\u0000"+ - "\u0480\u0481\u0007\u0002\u0000\u0000\u0481\u0482\u0007\u0003\u0000\u0000"+ - "\u0482\u0483\u0007\u0003\u0000\u0000\u0483\u0484\u0007\f\u0000\u0000\u0484"+ - "\u0486\u0001\u0000\u0000\u0000\u0485\u0487\u0007)\u0000\u0000\u0486\u0485"+ - "\u0001\u0000\u0000\u0000\u0487\u0488\u0001\u0000\u0000\u0000\u0488\u0486"+ - "\u0001\u0000\u0000\u0000\u0488\u0489\u0001\u0000\u0000\u0000\u0489\u048d"+ - "\u0001\u0000\u0000\u0000\u048a\u048b\u0007\u0004\u0000\u0000\u048b\u048c"+ - "\u0007\f\u0000\u0000\u048c\u048e\u0007\u0011\u0000\u0000\u048d\u048a\u0001"+ - "\u0000\u0000\u0000\u048d\u048e\u0001\u0000\u0000\u0000\u048e\u0490\u0001"+ - "\u0000\u0000\u0000\u048f\u047e\u0001\u0000\u0000\u0000\u048f\u0490\u0001"+ - "\u0000\u0000\u0000\u0490\u0599\u0001\u0000\u0000\u0000\u0491\u0492\u0005"+ - "@\u0000\u0000\u0492\u0493\u0007\u0005\u0000\u0000\u0493\u0494\u0007\u0006"+ - "\u0000\u0000\u0494\u0495\u0007\u0004\u0000\u0000\u0495\u0496\u0007\u0002"+ - "\u0000\u0000\u0496\u0497\u0007\n\u0000\u0000\u0497\u0498\u0007\u0003\u0000"+ - "\u0000\u0498\u0591\u0007\u000b\u0000\u0000\u0499\u049a\u0005@\u0000\u0000"+ - "\u049a\u049b\u0007\u0007\u0000\u0000\u049b\u049c\u0007\u0012\u0000\u0000"+ - "\u049c\u049d\u0007\r\u0000\u0000\u049d\u049e\u0007\u0001\u0000\u0000\u049e"+ - "\u049f\u0007\u0002\u0000\u0000\u049f\u0591\u0007\u000b\u0000\u0000\u04a0"+ - "\u04a1\u0005@\u0000\u0000\u04a1\u04a2\u0007\f\u0000\u0000\u04a2\u04a3"+ - "\u0007\u0004\u0000\u0000\u04a3\u04a4\u0007\u0012\u0000\u0000\u04a4\u04a5"+ - "\u0007\u0003\u0000\u0000\u04a5\u04a6\u0007\n\u0000\u0000\u04a6\u04a7\u0007"+ - "\r\u0000\u0000\u04a7\u04a8\u0007\u0004\u0000\u0000\u04a8\u04a9\u0007\u0005"+ - "\u0000\u0000\u04a9\u0591\u0007\u0003\u0000\u0000\u04aa\u04ab\u0005@\u0000"+ - "\u0000\u04ab\u04ac\u0007\u0011\u0000\u0000\u04ac\u04ad\u0007\u0001\u0000"+ - "\u0000\u04ad\u04ae\u0007\u0005\u0000\u0000\u04ae\u04af\u0007\u000e\u0000"+ - "\u0000\u04af\u04b0\u0007\u0012\u0000\u0000\u04b0\u04b1\u0007\u0003\u0000"+ - "\u0000\u04b1\u04b2\u0007\f\u0000\u0000\u04b2\u0591\u0007\u000b\u0000\u0000"+ - "\u04b3\u04b4\u0005@\u0000\u0000\u04b4\u04b5\u0007\u0000\u0000\u0000\u04b5"+ - "\u04b6\u0007\u0001\u0000\u0000\u04b6\u04b7\u0007\f\u0000\u0000\u04b7\u04b8"+ - "\u0007\u000b\u0000\u0000\u04b8\u04b9\u0005-\u0000\u0000\u04b9\u04ba\u0007"+ - "\u0000\u0000\u0000\u04ba\u04bb\u0007\u0004\u0000\u0000\u04bb\u04bc\u0007"+ - "\u0005\u0000\u0000\u04bc\u0591\u0007\u0003\u0000\u0000\u04bd\u04be\u0005"+ - "@\u0000\u0000\u04be\u04bf\u0007\r\u0000\u0000\u04bf\u04c0\u0007\u0004"+ - "\u0000\u0000\u04c0\u04c1\u0007\u0010\u0000\u0000\u04c1\u0591\u0007\u0003"+ - "\u0000\u0000\u04c2\u04c3\u0005@\u0000\u0000\u04c3\u04c4\u0007\t\u0000"+ - "\u0000\u04c4\u04c5\u0007\u0004\u0000\u0000\u04c5\u04c6\u0007\u000f\u0000"+ - "\u0000\u04c6\u04c7\u0007\u0003\u0000\u0000\u04c7\u0591\u0007\u0002\u0000"+ - "\u0000\u04c8\u04c9\u0005@\u0000\u0000\u04c9\u04ca\u0007\n\u0000\u0000"+ - "\u04ca\u04cb\u0007\u000e\u0000\u0000\u04cb\u04cc\u0007\r\u0000\u0000\u04cc"+ - "\u04cd\u0007\r\u0000\u0000\u04cd\u04ce\u0007\u0001\u0000\u0000\u04ce\u04cf"+ - "\u0007\u0002\u0000\u0000\u04cf\u04d0\u0007\u000b\u0000\u0000\u04d0\u0591"+ - "\u0007\n\u0000\u0000\u04d1\u04d2\u0005@\u0000\u0000\u04d2\u04d3\u0007"+ - "\u000b\u0000\u0000\u04d3\u04d4\u0007\u0004\u0000\u0000\u04d4\u04d5\u0007"+ - "\u0007\u0000\u0000\u04d5\u04d6\u0007\t\u0000\u0000\u04d6\u04d7\u0007\b"+ - "\u0000\u0000\u04d7\u04d8\u0007\u0007\u0000\u0000\u04d8\u04d9\u0007\f\u0000"+ - "\u0000\u04d9\u0591\u0007\u0011\u0000\u0000\u04da\u04db\u0005@\u0000\u0000"+ - "\u04db\u04dc\u0007\u0004\u0000\u0000\u04dc\u04dd\u0007\r\u0000\u0000\u04dd"+ - "\u04de\u0007\r\u0000\u0000\u04de\u04df\u0007\t\u0000\u0000\u04df\u0591"+ - "\u0007\u000f\u0000\u0000\u04e0\u04e1\u0005@\u0000\u0000\u04e1\u04e2\u0005"+ - "-\u0000\u0000\u04e2\u04e3\u0007\b\u0000\u0000\u04e3\u04e4\u0007\u0003"+ - "\u0000\u0000\u04e4\u04e5\u0007\u0016\u0000\u0000\u04e5\u04e6\u0007\u0017"+ - "\u0000\u0000\u04e6\u04e7\u0007\u0007\u0000\u0000\u04e7\u04e8\u0007\u000b"+ - "\u0000\u0000\u04e8\u04e9\u0005-\u0000\u0000\u04e9\u04ea\u0007\u0017\u0000"+ - "\u0000\u04ea\u04eb\u0007\u0003\u0000\u0000\u04eb\u04ec\u0007\u000f\u0000"+ - "\u0000\u04ec\u04ed\u0007\u0000\u0000\u0000\u04ed\u04ee\u0007\u0002\u0000"+ - "\u0000\u04ee\u04ef\u0007\u0004\u0000\u0000\u04ef\u04f0\u0007\u0012\u0000"+ - "\u0000\u04f0\u04f1\u0007\u0003\u0000\u0000\u04f1\u0591\u0007\n\u0000\u0000"+ - "\u04f2\u04f3\u0005@\u0000\u0000\u04f3\u04f4\u0007\u0017\u0000\u0000\u04f4"+ - "\u04f5\u0007\u0003\u0000\u0000\u04f5\u04f6\u0007\u000f\u0000\u0000\u04f6"+ - "\u04f7\u0007\u0000\u0000\u0000\u04f7\u04f8\u0007\u0002\u0000\u0000\u04f8"+ - "\u04f9\u0007\u0004\u0000\u0000\u04f9\u04fa\u0007\u0012\u0000\u0000\u04fa"+ - "\u04fb\u0007\u0003\u0000\u0000\u04fb\u0591\u0007\n\u0000\u0000\u04fc\u04fd"+ - "\u0005@\u0000\u0000\u04fd\u04fe\u0007\u0005\u0000\u0000\u04fe\u04ff\u0007"+ - "\u0001\u0000\u0000\u04ff\u0500\u0007\u000e\u0000\u0000\u0500\u0501\u0007"+ - "\f\u0000\u0000\u0501\u0502\u0007\u000b\u0000\u0000\u0502\u0503\u0007\u0003"+ - "\u0000\u0000\u0503\u0504\u0007\u0002\u0000\u0000\u0504\u0505\u0005-\u0000"+ - "\u0000\u0505\u0506\u0007\n\u0000\u0000\u0506\u0507\u0007\u000b\u0000\u0000"+ - "\u0507\u0508\u0007\u000f\u0000\u0000\u0508\u0509\u0007\t\u0000\u0000\u0509"+ - "\u0591\u0007\u0003\u0000\u0000\u050a\u050b\u0005@\u0000\u0000\u050b\u050c"+ - "\u0007\u0000\u0000\u0000\u050c\u050d\u0007\u0001\u0000\u0000\u050d\u050e"+ - "\u0007\f\u0000\u0000\u050e\u050f\u0007\u000b\u0000\u0000\u050f\u0510\u0005"+ - "-\u0000\u0000\u0510\u0511\u0007\u0000\u0000\u0000\u0511\u0512\u0007\u0003"+ - "\u0000\u0000\u0512\u0513\u0007\u0004\u0000\u0000\u0513\u0514\u0007\u000b"+ - "\u0000\u0000\u0514\u0515\u0007\u000e\u0000\u0000\u0515\u0516\u0007\u0002"+ - "\u0000\u0000\u0516\u0517\u0007\u0003\u0000\u0000\u0517\u0518\u0005-\u0000"+ - "\u0000\u0518\u0519\u0007\u0019\u0000\u0000\u0519\u051a\u0007\u0004\u0000"+ - "\u0000\u051a\u051b\u0007\t\u0000\u0000\u051b\u051c\u0007\u000e\u0000\u0000"+ - "\u051c\u051d\u0007\u0003\u0000\u0000\u051d\u0591\u0007\n\u0000\u0000\u051e"+ - "\u051f\u0005@\u0000\u0000\u051f\u0520\u0007\r\u0000\u0000\u0520\u0521"+ - "\u0007\u0002\u0000\u0000\u0521\u0522\u0007\u0001\u0000\u0000\u0522\u0523"+ - "\u0007\r\u0000\u0000\u0523\u0524\u0007\u0003\u0000\u0000\u0524\u0525\u0007"+ - "\u0002\u0000\u0000\u0525\u0526\u0007\u000b\u0000\u0000\u0526\u0591\u0007"+ - "\u000f\u0000\u0000\u0527\u0528\u0005@\u0000\u0000\u0528\u0529\u0007\n"+ - "\u0000\u0000\u0529\u052a\u0007\u0005\u0000\u0000\u052a\u052b\u0007\u0001"+ - "\u0000\u0000\u052b\u052c\u0007\r\u0000\u0000\u052c\u0591\u0007\u0003\u0000"+ - "\u0000\u052d\u052e\u0005@\u0000\u0000\u052e\u052f\u0007\n\u0000\u0000"+ - "\u052f\u0530\u0007\u000b\u0000\u0000\u0530\u0531\u0007\u0004\u0000\u0000"+ - "\u0531\u0532\u0007\u0002\u0000\u0000\u0532\u0533\u0007\u000b\u0000\u0000"+ - "\u0533\u0534\u0007\u0007\u0000\u0000\u0534\u0535\u0007\f\u0000\u0000\u0535"+ - "\u0536\u0007\u0010\u0000\u0000\u0536\u0537\u0005-\u0000\u0000\u0537\u0538"+ - "\u0007\n\u0000\u0000\u0538\u0539\u0007\u000b\u0000\u0000\u0539\u053a\u0007"+ - "\u000f\u0000\u0000\u053a\u053b\u0007\t\u0000\u0000\u053b\u0591\u0007\u0003"+ - "\u0000\u0000\u053c\u053d\u0005@\u0000\u0000\u053d\u053e\u0007\n\u0000"+ - "\u0000\u053e\u053f\u0007\u000e\u0000\u0000\u053f\u0540\u0007\r\u0000\u0000"+ - "\u0540\u0541\u0007\r\u0000\u0000\u0541\u0542\u0007\u0001\u0000\u0000\u0542"+ - "\u0543\u0007\u0002\u0000\u0000\u0543\u0544\u0007\u000b\u0000\u0000\u0544"+ - "\u0591\u0007\n\u0000\u0000\u0545\u0546\u0005@\u0000\u0000\u0546\u0547"+ - "\u0007\u0019\u0000\u0000\u0547\u0548\u0007\u0007\u0000\u0000\u0548\u0549"+ - "\u0007\u0003\u0000\u0000\u0549\u054a\u0007\b\u0000\u0000\u054a\u054b\u0005"+ - "-\u0000\u0000\u054b\u054c\u0007\u000b\u0000\u0000\u054c\u054d\u0007\u0002"+ - "\u0000\u0000\u054d\u054e\u0007\u0004\u0000\u0000\u054e\u054f\u0007\f\u0000"+ - "\u0000\u054f\u0550\u0007\n\u0000\u0000\u0550\u0551\u0007\u0007\u0000\u0000"+ - "\u0551\u0552\u0007\u000b\u0000\u0000\u0552\u0553\u0007\u0007\u0000\u0000"+ - "\u0553\u0554\u0007\u0001\u0000\u0000\u0554\u0591\u0007\f\u0000\u0000\u0555"+ - "\u0556\u0005@\u0000\u0000\u0556\u0557\u0007\u0005\u0000\u0000\u0557\u0558"+ - "\u0007\u0001\u0000\u0000\u0558\u0559\u0007\f\u0000\u0000\u0559\u055a\u0007"+ - "\u000b\u0000\u0000\u055a\u055b\u0007\u0004\u0000\u0000\u055b\u055c\u0007"+ - "\u0007\u0000\u0000\u055c\u055d\u0007\f\u0000\u0000\u055d\u055e\u0007\u0003"+ - "\u0000\u0000\u055e\u0591\u0007\u0002\u0000\u0000\u055f\u0560\u0005@\u0000"+ - "\u0000\u0560\u0561\u0007\u0005\u0000\u0000\u0561\u0562\u0007\u0001\u0000"+ - "\u0000\u0562\u0563\u0007\t\u0000\u0000\u0563\u0564\u0007\u0001\u0000\u0000"+ - "\u0564\u0565\u0007\u0002\u0000\u0000\u0565\u0566\u0005-\u0000\u0000\u0566"+ - "\u0567\u0007\r\u0000\u0000\u0567\u0568\u0007\u0002\u0000\u0000\u0568\u0569"+ - "\u0007\u0001\u0000\u0000\u0569\u056a\u0007\u0000\u0000\u0000\u056a\u056b"+ - "\u0007\u0007\u0000\u0000\u056b\u056c\u0007\t\u0000\u0000\u056c\u0591\u0007"+ - "\u0003\u0000\u0000\u056d\u056e\u0005@\u0000\u0000\u056e\u056f\u0007\n"+ - "\u0000\u0000\u056f\u0570\u0007\u000b\u0000\u0000\u0570\u0571\u0007\u000f"+ - "\u0000\u0000\u0571\u0572\u0007\t\u0000\u0000\u0572\u0573\u0007\u0003\u0000"+ - "\u0000\u0573\u0574\u0007\n\u0000\u0000\u0574\u0575\u0007\u0003\u0000\u0000"+ - "\u0575\u0591\u0007\u000b\u0000\u0000\u0576\u0577\u0005@\u0000\u0000\u0577"+ - "\u0578\u0007\u0000\u0000\u0000\u0578\u0579\u0007\u0001\u0000\u0000\u0579"+ - "\u057a\u0007\f\u0000\u0000\u057a\u057b\u0007\u000b\u0000\u0000\u057b\u057c"+ - "\u0005-\u0000\u0000\u057c\u057d\u0007\r\u0000\u0000\u057d\u057e\u0007"+ - "\u0004\u0000\u0000\u057e\u057f\u0007\t\u0000\u0000\u057f\u0580\u0007\u0003"+ - "\u0000\u0000\u0580\u0581\u0007\u000b\u0000\u0000\u0581\u0582\u0007\u000b"+ - "\u0000\u0000\u0582\u0583\u0007\u0003\u0000\u0000\u0583\u0584\u0005-\u0000"+ - "\u0000\u0584\u0585\u0007\u0019\u0000\u0000\u0585\u0586\u0007\u0004\u0000"+ - "\u0000\u0586\u0587\u0007\t\u0000\u0000\u0587\u0588\u0007\u000e\u0000\u0000"+ - "\u0588\u0589\u0007\u0003\u0000\u0000\u0589\u0591\u0007\n\u0000\u0000\u058a"+ - "\u058b\u0005@\u0000\u0000\u058b\u058c\u0007\u0012\u0000\u0000\u058c\u058d"+ - "\u0007\u0003\u0000\u0000\u058d\u058e\u0007\u0011\u0000\u0000\u058e\u058f"+ - "\u0007\u0007\u0000\u0000\u058f\u0591\u0007\u0004\u0000\u0000\u0590\u0491"+ - "\u0001\u0000\u0000\u0000\u0590\u0499\u0001\u0000\u0000\u0000\u0590\u04a0"+ - "\u0001\u0000\u0000\u0000\u0590\u04aa\u0001\u0000\u0000\u0000\u0590\u04b3"+ - "\u0001\u0000\u0000\u0000\u0590\u04bd\u0001\u0000\u0000\u0000\u0590\u04c2"+ - "\u0001\u0000\u0000\u0000\u0590\u04c8\u0001\u0000\u0000\u0000\u0590\u04d1"+ - "\u0001\u0000\u0000\u0000\u0590\u04da\u0001\u0000\u0000\u0000\u0590\u04e0"+ - "\u0001\u0000\u0000\u0000\u0590\u04f2\u0001\u0000\u0000\u0000\u0590\u04fc"+ - "\u0001\u0000\u0000\u0000\u0590\u050a\u0001\u0000\u0000\u0000\u0590\u051e"+ - "\u0001\u0000\u0000\u0000\u0590\u0527\u0001\u0000\u0000\u0000\u0590\u052d"+ - "\u0001\u0000\u0000\u0000\u0590\u053c\u0001\u0000\u0000\u0000\u0590\u0545"+ - "\u0001\u0000\u0000\u0000\u0590\u0555\u0001\u0000\u0000\u0000\u0590\u055f"+ - "\u0001\u0000\u0000\u0000\u0590\u056d\u0001\u0000\u0000\u0000\u0590\u0576"+ - "\u0001\u0000\u0000\u0000\u0590\u058a\u0001\u0000\u0000\u0000\u0591\u0595"+ - "\u0001\u0000\u0000\u0000\u0592\u0594\u0007)\u0000\u0000\u0593\u0592\u0001"+ - "\u0000\u0000\u0000\u0594\u0597\u0001\u0000\u0000\u0000\u0595\u0593\u0001"+ - "\u0000\u0000\u0000\u0595\u0596\u0001\u0000\u0000\u0000\u0596\u0599\u0001"+ - "\u0000\u0000\u0000\u0597\u0595\u0001\u0000\u0000\u0000\u0598\u0463\u0001"+ - "\u0000\u0000\u0000\u0598\u0466\u0001\u0000\u0000\u0000\u0598\u046c\u0001"+ - "\u0000\u0000\u0000\u0598\u0472\u0001\u0000\u0000\u0000\u0598\u0590\u0001"+ - "\u0000\u0000\u0000\u0599\u059a\u0001\u0000\u0000\u0000\u059a\u059b\u0006"+ - "-\t\u0000\u059bf\u0001\u0000\u0000\u0000\u059c\u059d\t\u0000\u0000\u0000"+ - "\u059d\u059e\u0004.\u000b\u0000\u059e\u059f\u0001\u0000\u0000\u0000\u059f"+ - "\u05a0\u0006.\u000e\u0000\u05a0\u05a1\u0006.\u000f\u0000\u05a1h\u0001"+ - "\u0000\u0000\u0000\u05a2\u05a3\t\u0000\u0000\u0000\u05a3\u05a4\u0001\u0000"+ - "\u0000\u0000\u05a4\u05a5\u0006/\f\u0000\u05a5j\u0001\u0000\u0000\u0000"+ - "\u05a6\u05a7\u0005\u0000\u0000\u0001\u05a7\u05a8\u0001\u0000\u0000\u0000"+ - "\u05a8\u05a9\u00060\u000e\u0000\u05a9\u05aa\u00060\u000f\u0000\u05aal"+ - "\u0001\u0000\u0000\u0000\u05ab\u05ac\u0005}\u0000\u0000\u05ac\u05ad\u0005"+ - "}\u0000\u0000\u05ad\u05ae\u0001\u0000\u0000\u0000\u05ae\u05af\u00061\u000f"+ - "\u0000\u05af\u05b0\u00061\u0006\u0000\u05b0n\u0001\u0000\u0000\u0000\u05b1"+ - "\u05b3\b*\u0000\u0000\u05b2\u05b1\u0001\u0000\u0000\u0000\u05b3\u05b4"+ - "\u0001\u0000\u0000\u0000\u05b4\u05b2\u0001\u0000\u0000\u0000\u05b4\u05b5"+ - "\u0001\u0000\u0000\u0000\u05b5\u05b6\u0001\u0000\u0000\u0000\u05b6\u05b7"+ - "\u00062\u0010\u0000\u05b7p\u0001\u0000\u0000\u0000\u05b8\u05bc\t\u0000"+ - "\u0000\u0000\u05b9\u05bb\u0007)\u0000\u0000\u05ba\u05b9\u0001\u0000\u0000"+ - "\u0000\u05bb\u05be\u0001\u0000\u0000\u0000\u05bc\u05ba\u0001\u0000\u0000"+ - "\u0000\u05bc\u05bd\u0001\u0000\u0000\u0000\u05bd\u05bf\u0001\u0000\u0000"+ - "\u0000\u05be\u05bc\u0001\u0000\u0000\u0000\u05bf\u05c0\u00063\u0011\u0000"+ - "\u05c0r\u0001\u0000\u0000\u0000\u05c1\u05c2\u0005\u0000\u0000\u0001\u05c2"+ - "\u05c3\u0001\u0000\u0000\u0000\u05c3\u05c4\u00064\u0012\u0000\u05c4\u05c5"+ - "\u00064\u000f\u0000\u05c5t\u0001\u0000\u0000\u0000\u05c6\u05c7\u0005!"+ - "\u0000\u0000\u05c7\u05c8\u0005!\u0000\u0000\u05c8\u05c9\u0005}\u0000\u0000"+ - "\u05c9\u05ca\u0001\u0000\u0000\u0000\u05ca\u05cb\u00065\u000f\u0000\u05cb"+ - "\u05cc\u00065\b\u0000\u05ccv\u0001\u0000\u0000\u0000\u05cd\u05cf\b+\u0000"+ - "\u0000\u05ce\u05cd\u0001\u0000\u0000\u0000\u05cf\u05d0\u0001\u0000\u0000"+ - "\u0000\u05d0\u05ce\u0001\u0000\u0000\u0000\u05d0\u05d1\u0001\u0000\u0000"+ - "\u0000\u05d1\u05d2\u0001\u0000\u0000\u0000\u05d2\u05d3\u00066\u0013\u0000"+ - "\u05d3x\u0001\u0000\u0000\u0000\u05d4\u05d8\t\u0000\u0000\u0000\u05d5"+ - "\u05d7\u0007)\u0000\u0000\u05d6\u05d5\u0001\u0000\u0000\u0000\u05d7\u05da"+ - "\u0001\u0000\u0000\u0000\u05d8\u05d6\u0001\u0000\u0000\u0000\u05d8\u05d9"+ - "\u0001\u0000\u0000\u0000\u05d9\u05db\u0001\u0000\u0000\u0000\u05da\u05d8"+ - "\u0001\u0000\u0000\u0000\u05db\u05dc\u00067\u0014\u0000\u05dcz\u0001\u0000"+ - "\u0000\u0000\u05dd\u05de\u0005\u0000\u0000\u0001\u05de\u05df\u0001\u0000"+ - "\u0000\u0000\u05df\u05e0\u00068\u0012\u0000\u05e0\u05e1\u00068\u000f\u0000"+ - "\u05e1|\u0001\u0000\u0000\u0000\u05e2\u05e3\u0005(\u0000\u0000\u05e3\u05e4"+ - "\u00069\u0015\u0000\u05e4\u05e5\u0001\u0000\u0000\u0000\u05e5\u05e6\u0006"+ - "9\u0016\u0000\u05e6~\u0001\u0000\u0000\u0000\u05e7\u05e8\u0003K \u0000"+ - "\u05e8\u05e9\u0001\u0000\u0000\u0000\u05e9\u05ea\u0006:\u0012\u0000\u05ea"+ - "\u05eb\u0006:\u000f\u0000\u05eb\u0080\u0001\u0000\u0000\u0000\u05ec\u05ed"+ - "\t\u0000\u0000\u0000\u05ed\u05ee\u0001\u0000\u0000\u0000\u05ee\u05ef\u0006"+ - ";\u0012\u0000\u05ef\u05f0\u0006;\u000f\u0000\u05f0\u0082\u0001\u0000\u0000"+ - "\u0000\u05f1\u05f2\u0004<\f\u0000\u05f2\u05f3\u0005(\u0000\u0000\u05f3"+ - "\u05f4\u0006<\u0017\u0000\u05f4\u05f5\u0006<\u0018\u0000\u05f5\u0084\u0001"+ - "\u0000\u0000\u0000\u05f6\u05f7\u0004=\r\u0000\u05f7\u05f8\u0005)\u0000"+ - "\u0000\u05f8\u05f9\u0006=\u0019\u0000\u05f9\u05fa\u0001\u0000\u0000\u0000"+ - "\u05fa\u05fb\u0006=\u001a\u0000\u05fb\u05fc\u0006=\u001b\u0000\u05fc\u0086"+ - "\u0001\u0000\u0000\u0000\u05fd\u05fe\u0004>\u000e\u0000\u05fe\u05ff\u0005"+ - "(\u0000\u0000\u05ff\u0600\u0006>\u001c\u0000\u0600\u0601\u0006>\u001d"+ - "\u0000\u0601\u0088\u0001\u0000\u0000\u0000\u0602\u0603\u0004?\u000f\u0000"+ - "\u0603\u0604\u0005)\u0000\u0000\u0604\u0605\u0006?\u001e\u0000\u0605\u0606"+ - "\u0006?\u001f\u0000\u0606\u008a\u0001\u0000\u0000\u0000\u0607\u0608\t"+ - "\u0000\u0000\u0000\u0608\u0609\u0004@\u0010\u0000\u0609\u060a\u0001\u0000"+ - "\u0000\u0000\u060a\u060b\u0006@ \u0000\u060b\u008c\u0001\u0000\u0000\u0000"+ - "\u060c\u060d\u0005/\u0000\u0000\u060d\u060e\u0005*\u0000\u0000\u060e\u0612"+ - "\u0001\u0000\u0000\u0000\u060f\u0611\t\u0000\u0000\u0000\u0610\u060f\u0001"+ - "\u0000\u0000\u0000\u0611\u0614\u0001\u0000\u0000\u0000\u0612\u0613\u0001"+ - "\u0000\u0000\u0000\u0612\u0610\u0001\u0000\u0000\u0000\u0613\u0615\u0001"+ - "\u0000\u0000\u0000\u0614\u0612\u0001\u0000\u0000\u0000\u0615\u0616\u0005"+ - "*\u0000\u0000\u0616\u0617\u0005/\u0000\u0000\u0617\u0618\u0001\u0000\u0000"+ - "\u0000\u0618\u0619\u0006A!\u0000\u0619\u008e\u0001\u0000\u0000\u0000\u061a"+ - "\u061b\t\u0000\u0000\u0000\u061b\u061c\u0006B\"\u0000\u061c\u0090\u0001"+ - "\u0000\u0000\u0000\u061d\u061e\u0005\u0000\u0000\u0001\u061e\u061f\u0001"+ - "\u0000\u0000\u0000\u061f\u0620\u0006C\u0012\u0000\u0620\u0621\u0006C\u001b"+ - "\u0000\u0621\u0092\u0001\u0000\u0000\u0000\u0622\u0623\u0005@\u0000\u0000"+ - "\u0623\u0624\u0007\u0003\u0000\u0000\u0624\u0625\u0007\f\u0000\u0000\u0625"+ - "\u0626\u0007\u0011\u0000\u0000\u0626\u0627\u0007\r\u0000\u0000\u0627\u0628"+ - "\u0007\u0006\u0000\u0000\u0628\u0629\u0007\r\u0000\u0000\u0629\u062a\u0001"+ - "\u0000\u0000\u0000\u062a\u062b\u0006D\u000f\u0000\u062b\u0094\u0001\u0000"+ - "\u0000\u0000\u062c\u062d\t\u0000\u0000\u0000\u062d\u062e\u0004E\u0011"+ - "\u0000\u062e\u062f\u0001\u0000\u0000\u0000\u062f\u0630\u0006E#\u0000\u0630"+ - "\u0096\u0001\u0000\u0000\u0000\u0631\u0632\t\u0000\u0000\u0000\u0632\u0633"+ - "\u0001\u0000\u0000\u0000\u0633\u0634\u0006F\f\u0000\u0634\u0098\u0001"+ - "\u0000\u0000\u0000\u0635\u0636\u0005\u0000\u0000\u0001\u0636\u0637\u0001"+ - "\u0000\u0000\u0000\u0637\u0638\u0006G\u0012\u0000\u0638\u0639\u0006G\u000f"+ - "\u0000\u0639\u009a\u0001\u0000\u0000\u0000\u063a\u063b\u0005@\u0000\u0000"+ - "\u063b\u063c\u0007\u0003\u0000\u0000\u063c\u063d\u0007\f\u0000\u0000\u063d"+ - "\u063e\u0007\u0011\u0000\u0000\u063e\u063f\u0007\u0019\u0000\u0000\u063f"+ - "\u0640\u0007\u0003\u0000\u0000\u0640\u0641\u0007\u0002\u0000\u0000\u0641"+ - "\u0642\u0007\u0016\u0000\u0000\u0642\u0643\u0007\u0004\u0000\u0000\u0643"+ - "\u0644\u0007\u000b\u0000\u0000\u0644\u0645\u0007\u0007\u0000\u0000\u0645"+ - "\u0646\u0007\u0012\u0000\u0000\u0646\u0647\u0001\u0000\u0000\u0000\u0647"+ - "\u0648\u0006H\u0001\u0000\u0648\u0649\u0006H\u000f\u0000\u0649\u009c\u0001"+ - "\u0000\u0000\u0000\u064a\u064b\t\u0000\u0000\u0000\u064b\u064c\u0004I"+ - "\u0012\u0000\u064c\u064d\u0001\u0000\u0000\u0000\u064d\u064e\u0006I\t"+ - "\u0000\u064e\u009e\u0001\u0000\u0000\u0000\u064f\u0650\t\u0000\u0000\u0000"+ - "\u0650\u0651\u0001\u0000\u0000\u0000\u0651\u0652\u0006J\f\u0000\u0652"+ - "\u00a0\u0001\u0000\u0000\u0000\u0653\u0654\u0005\u0000\u0000\u0001\u0654"+ - "\u0655\u0001\u0000\u0000\u0000\u0655\u0656\u0006K\u0012\u0000\u0656\u0657"+ - "\u0006K\u000f\u0000\u0657\u00a2\u0001\u0000\u0000\u0000\u0658\u0659\u0005"+ - ":\u0000\u0000\u0659\u065a\u0003O\"\u0000\u065a\u065b\u0005=\u0000\u0000"+ - "\u065b\u065c\u0005\"\u0000\u0000\u065c\u065d\u0001\u0000\u0000\u0000\u065d"+ - "\u065e\u0006L\t\u0000\u065e\u065f\u0006L$\u0000\u065f\u00a4\u0001\u0000"+ - "\u0000\u0000\u0660\u0661\u0005{\u0000\u0000\u0661\u0662\u0005{\u0000\u0000"+ - "\u0662\u0663\u0001\u0000\u0000\u0000\u0663\u0664\u0006M\u0005\u0000\u0664"+ - "\u0665\u0006M\u0006\u0000\u0665\u00a6\u0001\u0000\u0000\u0000\u0666\u0667"+ - "\u0005{\u0000\u0000\u0667\u0668\u0005!\u0000\u0000\u0668\u0669\u0005!"+ - "\u0000\u0000\u0669\u066a\u0001\u0000\u0000\u0000\u066a\u066b\u0006N\u0007"+ - "\u0000\u066b\u066c\u0006N\b\u0000\u066c\u00a8\u0001\u0000\u0000\u0000"+ - "\u066d\u066e\u0005>\u0000\u0000\u066e\u066f\u0001\u0000\u0000\u0000\u066f"+ - "\u0670\u0006O\t\u0000\u0670\u0671\u0006O\u000f\u0000\u0671\u00aa\u0001"+ - "\u0000\u0000\u0000\u0672\u0673\t\u0000\u0000\u0000\u0673\u0674\u0001\u0000"+ - "\u0000\u0000\u0674\u0675\u0006P\t\u0000\u0675\u00ac\u0001\u0000\u0000"+ - "\u0000\u0676\u0677\u0005\u0000\u0000\u0001\u0677\u0678\u0001\u0000\u0000"+ - "\u0000\u0678\u0679\u0006Q\u0012\u0000\u0679\u067a\u0006Q\u000f\u0000\u067a"+ - "\u00ae\u0001\u0000\u0000\u0000\u067b\u067c\u0005\"\u0000\u0000\u067c\u067d"+ - "\u0001\u0000\u0000\u0000\u067d\u067e\u0006R\t\u0000\u067e\u067f\u0006"+ - "R\u000f\u0000\u067f\u00b0\u0001\u0000\u0000\u0000\u0680\u0681\t\u0000"+ - "\u0000\u0000\u0681\u0682\u0004S\u0013\u0000\u0682\u0683\u0001\u0000\u0000"+ - "\u0000\u0683\u0684\u0006S \u0000\u0684\u00b2\u0001\u0000\u0000\u0000\u0685"+ - "\u0686\t\u0000\u0000\u0000\u0686\u0687\u0001\u0000\u0000\u0000\u0687\u0688"+ - "\u0006T\f\u0000\u0688\u00b4\u0001\u0000\u0000\u0000\u0689\u068a\u0005"+ - "\u0000\u0000\u0001\u068a\u068b\u0001\u0000\u0000\u0000\u068b\u068c\u0006"+ - "U\u0012\u0000\u068c\u068d\u0006U\u000f\u0000\u068d\u00b6\u0001\u0000\u0000"+ - "\u0000\u068e\u0690\u0005{\u0000\u0000\u068f\u0691\u0007(\u0000\u0000\u0690"+ - "\u068f\u0001\u0000\u0000\u0000\u0690\u0691\u0001\u0000\u0000\u0000\u0691"+ - "\u0692\u0001\u0000\u0000\u0000\u0692\u0694\u0003O\"\u0000\u0693\u0695"+ - "\u0007(\u0000\u0000\u0694\u0693\u0001\u0000\u0000\u0000\u0694\u0695\u0001"+ - "\u0000\u0000\u0000\u0695\u0697\u0001\u0000\u0000\u0000\u0696\u0698\u0005"+ - ":\u0000\u0000\u0697\u0696\u0001\u0000\u0000\u0000\u0698\u0699\u0001\u0000"+ - "\u0000\u0000\u0699\u0697\u0001\u0000\u0000\u0000\u0699\u069a\u0001\u0000"+ - "\u0000\u0000\u069a\u069c\u0001\u0000\u0000\u0000\u069b\u069d\u0007(\u0000"+ - "\u0000\u069c\u069b\u0001\u0000\u0000\u0000\u069c\u069d\u0001\u0000\u0000"+ - "\u0000\u069d\u069f\u0001\u0000\u0000\u0000\u069e\u06a0\u0003O\"\u0000"+ - "\u069f\u069e\u0001\u0000\u0000\u0000\u069f\u06a0\u0001\u0000\u0000\u0000"+ - "\u06a0\u06a2\u0001\u0000\u0000\u0000\u06a1\u06a3\u0007(\u0000\u0000\u06a2"+ - "\u06a1\u0001\u0000\u0000\u0000\u06a2\u06a3\u0001\u0000\u0000\u0000\u06a3"+ - "\u06ba\u0001\u0000\u0000\u0000\u06a4\u06a6\u0005,\u0000\u0000\u06a5\u06a7"+ - "\u0007(\u0000\u0000\u06a6\u06a5\u0001\u0000\u0000\u0000\u06a6\u06a7\u0001"+ - "\u0000\u0000\u0000\u06a7\u06a8\u0001\u0000\u0000\u0000\u06a8\u06aa\u0003"+ - "O\"\u0000\u06a9\u06ab\u0007(\u0000\u0000\u06aa\u06a9\u0001\u0000\u0000"+ - "\u0000\u06aa\u06ab\u0001\u0000\u0000\u0000\u06ab\u06ad\u0001\u0000\u0000"+ - "\u0000\u06ac\u06ae\u0005:\u0000\u0000\u06ad\u06ac\u0001\u0000\u0000\u0000"+ - "\u06ae\u06af\u0001\u0000\u0000\u0000\u06af\u06ad\u0001\u0000\u0000\u0000"+ - "\u06af\u06b0\u0001\u0000\u0000\u0000\u06b0\u06b2\u0001\u0000\u0000\u0000"+ - "\u06b1\u06b3\u0007(\u0000\u0000\u06b2\u06b1\u0001\u0000\u0000\u0000\u06b2"+ - "\u06b3\u0001\u0000\u0000\u0000\u06b3\u06b4\u0001\u0000\u0000\u0000\u06b4"+ - "\u06b6\u0003O\"\u0000\u06b5\u06b7\u0007(\u0000\u0000\u06b6\u06b5\u0001"+ - "\u0000\u0000\u0000\u06b6\u06b7\u0001\u0000\u0000\u0000\u06b7\u06b9\u0001"+ - "\u0000\u0000\u0000\u06b8\u06a4\u0001\u0000\u0000\u0000\u06b9\u06bc\u0001"+ - "\u0000\u0000\u0000\u06ba\u06b8\u0001\u0000\u0000\u0000\u06ba\u06bb\u0001"+ - "\u0000\u0000\u0000\u06bb\u06be\u0001\u0000\u0000\u0000\u06bc\u06ba\u0001"+ - "\u0000\u0000\u0000\u06bd\u06bf\u0005,\u0000\u0000\u06be\u06bd\u0001\u0000"+ - "\u0000\u0000\u06be\u06bf\u0001\u0000\u0000\u0000\u06bf\u06c0\u0001\u0000"+ - "\u0000\u0000\u06c0\u06c1\u0005}\u0000\u0000\u06c1\u06c2\u0001\u0000\u0000"+ - "\u0000\u06c2\u06c3\u0006V\f\u0000\u06c3\u00b8\u0001\u0000\u0000\u0000"+ - "\u06c4\u06c5\u0005{\u0000\u0000\u06c5\u06c6\u0005$\u0000\u0000\u06c6\u06cf"+ - "\u0003O\"\u0000\u06c7\u06c8\u0005[\u0000\u0000\u06c8\u06c9\u0007(\u0000"+ - "\u0000\u06c9\u06ca\u0003O\"\u0000\u06ca\u06cb\u0007(\u0000\u0000\u06cb"+ - "\u06cc\u0005]\u0000\u0000\u06cc\u06ce\u0001\u0000\u0000\u0000\u06cd\u06c7"+ - "\u0001\u0000\u0000\u0000\u06ce\u06d1\u0001\u0000\u0000\u0000\u06cf\u06cd"+ - "\u0001\u0000\u0000\u0000\u06cf\u06d0\u0001\u0000\u0000\u0000\u06d0\u06d2"+ - "\u0001\u0000\u0000\u0000\u06d1\u06cf\u0001\u0000\u0000\u0000\u06d2\u06d3"+ - "\u0005:\u0000\u0000\u06d3\u06d4\u0005:\u0000\u0000\u06d4\u06d5\u0001\u0000"+ - "\u0000\u0000\u06d5\u06d6\u0003O\"\u0000\u06d6\u06d7\u0005}\u0000\u0000"+ - "\u06d7\u06d8\u0001\u0000\u0000\u0000\u06d8\u06d9\u0006W\f\u0000\u06d9"+ - "\u00ba\u0001\u0000\u0000\u0000\u06da\u06db\u0005{\u0000\u0000\u06db\u06dc"+ - "\u0005$\u0000\u0000\u06dc\u06e6\u0003O\"\u0000\u06dd\u06de\u0005[\u0000"+ - "\u0000\u06de\u06e0\u0007(\u0000\u0000\u06df\u06e1\u0003O\"\u0000\u06e0"+ - "\u06df\u0001\u0000\u0000\u0000\u06e0\u06e1\u0001\u0000\u0000\u0000\u06e1"+ - "\u06e2\u0001\u0000\u0000\u0000\u06e2\u06e3\u0007(\u0000\u0000\u06e3\u06e5"+ - "\u0005]\u0000\u0000\u06e4\u06dd\u0001\u0000\u0000\u0000\u06e5\u06e8\u0001"+ - "\u0000\u0000\u0000\u06e6\u06e4\u0001\u0000\u0000\u0000\u06e6\u06e7\u0001"+ - "\u0000\u0000\u0000\u06e7\u06f0\u0001\u0000\u0000\u0000\u06e8\u06e6\u0001"+ - "\u0000\u0000\u0000\u06e9\u06ea\u0005:\u0000\u0000\u06ea\u06ec\u0005:\u0000"+ - "\u0000\u06eb\u06e9\u0001\u0000\u0000\u0000\u06ec\u06ed\u0001\u0000\u0000"+ - "\u0000\u06ed\u06eb\u0001\u0000\u0000\u0000\u06ed\u06ee\u0001\u0000\u0000"+ - "\u0000\u06ee\u06ef\u0001\u0000\u0000\u0000\u06ef\u06f1\u0003O\"\u0000"+ - "\u06f0\u06eb\u0001\u0000\u0000\u0000\u06f0\u06f1\u0001\u0000\u0000\u0000"+ - "\u06f1\u06f6\u0001\u0000\u0000\u0000\u06f2\u06f4\u0005:\u0000\u0000\u06f3"+ - "\u06f5\u0003O\"\u0000\u06f4\u06f3\u0001\u0000\u0000\u0000\u06f4\u06f5"+ - "\u0001\u0000\u0000\u0000\u06f5\u06f7\u0001\u0000\u0000\u0000\u06f6\u06f2"+ - "\u0001\u0000\u0000\u0000\u06f7\u06f8\u0001\u0000\u0000\u0000\u06f8\u06f6"+ - "\u0001\u0000\u0000\u0000\u06f8\u06f9\u0001\u0000\u0000\u0000\u06f9\u06fa"+ - "\u0001\u0000\u0000\u0000\u06fa\u06fb\u0005}\u0000\u0000\u06fb\u06ff\u0001"+ - "\u0000\u0000\u0000\u06fc\u06fd\u0005:\u0000\u0000\u06fd\u06ff\u0005$\u0000"+ - "\u0000\u06fe\u06da\u0001\u0000\u0000\u0000\u06fe\u06fc\u0001\u0000\u0000"+ - "\u0000\u06ff\u0700\u0001\u0000\u0000\u0000\u0700\u0701\u0006X\u0012\u0000"+ - "\u0701\u00bc\u0001\u0000\u0000\u0000\u0702\u0703\u0005\\\u0000\u0000\u0703"+ - "\u0704\u0005\"\u0000\u0000\u0704\u0705\u0001\u0000\u0000\u0000\u0705\u0706"+ - "\u0006Y\f\u0000\u0706\u00be\u0001\u0000\u0000\u0000\u0707\u0708\u0005"+ - "\"\u0000\u0000\u0708\u0709\u0001\u0000\u0000\u0000\u0709\u070a\u0006Z"+ - "\f\u0000\u070a\u070b\u0006Z\u000f\u0000\u070b\u00c0\u0001\u0000\u0000"+ - "\u0000\u070c\u070d\t\u0000\u0000\u0000\u070d\u070e\u0001\u0000\u0000\u0000"+ - "\u070e\u070f\u0006[\f\u0000\u070f\u00c2\u0001\u0000\u0000\u0000\u0710"+ - "\u0711\u0005\u0000\u0000\u0001\u0711\u0712\u0001\u0000\u0000\u0000\u0712"+ - "\u0713\u0006\\\u0012\u0000\u0713\u0714\u0006\\\u000f\u0000\u0714\u00c4"+ - "\u0001\u0000\u0000\u0000\u0715\u0716\u0005-\u0000\u0000\u0716\u0717\u0005"+ - "-\u0000\u0000\u0717\u0718\u0005}\u0000\u0000\u0718\u0719\u0005}\u0000"+ - "\u0000\u0719\u071a\u0001\u0000\u0000\u0000\u071a\u071b\u0006]\u000f\u0000"+ - "\u071b\u00c6\u0001\u0000\u0000\u0000\u071c\u071d\t\u0000\u0000\u0000\u071d"+ - "\u071e\u0004^\u0014\u0000\u071e\u071f\u0001\u0000\u0000\u0000\u071f\u0720"+ - "\u0006^%\u0000\u0720\u00c8\u0001\u0000\u0000\u0000\u0721\u0722\t\u0000"+ - "\u0000\u0000\u0722\u0723\u0001\u0000\u0000\u0000\u0723\u0724\u0006_\f"+ - "\u0000\u0724\u00ca\u0001\u0000\u0000\u0000\u0725\u0726\u0005\u0000\u0000"+ - "\u0001\u0726\u0727\u0001\u0000\u0000\u0000\u0727\u0728\u0006`%\u0000\u0728"+ - "\u0729\u0006`\u000f\u0000\u0729\u00cc\u0001\u0000\u0000\u0000g\u0000\u0001"+ - "\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u00d5\u0112\u0131\u014d\u0153"+ - "\u015f\u016d\u0173\u0175\u0193\u0198\u020d\u0212\u0229\u0258\u028f\u0294"+ - "\u02bc\u02c6\u02de\u032f\u0332\u033f\u034c\u0358\u036d\u0374\u0385\u0387"+ - "\u0394\u0399\u03a0\u03a5\u03b3\u03b6\u03b8\u03c4\u03c9\u03cc\u03d9\u03dc"+ - "\u03de\u03e5\u03ea\u03ec\u03f5\u0401\u0408\u040f\u0417\u0419\u0422\u0424"+ - "\u042f\u0447\u045b\u045f\u046a\u0470\u047c\u0488\u048d\u048f\u0590\u0595"+ - "\u0598\u05b4\u05bc\u05d0\u05d8\u0612\u0690\u0694\u0699\u069c\u069f\u06a2"+ - "\u06a6\u06aa\u06af\u06b2\u06b6\u06ba\u06be\u06cf\u06e0\u06e6\u06ed\u06f0"+ - "\u06f4\u06f8\u06fe&\u0005\u0004\u0000\u0007\u0001\u0000\u0005\u0007\u0000"+ - "\u0007\f\u0000\u0005\u0006\u0000\u0005\u0002\u0000\u0007\u0006\u0000\u0005"+ - "\u0003\u0000\u0007\u0005\u0000\u0007\u0007\u0000\u0005\b\u0000\u0005\u0001"+ - "\u0000\u0003\u0000\u0000\u0005\n\u0000\u0007\b\u0000\u0004\u0000\u0000"+ - "\u00012\u0000\u00013\u0001\u0007\t\u0000\u00016\u0002\u00017\u0003\u0001"+ - "9\u0004\u0005\u0005\u0000\u0001<\u0005\u0001<\u0006\u0001=\u0007\u0007"+ - "\u0002\u0000\u0002\u0000\u0000\u0001>\b\u0001>\t\u0001?\n\u0001?\u000b"+ - "\u0007\u0003\u0000\u0006\u0000\u0000\u0001B\f\u0000\u0002\u0000\u0005"+ - "\t\u0000\u0007\n\u0000"; - public static final ATN _ATN = - new ATNDeserializer().deserialize(_serializedATN.toCharArray()); - static { - _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; - for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { - _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); - } - } -} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java deleted file mode 100644 index e2070f8713c7..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.java +++ /dev/null @@ -1,2653 +0,0 @@ -// Generated from BladeAntlrLexer.g4 by ANTLR 4.13.0 - - /* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.netbeans.modules.php.blade.syntax.antlr4.v10; - -import org.antlr.v4.runtime.Lexer; -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.TokenStream; -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.atn.*; -import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.misc.*; - -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) -public class BladeAntlrLexer extends LexerAdaptor { - static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } - - protected static final DFA[] _decisionToDFA; - protected static final PredictionContextCache _sharedContextCache = - new PredictionContextCache(); - public static final int - PHP_EXPRESSION=1, PHP_VARIABLE=2, PHP_KEYWORD=3, PHP_NEW=4, PHP_IDENTIFIER=5, - PHP_NAMESPACE_PATH=6, PHP_STATIC_ACCESS=7, PHP_CLASS_KEYWORD=8, PHP_INSTANCE_ACCESS=9, - BLADE_PARAM_EXTRA=10, BLADE_PARAM_LPAREN=11, BLADE_PARAM_RPAREN=12, BLADE_EXPR_LPAREN=13, - BLADE_EXPR_RPAREN=14, BL_SQ_LPAREN=15, BL_SQ_LRAREN=16, BL_PARAM_STRING=17, - BL_PARAM_ASSIGN=18, BL_COMMA=19, BL_PARAM_COMMA=20, PHP_EXPR_STRING=21, - ERROR=22, HTML=23, BLADE_COMMENT=24, D_IF=25, D_ELSEIF=26, D_ELSE=27, - D_ENDIF=28, D_SWITCH=29, D_CASE=30, D_DEFAULT=31, D_ENDSWITCH=32, D_EMPTY=33, - D_ENDEMPTY=34, D_COND_BLOCK_START=35, D_COND_BLOCK_END=36, D_FOREACH=37, - D_ENDFOREACH=38, D_FOR=39, D_ENDFOR=40, D_FORELSE=41, D_ENDFORELSE=42, - D_WHILE=43, D_ENDWHILE=44, D_BREAK=45, D_LOOP_ACTION=46, D_INCLUDE=47, - D_INCLUDE_IF=48, D_INCLUDE_WHEN=49, D_INCLUDE_FIRST=50, D_INCLUDE_UNLESS=51, - D_EACH=52, D_EXTENDS=53, D_JS=54, D_JSON=55, D_SECTION=56, D_HAS_SECTION=57, - D_SECTION_MISSING=58, D_ENDSECTION=59, D_YIELD=60, D_PARENT=61, D_SHOW=62, - D_OVERWRITE=63, D_STOP=64, D_APPEND=65, D_ONCE=66, D_ENDONCE=67, D_STACK=68, - D_PUSH=69, D_ENDPUSH=70, D_PUSH_IF=71, D_ENDPUSH_IF=72, D_PUSH_ONCE=73, - D_ENDPUSH_ONCE=74, D_PREPEND=75, D_ENDPREPEND=76, D_PROPS=77, D_FRAGMENT=78, - D_ENDFRAGMENT=79, D_CSRF=80, D_METHOD=81, D_ERROR=82, D_ENDERROR=83, D_PRODUCTION=84, - D_ENDPRODUCTION=85, D_ENV=86, D_ENDENV=87, D_AUTH_START=88, D_AUTH_END=89, - D_PERMISSION_START=90, D_PERMISSION_ELSE=91, D_PERMISSION_END=92, D_CLASS=93, - D_STYLE=94, D_HTML_ATTR_EXPR=95, D_AWARE=96, D_SESSION=97, D_ENDSESSION=98, - D_DD=99, D_LANG=100, D_USE=101, D_INJECT=102, D_PHP=103, D_VERBATIM=104, - D_ENDVERBATIM=105, D_LIVEWIRE=106, D_ASSET_BUNDLER=107, D_MISC=108, D_CUSTOM=109, - D_UNKNOWN_ATTR_ENC=110, D_UNKNOWN=111, CONTENT_TAG_OPEN=112, RAW_TAG_OPEN=113, - PHP_INLINE_START=114, HTML_COMPONENT_PREFIX=115, JS_SCRIPT=116, HTML_TAG_START=117, - HTML_CLOSE_TAG=118, STRING_PATH=119, HTML_PATH=120, HTML_TEXT=121, HTML_IDENTIFIER=122, - EQ=123, WS=124, OTHER=125, BLADE_COMMENT_START=126, CONTENT_TAG_CLOSE=127, - REGULAR_ECHO_EXPR_MORE=128, RAW_TAG_CLOSE=129, RAW_ECHO_EXPR_MORE=130, - WS_EXPR_ESCAPE=131, WS_EXPR=132, WS_COMPOSED_EXPR=133, EXPR_STRING=134, - COMPOSED_EXPR_RPAREN=135, PHP_COMPOSED_EXPRESSION=136, WS_BL_PARAM=137, - FOREACH_WS_EXPR=138, FOREACH_LOOP_LPAREN=139, FOREACH_LOOP_RPAREN=140, - FOREACH_AS=141, FOREACH_PARAM_ASSIGN=142, BL_PARAM_LINE_COMMENT=143, BL_SQ_RPAREN=144, - BL_PARAM_RPAREN=145, BL_PARAM_CONCAT_OPERATOR=146, BL_COMMA_EL=147, BL_PARAM_WS=148, - BL_NAME_STRING=149, PHP_D_BLADE_COMMENT=150, PHP_D_BLADE_ML_COMMENT=151, - D_ENDPHP=152, PHP_D_WS=153, PHP_D_PHP_COMPOSED_EXPRESSION=154, PHP_EXIT=155, - PHP_INLINE_COMMENT=156, PHP_INLINE_ML_COMMENT=157, VERBATIM_HTML=158, - BLADE_COMMENT_END=159, BLADE_COMMENT_PEEK=160, BLADE_COMMENT_MORE=161, - BLADE_COMMENT_EOF=162, AT=163, RAW_TAG_START=164, REGULAR_ECHO_STATIC_ACCESS=165, - REGULAR_ECHO_LPAREN=166, REGULAR_ECHO_RPAREN=167, REGULAR_ECHO_INSTANCE_ACCESS=168, - PHP_D_EXPR_CURLY_LPAREN=169, PHP_D_EXPR_CURLY_RPAREN=170, PHP_D_CLASS=171; - public static final int - COMMENT=2, PHP_CODE=3; - public static final int - INSIDE_REGULAR_ECHO=1, INSIDE_RAW_ECHO=2, LOOK_FOR_PHP_EXPRESSION=3, INSIDE_PHP_EXPRESSION=4, - LOOK_FOR_PHP_COMPOSED_EXPRESSION=5, INSIDE_PHP_COMPOSED_EXPRESSION=6, - LOOK_FOR_BLADE_PARAMETERS=7, FOREACH_LOOP_EXPRESSION=8, INSIDE_BLADE_PARAMETERS=9, - BLADE_INLINE_PHP=10, INSIDE_PHP_INLINE=11, VERBATIM_MODE=12, INSIDE_BLADE_COMMENT=13; - public static String[] channelNames = { - "DEFAULT_TOKEN_CHANNEL", "HIDDEN", "COMMENT", "PHP_CODE" - }; - - public static String[] modeNames = { - "DEFAULT_MODE", "INSIDE_REGULAR_ECHO", "INSIDE_RAW_ECHO", "LOOK_FOR_PHP_EXPRESSION", - "INSIDE_PHP_EXPRESSION", "LOOK_FOR_PHP_COMPOSED_EXPRESSION", "INSIDE_PHP_COMPOSED_EXPRESSION", - "LOOK_FOR_BLADE_PARAMETERS", "FOREACH_LOOP_EXPRESSION", "INSIDE_BLADE_PARAMETERS", - "BLADE_INLINE_PHP", "INSIDE_PHP_INLINE", "VERBATIM_MODE", "INSIDE_BLADE_COMMENT" - }; - - private static String[] makeRuleNames() { - return new String[] { - "CompomentIdentifier", "CssSelector", "JsFunctionStart", "StringParam", - "CssAttrSelector", "StringAttrValue", "D_IF", "D_ELSEIF", "D_ELSE", "D_ENDIF", - "D_SWITCH", "D_CASE", "D_DEFAULT", "D_ENDSWITCH", "D_EMPTY", "D_ENDEMPTY", - "D_COND_BLOCK_START", "D_COND_BLOCK_END", "D_FOREACH", "D_ENDFOREACH", - "D_FOR", "D_ENDFOR", "D_FORELSE", "D_ENDFORELSE", "D_WHILE", "D_ENDWHILE", - "D_BREAK", "D_LOOP_ACTION", "D_INCLUDE", "D_INCLUDE_IF", "D_INCLUDE_WHEN", - "D_INCLUDE_FIRST", "D_INCLUDE_UNLESS", "D_EACH", "D_EXTENDS", "D_JS", - "D_JSON", "D_SECTION", "D_HAS_SECTION", "D_SECTION_MISSING", "D_ENDSECTION", - "D_YIELD", "D_PARENT", "D_SHOW", "D_OVERWRITE", "D_STOP", "D_APPEND", - "D_ONCE", "D_ENDONCE", "D_STACK", "D_PUSH", "D_ENDPUSH", "D_PUSH_IF", - "D_ENDPUSH_IF", "D_PUSH_ONCE", "D_ENDPUSH_ONCE", "D_PREPEND", "D_ENDPREPEND", - "D_PROPS", "D_FRAGMENT", "D_ENDFRAGMENT", "D_CSRF", "D_METHOD", "D_ERROR", - "D_ENDERROR", "D_PRODUCTION", "D_ENDPRODUCTION", "D_ENV", "D_ENDENV", - "D_AUTH_START", "D_AUTH_END", "D_PERMISSION_START", "D_PERMISSION_ELSE", - "D_PERMISSION_END", "D_CLASS", "D_STYLE", "D_HTML_ATTR_EXPR", "D_AWARE", - "D_SESSION", "D_ENDSESSION", "D_DD", "D_LANG", "D_USE", "D_INJECT", "D_PHP_SHORT", - "D_PHP", "D_VERBATIM", "D_ENDVERBATIM", "D_LIVEWIRE", "D_ASSET_BUNDLER", - "D_MISC", "D_CUSTOM", "D_UNKNOWN_ATTR_ENC", "D_UNKNOWN", "CONTENT_TAG_OPEN", - "RAW_TAG_OPEN", "AT", "RAW_TAG_START", "PHP_INLINE_START", "HTML_COMPONENT_PREFIX", - "HTML_L_COMPONENT", "JS_SCRIPT", "HTML_TAG_START", "HTML_CLOSE_TAG", - "HTML_TAG_SELF_CLOSE", "HTML_CLOSE_SYMBOL", "STRING_PATH", "HTML_PATH", - "HTML_TEXT", "HTML_IDENTIFIER", "EQ", "WS", "OTHER", "NameString", "BladeLabel", - "FullIdentifier", "ESC_DOUBLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING_FRAGMENT", - "SINGLE_QUOTED_STRING_FRAGMENT", "LineComment", "PhpVariable", "PhpKeyword", - "Digit", "BLADE_COMMENT_START", "EMAIL_SUBSTRING", "VERSION_WITH_AT", - "D_ESCAPES", "REGULAR_ECHO_PHP_VAR", "REGULAR_ECHO_KEYWORD", "REGULAR_PHP_NAMESPACE_PATH", - "REGULAR_ECHO_PHP_IDENTIFIER", "REGULAR_ECHO_STATIC_ACCESS", "CONTENT_TAG_CLOSE", - "REGULAR_ECHO_LPAREN", "REGULAR_ECHO_RPAREN", "REGULAR_ECHO_INSTANCE_ACCESS", - "REGULAR_ECHO_EXPR_MORE", "EXIT_REGULAR_ECHO_EOF", "RAW_ECHO_PHP_VAR", - "RAW_ECHO_KEYWORD", "RAW_ECHO_PHP_NAMESPACE_PATH", "RAW_ECHO_PHP_IDENTIFIER", - "RAW_ECHO_STATIC_ACCESS", "RAW_TAG_CLOSE", "RAW_ECHO_LPAREN", "RAW_ECHO_RPAREN", - "RAW_ECHO_INSTANCE_ACCESS", "RAW_ECHO_EXPR_MORE", "EXIT_RAW_ECHO_EOF", - "WS_EXPR_ESCAPE", "WS_EXPR", "OPEN_EXPR_PAREN_MORE", "L_OHTER_ESCAPE", - "L_OTHER", "OPEN_EXPR_PAREN", "CLOSE_EXPR_PAREN", "LPAREN", "RPAREN", - "EXIT_RPAREN", "PHP_EXPRESSION_MORE", "EXIT_EOF", "WS_COMPOSED_EXPR", - "BLADE_EXPR_LPAREN", "L_COMPOSED_EXPR_OTHER", "EXPR_SQ_LPAREN", "EXPR_SQ_RPAREN", - "EXPR_CURLY_LPAREN", "EXPR_CURLY_RPAREN", "EXPR_STRING", "COMPOSED_EXPR_PHP_VAR", - "COMPOSED_PHP_KEYWORD", "COMPOSED_PHP_NAMESPACE_PATH", "COMPOSED_EXPR_PHP_IDENTIFIER", - "COMPOSED_EXPR_STATIC_ACCESS", "COMPOSED_EXPR_LPAREN", "COMPOSED_EXPR_RPAREN", - "PHP_COMPOSED_EXPRESSION", "EXIT_COMPOSED_EXPRESSION_EOF", "WS_BL_PARAM", - "OPEN_BL_PARAM_PAREN_MORE", "L_BL_PARAM_OTHER", "FOREACH_WS_EXPR", "FOREACH_LOOP_LPAREN", - "FOREACH_LOOP_RPAREN", "FOREACH_AS", "FOREACH_PHP_VARIABLE", "FOREACH_PARAM_ASSIGN", - "LOOP_COMPOSED_PHP_KEYWORD", "LOOP_NAME_STRING", "LOOP_STATIC_ACCESS", - "LOOP_PHP_EXPRESSION", "FOREACH_EOF", "BL_PARAM_LINE_COMMENT", "BL_SQ_LPAREN", - "BL_SQ_RPAREN", "BL_CURLY_LPAREN", "BL_CURLY_RPAREN", "BL_PARAM_LPAREN", - "BL_PARAM_RPAREN", "BL_PARAM_STRING", "BL_PARAM_PHP_VARIABLE", "BL_PARAM_ASSIGN", - "BL_PARAM_PHP_KEYWORD", "BL_PARAM_CONCAT_OPERATOR", "BL_COMMA_EL", "BL_PARAM_WS", - "BL_NAME_STRING", "BL_PARAM_MORE", "BL_PARAM_EXIT_EOF", "PHP_D_BLADE_COMMENT", - "PHP_D_BLADE_ML_COMMENT", "D_ENDPHP", "PHP_D_UNKNOWN", "PHP_D_EXPR_SQ_LPAREN", - "PHP_D_EXPR_SQ_RPAREN", "PHP_D_EXPR_CURLY_LPAREN", "PHP_D_EXPR_CURLY_RPAREN", - "PHP_D_EXPR_STRING", "PHP_D_COMPOSED_EXPR_PHP_VAR", "PHP_D_NEW", "PHP_D_CLASS", - "PHP_D_COMPOSED_PHP_KEYWORD", "PHP_D_NAMESPACE_PATH", "PHP_D_COMPOSED_EXPR_PHP_CLASS_IDENTIFIER", - "PHP_D_COMPOSED_EXPR_PHP_IDENTIFIER", "PHP_D_COMPOSED_EXPR_STATIC_ACCESS", - "PHP_D_COMPOSED_EXPR_LPAREN", "PHP_D_COMPOSED_EXPR_RPAREN", "PHP_D_WS", - "PHP_D_EXIT_COMPOSED_EXPRESSION_EOF", "PHP_D_PHP_COMPOSED_EXPRESSION", - "PHP_EXIT", "PHP_INLINE_COMMENT", "PHP_INLINE_ML_COMMENT", "PHP_EXPR_SQ_LPAREN", - "PHP_EXPR_SQ_RPAREN", "PHP_EXPR_CURLY_LPAREN", "PHP_EXPR_CURLY_RPAREN", - "PHP_EXPR_STRING", "PHP_COMPOSED_EXPR_PHP_VAR", "PHP_COMPOSED_PHP_KEYWORD", - "PHP_COMPOSED_EXPR_PHP_IDENTIFIER", "PHP_COMPOSED_EXPR_STATIC_ACCESS", - "PHP_COMPOSED_EXPR_INSTANCE_ACCESS", "PHP_COMPOSED_EXPR_LPAREN", "PHP_COMPOSED_EXPR_RPAREN", - "PHP_EXIT_COMPOSED_EXPRESSION_EOF", "PHP_PHP_COMPOSED_EXPRESSION", "D_ENDVERBATIM_IN_MODE", - "VERBATIM_HTML", "EXIT_VERBATIM_MOD_EOF", "VERBATIM_HTML_MORE", "BLADE_COMMENT_END", - "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", "BLADE_COMMENT_EOF" - }; - } - public static final String[] ruleNames = makeRuleNames(); - - private static String[] makeLiteralNames() { - return new String[] { - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, "'@if'", "'@elseif'", "'@else'", "'@endif'", "'@switch'", "'@case'", - "'@default'", "'@endswitch'", "'@empty'", "'@endempty'", null, null, - "'@foreach'", "'@endforeach'", "'@for'", "'@endfor'", "'@forelse'", "'@endforelse'", - "'@while'", "'@endwhile'", "'@break'", null, "'@include'", "'@includeIf'", - "'@includeWhen'", "'@includeFirst'", "'@includeUnless'", "'@each'", "'@extends'", - "'@js'", "'@json'", "'@section'", "'@hasSection'", "'@sectionMissing'", - "'@endsection'", "'@yield'", "'@parent'", "'@show'", "'@overwrite'", - "'@stop'", "'@append'", "'@once'", "'@endonce'", "'@stack'", "'@push'", - "'@endpush'", "'@pushIf'", "'@endPushIf'", "'@pushOnce'", "'@endPushOnce'", - "'@prepend'", "'@endprepend'", "'@props'", "'@fragment'", "'@endfragment'", - "'@csrf'", "'@method'", "'@error'", "'@enderror'", "'@production'", "'@endproduction'", - "'@env'", "'@endenv'", null, null, null, null, null, "'@class'", "'@style'", - null, "'@aware'", "'@session'", "'@endsession'", null, "'@lang'", "'@use'", - "'@inject'", null, "'@verbatim'", "'@endverbatim'", null, "'@vite'", - "'@viteReactRefresh'", null, null, null, "'{{'", "'{!!'", null, null, - null, null, null, null, null, null, null, "'='", null, null, "'{{--'", - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, "'as'", null, null, null, null, "'.'", "','", null, null, - null, null, "'@endphp'", "' '", null, "'?>'", null, null, null, "'--}}'", - null, null, null, null, "'{!'", null, null, null, null, null, null, "'class'" - }; - } - private static final String[] _LITERAL_NAMES = makeLiteralNames(); - private static String[] makeSymbolicNames() { - return new String[] { - null, "PHP_EXPRESSION", "PHP_VARIABLE", "PHP_KEYWORD", "PHP_NEW", "PHP_IDENTIFIER", - "PHP_NAMESPACE_PATH", "PHP_STATIC_ACCESS", "PHP_CLASS_KEYWORD", "PHP_INSTANCE_ACCESS", - "BLADE_PARAM_EXTRA", "BLADE_PARAM_LPAREN", "BLADE_PARAM_RPAREN", "BLADE_EXPR_LPAREN", - "BLADE_EXPR_RPAREN", "BL_SQ_LPAREN", "BL_SQ_LRAREN", "BL_PARAM_STRING", - "BL_PARAM_ASSIGN", "BL_COMMA", "BL_PARAM_COMMA", "PHP_EXPR_STRING", "ERROR", - "HTML", "BLADE_COMMENT", "D_IF", "D_ELSEIF", "D_ELSE", "D_ENDIF", "D_SWITCH", - "D_CASE", "D_DEFAULT", "D_ENDSWITCH", "D_EMPTY", "D_ENDEMPTY", "D_COND_BLOCK_START", - "D_COND_BLOCK_END", "D_FOREACH", "D_ENDFOREACH", "D_FOR", "D_ENDFOR", - "D_FORELSE", "D_ENDFORELSE", "D_WHILE", "D_ENDWHILE", "D_BREAK", "D_LOOP_ACTION", - "D_INCLUDE", "D_INCLUDE_IF", "D_INCLUDE_WHEN", "D_INCLUDE_FIRST", "D_INCLUDE_UNLESS", - "D_EACH", "D_EXTENDS", "D_JS", "D_JSON", "D_SECTION", "D_HAS_SECTION", - "D_SECTION_MISSING", "D_ENDSECTION", "D_YIELD", "D_PARENT", "D_SHOW", - "D_OVERWRITE", "D_STOP", "D_APPEND", "D_ONCE", "D_ENDONCE", "D_STACK", - "D_PUSH", "D_ENDPUSH", "D_PUSH_IF", "D_ENDPUSH_IF", "D_PUSH_ONCE", "D_ENDPUSH_ONCE", - "D_PREPEND", "D_ENDPREPEND", "D_PROPS", "D_FRAGMENT", "D_ENDFRAGMENT", - "D_CSRF", "D_METHOD", "D_ERROR", "D_ENDERROR", "D_PRODUCTION", "D_ENDPRODUCTION", - "D_ENV", "D_ENDENV", "D_AUTH_START", "D_AUTH_END", "D_PERMISSION_START", - "D_PERMISSION_ELSE", "D_PERMISSION_END", "D_CLASS", "D_STYLE", "D_HTML_ATTR_EXPR", - "D_AWARE", "D_SESSION", "D_ENDSESSION", "D_DD", "D_LANG", "D_USE", "D_INJECT", - "D_PHP", "D_VERBATIM", "D_ENDVERBATIM", "D_LIVEWIRE", "D_ASSET_BUNDLER", - "D_MISC", "D_CUSTOM", "D_UNKNOWN_ATTR_ENC", "D_UNKNOWN", "CONTENT_TAG_OPEN", - "RAW_TAG_OPEN", "PHP_INLINE_START", "HTML_COMPONENT_PREFIX", "JS_SCRIPT", - "HTML_TAG_START", "HTML_CLOSE_TAG", "STRING_PATH", "HTML_PATH", "HTML_TEXT", - "HTML_IDENTIFIER", "EQ", "WS", "OTHER", "BLADE_COMMENT_START", "CONTENT_TAG_CLOSE", - "REGULAR_ECHO_EXPR_MORE", "RAW_TAG_CLOSE", "RAW_ECHO_EXPR_MORE", "WS_EXPR_ESCAPE", - "WS_EXPR", "WS_COMPOSED_EXPR", "EXPR_STRING", "COMPOSED_EXPR_RPAREN", - "PHP_COMPOSED_EXPRESSION", "WS_BL_PARAM", "FOREACH_WS_EXPR", "FOREACH_LOOP_LPAREN", - "FOREACH_LOOP_RPAREN", "FOREACH_AS", "FOREACH_PARAM_ASSIGN", "BL_PARAM_LINE_COMMENT", - "BL_SQ_RPAREN", "BL_PARAM_RPAREN", "BL_PARAM_CONCAT_OPERATOR", "BL_COMMA_EL", - "BL_PARAM_WS", "BL_NAME_STRING", "PHP_D_BLADE_COMMENT", "PHP_D_BLADE_ML_COMMENT", - "D_ENDPHP", "PHP_D_WS", "PHP_D_PHP_COMPOSED_EXPRESSION", "PHP_EXIT", - "PHP_INLINE_COMMENT", "PHP_INLINE_ML_COMMENT", "VERBATIM_HTML", "BLADE_COMMENT_END", - "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", "BLADE_COMMENT_EOF", "AT", - "RAW_TAG_START", "REGULAR_ECHO_STATIC_ACCESS", "REGULAR_ECHO_LPAREN", - "REGULAR_ECHO_RPAREN", "REGULAR_ECHO_INSTANCE_ACCESS", "PHP_D_EXPR_CURLY_LPAREN", - "PHP_D_EXPR_CURLY_RPAREN", "PHP_D_CLASS" - }; - } - private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); - public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); - - /** - * @deprecated Use {@link #VOCABULARY} instead. - */ - @Deprecated - public static final String[] tokenNames; - static { - tokenNames = new String[_SYMBOLIC_NAMES.length]; - for (int i = 0; i < tokenNames.length; i++) { - tokenNames[i] = VOCABULARY.getLiteralName(i); - if (tokenNames[i] == null) { - tokenNames[i] = VOCABULARY.getSymbolicName(i); - } - - if (tokenNames[i] == null) { - tokenNames[i] = ""; - } - } - } - - @Override - @Deprecated - public String[] getTokenNames() { - return tokenNames; - } - - @Override - - public Vocabulary getVocabulary() { - return VOCABULARY; - } - - - public BladeAntlrLexer(CharStream input) { - super(input); - _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); - } - - @Override - public String getGrammarFileName() { return "BladeAntlrLexer.g4"; } - - @Override - public String[] getRuleNames() { return ruleNames; } - - @Override - public String getSerializedATN() { return _serializedATN; } - - @Override - public String[] getChannelNames() { return channelNames; } - - @Override - public String[] getModeNames() { return modeNames; } - - @Override - public ATN getATN() { return _ATN; } - - @Override - public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { - switch (ruleIndex) { - case 99: - HTML_COMPONENT_PREFIX_action((RuleContext)_localctx, actionIndex); - break; - case 104: - HTML_TAG_SELF_CLOSE_action((RuleContext)_localctx, actionIndex); - break; - case 105: - HTML_CLOSE_SYMBOL_action((RuleContext)_localctx, actionIndex); - break; - case 109: - HTML_IDENTIFIER_action((RuleContext)_localctx, actionIndex); - break; - case 154: - OPEN_EXPR_PAREN_action((RuleContext)_localctx, actionIndex); - break; - case 155: - CLOSE_EXPR_PAREN_action((RuleContext)_localctx, actionIndex); - break; - case 156: - LPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 157: - RPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 162: - BLADE_EXPR_LPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 164: - EXPR_SQ_LPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 165: - EXPR_SQ_RPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 166: - EXPR_CURLY_LPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 167: - EXPR_CURLY_RPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 174: - COMPOSED_EXPR_LPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 175: - COMPOSED_EXPR_RPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 179: - OPEN_BL_PARAM_PAREN_MORE_action((RuleContext)_localctx, actionIndex); - break; - case 182: - FOREACH_LOOP_LPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 183: - FOREACH_LOOP_RPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 193: - BL_SQ_LPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 194: - BL_SQ_RPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 195: - BL_CURLY_LPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 196: - BL_CURLY_RPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 197: - BL_PARAM_LPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 198: - BL_PARAM_RPAREN_action((RuleContext)_localctx, actionIndex); - break; - case 204: - BL_COMMA_EL_action((RuleContext)_localctx, actionIndex); - break; - } - } - private void HTML_COMPONENT_PREFIX_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 0: - this.setComponentTagOpenStatus(true); - break; - } - } - private void HTML_TAG_SELF_CLOSE_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 1: - this.setComponentTagOpenStatus(false); - break; - } - } - private void HTML_CLOSE_SYMBOL_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 2: - this.setComponentTagOpenStatus(false); - break; - } - } - private void HTML_IDENTIFIER_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 3: - this.consumeHtmlIdentifier(); - break; - } - } - private void OPEN_EXPR_PAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 4: - this.increaseRoundParenBalance(); - break; - } - } - private void CLOSE_EXPR_PAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 5: - this.decreaseRoundParenBalance(); - break; - } - } - private void LPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 6: - this.increaseRoundParenBalance(); - break; - } - } - private void RPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 7: - this.decreaseRoundParenBalance(); - break; - } - } - private void BLADE_EXPR_LPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 8: - this.resetRoundParenBalance(); - break; - } - } - private void EXPR_SQ_LPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 9: - this.increaseSquareParenBalance(); - break; - } - } - private void EXPR_SQ_RPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 10: - this.decreaseSquareParenBalance(); - break; - } - } - private void EXPR_CURLY_LPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 11: - this.increaseCurlyParenBalance(); - break; - } - } - private void EXPR_CURLY_RPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 12: - this.decreaseCurlyParenBalance(); - break; - } - } - private void COMPOSED_EXPR_LPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 13: - this.increaseRoundParenBalance(); - break; - } - } - private void COMPOSED_EXPR_RPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 14: - consumeExprRParen(); - break; - } - } - private void OPEN_BL_PARAM_PAREN_MORE_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 15: - this.resetRoundParenBalance(); - break; - } - } - private void FOREACH_LOOP_LPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 16: - this.increaseRoundParenBalance(); - break; - } - } - private void FOREACH_LOOP_RPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 17: - this.decreaseRoundParenBalance(); if (this.getRoundParenBalance() == 0){this.popMode();} - break; - } - } - private void BL_SQ_LPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 18: - this.increaseSquareParenBalance(); - break; - } - } - private void BL_SQ_RPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 19: - this.decreaseSquareParenBalance(); - break; - } - } - private void BL_CURLY_LPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 20: - this.increaseCurlyParenBalance(); - break; - } - } - private void BL_CURLY_RPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 21: - this.decreaseCurlyParenBalance(); - break; - } - } - private void BL_PARAM_LPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 22: - this.increaseRoundParenBalance(); - break; - } - } - private void BL_PARAM_RPAREN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 23: - consumeParamRParen(); - break; - } - } - private void BL_COMMA_EL_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 24: - this.consumeBladeParamComma(); - break; - } - } - @Override - public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { - switch (ruleIndex) { - case 2: - return JsFunctionStart_sempred((RuleContext)_localctx, predIndex); - case 84: - return D_PHP_SHORT_sempred((RuleContext)_localctx, predIndex); - case 85: - return D_PHP_sempred((RuleContext)_localctx, predIndex); - case 91: - return D_CUSTOM_sempred((RuleContext)_localctx, predIndex); - case 92: - return D_UNKNOWN_ATTR_ENC_sempred((RuleContext)_localctx, predIndex); - case 93: - return D_UNKNOWN_sempred((RuleContext)_localctx, predIndex); - case 100: - return HTML_L_COMPONENT_sempred((RuleContext)_localctx, predIndex); - case 149: - return WS_EXPR_ESCAPE_sempred((RuleContext)_localctx, predIndex); - case 152: - return L_OHTER_ESCAPE_sempred((RuleContext)_localctx, predIndex); - case 154: - return OPEN_EXPR_PAREN_sempred((RuleContext)_localctx, predIndex); - case 155: - return CLOSE_EXPR_PAREN_sempred((RuleContext)_localctx, predIndex); - case 156: - return LPAREN_sempred((RuleContext)_localctx, predIndex); - case 157: - return RPAREN_sempred((RuleContext)_localctx, predIndex); - case 158: - return EXIT_RPAREN_sempred((RuleContext)_localctx, predIndex); - case 219: - return PHP_D_NEW_sempred((RuleContext)_localctx, predIndex); - case 249: - return VERBATIM_HTML_sempred((RuleContext)_localctx, predIndex); - case 253: - return BLADE_COMMENT_PEEK_sempred((RuleContext)_localctx, predIndex); - } - return true; - } - private boolean JsFunctionStart_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 0: - return this._input.LA(1) != '{'; - } - return true; - } - private boolean D_PHP_SHORT_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 1: - return this._input.LA(1) == '('; - } - return true; - } - private boolean D_PHP_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 2: - return this._input.LA(1) == ' ' || this._input.LA(1) == '\r' || this._input.LA(1) == '\n'; - } - return true; - } - private boolean D_CUSTOM_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 3: - return this._input.LA(1) == '(' || - (this._input.LA(1) == ' ' && this._input.LA(2) == '('); - } - return true; - } - private boolean D_UNKNOWN_ATTR_ENC_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 4: - return this._input.LA(1) == '"'; - } - return true; - } - private boolean D_UNKNOWN_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 5: - return this._input.LA(1) != '"'; - } - return true; - } - private boolean HTML_L_COMPONENT_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 6: - return this._input.LA(1) == '>'; - } - return true; - } - private boolean WS_EXPR_ESCAPE_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 7: - return this._input.LA(1) == '@'; - } - return true; - } - private boolean L_OHTER_ESCAPE_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 8: - return this._input.LA(1) == '@'; - } - return true; - } - private boolean OPEN_EXPR_PAREN_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 9: - return this.getRoundParenBalance() == 0; - } - return true; - } - private boolean CLOSE_EXPR_PAREN_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 10: - return this.getRoundParenBalance() == 1; - } - return true; - } - private boolean LPAREN_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 11: - return this.getRoundParenBalance() > 0; - } - return true; - } - private boolean RPAREN_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 12: - return this.getRoundParenBalance() > 0; - } - return true; - } - private boolean EXIT_RPAREN_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 13: - return this.getRoundParenBalance() == 0; - } - return true; - } - private boolean PHP_D_NEW_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 14: - return this._input.LA(1) == ' '; - } - return true; - } - private boolean VERBATIM_HTML_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 15: - return - this._input.LA(1) == '@' && - this._input.LA(2) == 'e' && - this._input.LA(3) == 'n' && - this._input.LA(4) == 'd' && - this._input.LA(5) == 'v' && - this._input.LA(6) == 'e' && - this._input.LA(7) == 'r' - ; - } - return true; - } - private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 16: - return - this._input.LA(1) == '-' && - this._input.LA(2) == '-' && - this._input.LA(3) == '}' && - this._input.LA(4) == '}' - ; - } - return true; - } - - private static final String _serializedATNSegment0 = - "\u0004\u0000\u00ab\u0b96\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ - "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ - "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ - "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+ - "\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003"+ - "\u0007\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006"+ - "\u0007\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002"+ - "\n\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002"+ - "\u000e\u0007\u000e\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002"+ - "\u0011\u0007\u0011\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002"+ - "\u0014\u0007\u0014\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002"+ - "\u0017\u0007\u0017\u0002\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002"+ - "\u001a\u0007\u001a\u0002\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002"+ - "\u001d\u0007\u001d\u0002\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002"+ - " \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002"+ - "%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002"+ - "*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002"+ - "/\u0007/\u00020\u00070\u00021\u00071\u00022\u00072\u00023\u00073\u0002"+ - "4\u00074\u00025\u00075\u00026\u00076\u00027\u00077\u00028\u00078\u0002"+ - "9\u00079\u0002:\u0007:\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002"+ - ">\u0007>\u0002?\u0007?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002"+ - "C\u0007C\u0002D\u0007D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002"+ - "H\u0007H\u0002I\u0007I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002"+ - "M\u0007M\u0002N\u0007N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002"+ - "R\u0007R\u0002S\u0007S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002"+ - "W\u0007W\u0002X\u0007X\u0002Y\u0007Y\u0002Z\u0007Z\u0002[\u0007[\u0002"+ - "\\\u0007\\\u0002]\u0007]\u0002^\u0007^\u0002_\u0007_\u0002`\u0007`\u0002"+ - "a\u0007a\u0002b\u0007b\u0002c\u0007c\u0002d\u0007d\u0002e\u0007e\u0002"+ - "f\u0007f\u0002g\u0007g\u0002h\u0007h\u0002i\u0007i\u0002j\u0007j\u0002"+ - "k\u0007k\u0002l\u0007l\u0002m\u0007m\u0002n\u0007n\u0002o\u0007o\u0002"+ - "p\u0007p\u0002q\u0007q\u0002r\u0007r\u0002s\u0007s\u0002t\u0007t\u0002"+ - "u\u0007u\u0002v\u0007v\u0002w\u0007w\u0002x\u0007x\u0002y\u0007y\u0002"+ - "z\u0007z\u0002{\u0007{\u0002|\u0007|\u0002}\u0007}\u0002~\u0007~\u0002"+ - "\u007f\u0007\u007f\u0002\u0080\u0007\u0080\u0002\u0081\u0007\u0081\u0002"+ - "\u0082\u0007\u0082\u0002\u0083\u0007\u0083\u0002\u0084\u0007\u0084\u0002"+ - "\u0085\u0007\u0085\u0002\u0086\u0007\u0086\u0002\u0087\u0007\u0087\u0002"+ - "\u0088\u0007\u0088\u0002\u0089\u0007\u0089\u0002\u008a\u0007\u008a\u0002"+ - "\u008b\u0007\u008b\u0002\u008c\u0007\u008c\u0002\u008d\u0007\u008d\u0002"+ - "\u008e\u0007\u008e\u0002\u008f\u0007\u008f\u0002\u0090\u0007\u0090\u0002"+ - "\u0091\u0007\u0091\u0002\u0092\u0007\u0092\u0002\u0093\u0007\u0093\u0002"+ - "\u0094\u0007\u0094\u0002\u0095\u0007\u0095\u0002\u0096\u0007\u0096\u0002"+ - "\u0097\u0007\u0097\u0002\u0098\u0007\u0098\u0002\u0099\u0007\u0099\u0002"+ - "\u009a\u0007\u009a\u0002\u009b\u0007\u009b\u0002\u009c\u0007\u009c\u0002"+ - "\u009d\u0007\u009d\u0002\u009e\u0007\u009e\u0002\u009f\u0007\u009f\u0002"+ - "\u00a0\u0007\u00a0\u0002\u00a1\u0007\u00a1\u0002\u00a2\u0007\u00a2\u0002"+ - "\u00a3\u0007\u00a3\u0002\u00a4\u0007\u00a4\u0002\u00a5\u0007\u00a5\u0002"+ - "\u00a6\u0007\u00a6\u0002\u00a7\u0007\u00a7\u0002\u00a8\u0007\u00a8\u0002"+ - "\u00a9\u0007\u00a9\u0002\u00aa\u0007\u00aa\u0002\u00ab\u0007\u00ab\u0002"+ - "\u00ac\u0007\u00ac\u0002\u00ad\u0007\u00ad\u0002\u00ae\u0007\u00ae\u0002"+ - "\u00af\u0007\u00af\u0002\u00b0\u0007\u00b0\u0002\u00b1\u0007\u00b1\u0002"+ - "\u00b2\u0007\u00b2\u0002\u00b3\u0007\u00b3\u0002\u00b4\u0007\u00b4\u0002"+ - "\u00b5\u0007\u00b5\u0002\u00b6\u0007\u00b6\u0002\u00b7\u0007\u00b7\u0002"+ - "\u00b8\u0007\u00b8\u0002\u00b9\u0007\u00b9\u0002\u00ba\u0007\u00ba\u0002"+ - "\u00bb\u0007\u00bb\u0002\u00bc\u0007\u00bc\u0002\u00bd\u0007\u00bd\u0002"+ - "\u00be\u0007\u00be\u0002\u00bf\u0007\u00bf\u0002\u00c0\u0007\u00c0\u0002"+ - "\u00c1\u0007\u00c1\u0002\u00c2\u0007\u00c2\u0002\u00c3\u0007\u00c3\u0002"+ - "\u00c4\u0007\u00c4\u0002\u00c5\u0007\u00c5\u0002\u00c6\u0007\u00c6\u0002"+ - "\u00c7\u0007\u00c7\u0002\u00c8\u0007\u00c8\u0002\u00c9\u0007\u00c9\u0002"+ - "\u00ca\u0007\u00ca\u0002\u00cb\u0007\u00cb\u0002\u00cc\u0007\u00cc\u0002"+ - "\u00cd\u0007\u00cd\u0002\u00ce\u0007\u00ce\u0002\u00cf\u0007\u00cf\u0002"+ - "\u00d0\u0007\u00d0\u0002\u00d1\u0007\u00d1\u0002\u00d2\u0007\u00d2\u0002"+ - "\u00d3\u0007\u00d3\u0002\u00d4\u0007\u00d4\u0002\u00d5\u0007\u00d5\u0002"+ - "\u00d6\u0007\u00d6\u0002\u00d7\u0007\u00d7\u0002\u00d8\u0007\u00d8\u0002"+ - "\u00d9\u0007\u00d9\u0002\u00da\u0007\u00da\u0002\u00db\u0007\u00db\u0002"+ - "\u00dc\u0007\u00dc\u0002\u00dd\u0007\u00dd\u0002\u00de\u0007\u00de\u0002"+ - "\u00df\u0007\u00df\u0002\u00e0\u0007\u00e0\u0002\u00e1\u0007\u00e1\u0002"+ - "\u00e2\u0007\u00e2\u0002\u00e3\u0007\u00e3\u0002\u00e4\u0007\u00e4\u0002"+ - "\u00e5\u0007\u00e5\u0002\u00e6\u0007\u00e6\u0002\u00e7\u0007\u00e7\u0002"+ - "\u00e8\u0007\u00e8\u0002\u00e9\u0007\u00e9\u0002\u00ea\u0007\u00ea\u0002"+ - "\u00eb\u0007\u00eb\u0002\u00ec\u0007\u00ec\u0002\u00ed\u0007\u00ed\u0002"+ - "\u00ee\u0007\u00ee\u0002\u00ef\u0007\u00ef\u0002\u00f0\u0007\u00f0\u0002"+ - "\u00f1\u0007\u00f1\u0002\u00f2\u0007\u00f2\u0002\u00f3\u0007\u00f3\u0002"+ - "\u00f4\u0007\u00f4\u0002\u00f5\u0007\u00f5\u0002\u00f6\u0007\u00f6\u0002"+ - "\u00f7\u0007\u00f7\u0002\u00f8\u0007\u00f8\u0002\u00f9\u0007\u00f9\u0002"+ - "\u00fa\u0007\u00fa\u0002\u00fb\u0007\u00fb\u0002\u00fc\u0007\u00fc\u0002"+ - "\u00fd\u0007\u00fd\u0002\u00fe\u0007\u00fe\u0002\u00ff\u0007\u00ff\u0001"+ - "\u0000\u0001\u0000\u0005\u0000\u0211\b\u0000\n\u0000\f\u0000\u0214\t\u0000"+ - "\u0001\u0001\u0003\u0001\u0217\b\u0001\u0001\u0001\u0001\u0001\u0005\u0001"+ - "\u021b\b\u0001\n\u0001\f\u0001\u021e\t\u0001\u0001\u0001\u0003\u0001\u0221"+ - "\b\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0005\u0002\u0226\b\u0002"+ - "\n\u0002\f\u0002\u0229\t\u0002\u0001\u0002\u0001\u0002\u0005\u0002\u022d"+ - "\b\u0002\n\u0002\f\u0002\u0230\t\u0002\u0001\u0002\u0005\u0002\u0233\b"+ - "\u0002\n\u0002\f\u0002\u0236\t\u0002\u0001\u0002\u0005\u0002\u0239\b\u0002"+ - "\n\u0002\f\u0002\u023c\t\u0002\u0001\u0002\u0001\u0002\u0005\u0002\u0240"+ - "\b\u0002\n\u0002\f\u0002\u0243\t\u0002\u0001\u0002\u0001\u0002\u0003\u0002"+ - "\u0247\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0005\u0003\u024c\b"+ - "\u0003\n\u0003\f\u0003\u024f\t\u0003\u0001\u0003\u0005\u0003\u0252\b\u0003"+ - "\n\u0003\f\u0003\u0255\t\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0001\u0003\u0005\u0003\u025c\b\u0003\n\u0003\f\u0003\u025f\t\u0003"+ - "\u0001\u0003\u0005\u0003\u0262\b\u0003\n\u0003\f\u0003\u0265\t\u0003\u0001"+ - "\u0003\u0001\u0003\u0001\u0003\u0003\u0003\u026a\b\u0003\u0001\u0004\u0001"+ - "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0003\u0004\u0271\b\u0004\u0001"+ - "\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u027d\b\u0005\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ - "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ - "\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e"+ - "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ - "\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ - "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010"+ - "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ - "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ - "\u0003\u0010\u02e2\b\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011"+ - "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ - "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ - "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0003\u0011"+ - "\u02f9\b\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ - "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ - "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ - "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ - "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+ - "\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+ - "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016"+ - "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+ - "\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ - "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ - "\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ - "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019"+ - "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+ - "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001a"+ - "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ - "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+ - "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+ - "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ - "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d"+ - "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ - "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ - "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ - "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ - "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f"+ - "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ - "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ - "\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ - " \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001!\u0001"+ - "!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001"+ - "\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001"+ - "#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0001$\u0001"+ - "$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001"+ - "%\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001"+ - "&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001"+ - "\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ - "\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001"+ - "(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001"+ - ")\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001*\u0001"+ - "*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001"+ - "+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u0001"+ - "0\u00010\u00010\u00011\u00011\u00011\u00011\u00011\u00011\u00011\u0001"+ - "1\u00011\u00012\u00012\u00012\u00012\u00012\u00012\u00012\u00012\u0001"+ - "3\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00014\u0001"+ - "4\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u00015\u0001"+ - "5\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u0001"+ - "6\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u0001"+ - "6\u00016\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u0001"+ - "7\u00017\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u00018\u0001"+ - "8\u00018\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u00019\u0001"+ - "9\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001"+ - ":\u0001:\u0001:\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001;\u0001"+ - ";\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001<\u0001"+ - "<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001"+ - "<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001"+ - ">\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001"+ - "?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001"+ - "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001"+ - "A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001"+ - "E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0003"+ - "E\u0518\bE\u0001E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001"+ - "F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001"+ - "F\u0003F\u052d\bF\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001"+ - "G\u0001G\u0001G\u0001G\u0003G\u053a\bG\u0001G\u0001G\u0001H\u0001H\u0001"+ - "H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001"+ - "H\u0001H\u0001H\u0003H\u054d\bH\u0001H\u0001H\u0001I\u0001I\u0001I\u0001"+ - "I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001"+ - "I\u0003I\u055f\bI\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001"+ - "J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001"+ - "K\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ - "L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ - "L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ - "L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ - "L\u0001L\u0001L\u0001L\u0001L\u0003L\u059f\bL\u0001L\u0001L\u0001M\u0001"+ - "M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001"+ - "N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001O\u0001"+ - "O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001"+ - "O\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0003P\u05cb"+ - "\bP\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ - "Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001"+ - "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001"+ - "T\u0001T\u0001T\u0001T\u0003T\u05ee\bT\u0001T\u0001T\u0001T\u0001T\u0001"+ - "T\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+ - "V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ - "V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001"+ - "W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ - "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ - "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ - "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ - "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ - "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ - "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0003X\u0654\bX\u0001Y\u0001Y\u0001"+ - "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ - "\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001"+ - "^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001`\u0001"+ - "`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001"+ - "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0003b\u069a\bb\u0001b\u0001b\u0001"+ - "c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0004"+ - "c\u06a8\bc\u000bc\fc\u06a9\u0003c\u06ac\bc\u0001c\u0001c\u0001d\u0001"+ - "d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001e\u0003e\u06ba"+ - "\be\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0003e\u06c2\be\u0001e\u0001"+ - "e\u0001e\u0005e\u06c7\be\ne\fe\u06ca\te\u0003e\u06cc\be\u0001e\u0001e"+ - "\u0001f\u0001f\u0001f\u0001g\u0001g\u0001g\u0001g\u0001g\u0005g\u06d8"+ - "\bg\ng\fg\u06db\tg\u0001g\u0001g\u0004g\u06df\bg\u000bg\fg\u06e0\u0001"+ - "g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001i\u0001"+ - "i\u0001i\u0001i\u0001i\u0001j\u0001j\u0005j\u06f3\bj\nj\fj\u06f6\tj\u0001"+ - "j\u0001j\u0001j\u0001j\u0001j\u0003j\u06fd\bj\u0001j\u0001j\u0001k\u0005"+ - "k\u0702\bk\nk\fk\u0705\tk\u0001k\u0001k\u0001k\u0004k\u070a\bk\u000bk"+ - "\fk\u070b\u0001k\u0001k\u0003k\u0710\bk\u0001k\u0001k\u0001k\u0001k\u0001"+ - "k\u0005k\u0717\bk\nk\fk\u071a\tk\u0003k\u071c\bk\u0001k\u0001k\u0001l"+ - "\u0005l\u0721\bl\nl\fl\u0724\tl\u0001l\u0001l\u0004l\u0728\bl\u000bl\f"+ - "l\u0729\u0001l\u0004l\u072d\bl\u000bl\fl\u072e\u0001l\u0001l\u0001m\u0001"+ - "m\u0001m\u0001n\u0001n\u0001o\u0004o\u0739\bo\u000bo\fo\u073a\u0001o\u0004"+ - "o\u073e\bo\u000bo\fo\u073f\u0003o\u0742\bo\u0001o\u0001o\u0001p\u0001"+ - "p\u0001p\u0001p\u0001q\u0001q\u0005q\u074c\bq\nq\fq\u074f\tq\u0001r\u0001"+ - "r\u0005r\u0753\br\nr\fr\u0756\tr\u0001s\u0001s\u0005s\u075a\bs\ns\fs\u075d"+ - "\ts\u0001t\u0001t\u0001u\u0001u\u0001u\u0005u\u0764\bu\nu\fu\u0767\tu"+ - "\u0001u\u0001u\u0001v\u0001v\u0001v\u0001v\u0005v\u076f\bv\nv\fv\u0772"+ - "\tv\u0001v\u0001v\u0001w\u0001w\u0001w\u0001w\u0005w\u077a\bw\nw\fw\u077d"+ - "\tw\u0001x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001"+ - "y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001"+ - "y\u0001y\u0003y\u0794\by\u0001z\u0001z\u0001{\u0001{\u0001{\u0001{\u0001"+ - "{\u0001{\u0001{\u0001{\u0001|\u0001|\u0001|\u0001|\u0001|\u0001|\u0001"+ - "}\u0001}\u0001}\u0003}\u07a9\b}\u0004}\u07ab\b}\u000b}\f}\u07ac\u0001"+ - "}\u0001}\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0003~\u07b8"+ - "\b~\u0001~\u0001~\u0001~\u0001~\u0003~\u07be\b~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0004~\u07c8\b~\u000b~\f~\u07c9\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0004~\u07d4\b~\u000b~\f~"+ - "\u07d5\u0001~\u0001~\u0001~\u0003~\u07db\b~\u0003~\u07dd\b~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0003~\u08de\b~\u0001~\u0005~\u08e1\b~\n~\f~\u08e4"+ - "\t~\u0003~\u08e6\b~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f"+ - "\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0081"+ - "\u0003\u0081\u08f3\b\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0004\u0081"+ - "\u08f8\b\u0081\u000b\u0081\f\u0081\u08f9\u0001\u0081\u0001\u0081\u0001"+ - "\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001"+ - "\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001"+ - "\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001"+ - "\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001"+ - "\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0088\u0001"+ - "\u0088\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001"+ - "\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001"+ - "\u008b\u0001\u008b\u0001\u008c\u0003\u008c\u092b\b\u008c\u0001\u008c\u0001"+ - "\u008c\u0001\u008c\u0004\u008c\u0930\b\u008c\u000b\u008c\f\u008c\u0931"+ - "\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d"+ - "\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008f"+ - "\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u0090"+ - "\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0091\u0001\u0091\u0001\u0091"+ - "\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092"+ - "\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094"+ - "\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0004\u0095\u095c\b\u0095"+ - "\u000b\u0095\f\u0095\u095d\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095"+ - "\u0001\u0095\u0001\u0096\u0004\u0096\u0966\b\u0096\u000b\u0096\f\u0096"+ - "\u0967\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001"+ - "\u0097\u0001\u0097\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001"+ - "\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001"+ - "\u0099\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001"+ - "\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001"+ - "\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001"+ - "\u009c\u0001\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001"+ - "\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001"+ - "\u009e\u0001\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ - "\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0004"+ - "\u00a1\u09a5\b\u00a1\u000b\u00a1\f\u00a1\u09a6\u0001\u00a1\u0001\u00a1"+ - "\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3"+ - "\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001\u00a4"+ - "\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5"+ - "\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6"+ - "\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7"+ - "\u0001\u00a8\u0001\u00a8\u0003\u00a8\u09cb\b\u00a8\u0001\u00a9\u0001\u00a9"+ - "\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa"+ - "\u0001\u00ab\u0003\u00ab\u09d6\b\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab"+ - "\u0004\u00ab\u09db\b\u00ab\u000b\u00ab\f\u00ab\u09dc\u0001\u00ab\u0001"+ - "\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001"+ - "\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0001"+ - "\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0001\u00af\u0001"+ - "\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001"+ - "\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0004\u00b2\u09fc\b\u00b2\u000b"+ - "\u00b2\f\u00b2\u09fd\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001"+ - "\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001"+ - "\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5\u0004\u00b5\u0a0e\b\u00b5\u000b"+ - "\u00b5\f\u00b5\u0a0f\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001"+ - "\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001"+ - "\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001"+ - "\u00ba\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001"+ - "\u00bc\u0001\u00bc\u0001\u00bc\u0003\u00bc\u0a2b\b\u00bc\u0001\u00bc\u0001"+ - "\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001"+ - "\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00bf\u0001\u00bf\u0001"+ - "\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001"+ - "\u00c0\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c2\u0001\u00c2\u0001"+ - "\u00c2\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001"+ - "\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c5\u0001"+ - "\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c6\u0001\u00c6\u0001"+ - "\u00c6\u0001\u00c7\u0001\u00c7\u0003\u00c7\u0a5b\b\u00c7\u0001\u00c8\u0001"+ - "\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001"+ - "\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00cb\u0001\u00cb\u0001"+ - "\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cd\u0004\u00cd\u0a6e\b\u00cd\u000b"+ - "\u00cd\f\u00cd\u0a6f\u0001\u00cd\u0001\u00cd\u0001\u00ce\u0001\u00ce\u0001"+ - "\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00d0\u0001\u00d0\u0001"+ - "\u00d0\u0001\u00d0\u0001\u00d0\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001"+ - "\u00d1\u0004\u00d1\u0a83\b\u00d1\u000b\u00d1\f\u00d1\u0a84\u0001\u00d1"+ - "\u0001\u00d1\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0005\u00d2"+ - "\u0a8d\b\u00d2\n\u00d2\f\u00d2\u0a90\t\u00d2\u0001\u00d2\u0001\u00d2\u0001"+ - "\u00d2\u0001\u00d2\u0005\u00d2\u0a96\b\u00d2\n\u00d2\f\u00d2\u0a99\t\u00d2"+ - "\u0001\u00d2\u0001\u00d2\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3"+ - "\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3"+ - "\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d5"+ - "\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d6\u0001\u00d6\u0001\u00d6"+ - "\u0001\u00d6\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d8"+ - "\u0001\u00d8\u0001\u00d8\u0001\u00d8\u0001\u00d9\u0001\u00d9\u0003\u00d9"+ - "\u0abe\b\u00d9\u0001\u00d9\u0001\u00d9\u0001\u00da\u0001\u00da\u0001\u00da"+ - "\u0001\u00da\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db"+ - "\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00dc\u0001\u00dc\u0001\u00dc"+ - "\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dd"+ - "\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00de\u0003\u00de\u0adb\b\u00de"+ - "\u0001\u00de\u0001\u00de\u0001\u00de\u0004\u00de\u0ae0\b\u00de\u000b\u00de"+ - "\f\u00de\u0ae1\u0001\u00de\u0001\u00de\u0001\u00df\u0001\u00df\u0001\u00df"+ - "\u0001\u00df\u0001\u00df\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0"+ - "\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e2"+ - "\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001\u00e3\u0001\u00e3\u0001\u00e3"+ - "\u0001\u00e3\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e5"+ - "\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e6\u0001\u00e6"+ - "\u0001\u00e6\u0001\u00e6\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7"+ - "\u0001\u00e7\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0004\u00e8"+ - "\u0b12\b\u00e8\u000b\u00e8\f\u00e8\u0b13\u0001\u00e8\u0001\u00e8\u0001"+ - "\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0005\u00e9\u0b1c\b\u00e9\n"+ - "\u00e9\f\u00e9\u0b1f\t\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001"+ - "\u00e9\u0001\u00e9\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001"+ - "\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00ec\u0001\u00ec\u0001"+ - "\u00ec\u0001\u00ec\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001"+ - "\u00ee\u0001\u00ee\u0003\u00ee\u0b38\b\u00ee\u0001\u00ee\u0001\u00ee\u0001"+ - "\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00f0\u0001\u00f0\u0001"+ - "\u00f0\u0001\u00f0\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001"+ - "\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f3\u0001"+ - "\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f4\u0001\u00f4\u0001"+ - "\u00f4\u0001\u00f4\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001"+ - "\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f7\u0001"+ - "\u00f7\u0001\u00f7\u0001\u00f7\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ - "\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ - "\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ - "\u00f8\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001"+ - "\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fb\u0001"+ - "\u00fb\u0001\u00fb\u0001\u00fb\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001"+ - "\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fd\u0001"+ - "\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fe\u0001\u00fe\u0001"+ - "\u00fe\u0001\u00fe\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001"+ - "\u00ff\u0003\u0765\u0a8e\u0b1d\u0000\u0100\u000e\u0000\u0010\u0000\u0012"+ - "\u0000\u0014\u0000\u0016\u0000\u0018\u0000\u001a\u0019\u001c\u001a\u001e"+ - "\u001b \u001c\"\u001d$\u001e&\u001f( *!,\".#0$2%4&6\'8(:)<*>+@,B-D.F/"+ - "H0J1L2N3P4R5T6V7X8Z9\\:^;`f?h@jAlBnCpDrEtFvGxHzI|J~K\u0080L\u0082"+ - "M\u0084N\u0086O\u0088P\u008aQ\u008cR\u008eS\u0090T\u0092U\u0094V\u0096"+ - "W\u0098X\u009aY\u009cZ\u009e[\u00a0\\\u00a2]\u00a4^\u00a6_\u00a8`\u00aa"+ - "a\u00acb\u00aec\u00b0d\u00b2e\u00b4f\u00b6\u0000\u00b8g\u00bah\u00bci"+ - "\u00bej\u00c0k\u00c2l\u00c4m\u00c6n\u00c8o\u00cap\u00ccq\u00ce\u00a3\u00d0"+ - "\u00a4\u00d2r\u00d4s\u00d6\u0000\u00d8t\u00dau\u00dcv\u00de\u0000\u00e0"+ - "\u0000\u00e2w\u00e4x\u00e6y\u00e8z\u00ea{\u00ec|\u00ee}\u00f0\u0000\u00f2"+ - "\u0000\u00f4\u0000\u00f6\u0000\u00f8\u0000\u00fa\u0000\u00fc\u0000\u00fe"+ - "\u0000\u0100\u0000\u0102\u0000\u0104~\u0106\u0000\u0108\u0000\u010a\u0000"+ - "\u010c\u0000\u010e\u0000\u0110\u0000\u0112\u0000\u0114\u00a5\u0116\u007f"+ - "\u0118\u00a6\u011a\u00a7\u011c\u00a8\u011e\u0080\u0120\u0000\u0122\u0000"+ - "\u0124\u0000\u0126\u0000\u0128\u0000\u012a\u0000\u012c\u0081\u012e\u0000"+ - "\u0130\u0000\u0132\u0000\u0134\u0082\u0136\u0000\u0138\u0083\u013a\u0084"+ - "\u013c\u0000\u013e\u0000\u0140\u0000\u0142\u0000\u0144\u0000\u0146\u0000"+ - "\u0148\u0000\u014a\u0000\u014c\u0000\u014e\u0000\u0150\u0085\u0152\r\u0154"+ - "\u0000\u0156\u0000\u0158\u0000\u015a\u0000\u015c\u0000\u015e\u0086\u0160"+ - "\u0000\u0162\u0000\u0164\u0000\u0166\u0000\u0168\u0000\u016a\u0000\u016c"+ - "\u0087\u016e\u0088\u0170\u0000\u0172\u0089\u0174\u0000\u0176\u0000\u0178"+ - "\u008a\u017a\u008b\u017c\u008c\u017e\u008d\u0180\u0000\u0182\u008e\u0184"+ - "\u0000\u0186\u0000\u0188\u0000\u018a\u0000\u018c\u0000\u018e\u008f\u0190"+ - "\u000f\u0192\u0090\u0194\u0000\u0196\u0000\u0198\u0000\u019a\u0091\u019c"+ - "\u0011\u019e\u0000\u01a0\u0012\u01a2\u0000\u01a4\u0092\u01a6\u0093\u01a8"+ - "\u0094\u01aa\u0095\u01ac\u0000\u01ae\u0000\u01b0\u0096\u01b2\u0097\u01b4"+ - "\u0098\u01b6\u0000\u01b8\u0000\u01ba\u0000\u01bc\u00a9\u01be\u00aa\u01c0"+ - "\u0000\u01c2\u0000\u01c4\u0000\u01c6\u00ab\u01c8\u0000\u01ca\u0000\u01cc"+ - "\u0000\u01ce\u0000\u01d0\u0000\u01d2\u0000\u01d4\u0000\u01d6\u0099\u01d8"+ - "\u0000\u01da\u009a\u01dc\u009b\u01de\u009c\u01e0\u009d\u01e2\u0000\u01e4"+ - "\u0000\u01e6\u0000\u01e8\u0000\u01ea\u0015\u01ec\u0000\u01ee\u0000\u01f0"+ - "\u0000\u01f2\u0000\u01f4\u0000\u01f6\u0000\u01f8\u0000\u01fa\u0000\u01fc"+ - "\u0000\u01fe\u0000\u0200\u009e\u0202\u0000\u0204\u0000\u0206\u009f\u0208"+ - "\u00a0\u020a\u00a1\u020c\u00a2\u000e\u0000\u0001\u0002\u0003\u0004\u0005"+ - "\u0006\u0007\b\t\n\u000b\f\r\'\u0003\u0000AZaz\u0080\u8000\ufffe\u0006"+ - "\u0000-.0:AZ__az\u0080\u8000\ufffe\u0002\u0000##..\u0006\u0000--0:AZ_"+ - "_az\u0080\u8000\ufffe\u0002\u0000\'\'\\\\\u0002\u0000IIii\u0002\u0000"+ - "FFff\u0002\u0000EEee\u0002\u0000LLll\u0002\u0000SSss\u0002\u0000NNnn\u0002"+ - "\u0000DDdd\u0002\u0000WWww\u0002\u0000TTtt\u0002\u0000CCcc\u0002\u0000"+ - "HHhh\u0002\u0000AAaa\u0002\u0000UUuu\u0002\u0000MMmm\u0002\u0000PPpp\u0002"+ - "\u0000YYyy\u0002\u0000OOoo\u0002\u0000RRrr\u0002\u0000BBbb\u0002\u0000"+ - "KKkk\u0002\u0000XXxx\u0002\u0000JJjj\u0002\u0000GGgg\u0002\u0000VVvv\u0002"+ - "\u0000QQqq\u0003\u0000\n\n\r\r \u0002\u0000\n\n\r\r\u0004\u0000AZ__a"+ - "z\u0080\u8000\ufffe\u0005\u000009AZ__az\u0080\u8000\ufffe\u0006\u0000"+ - "..09AZ__az\u0080\u8000\ufffe\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002"+ - "\u0000\"\"\\\\\u0001\u0000 \u0003\u0000\t\n\r\r \u0bfd\u0000\u001a\u0001"+ - "\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001"+ - "\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000"+ - "\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000"+ - "\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,"+ - "\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000"+ - "\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000"+ - "\u00006\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:"+ - "\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000"+ - "\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000"+ - "\u0000D\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H"+ - "\u0001\u0000\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000"+ - "\u0000\u0000\u0000N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000"+ - "\u0000R\u0001\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V"+ - "\u0001\u0000\u0000\u0000\u0000X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000"+ - "\u0000\u0000\u0000\\\u0001\u0000\u0000\u0000\u0000^\u0001\u0000\u0000"+ - "\u0000\u0000`\u0001\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000\u0000"+ - "d\u0001\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001"+ - "\u0000\u0000\u0000\u0000j\u0001\u0000\u0000\u0000\u0000l\u0001\u0000\u0000"+ - "\u0000\u0000n\u0001\u0000\u0000\u0000\u0000p\u0001\u0000\u0000\u0000\u0000"+ - "r\u0001\u0000\u0000\u0000\u0000t\u0001\u0000\u0000\u0000\u0000v\u0001"+ - "\u0000\u0000\u0000\u0000x\u0001\u0000\u0000\u0000\u0000z\u0001\u0000\u0000"+ - "\u0000\u0000|\u0001\u0000\u0000\u0000\u0000~\u0001\u0000\u0000\u0000\u0000"+ - "\u0080\u0001\u0000\u0000\u0000\u0000\u0082\u0001\u0000\u0000\u0000\u0000"+ - "\u0084\u0001\u0000\u0000\u0000\u0000\u0086\u0001\u0000\u0000\u0000\u0000"+ - "\u0088\u0001\u0000\u0000\u0000\u0000\u008a\u0001\u0000\u0000\u0000\u0000"+ - "\u008c\u0001\u0000\u0000\u0000\u0000\u008e\u0001\u0000\u0000\u0000\u0000"+ - "\u0090\u0001\u0000\u0000\u0000\u0000\u0092\u0001\u0000\u0000\u0000\u0000"+ - "\u0094\u0001\u0000\u0000\u0000\u0000\u0096\u0001\u0000\u0000\u0000\u0000"+ - "\u0098\u0001\u0000\u0000\u0000\u0000\u009a\u0001\u0000\u0000\u0000\u0000"+ - "\u009c\u0001\u0000\u0000\u0000\u0000\u009e\u0001\u0000\u0000\u0000\u0000"+ - "\u00a0\u0001\u0000\u0000\u0000\u0000\u00a2\u0001\u0000\u0000\u0000\u0000"+ - "\u00a4\u0001\u0000\u0000\u0000\u0000\u00a6\u0001\u0000\u0000\u0000\u0000"+ - "\u00a8\u0001\u0000\u0000\u0000\u0000\u00aa\u0001\u0000\u0000\u0000\u0000"+ - "\u00ac\u0001\u0000\u0000\u0000\u0000\u00ae\u0001\u0000\u0000\u0000\u0000"+ - "\u00b0\u0001\u0000\u0000\u0000\u0000\u00b2\u0001\u0000\u0000\u0000\u0000"+ - "\u00b4\u0001\u0000\u0000\u0000\u0000\u00b6\u0001\u0000\u0000\u0000\u0000"+ - "\u00b8\u0001\u0000\u0000\u0000\u0000\u00ba\u0001\u0000\u0000\u0000\u0000"+ - "\u00bc\u0001\u0000\u0000\u0000\u0000\u00be\u0001\u0000\u0000\u0000\u0000"+ - "\u00c0\u0001\u0000\u0000\u0000\u0000\u00c2\u0001\u0000\u0000\u0000\u0000"+ - "\u00c4\u0001\u0000\u0000\u0000\u0000\u00c6\u0001\u0000\u0000\u0000\u0000"+ - "\u00c8\u0001\u0000\u0000\u0000\u0000\u00ca\u0001\u0000\u0000\u0000\u0000"+ - "\u00cc\u0001\u0000\u0000\u0000\u0000\u00ce\u0001\u0000\u0000\u0000\u0000"+ - "\u00d0\u0001\u0000\u0000\u0000\u0000\u00d2\u0001\u0000\u0000\u0000\u0000"+ - "\u00d4\u0001\u0000\u0000\u0000\u0000\u00d6\u0001\u0000\u0000\u0000\u0000"+ - "\u00d8\u0001\u0000\u0000\u0000\u0000\u00da\u0001\u0000\u0000\u0000\u0000"+ - "\u00dc\u0001\u0000\u0000\u0000\u0000\u00de\u0001\u0000\u0000\u0000\u0000"+ - "\u00e0\u0001\u0000\u0000\u0000\u0000\u00e2\u0001\u0000\u0000\u0000\u0000"+ - "\u00e4\u0001\u0000\u0000\u0000\u0000\u00e6\u0001\u0000\u0000\u0000\u0000"+ - "\u00e8\u0001\u0000\u0000\u0000\u0000\u00ea\u0001\u0000\u0000\u0000\u0000"+ - "\u00ec\u0001\u0000\u0000\u0000\u0000\u00ee\u0001\u0000\u0000\u0000\u0000"+ - "\u0104\u0001\u0000\u0000\u0000\u0000\u0106\u0001\u0000\u0000\u0000\u0000"+ - "\u0108\u0001\u0000\u0000\u0000\u0000\u010a\u0001\u0000\u0000\u0000\u0001"+ - "\u010c\u0001\u0000\u0000\u0000\u0001\u010e\u0001\u0000\u0000\u0000\u0001"+ - "\u0110\u0001\u0000\u0000\u0000\u0001\u0112\u0001\u0000\u0000\u0000\u0001"+ - "\u0114\u0001\u0000\u0000\u0000\u0001\u0116\u0001\u0000\u0000\u0000\u0001"+ - "\u0118\u0001\u0000\u0000\u0000\u0001\u011a\u0001\u0000\u0000\u0000\u0001"+ - "\u011c\u0001\u0000\u0000\u0000\u0001\u011e\u0001\u0000\u0000\u0000\u0001"+ - "\u0120\u0001\u0000\u0000\u0000\u0002\u0122\u0001\u0000\u0000\u0000\u0002"+ - "\u0124\u0001\u0000\u0000\u0000\u0002\u0126\u0001\u0000\u0000\u0000\u0002"+ - "\u0128\u0001\u0000\u0000\u0000\u0002\u012a\u0001\u0000\u0000\u0000\u0002"+ - "\u012c\u0001\u0000\u0000\u0000\u0002\u012e\u0001\u0000\u0000\u0000\u0002"+ - "\u0130\u0001\u0000\u0000\u0000\u0002\u0132\u0001\u0000\u0000\u0000\u0002"+ - "\u0134\u0001\u0000\u0000\u0000\u0002\u0136\u0001\u0000\u0000\u0000\u0003"+ - "\u0138\u0001\u0000\u0000\u0000\u0003\u013a\u0001\u0000\u0000\u0000\u0003"+ - "\u013c\u0001\u0000\u0000\u0000\u0003\u013e\u0001\u0000\u0000\u0000\u0003"+ - "\u0140\u0001\u0000\u0000\u0000\u0004\u0142\u0001\u0000\u0000\u0000\u0004"+ - "\u0144\u0001\u0000\u0000\u0000\u0004\u0146\u0001\u0000\u0000\u0000\u0004"+ - "\u0148\u0001\u0000\u0000\u0000\u0004\u014a\u0001\u0000\u0000\u0000\u0004"+ - "\u014c\u0001\u0000\u0000\u0000\u0004\u014e\u0001\u0000\u0000\u0000\u0005"+ - "\u0150\u0001\u0000\u0000\u0000\u0005\u0152\u0001\u0000\u0000\u0000\u0005"+ - "\u0154\u0001\u0000\u0000\u0000\u0006\u0156\u0001\u0000\u0000\u0000\u0006"+ - "\u0158\u0001\u0000\u0000\u0000\u0006\u015a\u0001\u0000\u0000\u0000\u0006"+ - "\u015c\u0001\u0000\u0000\u0000\u0006\u015e\u0001\u0000\u0000\u0000\u0006"+ - "\u0160\u0001\u0000\u0000\u0000\u0006\u0162\u0001\u0000\u0000\u0000\u0006"+ - "\u0164\u0001\u0000\u0000\u0000\u0006\u0166\u0001\u0000\u0000\u0000\u0006"+ - "\u0168\u0001\u0000\u0000\u0000\u0006\u016a\u0001\u0000\u0000\u0000\u0006"+ - "\u016c\u0001\u0000\u0000\u0000\u0006\u016e\u0001\u0000\u0000\u0000\u0006"+ - "\u0170\u0001\u0000\u0000\u0000\u0007\u0172\u0001\u0000\u0000\u0000\u0007"+ - "\u0174\u0001\u0000\u0000\u0000\u0007\u0176\u0001\u0000\u0000\u0000\b\u0178"+ - "\u0001\u0000\u0000\u0000\b\u017a\u0001\u0000\u0000\u0000\b\u017c\u0001"+ - "\u0000\u0000\u0000\b\u017e\u0001\u0000\u0000\u0000\b\u0180\u0001\u0000"+ - "\u0000\u0000\b\u0182\u0001\u0000\u0000\u0000\b\u0184\u0001\u0000\u0000"+ - "\u0000\b\u0186\u0001\u0000\u0000\u0000\b\u0188\u0001\u0000\u0000\u0000"+ - "\b\u018a\u0001\u0000\u0000\u0000\b\u018c\u0001\u0000\u0000\u0000\t\u018e"+ - "\u0001\u0000\u0000\u0000\t\u0190\u0001\u0000\u0000\u0000\t\u0192\u0001"+ - "\u0000\u0000\u0000\t\u0194\u0001\u0000\u0000\u0000\t\u0196\u0001\u0000"+ - "\u0000\u0000\t\u0198\u0001\u0000\u0000\u0000\t\u019a\u0001\u0000\u0000"+ - "\u0000\t\u019c\u0001\u0000\u0000\u0000\t\u019e\u0001\u0000\u0000\u0000"+ - "\t\u01a0\u0001\u0000\u0000\u0000\t\u01a2\u0001\u0000\u0000\u0000\t\u01a4"+ - "\u0001\u0000\u0000\u0000\t\u01a6\u0001\u0000\u0000\u0000\t\u01a8\u0001"+ - "\u0000\u0000\u0000\t\u01aa\u0001\u0000\u0000\u0000\t\u01ac\u0001\u0000"+ - "\u0000\u0000\t\u01ae\u0001\u0000\u0000\u0000\n\u01b0\u0001\u0000\u0000"+ - "\u0000\n\u01b2\u0001\u0000\u0000\u0000\n\u01b4\u0001\u0000\u0000\u0000"+ - "\n\u01b6\u0001\u0000\u0000\u0000\n\u01b8\u0001\u0000\u0000\u0000\n\u01ba"+ - "\u0001\u0000\u0000\u0000\n\u01bc\u0001\u0000\u0000\u0000\n\u01be\u0001"+ - "\u0000\u0000\u0000\n\u01c0\u0001\u0000\u0000\u0000\n\u01c2\u0001\u0000"+ - "\u0000\u0000\n\u01c4\u0001\u0000\u0000\u0000\n\u01c6\u0001\u0000\u0000"+ - "\u0000\n\u01c8\u0001\u0000\u0000\u0000\n\u01ca\u0001\u0000\u0000\u0000"+ - "\n\u01cc\u0001\u0000\u0000\u0000\n\u01ce\u0001\u0000\u0000\u0000\n\u01d0"+ - "\u0001\u0000\u0000\u0000\n\u01d2\u0001\u0000\u0000\u0000\n\u01d4\u0001"+ - "\u0000\u0000\u0000\n\u01d6\u0001\u0000\u0000\u0000\n\u01d8\u0001\u0000"+ - "\u0000\u0000\n\u01da\u0001\u0000\u0000\u0000\u000b\u01dc\u0001\u0000\u0000"+ - "\u0000\u000b\u01de\u0001\u0000\u0000\u0000\u000b\u01e0\u0001\u0000\u0000"+ - "\u0000\u000b\u01e2\u0001\u0000\u0000\u0000\u000b\u01e4\u0001\u0000\u0000"+ - "\u0000\u000b\u01e6\u0001\u0000\u0000\u0000\u000b\u01e8\u0001\u0000\u0000"+ - "\u0000\u000b\u01ea\u0001\u0000\u0000\u0000\u000b\u01ec\u0001\u0000\u0000"+ - "\u0000\u000b\u01ee\u0001\u0000\u0000\u0000\u000b\u01f0\u0001\u0000\u0000"+ - "\u0000\u000b\u01f2\u0001\u0000\u0000\u0000\u000b\u01f4\u0001\u0000\u0000"+ - "\u0000\u000b\u01f6\u0001\u0000\u0000\u0000\u000b\u01f8\u0001\u0000\u0000"+ - "\u0000\u000b\u01fa\u0001\u0000\u0000\u0000\u000b\u01fc\u0001\u0000\u0000"+ - "\u0000\f\u01fe\u0001\u0000\u0000\u0000\f\u0200\u0001\u0000\u0000\u0000"+ - "\f\u0202\u0001\u0000\u0000\u0000\f\u0204\u0001\u0000\u0000\u0000\r\u0206"+ - "\u0001\u0000\u0000\u0000\r\u0208\u0001\u0000\u0000\u0000\r\u020a\u0001"+ - "\u0000\u0000\u0000\r\u020c\u0001\u0000\u0000\u0000\u000e\u020e\u0001\u0000"+ - "\u0000\u0000\u0010\u0220\u0001\u0000\u0000\u0000\u0012\u0222\u0001\u0000"+ - "\u0000\u0000\u0014\u0269\u0001\u0000\u0000\u0000\u0016\u026b\u0001\u0000"+ - "\u0000\u0000\u0018\u027c\u0001\u0000\u0000\u0000\u001a\u027e\u0001\u0000"+ - "\u0000\u0000\u001c\u0284\u0001\u0000\u0000\u0000\u001e\u028e\u0001\u0000"+ - "\u0000\u0000 \u0294\u0001\u0000\u0000\u0000\"\u029b\u0001\u0000\u0000"+ - "\u0000$\u02a5\u0001\u0000\u0000\u0000&\u02ad\u0001\u0000\u0000\u0000("+ - "\u02b6\u0001\u0000\u0000\u0000*\u02c1\u0001\u0000\u0000\u0000,\u02ca\u0001"+ - "\u0000\u0000\u0000.\u02e1\u0001\u0000\u0000\u00000\u02f8\u0001\u0000\u0000"+ - "\u00002\u02fa\u0001\u0000\u0000\u00004\u0305\u0001\u0000\u0000\u00006"+ - "\u0311\u0001\u0000\u0000\u00008\u0318\u0001\u0000\u0000\u0000:\u0320\u0001"+ - "\u0000\u0000\u0000<\u032b\u0001\u0000\u0000\u0000>\u0337\u0001\u0000\u0000"+ - "\u0000@\u0340\u0001\u0000\u0000\u0000B\u034a\u0001\u0000\u0000\u0000D"+ - "\u0353\u0001\u0000\u0000\u0000F\u035f\u0001\u0000\u0000\u0000H\u036a\u0001"+ - "\u0000\u0000\u0000J\u0377\u0001\u0000\u0000\u0000L\u0386\u0001\u0000\u0000"+ - "\u0000N\u0396\u0001\u0000\u0000\u0000P\u03a7\u0001\u0000\u0000\u0000R"+ - "\u03af\u0001\u0000\u0000\u0000T\u03ba\u0001\u0000\u0000\u0000V\u03c0\u0001"+ - "\u0000\u0000\u0000X\u03c8\u0001\u0000\u0000\u0000Z\u03d3\u0001\u0000\u0000"+ - "\u0000\\\u03e1\u0001\u0000\u0000\u0000^\u03f3\u0001\u0000\u0000\u0000"+ - "`\u03ff\u0001\u0000\u0000\u0000b\u0408\u0001\u0000\u0000\u0000d\u0410"+ - "\u0001\u0000\u0000\u0000f\u0416\u0001\u0000\u0000\u0000h\u0421\u0001\u0000"+ - "\u0000\u0000j\u0427\u0001\u0000\u0000\u0000l\u042f\u0001\u0000\u0000\u0000"+ - "n\u0435\u0001\u0000\u0000\u0000p\u043e\u0001\u0000\u0000\u0000r\u0447"+ - "\u0001\u0000\u0000\u0000t\u044f\u0001\u0000\u0000\u0000v\u0458\u0001\u0000"+ - "\u0000\u0000x\u0462\u0001\u0000\u0000\u0000z\u046d\u0001\u0000\u0000\u0000"+ - "|\u0479\u0001\u0000\u0000\u0000~\u0486\u0001\u0000\u0000\u0000\u0080\u0491"+ - "\u0001\u0000\u0000\u0000\u0082\u049d\u0001\u0000\u0000\u0000\u0084\u04a6"+ - "\u0001\u0000\u0000\u0000\u0086\u04b2\u0001\u0000\u0000\u0000\u0088\u04bf"+ - "\u0001\u0000\u0000\u0000\u008a\u04c5\u0001\u0000\u0000\u0000\u008c\u04cf"+ - "\u0001\u0000\u0000\u0000\u008e\u04d8\u0001\u0000\u0000\u0000\u0090\u04e2"+ - "\u0001\u0000\u0000\u0000\u0092\u04ee\u0001\u0000\u0000\u0000\u0094\u04fd"+ - "\u0001\u0000\u0000\u0000\u0096\u0504\u0001\u0000\u0000\u0000\u0098\u0517"+ - "\u0001\u0000\u0000\u0000\u009a\u052c\u0001\u0000\u0000\u0000\u009c\u052e"+ - "\u0001\u0000\u0000\u0000\u009e\u053d\u0001\u0000\u0000\u0000\u00a0\u0550"+ - "\u0001\u0000\u0000\u0000\u00a2\u0560\u0001\u0000\u0000\u0000\u00a4\u0569"+ - "\u0001\u0000\u0000\u0000\u00a6\u059e\u0001\u0000\u0000\u0000\u00a8\u05a2"+ - "\u0001\u0000\u0000\u0000\u00aa\u05ab\u0001\u0000\u0000\u0000\u00ac\u05b6"+ - "\u0001\u0000\u0000\u0000\u00ae\u05ca\u0001\u0000\u0000\u0000\u00b0\u05ce"+ - "\u0001\u0000\u0000\u0000\u00b2\u05d6\u0001\u0000\u0000\u0000\u00b4\u05dd"+ - "\u0001\u0000\u0000\u0000\u00b6\u05e7\u0001\u0000\u0000\u0000\u00b8\u05f4"+ - "\u0001\u0000\u0000\u0000\u00ba\u05fd\u0001\u0000\u0000\u0000\u00bc\u0609"+ - "\u0001\u0000\u0000\u0000\u00be\u0653\u0001\u0000\u0000\u0000\u00c0\u0655"+ - "\u0001\u0000\u0000\u0000\u00c2\u065d\u0001\u0000\u0000\u0000\u00c4\u066f"+ - "\u0001\u0000\u0000\u0000\u00c6\u0675\u0001\u0000\u0000\u0000\u00c8\u0679"+ - "\u0001\u0000\u0000\u0000\u00ca\u067d\u0001\u0000\u0000\u0000\u00cc\u0682"+ - "\u0001\u0000\u0000\u0000\u00ce\u0688\u0001\u0000\u0000\u0000\u00d0\u068c"+ - "\u0001\u0000\u0000\u0000\u00d2\u0699\u0001\u0000\u0000\u0000\u00d4\u069d"+ - "\u0001\u0000\u0000\u0000\u00d6\u06af\u0001\u0000\u0000\u0000\u00d8\u06cb"+ - "\u0001\u0000\u0000\u0000\u00da\u06cf\u0001\u0000\u0000\u0000\u00dc\u06de"+ - "\u0001\u0000\u0000\u0000\u00de\u06e4\u0001\u0000\u0000\u0000\u00e0\u06eb"+ - "\u0001\u0000\u0000\u0000\u00e2\u06fc\u0001\u0000\u0000\u0000\u00e4\u0703"+ - "\u0001\u0000\u0000\u0000\u00e6\u0722\u0001\u0000\u0000\u0000\u00e8\u0732"+ - "\u0001\u0000\u0000\u0000\u00ea\u0735\u0001\u0000\u0000\u0000\u00ec\u0741"+ - "\u0001\u0000\u0000\u0000\u00ee\u0745\u0001\u0000\u0000\u0000\u00f0\u0749"+ - "\u0001\u0000\u0000\u0000\u00f2\u0750\u0001\u0000\u0000\u0000\u00f4\u0757"+ - "\u0001\u0000\u0000\u0000\u00f6\u075e\u0001\u0000\u0000\u0000\u00f8\u0760"+ - "\u0001\u0000\u0000\u0000\u00fa\u076a\u0001\u0000\u0000\u0000\u00fc\u0775"+ - "\u0001\u0000\u0000\u0000\u00fe\u077e\u0001\u0000\u0000\u0000\u0100\u0793"+ - "\u0001\u0000\u0000\u0000\u0102\u0795\u0001\u0000\u0000\u0000\u0104\u0797"+ - "\u0001\u0000\u0000\u0000\u0106\u079f\u0001\u0000\u0000\u0000\u0108\u07a5"+ - "\u0001\u0000\u0000\u0000\u010a\u08e5\u0001\u0000\u0000\u0000\u010c\u08e9"+ - "\u0001\u0000\u0000\u0000\u010e\u08ed\u0001\u0000\u0000\u0000\u0110\u08f2"+ - "\u0001\u0000\u0000\u0000\u0112\u08fd\u0001\u0000\u0000\u0000\u0114\u0901"+ - "\u0001\u0000\u0000\u0000\u0116\u0906\u0001\u0000\u0000\u0000\u0118\u090b"+ - "\u0001\u0000\u0000\u0000\u011a\u090f\u0001\u0000\u0000\u0000\u011c\u0913"+ - "\u0001\u0000\u0000\u0000\u011e\u0918\u0001\u0000\u0000\u0000\u0120\u091c"+ - "\u0001\u0000\u0000\u0000\u0122\u0921\u0001\u0000\u0000\u0000\u0124\u0925"+ - "\u0001\u0000\u0000\u0000\u0126\u092a\u0001\u0000\u0000\u0000\u0128\u0935"+ - "\u0001\u0000\u0000\u0000\u012a\u0939\u0001\u0000\u0000\u0000\u012c\u093e"+ - "\u0001\u0000\u0000\u0000\u012e\u0944\u0001\u0000\u0000\u0000\u0130\u0948"+ - "\u0001\u0000\u0000\u0000\u0132\u094c\u0001\u0000\u0000\u0000\u0134\u0951"+ - "\u0001\u0000\u0000\u0000\u0136\u0955\u0001\u0000\u0000\u0000\u0138\u095b"+ - "\u0001\u0000\u0000\u0000\u013a\u0965\u0001\u0000\u0000\u0000\u013c\u096b"+ - "\u0001\u0000\u0000\u0000\u013e\u0970\u0001\u0000\u0000\u0000\u0140\u0976"+ - "\u0001\u0000\u0000\u0000\u0142\u097b\u0001\u0000\u0000\u0000\u0144\u0981"+ - "\u0001\u0000\u0000\u0000\u0146\u0988\u0001\u0000\u0000\u0000\u0148\u098e"+ - "\u0001\u0000\u0000\u0000\u014a\u0994\u0001\u0000\u0000\u0000\u014c\u099a"+ - "\u0001\u0000\u0000\u0000\u014e\u099e\u0001\u0000\u0000\u0000\u0150\u09a4"+ - "\u0001\u0000\u0000\u0000\u0152\u09aa\u0001\u0000\u0000\u0000\u0154\u09af"+ - "\u0001\u0000\u0000\u0000\u0156\u09b4\u0001\u0000\u0000\u0000\u0158\u09b9"+ - "\u0001\u0000\u0000\u0000\u015a\u09be\u0001\u0000\u0000\u0000\u015c\u09c3"+ - "\u0001\u0000\u0000\u0000\u015e\u09ca\u0001\u0000\u0000\u0000\u0160\u09cc"+ - "\u0001\u0000\u0000\u0000\u0162\u09d0\u0001\u0000\u0000\u0000\u0164\u09d5"+ - "\u0001\u0000\u0000\u0000\u0166\u09e0\u0001\u0000\u0000\u0000\u0168\u09e4"+ - "\u0001\u0000\u0000\u0000\u016a\u09e9\u0001\u0000\u0000\u0000\u016c\u09ee"+ - "\u0001\u0000\u0000\u0000\u016e\u09f1\u0001\u0000\u0000\u0000\u0170\u09f5"+ - "\u0001\u0000\u0000\u0000\u0172\u09fb\u0001\u0000\u0000\u0000\u0174\u0a01"+ - "\u0001\u0000\u0000\u0000\u0176\u0a07\u0001\u0000\u0000\u0000\u0178\u0a0d"+ - "\u0001\u0000\u0000\u0000\u017a\u0a13\u0001\u0000\u0000\u0000\u017c\u0a16"+ - "\u0001\u0000\u0000\u0000\u017e\u0a19\u0001\u0000\u0000\u0000\u0180\u0a1c"+ - "\u0001\u0000\u0000\u0000\u0182\u0a20\u0001\u0000\u0000\u0000\u0184\u0a23"+ - "\u0001\u0000\u0000\u0000\u0186\u0a2a\u0001\u0000\u0000\u0000\u0188\u0a2e"+ - "\u0001\u0000\u0000\u0000\u018a\u0a33\u0001\u0000\u0000\u0000\u018c\u0a37"+ - "\u0001\u0000\u0000\u0000\u018e\u0a3c\u0001\u0000\u0000\u0000\u0190\u0a40"+ - "\u0001\u0000\u0000\u0000\u0192\u0a43\u0001\u0000\u0000\u0000\u0194\u0a46"+ - "\u0001\u0000\u0000\u0000\u0196\u0a4b\u0001\u0000\u0000\u0000\u0198\u0a50"+ - "\u0001\u0000\u0000\u0000\u019a\u0a55\u0001\u0000\u0000\u0000\u019c\u0a5a"+ - "\u0001\u0000\u0000\u0000\u019e\u0a5c\u0001\u0000\u0000\u0000\u01a0\u0a60"+ - "\u0001\u0000\u0000\u0000\u01a2\u0a63\u0001\u0000\u0000\u0000\u01a4\u0a67"+ - "\u0001\u0000\u0000\u0000\u01a6\u0a69\u0001\u0000\u0000\u0000\u01a8\u0a6d"+ - "\u0001\u0000\u0000\u0000\u01aa\u0a73\u0001\u0000\u0000\u0000\u01ac\u0a75"+ - "\u0001\u0000\u0000\u0000\u01ae\u0a79\u0001\u0000\u0000\u0000\u01b0\u0a7e"+ - "\u0001\u0000\u0000\u0000\u01b2\u0a88\u0001\u0000\u0000\u0000\u01b4\u0a9c"+ - "\u0001\u0000\u0000\u0000\u01b6\u0aa6\u0001\u0000\u0000\u0000\u01b8\u0aab"+ - "\u0001\u0000\u0000\u0000\u01ba\u0aaf\u0001\u0000\u0000\u0000\u01bc\u0ab3"+ - "\u0001\u0000\u0000\u0000\u01be\u0ab7\u0001\u0000\u0000\u0000\u01c0\u0abd"+ - "\u0001\u0000\u0000\u0000\u01c2\u0ac1\u0001\u0000\u0000\u0000\u01c4\u0ac5"+ - "\u0001\u0000\u0000\u0000\u01c6\u0acd\u0001\u0000\u0000\u0000\u01c8\u0ad5"+ - "\u0001\u0000\u0000\u0000\u01ca\u0ada\u0001\u0000\u0000\u0000\u01cc\u0ae5"+ - "\u0001\u0000\u0000\u0000\u01ce\u0aea\u0001\u0000\u0000\u0000\u01d0\u0aee"+ - "\u0001\u0000\u0000\u0000\u01d2\u0af3\u0001\u0000\u0000\u0000\u01d4\u0af7"+ - "\u0001\u0000\u0000\u0000\u01d6\u0afb\u0001\u0000\u0000\u0000\u01d8\u0aff"+ - "\u0001\u0000\u0000\u0000\u01da\u0b04\u0001\u0000\u0000\u0000\u01dc\u0b08"+ - "\u0001\u0000\u0000\u0000\u01de\u0b0d\u0001\u0000\u0000\u0000\u01e0\u0b17"+ - "\u0001\u0000\u0000\u0000\u01e2\u0b25\u0001\u0000\u0000\u0000\u01e4\u0b29"+ - "\u0001\u0000\u0000\u0000\u01e6\u0b2d\u0001\u0000\u0000\u0000\u01e8\u0b31"+ - "\u0001\u0000\u0000\u0000\u01ea\u0b37\u0001\u0000\u0000\u0000\u01ec\u0b3b"+ - "\u0001\u0000\u0000\u0000\u01ee\u0b3f\u0001\u0000\u0000\u0000\u01f0\u0b43"+ - "\u0001\u0000\u0000\u0000\u01f2\u0b47\u0001\u0000\u0000\u0000\u01f4\u0b4c"+ - "\u0001\u0000\u0000\u0000\u01f6\u0b51\u0001\u0000\u0000\u0000\u01f8\u0b55"+ - "\u0001\u0000\u0000\u0000\u01fa\u0b59\u0001\u0000\u0000\u0000\u01fc\u0b5e"+ - "\u0001\u0000\u0000\u0000\u01fe\u0b62\u0001\u0000\u0000\u0000\u0200\u0b72"+ - "\u0001\u0000\u0000\u0000\u0202\u0b77\u0001\u0000\u0000\u0000\u0204\u0b7c"+ - "\u0001\u0000\u0000\u0000\u0206\u0b80\u0001\u0000\u0000\u0000\u0208\u0b88"+ - "\u0001\u0000\u0000\u0000\u020a\u0b8d\u0001\u0000\u0000\u0000\u020c\u0b91"+ - "\u0001\u0000\u0000\u0000\u020e\u0212\u0007\u0000\u0000\u0000\u020f\u0211"+ - "\u0007\u0001\u0000\u0000\u0210\u020f\u0001\u0000\u0000\u0000\u0211\u0214"+ - "\u0001\u0000\u0000\u0000\u0212\u0210\u0001\u0000\u0000\u0000\u0212\u0213"+ - "\u0001\u0000\u0000\u0000\u0213\u000f\u0001\u0000\u0000\u0000\u0214\u0212"+ - "\u0001\u0000\u0000\u0000\u0215\u0217\u0007\u0002\u0000\u0000\u0216\u0215"+ - "\u0001\u0000\u0000\u0000\u0216\u0217\u0001\u0000\u0000\u0000\u0217\u0218"+ - "\u0001\u0000\u0000\u0000\u0218\u021c\u0007\u0000\u0000\u0000\u0219\u021b"+ - "\u0007\u0003\u0000\u0000\u021a\u0219\u0001\u0000\u0000\u0000\u021b\u021e"+ - "\u0001\u0000\u0000\u0000\u021c\u021a\u0001\u0000\u0000\u0000\u021c\u021d"+ - "\u0001\u0000\u0000\u0000\u021d\u0221\u0001\u0000\u0000\u0000\u021e\u021c"+ - "\u0001\u0000\u0000\u0000\u021f\u0221\u0003\u0016\u0004\u0000\u0220\u0216"+ - "\u0001\u0000\u0000\u0000\u0220\u021f\u0001\u0000\u0000\u0000\u0221\u0011"+ - "\u0001\u0000\u0000\u0000\u0222\u0223\u0003\u00f0q\u0000\u0223\u0227\u0005"+ - "(\u0000\u0000\u0224\u0226\u0003\u00f0q\u0000\u0225\u0224\u0001\u0000\u0000"+ - "\u0000\u0226\u0229\u0001\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000"+ - "\u0000\u0227\u0228\u0001\u0000\u0000\u0000\u0228\u0234\u0001\u0000\u0000"+ - "\u0000\u0229\u0227\u0001\u0000\u0000\u0000\u022a\u022e\u0005,\u0000\u0000"+ - "\u022b\u022d\u0005 \u0000\u0000\u022c\u022b\u0001\u0000\u0000\u0000\u022d"+ - "\u0230\u0001\u0000\u0000\u0000\u022e\u022c\u0001\u0000\u0000\u0000\u022e"+ - "\u022f\u0001\u0000\u0000\u0000\u022f\u0231\u0001\u0000\u0000\u0000\u0230"+ - "\u022e\u0001\u0000\u0000\u0000\u0231\u0233\u0003\u00f0q\u0000\u0232\u022a"+ - "\u0001\u0000\u0000\u0000\u0233\u0236\u0001\u0000\u0000\u0000\u0234\u0232"+ - "\u0001\u0000\u0000\u0000\u0234\u0235\u0001\u0000\u0000\u0000\u0235\u023a"+ - "\u0001\u0000\u0000\u0000\u0236\u0234\u0001\u0000\u0000\u0000\u0237\u0239"+ - "\u0005 \u0000\u0000\u0238\u0237\u0001\u0000\u0000\u0000\u0239\u023c\u0001"+ - "\u0000\u0000\u0000\u023a\u0238\u0001\u0000\u0000\u0000\u023a\u023b\u0001"+ - "\u0000\u0000\u0000\u023b\u023d\u0001\u0000\u0000\u0000\u023c\u023a\u0001"+ - "\u0000\u0000\u0000\u023d\u0241\u0005)\u0000\u0000\u023e\u0240\u0005 \u0000"+ - "\u0000\u023f\u023e\u0001\u0000\u0000\u0000\u0240\u0243\u0001\u0000\u0000"+ - "\u0000\u0241\u023f\u0001\u0000\u0000\u0000\u0241\u0242\u0001\u0000\u0000"+ - "\u0000\u0242\u0246\u0001\u0000\u0000\u0000\u0243\u0241\u0001\u0000\u0000"+ - "\u0000\u0244\u0245\u0005{\u0000\u0000\u0245\u0247\u0004\u0002\u0000\u0000"+ - "\u0246\u0244\u0001\u0000\u0000\u0000\u0246\u0247\u0001\u0000\u0000\u0000"+ - "\u0247\u0013\u0001\u0000\u0000\u0000\u0248\u0249\u0007\u0004\u0000\u0000"+ - "\u0249\u0253\u0003\u0010\u0001\u0000\u024a\u024c\u0005 \u0000\u0000\u024b"+ - "\u024a\u0001\u0000\u0000\u0000\u024c\u024f\u0001\u0000\u0000\u0000\u024d"+ - "\u024b\u0001\u0000\u0000\u0000\u024d\u024e\u0001\u0000\u0000\u0000\u024e"+ - "\u0250\u0001\u0000\u0000\u0000\u024f\u024d\u0001\u0000\u0000\u0000\u0250"+ - "\u0252\u0003\u0010\u0001\u0000\u0251\u024d\u0001\u0000\u0000\u0000\u0252"+ - "\u0255\u0001\u0000\u0000\u0000\u0253\u0251\u0001\u0000\u0000\u0000\u0253"+ - "\u0254\u0001\u0000\u0000\u0000\u0254\u0256\u0001\u0000\u0000\u0000\u0255"+ - "\u0253\u0001\u0000\u0000\u0000\u0256\u0257\u0007\u0004\u0000\u0000\u0257"+ - "\u026a\u0001\u0000\u0000\u0000\u0258\u0259\u0005\"\u0000\u0000\u0259\u0263"+ - "\u0003\u0010\u0001\u0000\u025a\u025c\u0005 \u0000\u0000\u025b\u025a\u0001"+ - "\u0000\u0000\u0000\u025c\u025f\u0001\u0000\u0000\u0000\u025d\u025b\u0001"+ - "\u0000\u0000\u0000\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u0260\u0001"+ - "\u0000\u0000\u0000\u025f\u025d\u0001\u0000\u0000\u0000\u0260\u0262\u0003"+ - "\u0010\u0001\u0000\u0261\u025d\u0001\u0000\u0000\u0000\u0262\u0265\u0001"+ - "\u0000\u0000\u0000\u0263\u0261\u0001\u0000\u0000\u0000\u0263\u0264\u0001"+ - "\u0000\u0000\u0000\u0264\u0266\u0001\u0000\u0000\u0000\u0265\u0263\u0001"+ - "\u0000\u0000\u0000\u0266\u0267\u0007\u0004\u0000\u0000\u0267\u0268\u0005"+ - "\"\u0000\u0000\u0268\u026a\u0001\u0000\u0000\u0000\u0269\u0248\u0001\u0000"+ - "\u0000\u0000\u0269\u0258\u0001\u0000\u0000\u0000\u026a\u0015\u0001\u0000"+ - "\u0000\u0000\u026b\u026c\u0005[\u0000\u0000\u026c\u0270\u0003\u00f4s\u0000"+ - "\u026d\u026e\u0003\u00ean\u0000\u026e\u026f\u0003\u0018\u0005\u0000\u026f"+ - "\u0271\u0001\u0000\u0000\u0000\u0270\u026d\u0001\u0000\u0000\u0000\u0270"+ - "\u0271\u0001\u0000\u0000\u0000\u0271\u0272\u0001\u0000\u0000\u0000\u0272"+ - "\u0273\u0005]\u0000\u0000\u0273\u0017\u0001\u0000\u0000\u0000\u0274\u0275"+ - "\u0005\"\u0000\u0000\u0275\u0276\u0003\u00f4s\u0000\u0276\u0277\u0005"+ - "\"\u0000\u0000\u0277\u027d\u0001\u0000\u0000\u0000\u0278\u0279\u0007\u0004"+ - "\u0000\u0000\u0279\u027a\u0003\u00f4s\u0000\u027a\u027b\u0007\u0004\u0000"+ - "\u0000\u027b\u027d\u0001\u0000\u0000\u0000\u027c\u0274\u0001\u0000\u0000"+ - "\u0000\u027c\u0278\u0001\u0000\u0000\u0000\u027d\u0019\u0001\u0000\u0000"+ - "\u0000\u027e\u027f\u0005@\u0000\u0000\u027f\u0280\u0007\u0005\u0000\u0000"+ - "\u0280\u0281\u0007\u0006\u0000\u0000\u0281\u0282\u0001\u0000\u0000\u0000"+ - "\u0282\u0283\u0006\u0006\u0000\u0000\u0283\u001b\u0001\u0000\u0000\u0000"+ - "\u0284\u0285\u0005@\u0000\u0000\u0285\u0286\u0007\u0007\u0000\u0000\u0286"+ - "\u0287\u0007\b\u0000\u0000\u0287\u0288\u0007\t\u0000\u0000\u0288\u0289"+ - "\u0007\u0007\u0000\u0000\u0289\u028a\u0007\u0005\u0000\u0000\u028a\u028b"+ - "\u0007\u0006\u0000\u0000\u028b\u028c\u0001\u0000\u0000\u0000\u028c\u028d"+ - "\u0006\u0007\u0000\u0000\u028d\u001d\u0001\u0000\u0000\u0000\u028e\u028f"+ - "\u0005@\u0000\u0000\u028f\u0290\u0007\u0007\u0000\u0000\u0290\u0291\u0007"+ - "\b\u0000\u0000\u0291\u0292\u0007\t\u0000\u0000\u0292\u0293\u0007\u0007"+ - "\u0000\u0000\u0293\u001f\u0001\u0000\u0000\u0000\u0294\u0295\u0005@\u0000"+ - "\u0000\u0295\u0296\u0007\u0007\u0000\u0000\u0296\u0297\u0007\n\u0000\u0000"+ - "\u0297\u0298\u0007\u000b\u0000\u0000\u0298\u0299\u0007\u0005\u0000\u0000"+ - "\u0299\u029a\u0007\u0006\u0000\u0000\u029a!\u0001\u0000\u0000\u0000\u029b"+ - "\u029c\u0005@\u0000\u0000\u029c\u029d\u0007\t\u0000\u0000\u029d\u029e"+ - "\u0007\f\u0000\u0000\u029e\u029f\u0007\u0005\u0000\u0000\u029f\u02a0\u0007"+ - "\r\u0000\u0000\u02a0\u02a1\u0007\u000e\u0000\u0000\u02a1\u02a2\u0007\u000f"+ - "\u0000\u0000\u02a2\u02a3\u0001\u0000\u0000\u0000\u02a3\u02a4\u0006\n\u0001"+ - "\u0000\u02a4#\u0001\u0000\u0000\u0000\u02a5\u02a6\u0005@\u0000\u0000\u02a6"+ - "\u02a7\u0007\u000e\u0000\u0000\u02a7\u02a8\u0007\u0010\u0000\u0000\u02a8"+ - "\u02a9\u0007\t\u0000\u0000\u02a9\u02aa\u0007\u0007\u0000\u0000\u02aa\u02ab"+ - "\u0001\u0000\u0000\u0000\u02ab\u02ac\u0006\u000b\u0001\u0000\u02ac%\u0001"+ - "\u0000\u0000\u0000\u02ad\u02ae\u0005@\u0000\u0000\u02ae\u02af\u0007\u000b"+ - "\u0000\u0000\u02af\u02b0\u0007\u0007\u0000\u0000\u02b0\u02b1\u0007\u0006"+ - "\u0000\u0000\u02b1\u02b2\u0007\u0010\u0000\u0000\u02b2\u02b3\u0007\u0011"+ - "\u0000\u0000\u02b3\u02b4\u0007\b\u0000\u0000\u02b4\u02b5\u0007\r\u0000"+ - "\u0000\u02b5\'\u0001\u0000\u0000\u0000\u02b6\u02b7\u0005@\u0000\u0000"+ - "\u02b7\u02b8\u0007\u0007\u0000\u0000\u02b8\u02b9\u0007\n\u0000\u0000\u02b9"+ - "\u02ba\u0007\u000b\u0000\u0000\u02ba\u02bb\u0007\t\u0000\u0000\u02bb\u02bc"+ - "\u0007\f\u0000\u0000\u02bc\u02bd\u0007\u0005\u0000\u0000\u02bd\u02be\u0007"+ - "\r\u0000\u0000\u02be\u02bf\u0007\u000e\u0000\u0000\u02bf\u02c0\u0007\u000f"+ - "\u0000\u0000\u02c0)\u0001\u0000\u0000\u0000\u02c1\u02c2\u0005@\u0000\u0000"+ - "\u02c2\u02c3\u0007\u0007\u0000\u0000\u02c3\u02c4\u0007\u0012\u0000\u0000"+ - "\u02c4\u02c5\u0007\u0013\u0000\u0000\u02c5\u02c6\u0007\r\u0000\u0000\u02c6"+ - "\u02c7\u0007\u0014\u0000\u0000\u02c7\u02c8\u0001\u0000\u0000\u0000\u02c8"+ - "\u02c9\u0006\u000e\u0000\u0000\u02c9+\u0001\u0000\u0000\u0000\u02ca\u02cb"+ - "\u0005@\u0000\u0000\u02cb\u02cc\u0007\u0007\u0000\u0000\u02cc\u02cd\u0007"+ - "\n\u0000\u0000\u02cd\u02ce\u0007\u000b\u0000\u0000\u02ce\u02cf\u0007\u0007"+ - "\u0000\u0000\u02cf\u02d0\u0007\u0012\u0000\u0000\u02d0\u02d1\u0007\u0013"+ - "\u0000\u0000\u02d1\u02d2\u0007\r\u0000\u0000\u02d2\u02d3\u0007\u0014\u0000"+ - "\u0000\u02d3-\u0001\u0000\u0000\u0000\u02d4\u02d5\u0005@\u0000\u0000\u02d5"+ - "\u02d6\u0007\u0011\u0000\u0000\u02d6\u02d7\u0007\n\u0000\u0000\u02d7\u02d8"+ - "\u0007\b\u0000\u0000\u02d8\u02d9\u0007\u0007\u0000\u0000\u02d9\u02da\u0007"+ - "\t\u0000\u0000\u02da\u02e2\u0007\t\u0000\u0000\u02db\u02dc\u0005@\u0000"+ - "\u0000\u02dc\u02dd\u0007\u0005\u0000\u0000\u02dd\u02de\u0007\t\u0000\u0000"+ - "\u02de\u02df\u0007\t\u0000\u0000\u02df\u02e0\u0007\u0007\u0000\u0000\u02e0"+ - "\u02e2\u0007\r\u0000\u0000\u02e1\u02d4\u0001\u0000\u0000\u0000\u02e1\u02db"+ - "\u0001\u0000\u0000\u0000\u02e2\u02e3\u0001\u0000\u0000\u0000\u02e3\u02e4"+ - "\u0006\u0010\u0000\u0000\u02e4/\u0001\u0000\u0000\u0000\u02e5\u02e6\u0005"+ - "@\u0000\u0000\u02e6\u02e7\u0007\u0007\u0000\u0000\u02e7\u02e8\u0007\n"+ - "\u0000\u0000\u02e8\u02e9\u0007\u000b\u0000\u0000\u02e9\u02ea\u0007\u0011"+ - "\u0000\u0000\u02ea\u02eb\u0007\n\u0000\u0000\u02eb\u02ec\u0007\b\u0000"+ - "\u0000\u02ec\u02ed\u0007\u0007\u0000\u0000\u02ed\u02ee\u0007\t\u0000\u0000"+ - "\u02ee\u02f9\u0007\t\u0000\u0000\u02ef\u02f0\u0005@\u0000\u0000\u02f0"+ - "\u02f1\u0007\u0007\u0000\u0000\u02f1\u02f2\u0007\n\u0000\u0000\u02f2\u02f3"+ - "\u0007\u000b\u0000\u0000\u02f3\u02f4\u0007\u0005\u0000\u0000\u02f4\u02f5"+ - "\u0007\t\u0000\u0000\u02f5\u02f6\u0007\t\u0000\u0000\u02f6\u02f7\u0007"+ - "\u0007\u0000\u0000\u02f7\u02f9\u0007\r\u0000\u0000\u02f8\u02e5\u0001\u0000"+ - "\u0000\u0000\u02f8\u02ef\u0001\u0000\u0000\u0000\u02f91\u0001\u0000\u0000"+ - "\u0000\u02fa\u02fb\u0005@\u0000\u0000\u02fb\u02fc\u0007\u0006\u0000\u0000"+ - "\u02fc\u02fd\u0007\u0015\u0000\u0000\u02fd\u02fe\u0007\u0016\u0000\u0000"+ - "\u02fe\u02ff\u0007\u0007\u0000\u0000\u02ff\u0300\u0007\u0010\u0000\u0000"+ - "\u0300\u0301\u0007\u000e\u0000\u0000\u0301\u0302\u0007\u000f\u0000\u0000"+ - "\u0302\u0303\u0001\u0000\u0000\u0000\u0303\u0304\u0006\u0012\u0002\u0000"+ - "\u03043\u0001\u0000\u0000\u0000\u0305\u0306\u0005@\u0000\u0000\u0306\u0307"+ - "\u0007\u0007\u0000\u0000\u0307\u0308\u0007\n\u0000\u0000\u0308\u0309\u0007"+ - "\u000b\u0000\u0000\u0309\u030a\u0007\u0006\u0000\u0000\u030a\u030b\u0007"+ - "\u0015\u0000\u0000\u030b\u030c\u0007\u0016\u0000\u0000\u030c\u030d\u0007"+ - "\u0007\u0000\u0000\u030d\u030e\u0007\u0010\u0000\u0000\u030e\u030f\u0007"+ - "\u000e\u0000\u0000\u030f\u0310\u0007\u000f\u0000\u0000\u03105\u0001\u0000"+ - "\u0000\u0000\u0311\u0312\u0005@\u0000\u0000\u0312\u0313\u0007\u0006\u0000"+ - "\u0000\u0313\u0314\u0007\u0015\u0000\u0000\u0314\u0315\u0007\u0016\u0000"+ - "\u0000\u0315\u0316\u0001\u0000\u0000\u0000\u0316\u0317\u0006\u0014\u0001"+ - "\u0000\u03177\u0001\u0000\u0000\u0000\u0318\u0319\u0005@\u0000\u0000\u0319"+ - "\u031a\u0007\u0007\u0000\u0000\u031a\u031b\u0007\n\u0000\u0000\u031b\u031c"+ - "\u0007\u000b\u0000\u0000\u031c\u031d\u0007\u0006\u0000\u0000\u031d\u031e"+ - "\u0007\u0015\u0000\u0000\u031e\u031f\u0007\u0016\u0000\u0000\u031f9\u0001"+ - "\u0000\u0000\u0000\u0320\u0321\u0005@\u0000\u0000\u0321\u0322\u0007\u0006"+ - "\u0000\u0000\u0322\u0323\u0007\u0015\u0000\u0000\u0323\u0324\u0007\u0016"+ - "\u0000\u0000\u0324\u0325\u0007\u0007\u0000\u0000\u0325\u0326\u0007\b\u0000"+ - "\u0000\u0326\u0327\u0007\t\u0000\u0000\u0327\u0328\u0007\u0007\u0000\u0000"+ - "\u0328\u0329\u0001\u0000\u0000\u0000\u0329\u032a\u0006\u0016\u0002\u0000"+ - "\u032a;\u0001\u0000\u0000\u0000\u032b\u032c\u0005@\u0000\u0000\u032c\u032d"+ - "\u0007\u0007\u0000\u0000\u032d\u032e\u0007\n\u0000\u0000\u032e\u032f\u0007"+ - "\u000b\u0000\u0000\u032f\u0330\u0007\u0006\u0000\u0000\u0330\u0331\u0007"+ - "\u0015\u0000\u0000\u0331\u0332\u0007\u0016\u0000\u0000\u0332\u0333\u0007"+ - "\u0007\u0000\u0000\u0333\u0334\u0007\b\u0000\u0000\u0334\u0335\u0007\t"+ - "\u0000\u0000\u0335\u0336\u0007\u0007\u0000\u0000\u0336=\u0001\u0000\u0000"+ - "\u0000\u0337\u0338\u0005@\u0000\u0000\u0338\u0339\u0007\f\u0000\u0000"+ - "\u0339\u033a\u0007\u000f\u0000\u0000\u033a\u033b\u0007\u0005\u0000\u0000"+ - "\u033b\u033c\u0007\b\u0000\u0000\u033c\u033d\u0007\u0007\u0000\u0000\u033d"+ - "\u033e\u0001\u0000\u0000\u0000\u033e\u033f\u0006\u0018\u0001\u0000\u033f"+ - "?\u0001\u0000\u0000\u0000\u0340\u0341\u0005@\u0000\u0000\u0341\u0342\u0007"+ - "\u0007\u0000\u0000\u0342\u0343\u0007\n\u0000\u0000\u0343\u0344\u0007\u000b"+ - "\u0000\u0000\u0344\u0345\u0007\f\u0000\u0000\u0345\u0346\u0007\u000f\u0000"+ - "\u0000\u0346\u0347\u0007\u0005\u0000\u0000\u0347\u0348\u0007\b\u0000\u0000"+ - "\u0348\u0349\u0007\u0007\u0000\u0000\u0349A\u0001\u0000\u0000\u0000\u034a"+ - "\u034b\u0005@\u0000\u0000\u034b\u034c\u0007\u0017\u0000\u0000\u034c\u034d"+ - "\u0007\u0016\u0000\u0000\u034d\u034e\u0007\u0007\u0000\u0000\u034e\u034f"+ - "\u0007\u0010\u0000\u0000\u034f\u0350\u0007\u0018\u0000\u0000\u0350\u0351"+ - "\u0001\u0000\u0000\u0000\u0351\u0352\u0006\u001a\u0001\u0000\u0352C\u0001"+ - "\u0000\u0000\u0000\u0353\u0354\u0005@\u0000\u0000\u0354\u0355\u0007\u000e"+ - "\u0000\u0000\u0355\u0356\u0007\u0015\u0000\u0000\u0356\u0357\u0007\n\u0000"+ - "\u0000\u0357\u0358\u0007\r\u0000\u0000\u0358\u0359\u0007\u0005\u0000\u0000"+ - "\u0359\u035a\u0007\n\u0000\u0000\u035a\u035b\u0007\u0011\u0000\u0000\u035b"+ - "\u035c\u0007\u0007\u0000\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d"+ - "\u035e\u0006\u001b\u0001\u0000\u035eE\u0001\u0000\u0000\u0000\u035f\u0360"+ - "\u0005@\u0000\u0000\u0360\u0361\u0007\u0005\u0000\u0000\u0361\u0362\u0007"+ - "\n\u0000\u0000\u0362\u0363\u0007\u000e\u0000\u0000\u0363\u0364\u0007\b"+ - "\u0000\u0000\u0364\u0365\u0007\u0011\u0000\u0000\u0365\u0366\u0007\u000b"+ - "\u0000\u0000\u0366\u0367\u0007\u0007\u0000\u0000\u0367\u0368\u0001\u0000"+ - "\u0000\u0000\u0368\u0369\u0006\u001c\u0003\u0000\u0369G\u0001\u0000\u0000"+ - "\u0000\u036a\u036b\u0005@\u0000\u0000\u036b\u036c\u0007\u0005\u0000\u0000"+ - "\u036c\u036d\u0007\n\u0000\u0000\u036d\u036e\u0007\u000e\u0000\u0000\u036e"+ - "\u036f\u0007\b\u0000\u0000\u036f\u0370\u0007\u0011\u0000\u0000\u0370\u0371"+ - "\u0007\u000b\u0000\u0000\u0371\u0372\u0007\u0007\u0000\u0000\u0372\u0373"+ - "\u0007\u0005\u0000\u0000\u0373\u0374\u0007\u0006\u0000\u0000\u0374\u0375"+ - "\u0001\u0000\u0000\u0000\u0375\u0376\u0006\u001d\u0003\u0000\u0376I\u0001"+ - "\u0000\u0000\u0000\u0377\u0378\u0005@\u0000\u0000\u0378\u0379\u0007\u0005"+ - "\u0000\u0000\u0379\u037a\u0007\n\u0000\u0000\u037a\u037b\u0007\u000e\u0000"+ - "\u0000\u037b\u037c\u0007\b\u0000\u0000\u037c\u037d\u0007\u0011\u0000\u0000"+ - "\u037d\u037e\u0007\u000b\u0000\u0000\u037e\u037f\u0007\u0007\u0000\u0000"+ - "\u037f\u0380\u0007\f\u0000\u0000\u0380\u0381\u0007\u000f\u0000\u0000\u0381"+ - "\u0382\u0007\u0007\u0000\u0000\u0382\u0383\u0007\n\u0000\u0000\u0383\u0384"+ - "\u0001\u0000\u0000\u0000\u0384\u0385\u0006\u001e\u0003\u0000\u0385K\u0001"+ - "\u0000\u0000\u0000\u0386\u0387\u0005@\u0000\u0000\u0387\u0388\u0007\u0005"+ - "\u0000\u0000\u0388\u0389\u0007\n\u0000\u0000\u0389\u038a\u0007\u000e\u0000"+ - "\u0000\u038a\u038b\u0007\b\u0000\u0000\u038b\u038c\u0007\u0011\u0000\u0000"+ - "\u038c\u038d\u0007\u000b\u0000\u0000\u038d\u038e\u0007\u0007\u0000\u0000"+ - "\u038e\u038f\u0007\u0006\u0000\u0000\u038f\u0390\u0007\u0005\u0000\u0000"+ - "\u0390\u0391\u0007\u0016\u0000\u0000\u0391\u0392\u0007\t\u0000\u0000\u0392"+ - "\u0393\u0007\r\u0000\u0000\u0393\u0394\u0001\u0000\u0000\u0000\u0394\u0395"+ - "\u0006\u001f\u0003\u0000\u0395M\u0001\u0000\u0000\u0000\u0396\u0397\u0005"+ - "@\u0000\u0000\u0397\u0398\u0007\u0005\u0000\u0000\u0398\u0399\u0007\n"+ - "\u0000\u0000\u0399\u039a\u0007\u000e\u0000\u0000\u039a\u039b\u0007\b\u0000"+ - "\u0000\u039b\u039c\u0007\u0011\u0000\u0000\u039c\u039d\u0007\u000b\u0000"+ - "\u0000\u039d\u039e\u0007\u0007\u0000\u0000\u039e\u039f\u0007\u0011\u0000"+ - "\u0000\u039f\u03a0\u0007\n\u0000\u0000\u03a0\u03a1\u0007\b\u0000\u0000"+ - "\u03a1\u03a2\u0007\u0007\u0000\u0000\u03a2\u03a3\u0007\t\u0000\u0000\u03a3"+ - "\u03a4\u0007\t\u0000\u0000\u03a4\u03a5\u0001\u0000\u0000\u0000\u03a5\u03a6"+ - "\u0006 \u0003\u0000\u03a6O\u0001\u0000\u0000\u0000\u03a7\u03a8\u0005@"+ - "\u0000\u0000\u03a8\u03a9\u0007\u0007\u0000\u0000\u03a9\u03aa\u0007\u0010"+ - "\u0000\u0000\u03aa\u03ab\u0007\u000e\u0000\u0000\u03ab\u03ac\u0007\u000f"+ - "\u0000\u0000\u03ac\u03ad\u0001\u0000\u0000\u0000\u03ad\u03ae\u0006!\u0003"+ - "\u0000\u03aeQ\u0001\u0000\u0000\u0000\u03af\u03b0\u0005@\u0000\u0000\u03b0"+ - "\u03b1\u0007\u0007\u0000\u0000\u03b1\u03b2\u0007\u0019\u0000\u0000\u03b2"+ - "\u03b3\u0007\r\u0000\u0000\u03b3\u03b4\u0007\u0007\u0000\u0000\u03b4\u03b5"+ - "\u0007\n\u0000\u0000\u03b5\u03b6\u0007\u000b\u0000\u0000\u03b6\u03b7\u0007"+ - "\t\u0000\u0000\u03b7\u03b8\u0001\u0000\u0000\u0000\u03b8\u03b9\u0006\""+ - "\u0003\u0000\u03b9S\u0001\u0000\u0000\u0000\u03ba\u03bb\u0005@\u0000\u0000"+ - "\u03bb\u03bc\u0007\u001a\u0000\u0000\u03bc\u03bd\u0007\t\u0000\u0000\u03bd"+ - "\u03be\u0001\u0000\u0000\u0000\u03be\u03bf\u0006#\u0000\u0000\u03bfU\u0001"+ - "\u0000\u0000\u0000\u03c0\u03c1\u0005@\u0000\u0000\u03c1\u03c2\u0007\u001a"+ - "\u0000\u0000\u03c2\u03c3\u0007\t\u0000\u0000\u03c3\u03c4\u0007\u0015\u0000"+ - "\u0000\u03c4\u03c5\u0007\n\u0000\u0000\u03c5\u03c6\u0001\u0000\u0000\u0000"+ - "\u03c6\u03c7\u0006$\u0000\u0000\u03c7W\u0001\u0000\u0000\u0000\u03c8\u03c9"+ - "\u0005@\u0000\u0000\u03c9\u03ca\u0007\t\u0000\u0000\u03ca\u03cb\u0007"+ - "\u0007\u0000\u0000\u03cb\u03cc\u0007\u000e\u0000\u0000\u03cc\u03cd\u0007"+ - "\r\u0000\u0000\u03cd\u03ce\u0007\u0005\u0000\u0000\u03ce\u03cf\u0007\u0015"+ - "\u0000\u0000\u03cf\u03d0\u0007\n\u0000\u0000\u03d0\u03d1\u0001\u0000\u0000"+ - "\u0000\u03d1\u03d2\u0006%\u0003\u0000\u03d2Y\u0001\u0000\u0000\u0000\u03d3"+ - "\u03d4\u0005@\u0000\u0000\u03d4\u03d5\u0007\u000f\u0000\u0000\u03d5\u03d6"+ - "\u0007\u0010\u0000\u0000\u03d6\u03d7\u0007\t\u0000\u0000\u03d7\u03d8\u0007"+ - "\t\u0000\u0000\u03d8\u03d9\u0007\u0007\u0000\u0000\u03d9\u03da\u0007\u000e"+ - "\u0000\u0000\u03da\u03db\u0007\r\u0000\u0000\u03db\u03dc\u0007\u0005\u0000"+ - "\u0000\u03dc\u03dd\u0007\u0015\u0000\u0000\u03dd\u03de\u0007\n\u0000\u0000"+ - "\u03de\u03df\u0001\u0000\u0000\u0000\u03df\u03e0\u0006&\u0003\u0000\u03e0"+ - "[\u0001\u0000\u0000\u0000\u03e1\u03e2\u0005@\u0000\u0000\u03e2\u03e3\u0007"+ - "\t\u0000\u0000\u03e3\u03e4\u0007\u0007\u0000\u0000\u03e4\u03e5\u0007\u000e"+ - "\u0000\u0000\u03e5\u03e6\u0007\r\u0000\u0000\u03e6\u03e7\u0007\u0005\u0000"+ - "\u0000\u03e7\u03e8\u0007\u0015\u0000\u0000\u03e8\u03e9\u0007\n\u0000\u0000"+ - "\u03e9\u03ea\u0007\u0012\u0000\u0000\u03ea\u03eb\u0007\u0005\u0000\u0000"+ - "\u03eb\u03ec\u0007\t\u0000\u0000\u03ec\u03ed\u0007\t\u0000\u0000\u03ed"+ - "\u03ee\u0007\u0005\u0000\u0000\u03ee\u03ef\u0007\n\u0000\u0000\u03ef\u03f0"+ - "\u0007\u001b\u0000\u0000\u03f0\u03f1\u0001\u0000\u0000\u0000\u03f1\u03f2"+ - "\u0006\'\u0003\u0000\u03f2]\u0001\u0000\u0000\u0000\u03f3\u03f4\u0005"+ - "@\u0000\u0000\u03f4\u03f5\u0007\u0007\u0000\u0000\u03f5\u03f6\u0007\n"+ - "\u0000\u0000\u03f6\u03f7\u0007\u000b\u0000\u0000\u03f7\u03f8\u0007\t\u0000"+ - "\u0000\u03f8\u03f9\u0007\u0007\u0000\u0000\u03f9\u03fa\u0007\u000e\u0000"+ - "\u0000\u03fa\u03fb\u0007\r\u0000\u0000\u03fb\u03fc\u0007\u0005\u0000\u0000"+ - "\u03fc\u03fd\u0007\u0015\u0000\u0000\u03fd\u03fe\u0007\n\u0000\u0000\u03fe"+ - "_\u0001\u0000\u0000\u0000\u03ff\u0400\u0005@\u0000\u0000\u0400\u0401\u0007"+ - "\u0014\u0000\u0000\u0401\u0402\u0007\u0005\u0000\u0000\u0402\u0403\u0007"+ - "\u0007\u0000\u0000\u0403\u0404\u0007\b\u0000\u0000\u0404\u0405\u0007\u000b"+ - "\u0000\u0000\u0405\u0406\u0001\u0000\u0000\u0000\u0406\u0407\u0006)\u0003"+ - "\u0000\u0407a\u0001\u0000\u0000\u0000\u0408\u0409\u0005@\u0000\u0000\u0409"+ - "\u040a\u0007\u0013\u0000\u0000\u040a\u040b\u0007\u0010\u0000\u0000\u040b"+ - "\u040c\u0007\u0016\u0000\u0000\u040c\u040d\u0007\u0007\u0000\u0000\u040d"+ - "\u040e\u0007\n\u0000\u0000\u040e\u040f\u0007\r\u0000\u0000\u040fc\u0001"+ - "\u0000\u0000\u0000\u0410\u0411\u0005@\u0000\u0000\u0411\u0412\u0007\t"+ - "\u0000\u0000\u0412\u0413\u0007\u000f\u0000\u0000\u0413\u0414\u0007\u0015"+ - "\u0000\u0000\u0414\u0415\u0007\f\u0000\u0000\u0415e\u0001\u0000\u0000"+ - "\u0000\u0416\u0417\u0005@\u0000\u0000\u0417\u0418\u0007\u0015\u0000\u0000"+ - "\u0418\u0419\u0007\u001c\u0000\u0000\u0419\u041a\u0007\u0007\u0000\u0000"+ - "\u041a\u041b\u0007\u0016\u0000\u0000\u041b\u041c\u0007\f\u0000\u0000\u041c"+ - "\u041d\u0007\u0016\u0000\u0000\u041d\u041e\u0007\u0005\u0000\u0000\u041e"+ - "\u041f\u0007\r\u0000\u0000\u041f\u0420\u0007\u0007\u0000\u0000\u0420g"+ - "\u0001\u0000\u0000\u0000\u0421\u0422\u0005@\u0000\u0000\u0422\u0423\u0007"+ - "\t\u0000\u0000\u0423\u0424\u0007\r\u0000\u0000\u0424\u0425\u0007\u0015"+ - "\u0000\u0000\u0425\u0426\u0007\u0013\u0000\u0000\u0426i\u0001\u0000\u0000"+ - "\u0000\u0427\u0428\u0005@\u0000\u0000\u0428\u0429\u0007\u0010\u0000\u0000"+ - "\u0429\u042a\u0007\u0013\u0000\u0000\u042a\u042b\u0007\u0013\u0000\u0000"+ - "\u042b\u042c\u0007\u0007\u0000\u0000\u042c\u042d\u0007\n\u0000\u0000\u042d"+ - "\u042e\u0007\u000b\u0000\u0000\u042ek\u0001\u0000\u0000\u0000\u042f\u0430"+ - "\u0005@\u0000\u0000\u0430\u0431\u0007\u0015\u0000\u0000\u0431\u0432\u0007"+ - "\n\u0000\u0000\u0432\u0433\u0007\u000e\u0000\u0000\u0433\u0434\u0007\u0007"+ - "\u0000\u0000\u0434m\u0001\u0000\u0000\u0000\u0435\u0436\u0005@\u0000\u0000"+ - "\u0436\u0437\u0007\u0007\u0000\u0000\u0437\u0438\u0007\n\u0000\u0000\u0438"+ - "\u0439\u0007\u000b\u0000\u0000\u0439\u043a\u0007\u0015\u0000\u0000\u043a"+ - "\u043b\u0007\n\u0000\u0000\u043b\u043c\u0007\u000e\u0000\u0000\u043c\u043d"+ - "\u0007\u0007\u0000\u0000\u043do\u0001\u0000\u0000\u0000\u043e\u043f\u0005"+ - "@\u0000\u0000\u043f\u0440\u0007\t\u0000\u0000\u0440\u0441\u0007\r\u0000"+ - "\u0000\u0441\u0442\u0007\u0010\u0000\u0000\u0442\u0443\u0007\u000e\u0000"+ - "\u0000\u0443\u0444\u0007\u0018\u0000\u0000\u0444\u0445\u0001\u0000\u0000"+ - "\u0000\u0445\u0446\u00061\u0003\u0000\u0446q\u0001\u0000\u0000\u0000\u0447"+ - "\u0448\u0005@\u0000\u0000\u0448\u0449\u0007\u0013\u0000\u0000\u0449\u044a"+ - "\u0007\u0011\u0000\u0000\u044a\u044b\u0007\t\u0000\u0000\u044b\u044c\u0007"+ - "\u000f\u0000\u0000\u044c\u044d\u0001\u0000\u0000\u0000\u044d\u044e\u0006"+ - "2\u0003\u0000\u044es\u0001\u0000\u0000\u0000\u044f\u0450\u0005@\u0000"+ - "\u0000\u0450\u0451\u0007\u0007\u0000\u0000\u0451\u0452\u0007\n\u0000\u0000"+ - "\u0452\u0453\u0007\u000b\u0000\u0000\u0453\u0454\u0007\u0013\u0000\u0000"+ - "\u0454\u0455\u0007\u0011\u0000\u0000\u0455\u0456\u0007\t\u0000\u0000\u0456"+ - "\u0457\u0007\u000f\u0000\u0000\u0457u\u0001\u0000\u0000\u0000\u0458\u0459"+ - "\u0005@\u0000\u0000\u0459\u045a\u0007\u0013\u0000\u0000\u045a\u045b\u0007"+ - "\u0011\u0000\u0000\u045b\u045c\u0007\t\u0000\u0000\u045c\u045d\u0007\u000f"+ - "\u0000\u0000\u045d\u045e\u0007\u0005\u0000\u0000\u045e\u045f\u0007\u0006"+ - "\u0000\u0000\u045f\u0460\u0001\u0000\u0000\u0000\u0460\u0461\u00064\u0003"+ - "\u0000\u0461w\u0001\u0000\u0000\u0000\u0462\u0463\u0005@\u0000\u0000\u0463"+ - "\u0464\u0007\u0007\u0000\u0000\u0464\u0465\u0007\n\u0000\u0000\u0465\u0466"+ - "\u0007\u000b\u0000\u0000\u0466\u0467\u0007\u0013\u0000\u0000\u0467\u0468"+ - "\u0007\u0011\u0000\u0000\u0468\u0469\u0007\t\u0000\u0000\u0469\u046a\u0007"+ - "\u000f\u0000\u0000\u046a\u046b\u0007\u0005\u0000\u0000\u046b\u046c\u0007"+ - "\u0006\u0000\u0000\u046cy\u0001\u0000\u0000\u0000\u046d\u046e\u0005@\u0000"+ - "\u0000\u046e\u046f\u0007\u0013\u0000\u0000\u046f\u0470\u0007\u0011\u0000"+ - "\u0000\u0470\u0471\u0007\t\u0000\u0000\u0471\u0472\u0007\u000f\u0000\u0000"+ - "\u0472\u0473\u0007\u0015\u0000\u0000\u0473\u0474\u0007\n\u0000\u0000\u0474"+ - "\u0475\u0007\u000e\u0000\u0000\u0475\u0476\u0007\u0007\u0000\u0000\u0476"+ - "\u0477\u0001\u0000\u0000\u0000\u0477\u0478\u00066\u0003\u0000\u0478{\u0001"+ - "\u0000\u0000\u0000\u0479\u047a\u0005@\u0000\u0000\u047a\u047b\u0007\u0007"+ - "\u0000\u0000\u047b\u047c\u0007\n\u0000\u0000\u047c\u047d\u0007\u000b\u0000"+ - "\u0000\u047d\u047e\u0007\u0013\u0000\u0000\u047e\u047f\u0007\u0011\u0000"+ - "\u0000\u047f\u0480\u0007\t\u0000\u0000\u0480\u0481\u0007\u000f\u0000\u0000"+ - "\u0481\u0482\u0007\u0015\u0000\u0000\u0482\u0483\u0007\n\u0000\u0000\u0483"+ - "\u0484\u0007\u000e\u0000\u0000\u0484\u0485\u0007\u0007\u0000\u0000\u0485"+ - "}\u0001\u0000\u0000\u0000\u0486\u0487\u0005@\u0000\u0000\u0487\u0488\u0007"+ - "\u0013\u0000\u0000\u0488\u0489\u0007\u0016\u0000\u0000\u0489\u048a\u0007"+ - "\u0007\u0000\u0000\u048a\u048b\u0007\u0013\u0000\u0000\u048b\u048c\u0007"+ - "\u0007\u0000\u0000\u048c\u048d\u0007\n\u0000\u0000\u048d\u048e\u0007\u000b"+ - "\u0000\u0000\u048e\u048f\u0001\u0000\u0000\u0000\u048f\u0490\u00068\u0003"+ - "\u0000\u0490\u007f\u0001\u0000\u0000\u0000\u0491\u0492\u0005@\u0000\u0000"+ - "\u0492\u0493\u0007\u0007\u0000\u0000\u0493\u0494\u0007\n\u0000\u0000\u0494"+ - "\u0495\u0007\u000b\u0000\u0000\u0495\u0496\u0007\u0013\u0000\u0000\u0496"+ - "\u0497\u0007\u0016\u0000\u0000\u0497\u0498\u0007\u0007\u0000\u0000\u0498"+ - "\u0499\u0007\u0013\u0000\u0000\u0499\u049a\u0007\u0007\u0000\u0000\u049a"+ - "\u049b\u0007\n\u0000\u0000\u049b\u049c\u0007\u000b\u0000\u0000\u049c\u0081"+ - "\u0001\u0000\u0000\u0000\u049d\u049e\u0005@\u0000\u0000\u049e\u049f\u0007"+ - "\u0013\u0000\u0000\u049f\u04a0\u0007\u0016\u0000\u0000\u04a0\u04a1\u0007"+ - "\u0015\u0000\u0000\u04a1\u04a2\u0007\u0013\u0000\u0000\u04a2\u04a3\u0007"+ - "\t\u0000\u0000\u04a3\u04a4\u0001\u0000\u0000\u0000\u04a4\u04a5\u0006:"+ - "\u0001\u0000\u04a5\u0083\u0001\u0000\u0000\u0000\u04a6\u04a7\u0005@\u0000"+ - "\u0000\u04a7\u04a8\u0007\u0006\u0000\u0000\u04a8\u04a9\u0007\u0016\u0000"+ - "\u0000\u04a9\u04aa\u0007\u0010\u0000\u0000\u04aa\u04ab\u0007\u001b\u0000"+ - "\u0000\u04ab\u04ac\u0007\u0012\u0000\u0000\u04ac\u04ad\u0007\u0007\u0000"+ - "\u0000\u04ad\u04ae\u0007\n\u0000\u0000\u04ae\u04af\u0007\r\u0000\u0000"+ - "\u04af\u04b0\u0001\u0000\u0000\u0000\u04b0\u04b1\u0006;\u0000\u0000\u04b1"+ - "\u0085\u0001\u0000\u0000\u0000\u04b2\u04b3\u0005@\u0000\u0000\u04b3\u04b4"+ - "\u0007\u0007\u0000\u0000\u04b4\u04b5\u0007\n\u0000\u0000\u04b5\u04b6\u0007"+ - "\u000b\u0000\u0000\u04b6\u04b7\u0007\u0006\u0000\u0000\u04b7\u04b8\u0007"+ - "\u0016\u0000\u0000\u04b8\u04b9\u0007\u0010\u0000\u0000\u04b9\u04ba\u0007"+ - "\u001b\u0000\u0000\u04ba\u04bb\u0007\u0012\u0000\u0000\u04bb\u04bc\u0007"+ - "\u0007\u0000\u0000\u04bc\u04bd\u0007\n\u0000\u0000\u04bd\u04be\u0007\r"+ - "\u0000\u0000\u04be\u0087\u0001\u0000\u0000\u0000\u04bf\u04c0\u0005@\u0000"+ - "\u0000\u04c0\u04c1\u0007\u000e\u0000\u0000\u04c1\u04c2\u0007\t\u0000\u0000"+ - "\u04c2\u04c3\u0007\u0016\u0000\u0000\u04c3\u04c4\u0007\u0006\u0000\u0000"+ - "\u04c4\u0089\u0001\u0000\u0000\u0000\u04c5\u04c6\u0005@\u0000\u0000\u04c6"+ - "\u04c7\u0007\u0012\u0000\u0000\u04c7\u04c8\u0007\u0007\u0000\u0000\u04c8"+ - "\u04c9\u0007\r\u0000\u0000\u04c9\u04ca\u0007\u000f\u0000\u0000\u04ca\u04cb"+ - "\u0007\u0015\u0000\u0000\u04cb\u04cc\u0007\u000b\u0000\u0000\u04cc\u04cd"+ - "\u0001\u0000\u0000\u0000\u04cd\u04ce\u0006>\u0001\u0000\u04ce\u008b\u0001"+ - "\u0000\u0000\u0000\u04cf\u04d0\u0005@\u0000\u0000\u04d0\u04d1\u0007\u0007"+ - "\u0000\u0000\u04d1\u04d2\u0007\u0016\u0000\u0000\u04d2\u04d3\u0007\u0016"+ - "\u0000\u0000\u04d3\u04d4\u0007\u0015\u0000\u0000\u04d4\u04d5\u0007\u0016"+ - "\u0000\u0000\u04d5\u04d6\u0001\u0000\u0000\u0000\u04d6\u04d7\u0006?\u0001"+ - "\u0000\u04d7\u008d\u0001\u0000\u0000\u0000\u04d8\u04d9\u0005@\u0000\u0000"+ - "\u04d9\u04da\u0007\u0007\u0000\u0000\u04da\u04db\u0007\n\u0000\u0000\u04db"+ - "\u04dc\u0007\u000b\u0000\u0000\u04dc\u04dd\u0007\u0007\u0000\u0000\u04dd"+ - "\u04de\u0007\u0016\u0000\u0000\u04de\u04df\u0007\u0016\u0000\u0000\u04df"+ - "\u04e0\u0007\u0015\u0000\u0000\u04e0\u04e1\u0007\u0016\u0000\u0000\u04e1"+ - "\u008f\u0001\u0000\u0000\u0000\u04e2\u04e3\u0005@\u0000\u0000\u04e3\u04e4"+ - "\u0007\u0013\u0000\u0000\u04e4\u04e5\u0007\u0016\u0000\u0000\u04e5\u04e6"+ - "\u0007\u0015\u0000\u0000\u04e6\u04e7\u0007\u000b\u0000\u0000\u04e7\u04e8"+ - "\u0007\u0011\u0000\u0000\u04e8\u04e9\u0007\u000e\u0000\u0000\u04e9\u04ea"+ - "\u0007\r\u0000\u0000\u04ea\u04eb\u0007\u0005\u0000\u0000\u04eb\u04ec\u0007"+ - "\u0015\u0000\u0000\u04ec\u04ed\u0007\n\u0000\u0000\u04ed\u0091\u0001\u0000"+ - "\u0000\u0000\u04ee\u04ef\u0005@\u0000\u0000\u04ef\u04f0\u0007\u0007\u0000"+ - "\u0000\u04f0\u04f1\u0007\n\u0000\u0000\u04f1\u04f2\u0007\u000b\u0000\u0000"+ - "\u04f2\u04f3\u0007\u0013\u0000\u0000\u04f3\u04f4\u0007\u0016\u0000\u0000"+ - "\u04f4\u04f5\u0007\u0015\u0000\u0000\u04f5\u04f6\u0007\u000b\u0000\u0000"+ - "\u04f6\u04f7\u0007\u0011\u0000\u0000\u04f7\u04f8\u0007\u000e\u0000\u0000"+ - "\u04f8\u04f9\u0007\r\u0000\u0000\u04f9\u04fa\u0007\u0005\u0000\u0000\u04fa"+ - "\u04fb\u0007\u0015\u0000\u0000\u04fb\u04fc\u0007\n\u0000\u0000\u04fc\u0093"+ - "\u0001\u0000\u0000\u0000\u04fd\u04fe\u0005@\u0000\u0000\u04fe\u04ff\u0007"+ - "\u0007\u0000\u0000\u04ff\u0500\u0007\n\u0000\u0000\u0500\u0501\u0007\u001c"+ - "\u0000\u0000\u0501\u0502\u0001\u0000\u0000\u0000\u0502\u0503\u0006C\u0003"+ - "\u0000\u0503\u0095\u0001\u0000\u0000\u0000\u0504\u0505\u0005@\u0000\u0000"+ - "\u0505\u0506\u0007\u0007\u0000\u0000\u0506\u0507\u0007\n\u0000\u0000\u0507"+ - "\u0508\u0007\u000b\u0000\u0000\u0508\u0509\u0007\u0007\u0000\u0000\u0509"+ - "\u050a\u0007\n\u0000\u0000\u050a\u050b\u0007\u001c\u0000\u0000\u050b\u0097"+ - "\u0001\u0000\u0000\u0000\u050c\u050d\u0005@\u0000\u0000\u050d\u050e\u0007"+ - "\u0010\u0000\u0000\u050e\u050f\u0007\u0011\u0000\u0000\u050f\u0510\u0007"+ - "\r\u0000\u0000\u0510\u0518\u0007\u000f\u0000\u0000\u0511\u0512\u0005@"+ - "\u0000\u0000\u0512\u0513\u0007\u001b\u0000\u0000\u0513\u0514\u0007\u0011"+ - "\u0000\u0000\u0514\u0515\u0007\u0007\u0000\u0000\u0515\u0516\u0007\t\u0000"+ - "\u0000\u0516\u0518\u0007\r\u0000\u0000\u0517\u050c\u0001\u0000\u0000\u0000"+ - "\u0517\u0511\u0001\u0000\u0000\u0000\u0518\u0519\u0001\u0000\u0000\u0000"+ - "\u0519\u051a\u0006E\u0003\u0000\u051a\u0099\u0001\u0000\u0000\u0000\u051b"+ - "\u051c\u0005@\u0000\u0000\u051c\u051d\u0007\u0007\u0000\u0000\u051d\u051e"+ - "\u0007\n\u0000\u0000\u051e\u051f\u0007\u000b\u0000\u0000\u051f\u0520\u0007"+ - "\u0010\u0000\u0000\u0520\u0521\u0007\u0011\u0000\u0000\u0521\u0522\u0007"+ - "\r\u0000\u0000\u0522\u052d\u0007\u000f\u0000\u0000\u0523\u0524\u0005@"+ - "\u0000\u0000\u0524\u0525\u0007\u0007\u0000\u0000\u0525\u0526\u0007\n\u0000"+ - "\u0000\u0526\u0527\u0007\u000b\u0000\u0000\u0527\u0528\u0007\u001b\u0000"+ - "\u0000\u0528\u0529\u0007\u0011\u0000\u0000\u0529\u052a\u0007\u0007\u0000"+ - "\u0000\u052a\u052b\u0007\t\u0000\u0000\u052b\u052d\u0007\r\u0000\u0000"+ - "\u052c\u051b\u0001\u0000\u0000\u0000\u052c\u0523\u0001\u0000\u0000\u0000"+ - "\u052d\u009b\u0001\u0000\u0000\u0000\u052e\u052f\u0005@\u0000\u0000\u052f"+ - "\u0530\u0007\u000e\u0000\u0000\u0530\u0531\u0007\u0010\u0000\u0000\u0531"+ - "\u0532\u0007\n\u0000\u0000\u0532\u0539\u0001\u0000\u0000\u0000\u0533\u0534"+ - "\u0007\n\u0000\u0000\u0534\u0535\u0007\u0015\u0000\u0000\u0535\u053a\u0007"+ - "\r\u0000\u0000\u0536\u0537\u0007\u0010\u0000\u0000\u0537\u0538\u0007\n"+ - "\u0000\u0000\u0538\u053a\u0007\u0014\u0000\u0000\u0539\u0533\u0001\u0000"+ - "\u0000\u0000\u0539\u0536\u0001\u0000\u0000\u0000\u0539\u053a\u0001\u0000"+ - "\u0000\u0000\u053a\u053b\u0001\u0000\u0000\u0000\u053b\u053c\u0006G\u0000"+ - "\u0000\u053c\u009d\u0001\u0000\u0000\u0000\u053d\u053e\u0005@\u0000\u0000"+ - "\u053e\u053f\u0007\u0007\u0000\u0000\u053f\u0540\u0007\b\u0000\u0000\u0540"+ - "\u0541\u0007\t\u0000\u0000\u0541\u0542\u0007\u0007\u0000\u0000\u0542\u0543"+ - "\u0007\u000e\u0000\u0000\u0543\u0544\u0007\u0010\u0000\u0000\u0544\u0545"+ - "\u0007\n\u0000\u0000\u0545\u054c\u0001\u0000\u0000\u0000\u0546\u0547\u0007"+ - "\n\u0000\u0000\u0547\u0548\u0007\u0015\u0000\u0000\u0548\u054d\u0007\r"+ - "\u0000\u0000\u0549\u054a\u0007\u0010\u0000\u0000\u054a\u054b\u0007\n\u0000"+ - "\u0000\u054b\u054d\u0007\u0014\u0000\u0000\u054c\u0546\u0001\u0000\u0000"+ - "\u0000\u054c\u0549\u0001\u0000\u0000\u0000\u054c\u054d\u0001\u0000\u0000"+ - "\u0000\u054d\u054e\u0001\u0000\u0000\u0000\u054e\u054f\u0006H\u0000\u0000"+ - "\u054f\u009f\u0001\u0000\u0000\u0000\u0550\u0551\u0005@\u0000\u0000\u0551"+ - "\u0552\u0007\u0007\u0000\u0000\u0552\u0553\u0007\n\u0000\u0000\u0553\u0554"+ - "\u0007\u000b\u0000\u0000\u0554\u0555\u0007\u000e\u0000\u0000\u0555\u0556"+ - "\u0007\u0010\u0000\u0000\u0556\u0557\u0007\n\u0000\u0000\u0557\u055e\u0001"+ - "\u0000\u0000\u0000\u0558\u0559\u0007\n\u0000\u0000\u0559\u055a\u0007\u0015"+ - "\u0000\u0000\u055a\u055f\u0007\r\u0000\u0000\u055b\u055c\u0007\u0010\u0000"+ - "\u0000\u055c\u055d\u0007\n\u0000\u0000\u055d\u055f\u0007\u0014\u0000\u0000"+ - "\u055e\u0558\u0001\u0000\u0000\u0000\u055e\u055b\u0001\u0000\u0000\u0000"+ - "\u055e\u055f\u0001\u0000\u0000\u0000\u055f\u00a1\u0001\u0000\u0000\u0000"+ - "\u0560\u0561\u0005@\u0000\u0000\u0561\u0562\u0007\u000e\u0000\u0000\u0562"+ - "\u0563\u0007\b\u0000\u0000\u0563\u0564\u0007\u0010\u0000\u0000\u0564\u0565"+ - "\u0007\t\u0000\u0000\u0565\u0566\u0007\t\u0000\u0000\u0566\u0567\u0001"+ - "\u0000\u0000\u0000\u0567\u0568\u0006J\u0001\u0000\u0568\u00a3\u0001\u0000"+ - "\u0000\u0000\u0569\u056a\u0005@\u0000\u0000\u056a\u056b\u0007\t\u0000"+ - "\u0000\u056b\u056c\u0007\r\u0000\u0000\u056c\u056d\u0007\u0014\u0000\u0000"+ - "\u056d\u056e\u0007\b\u0000\u0000\u056e\u056f\u0007\u0007\u0000\u0000\u056f"+ - "\u0570\u0001\u0000\u0000\u0000\u0570\u0571\u0006K\u0001\u0000\u0571\u00a5"+ - "\u0001\u0000\u0000\u0000\u0572\u0573\u0005@\u0000\u0000\u0573\u0574\u0007"+ - "\u000e\u0000\u0000\u0574\u0575\u0007\u000f\u0000\u0000\u0575\u0576\u0007"+ - "\u0007\u0000\u0000\u0576\u0577\u0007\u000e\u0000\u0000\u0577\u0578\u0007"+ - "\u0018\u0000\u0000\u0578\u0579\u0007\u0007\u0000\u0000\u0579\u059f\u0007"+ - "\u000b\u0000\u0000\u057a\u057b\u0005@\u0000\u0000\u057b\u057c\u0007\u000b"+ - "\u0000\u0000\u057c\u057d\u0007\u0005\u0000\u0000\u057d\u057e\u0007\t\u0000"+ - "\u0000\u057e\u057f\u0007\u0010\u0000\u0000\u057f\u0580\u0007\u0017\u0000"+ - "\u0000\u0580\u0581\u0007\b\u0000\u0000\u0581\u0582\u0007\u0007\u0000\u0000"+ - "\u0582\u059f\u0007\u000b\u0000\u0000\u0583\u0584\u0005@\u0000\u0000\u0584"+ - "\u0585\u0007\u0016\u0000\u0000\u0585\u0586\u0007\u0007\u0000\u0000\u0586"+ - "\u0587\u0007\u0010\u0000\u0000\u0587\u0588\u0007\u000b\u0000\u0000\u0588"+ - "\u0589\u0007\u0015\u0000\u0000\u0589\u058a\u0007\n\u0000\u0000\u058a\u058b"+ - "\u0007\b\u0000\u0000\u058b\u059f\u0007\u0014\u0000\u0000\u058c\u058d\u0005"+ - "@\u0000\u0000\u058d\u058e\u0007\u0016\u0000\u0000\u058e\u058f\u0007\u0007"+ - "\u0000\u0000\u058f\u0590\u0007\u001d\u0000\u0000\u0590\u0591\u0007\u0011"+ - "\u0000\u0000\u0591\u0592\u0007\u0005\u0000\u0000\u0592\u0593\u0007\u0016"+ - "\u0000\u0000\u0593\u0594\u0007\u0007\u0000\u0000\u0594\u059f\u0007\u000b"+ - "\u0000\u0000\u0595\u0596\u0005@\u0000\u0000\u0596\u0597\u0007\t\u0000"+ - "\u0000\u0597\u0598\u0007\u0007\u0000\u0000\u0598\u0599\u0007\b\u0000\u0000"+ - "\u0599\u059a\u0007\u0007\u0000\u0000\u059a\u059b\u0007\u000e\u0000\u0000"+ - "\u059b\u059c\u0007\r\u0000\u0000\u059c\u059d\u0007\u0007\u0000\u0000\u059d"+ - "\u059f\u0007\u000b\u0000\u0000\u059e\u0572\u0001\u0000\u0000\u0000\u059e"+ - "\u057a\u0001\u0000\u0000\u0000\u059e\u0583\u0001\u0000\u0000\u0000\u059e"+ - "\u058c\u0001\u0000\u0000\u0000\u059e\u0595\u0001\u0000\u0000\u0000\u059f"+ - "\u05a0\u0001\u0000\u0000\u0000\u05a0\u05a1\u0006L\u0000\u0000\u05a1\u00a7"+ - "\u0001\u0000\u0000\u0000\u05a2\u05a3\u0005@\u0000\u0000\u05a3\u05a4\u0007"+ - "\u0010\u0000\u0000\u05a4\u05a5\u0007\f\u0000\u0000\u05a5\u05a6\u0007\u0010"+ - "\u0000\u0000\u05a6\u05a7\u0007\u0016\u0000\u0000\u05a7\u05a8\u0007\u0007"+ - "\u0000\u0000\u05a8\u05a9\u0001\u0000\u0000\u0000\u05a9\u05aa\u0006M\u0000"+ - "\u0000\u05aa\u00a9\u0001\u0000\u0000\u0000\u05ab\u05ac\u0005@\u0000\u0000"+ - "\u05ac\u05ad\u0007\t\u0000\u0000\u05ad\u05ae\u0007\u0007\u0000\u0000\u05ae"+ - "\u05af\u0007\t\u0000\u0000\u05af\u05b0\u0007\t\u0000\u0000\u05b0\u05b1"+ - "\u0007\u0005\u0000\u0000\u05b1\u05b2\u0007\u0015\u0000\u0000\u05b2\u05b3"+ - "\u0007\n\u0000\u0000\u05b3\u05b4\u0001\u0000\u0000\u0000\u05b4\u05b5\u0006"+ - "N\u0000\u0000\u05b5\u00ab\u0001\u0000\u0000\u0000\u05b6\u05b7\u0005@\u0000"+ - "\u0000\u05b7\u05b8\u0007\u0007\u0000\u0000\u05b8\u05b9\u0007\n\u0000\u0000"+ - "\u05b9\u05ba\u0007\u000b\u0000\u0000\u05ba\u05bb\u0007\t\u0000\u0000\u05bb"+ - "\u05bc\u0007\u0007\u0000\u0000\u05bc\u05bd\u0007\t\u0000\u0000\u05bd\u05be"+ - "\u0007\t\u0000\u0000\u05be\u05bf\u0007\u0005\u0000\u0000\u05bf\u05c0\u0007"+ - "\u0015\u0000\u0000\u05c0\u05c1\u0007\n\u0000\u0000\u05c1\u00ad\u0001\u0000"+ - "\u0000\u0000\u05c2\u05c3\u0005@\u0000\u0000\u05c3\u05c4\u0007\u000b\u0000"+ - "\u0000\u05c4\u05cb\u0007\u000b\u0000\u0000\u05c5\u05c6\u0005@\u0000\u0000"+ - "\u05c6\u05c7\u0007\u000b\u0000\u0000\u05c7\u05c8\u0007\u0011\u0000\u0000"+ - "\u05c8\u05c9\u0007\u0012\u0000\u0000\u05c9\u05cb\u0007\u0013\u0000\u0000"+ - "\u05ca\u05c2\u0001\u0000\u0000\u0000\u05ca\u05c5\u0001\u0000\u0000\u0000"+ - "\u05cb\u05cc\u0001\u0000\u0000\u0000\u05cc\u05cd\u0006P\u0000\u0000\u05cd"+ - "\u00af\u0001\u0000\u0000\u0000\u05ce\u05cf\u0005@\u0000\u0000\u05cf\u05d0"+ - "\u0007\b\u0000\u0000\u05d0\u05d1\u0007\u0010\u0000\u0000\u05d1\u05d2\u0007"+ - "\n\u0000\u0000\u05d2\u05d3\u0007\u001b\u0000\u0000\u05d3\u05d4\u0001\u0000"+ - "\u0000\u0000\u05d4\u05d5\u0006Q\u0003\u0000\u05d5\u00b1\u0001\u0000\u0000"+ - "\u0000\u05d6\u05d7\u0005@\u0000\u0000\u05d7\u05d8\u0007\u0011\u0000\u0000"+ - "\u05d8\u05d9\u0007\t\u0000\u0000\u05d9\u05da\u0007\u0007\u0000\u0000\u05da"+ - "\u05db\u0001\u0000\u0000\u0000\u05db\u05dc\u0006R\u0003\u0000\u05dc\u00b3"+ - "\u0001\u0000\u0000\u0000\u05dd\u05de\u0005@\u0000\u0000\u05de\u05df\u0007"+ - "\u0005\u0000\u0000\u05df\u05e0\u0007\n\u0000\u0000\u05e0\u05e1\u0007\u001a"+ - "\u0000\u0000\u05e1\u05e2\u0007\u0007\u0000\u0000\u05e2\u05e3\u0007\u000e"+ - "\u0000\u0000\u05e3\u05e4\u0007\r\u0000\u0000\u05e4\u05e5\u0001\u0000\u0000"+ - "\u0000\u05e5\u05e6\u0006S\u0003\u0000\u05e6\u00b5\u0001\u0000\u0000\u0000"+ - "\u05e7\u05e8\u0005@\u0000\u0000\u05e8\u05e9\u0007\u0013\u0000\u0000\u05e9"+ - "\u05ea\u0007\u000f\u0000\u0000\u05ea\u05eb\u0007\u0013\u0000\u0000\u05eb"+ - "\u05ed\u0001\u0000\u0000\u0000\u05ec\u05ee\u0005 \u0000\u0000\u05ed\u05ec"+ - "\u0001\u0000\u0000\u0000\u05ed\u05ee\u0001\u0000\u0000\u0000\u05ee\u05ef"+ - "\u0001\u0000\u0000\u0000\u05ef\u05f0\u0004T\u0001\u0000\u05f0\u05f1\u0001"+ - "\u0000\u0000\u0000\u05f1\u05f2\u0006T\u0004\u0000\u05f2\u05f3\u0006T\u0000"+ - "\u0000\u05f3\u00b7\u0001\u0000\u0000\u0000\u05f4\u05f5\u0005@\u0000\u0000"+ - "\u05f5\u05f6\u0007\u0013\u0000\u0000\u05f6\u05f7\u0007\u000f\u0000\u0000"+ - "\u05f7\u05f8\u0007\u0013\u0000\u0000\u05f8\u05f9\u0001\u0000\u0000\u0000"+ - "\u05f9\u05fa\u0004U\u0002\u0000\u05fa\u05fb\u0001\u0000\u0000\u0000\u05fb"+ - "\u05fc\u0006U\u0005\u0000\u05fc\u00b9\u0001\u0000\u0000\u0000\u05fd\u05fe"+ - "\u0005@\u0000\u0000\u05fe\u05ff\u0007\u001c\u0000\u0000\u05ff\u0600\u0007"+ - "\u0007\u0000\u0000\u0600\u0601\u0007\u0016\u0000\u0000\u0601\u0602\u0007"+ - "\u0017\u0000\u0000\u0602\u0603\u0007\u0010\u0000\u0000\u0603\u0604\u0007"+ - "\r\u0000\u0000\u0604\u0605\u0007\u0005\u0000\u0000\u0605\u0606\u0007\u0012"+ - "\u0000\u0000\u0606\u0607\u0001\u0000\u0000\u0000\u0607\u0608\u0006V\u0006"+ - "\u0000\u0608\u00bb\u0001\u0000\u0000\u0000\u0609\u060a\u0005@\u0000\u0000"+ - "\u060a\u060b\u0007\u0007\u0000\u0000\u060b\u060c\u0007\n\u0000\u0000\u060c"+ - "\u060d\u0007\u000b\u0000\u0000\u060d\u060e\u0007\u001c\u0000\u0000\u060e"+ - "\u060f\u0007\u0007\u0000\u0000\u060f\u0610\u0007\u0016\u0000\u0000\u0610"+ - "\u0611\u0007\u0017\u0000\u0000\u0611\u0612\u0007\u0010\u0000\u0000\u0612"+ - "\u0613\u0007\r\u0000\u0000\u0613\u0614\u0007\u0005\u0000\u0000\u0614\u0615"+ - "\u0007\u0012\u0000\u0000\u0615\u00bd\u0001\u0000\u0000\u0000\u0616\u0617"+ - "\u0005@\u0000\u0000\u0617\u0618\u0007\b\u0000\u0000\u0618\u0619\u0007"+ - "\u0005\u0000\u0000\u0619\u061a\u0007\u001c\u0000\u0000\u061a\u061b\u0007"+ - "\u0007\u0000\u0000\u061b\u061c\u0007\f\u0000\u0000\u061c\u061d\u0007\u0005"+ - "\u0000\u0000\u061d\u061e\u0007\u0016\u0000\u0000\u061e\u061f\u0007\u0007"+ - "\u0000\u0000\u061f\u0620\u0007\t\u0000\u0000\u0620\u0621\u0007\r\u0000"+ - "\u0000\u0621\u0622\u0007\u0014\u0000\u0000\u0622\u0623\u0007\b\u0000\u0000"+ - "\u0623\u0624\u0007\u0007\u0000\u0000\u0624\u0654\u0007\t\u0000\u0000\u0625"+ - "\u0626\u0005@\u0000\u0000\u0626\u0627\u0007\u0017\u0000\u0000\u0627\u0628"+ - "\u0007\u0011\u0000\u0000\u0628\u0629\u0007\u0018\u0000\u0000\u0629\u062a"+ - "\u0007\t\u0000\u0000\u062a\u062b\u0007\r\u0000\u0000\u062b\u062c\u0007"+ - "\u0014\u0000\u0000\u062c\u062d\u0007\b\u0000\u0000\u062d\u062e\u0007\u0007"+ - "\u0000\u0000\u062e\u0654\u0007\t\u0000\u0000\u062f\u0630\u0005@\u0000"+ - "\u0000\u0630\u0631\u0007\b\u0000\u0000\u0631\u0632\u0007\u0005\u0000\u0000"+ - "\u0632\u0633\u0007\u001c\u0000\u0000\u0633\u0634\u0007\u0007\u0000\u0000"+ - "\u0634\u0635\u0007\f\u0000\u0000\u0635\u0636\u0007\u0005\u0000\u0000\u0636"+ - "\u0637\u0007\u0016\u0000\u0000\u0637\u0638\u0007\u0007\u0000\u0000\u0638"+ - "\u0639\u0007\t\u0000\u0000\u0639\u063a\u0007\u000e\u0000\u0000\u063a\u063b"+ - "\u0007\u0016\u0000\u0000\u063b\u063c\u0007\u0005\u0000\u0000\u063c\u063d"+ - "\u0007\u0013\u0000\u0000\u063d\u063e\u0007\r\u0000\u0000\u063e\u0654\u0007"+ - "\t\u0000\u0000\u063f\u0640\u0005@\u0000\u0000\u0640\u0641\u0007\u0017"+ - "\u0000\u0000\u0641\u0642\u0007\u0011\u0000\u0000\u0642\u0643\u0007\u0018"+ - "\u0000\u0000\u0643\u0644\u0007\t\u0000\u0000\u0644\u0645\u0007\u000e\u0000"+ - "\u0000\u0645\u0646\u0007\u0016\u0000\u0000\u0646\u0647\u0007\u0005\u0000"+ - "\u0000\u0647\u0648\u0007\u0013\u0000\u0000\u0648\u0649\u0007\r\u0000\u0000"+ - "\u0649\u0654\u0007\t\u0000\u0000\u064a\u064b\u0005@\u0000\u0000\u064b"+ - "\u064c\u0007\b\u0000\u0000\u064c\u064d\u0007\u0005\u0000\u0000\u064d\u064e"+ - "\u0007\u001c\u0000\u0000\u064e\u064f\u0007\u0007\u0000\u0000\u064f\u0650"+ - "\u0007\f\u0000\u0000\u0650\u0651\u0007\u0005\u0000\u0000\u0651\u0652\u0007"+ - "\u0016\u0000\u0000\u0652\u0654\u0007\u0007\u0000\u0000\u0653\u0616\u0001"+ - "\u0000\u0000\u0000\u0653\u0625\u0001\u0000\u0000\u0000\u0653\u062f\u0001"+ - "\u0000\u0000\u0000\u0653\u063f\u0001\u0000\u0000\u0000\u0653\u064a\u0001"+ - "\u0000\u0000\u0000\u0654\u00bf\u0001\u0000\u0000\u0000\u0655\u0656\u0005"+ - "@\u0000\u0000\u0656\u0657\u0007\u001c\u0000\u0000\u0657\u0658\u0007\u0005"+ - "\u0000\u0000\u0658\u0659\u0007\r\u0000\u0000\u0659\u065a\u0007\u0007\u0000"+ - "\u0000\u065a\u065b\u0001\u0000\u0000\u0000\u065b\u065c\u0006Y\u0000\u0000"+ - "\u065c\u00c1\u0001\u0000\u0000\u0000\u065d\u065e\u0005@\u0000\u0000\u065e"+ - "\u065f\u0007\u001c\u0000\u0000\u065f\u0660\u0007\u0005\u0000\u0000\u0660"+ - "\u0661\u0007\r\u0000\u0000\u0661\u0662\u0007\u0007\u0000\u0000\u0662\u0663"+ - "\u0007\u0016\u0000\u0000\u0663\u0664\u0007\u0007\u0000\u0000\u0664\u0665"+ - "\u0007\u0010\u0000\u0000\u0665\u0666\u0007\u000e\u0000\u0000\u0666\u0667"+ - "\u0007\r\u0000\u0000\u0667\u0668\u0007\u0016\u0000\u0000\u0668\u0669\u0007"+ - "\u0007\u0000\u0000\u0669\u066a\u0007\u0006\u0000\u0000\u066a\u066b\u0007"+ - "\u0016\u0000\u0000\u066b\u066c\u0007\u0007\u0000\u0000\u066c\u066d\u0007"+ - "\t\u0000\u0000\u066d\u066e\u0007\u000f\u0000\u0000\u066e\u00c3\u0001\u0000"+ - "\u0000\u0000\u066f\u0670\u0005@\u0000\u0000\u0670\u0671\u0003\u00f0q\u0000"+ - "\u0671\u0672\u0004[\u0003\u0000\u0672\u0673\u0001\u0000\u0000\u0000\u0673"+ - "\u0674\u0006[\u0003\u0000\u0674\u00c5\u0001\u0000\u0000\u0000\u0675\u0676"+ - "\u0005@\u0000\u0000\u0676\u0677\u0003\u00f0q\u0000\u0677\u0678\u0004\\"+ - "\u0004\u0000\u0678\u00c7\u0001\u0000\u0000\u0000\u0679\u067a\u0005@\u0000"+ - "\u0000\u067a\u067b\u0003\u00f0q\u0000\u067b\u067c\u0004]\u0005\u0000\u067c"+ - "\u00c9\u0001\u0000\u0000\u0000\u067d\u067e\u0005{\u0000\u0000\u067e\u067f"+ - "\u0005{\u0000\u0000\u067f\u0680\u0001\u0000\u0000\u0000\u0680\u0681\u0006"+ - "^\u0007\u0000\u0681\u00cb\u0001\u0000\u0000\u0000\u0682\u0683\u0005{\u0000"+ - "\u0000\u0683\u0684\u0005!\u0000\u0000\u0684\u0685\u0005!\u0000\u0000\u0685"+ - "\u0686\u0001\u0000\u0000\u0000\u0686\u0687\u0006_\b\u0000\u0687\u00cd"+ - "\u0001\u0000\u0000\u0000\u0688\u0689\u0005@\u0000\u0000\u0689\u068a\u0001"+ - "\u0000\u0000\u0000\u068a\u068b\u0006`\t\u0000\u068b\u00cf\u0001\u0000"+ - "\u0000\u0000\u068c\u068d\u0005{\u0000\u0000\u068d\u068e\u0005!\u0000\u0000"+ - "\u068e\u068f\u0001\u0000\u0000\u0000\u068f\u0690\u0006a\t\u0000\u0690"+ - "\u00d1\u0001\u0000\u0000\u0000\u0691\u0692\u0005<\u0000\u0000\u0692\u0693"+ - "\u0005?\u0000\u0000\u0693\u0694\u0007\u0013\u0000\u0000\u0694\u0695\u0007"+ - "\u000f\u0000\u0000\u0695\u069a\u0007\u0013\u0000\u0000\u0696\u0697\u0005"+ - "<\u0000\u0000\u0697\u0698\u0005?\u0000\u0000\u0698\u069a\u0005=\u0000"+ - "\u0000\u0699\u0691\u0001\u0000\u0000\u0000\u0699\u0696\u0001\u0000\u0000"+ - "\u0000\u069a\u069b\u0001\u0000\u0000\u0000\u069b\u069c\u0006b\n\u0000"+ - "\u069c\u00d3\u0001\u0000\u0000\u0000\u069d\u069e\u0005<\u0000\u0000\u069e"+ - "\u069f\u0007\u0019\u0000\u0000\u069f\u06a0\u0005-\u0000\u0000\u06a0\u06ab"+ - "\u0001\u0000\u0000\u0000\u06a1\u06ac\u0003\u000e\u0000\u0000\u06a2\u06a7"+ - "\u0003\u000e\u0000\u0000\u06a3\u06a4\u0005:\u0000\u0000\u06a4\u06a5\u0005"+ - ":\u0000\u0000\u06a5\u06a6\u0001\u0000\u0000\u0000\u06a6\u06a8\u0003\u000e"+ - "\u0000\u0000\u06a7\u06a3\u0001\u0000\u0000\u0000\u06a8\u06a9\u0001\u0000"+ - "\u0000\u0000\u06a9\u06a7\u0001\u0000\u0000\u0000\u06a9\u06aa\u0001\u0000"+ - "\u0000\u0000\u06aa\u06ac\u0001\u0000\u0000\u0000\u06ab\u06a1\u0001\u0000"+ - "\u0000\u0000\u06ab\u06a2\u0001\u0000\u0000\u0000\u06ab\u06ac\u0001\u0000"+ - "\u0000\u0000\u06ac\u06ad\u0001\u0000\u0000\u0000\u06ad\u06ae\u0006c\u000b"+ - "\u0000\u06ae\u00d5\u0001\u0000\u0000\u0000\u06af\u06b0\u0005<\u0000\u0000"+ - "\u06b0\u06b1\u0007\u0019\u0000\u0000\u06b1\u06b2\u0005-\u0000\u0000\u06b2"+ - "\u06b3\u0001\u0000\u0000\u0000\u06b3\u06b4\u0003\u000e\u0000\u0000\u06b4"+ - "\u06b5\u0004d\u0006\u0000\u06b5\u06b6\u0001\u0000\u0000\u0000\u06b6\u06b7"+ - "\u0006d\f\u0000\u06b7\u00d7\u0001\u0000\u0000\u0000\u06b8\u06ba\u0005"+ - "$\u0000\u0000\u06b9\u06b8\u0001\u0000\u0000\u0000\u06b9\u06ba\u0001\u0000"+ - "\u0000\u0000\u06ba\u06bb\u0001\u0000\u0000\u0000\u06bb\u06bc\u0005(\u0000"+ - "\u0000\u06bc\u06cc\u0003\u0014\u0003\u0000\u06bd\u06be\u0003\u00f4s\u0000"+ - "\u06be\u06c1\u0005)\u0000\u0000\u06bf\u06c0\u0005.\u0000\u0000\u06c0\u06c2"+ - "\u0003\u00f0q\u0000\u06c1\u06bf\u0001\u0000\u0000\u0000\u06c1\u06c2\u0001"+ - "\u0000\u0000\u0000\u06c2\u06cc\u0001\u0000\u0000\u0000\u06c3\u06c8\u0003"+ - "\u0012\u0002\u0000\u06c4\u06c5\u0005.\u0000\u0000\u06c5\u06c7\u0003\u0012"+ - "\u0002\u0000\u06c6\u06c4\u0001\u0000\u0000\u0000\u06c7\u06ca\u0001\u0000"+ - "\u0000\u0000\u06c8\u06c6\u0001\u0000\u0000\u0000\u06c8\u06c9\u0001\u0000"+ - "\u0000\u0000\u06c9\u06cc\u0001\u0000\u0000\u0000\u06ca\u06c8\u0001\u0000"+ - "\u0000\u0000\u06cb\u06b9\u0001\u0000\u0000\u0000\u06cb\u06bd\u0001\u0000"+ - "\u0000\u0000\u06cb\u06c3\u0001\u0000\u0000\u0000\u06cc\u06cd\u0001\u0000"+ - "\u0000\u0000\u06cd\u06ce\u0006e\r\u0000\u06ce\u00d9\u0001\u0000\u0000"+ - "\u0000\u06cf\u06d0\u0005<\u0000\u0000\u06d0\u06d1\u0003\u00f4s\u0000\u06d1"+ - "\u00db\u0001\u0000\u0000\u0000\u06d2\u06d3\u0005<\u0000\u0000\u06d3\u06d4"+ - "\u0005/\u0000\u0000\u06d4\u06d5\u0001\u0000\u0000\u0000\u06d5\u06d9\u0003"+ - "\u00f4s\u0000\u06d6\u06d8\u0007\u001e\u0000\u0000\u06d7\u06d6\u0001\u0000"+ - "\u0000\u0000\u06d8\u06db\u0001\u0000\u0000\u0000\u06d9\u06d7\u0001\u0000"+ - "\u0000\u0000\u06d9\u06da\u0001\u0000\u0000\u0000\u06da\u06dc\u0001\u0000"+ - "\u0000\u0000\u06db\u06d9\u0001\u0000\u0000\u0000\u06dc\u06dd\u0005>\u0000"+ - "\u0000\u06dd\u06df\u0001\u0000\u0000\u0000\u06de\u06d2\u0001\u0000\u0000"+ - "\u0000\u06df\u06e0\u0001\u0000\u0000\u0000\u06e0\u06de\u0001\u0000\u0000"+ - "\u0000\u06e0\u06e1\u0001\u0000\u0000\u0000\u06e1\u06e2\u0001\u0000\u0000"+ - "\u0000\u06e2\u06e3\u0006g\r\u0000\u06e3\u00dd\u0001\u0000\u0000\u0000"+ - "\u06e4\u06e5\u0005/\u0000\u0000\u06e5\u06e6\u0005>\u0000\u0000\u06e6\u06e7"+ - "\u0001\u0000\u0000\u0000\u06e7\u06e8\u0006h\u000e\u0000\u06e8\u06e9\u0001"+ - "\u0000\u0000\u0000\u06e9\u06ea\u0006h\t\u0000\u06ea\u00df\u0001\u0000"+ - "\u0000\u0000\u06eb\u06ec\u0005>\u0000\u0000\u06ec\u06ed\u0006i\u000f\u0000"+ - "\u06ed\u06ee\u0001\u0000\u0000\u0000\u06ee\u06ef\u0006i\t\u0000\u06ef"+ - "\u00e1\u0001\u0000\u0000\u0000\u06f0\u06f4\u0005\"\u0000\u0000\u06f1\u06f3"+ - "\u0003\u00e4k\u0000\u06f2\u06f1\u0001\u0000\u0000\u0000\u06f3\u06f6\u0001"+ - "\u0000\u0000\u0000\u06f4\u06f2\u0001\u0000\u0000\u0000\u06f4\u06f5\u0001"+ - "\u0000\u0000\u0000\u06f5\u06f7\u0001\u0000\u0000\u0000\u06f6\u06f4\u0001"+ - "\u0000\u0000\u0000\u06f7\u06fd\u0005\"\u0000\u0000\u06f8\u06f9\u0007\u0004"+ - "\u0000\u0000\u06f9\u06fa\u0003\u00e4k\u0000\u06fa\u06fb\u0007\u0004\u0000"+ - "\u0000\u06fb\u06fd\u0001\u0000\u0000\u0000\u06fc\u06f0\u0001\u0000\u0000"+ - "\u0000\u06fc\u06f8\u0001\u0000\u0000\u0000\u06fd\u06fe\u0001\u0000\u0000"+ - "\u0000\u06fe\u06ff\u0006j\r\u0000\u06ff\u00e3\u0001\u0000\u0000\u0000"+ - "\u0700\u0702\u0005 \u0000\u0000\u0701\u0700\u0001\u0000\u0000\u0000\u0702"+ - "\u0705\u0001\u0000\u0000\u0000\u0703\u0701\u0001\u0000\u0000\u0000\u0703"+ - "\u0704\u0001\u0000\u0000\u0000\u0704\u0706\u0001\u0000\u0000\u0000\u0705"+ - "\u0703\u0001\u0000\u0000\u0000\u0706\u0709\u0003\u00f4s\u0000\u0707\u0708"+ - "\u0005/\u0000\u0000\u0708\u070a\u0003\u00f4s\u0000\u0709\u0707\u0001\u0000"+ - "\u0000\u0000\u070a\u070b\u0001\u0000\u0000\u0000\u070b\u0709\u0001\u0000"+ - "\u0000\u0000\u070b\u070c\u0001\u0000\u0000\u0000\u070c\u070f\u0001\u0000"+ - "\u0000\u0000\u070d\u070e\u0005.\u0000\u0000\u070e\u0710\u0003\u00f0q\u0000"+ - "\u070f\u070d\u0001\u0000\u0000\u0000\u070f\u0710\u0001\u0000\u0000\u0000"+ - "\u0710\u071b\u0001\u0000\u0000\u0000\u0711\u0712\u0005?\u0000\u0000\u0712"+ - "\u0718\u0003\u00f0q\u0000\u0713\u0714\u0003\u00ean\u0000\u0714\u0715\u0003"+ - "\u00f0q\u0000\u0715\u0717\u0001\u0000\u0000\u0000\u0716\u0713\u0001\u0000"+ - "\u0000\u0000\u0717\u071a\u0001\u0000\u0000\u0000\u0718\u0716\u0001\u0000"+ - "\u0000\u0000\u0718\u0719\u0001\u0000\u0000\u0000\u0719\u071c\u0001\u0000"+ - "\u0000\u0000\u071a\u0718\u0001\u0000\u0000\u0000\u071b\u0711\u0001\u0000"+ - "\u0000\u0000\u071b\u071c\u0001\u0000\u0000\u0000\u071c\u071d\u0001\u0000"+ - "\u0000\u0000\u071d\u071e\u0006k\r\u0000\u071e\u00e5\u0001\u0000\u0000"+ - "\u0000\u071f\u0721\u0005 \u0000\u0000\u0720\u071f\u0001\u0000\u0000\u0000"+ - "\u0721\u0724\u0001\u0000\u0000\u0000\u0722\u0720\u0001\u0000\u0000\u0000"+ - "\u0722\u0723\u0001\u0000\u0000\u0000\u0723\u0725\u0001\u0000\u0000\u0000"+ - "\u0724\u0722\u0001\u0000\u0000\u0000\u0725\u072c\u0003\u00f4s\u0000\u0726"+ - "\u0728\u0005 \u0000\u0000\u0727\u0726\u0001\u0000\u0000\u0000\u0728\u0729"+ - "\u0001\u0000\u0000\u0000\u0729\u0727\u0001\u0000\u0000\u0000\u0729\u072a"+ - "\u0001\u0000\u0000\u0000\u072a\u072b\u0001\u0000\u0000\u0000\u072b\u072d"+ - "\u0003\u00f4s\u0000\u072c\u0727\u0001\u0000\u0000\u0000\u072d\u072e\u0001"+ - "\u0000\u0000\u0000\u072e\u072c\u0001\u0000\u0000\u0000\u072e\u072f\u0001"+ - "\u0000\u0000\u0000\u072f\u0730\u0001\u0000\u0000\u0000\u0730\u0731\u0006"+ - "l\r\u0000\u0731\u00e7\u0001\u0000\u0000\u0000\u0732\u0733\u0003\u00f4"+ - "s\u0000\u0733\u0734\u0006m\u0010\u0000\u0734\u00e9\u0001\u0000\u0000\u0000"+ - "\u0735\u0736\u0005=\u0000\u0000\u0736\u00eb\u0001\u0000\u0000\u0000\u0737"+ - "\u0739\u0005 \u0000\u0000\u0738\u0737\u0001\u0000\u0000\u0000\u0739\u073a"+ - "\u0001\u0000\u0000\u0000\u073a\u0738\u0001\u0000\u0000\u0000\u073a\u073b"+ - "\u0001\u0000\u0000\u0000\u073b\u0742\u0001\u0000\u0000\u0000\u073c\u073e"+ - "\u0007\u001f\u0000\u0000\u073d\u073c\u0001\u0000\u0000\u0000\u073e\u073f"+ - "\u0001\u0000\u0000\u0000\u073f\u073d\u0001\u0000\u0000\u0000\u073f\u0740"+ - "\u0001\u0000\u0000\u0000\u0740\u0742\u0001\u0000\u0000\u0000\u0741\u0738"+ - "\u0001\u0000\u0000\u0000\u0741\u073d\u0001\u0000\u0000\u0000\u0742\u0743"+ - "\u0001\u0000\u0000\u0000\u0743\u0744\u0006o\r\u0000\u0744\u00ed\u0001"+ - "\u0000\u0000\u0000\u0745\u0746\t\u0000\u0000\u0000\u0746\u0747\u0001\u0000"+ - "\u0000\u0000\u0747\u0748\u0006p\r\u0000\u0748\u00ef\u0001\u0000\u0000"+ - "\u0000\u0749\u074d\u0007 \u0000\u0000\u074a\u074c\u0007!\u0000\u0000\u074b"+ - "\u074a\u0001\u0000\u0000\u0000\u074c\u074f\u0001\u0000\u0000\u0000\u074d"+ - "\u074b\u0001\u0000\u0000\u0000\u074d\u074e\u0001\u0000\u0000\u0000\u074e"+ - "\u00f1\u0001\u0000\u0000\u0000\u074f\u074d\u0001\u0000\u0000\u0000\u0750"+ - "\u0754\u0007\u0000\u0000\u0000\u0751\u0753\u0007\"\u0000\u0000\u0752\u0751"+ - "\u0001\u0000\u0000\u0000\u0753\u0756\u0001\u0000\u0000\u0000\u0754\u0752"+ - "\u0001\u0000\u0000\u0000\u0754\u0755\u0001\u0000\u0000\u0000\u0755\u00f3"+ - "\u0001\u0000\u0000\u0000\u0756\u0754\u0001\u0000\u0000\u0000\u0757\u075b"+ - "\u0007 \u0000\u0000\u0758\u075a\u0007#\u0000\u0000\u0759\u0758\u0001\u0000"+ - "\u0000\u0000\u075a\u075d\u0001\u0000\u0000\u0000\u075b\u0759\u0001\u0000"+ - "\u0000\u0000\u075b\u075c\u0001\u0000\u0000\u0000\u075c\u00f5\u0001\u0000"+ - "\u0000\u0000\u075d\u075b\u0001\u0000\u0000\u0000\u075e\u075f\u0007$\u0000"+ - "\u0000\u075f\u00f7\u0001\u0000\u0000\u0000\u0760\u0765\u0005\"\u0000\u0000"+ - "\u0761\u0764\u0003\u00f6t\u0000\u0762\u0764\t\u0000\u0000\u0000\u0763"+ - "\u0761\u0001\u0000\u0000\u0000\u0763\u0762\u0001\u0000\u0000\u0000\u0764"+ - "\u0767\u0001\u0000\u0000\u0000\u0765\u0766\u0001\u0000\u0000\u0000\u0765"+ - "\u0763\u0001\u0000\u0000\u0000\u0766\u0768\u0001\u0000\u0000\u0000\u0767"+ - "\u0765\u0001\u0000\u0000\u0000\u0768\u0769\u0005\"\u0000\u0000\u0769\u00f9"+ - "\u0001\u0000\u0000\u0000\u076a\u0770\u0005\'\u0000\u0000\u076b\u076f\b"+ - "\u0004\u0000\u0000\u076c\u076d\u0005\\\u0000\u0000\u076d\u076f\t\u0000"+ - "\u0000\u0000\u076e\u076b\u0001\u0000\u0000\u0000\u076e\u076c\u0001\u0000"+ - "\u0000\u0000\u076f\u0772\u0001\u0000\u0000\u0000\u0770\u076e\u0001\u0000"+ - "\u0000\u0000\u0770\u0771\u0001\u0000\u0000\u0000\u0771\u0773\u0001\u0000"+ - "\u0000\u0000\u0772\u0770\u0001\u0000\u0000\u0000\u0773\u0774\u0005\'\u0000"+ - "\u0000\u0774\u00fb\u0001\u0000\u0000\u0000\u0775\u0776\u0005/\u0000\u0000"+ - "\u0776\u0777\u0005/\u0000\u0000\u0777\u077b\u0001\u0000\u0000\u0000\u0778"+ - "\u077a\b\u001f\u0000\u0000\u0779\u0778\u0001\u0000\u0000\u0000\u077a\u077d"+ - "\u0001\u0000\u0000\u0000\u077b\u0779\u0001\u0000\u0000\u0000\u077b\u077c"+ - "\u0001\u0000\u0000\u0000\u077c\u00fd\u0001\u0000\u0000\u0000\u077d\u077b"+ - "\u0001\u0000\u0000\u0000\u077e\u077f\u0005$\u0000\u0000\u077f\u0780\u0003"+ - "\u00f0q\u0000\u0780\u00ff\u0001\u0000\u0000\u0000\u0781\u0782\u0007\u0010"+ - "\u0000\u0000\u0782\u0783\u0007\u0016\u0000\u0000\u0783\u0784\u0007\u0016"+ - "\u0000\u0000\u0784\u0785\u0007\u0010\u0000\u0000\u0785\u0794\u0007\u0014"+ - "\u0000\u0000\u0786\u0787\u0007\u000e\u0000\u0000\u0787\u0788\u0007\b\u0000"+ - "\u0000\u0788\u0789\u0007\u0010\u0000\u0000\u0789\u078a\u0007\t\u0000\u0000"+ - "\u078a\u0794\u0007\t\u0000\u0000\u078b\u078c\u0007\u0007\u0000\u0000\u078c"+ - "\u078d\u0007\u0012\u0000\u0000\u078d\u078e\u0007\u0013\u0000\u0000\u078e"+ - "\u078f\u0007\r\u0000\u0000\u078f\u0794\u0007\u0014\u0000\u0000\u0790\u0791"+ - "\u0007\u0011\u0000\u0000\u0791\u0792\u0007\t\u0000\u0000\u0792\u0794\u0007"+ - "\u0007\u0000\u0000\u0793\u0781\u0001\u0000\u0000\u0000\u0793\u0786\u0001"+ - "\u0000\u0000\u0000\u0793\u078b\u0001\u0000\u0000\u0000\u0793\u0790\u0001"+ - "\u0000\u0000\u0000\u0794\u0101\u0001\u0000\u0000\u0000\u0795\u0796\u0002"+ - "09\u0000\u0796\u0103\u0001\u0000\u0000\u0000\u0797\u0798\u0005{\u0000"+ - "\u0000\u0798\u0799\u0005{\u0000\u0000\u0799\u079a\u0005-\u0000\u0000\u079a"+ - "\u079b\u0005-\u0000\u0000\u079b\u079c\u0001\u0000\u0000\u0000\u079c\u079d"+ - "\u0006{\u0011\u0000\u079d\u079e\u0006{\r\u0000\u079e\u0105\u0001\u0000"+ - "\u0000\u0000\u079f\u07a0\u0005@\u0000\u0000\u07a0\u07a1\u0003\u00f4s\u0000"+ - "\u07a1\u07a2\u0005.\u0000\u0000\u07a2\u07a3\u0001\u0000\u0000\u0000\u07a3"+ - "\u07a4\u0006|\t\u0000\u07a4\u0107\u0001\u0000\u0000\u0000\u07a5\u07aa"+ - "\u0005@\u0000\u0000\u07a6\u07a8\u0003\u0102z\u0000\u07a7\u07a9\u0005."+ - "\u0000\u0000\u07a8\u07a7\u0001\u0000\u0000\u0000\u07a8\u07a9\u0001\u0000"+ - "\u0000\u0000\u07a9\u07ab\u0001\u0000\u0000\u0000\u07aa\u07a6\u0001\u0000"+ - "\u0000\u0000\u07ab\u07ac\u0001\u0000\u0000\u0000\u07ac\u07aa\u0001\u0000"+ - "\u0000\u0000\u07ac\u07ad\u0001\u0000\u0000\u0000\u07ad\u07ae\u0001\u0000"+ - "\u0000\u0000\u07ae\u07af\u0006}\t\u0000\u07af\u0109\u0001\u0000\u0000"+ - "\u0000\u07b0\u07b1\u0005{\u0000\u0000\u07b1\u07b2\u0005{\u0000\u0000\u07b2"+ - "\u08e6\u0005{\u0000\u0000\u07b3\u07b4\u0005@\u0000\u0000\u07b4\u07b5\u0005"+ - "@\u0000\u0000\u07b5\u07b7\u0001\u0000\u0000\u0000\u07b6\u07b8\u0005@\u0000"+ - "\u0000\u07b7\u07b6\u0001\u0000\u0000\u0000\u07b7\u07b8\u0001\u0000\u0000"+ - "\u0000\u07b8\u08e6\u0001\u0000\u0000\u0000\u07b9\u07ba\u0005@\u0000\u0000"+ - "\u07ba\u07bb\u0005{\u0000\u0000\u07bb\u07bd\u0001\u0000\u0000\u0000\u07bc"+ - "\u07be\u0005{\u0000\u0000\u07bd\u07bc\u0001\u0000\u0000\u0000\u07bd\u07be"+ - "\u0001\u0000\u0000\u0000\u07be\u08e6\u0001\u0000\u0000\u0000\u07bf\u07c0"+ - "\u0005@\u0000\u0000\u07c0\u07c1\u0007\u0012\u0000\u0000\u07c1\u07c2\u0007"+ - "\u0007\u0000\u0000\u07c2\u07c3\u0007\u000b\u0000\u0000\u07c3\u07c4\u0007"+ - "\u0005\u0000\u0000\u07c4\u07c5\u0007\u0010\u0000\u0000\u07c5\u07c7\u0001"+ - "\u0000\u0000\u0000\u07c6\u07c8\u0007%\u0000\u0000\u07c7\u07c6\u0001\u0000"+ - "\u0000\u0000\u07c8\u07c9\u0001\u0000\u0000\u0000\u07c9\u07c7\u0001\u0000"+ - "\u0000\u0000\u07c9\u07ca\u0001\u0000\u0000\u0000\u07ca\u07dc\u0001\u0000"+ - "\u0000\u0000\u07cb\u07cc\u0007\t\u0000\u0000\u07cc\u07cd\u0007\u000e\u0000"+ - "\u0000\u07cd\u07ce\u0007\u0016\u0000\u0000\u07ce\u07cf\u0007\u0007\u0000"+ - "\u0000\u07cf\u07d0\u0007\u0007\u0000\u0000\u07d0\u07d1\u0007\n\u0000\u0000"+ - "\u07d1\u07d3\u0001\u0000\u0000\u0000\u07d2\u07d4\u0007%\u0000\u0000\u07d3"+ - "\u07d2\u0001\u0000\u0000\u0000\u07d4\u07d5\u0001\u0000\u0000\u0000\u07d5"+ - "\u07d3\u0001\u0000\u0000\u0000\u07d5\u07d6\u0001\u0000\u0000\u0000\u07d6"+ - "\u07da\u0001\u0000\u0000\u0000\u07d7\u07d8\u0007\u0010\u0000\u0000\u07d8"+ - "\u07d9\u0007\n\u0000\u0000\u07d9\u07db\u0007\u000b\u0000\u0000\u07da\u07d7"+ - "\u0001\u0000\u0000\u0000\u07da\u07db\u0001\u0000\u0000\u0000\u07db\u07dd"+ - "\u0001\u0000\u0000\u0000\u07dc\u07cb\u0001\u0000\u0000\u0000\u07dc\u07dd"+ - "\u0001\u0000\u0000\u0000\u07dd\u08e6\u0001\u0000\u0000\u0000\u07de\u07df"+ - "\u0005@\u0000\u0000\u07df\u07e0\u0007\u000e\u0000\u0000\u07e0\u07e1\u0007"+ - "\u000f\u0000\u0000\u07e1\u07e2\u0007\u0010\u0000\u0000\u07e2\u07e3\u0007"+ - "\u0016\u0000\u0000\u07e3\u07e4\u0007\t\u0000\u0000\u07e4\u07e5\u0007\u0007"+ - "\u0000\u0000\u07e5\u08de\u0007\r\u0000\u0000\u07e6\u07e7\u0005@\u0000"+ - "\u0000\u07e7\u07e8\u0007\u0005\u0000\u0000\u07e8\u07e9\u0007\u0012\u0000"+ - "\u0000\u07e9\u07ea\u0007\u0013\u0000\u0000\u07ea\u07eb\u0007\u0015\u0000"+ - "\u0000\u07eb\u07ec\u0007\u0016\u0000\u0000\u07ec\u08de\u0007\r\u0000\u0000"+ - "\u07ed\u07ee\u0005@\u0000\u0000\u07ee\u07ef\u0007\n\u0000\u0000\u07ef"+ - "\u07f0\u0007\u0010\u0000\u0000\u07f0\u07f1\u0007\u0012\u0000\u0000\u07f1"+ - "\u07f2\u0007\u0007\u0000\u0000\u07f2\u07f3\u0007\t\u0000\u0000\u07f3\u07f4"+ - "\u0007\u0013\u0000\u0000\u07f4\u07f5\u0007\u0010\u0000\u0000\u07f5\u07f6"+ - "\u0007\u000e\u0000\u0000\u07f6\u08de\u0007\u0007\u0000\u0000\u07f7\u07f8"+ - "\u0005@\u0000\u0000\u07f8\u07f9\u0007\u000b\u0000\u0000\u07f9\u07fa\u0007"+ - "\u0015\u0000\u0000\u07fa\u07fb\u0007\u000e\u0000\u0000\u07fb\u07fc\u0007"+ - "\u0011\u0000\u0000\u07fc\u07fd\u0007\u0012\u0000\u0000\u07fd\u07fe\u0007"+ - "\u0007\u0000\u0000\u07fe\u07ff\u0007\n\u0000\u0000\u07ff\u08de\u0007\r"+ - "\u0000\u0000\u0800\u0801\u0005@\u0000\u0000\u0801\u0802\u0007\u0006\u0000"+ - "\u0000\u0802\u0803\u0007\u0015\u0000\u0000\u0803\u0804\u0007\n\u0000\u0000"+ - "\u0804\u0805\u0007\r\u0000\u0000\u0805\u0806\u0005-\u0000\u0000\u0806"+ - "\u0807\u0007\u0006\u0000\u0000\u0807\u0808\u0007\u0010\u0000\u0000\u0808"+ - "\u0809\u0007\u000e\u0000\u0000\u0809\u08de\u0007\u0007\u0000\u0000\u080a"+ - "\u080b\u0005@\u0000\u0000\u080b\u080c\u0007\u0013\u0000\u0000\u080c\u080d"+ - "\u0007\u0010\u0000\u0000\u080d\u080e\u0007\u001b\u0000\u0000\u080e\u08de"+ - "\u0007\u0007\u0000\u0000\u080f\u0810\u0005@\u0000\u0000\u0810\u0811\u0007"+ - "\b\u0000\u0000\u0811\u0812\u0007\u0010\u0000\u0000\u0812\u0813\u0007\u0014"+ - "\u0000\u0000\u0813\u0814\u0007\u0007\u0000\u0000\u0814\u08de\u0007\u0016"+ - "\u0000\u0000\u0815\u0816\u0005@\u0000\u0000\u0816\u0817\u0007\t\u0000"+ - "\u0000\u0817\u0818\u0007\u0011\u0000\u0000\u0818\u0819\u0007\u0013\u0000"+ - "\u0000\u0819\u081a\u0007\u0013\u0000\u0000\u081a\u081b\u0007\u0015\u0000"+ - "\u0000\u081b\u081c\u0007\u0016\u0000\u0000\u081c\u081d\u0007\r\u0000\u0000"+ - "\u081d\u08de\u0007\t\u0000\u0000\u081e\u081f\u0005@\u0000\u0000\u081f"+ - "\u0820\u0007\r\u0000\u0000\u0820\u0821\u0007\u0010\u0000\u0000\u0821\u0822"+ - "\u0007\u0005\u0000\u0000\u0822\u0823\u0007\b\u0000\u0000\u0823\u0824\u0007"+ - "\f\u0000\u0000\u0824\u0825\u0007\u0005\u0000\u0000\u0825\u0826\u0007\n"+ - "\u0000\u0000\u0826\u08de\u0007\u000b\u0000\u0000\u0827\u0828\u0005@\u0000"+ - "\u0000\u0828\u0829\u0007\u0010\u0000\u0000\u0829\u082a\u0007\u0013\u0000"+ - "\u0000\u082a\u082b\u0007\u0013\u0000\u0000\u082b\u082c\u0007\b\u0000\u0000"+ - "\u082c\u08de\u0007\u0014\u0000\u0000\u082d\u082e\u0005@\u0000\u0000\u082e"+ - "\u082f\u0005-\u0000\u0000\u082f\u0830\u0007\f\u0000\u0000\u0830\u0831"+ - "\u0007\u0007\u0000\u0000\u0831\u0832\u0007\u0017\u0000\u0000\u0832\u0833"+ - "\u0007\u0018\u0000\u0000\u0833\u0834\u0007\u0005\u0000\u0000\u0834\u0835"+ - "\u0007\r\u0000\u0000\u0835\u0836\u0005-\u0000\u0000\u0836\u0837\u0007"+ - "\u0018\u0000\u0000\u0837\u0838\u0007\u0007\u0000\u0000\u0838\u0839\u0007"+ - "\u0014\u0000\u0000\u0839\u083a\u0007\u0006\u0000\u0000\u083a\u083b\u0007"+ - "\u0016\u0000\u0000\u083b\u083c\u0007\u0010\u0000\u0000\u083c\u083d\u0007"+ - "\u0012\u0000\u0000\u083d\u083e\u0007\u0007\u0000\u0000\u083e\u08de\u0007"+ - "\t\u0000\u0000\u083f\u0840\u0005@\u0000\u0000\u0840\u0841\u0007\u0018"+ - "\u0000\u0000\u0841\u0842\u0007\u0007\u0000\u0000\u0842\u0843\u0007\u0014"+ - "\u0000\u0000\u0843\u0844\u0007\u0006\u0000\u0000\u0844\u0845\u0007\u0016"+ - "\u0000\u0000\u0845\u0846\u0007\u0010\u0000\u0000\u0846\u0847\u0007\u0012"+ - "\u0000\u0000\u0847\u0848\u0007\u0007\u0000\u0000\u0848\u08de\u0007\t\u0000"+ - "\u0000\u0849\u084a\u0005@\u0000\u0000\u084a\u084b\u0007\u000e\u0000\u0000"+ - "\u084b\u084c\u0007\u0015\u0000\u0000\u084c\u084d\u0007\u0011\u0000\u0000"+ - "\u084d\u084e\u0007\n\u0000\u0000\u084e\u084f\u0007\r\u0000\u0000\u084f"+ - "\u0850\u0007\u0007\u0000\u0000\u0850\u0851\u0007\u0016\u0000\u0000\u0851"+ - "\u0852\u0005-\u0000\u0000\u0852\u0853\u0007\t\u0000\u0000\u0853\u0854"+ - "\u0007\r\u0000\u0000\u0854\u0855\u0007\u0014\u0000\u0000\u0855\u0856\u0007"+ - "\b\u0000\u0000\u0856\u08de\u0007\u0007\u0000\u0000\u0857\u0858\u0005@"+ - "\u0000\u0000\u0858\u0859\u0007\u0006\u0000\u0000\u0859\u085a\u0007\u0015"+ - "\u0000\u0000\u085a\u085b\u0007\n\u0000\u0000\u085b\u085c\u0007\r\u0000"+ - "\u0000\u085c\u085d\u0005-\u0000\u0000\u085d\u085e\u0007\u0006\u0000\u0000"+ - "\u085e\u085f\u0007\u0007\u0000\u0000\u085f\u0860\u0007\u0010\u0000\u0000"+ - "\u0860\u0861\u0007\r\u0000\u0000\u0861\u0862\u0007\u0011\u0000\u0000\u0862"+ - "\u0863\u0007\u0016\u0000\u0000\u0863\u0864\u0007\u0007\u0000\u0000\u0864"+ - "\u0865\u0005-\u0000\u0000\u0865\u0866\u0007\u001c\u0000\u0000\u0866\u0867"+ - "\u0007\u0010\u0000\u0000\u0867\u0868\u0007\b\u0000\u0000\u0868\u0869\u0007"+ - "\u0011\u0000\u0000\u0869\u086a\u0007\u0007\u0000\u0000\u086a\u08de\u0007"+ - "\t\u0000\u0000\u086b\u086c\u0005@\u0000\u0000\u086c\u086d\u0007\u0013"+ - "\u0000\u0000\u086d\u086e\u0007\u0016\u0000\u0000\u086e\u086f\u0007\u0015"+ - "\u0000\u0000\u086f\u0870\u0007\u0013\u0000\u0000\u0870\u0871\u0007\u0007"+ - "\u0000\u0000\u0871\u0872\u0007\u0016\u0000\u0000\u0872\u0873\u0007\r\u0000"+ - "\u0000\u0873\u08de\u0007\u0014\u0000\u0000\u0874\u0875\u0005@\u0000\u0000"+ - "\u0875\u0876\u0007\t\u0000\u0000\u0876\u0877\u0007\u000e\u0000\u0000\u0877"+ - "\u0878\u0007\u0015\u0000\u0000\u0878\u0879\u0007\u0013\u0000\u0000\u0879"+ - "\u08de\u0007\u0007\u0000\u0000\u087a\u087b\u0005@\u0000\u0000\u087b\u087c"+ - "\u0007\t\u0000\u0000\u087c\u087d\u0007\r\u0000\u0000\u087d\u087e\u0007"+ - "\u0010\u0000\u0000\u087e\u087f\u0007\u0016\u0000\u0000\u087f\u0880\u0007"+ - "\r\u0000\u0000\u0880\u0881\u0007\u0005\u0000\u0000\u0881\u0882\u0007\n"+ - "\u0000\u0000\u0882\u0883\u0007\u001b\u0000\u0000\u0883\u0884\u0005-\u0000"+ - "\u0000\u0884\u0885\u0007\t\u0000\u0000\u0885\u0886\u0007\r\u0000\u0000"+ - "\u0886\u0887\u0007\u0014\u0000\u0000\u0887\u0888\u0007\b\u0000\u0000\u0888"+ - "\u08de\u0007\u0007\u0000\u0000\u0889\u088a\u0005@\u0000\u0000\u088a\u088b"+ - "\u0007\t\u0000\u0000\u088b\u088c\u0007\u0011\u0000\u0000\u088c\u088d\u0007"+ - "\u0013\u0000\u0000\u088d\u088e\u0007\u0013\u0000\u0000\u088e\u088f\u0007"+ - "\u0015\u0000\u0000\u088f\u0890\u0007\u0016\u0000\u0000\u0890\u0891\u0007"+ - "\r\u0000\u0000\u0891\u08de\u0007\t\u0000\u0000\u0892\u0893\u0005@\u0000"+ - "\u0000\u0893\u0894\u0007\u001c\u0000\u0000\u0894\u0895\u0007\u0005\u0000"+ - "\u0000\u0895\u0896\u0007\u0007\u0000\u0000\u0896\u0897\u0007\f\u0000\u0000"+ - "\u0897\u0898\u0005-\u0000\u0000\u0898\u0899\u0007\r\u0000\u0000\u0899"+ - "\u089a\u0007\u0016\u0000\u0000\u089a\u089b\u0007\u0010\u0000\u0000\u089b"+ - "\u089c\u0007\n\u0000\u0000\u089c\u089d\u0007\t\u0000\u0000\u089d\u089e"+ - "\u0007\u0005\u0000\u0000\u089e\u089f\u0007\r\u0000\u0000\u089f\u08a0\u0007"+ - "\u0005\u0000\u0000\u08a0\u08a1\u0007\u0015\u0000\u0000\u08a1\u08de\u0007"+ - "\n\u0000\u0000\u08a2\u08a3\u0005@\u0000\u0000\u08a3\u08a4\u0007\u000e"+ - "\u0000\u0000\u08a4\u08a5\u0007\u0015\u0000\u0000\u08a5\u08a6\u0007\n\u0000"+ - "\u0000\u08a6\u08a7\u0007\r\u0000\u0000\u08a7\u08a8\u0007\u0010\u0000\u0000"+ - "\u08a8\u08a9\u0007\u0005\u0000\u0000\u08a9\u08aa\u0007\n\u0000\u0000\u08aa"+ - "\u08ab\u0007\u0007\u0000\u0000\u08ab\u08de\u0007\u0016\u0000\u0000\u08ac"+ - "\u08ad\u0005@\u0000\u0000\u08ad\u08ae\u0007\u000e\u0000\u0000\u08ae\u08af"+ - "\u0007\u0015\u0000\u0000\u08af\u08b0\u0007\b\u0000\u0000\u08b0\u08b1\u0007"+ - "\u0015\u0000\u0000\u08b1\u08b2\u0007\u0016\u0000\u0000\u08b2\u08b3\u0005"+ - "-\u0000\u0000\u08b3\u08b4\u0007\u0013\u0000\u0000\u08b4\u08b5\u0007\u0016"+ - "\u0000\u0000\u08b5\u08b6\u0007\u0015\u0000\u0000\u08b6\u08b7\u0007\u0006"+ - "\u0000\u0000\u08b7\u08b8\u0007\u0005\u0000\u0000\u08b8\u08b9\u0007\b\u0000"+ - "\u0000\u08b9\u08de\u0007\u0007\u0000\u0000\u08ba\u08bb\u0005@\u0000\u0000"+ - "\u08bb\u08bc\u0007\t\u0000\u0000\u08bc\u08bd\u0007\r\u0000\u0000\u08bd"+ - "\u08be\u0007\u0014\u0000\u0000\u08be\u08bf\u0007\b\u0000\u0000\u08bf\u08c0"+ - "\u0007\u0007\u0000\u0000\u08c0\u08c1\u0007\t\u0000\u0000\u08c1\u08c2\u0007"+ - "\u0007\u0000\u0000\u08c2\u08de\u0007\r\u0000\u0000\u08c3\u08c4\u0005@"+ - "\u0000\u0000\u08c4\u08c5\u0007\u0006\u0000\u0000\u08c5\u08c6\u0007\u0015"+ - "\u0000\u0000\u08c6\u08c7\u0007\n\u0000\u0000\u08c7\u08c8\u0007\r\u0000"+ - "\u0000\u08c8\u08c9\u0005-\u0000\u0000\u08c9\u08ca\u0007\u0013\u0000\u0000"+ - "\u08ca\u08cb\u0007\u0010\u0000\u0000\u08cb\u08cc\u0007\b\u0000\u0000\u08cc"+ - "\u08cd\u0007\u0007\u0000\u0000\u08cd\u08ce\u0007\r\u0000\u0000\u08ce\u08cf"+ - "\u0007\r\u0000\u0000\u08cf\u08d0\u0007\u0007\u0000\u0000\u08d0\u08d1\u0005"+ - "-\u0000\u0000\u08d1\u08d2\u0007\u001c\u0000\u0000\u08d2\u08d3\u0007\u0010"+ - "\u0000\u0000\u08d3\u08d4\u0007\b\u0000\u0000\u08d4\u08d5\u0007\u0011\u0000"+ - "\u0000\u08d5\u08d6\u0007\u0007\u0000\u0000\u08d6\u08de\u0007\t\u0000\u0000"+ - "\u08d7\u08d8\u0005@\u0000\u0000\u08d8\u08d9\u0007\u0012\u0000\u0000\u08d9"+ - "\u08da\u0007\u0007\u0000\u0000\u08da\u08db\u0007\u000b\u0000\u0000\u08db"+ - "\u08dc\u0007\u0005\u0000\u0000\u08dc\u08de\u0007\u0010\u0000\u0000\u08dd"+ - "\u07de\u0001\u0000\u0000\u0000\u08dd\u07e6\u0001\u0000\u0000\u0000\u08dd"+ - "\u07ed\u0001\u0000\u0000\u0000\u08dd\u07f7\u0001\u0000\u0000\u0000\u08dd"+ - "\u0800\u0001\u0000\u0000\u0000\u08dd\u080a\u0001\u0000\u0000\u0000\u08dd"+ - "\u080f\u0001\u0000\u0000\u0000\u08dd\u0815\u0001\u0000\u0000\u0000\u08dd"+ - "\u081e\u0001\u0000\u0000\u0000\u08dd\u0827\u0001\u0000\u0000\u0000\u08dd"+ - "\u082d\u0001\u0000\u0000\u0000\u08dd\u083f\u0001\u0000\u0000\u0000\u08dd"+ - "\u0849\u0001\u0000\u0000\u0000\u08dd\u0857\u0001\u0000\u0000\u0000\u08dd"+ - "\u086b\u0001\u0000\u0000\u0000\u08dd\u0874\u0001\u0000\u0000\u0000\u08dd"+ - "\u087a\u0001\u0000\u0000\u0000\u08dd\u0889\u0001\u0000\u0000\u0000\u08dd"+ - "\u0892\u0001\u0000\u0000\u0000\u08dd\u08a2\u0001\u0000\u0000\u0000\u08dd"+ - "\u08ac\u0001\u0000\u0000\u0000\u08dd\u08ba\u0001\u0000\u0000\u0000\u08dd"+ - "\u08c3\u0001\u0000\u0000\u0000\u08dd\u08d7\u0001\u0000\u0000\u0000\u08de"+ - "\u08e2\u0001\u0000\u0000\u0000\u08df\u08e1\u0007%\u0000\u0000\u08e0\u08df"+ - "\u0001\u0000\u0000\u0000\u08e1\u08e4\u0001\u0000\u0000\u0000\u08e2\u08e0"+ - "\u0001\u0000\u0000\u0000\u08e2\u08e3\u0001\u0000\u0000\u0000\u08e3\u08e6"+ - "\u0001\u0000\u0000\u0000\u08e4\u08e2\u0001\u0000\u0000\u0000\u08e5\u07b0"+ - "\u0001\u0000\u0000\u0000\u08e5\u07b3\u0001\u0000\u0000\u0000\u08e5\u07b9"+ - "\u0001\u0000\u0000\u0000\u08e5\u07bf\u0001\u0000\u0000\u0000\u08e5\u08dd"+ - "\u0001\u0000\u0000\u0000\u08e6\u08e7\u0001\u0000\u0000\u0000\u08e7\u08e8"+ - "\u0006~\t\u0000\u08e8\u010b\u0001\u0000\u0000\u0000\u08e9\u08ea\u0003"+ - "\u00fex\u0000\u08ea\u08eb\u0001\u0000\u0000\u0000\u08eb\u08ec\u0006\u007f"+ - "\u0012\u0000\u08ec\u010d\u0001\u0000\u0000\u0000\u08ed\u08ee\u0003\u0100"+ - "y\u0000\u08ee\u08ef\u0001\u0000\u0000\u0000\u08ef\u08f0\u0006\u0080\u0013"+ - "\u0000\u08f0\u010f\u0001\u0000\u0000\u0000\u08f1\u08f3\u0005\\\u0000\u0000"+ - "\u08f2\u08f1\u0001\u0000\u0000\u0000\u08f2\u08f3\u0001\u0000\u0000\u0000"+ - "\u08f3\u08f7\u0001\u0000\u0000\u0000\u08f4\u08f5\u0003\u00f0q\u0000\u08f5"+ - "\u08f6\u0005\\\u0000\u0000\u08f6\u08f8\u0001\u0000\u0000\u0000\u08f7\u08f4"+ - "\u0001\u0000\u0000\u0000\u08f8\u08f9\u0001\u0000\u0000\u0000\u08f9\u08f7"+ - "\u0001\u0000\u0000\u0000\u08f9\u08fa\u0001\u0000\u0000\u0000\u08fa\u08fb"+ - "\u0001\u0000\u0000\u0000\u08fb\u08fc\u0006\u0081\u0014\u0000\u08fc\u0111"+ - "\u0001\u0000\u0000\u0000\u08fd\u08fe\u0003\u00f0q\u0000\u08fe\u08ff\u0001"+ - "\u0000\u0000\u0000\u08ff\u0900\u0006\u0082\u0015\u0000\u0900\u0113\u0001"+ - "\u0000\u0000\u0000\u0901\u0902\u0005:\u0000\u0000\u0902\u0903\u0005:\u0000"+ - "\u0000\u0903\u0904\u0001\u0000\u0000\u0000\u0904\u0905\u0006\u0083\u0016"+ - "\u0000\u0905\u0115\u0001\u0000\u0000\u0000\u0906\u0907\u0005}\u0000\u0000"+ - "\u0907\u0908\u0005}\u0000\u0000\u0908\u0909\u0001\u0000\u0000\u0000\u0909"+ - "\u090a\u0006\u0084\u0017\u0000\u090a\u0117\u0001\u0000\u0000\u0000\u090b"+ - "\u090c\u0005(\u0000\u0000\u090c\u090d\u0001\u0000\u0000\u0000\u090d\u090e"+ - "\u0006\u0085\u0018\u0000\u090e\u0119\u0001\u0000\u0000\u0000\u090f\u0910"+ - "\u0005)\u0000\u0000\u0910\u0911\u0001\u0000\u0000\u0000\u0911\u0912\u0006"+ - "\u0086\u0019\u0000\u0912\u011b\u0001\u0000\u0000\u0000\u0913\u0914\u0005"+ - "-\u0000\u0000\u0914\u0915\u0005>\u0000\u0000\u0915\u0916\u0001\u0000\u0000"+ - "\u0000\u0916\u0917\u0006\u0087\u001a\u0000\u0917\u011d\u0001\u0000\u0000"+ - "\u0000\u0918\u0919\t\u0000\u0000\u0000\u0919\u091a\u0001\u0000\u0000\u0000"+ - "\u091a\u091b\u0006\u0088\r\u0000\u091b\u011f\u0001\u0000\u0000\u0000\u091c"+ - "\u091d\u0005\u0000\u0000\u0001\u091d\u091e\u0001\u0000\u0000\u0000\u091e"+ - "\u091f\u0006\u0089\u001b\u0000\u091f\u0920\u0006\u0089\u0017\u0000\u0920"+ - "\u0121\u0001\u0000\u0000\u0000\u0921\u0922\u0003\u00fex\u0000\u0922\u0923"+ - "\u0001\u0000\u0000\u0000\u0923\u0924\u0006\u008a\u0012\u0000\u0924\u0123"+ - "\u0001\u0000\u0000\u0000\u0925\u0926\u0003\u0100y\u0000\u0926\u0927\u0001"+ - "\u0000\u0000\u0000\u0927\u0928\u0006\u008b\u0013\u0000\u0928\u0125\u0001"+ - "\u0000\u0000\u0000\u0929\u092b\u0005\\\u0000\u0000\u092a\u0929\u0001\u0000"+ - "\u0000\u0000\u092a\u092b\u0001\u0000\u0000\u0000\u092b\u092f\u0001\u0000"+ - "\u0000\u0000\u092c\u092d\u0003\u00f0q\u0000\u092d\u092e\u0005\\\u0000"+ - "\u0000\u092e\u0930\u0001\u0000\u0000\u0000\u092f\u092c\u0001\u0000\u0000"+ - "\u0000\u0930\u0931\u0001\u0000\u0000\u0000\u0931\u092f\u0001\u0000\u0000"+ - "\u0000\u0931\u0932\u0001\u0000\u0000\u0000\u0932\u0933\u0001\u0000\u0000"+ - "\u0000\u0933\u0934\u0006\u008c\u0014\u0000\u0934\u0127\u0001\u0000\u0000"+ - "\u0000\u0935\u0936\u0003\u00f0q\u0000\u0936\u0937\u0001\u0000\u0000\u0000"+ - "\u0937\u0938\u0006\u008d\u0015\u0000\u0938\u0129\u0001\u0000\u0000\u0000"+ - "\u0939\u093a\u0005:\u0000\u0000\u093a\u093b\u0005:\u0000\u0000\u093b\u093c"+ - "\u0001\u0000\u0000\u0000\u093c\u093d\u0006\u008e\u0016\u0000\u093d\u012b"+ - "\u0001\u0000\u0000\u0000\u093e\u093f\u0005!\u0000\u0000\u093f\u0940\u0005"+ - "!\u0000\u0000\u0940\u0941\u0005}\u0000\u0000\u0941\u0942\u0001\u0000\u0000"+ - "\u0000\u0942\u0943\u0006\u008f\u0017\u0000\u0943\u012d\u0001\u0000\u0000"+ - "\u0000\u0944\u0945\u0005(\u0000\u0000\u0945\u0946\u0001\u0000\u0000\u0000"+ - "\u0946\u0947\u0006\u0090\u0018\u0000\u0947\u012f\u0001\u0000\u0000\u0000"+ - "\u0948\u0949\u0005)\u0000\u0000\u0949\u094a\u0001\u0000\u0000\u0000\u094a"+ - "\u094b\u0006\u0091\u0019\u0000\u094b\u0131\u0001\u0000\u0000\u0000\u094c"+ - "\u094d\u0005-\u0000\u0000\u094d\u094e\u0005>\u0000\u0000\u094e\u094f\u0001"+ - "\u0000\u0000\u0000\u094f\u0950\u0006\u0092\u001a\u0000\u0950\u0133\u0001"+ - "\u0000\u0000\u0000\u0951\u0952\t\u0000\u0000\u0000\u0952\u0953\u0001\u0000"+ - "\u0000\u0000\u0953\u0954\u0006\u0093\r\u0000\u0954\u0135\u0001\u0000\u0000"+ - "\u0000\u0955\u0956\u0005\u0000\u0000\u0001\u0956\u0957\u0001\u0000\u0000"+ - "\u0000\u0957\u0958\u0006\u0094\u001b\u0000\u0958\u0959\u0006\u0094\u0017"+ - "\u0000\u0959\u0137\u0001\u0000\u0000\u0000\u095a\u095c\u0007%\u0000\u0000"+ - "\u095b\u095a\u0001\u0000\u0000\u0000\u095c\u095d\u0001\u0000\u0000\u0000"+ - "\u095d\u095b\u0001\u0000\u0000\u0000\u095d\u095e\u0001\u0000\u0000\u0000"+ - "\u095e\u095f\u0001\u0000\u0000\u0000\u095f\u0960\u0004\u0095\u0007\u0000"+ - "\u0960\u0961\u0001\u0000\u0000\u0000\u0961\u0962\u0006\u0095\r\u0000\u0962"+ - "\u0963\u0006\u0095\u0017\u0000\u0963\u0139\u0001\u0000\u0000\u0000\u0964"+ - "\u0966\u0007%\u0000\u0000\u0965\u0964\u0001\u0000"; - private static final String _serializedATNSegment1 = - "\u0000\u0000\u0966\u0967\u0001\u0000\u0000\u0000\u0967\u0965\u0001\u0000"+ - "\u0000\u0000\u0967\u0968\u0001\u0000\u0000\u0000\u0968\u0969\u0001\u0000"+ - "\u0000\u0000\u0969\u096a\u0006\u0096\r\u0000\u096a\u013b\u0001\u0000\u0000"+ - "\u0000\u096b\u096c\u0005(\u0000\u0000\u096c\u096d\u0001\u0000\u0000\u0000"+ - "\u096d\u096e\u0006\u0097\u001c\u0000\u096e\u096f\u0006\u0097\u001d\u0000"+ - "\u096f\u013d\u0001\u0000\u0000\u0000\u0970\u0971\t\u0000\u0000\u0000\u0971"+ - "\u0972\u0004\u0098\b\u0000\u0972\u0973\u0001\u0000\u0000\u0000\u0973\u0974"+ - "\u0006\u0098\t\u0000\u0974\u0975\u0006\u0098\u0017\u0000\u0975\u013f\u0001"+ - "\u0000\u0000\u0000\u0976\u0977\t\u0000\u0000\u0000\u0977\u0978\u0001\u0000"+ - "\u0000\u0000\u0978\u0979\u0006\u0099\t\u0000\u0979\u097a\u0006\u0099\u0017"+ - "\u0000\u097a\u0141\u0001\u0000\u0000\u0000\u097b\u097c\u0004\u009a\t\u0000"+ - "\u097c\u097d\u0005(\u0000\u0000\u097d\u097e\u0006\u009a\u001e\u0000\u097e"+ - "\u097f\u0001\u0000\u0000\u0000\u097f\u0980\u0006\u009a\u001c\u0000\u0980"+ - "\u0143\u0001\u0000\u0000\u0000\u0981\u0982\u0004\u009b\n\u0000\u0982\u0983"+ - "\u0005)\u0000\u0000\u0983\u0984\u0006\u009b\u001f\u0000\u0984\u0985\u0001"+ - "\u0000\u0000\u0000\u0985\u0986\u0006\u009b \u0000\u0986\u0987\u0006\u009b"+ - "!\u0000\u0987\u0145\u0001\u0000\u0000\u0000\u0988\u0989\u0004\u009c\u000b"+ - "\u0000\u0989\u098a\u0005(\u0000\u0000\u098a\u098b\u0006\u009c\"\u0000"+ - "\u098b\u098c\u0001\u0000\u0000\u0000\u098c\u098d\u0006\u009c\u001c\u0000"+ - "\u098d\u0147\u0001\u0000\u0000\u0000\u098e\u098f\u0004\u009d\f\u0000\u098f"+ - "\u0990\u0005)\u0000\u0000\u0990\u0991\u0006\u009d#\u0000\u0991\u0992\u0001"+ - "\u0000\u0000\u0000\u0992\u0993\u0006\u009d\u001c\u0000\u0993\u0149\u0001"+ - "\u0000\u0000\u0000\u0994\u0995\u0005)\u0000\u0000\u0995\u0996\u0004\u009e"+ - "\r\u0000\u0996\u0997\u0001\u0000\u0000\u0000\u0997\u0998\u0006\u009e "+ - "\u0000\u0998\u0999\u0006\u009e!\u0000\u0999\u014b\u0001\u0000\u0000\u0000"+ - "\u099a\u099b\t\u0000\u0000\u0000\u099b\u099c\u0001\u0000\u0000\u0000\u099c"+ - "\u099d\u0006\u009f\u001c\u0000\u099d\u014d\u0001\u0000\u0000\u0000\u099e"+ - "\u099f\u0005\u0000\u0000\u0001\u099f\u09a0\u0001\u0000\u0000\u0000\u09a0"+ - "\u09a1\u0006\u00a0\u001b\u0000\u09a1\u09a2\u0006\u00a0\u0017\u0000\u09a2"+ - "\u014f\u0001\u0000\u0000\u0000\u09a3\u09a5\u0007%\u0000\u0000\u09a4\u09a3"+ - "\u0001\u0000\u0000\u0000\u09a5\u09a6\u0001\u0000\u0000\u0000\u09a6\u09a4"+ - "\u0001\u0000\u0000\u0000\u09a6\u09a7\u0001\u0000\u0000\u0000\u09a7\u09a8"+ - "\u0001\u0000\u0000\u0000\u09a8\u09a9\u0006\u00a1\r\u0000\u09a9\u0151\u0001"+ - "\u0000\u0000\u0000\u09aa\u09ab\u0005(\u0000\u0000\u09ab\u09ac\u0006\u00a2"+ - "$\u0000\u09ac\u09ad\u0001\u0000\u0000\u0000\u09ad\u09ae\u0006\u00a2%\u0000"+ - "\u09ae\u0153\u0001\u0000\u0000\u0000\u09af\u09b0\t\u0000\u0000\u0000\u09b0"+ - "\u09b1\u0001\u0000\u0000\u0000\u09b1\u09b2\u0006\u00a3\t\u0000\u09b2\u09b3"+ - "\u0006\u00a3\u0017\u0000\u09b3\u0155\u0001\u0000\u0000\u0000\u09b4\u09b5"+ - "\u0005[\u0000\u0000\u09b5\u09b6\u0006\u00a4&\u0000\u09b6\u09b7\u0001\u0000"+ - "\u0000\u0000\u09b7\u09b8\u0006\u00a4\'\u0000\u09b8\u0157\u0001\u0000\u0000"+ - "\u0000\u09b9\u09ba\u0005]\u0000\u0000\u09ba\u09bb\u0006\u00a5(\u0000\u09bb"+ - "\u09bc\u0001\u0000\u0000\u0000\u09bc\u09bd\u0006\u00a5)\u0000\u09bd\u0159"+ - "\u0001\u0000\u0000\u0000\u09be\u09bf\u0005{\u0000\u0000\u09bf\u09c0\u0006"+ - "\u00a6*\u0000\u09c0\u09c1\u0001\u0000\u0000\u0000\u09c1\u09c2\u0006\u00a6"+ - " \u0000\u09c2\u015b\u0001\u0000\u0000\u0000\u09c3\u09c4\u0005}\u0000\u0000"+ - "\u09c4\u09c5\u0006\u00a7+\u0000\u09c5\u09c6\u0001\u0000\u0000\u0000\u09c6"+ - "\u09c7\u0006\u00a7 \u0000\u09c7\u015d\u0001\u0000\u0000\u0000\u09c8\u09cb"+ - "\u0003\u00f8u\u0000\u09c9\u09cb\u0003\u00fav\u0000\u09ca\u09c8\u0001\u0000"+ - "\u0000\u0000\u09ca\u09c9\u0001\u0000\u0000\u0000\u09cb\u015f\u0001\u0000"+ - "\u0000\u0000\u09cc\u09cd\u0003\u00fex\u0000\u09cd\u09ce\u0001\u0000\u0000"+ - "\u0000\u09ce\u09cf\u0006\u00a9\u0012\u0000\u09cf\u0161\u0001\u0000\u0000"+ - "\u0000\u09d0\u09d1\u0003\u0100y\u0000\u09d1\u09d2\u0001\u0000\u0000\u0000"+ - "\u09d2\u09d3\u0006\u00aa\u0013\u0000\u09d3\u0163\u0001\u0000\u0000\u0000"+ - "\u09d4\u09d6\u0005\\\u0000\u0000\u09d5\u09d4\u0001\u0000\u0000\u0000\u09d5"+ - "\u09d6\u0001\u0000\u0000\u0000\u09d6\u09da\u0001\u0000\u0000\u0000\u09d7"+ - "\u09d8\u0003\u00f0q\u0000\u09d8\u09d9\u0005\\\u0000\u0000\u09d9\u09db"+ - "\u0001\u0000\u0000\u0000\u09da\u09d7\u0001\u0000\u0000\u0000\u09db\u09dc"+ - "\u0001\u0000\u0000\u0000\u09dc\u09da\u0001\u0000\u0000\u0000\u09dc\u09dd"+ - "\u0001\u0000\u0000\u0000\u09dd\u09de\u0001\u0000\u0000\u0000\u09de\u09df"+ - "\u0006\u00ab\u0014\u0000\u09df\u0165\u0001\u0000\u0000\u0000\u09e0\u09e1"+ - "\u0003\u00f0q\u0000\u09e1\u09e2\u0001\u0000\u0000\u0000\u09e2\u09e3\u0006"+ - "\u00ac\u0015\u0000\u09e3\u0167\u0001\u0000\u0000\u0000\u09e4\u09e5\u0005"+ - ":\u0000\u0000\u09e5\u09e6\u0005:\u0000\u0000\u09e6\u09e7\u0001\u0000\u0000"+ - "\u0000\u09e7\u09e8\u0006\u00ad\u0016\u0000\u09e8\u0169\u0001\u0000\u0000"+ - "\u0000\u09e9\u09ea\u0005(\u0000\u0000\u09ea\u09eb\u0006\u00ae,\u0000\u09eb"+ - "\u09ec\u0001\u0000\u0000\u0000\u09ec\u09ed\u0006\u00ae\u0018\u0000\u09ed"+ - "\u016b\u0001\u0000\u0000\u0000\u09ee\u09ef\u0005)\u0000\u0000\u09ef\u09f0"+ - "\u0006\u00af-\u0000\u09f0\u016d\u0001\u0000\u0000\u0000\u09f1\u09f2\t"+ - "\u0000\u0000\u0000\u09f2\u09f3\u0001\u0000\u0000\u0000\u09f3\u09f4\u0006"+ - "\u00b0\r\u0000\u09f4\u016f\u0001\u0000\u0000\u0000\u09f5\u09f6\u0005\u0000"+ - "\u0000\u0001\u09f6\u09f7\u0001\u0000\u0000\u0000\u09f7\u09f8\u0006\u00b1"+ - "\u001b\u0000\u09f8\u09f9\u0006\u00b1\u0017\u0000\u09f9\u0171\u0001\u0000"+ - "\u0000\u0000\u09fa\u09fc\u0007%\u0000\u0000\u09fb\u09fa\u0001\u0000\u0000"+ - "\u0000\u09fc\u09fd\u0001\u0000\u0000\u0000\u09fd\u09fb\u0001\u0000\u0000"+ - "\u0000\u09fd\u09fe\u0001\u0000\u0000\u0000\u09fe\u09ff\u0001\u0000\u0000"+ - "\u0000\u09ff\u0a00\u0006\u00b2\r\u0000\u0a00\u0173\u0001\u0000\u0000\u0000"+ - "\u0a01\u0a02\u0005(\u0000\u0000\u0a02\u0a03\u0006\u00b3.\u0000\u0a03\u0a04"+ - "\u0001\u0000\u0000\u0000\u0a04\u0a05\u0006\u00b3/\u0000\u0a05\u0a06\u0006"+ - "\u00b30\u0000\u0a06\u0175\u0001\u0000\u0000\u0000\u0a07\u0a08\t\u0000"+ - "\u0000\u0000\u0a08\u0a09\u0001\u0000\u0000\u0000\u0a09\u0a0a\u0006\u00b4"+ - "\t\u0000\u0a0a\u0a0b\u0006\u00b4\u0017\u0000\u0a0b\u0177\u0001\u0000\u0000"+ - "\u0000\u0a0c\u0a0e\u0007%\u0000\u0000\u0a0d\u0a0c\u0001\u0000\u0000\u0000"+ - "\u0a0e\u0a0f\u0001\u0000\u0000\u0000\u0a0f\u0a0d\u0001\u0000\u0000\u0000"+ - "\u0a0f\u0a10\u0001\u0000\u0000\u0000\u0a10\u0a11\u0001\u0000\u0000\u0000"+ - "\u0a11\u0a12\u0006\u00b5\r\u0000\u0a12\u0179\u0001\u0000\u0000\u0000\u0a13"+ - "\u0a14\u0005(\u0000\u0000\u0a14\u0a15\u0006\u00b61\u0000\u0a15\u017b\u0001"+ - "\u0000\u0000\u0000\u0a16\u0a17\u0005)\u0000\u0000\u0a17\u0a18\u0006\u00b7"+ - "2\u0000\u0a18\u017d\u0001\u0000\u0000\u0000\u0a19\u0a1a\u0007\u0010\u0000"+ - "\u0000\u0a1a\u0a1b\u0007\t\u0000\u0000\u0a1b\u017f\u0001\u0000\u0000\u0000"+ - "\u0a1c\u0a1d\u0003\u00fex\u0000\u0a1d\u0a1e\u0001\u0000\u0000\u0000\u0a1e"+ - "\u0a1f\u0006\u00b9\u0012\u0000\u0a1f\u0181\u0001\u0000\u0000\u0000\u0a20"+ - "\u0a21\u0005=\u0000\u0000\u0a21\u0a22\u0005>\u0000\u0000\u0a22\u0183\u0001"+ - "\u0000\u0000\u0000\u0a23\u0a24\u0003\u0100y\u0000\u0a24\u0a25\u0001\u0000"+ - "\u0000\u0000\u0a25\u0a26\u0006\u00bb \u0000\u0a26\u0185\u0001\u0000\u0000"+ - "\u0000\u0a27\u0a2b\u0003\u00f8u\u0000\u0a28\u0a2b\u0003\u00fav\u0000\u0a29"+ - "\u0a2b\u0003\u00f0q\u0000\u0a2a\u0a27\u0001\u0000\u0000\u0000\u0a2a\u0a28"+ - "\u0001\u0000\u0000\u0000\u0a2a\u0a29\u0001\u0000\u0000\u0000\u0a2b\u0a2c"+ - "\u0001\u0000\u0000\u0000\u0a2c\u0a2d\u0006\u00bc \u0000\u0a2d\u0187\u0001"+ - "\u0000\u0000\u0000\u0a2e\u0a2f\u0005:\u0000\u0000\u0a2f\u0a30\u0005:\u0000"+ - "\u0000\u0a30\u0a31\u0001\u0000\u0000\u0000\u0a31\u0a32\u0006\u00bd \u0000"+ - "\u0a32\u0189\u0001\u0000\u0000\u0000\u0a33\u0a34\t\u0000\u0000\u0000\u0a34"+ - "\u0a35\u0001\u0000\u0000\u0000\u0a35\u0a36\u0006\u00be \u0000\u0a36\u018b"+ - "\u0001\u0000\u0000\u0000\u0a37\u0a38\u0005\u0000\u0000\u0001\u0a38\u0a39"+ - "\u0001\u0000\u0000\u0000\u0a39\u0a3a\u0006\u00bf\u001b\u0000\u0a3a\u0a3b"+ - "\u0006\u00bf\u0017\u0000\u0a3b\u018d\u0001\u0000\u0000\u0000\u0a3c\u0a3d"+ - "\u0003\u00fcw\u0000\u0a3d\u0a3e\u0001\u0000\u0000\u0000\u0a3e\u0a3f\u0006"+ - "\u00c03\u0000\u0a3f\u018f\u0001\u0000\u0000\u0000\u0a40\u0a41\u0005[\u0000"+ - "\u0000\u0a41\u0a42\u0006\u00c14\u0000\u0a42\u0191\u0001\u0000\u0000\u0000"+ - "\u0a43\u0a44\u0005]\u0000\u0000\u0a44\u0a45\u0006\u00c25\u0000\u0a45\u0193"+ - "\u0001\u0000\u0000\u0000\u0a46\u0a47\u0005{\u0000\u0000\u0a47\u0a48\u0006"+ - "\u00c36\u0000\u0a48\u0a49\u0001\u0000\u0000\u0000\u0a49\u0a4a\u0006\u00c3"+ - "7\u0000\u0a4a\u0195\u0001\u0000\u0000\u0000\u0a4b\u0a4c\u0005}\u0000\u0000"+ - "\u0a4c\u0a4d\u0006\u00c48\u0000\u0a4d\u0a4e\u0001\u0000\u0000\u0000\u0a4e"+ - "\u0a4f\u0006\u00c47\u0000\u0a4f\u0197\u0001\u0000\u0000\u0000\u0a50\u0a51"+ - "\u0005(\u0000\u0000\u0a51\u0a52\u0006\u00c59\u0000\u0a52\u0a53\u0001\u0000"+ - "\u0000\u0000\u0a53\u0a54\u0006\u00c57\u0000\u0a54\u0199\u0001\u0000\u0000"+ - "\u0000\u0a55\u0a56\u0005)\u0000\u0000\u0a56\u0a57\u0006\u00c6:\u0000\u0a57"+ - "\u019b\u0001\u0000\u0000\u0000\u0a58\u0a5b\u0003\u00f8u\u0000\u0a59\u0a5b"+ - "\u0003\u00fav\u0000\u0a5a\u0a58\u0001\u0000\u0000\u0000\u0a5a\u0a59\u0001"+ - "\u0000\u0000\u0000\u0a5b\u019d\u0001\u0000\u0000\u0000\u0a5c\u0a5d\u0003"+ - "\u00fex\u0000\u0a5d\u0a5e\u0001\u0000\u0000\u0000\u0a5e\u0a5f\u0006\u00c8"+ - "\u0012\u0000\u0a5f\u019f\u0001\u0000\u0000\u0000\u0a60\u0a61\u0005=\u0000"+ - "\u0000\u0a61\u0a62\u0005>\u0000\u0000\u0a62\u01a1\u0001\u0000\u0000\u0000"+ - "\u0a63\u0a64\u0003\u0100y\u0000\u0a64\u0a65\u0001\u0000\u0000\u0000\u0a65"+ - "\u0a66\u0006\u00ca\u0013\u0000\u0a66\u01a3\u0001\u0000\u0000\u0000\u0a67"+ - "\u0a68\u0005.\u0000\u0000\u0a68\u01a5\u0001\u0000\u0000\u0000\u0a69\u0a6a"+ - "\u0005,\u0000\u0000\u0a6a\u0a6b\u0006\u00cc;\u0000\u0a6b\u01a7\u0001\u0000"+ - "\u0000\u0000\u0a6c\u0a6e\u0007&\u0000\u0000\u0a6d\u0a6c\u0001\u0000\u0000"+ - "\u0000\u0a6e\u0a6f\u0001\u0000\u0000\u0000\u0a6f\u0a6d\u0001\u0000\u0000"+ - "\u0000\u0a6f\u0a70\u0001\u0000\u0000\u0000\u0a70\u0a71\u0001\u0000\u0000"+ - "\u0000\u0a71\u0a72\u0006\u00cd\r\u0000\u0a72\u01a9\u0001\u0000\u0000\u0000"+ - "\u0a73\u0a74\u0003\u00f0q\u0000\u0a74\u01ab\u0001\u0000\u0000\u0000\u0a75"+ - "\u0a76\t\u0000\u0000\u0000\u0a76\u0a77\u0001\u0000\u0000\u0000\u0a77\u0a78"+ - "\u0006\u00cf7\u0000\u0a78\u01ad\u0001\u0000\u0000\u0000\u0a79\u0a7a\u0005"+ - "\u0000\u0000\u0001\u0a7a\u0a7b\u0001\u0000\u0000\u0000\u0a7b\u0a7c\u0006"+ - "\u00d0\u001b\u0000\u0a7c\u0a7d\u0006\u00d0\u0017\u0000\u0a7d\u01af\u0001"+ - "\u0000\u0000\u0000\u0a7e\u0a7f\u0005/\u0000\u0000\u0a7f\u0a80\u0005/\u0000"+ - "\u0000\u0a80\u0a82\u0001\u0000\u0000\u0000\u0a81\u0a83\b\u001f\u0000\u0000"+ - "\u0a82\u0a81\u0001\u0000\u0000\u0000\u0a83\u0a84\u0001\u0000\u0000\u0000"+ - "\u0a84\u0a82\u0001\u0000\u0000\u0000\u0a84\u0a85\u0001\u0000\u0000\u0000"+ - "\u0a85\u0a86\u0001\u0000\u0000\u0000\u0a86\u0a87\u0006\u00d1\r\u0000\u0a87"+ - "\u01b1\u0001\u0000\u0000\u0000\u0a88\u0a89\u0005/\u0000\u0000\u0a89\u0a8a"+ - "\u0005*\u0000\u0000\u0a8a\u0a8e\u0001\u0000\u0000\u0000\u0a8b\u0a8d\t"+ - "\u0000\u0000\u0000\u0a8c\u0a8b\u0001\u0000\u0000\u0000\u0a8d\u0a90\u0001"+ - "\u0000\u0000\u0000\u0a8e\u0a8f\u0001\u0000\u0000\u0000\u0a8e\u0a8c\u0001"+ - "\u0000\u0000\u0000\u0a8f\u0a91\u0001\u0000\u0000\u0000\u0a90\u0a8e\u0001"+ - "\u0000\u0000\u0000\u0a91\u0a92\u0005*\u0000\u0000\u0a92\u0a93\u0005/\u0000"+ - "\u0000\u0a93\u0a97\u0001\u0000\u0000\u0000\u0a94\u0a96\u0007\u001f\u0000"+ - "\u0000\u0a95\u0a94\u0001\u0000\u0000\u0000\u0a96\u0a99\u0001\u0000\u0000"+ - "\u0000\u0a97\u0a95\u0001\u0000\u0000\u0000\u0a97\u0a98\u0001\u0000\u0000"+ - "\u0000\u0a98\u0a9a\u0001\u0000\u0000\u0000\u0a99\u0a97\u0001\u0000\u0000"+ - "\u0000\u0a9a\u0a9b\u0006\u00d2\r\u0000\u0a9b\u01b3\u0001\u0000\u0000\u0000"+ - "\u0a9c\u0a9d\u0005@\u0000\u0000\u0a9d\u0a9e\u0007\u0007\u0000\u0000\u0a9e"+ - "\u0a9f\u0007\n\u0000\u0000\u0a9f\u0aa0\u0007\u000b\u0000\u0000\u0aa0\u0aa1"+ - "\u0007\u0013\u0000\u0000\u0aa1\u0aa2\u0007\u000f\u0000\u0000\u0aa2\u0aa3"+ - "\u0007\u0013\u0000\u0000\u0aa3\u0aa4\u0001\u0000\u0000\u0000\u0aa4\u0aa5"+ - "\u0006\u00d3\u0017\u0000\u0aa5\u01b5\u0001\u0000\u0000\u0000\u0aa6\u0aa7"+ - "\u0005@\u0000\u0000\u0aa7\u0aa8\u0001\u0000\u0000\u0000\u0aa8\u0aa9\u0006"+ - "\u00d4\t\u0000\u0aa9\u0aaa\u0006\u00d4\u0017\u0000\u0aaa\u01b7\u0001\u0000"+ - "\u0000\u0000\u0aab\u0aac\u0005[\u0000\u0000\u0aac\u0aad\u0001\u0000\u0000"+ - "\u0000\u0aad\u0aae\u0006\u00d5 \u0000\u0aae\u01b9\u0001\u0000\u0000\u0000"+ - "\u0aaf\u0ab0\u0005]\u0000\u0000\u0ab0\u0ab1\u0001\u0000\u0000\u0000\u0ab1"+ - "\u0ab2\u0006\u00d6 \u0000\u0ab2\u01bb\u0001\u0000\u0000\u0000\u0ab3\u0ab4"+ - "\u0005{\u0000\u0000\u0ab4\u0ab5\u0001\u0000\u0000\u0000\u0ab5\u0ab6\u0006"+ - "\u00d7 \u0000\u0ab6\u01bd\u0001\u0000\u0000\u0000\u0ab7\u0ab8\u0005}\u0000"+ - "\u0000\u0ab8\u0ab9\u0001\u0000\u0000\u0000\u0ab9\u0aba\u0006\u00d8 \u0000"+ - "\u0aba\u01bf\u0001\u0000\u0000\u0000\u0abb\u0abe\u0003\u00f8u\u0000\u0abc"+ - "\u0abe\u0003\u00fav\u0000\u0abd\u0abb\u0001\u0000\u0000\u0000\u0abd\u0abc"+ - "\u0001\u0000\u0000\u0000\u0abe\u0abf\u0001\u0000\u0000\u0000\u0abf\u0ac0"+ - "\u0006\u00d9<\u0000\u0ac0\u01c1\u0001\u0000\u0000\u0000\u0ac1\u0ac2\u0003"+ - "\u00fex\u0000\u0ac2\u0ac3\u0001\u0000\u0000\u0000\u0ac3\u0ac4\u0006\u00da"+ - "\u0012\u0000\u0ac4\u01c3\u0001\u0000\u0000\u0000\u0ac5\u0ac6\u0007\n\u0000"+ - "\u0000\u0ac6\u0ac7\u0007\u0007\u0000\u0000\u0ac7\u0ac8\u0007\f\u0000\u0000"+ - "\u0ac8\u0ac9\u0001\u0000\u0000\u0000\u0ac9\u0aca\u0004\u00db\u000e\u0000"+ - "\u0aca\u0acb\u0001\u0000\u0000\u0000\u0acb\u0acc\u0006\u00db=\u0000\u0acc"+ - "\u01c5\u0001\u0000\u0000\u0000\u0acd\u0ace\u0007\u000e\u0000\u0000\u0ace"+ - "\u0acf\u0007\b\u0000\u0000\u0acf\u0ad0\u0007\u0010\u0000\u0000\u0ad0\u0ad1"+ - "\u0007\t\u0000\u0000\u0ad1\u0ad2\u0007\t\u0000\u0000\u0ad2\u0ad3\u0001"+ - "\u0000\u0000\u0000\u0ad3\u0ad4\u0006\u00dc>\u0000\u0ad4\u01c7\u0001\u0000"+ - "\u0000\u0000\u0ad5\u0ad6\u0003\u0100y\u0000\u0ad6\u0ad7\u0001\u0000\u0000"+ - "\u0000\u0ad7\u0ad8\u0006\u00dd\u0013\u0000\u0ad8\u01c9\u0001\u0000\u0000"+ - "\u0000\u0ad9\u0adb\u0005\\\u0000\u0000\u0ada\u0ad9\u0001\u0000\u0000\u0000"+ - "\u0ada\u0adb\u0001\u0000\u0000\u0000\u0adb\u0adf\u0001\u0000\u0000\u0000"+ - "\u0adc\u0add\u0003\u00f0q\u0000\u0add\u0ade\u0005\\\u0000\u0000\u0ade"+ - "\u0ae0\u0001\u0000\u0000\u0000\u0adf\u0adc\u0001\u0000\u0000\u0000\u0ae0"+ - "\u0ae1\u0001\u0000\u0000\u0000\u0ae1\u0adf\u0001\u0000\u0000\u0000\u0ae1"+ - "\u0ae2\u0001\u0000\u0000\u0000\u0ae2\u0ae3\u0001\u0000\u0000\u0000\u0ae3"+ - "\u0ae4\u0006\u00de\u0014\u0000\u0ae4\u01cb\u0001\u0000\u0000\u0000\u0ae5"+ - "\u0ae6\u0005\\\u0000\u0000\u0ae6\u0ae7\u0003\u00f0q\u0000\u0ae7\u0ae8"+ - "\u0001\u0000\u0000\u0000\u0ae8\u0ae9\u0006\u00df\u0015\u0000\u0ae9\u01cd"+ - "\u0001\u0000\u0000\u0000\u0aea\u0aeb\u0003\u00f0q\u0000\u0aeb\u0aec\u0001"+ - "\u0000\u0000\u0000\u0aec\u0aed\u0006\u00e0\u0015\u0000\u0aed\u01cf\u0001"+ - "\u0000\u0000\u0000\u0aee\u0aef\u0005:\u0000\u0000\u0aef\u0af0\u0005:\u0000"+ - "\u0000\u0af0\u0af1\u0001\u0000\u0000\u0000\u0af1\u0af2\u0006\u00e1\u0016"+ - "\u0000\u0af2\u01d1\u0001\u0000\u0000\u0000\u0af3\u0af4\u0005(\u0000\u0000"+ - "\u0af4\u0af5\u0001\u0000\u0000\u0000\u0af5\u0af6\u0006\u00e2\u0018\u0000"+ - "\u0af6\u01d3\u0001\u0000\u0000\u0000\u0af7\u0af8\u0005)\u0000\u0000\u0af8"+ - "\u0af9\u0001\u0000\u0000\u0000\u0af9\u0afa\u0006\u00e3\u0019\u0000\u0afa"+ - "\u01d5\u0001\u0000\u0000\u0000\u0afb\u0afc\u0005 \u0000\u0000\u0afc\u0afd"+ - "\u0001\u0000\u0000\u0000\u0afd\u0afe\u0006\u00e4\r\u0000\u0afe\u01d7\u0001"+ - "\u0000\u0000\u0000\u0aff\u0b00\u0005\u0000\u0000\u0001\u0b00\u0b01\u0001"+ - "\u0000\u0000\u0000\u0b01\u0b02\u0006\u00e5\u001b\u0000\u0b02\u0b03\u0006"+ - "\u00e5\u0017\u0000\u0b03\u01d9\u0001\u0000\u0000\u0000\u0b04\u0b05\t\u0000"+ - "\u0000\u0000\u0b05\u0b06\u0001\u0000\u0000\u0000\u0b06\u0b07\u0006\u00e6"+ - "\r\u0000\u0b07\u01db\u0001\u0000\u0000\u0000\u0b08\u0b09\u0005?\u0000"+ - "\u0000\u0b09\u0b0a\u0005>\u0000\u0000\u0b0a\u0b0b\u0001\u0000\u0000\u0000"+ - "\u0b0b\u0b0c\u0006\u00e7\u0017\u0000\u0b0c\u01dd\u0001\u0000\u0000\u0000"+ - "\u0b0d\u0b0e\u0005/\u0000\u0000\u0b0e\u0b0f\u0005/\u0000\u0000\u0b0f\u0b11"+ - "\u0001\u0000\u0000\u0000\u0b10\u0b12\b\u001f\u0000\u0000\u0b11\u0b10\u0001"+ - "\u0000\u0000\u0000\u0b12\u0b13\u0001\u0000\u0000\u0000\u0b13\u0b11\u0001"+ - "\u0000\u0000\u0000\u0b13\u0b14\u0001\u0000\u0000\u0000\u0b14\u0b15\u0001"+ - "\u0000\u0000\u0000\u0b15\u0b16\u0006\u00e8\r\u0000\u0b16\u01df\u0001\u0000"+ - "\u0000\u0000\u0b17\u0b18\u0005/\u0000\u0000\u0b18\u0b19\u0005*\u0000\u0000"+ - "\u0b19\u0b1d\u0001\u0000\u0000\u0000\u0b1a\u0b1c\t\u0000\u0000\u0000\u0b1b"+ - "\u0b1a\u0001\u0000\u0000\u0000\u0b1c\u0b1f\u0001\u0000\u0000\u0000\u0b1d"+ - "\u0b1e\u0001\u0000\u0000\u0000\u0b1d\u0b1b\u0001\u0000\u0000\u0000\u0b1e"+ - "\u0b20\u0001\u0000\u0000\u0000\u0b1f\u0b1d\u0001\u0000\u0000\u0000\u0b20"+ - "\u0b21\u0005*\u0000\u0000\u0b21\u0b22\u0005/\u0000\u0000\u0b22\u0b23\u0001"+ - "\u0000\u0000\u0000\u0b23\u0b24\u0006\u00e9\r\u0000\u0b24\u01e1\u0001\u0000"+ - "\u0000\u0000\u0b25\u0b26\u0005[\u0000\u0000\u0b26\u0b27\u0001\u0000\u0000"+ - "\u0000\u0b27\u0b28\u0006\u00ea \u0000\u0b28\u01e3\u0001\u0000\u0000\u0000"+ - "\u0b29\u0b2a\u0005]\u0000\u0000\u0b2a\u0b2b\u0001\u0000\u0000\u0000\u0b2b"+ - "\u0b2c\u0006\u00eb \u0000\u0b2c\u01e5\u0001\u0000\u0000\u0000\u0b2d\u0b2e"+ - "\u0005{\u0000\u0000\u0b2e\u0b2f\u0001\u0000\u0000\u0000\u0b2f\u0b30\u0006"+ - "\u00ec \u0000\u0b30\u01e7\u0001\u0000\u0000\u0000\u0b31\u0b32\u0005}\u0000"+ - "\u0000\u0b32\u0b33\u0001\u0000\u0000\u0000\u0b33\u0b34\u0006\u00ed \u0000"+ - "\u0b34\u01e9\u0001\u0000\u0000\u0000\u0b35\u0b38\u0003\u00f8u\u0000\u0b36"+ - "\u0b38\u0003\u00fav\u0000\u0b37\u0b35\u0001\u0000\u0000\u0000\u0b37\u0b36"+ - "\u0001\u0000\u0000\u0000\u0b38\u0b39\u0001\u0000\u0000\u0000\u0b39\u0b3a"+ - "\u0006\u00ee<\u0000\u0b3a\u01eb\u0001\u0000\u0000\u0000\u0b3b\u0b3c\u0003"+ - "\u00fex\u0000\u0b3c\u0b3d\u0001\u0000\u0000\u0000\u0b3d\u0b3e\u0006\u00ef"+ - "\u0012\u0000\u0b3e\u01ed\u0001\u0000\u0000\u0000\u0b3f\u0b40\u0003\u0100"+ - "y\u0000\u0b40\u0b41\u0001\u0000\u0000\u0000\u0b41\u0b42\u0006\u00f0\u0013"+ - "\u0000\u0b42\u01ef\u0001\u0000\u0000\u0000\u0b43\u0b44\u0003\u00f0q\u0000"+ - "\u0b44\u0b45\u0001\u0000\u0000\u0000\u0b45\u0b46\u0006\u00f1\u0015\u0000"+ - "\u0b46\u01f1\u0001\u0000\u0000\u0000\u0b47\u0b48\u0005:\u0000\u0000\u0b48"+ - "\u0b49\u0005:\u0000\u0000\u0b49\u0b4a\u0001\u0000\u0000\u0000\u0b4a\u0b4b"+ - "\u0006\u00f2\u0016\u0000\u0b4b\u01f3\u0001\u0000\u0000\u0000\u0b4c\u0b4d"+ - "\u0005-\u0000\u0000\u0b4d\u0b4e\u0005>\u0000\u0000\u0b4e\u0b4f\u0001\u0000"+ - "\u0000\u0000\u0b4f\u0b50\u0006\u00f3\u001a\u0000\u0b50\u01f5\u0001\u0000"+ - "\u0000\u0000\u0b51\u0b52\u0005(\u0000\u0000\u0b52\u0b53\u0001\u0000\u0000"+ - "\u0000\u0b53\u0b54\u0006\u00f4\u0018\u0000\u0b54\u01f7\u0001\u0000\u0000"+ - "\u0000\u0b55\u0b56\u0005)\u0000\u0000\u0b56\u0b57\u0001\u0000\u0000\u0000"+ - "\u0b57\u0b58\u0006\u00f5\u0019\u0000\u0b58\u01f9\u0001\u0000\u0000\u0000"+ - "\u0b59\u0b5a\u0005\u0000\u0000\u0001\u0b5a\u0b5b\u0001\u0000\u0000\u0000"+ - "\u0b5b\u0b5c\u0006\u00f6 \u0000\u0b5c\u0b5d\u0006\u00f6\u0017\u0000\u0b5d"+ - "\u01fb\u0001\u0000\u0000\u0000\u0b5e\u0b5f\t\u0000\u0000\u0000\u0b5f\u0b60"+ - "\u0001\u0000\u0000\u0000\u0b60\u0b61\u0006\u00f7 \u0000\u0b61\u01fd\u0001"+ - "\u0000\u0000\u0000\u0b62\u0b63\u0005@\u0000\u0000\u0b63\u0b64\u0007\u0007"+ - "\u0000\u0000\u0b64\u0b65\u0007\n\u0000\u0000\u0b65\u0b66\u0007\u000b\u0000"+ - "\u0000\u0b66\u0b67\u0007\u001c\u0000\u0000\u0b67\u0b68\u0007\u0007\u0000"+ - "\u0000\u0b68\u0b69\u0007\u0016\u0000\u0000\u0b69\u0b6a\u0007\u0017\u0000"+ - "\u0000\u0b6a\u0b6b\u0007\u0010\u0000\u0000\u0b6b\u0b6c\u0007\r\u0000\u0000"+ - "\u0b6c\u0b6d\u0007\u0005\u0000\u0000\u0b6d\u0b6e\u0007\u0012\u0000\u0000"+ - "\u0b6e\u0b6f\u0001\u0000\u0000\u0000\u0b6f\u0b70\u0006\u00f8?\u0000\u0b70"+ - "\u0b71\u0006\u00f8!\u0000\u0b71\u01ff\u0001\u0000\u0000\u0000\u0b72\u0b73"+ - "\t\u0000\u0000\u0000\u0b73\u0b74\u0004\u00f9\u000f\u0000\u0b74\u0b75\u0001"+ - "\u0000\u0000\u0000\u0b75\u0b76\u0006\u00f9\r\u0000\u0b76\u0201\u0001\u0000"+ - "\u0000\u0000\u0b77\u0b78\u0005\u0000\u0000\u0001\u0b78\u0b79\u0001\u0000"+ - "\u0000\u0000\u0b79\u0b7a\u0006\u00fa\u001b\u0000\u0b7a\u0b7b\u0006\u00fa"+ - "!\u0000\u0b7b\u0203\u0001\u0000\u0000\u0000\u0b7c\u0b7d\t\u0000\u0000"+ - "\u0000\u0b7d\u0b7e\u0001\u0000\u0000\u0000\u0b7e\u0b7f\u0006\u00fb\u001c"+ - "\u0000\u0b7f\u0205\u0001\u0000\u0000\u0000\u0b80\u0b81\u0005-\u0000\u0000"+ - "\u0b81\u0b82\u0005-\u0000\u0000\u0b82\u0b83\u0005}\u0000\u0000\u0b83\u0b84"+ - "\u0005}\u0000\u0000\u0b84\u0b85\u0001\u0000\u0000\u0000\u0b85\u0b86\u0006"+ - "\u00fc\u0017\u0000\u0b86\u0b87\u0006\u00fc\r\u0000\u0b87\u0207\u0001\u0000"+ - "\u0000\u0000\u0b88\u0b89\t\u0000\u0000\u0000\u0b89\u0b8a\u0004\u00fd\u0010"+ - "\u0000\u0b8a\u0b8b\u0001\u0000\u0000\u0000\u0b8b\u0b8c\u0006\u00fd\r\u0000"+ - "\u0b8c\u0209\u0001\u0000\u0000\u0000\u0b8d\u0b8e\t\u0000\u0000\u0000\u0b8e"+ - "\u0b8f\u0001\u0000\u0000\u0000\u0b8f\u0b90\u0006\u00fe\r\u0000\u0b90\u020b"+ - "\u0001\u0000\u0000\u0000\u0b91\u0b92\u0005\u0000\u0000\u0001\u0b92\u0b93"+ - "\u0001\u0000\u0000\u0000\u0b93\u0b94\u0006\u00ff\u0017\u0000\u0b94\u0b95"+ - "\u0006\u00ff\r\u0000\u0b95\u020d\u0001\u0000\u0000\u0000l\u0000\u0001"+ - "\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u0212\u0216\u021c"+ - "\u0220\u0227\u022e\u0234\u023a\u0241\u0246\u024d\u0253\u025d\u0263\u0269"+ - "\u0270\u027c\u02e1\u02f8\u0517\u052c\u0539\u054c\u055e\u059e\u05ca\u05ed"+ - "\u0653\u0699\u06a9\u06ab\u06b9\u06c1\u06c8\u06cb\u06d9\u06e0\u06f4\u06fc"+ - "\u0703\u070b\u070f\u0718\u071b\u0722\u0729\u072e\u073a\u073f\u0741\u074d"+ - "\u0754\u075b\u0763\u0765\u076e\u0770\u077b\u0793\u07a8\u07ac\u07b7\u07bd"+ - "\u07c9\u07d5\u07da\u07dc\u08dd\u08e2\u08e5\u08f2\u08f9\u092a\u0931\u095d"+ - "\u0967\u09a6\u09ca\u09d5\u09dc\u09fd\u0a0f\u0a2a\u0a5a\u0a6f\u0a84\u0a8e"+ - "\u0a97\u0abd\u0ada\u0ae1\u0b13\u0b1d\u0b37@\u0005\u0005\u0000\u0005\u0003"+ - "\u0000\u0005\b\u0000\u0005\u0007\u0000\u0007g\u0000\u0005\n\u0000\u0005"+ - "\f\u0000\u0005\u0001\u0000\u0005\u0002\u0000\u0007\u0017\u0000\u0005\u000b"+ - "\u0000\u0001c\u0000\u0007s\u0000\u0006\u0000\u0000\u0001h\u0001\u0001"+ - "i\u0002\u0001m\u0003\u0005\r\u0000\u0007\u0002\u0000\u0007\u0003\u0000"+ - "\u0007\u0006\u0000\u0007\u0005\u0000\u0007\u0007\u0000\u0004\u0000\u0000"+ - "\u0007\r\u0000\u0007\u000e\u0000\u0007\t\u0000\u0007\u0016\u0000\u0003"+ - "\u0000\u0000\u0005\u0004\u0000\u0001\u009a\u0004\u0001\u009b\u0005\u0007"+ - "\u0001\u0000\u0002\u0000\u0000\u0001\u009c\u0006\u0001\u009d\u0007\u0001"+ - "\u00a2\b\u0005\u0006\u0000\u0001\u00a4\t\u0007\u000f\u0000\u0001\u00a5"+ - "\n\u0007\u0090\u0000\u0001\u00a6\u000b\u0001\u00a7\f\u0001\u00ae\r\u0001"+ - "\u00af\u000e\u0001\u00b3\u000f\u0007\u000b\u0000\u0005\t\u0000\u0001\u00b6"+ - "\u0010\u0001\u00b7\u0011\u0000\u0002\u0000\u0001\u00c1\u0012\u0001\u00c2"+ - "\u0013\u0001\u00c3\u0014\u0007\n\u0000\u0001\u00c4\u0015\u0001\u00c5\u0016"+ - "\u0001\u00c6\u0017\u0001\u00cc\u0018\u0007\u0015\u0000\u0007\u0004\u0000"+ - "\u0007\b\u0000\u0007i\u0000"; - public static final String _serializedATN = Utils.join( - new String[] { - _serializedATNSegment0, - _serializedATNSegment1 - }, - "" - ); - public static final ATN _ATN = - new ATNDeserializer().deserialize(_serializedATN.toCharArray()); - static { - _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; - for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { - _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); - } - } -} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.java deleted file mode 100644 index aa7fd049c4f9..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.java +++ /dev/null @@ -1,6269 +0,0 @@ -// Generated from BladeAntlrParser.g4 by ANTLR 4.13.0 - - /* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.syntax.antlr4.v10; - -/** - * Parser generated for netbeans blade editor - * Some elements have been simplified to optimize parser speed - * For example - * - switch statement have a loos validation - * - generic block statement "@isset" | "@unless" are grouped togehter - * - the start match and end match will be checked in the parser - */ - -import org.antlr.v4.runtime.atn.*; -import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.misc.*; -import org.antlr.v4.runtime.tree.*; -import java.util.List; -import java.util.Iterator; -import java.util.ArrayList; - -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) -public class BladeAntlrParser extends Parser { - static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } - - protected static final DFA[] _decisionToDFA; - protected static final PredictionContextCache _sharedContextCache = - new PredictionContextCache(); - public static final int - PHP_EXPRESSION=1, PHP_VARIABLE=2, PHP_KEYWORD=3, PHP_NEW=4, PHP_IDENTIFIER=5, - PHP_NAMESPACE_PATH=6, PHP_STATIC_ACCESS=7, PHP_CLASS_KEYWORD=8, PHP_INSTANCE_ACCESS=9, - BLADE_PARAM_EXTRA=10, BLADE_PARAM_LPAREN=11, BLADE_PARAM_RPAREN=12, BLADE_EXPR_LPAREN=13, - BLADE_EXPR_RPAREN=14, BL_SQ_LPAREN=15, BL_SQ_LRAREN=16, BL_PARAM_STRING=17, - BL_PARAM_ASSIGN=18, BL_COMMA=19, BL_PARAM_COMMA=20, PHP_EXPR_STRING=21, - ERROR=22, HTML=23, BLADE_COMMENT=24, D_IF=25, D_ELSEIF=26, D_ELSE=27, - D_ENDIF=28, D_SWITCH=29, D_CASE=30, D_DEFAULT=31, D_ENDSWITCH=32, D_EMPTY=33, - D_ENDEMPTY=34, D_COND_BLOCK_START=35, D_COND_BLOCK_END=36, D_FOREACH=37, - D_ENDFOREACH=38, D_FOR=39, D_ENDFOR=40, D_FORELSE=41, D_ENDFORELSE=42, - D_WHILE=43, D_ENDWHILE=44, D_BREAK=45, D_LOOP_ACTION=46, D_INCLUDE=47, - D_INCLUDE_IF=48, D_INCLUDE_WHEN=49, D_INCLUDE_FIRST=50, D_INCLUDE_UNLESS=51, - D_EACH=52, D_EXTENDS=53, D_JS=54, D_JSON=55, D_SECTION=56, D_HAS_SECTION=57, - D_SECTION_MISSING=58, D_ENDSECTION=59, D_YIELD=60, D_PARENT=61, D_SHOW=62, - D_OVERWRITE=63, D_STOP=64, D_APPEND=65, D_ONCE=66, D_ENDONCE=67, D_STACK=68, - D_PUSH=69, D_ENDPUSH=70, D_PUSH_IF=71, D_ENDPUSH_IF=72, D_PUSH_ONCE=73, - D_ENDPUSH_ONCE=74, D_PREPEND=75, D_ENDPREPEND=76, D_PROPS=77, D_FRAGMENT=78, - D_ENDFRAGMENT=79, D_CSRF=80, D_METHOD=81, D_ERROR=82, D_ENDERROR=83, D_PRODUCTION=84, - D_ENDPRODUCTION=85, D_ENV=86, D_ENDENV=87, D_AUTH_START=88, D_AUTH_END=89, - D_PERMISSION_START=90, D_PERMISSION_ELSE=91, D_PERMISSION_END=92, D_CLASS=93, - D_STYLE=94, D_HTML_ATTR_EXPR=95, D_AWARE=96, D_SESSION=97, D_ENDSESSION=98, - D_DD=99, D_LANG=100, D_USE=101, D_INJECT=102, D_PHP=103, D_VERBATIM=104, - D_ENDVERBATIM=105, D_LIVEWIRE=106, D_ASSET_BUNDLER=107, D_MISC=108, D_CUSTOM=109, - D_UNKNOWN_ATTR_ENC=110, D_UNKNOWN=111, CONTENT_TAG_OPEN=112, RAW_TAG_OPEN=113, - PHP_INLINE_START=114, HTML_COMPONENT_PREFIX=115, JS_SCRIPT=116, HTML_TAG_START=117, - HTML_CLOSE_TAG=118, STRING_PATH=119, HTML_PATH=120, HTML_TEXT=121, HTML_IDENTIFIER=122, - EQ=123, WS=124, OTHER=125, BLADE_COMMENT_START=126, CONTENT_TAG_CLOSE=127, - REGULAR_ECHO_EXPR_MORE=128, RAW_TAG_CLOSE=129, RAW_ECHO_EXPR_MORE=130, - WS_EXPR_ESCAPE=131, WS_EXPR=132, WS_COMPOSED_EXPR=133, EXPR_STRING=134, - COMPOSED_EXPR_RPAREN=135, PHP_COMPOSED_EXPRESSION=136, WS_BL_PARAM=137, - FOREACH_WS_EXPR=138, FOREACH_LOOP_LPAREN=139, FOREACH_LOOP_RPAREN=140, - FOREACH_AS=141, FOREACH_PARAM_ASSIGN=142, BL_PARAM_LINE_COMMENT=143, BL_SQ_RPAREN=144, - BL_PARAM_RPAREN=145, BL_PARAM_CONCAT_OPERATOR=146, BL_COMMA_EL=147, BL_PARAM_WS=148, - BL_NAME_STRING=149, PHP_D_BLADE_COMMENT=150, PHP_D_BLADE_ML_COMMENT=151, - D_ENDPHP=152, PHP_D_WS=153, PHP_D_PHP_COMPOSED_EXPRESSION=154, PHP_EXIT=155, - PHP_INLINE_COMMENT=156, PHP_INLINE_ML_COMMENT=157, VERBATIM_HTML=158, - BLADE_COMMENT_END=159, BLADE_COMMENT_PEEK=160, BLADE_COMMENT_MORE=161, - BLADE_COMMENT_EOF=162, AT=163, RAW_TAG_START=164, REGULAR_ECHO_STATIC_ACCESS=165, - REGULAR_ECHO_LPAREN=166, REGULAR_ECHO_RPAREN=167, REGULAR_ECHO_INSTANCE_ACCESS=168, - PHP_D_EXPR_CURLY_LPAREN=169, PHP_D_EXPR_CURLY_RPAREN=170, PHP_D_CLASS=171; - public static final int - RULE_file = 0, RULE_general_statement = 1, RULE_inline_statement = 2, - RULE_inline_directive = 3, RULE_block_statement = 4, RULE_identifiableType = 5, - RULE_section_inline = 6, RULE_section = 7, RULE_push = 8, RULE_pushOnce = 9, - RULE_pushIf = 10, RULE_prepend = 11, RULE_fragmentD = 12, RULE_if = 13, - RULE_else = 14, RULE_endif = 15, RULE_empty_block = 16, RULE_conditional_block = 17, - RULE_auth_block = 18, RULE_env_block = 19, RULE_permission = 20, RULE_simple_conditional_stm = 21, - RULE_error_block = 22, RULE_switch = 23, RULE_while = 24, RULE_for = 25, - RULE_foreach = 26, RULE_forelse = 27, RULE_session = 28, RULE_stack = 29, - RULE_asset_bundler = 30, RULE_inject = 31, RULE_includeCond = 32, RULE_each = 33, - RULE_once_block = 34, RULE_condSection = 35, RULE_custom_directive = 36, - RULE_possibleDirective = 37, RULE_php_blade = 38, RULE_phpInline = 39, - RULE_regular_echo = 40, RULE_raw_echo = 41, RULE_echo_expr = 42, RULE_class_expr_usage = 43, - RULE_object_alias_static_access = 44, RULE_object_alias_direct_access = 45, - RULE_static_direct_class_access = 46, RULE_static_direct_namespace_class_access = 47, - RULE_class_instance = 48, RULE_class_name_reference = 49, RULE_namespacePath = 50, - RULE_function_call = 51, RULE_php_expression = 52, RULE_loop_expression = 53, - RULE_main_php_expression = 54, RULE_composed_php_expression = 55, RULE_simple_foreach_expr = 56, - RULE_singleArgWrapperP = 57, RULE_doubleArgWrapperP = 58, RULE_multiArgWrapper = 59, - RULE_identifiableArgument = 60, RULE_composedArgument = 61, RULE_phpExpr = 62, - RULE_identifiableArray = 63, RULE_arrayDefine = 64, RULE_paramAssign = 65, - RULE_verbatim_block = 66, RULE_loop_action = 67, RULE_html = 68; - private static String[] makeRuleNames() { - return new String[] { - "file", "general_statement", "inline_statement", "inline_directive", - "block_statement", "identifiableType", "section_inline", "section", "push", - "pushOnce", "pushIf", "prepend", "fragmentD", "if", "else", "endif", - "empty_block", "conditional_block", "auth_block", "env_block", "permission", - "simple_conditional_stm", "error_block", "switch", "while", "for", "foreach", - "forelse", "session", "stack", "asset_bundler", "inject", "includeCond", - "each", "once_block", "condSection", "custom_directive", "possibleDirective", - "php_blade", "phpInline", "regular_echo", "raw_echo", "echo_expr", "class_expr_usage", - "object_alias_static_access", "object_alias_direct_access", "static_direct_class_access", - "static_direct_namespace_class_access", "class_instance", "class_name_reference", - "namespacePath", "function_call", "php_expression", "loop_expression", - "main_php_expression", "composed_php_expression", "simple_foreach_expr", - "singleArgWrapperP", "doubleArgWrapperP", "multiArgWrapper", "identifiableArgument", - "composedArgument", "phpExpr", "identifiableArray", "arrayDefine", "paramAssign", - "verbatim_block", "loop_action", "html" - }; - } - public static final String[] ruleNames = makeRuleNames(); - - private static String[] makeLiteralNames() { - return new String[] { - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, "'@if'", "'@elseif'", "'@else'", "'@endif'", "'@switch'", "'@case'", - "'@default'", "'@endswitch'", "'@empty'", "'@endempty'", null, null, - "'@foreach'", "'@endforeach'", "'@for'", "'@endfor'", "'@forelse'", "'@endforelse'", - "'@while'", "'@endwhile'", "'@break'", null, "'@include'", "'@includeIf'", - "'@includeWhen'", "'@includeFirst'", "'@includeUnless'", "'@each'", "'@extends'", - "'@js'", "'@json'", "'@section'", "'@hasSection'", "'@sectionMissing'", - "'@endsection'", "'@yield'", "'@parent'", "'@show'", "'@overwrite'", - "'@stop'", "'@append'", "'@once'", "'@endonce'", "'@stack'", "'@push'", - "'@endpush'", "'@pushIf'", "'@endPushIf'", "'@pushOnce'", "'@endPushOnce'", - "'@prepend'", "'@endprepend'", "'@props'", "'@fragment'", "'@endfragment'", - "'@csrf'", "'@method'", "'@error'", "'@enderror'", "'@production'", "'@endproduction'", - "'@env'", "'@endenv'", null, null, null, null, null, "'@class'", "'@style'", - null, "'@aware'", "'@session'", "'@endsession'", null, "'@lang'", "'@use'", - "'@inject'", null, "'@verbatim'", "'@endverbatim'", null, "'@vite'", - "'@viteReactRefresh'", null, null, null, "'{{'", "'{!!'", null, null, - null, null, null, null, null, null, null, "'='", null, null, "'{{--'", - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, "'as'", null, null, null, null, "'.'", "','", null, null, - null, null, "'@endphp'", "' '", null, "'?>'", null, null, null, "'--}}'", - null, null, null, null, "'{!'", null, null, null, null, null, null, "'class'" - }; - } - private static final String[] _LITERAL_NAMES = makeLiteralNames(); - private static String[] makeSymbolicNames() { - return new String[] { - null, "PHP_EXPRESSION", "PHP_VARIABLE", "PHP_KEYWORD", "PHP_NEW", "PHP_IDENTIFIER", - "PHP_NAMESPACE_PATH", "PHP_STATIC_ACCESS", "PHP_CLASS_KEYWORD", "PHP_INSTANCE_ACCESS", - "BLADE_PARAM_EXTRA", "BLADE_PARAM_LPAREN", "BLADE_PARAM_RPAREN", "BLADE_EXPR_LPAREN", - "BLADE_EXPR_RPAREN", "BL_SQ_LPAREN", "BL_SQ_LRAREN", "BL_PARAM_STRING", - "BL_PARAM_ASSIGN", "BL_COMMA", "BL_PARAM_COMMA", "PHP_EXPR_STRING", "ERROR", - "HTML", "BLADE_COMMENT", "D_IF", "D_ELSEIF", "D_ELSE", "D_ENDIF", "D_SWITCH", - "D_CASE", "D_DEFAULT", "D_ENDSWITCH", "D_EMPTY", "D_ENDEMPTY", "D_COND_BLOCK_START", - "D_COND_BLOCK_END", "D_FOREACH", "D_ENDFOREACH", "D_FOR", "D_ENDFOR", - "D_FORELSE", "D_ENDFORELSE", "D_WHILE", "D_ENDWHILE", "D_BREAK", "D_LOOP_ACTION", - "D_INCLUDE", "D_INCLUDE_IF", "D_INCLUDE_WHEN", "D_INCLUDE_FIRST", "D_INCLUDE_UNLESS", - "D_EACH", "D_EXTENDS", "D_JS", "D_JSON", "D_SECTION", "D_HAS_SECTION", - "D_SECTION_MISSING", "D_ENDSECTION", "D_YIELD", "D_PARENT", "D_SHOW", - "D_OVERWRITE", "D_STOP", "D_APPEND", "D_ONCE", "D_ENDONCE", "D_STACK", - "D_PUSH", "D_ENDPUSH", "D_PUSH_IF", "D_ENDPUSH_IF", "D_PUSH_ONCE", "D_ENDPUSH_ONCE", - "D_PREPEND", "D_ENDPREPEND", "D_PROPS", "D_FRAGMENT", "D_ENDFRAGMENT", - "D_CSRF", "D_METHOD", "D_ERROR", "D_ENDERROR", "D_PRODUCTION", "D_ENDPRODUCTION", - "D_ENV", "D_ENDENV", "D_AUTH_START", "D_AUTH_END", "D_PERMISSION_START", - "D_PERMISSION_ELSE", "D_PERMISSION_END", "D_CLASS", "D_STYLE", "D_HTML_ATTR_EXPR", - "D_AWARE", "D_SESSION", "D_ENDSESSION", "D_DD", "D_LANG", "D_USE", "D_INJECT", - "D_PHP", "D_VERBATIM", "D_ENDVERBATIM", "D_LIVEWIRE", "D_ASSET_BUNDLER", - "D_MISC", "D_CUSTOM", "D_UNKNOWN_ATTR_ENC", "D_UNKNOWN", "CONTENT_TAG_OPEN", - "RAW_TAG_OPEN", "PHP_INLINE_START", "HTML_COMPONENT_PREFIX", "JS_SCRIPT", - "HTML_TAG_START", "HTML_CLOSE_TAG", "STRING_PATH", "HTML_PATH", "HTML_TEXT", - "HTML_IDENTIFIER", "EQ", "WS", "OTHER", "BLADE_COMMENT_START", "CONTENT_TAG_CLOSE", - "REGULAR_ECHO_EXPR_MORE", "RAW_TAG_CLOSE", "RAW_ECHO_EXPR_MORE", "WS_EXPR_ESCAPE", - "WS_EXPR", "WS_COMPOSED_EXPR", "EXPR_STRING", "COMPOSED_EXPR_RPAREN", - "PHP_COMPOSED_EXPRESSION", "WS_BL_PARAM", "FOREACH_WS_EXPR", "FOREACH_LOOP_LPAREN", - "FOREACH_LOOP_RPAREN", "FOREACH_AS", "FOREACH_PARAM_ASSIGN", "BL_PARAM_LINE_COMMENT", - "BL_SQ_RPAREN", "BL_PARAM_RPAREN", "BL_PARAM_CONCAT_OPERATOR", "BL_COMMA_EL", - "BL_PARAM_WS", "BL_NAME_STRING", "PHP_D_BLADE_COMMENT", "PHP_D_BLADE_ML_COMMENT", - "D_ENDPHP", "PHP_D_WS", "PHP_D_PHP_COMPOSED_EXPRESSION", "PHP_EXIT", - "PHP_INLINE_COMMENT", "PHP_INLINE_ML_COMMENT", "VERBATIM_HTML", "BLADE_COMMENT_END", - "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", "BLADE_COMMENT_EOF", "AT", - "RAW_TAG_START", "REGULAR_ECHO_STATIC_ACCESS", "REGULAR_ECHO_LPAREN", - "REGULAR_ECHO_RPAREN", "REGULAR_ECHO_INSTANCE_ACCESS", "PHP_D_EXPR_CURLY_LPAREN", - "PHP_D_EXPR_CURLY_RPAREN", "PHP_D_CLASS" - }; - } - private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); - public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); - - /** - * @deprecated Use {@link #VOCABULARY} instead. - */ - @Deprecated - public static final String[] tokenNames; - static { - tokenNames = new String[_SYMBOLIC_NAMES.length]; - for (int i = 0; i < tokenNames.length; i++) { - tokenNames[i] = VOCABULARY.getLiteralName(i); - if (tokenNames[i] == null) { - tokenNames[i] = VOCABULARY.getSymbolicName(i); - } - - if (tokenNames[i] == null) { - tokenNames[i] = ""; - } - } - } - - @Override - @Deprecated - public String[] getTokenNames() { - return tokenNames; - } - - @Override - - public Vocabulary getVocabulary() { - return VOCABULARY; - } - - @Override - public String getGrammarFileName() { return "BladeAntlrParser.g4"; } - - @Override - public String[] getRuleNames() { return ruleNames; } - - @Override - public String getSerializedATN() { return _serializedATN; } - - @Override - public ATN getATN() { return _ATN; } - - public static int bladeVersion = 10; - public BladeAntlrParser(TokenStream input) { - super(input); - _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); - } - - @SuppressWarnings("CheckReturnValue") - public static class FileContext extends ParserRuleContext { - public TerminalNode EOF() { return getToken(BladeAntlrParser.EOF, 0); } - public List general_statement() { - return getRuleContexts(General_statementContext.class); - } - public General_statementContext general_statement(int i) { - return getRuleContext(General_statementContext.class,i); - } - public FileContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_file; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterFile(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitFile(this); - } - } - - public final FileContext file() throws RecognitionException { - FileContext _localctx = new FileContext(_ctx, getState()); - enterRule(_localctx, 0, RULE_file); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(141); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { - { - { - setState(138); - general_statement(); - } - } - setState(143); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(144); - match(EOF); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class General_statementContext extends ParserRuleContext { - public Inline_statementContext inline_statement() { - return getRuleContext(Inline_statementContext.class,0); - } - public Block_statementContext block_statement() { - return getRuleContext(Block_statementContext.class,0); - } - public HtmlContext html() { - return getRuleContext(HtmlContext.class,0); - } - public General_statementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_general_statement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterGeneral_statement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitGeneral_statement(this); - } - } - - public final General_statementContext general_statement() throws RecognitionException { - General_statementContext _localctx = new General_statementContext(_ctx, getState()); - enterRule(_localctx, 2, RULE_general_statement); - try { - setState(149); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(146); - inline_statement(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(147); - block_statement(); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(148); - html(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Inline_statementContext extends ParserRuleContext { - public Inline_directiveContext inline_directive() { - return getRuleContext(Inline_directiveContext.class,0); - } - public PossibleDirectiveContext possibleDirective() { - return getRuleContext(PossibleDirectiveContext.class,0); - } - public Regular_echoContext regular_echo() { - return getRuleContext(Regular_echoContext.class,0); - } - public Raw_echoContext raw_echo() { - return getRuleContext(Raw_echoContext.class,0); - } - public PhpInlineContext phpInline() { - return getRuleContext(PhpInlineContext.class,0); - } - public Inline_statementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_inline_statement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterInline_statement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitInline_statement(this); - } - } - - public final Inline_statementContext inline_statement() throws RecognitionException { - Inline_statementContext _localctx = new Inline_statementContext(_ctx, getState()); - enterRule(_localctx, 4, RULE_inline_statement); - try { - setState(156); - _errHandler.sync(this); - switch (_input.LA(1)) { - case D_ELSE: - case D_CASE: - case D_DEFAULT: - case D_BREAK: - case D_LOOP_ACTION: - case D_INCLUDE: - case D_INCLUDE_IF: - case D_INCLUDE_WHEN: - case D_INCLUDE_FIRST: - case D_INCLUDE_UNLESS: - case D_EACH: - case D_EXTENDS: - case D_JS: - case D_JSON: - case D_SECTION: - case D_YIELD: - case D_STACK: - case D_PROPS: - case D_CSRF: - case D_METHOD: - case D_PERMISSION_ELSE: - case D_CLASS: - case D_STYLE: - case D_HTML_ATTR_EXPR: - case D_AWARE: - case D_DD: - case D_LANG: - case D_USE: - case D_INJECT: - case D_LIVEWIRE: - case D_ASSET_BUNDLER: - case D_MISC: - case D_CUSTOM: - enterOuterAlt(_localctx, 1); - { - setState(151); - inline_directive(); - } - break; - case D_UNKNOWN_ATTR_ENC: - case D_UNKNOWN: - enterOuterAlt(_localctx, 2); - { - setState(152); - possibleDirective(); - } - break; - case CONTENT_TAG_OPEN: - enterOuterAlt(_localctx, 3); - { - setState(153); - regular_echo(); - } - break; - case RAW_TAG_OPEN: - enterOuterAlt(_localctx, 4); - { - setState(154); - raw_echo(); - } - break; - case PHP_INLINE_START: - enterOuterAlt(_localctx, 5); - { - setState(155); - phpInline(); - } - break; - default: - throw new NoViableAltException(this); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Inline_directiveContext extends ParserRuleContext { - public Section_inlineContext section_inline() { - return getRuleContext(Section_inlineContext.class,0); - } - public IdentifiableTypeContext identifiableType() { - return getRuleContext(IdentifiableTypeContext.class,0); - } - public StackContext stack() { - return getRuleContext(StackContext.class,0); - } - public IncludeCondContext includeCond() { - return getRuleContext(IncludeCondContext.class,0); - } - public EachContext each() { - return getRuleContext(EachContext.class,0); - } - public Composed_php_expressionContext composed_php_expression() { - return getRuleContext(Composed_php_expressionContext.class,0); - } - public TerminalNode D_INCLUDE_FIRST() { return getToken(BladeAntlrParser.D_INCLUDE_FIRST, 0); } - public TerminalNode D_CLASS() { return getToken(BladeAntlrParser.D_CLASS, 0); } - public TerminalNode D_STYLE() { return getToken(BladeAntlrParser.D_STYLE, 0); } - public TerminalNode D_METHOD() { return getToken(BladeAntlrParser.D_METHOD, 0); } - public TerminalNode D_PROPS() { return getToken(BladeAntlrParser.D_PROPS, 0); } - public TerminalNode D_DD() { return getToken(BladeAntlrParser.D_DD, 0); } - public TerminalNode D_JS() { return getToken(BladeAntlrParser.D_JS, 0); } - public TerminalNode D_AWARE() { return getToken(BladeAntlrParser.D_AWARE, 0); } - public TerminalNode D_HTML_ATTR_EXPR() { return getToken(BladeAntlrParser.D_HTML_ATTR_EXPR, 0); } - public TerminalNode D_CASE() { return getToken(BladeAntlrParser.D_CASE, 0); } - public TerminalNode D_JSON() { return getToken(BladeAntlrParser.D_JSON, 0); } - public TerminalNode D_CSRF() { return getToken(BladeAntlrParser.D_CSRF, 0); } - public TerminalNode D_LOOP_ACTION() { return getToken(BladeAntlrParser.D_LOOP_ACTION, 0); } - public TerminalNode D_BREAK() { return getToken(BladeAntlrParser.D_BREAK, 0); } - public TerminalNode D_LIVEWIRE() { return getToken(BladeAntlrParser.D_LIVEWIRE, 0); } - public TerminalNode D_DEFAULT() { return getToken(BladeAntlrParser.D_DEFAULT, 0); } - public Asset_bundlerContext asset_bundler() { - return getRuleContext(Asset_bundlerContext.class,0); - } - public InjectContext inject() { - return getRuleContext(InjectContext.class,0); - } - public TerminalNode D_PERMISSION_ELSE() { return getToken(BladeAntlrParser.D_PERMISSION_ELSE, 0); } - public Loop_actionContext loop_action() { - return getRuleContext(Loop_actionContext.class,0); - } - public TerminalNode D_ELSE() { return getToken(BladeAntlrParser.D_ELSE, 0); } - public TerminalNode D_MISC() { return getToken(BladeAntlrParser.D_MISC, 0); } - public Custom_directiveContext custom_directive() { - return getRuleContext(Custom_directiveContext.class,0); - } - public Inline_directiveContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_inline_directive; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterInline_directive(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitInline_directive(this); - } - } - - public final Inline_directiveContext inline_directive() throws RecognitionException { - Inline_directiveContext _localctx = new Inline_directiveContext(_ctx, getState()); - enterRule(_localctx, 6, RULE_inline_directive); - int _la; - try { - setState(174); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,3,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(158); - section_inline(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(159); - identifiableType(); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(160); - stack(); - } - break; - case 4: - enterOuterAlt(_localctx, 4); - { - setState(161); - includeCond(); - } - break; - case 5: - enterOuterAlt(_localctx, 5); - { - setState(162); - each(); - } - break; - case 6: - enterOuterAlt(_localctx, 6); - { - setState(163); - _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 55169096509030400L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 5177361L) != 0)) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(164); - composed_php_expression(); - } - break; - case 7: - enterOuterAlt(_localctx, 7); - { - setState(165); - _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 105555263750144L) != 0) || _la==D_CSRF || _la==D_LIVEWIRE) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - } - break; - case 8: - enterOuterAlt(_localctx, 8); - { - setState(166); - asset_bundler(); - } - break; - case 9: - enterOuterAlt(_localctx, 9); - { - setState(167); - inject(); - } - break; - case 10: - enterOuterAlt(_localctx, 10); - { - setState(168); - match(D_PERMISSION_ELSE); - setState(169); - composed_php_expression(); - } - break; - case 11: - enterOuterAlt(_localctx, 11); - { - setState(170); - loop_action(); - } - break; - case 12: - enterOuterAlt(_localctx, 12); - { - setState(171); - match(D_ELSE); - } - break; - case 13: - enterOuterAlt(_localctx, 13); - { - setState(172); - match(D_MISC); - } - break; - case 14: - enterOuterAlt(_localctx, 14); - { - setState(173); - custom_directive(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Block_statementContext extends ParserRuleContext { - public SectionContext section() { - return getRuleContext(SectionContext.class,0); - } - public CondSectionContext condSection() { - return getRuleContext(CondSectionContext.class,0); - } - public PushContext push() { - return getRuleContext(PushContext.class,0); - } - public PushIfContext pushIf() { - return getRuleContext(PushIfContext.class,0); - } - public Once_blockContext once_block() { - return getRuleContext(Once_blockContext.class,0); - } - public PrependContext prepend() { - return getRuleContext(PrependContext.class,0); - } - public FragmentDContext fragmentD() { - return getRuleContext(FragmentDContext.class,0); - } - public IfContext if_() { - return getRuleContext(IfContext.class,0); - } - public SwitchContext switch_() { - return getRuleContext(SwitchContext.class,0); - } - public Env_blockContext env_block() { - return getRuleContext(Env_blockContext.class,0); - } - public Empty_blockContext empty_block() { - return getRuleContext(Empty_blockContext.class,0); - } - public Error_blockContext error_block() { - return getRuleContext(Error_blockContext.class,0); - } - public Conditional_blockContext conditional_block() { - return getRuleContext(Conditional_blockContext.class,0); - } - public Auth_blockContext auth_block() { - return getRuleContext(Auth_blockContext.class,0); - } - public PermissionContext permission() { - return getRuleContext(PermissionContext.class,0); - } - public WhileContext while_() { - return getRuleContext(WhileContext.class,0); - } - public ForContext for_() { - return getRuleContext(ForContext.class,0); - } - public ForeachContext foreach() { - return getRuleContext(ForeachContext.class,0); - } - public ForelseContext forelse() { - return getRuleContext(ForelseContext.class,0); - } - public SessionContext session() { - return getRuleContext(SessionContext.class,0); - } - public Verbatim_blockContext verbatim_block() { - return getRuleContext(Verbatim_blockContext.class,0); - } - public Php_bladeContext php_blade() { - return getRuleContext(Php_bladeContext.class,0); - } - public Block_statementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_block_statement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterBlock_statement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitBlock_statement(this); - } - } - - public final Block_statementContext block_statement() throws RecognitionException { - Block_statementContext _localctx = new Block_statementContext(_ctx, getState()); - enterRule(_localctx, 8, RULE_block_statement); - try { - setState(198); - _errHandler.sync(this); - switch (_input.LA(1)) { - case D_SECTION: - enterOuterAlt(_localctx, 1); - { - setState(176); - section(); - } - break; - case D_HAS_SECTION: - case D_SECTION_MISSING: - enterOuterAlt(_localctx, 2); - { - setState(177); - condSection(); - } - break; - case D_PUSH: - enterOuterAlt(_localctx, 3); - { - setState(178); - push(); - } - break; - case D_PUSH_IF: - enterOuterAlt(_localctx, 4); - { - setState(179); - pushIf(); - } - break; - case D_ONCE: - enterOuterAlt(_localctx, 5); - { - setState(180); - once_block(); - } - break; - case D_PREPEND: - enterOuterAlt(_localctx, 6); - { - setState(181); - prepend(); - } - break; - case D_FRAGMENT: - enterOuterAlt(_localctx, 7); - { - setState(182); - fragmentD(); - } - break; - case D_IF: - enterOuterAlt(_localctx, 8); - { - setState(183); - if_(); - } - break; - case D_SWITCH: - enterOuterAlt(_localctx, 9); - { - setState(184); - switch_(); - } - break; - case D_PRODUCTION: - case D_ENV: - enterOuterAlt(_localctx, 10); - { - setState(185); - env_block(); - } - break; - case D_EMPTY: - enterOuterAlt(_localctx, 11); - { - setState(186); - empty_block(); - } - break; - case D_ERROR: - enterOuterAlt(_localctx, 12); - { - setState(187); - error_block(); - } - break; - case D_COND_BLOCK_START: - enterOuterAlt(_localctx, 13); - { - setState(188); - conditional_block(); - } - break; - case D_AUTH_START: - enterOuterAlt(_localctx, 14); - { - setState(189); - auth_block(); - } - break; - case D_PERMISSION_START: - enterOuterAlt(_localctx, 15); - { - setState(190); - permission(); - } - break; - case D_WHILE: - enterOuterAlt(_localctx, 16); - { - setState(191); - while_(); - } - break; - case D_FOR: - enterOuterAlt(_localctx, 17); - { - setState(192); - for_(); - } - break; - case D_FOREACH: - enterOuterAlt(_localctx, 18); - { - setState(193); - foreach(); - } - break; - case D_FORELSE: - enterOuterAlt(_localctx, 19); - { - setState(194); - forelse(); - } - break; - case D_SESSION: - enterOuterAlt(_localctx, 20); - { - setState(195); - session(); - } - break; - case D_VERBATIM: - enterOuterAlt(_localctx, 21); - { - setState(196); - verbatim_block(); - } - break; - case D_PHP: - enterOuterAlt(_localctx, 22); - { - setState(197); - php_blade(); - } - break; - default: - throw new NoViableAltException(this); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class IdentifiableTypeContext extends ParserRuleContext { - public Token d_name; - public Token idString; - public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } - public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } - public TerminalNode D_INCLUDE() { return getToken(BladeAntlrParser.D_INCLUDE, 0); } - public TerminalNode D_INCLUDE_IF() { return getToken(BladeAntlrParser.D_INCLUDE_IF, 0); } - public TerminalNode D_EXTENDS() { return getToken(BladeAntlrParser.D_EXTENDS, 0); } - public TerminalNode D_YIELD() { return getToken(BladeAntlrParser.D_YIELD, 0); } - public TerminalNode D_USE() { return getToken(BladeAntlrParser.D_USE, 0); } - public TerminalNode D_LANG() { return getToken(BladeAntlrParser.D_LANG, 0); } - public List composedArgument() { - return getRuleContexts(ComposedArgumentContext.class); - } - public ComposedArgumentContext composedArgument(int i) { - return getRuleContext(ComposedArgumentContext.class,i); - } - public TerminalNode BL_PARAM_STRING() { return getToken(BladeAntlrParser.BL_PARAM_STRING, 0); } - public List BL_COMMA() { return getTokens(BladeAntlrParser.BL_COMMA); } - public TerminalNode BL_COMMA(int i) { - return getToken(BladeAntlrParser.BL_COMMA, i); - } - public IdentifiableTypeContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_identifiableType; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterIdentifiableType(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitIdentifiableType(this); - } - } - - public final IdentifiableTypeContext identifiableType() throws RecognitionException { - IdentifiableTypeContext _localctx = new IdentifiableTypeContext(_ctx, getState()); - enterRule(_localctx, 10, RULE_identifiableType); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(200); - ((IdentifiableTypeContext)_localctx).d_name = _input.LT(1); - _la = _input.LA(1); - if ( !(((((_la - 47)) & ~0x3f) == 0 && ((1L << (_la - 47)) & 27021597764231235L) != 0)) ) { - ((IdentifiableTypeContext)_localctx).d_name = (Token)_errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(201); - match(BLADE_PARAM_LPAREN); - setState(204); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) { - case 1: - { - setState(202); - ((IdentifiableTypeContext)_localctx).idString = match(BL_PARAM_STRING); - } - break; - case 2: - { - setState(203); - composedArgument(); - } - break; - } - setState(208); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { - case 1: - { - setState(206); - match(BL_COMMA); - setState(207); - composedArgument(); - } - break; - } - setState(211); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==BL_COMMA) { - { - setState(210); - match(BL_COMMA); - } - } - - setState(213); - match(BLADE_PARAM_RPAREN); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Section_inlineContext extends ParserRuleContext { - public TerminalNode D_SECTION() { return getToken(BladeAntlrParser.D_SECTION, 0); } - public DoubleArgWrapperPContext doubleArgWrapperP() { - return getRuleContext(DoubleArgWrapperPContext.class,0); - } - public Section_inlineContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_section_inline; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterSection_inline(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitSection_inline(this); - } - } - - public final Section_inlineContext section_inline() throws RecognitionException { - Section_inlineContext _localctx = new Section_inlineContext(_ctx, getState()); - enterRule(_localctx, 12, RULE_section_inline); - try { - enterOuterAlt(_localctx, 1); - { - setState(215); - match(D_SECTION); - setState(216); - doubleArgWrapperP(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class SectionContext extends ParserRuleContext { - public TerminalNode D_SECTION() { return getToken(BladeAntlrParser.D_SECTION, 0); } - public SingleArgWrapperPContext singleArgWrapperP() { - return getRuleContext(SingleArgWrapperPContext.class,0); - } - public TerminalNode D_SHOW() { return getToken(BladeAntlrParser.D_SHOW, 0); } - public TerminalNode D_STOP() { return getToken(BladeAntlrParser.D_STOP, 0); } - public TerminalNode D_OVERWRITE() { return getToken(BladeAntlrParser.D_OVERWRITE, 0); } - public TerminalNode D_ENDSECTION() { return getToken(BladeAntlrParser.D_ENDSECTION, 0); } - public TerminalNode D_APPEND() { return getToken(BladeAntlrParser.D_APPEND, 0); } - public List general_statement() { - return getRuleContexts(General_statementContext.class); - } - public General_statementContext general_statement(int i) { - return getRuleContext(General_statementContext.class,i); - } - public List D_PARENT() { return getTokens(BladeAntlrParser.D_PARENT); } - public TerminalNode D_PARENT(int i) { - return getToken(BladeAntlrParser.D_PARENT, i); - } - public SectionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_section; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterSection(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitSection(this); - } - } - - public final SectionContext section() throws RecognitionException { - SectionContext _localctx = new SectionContext(_ctx, getState()); - enterRule(_localctx, 14, RULE_section); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(218); - match(D_SECTION); - setState(219); - singleArgWrapperP(); - setState(224); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 4035201810946850816L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { - { - setState(222); - _errHandler.sync(this); - switch (_input.LA(1)) { - case HTML: - case D_IF: - case D_ELSE: - case D_SWITCH: - case D_CASE: - case D_DEFAULT: - case D_EMPTY: - case D_COND_BLOCK_START: - case D_FOREACH: - case D_FOR: - case D_FORELSE: - case D_WHILE: - case D_BREAK: - case D_LOOP_ACTION: - case D_INCLUDE: - case D_INCLUDE_IF: - case D_INCLUDE_WHEN: - case D_INCLUDE_FIRST: - case D_INCLUDE_UNLESS: - case D_EACH: - case D_EXTENDS: - case D_JS: - case D_JSON: - case D_SECTION: - case D_HAS_SECTION: - case D_SECTION_MISSING: - case D_YIELD: - case D_ONCE: - case D_STACK: - case D_PUSH: - case D_PUSH_IF: - case D_PREPEND: - case D_PROPS: - case D_FRAGMENT: - case D_CSRF: - case D_METHOD: - case D_ERROR: - case D_PRODUCTION: - case D_ENV: - case D_AUTH_START: - case D_PERMISSION_START: - case D_PERMISSION_ELSE: - case D_CLASS: - case D_STYLE: - case D_HTML_ATTR_EXPR: - case D_AWARE: - case D_SESSION: - case D_DD: - case D_LANG: - case D_USE: - case D_INJECT: - case D_PHP: - case D_VERBATIM: - case D_LIVEWIRE: - case D_ASSET_BUNDLER: - case D_MISC: - case D_CUSTOM: - case D_UNKNOWN_ATTR_ENC: - case D_UNKNOWN: - case CONTENT_TAG_OPEN: - case RAW_TAG_OPEN: - case PHP_INLINE_START: - case HTML_COMPONENT_PREFIX: - case HTML_TAG_START: - case HTML_IDENTIFIER: - case EQ: - { - setState(220); - general_statement(); - } - break; - case D_PARENT: - { - setState(221); - match(D_PARENT); - } - break; - default: - throw new NoViableAltException(this); - } - } - setState(226); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(227); - _la = _input.LA(1); - if ( !(((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & 121L) != 0)) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class PushContext extends ParserRuleContext { - public TerminalNode D_PUSH() { return getToken(BladeAntlrParser.D_PUSH, 0); } - public SingleArgWrapperPContext singleArgWrapperP() { - return getRuleContext(SingleArgWrapperPContext.class,0); - } - public TerminalNode D_ENDPUSH() { return getToken(BladeAntlrParser.D_ENDPUSH, 0); } - public List general_statement() { - return getRuleContexts(General_statementContext.class); - } - public General_statementContext general_statement(int i) { - return getRuleContext(General_statementContext.class,i); - } - public PushContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_push; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPush(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPush(this); - } - } - - public final PushContext push() throws RecognitionException { - PushContext _localctx = new PushContext(_ctx, getState()); - enterRule(_localctx, 16, RULE_push); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(229); - match(D_PUSH); - setState(230); - singleArgWrapperP(); - setState(234); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { - { - { - setState(231); - general_statement(); - } - } - setState(236); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(237); - match(D_ENDPUSH); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class PushOnceContext extends ParserRuleContext { - public TerminalNode D_PUSH_ONCE() { return getToken(BladeAntlrParser.D_PUSH_ONCE, 0); } - public SingleArgWrapperPContext singleArgWrapperP() { - return getRuleContext(SingleArgWrapperPContext.class,0); - } - public TerminalNode D_ENDPUSH_ONCE() { return getToken(BladeAntlrParser.D_ENDPUSH_ONCE, 0); } - public List general_statement() { - return getRuleContexts(General_statementContext.class); - } - public General_statementContext general_statement(int i) { - return getRuleContext(General_statementContext.class,i); - } - public PushOnceContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_pushOnce; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPushOnce(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPushOnce(this); - } - } - - public final PushOnceContext pushOnce() throws RecognitionException { - PushOnceContext _localctx = new PushOnceContext(_ctx, getState()); - enterRule(_localctx, 18, RULE_pushOnce); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(239); - match(D_PUSH_ONCE); - setState(240); - singleArgWrapperP(); - setState(244); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { - { - { - setState(241); - general_statement(); - } - } - setState(246); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(247); - match(D_ENDPUSH_ONCE); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class PushIfContext extends ParserRuleContext { - public TerminalNode D_PUSH_IF() { return getToken(BladeAntlrParser.D_PUSH_IF, 0); } - public SingleArgWrapperPContext singleArgWrapperP() { - return getRuleContext(SingleArgWrapperPContext.class,0); - } - public TerminalNode D_ENDPUSH_IF() { return getToken(BladeAntlrParser.D_ENDPUSH_IF, 0); } - public List general_statement() { - return getRuleContexts(General_statementContext.class); - } - public General_statementContext general_statement(int i) { - return getRuleContext(General_statementContext.class,i); - } - public PushIfContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_pushIf; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPushIf(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPushIf(this); - } - } - - public final PushIfContext pushIf() throws RecognitionException { - PushIfContext _localctx = new PushIfContext(_ctx, getState()); - enterRule(_localctx, 20, RULE_pushIf); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(249); - match(D_PUSH_IF); - setState(250); - singleArgWrapperP(); - setState(254); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { - { - { - setState(251); - general_statement(); - } - } - setState(256); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(257); - match(D_ENDPUSH_IF); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class PrependContext extends ParserRuleContext { - public TerminalNode D_PREPEND() { return getToken(BladeAntlrParser.D_PREPEND, 0); } - public SingleArgWrapperPContext singleArgWrapperP() { - return getRuleContext(SingleArgWrapperPContext.class,0); - } - public TerminalNode D_ENDPREPEND() { return getToken(BladeAntlrParser.D_ENDPREPEND, 0); } - public List general_statement() { - return getRuleContexts(General_statementContext.class); - } - public General_statementContext general_statement(int i) { - return getRuleContext(General_statementContext.class,i); - } - public PrependContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_prepend; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPrepend(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPrepend(this); - } - } - - public final PrependContext prepend() throws RecognitionException { - PrependContext _localctx = new PrependContext(_ctx, getState()); - enterRule(_localctx, 22, RULE_prepend); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(259); - match(D_PREPEND); - setState(260); - singleArgWrapperP(); - setState(264); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { - { - { - setState(261); - general_statement(); - } - } - setState(266); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(267); - match(D_ENDPREPEND); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class FragmentDContext extends ParserRuleContext { - public TerminalNode D_FRAGMENT() { return getToken(BladeAntlrParser.D_FRAGMENT, 0); } - public Composed_php_expressionContext composed_php_expression() { - return getRuleContext(Composed_php_expressionContext.class,0); - } - public TerminalNode D_ENDFRAGMENT() { return getToken(BladeAntlrParser.D_ENDFRAGMENT, 0); } - public List general_statement() { - return getRuleContexts(General_statementContext.class); - } - public General_statementContext general_statement(int i) { - return getRuleContext(General_statementContext.class,i); - } - public FragmentDContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_fragmentD; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterFragmentD(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitFragmentD(this); - } - } - - public final FragmentDContext fragmentD() throws RecognitionException { - FragmentDContext _localctx = new FragmentDContext(_ctx, getState()); - enterRule(_localctx, 24, RULE_fragmentD); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(269); - match(D_FRAGMENT); - setState(270); - composed_php_expression(); - setState(274); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { - { - { - setState(271); - general_statement(); - } - } - setState(276); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(277); - match(D_ENDFRAGMENT); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class IfContext extends ParserRuleContext { - public TerminalNode D_IF() { return getToken(BladeAntlrParser.D_IF, 0); } - public List main_php_expression() { - return getRuleContexts(Main_php_expressionContext.class); - } - public Main_php_expressionContext main_php_expression(int i) { - return getRuleContext(Main_php_expressionContext.class,i); - } - public EndifContext endif() { - return getRuleContext(EndifContext.class,0); - } - public List general_statement() { - return getRuleContexts(General_statementContext.class); - } - public General_statementContext general_statement(int i) { - return getRuleContext(General_statementContext.class,i); - } - public List D_ELSEIF() { return getTokens(BladeAntlrParser.D_ELSEIF); } - public TerminalNode D_ELSEIF(int i) { - return getToken(BladeAntlrParser.D_ELSEIF, i); - } - public ElseContext else_() { - return getRuleContext(ElseContext.class,0); - } - public IfContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_if; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterIf(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitIf(this); - } - } - - public final IfContext if_() throws RecognitionException { - IfContext _localctx = new IfContext(_ctx, getState()); - enterRule(_localctx, 26, RULE_if); - int _la; - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(279); - match(D_IF); - setState(280); - main_php_expression(); - setState(284); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,15,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(281); - general_statement(); - } - } - } - setState(286); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,15,_ctx); - } - setState(297); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==D_ELSEIF) { - { - { - setState(287); - match(D_ELSEIF); - setState(288); - main_php_expression(); - setState(292); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,16,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(289); - general_statement(); - } - } - } - setState(294); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,16,_ctx); - } - } - } - setState(299); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(301); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==D_ELSE) { - { - setState(300); - else_(); - } - } - - setState(303); - endif(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ElseContext extends ParserRuleContext { - public TerminalNode D_ELSE() { return getToken(BladeAntlrParser.D_ELSE, 0); } - public List general_statement() { - return getRuleContexts(General_statementContext.class); - } - public General_statementContext general_statement(int i) { - return getRuleContext(General_statementContext.class,i); - } - public ElseContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_else; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterElse(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitElse(this); - } - } - - public final ElseContext else_() throws RecognitionException { - ElseContext _localctx = new ElseContext(_ctx, getState()); - enterRule(_localctx, 28, RULE_else); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(305); - match(D_ELSE); - setState(309); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { - { - { - setState(306); - general_statement(); - } - } - setState(311); - _errHandler.sync(this); - _la = _input.LA(1); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class EndifContext extends ParserRuleContext { - public TerminalNode D_ENDIF() { return getToken(BladeAntlrParser.D_ENDIF, 0); } - public EndifContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_endif; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterEndif(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitEndif(this); - } - } - - public final EndifContext endif() throws RecognitionException { - EndifContext _localctx = new EndifContext(_ctx, getState()); - enterRule(_localctx, 30, RULE_endif); - try { - enterOuterAlt(_localctx, 1); - { - setState(312); - match(D_ENDIF); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Empty_blockContext extends ParserRuleContext { - public TerminalNode D_EMPTY() { return getToken(BladeAntlrParser.D_EMPTY, 0); } - public Composed_php_expressionContext composed_php_expression() { - return getRuleContext(Composed_php_expressionContext.class,0); - } - public Simple_conditional_stmContext simple_conditional_stm() { - return getRuleContext(Simple_conditional_stmContext.class,0); - } - public TerminalNode D_ENDEMPTY() { return getToken(BladeAntlrParser.D_ENDEMPTY, 0); } - public Empty_blockContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_empty_block; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterEmpty_block(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitEmpty_block(this); - } - } - - public final Empty_blockContext empty_block() throws RecognitionException { - Empty_blockContext _localctx = new Empty_blockContext(_ctx, getState()); - enterRule(_localctx, 32, RULE_empty_block); - try { - enterOuterAlt(_localctx, 1); - { - setState(314); - match(D_EMPTY); - setState(315); - composed_php_expression(); - setState(316); - simple_conditional_stm(); - setState(317); - match(D_ENDEMPTY); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Conditional_blockContext extends ParserRuleContext { - public TerminalNode D_COND_BLOCK_START() { return getToken(BladeAntlrParser.D_COND_BLOCK_START, 0); } - public Main_php_expressionContext main_php_expression() { - return getRuleContext(Main_php_expressionContext.class,0); - } - public Simple_conditional_stmContext simple_conditional_stm() { - return getRuleContext(Simple_conditional_stmContext.class,0); - } - public TerminalNode D_COND_BLOCK_END() { return getToken(BladeAntlrParser.D_COND_BLOCK_END, 0); } - public Conditional_blockContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_conditional_block; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterConditional_block(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitConditional_block(this); - } - } - - public final Conditional_blockContext conditional_block() throws RecognitionException { - Conditional_blockContext _localctx = new Conditional_blockContext(_ctx, getState()); - enterRule(_localctx, 34, RULE_conditional_block); - try { - enterOuterAlt(_localctx, 1); - { - setState(319); - match(D_COND_BLOCK_START); - setState(320); - main_php_expression(); - setState(321); - simple_conditional_stm(); - setState(322); - match(D_COND_BLOCK_END); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Auth_blockContext extends ParserRuleContext { - public TerminalNode D_AUTH_START() { return getToken(BladeAntlrParser.D_AUTH_START, 0); } - public Simple_conditional_stmContext simple_conditional_stm() { - return getRuleContext(Simple_conditional_stmContext.class,0); - } - public TerminalNode D_AUTH_END() { return getToken(BladeAntlrParser.D_AUTH_END, 0); } - public List BLADE_PARAM_LPAREN() { return getTokens(BladeAntlrParser.BLADE_PARAM_LPAREN); } - public TerminalNode BLADE_PARAM_LPAREN(int i) { - return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, i); - } - public List BLADE_PARAM_RPAREN() { return getTokens(BladeAntlrParser.BLADE_PARAM_RPAREN); } - public TerminalNode BLADE_PARAM_RPAREN(int i) { - return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, i); - } - public List composedArgument() { - return getRuleContexts(ComposedArgumentContext.class); - } - public ComposedArgumentContext composedArgument(int i) { - return getRuleContext(ComposedArgumentContext.class,i); - } - public Auth_blockContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_auth_block; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterAuth_block(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitAuth_block(this); - } - } - - public final Auth_blockContext auth_block() throws RecognitionException { - Auth_blockContext _localctx = new Auth_blockContext(_ctx, getState()); - enterRule(_localctx, 36, RULE_auth_block); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(324); - match(D_AUTH_START); - setState(335); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==BLADE_PARAM_LPAREN) { - { - { - setState(325); - match(BLADE_PARAM_LPAREN); - setState(329); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1475596L) != 0) || _la==BL_PARAM_CONCAT_OPERATOR || _la==BL_NAME_STRING) { - { - { - setState(326); - composedArgument(); - } - } - setState(331); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(332); - match(BLADE_PARAM_RPAREN); - } - } - setState(337); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(338); - simple_conditional_stm(); - setState(339); - match(D_AUTH_END); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Env_blockContext extends ParserRuleContext { - public TerminalNode D_ENV() { return getToken(BladeAntlrParser.D_ENV, 0); } - public SingleArgWrapperPContext singleArgWrapperP() { - return getRuleContext(SingleArgWrapperPContext.class,0); - } - public Simple_conditional_stmContext simple_conditional_stm() { - return getRuleContext(Simple_conditional_stmContext.class,0); - } - public TerminalNode D_ENDENV() { return getToken(BladeAntlrParser.D_ENDENV, 0); } - public TerminalNode D_PRODUCTION() { return getToken(BladeAntlrParser.D_PRODUCTION, 0); } - public TerminalNode D_ENDPRODUCTION() { return getToken(BladeAntlrParser.D_ENDPRODUCTION, 0); } - public Env_blockContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_env_block; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterEnv_block(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitEnv_block(this); - } - } - - public final Env_blockContext env_block() throws RecognitionException { - Env_blockContext _localctx = new Env_blockContext(_ctx, getState()); - enterRule(_localctx, 38, RULE_env_block); - try { - setState(350); - _errHandler.sync(this); - switch (_input.LA(1)) { - case D_ENV: - enterOuterAlt(_localctx, 1); - { - { - setState(341); - match(D_ENV); - setState(342); - singleArgWrapperP(); - setState(343); - simple_conditional_stm(); - setState(344); - match(D_ENDENV); - } - } - break; - case D_PRODUCTION: - enterOuterAlt(_localctx, 2); - { - setState(346); - match(D_PRODUCTION); - setState(347); - simple_conditional_stm(); - setState(348); - match(D_ENDPRODUCTION); - } - break; - default: - throw new NoViableAltException(this); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class PermissionContext extends ParserRuleContext { - public TerminalNode D_PERMISSION_START() { return getToken(BladeAntlrParser.D_PERMISSION_START, 0); } - public Composed_php_expressionContext composed_php_expression() { - return getRuleContext(Composed_php_expressionContext.class,0); - } - public Simple_conditional_stmContext simple_conditional_stm() { - return getRuleContext(Simple_conditional_stmContext.class,0); - } - public TerminalNode D_PERMISSION_END() { return getToken(BladeAntlrParser.D_PERMISSION_END, 0); } - public PermissionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_permission; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPermission(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPermission(this); - } - } - - public final PermissionContext permission() throws RecognitionException { - PermissionContext _localctx = new PermissionContext(_ctx, getState()); - enterRule(_localctx, 40, RULE_permission); - try { - enterOuterAlt(_localctx, 1); - { - setState(352); - match(D_PERMISSION_START); - setState(353); - composed_php_expression(); - setState(354); - simple_conditional_stm(); - setState(355); - match(D_PERMISSION_END); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Simple_conditional_stmContext extends ParserRuleContext { - public List general_statement() { - return getRuleContexts(General_statementContext.class); - } - public General_statementContext general_statement(int i) { - return getRuleContext(General_statementContext.class,i); - } - public ElseContext else_() { - return getRuleContext(ElseContext.class,0); - } - public Simple_conditional_stmContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_simple_conditional_stm; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterSimple_conditional_stm(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitSimple_conditional_stm(this); - } - } - - public final Simple_conditional_stmContext simple_conditional_stm() throws RecognitionException { - Simple_conditional_stmContext _localctx = new Simple_conditional_stmContext(_ctx, getState()); - enterRule(_localctx, 42, RULE_simple_conditional_stm); - int _la; - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(360); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,23,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(357); - general_statement(); - } - } - } - setState(362); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,23,_ctx); - } - setState(364); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==D_ELSE) { - { - setState(363); - else_(); - } - } - - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Error_blockContext extends ParserRuleContext { - public TerminalNode D_ERROR() { return getToken(BladeAntlrParser.D_ERROR, 0); } - public Php_expressionContext php_expression() { - return getRuleContext(Php_expressionContext.class,0); - } - public TerminalNode D_ENDERROR() { return getToken(BladeAntlrParser.D_ENDERROR, 0); } - public List general_statement() { - return getRuleContexts(General_statementContext.class); - } - public General_statementContext general_statement(int i) { - return getRuleContext(General_statementContext.class,i); - } - public Error_blockContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_error_block; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterError_block(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitError_block(this); - } - } - - public final Error_blockContext error_block() throws RecognitionException { - Error_blockContext _localctx = new Error_blockContext(_ctx, getState()); - enterRule(_localctx, 44, RULE_error_block); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(366); - match(D_ERROR); - setState(367); - php_expression(); - setState(371); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { - { - { - setState(368); - general_statement(); - } - } - setState(373); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(374); - match(D_ENDERROR); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class SwitchContext extends ParserRuleContext { - public TerminalNode D_SWITCH() { return getToken(BladeAntlrParser.D_SWITCH, 0); } - public Php_expressionContext php_expression() { - return getRuleContext(Php_expressionContext.class,0); - } - public TerminalNode D_ENDSWITCH() { return getToken(BladeAntlrParser.D_ENDSWITCH, 0); } - public List general_statement() { - return getRuleContexts(General_statementContext.class); - } - public General_statementContext general_statement(int i) { - return getRuleContext(General_statementContext.class,i); - } - public List D_BREAK() { return getTokens(BladeAntlrParser.D_BREAK); } - public TerminalNode D_BREAK(int i) { - return getToken(BladeAntlrParser.D_BREAK, i); - } - public SwitchContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_switch; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterSwitch(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitSwitch(this); - } - } - - public final SwitchContext switch_() throws RecognitionException { - SwitchContext _localctx = new SwitchContext(_ctx, getState()); - enterRule(_localctx, 46, RULE_switch); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(376); - match(D_SWITCH); - setState(377); - php_expression(); - setState(380); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - setState(380); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,26,_ctx) ) { - case 1: - { - setState(378); - general_statement(); - } - break; - case 2: - { - setState(379); - match(D_BREAK); - } - break; - } - } - setState(382); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) ); - setState(384); - match(D_ENDSWITCH); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class WhileContext extends ParserRuleContext { - public TerminalNode D_WHILE() { return getToken(BladeAntlrParser.D_WHILE, 0); } - public Php_expressionContext php_expression() { - return getRuleContext(Php_expressionContext.class,0); - } - public TerminalNode D_ENDWHILE() { return getToken(BladeAntlrParser.D_ENDWHILE, 0); } - public List general_statement() { - return getRuleContexts(General_statementContext.class); - } - public General_statementContext general_statement(int i) { - return getRuleContext(General_statementContext.class,i); - } - public WhileContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_while; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterWhile(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitWhile(this); - } - } - - public final WhileContext while_() throws RecognitionException { - WhileContext _localctx = new WhileContext(_ctx, getState()); - enterRule(_localctx, 48, RULE_while); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(386); - match(D_WHILE); - setState(387); - php_expression(); - setState(391); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { - { - { - setState(388); - general_statement(); - } - } - setState(393); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(394); - match(D_ENDWHILE); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ForContext extends ParserRuleContext { - public TerminalNode D_FOR() { return getToken(BladeAntlrParser.D_FOR, 0); } - public Php_expressionContext php_expression() { - return getRuleContext(Php_expressionContext.class,0); - } - public TerminalNode D_ENDFOR() { return getToken(BladeAntlrParser.D_ENDFOR, 0); } - public List general_statement() { - return getRuleContexts(General_statementContext.class); - } - public General_statementContext general_statement(int i) { - return getRuleContext(General_statementContext.class,i); - } - public ForContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_for; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterFor(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitFor(this); - } - } - - public final ForContext for_() throws RecognitionException { - ForContext _localctx = new ForContext(_ctx, getState()); - enterRule(_localctx, 50, RULE_for); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(396); - match(D_FOR); - setState(397); - php_expression(); - setState(401); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { - { - { - setState(398); - general_statement(); - } - } - setState(403); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(404); - match(D_ENDFOR); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ForeachContext extends ParserRuleContext { - public TerminalNode D_FOREACH() { return getToken(BladeAntlrParser.D_FOREACH, 0); } - public TerminalNode FOREACH_LOOP_LPAREN() { return getToken(BladeAntlrParser.FOREACH_LOOP_LPAREN, 0); } - public Loop_expressionContext loop_expression() { - return getRuleContext(Loop_expressionContext.class,0); - } - public TerminalNode FOREACH_LOOP_RPAREN() { return getToken(BladeAntlrParser.FOREACH_LOOP_RPAREN, 0); } - public TerminalNode D_ENDFOREACH() { return getToken(BladeAntlrParser.D_ENDFOREACH, 0); } - public List general_statement() { - return getRuleContexts(General_statementContext.class); - } - public General_statementContext general_statement(int i) { - return getRuleContext(General_statementContext.class,i); - } - public ForeachContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_foreach; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterForeach(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitForeach(this); - } - } - - public final ForeachContext foreach() throws RecognitionException { - ForeachContext _localctx = new ForeachContext(_ctx, getState()); - enterRule(_localctx, 52, RULE_foreach); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(406); - match(D_FOREACH); - setState(407); - match(FOREACH_LOOP_LPAREN); - setState(408); - loop_expression(); - setState(409); - match(FOREACH_LOOP_RPAREN); - setState(413); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { - { - { - setState(410); - general_statement(); - } - } - setState(415); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(416); - match(D_ENDFOREACH); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ForelseContext extends ParserRuleContext { - public TerminalNode D_FORELSE() { return getToken(BladeAntlrParser.D_FORELSE, 0); } - public TerminalNode FOREACH_LOOP_LPAREN() { return getToken(BladeAntlrParser.FOREACH_LOOP_LPAREN, 0); } - public Loop_expressionContext loop_expression() { - return getRuleContext(Loop_expressionContext.class,0); - } - public TerminalNode FOREACH_LOOP_RPAREN() { return getToken(BladeAntlrParser.FOREACH_LOOP_RPAREN, 0); } - public TerminalNode D_ENDFORELSE() { return getToken(BladeAntlrParser.D_ENDFORELSE, 0); } - public List general_statement() { - return getRuleContexts(General_statementContext.class); - } - public General_statementContext general_statement(int i) { - return getRuleContext(General_statementContext.class,i); - } - public List D_EMPTY() { return getTokens(BladeAntlrParser.D_EMPTY); } - public TerminalNode D_EMPTY(int i) { - return getToken(BladeAntlrParser.D_EMPTY, i); - } - public ForelseContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_forelse; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterForelse(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitForelse(this); - } - } - - public final ForelseContext forelse() throws RecognitionException { - ForelseContext _localctx = new ForelseContext(_ctx, getState()); - enterRule(_localctx, 54, RULE_forelse); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(418); - match(D_FORELSE); - setState(419); - match(FOREACH_LOOP_LPAREN); - setState(420); - loop_expression(); - setState(421); - match(FOREACH_LOOP_RPAREN); - setState(426); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { - { - setState(424); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,31,_ctx) ) { - case 1: - { - setState(422); - general_statement(); - } - break; - case 2: - { - setState(423); - match(D_EMPTY); - } - break; - } - } - setState(428); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(429); - match(D_ENDFORELSE); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class SessionContext extends ParserRuleContext { - public TerminalNode D_SESSION() { return getToken(BladeAntlrParser.D_SESSION, 0); } - public Composed_php_expressionContext composed_php_expression() { - return getRuleContext(Composed_php_expressionContext.class,0); - } - public TerminalNode D_ENDSESSION() { return getToken(BladeAntlrParser.D_ENDSESSION, 0); } - public List general_statement() { - return getRuleContexts(General_statementContext.class); - } - public General_statementContext general_statement(int i) { - return getRuleContext(General_statementContext.class,i); - } - public SessionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_session; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterSession(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitSession(this); - } - } - - public final SessionContext session() throws RecognitionException { - SessionContext _localctx = new SessionContext(_ctx, getState()); - enterRule(_localctx, 56, RULE_session); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(431); - match(D_SESSION); - setState(432); - composed_php_expression(); - setState(436); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0)) { - { - { - setState(433); - general_statement(); - } - } - setState(438); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(439); - match(D_ENDSESSION); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class StackContext extends ParserRuleContext { - public TerminalNode D_STACK() { return getToken(BladeAntlrParser.D_STACK, 0); } - public SingleArgWrapperPContext singleArgWrapperP() { - return getRuleContext(SingleArgWrapperPContext.class,0); - } - public StackContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_stack; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterStack(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitStack(this); - } - } - - public final StackContext stack() throws RecognitionException { - StackContext _localctx = new StackContext(_ctx, getState()); - enterRule(_localctx, 58, RULE_stack); - try { - enterOuterAlt(_localctx, 1); - { - setState(441); - match(D_STACK); - setState(442); - singleArgWrapperP(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Asset_bundlerContext extends ParserRuleContext { - public Token d_name; - public Token id_strings; - public Token dir; - public Token id_string; - public TerminalNode BLADE_EXPR_LPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_LPAREN, 0); } - public TerminalNode BLADE_EXPR_RPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_RPAREN, 0); } - public TerminalNode D_ASSET_BUNDLER() { return getToken(BladeAntlrParser.D_ASSET_BUNDLER, 0); } - public TerminalNode BL_SQ_LPAREN() { return getToken(BladeAntlrParser.BL_SQ_LPAREN, 0); } - public TerminalNode BL_SQ_RPAREN() { return getToken(BladeAntlrParser.BL_SQ_RPAREN, 0); } - public List EXPR_STRING() { return getTokens(BladeAntlrParser.EXPR_STRING); } - public TerminalNode EXPR_STRING(int i) { - return getToken(BladeAntlrParser.EXPR_STRING, i); - } - public List composed_php_expression() { - return getRuleContexts(Composed_php_expressionContext.class); - } - public Composed_php_expressionContext composed_php_expression(int i) { - return getRuleContext(Composed_php_expressionContext.class,i); - } - public Asset_bundlerContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_asset_bundler; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterAsset_bundler(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitAsset_bundler(this); - } - } - - public final Asset_bundlerContext asset_bundler() throws RecognitionException { - Asset_bundlerContext _localctx = new Asset_bundlerContext(_ctx, getState()); - enterRule(_localctx, 60, RULE_asset_bundler); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(444); - ((Asset_bundlerContext)_localctx).d_name = match(D_ASSET_BUNDLER); - setState(445); - match(BLADE_EXPR_LPAREN); - setState(462); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { - case 1: - { - setState(446); - match(BL_SQ_LPAREN); - setState(448); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(447); - ((Asset_bundlerContext)_localctx).id_strings = match(EXPR_STRING); - } - } - setState(450); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( _la==EXPR_STRING ); - setState(452); - match(BL_SQ_RPAREN); - setState(454); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==EXPR_STRING) { - { - setState(453); - ((Asset_bundlerContext)_localctx).dir = match(EXPR_STRING); - } - } - - } - break; - case 2: - { - setState(456); - ((Asset_bundlerContext)_localctx).id_string = match(EXPR_STRING); - } - break; - case 3: - { - setState(458); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(457); - composed_php_expression(); - } - } - setState(460); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING ); - } - break; - } - setState(464); - match(BLADE_EXPR_RPAREN); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class InjectContext extends ParserRuleContext { - public TerminalNode D_INJECT() { return getToken(BladeAntlrParser.D_INJECT, 0); } - public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } - public List composedArgument() { - return getRuleContexts(ComposedArgumentContext.class); - } - public ComposedArgumentContext composedArgument(int i) { - return getRuleContext(ComposedArgumentContext.class,i); - } - public TerminalNode BL_COMMA() { return getToken(BladeAntlrParser.BL_COMMA, 0); } - public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } - public IdentifiableArgumentContext identifiableArgument() { - return getRuleContext(IdentifiableArgumentContext.class,0); - } - public InjectContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_inject; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterInject(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitInject(this); - } - } - - public final InjectContext inject() throws RecognitionException { - InjectContext _localctx = new InjectContext(_ctx, getState()); - enterRule(_localctx, 62, RULE_inject); - try { - enterOuterAlt(_localctx, 1); - { - setState(466); - match(D_INJECT); - setState(467); - match(BLADE_PARAM_LPAREN); - setState(468); - composedArgument(); - setState(469); - match(BL_COMMA); - setState(472); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { - case 1: - { - setState(470); - identifiableArgument(); - } - break; - case 2: - { - setState(471); - composedArgument(); - } - break; - } - setState(474); - match(BLADE_PARAM_RPAREN); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class IncludeCondContext extends ParserRuleContext { - public Token d_name; - public Token idString; - public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } - public List composedArgument() { - return getRuleContexts(ComposedArgumentContext.class); - } - public ComposedArgumentContext composedArgument(int i) { - return getRuleContext(ComposedArgumentContext.class,i); - } - public List BL_COMMA() { return getTokens(BladeAntlrParser.BL_COMMA); } - public TerminalNode BL_COMMA(int i) { - return getToken(BladeAntlrParser.BL_COMMA, i); - } - public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } - public TerminalNode D_INCLUDE_WHEN() { return getToken(BladeAntlrParser.D_INCLUDE_WHEN, 0); } - public TerminalNode D_INCLUDE_UNLESS() { return getToken(BladeAntlrParser.D_INCLUDE_UNLESS, 0); } - public TerminalNode BL_PARAM_STRING() { return getToken(BladeAntlrParser.BL_PARAM_STRING, 0); } - public IncludeCondContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_includeCond; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterIncludeCond(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitIncludeCond(this); - } - } - - public final IncludeCondContext includeCond() throws RecognitionException { - IncludeCondContext _localctx = new IncludeCondContext(_ctx, getState()); - enterRule(_localctx, 64, RULE_includeCond); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(476); - ((IncludeCondContext)_localctx).d_name = _input.LT(1); - _la = _input.LA(1); - if ( !(_la==D_INCLUDE_WHEN || _la==D_INCLUDE_UNLESS) ) { - ((IncludeCondContext)_localctx).d_name = (Token)_errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(477); - match(BLADE_PARAM_LPAREN); - setState(478); - composedArgument(); - setState(479); - match(BL_COMMA); - setState(482); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { - case 1: - { - setState(480); - ((IncludeCondContext)_localctx).idString = match(BL_PARAM_STRING); - } - break; - case 2: - { - setState(481); - composedArgument(); - } - break; - } - setState(486); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==BL_COMMA) { - { - setState(484); - match(BL_COMMA); - setState(485); - composedArgument(); - } - } - - setState(488); - match(BLADE_PARAM_RPAREN); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class EachContext extends ParserRuleContext { - public Token idString; - public TerminalNode D_EACH() { return getToken(BladeAntlrParser.D_EACH, 0); } - public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } - public List BL_COMMA() { return getTokens(BladeAntlrParser.BL_COMMA); } - public TerminalNode BL_COMMA(int i) { - return getToken(BladeAntlrParser.BL_COMMA, i); - } - public List composedArgument() { - return getRuleContexts(ComposedArgumentContext.class); - } - public ComposedArgumentContext composedArgument(int i) { - return getRuleContext(ComposedArgumentContext.class,i); - } - public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } - public TerminalNode BL_PARAM_STRING() { return getToken(BladeAntlrParser.BL_PARAM_STRING, 0); } - public IdentifiableArgumentContext identifiableArgument() { - return getRuleContext(IdentifiableArgumentContext.class,0); - } - public EachContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_each; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterEach(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitEach(this); - } - } - - public final EachContext each() throws RecognitionException { - EachContext _localctx = new EachContext(_ctx, getState()); - enterRule(_localctx, 66, RULE_each); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(490); - match(D_EACH); - setState(491); - match(BLADE_PARAM_LPAREN); - setState(494); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { - case 1: - { - setState(492); - ((EachContext)_localctx).idString = match(BL_PARAM_STRING); - } - break; - case 2: - { - setState(493); - composedArgument(); - } - break; - } - setState(496); - match(BL_COMMA); - setState(497); - composedArgument(); - setState(498); - match(BL_COMMA); - setState(499); - composedArgument(); - setState(505); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==BL_COMMA) { - { - setState(500); - match(BL_COMMA); - setState(503); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { - case 1: - { - setState(501); - identifiableArgument(); - } - break; - case 2: - { - setState(502); - composedArgument(); - } - break; - } - } - } - - setState(507); - match(BLADE_PARAM_RPAREN); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Once_blockContext extends ParserRuleContext { - public TerminalNode D_ONCE() { return getToken(BladeAntlrParser.D_ONCE, 0); } - public TerminalNode D_ENDONCE() { return getToken(BladeAntlrParser.D_ENDONCE, 0); } - public List general_statement() { - return getRuleContexts(General_statementContext.class); - } - public General_statementContext general_statement(int i) { - return getRuleContext(General_statementContext.class,i); - } - public Once_blockContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_once_block; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterOnce_block(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitOnce_block(this); - } - } - - public final Once_blockContext once_block() throws RecognitionException { - Once_blockContext _localctx = new Once_blockContext(_ctx, getState()); - enterRule(_localctx, 68, RULE_once_block); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(509); - match(D_ONCE); - setState(511); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(510); - general_statement(); - } - } - setState(513); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 1729358801733156864L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 219549927705270829L) != 0) ); - setState(515); - match(D_ENDONCE); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class CondSectionContext extends ParserRuleContext { - public SingleArgWrapperPContext singleArgWrapperP() { - return getRuleContext(SingleArgWrapperPContext.class,0); - } - public Simple_conditional_stmContext simple_conditional_stm() { - return getRuleContext(Simple_conditional_stmContext.class,0); - } - public TerminalNode D_ENDIF() { return getToken(BladeAntlrParser.D_ENDIF, 0); } - public TerminalNode D_SECTION_MISSING() { return getToken(BladeAntlrParser.D_SECTION_MISSING, 0); } - public TerminalNode D_HAS_SECTION() { return getToken(BladeAntlrParser.D_HAS_SECTION, 0); } - public CondSectionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_condSection; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterCondSection(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitCondSection(this); - } - } - - public final CondSectionContext condSection() throws RecognitionException { - CondSectionContext _localctx = new CondSectionContext(_ctx, getState()); - enterRule(_localctx, 70, RULE_condSection); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(517); - _la = _input.LA(1); - if ( !(_la==D_HAS_SECTION || _la==D_SECTION_MISSING) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(518); - singleArgWrapperP(); - setState(519); - simple_conditional_stm(); - setState(520); - match(D_ENDIF); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Custom_directiveContext extends ParserRuleContext { - public TerminalNode D_CUSTOM() { return getToken(BladeAntlrParser.D_CUSTOM, 0); } - public MultiArgWrapperContext multiArgWrapper() { - return getRuleContext(MultiArgWrapperContext.class,0); - } - public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } - public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } - public Custom_directiveContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_custom_directive; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterCustom_directive(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitCustom_directive(this); - } - } - - public final Custom_directiveContext custom_directive() throws RecognitionException { - Custom_directiveContext _localctx = new Custom_directiveContext(_ctx, getState()); - enterRule(_localctx, 72, RULE_custom_directive); - try { - enterOuterAlt(_localctx, 1); - { - setState(522); - match(D_CUSTOM); - setState(526); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { - case 1: - { - { - setState(523); - match(BLADE_PARAM_LPAREN); - setState(524); - match(BLADE_PARAM_RPAREN); - } - } - break; - case 2: - { - setState(525); - multiArgWrapper(); - } - break; - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class PossibleDirectiveContext extends ParserRuleContext { - public TerminalNode D_UNKNOWN() { return getToken(BladeAntlrParser.D_UNKNOWN, 0); } - public TerminalNode D_UNKNOWN_ATTR_ENC() { return getToken(BladeAntlrParser.D_UNKNOWN_ATTR_ENC, 0); } - public PossibleDirectiveContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_possibleDirective; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPossibleDirective(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPossibleDirective(this); - } - } - - public final PossibleDirectiveContext possibleDirective() throws RecognitionException { - PossibleDirectiveContext _localctx = new PossibleDirectiveContext(_ctx, getState()); - enterRule(_localctx, 74, RULE_possibleDirective); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(528); - _la = _input.LA(1); - if ( !(_la==D_UNKNOWN_ATTR_ENC || _la==D_UNKNOWN) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Php_bladeContext extends ParserRuleContext { - public TerminalNode D_PHP() { return getToken(BladeAntlrParser.D_PHP, 0); } - public TerminalNode D_ENDPHP() { return getToken(BladeAntlrParser.D_ENDPHP, 0); } - public List composed_php_expression() { - return getRuleContexts(Composed_php_expressionContext.class); - } - public Composed_php_expressionContext composed_php_expression(int i) { - return getRuleContext(Composed_php_expressionContext.class,i); - } - public Main_php_expressionContext main_php_expression() { - return getRuleContext(Main_php_expressionContext.class,0); - } - public Php_bladeContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_php_blade; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPhp_blade(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPhp_blade(this); - } - } - - public final Php_bladeContext php_blade() throws RecognitionException { - Php_bladeContext _localctx = new Php_bladeContext(_ctx, getState()); - enterRule(_localctx, 76, RULE_php_blade); - int _la; - try { - setState(540); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(530); - match(D_PHP); - setState(534); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING) { - { - { - setState(531); - composed_php_expression(); - } - } - setState(536); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(537); - match(D_ENDPHP); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(538); - match(D_PHP); - setState(539); - main_php_expression(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class PhpInlineContext extends ParserRuleContext { - public TerminalNode PHP_INLINE_START() { return getToken(BladeAntlrParser.PHP_INLINE_START, 0); } - public TerminalNode PHP_EXIT() { return getToken(BladeAntlrParser.PHP_EXIT, 0); } - public TerminalNode EOF() { return getToken(BladeAntlrParser.EOF, 0); } - public List composed_php_expression() { - return getRuleContexts(Composed_php_expressionContext.class); - } - public Composed_php_expressionContext composed_php_expression(int i) { - return getRuleContext(Composed_php_expressionContext.class,i); - } - public PhpInlineContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_phpInline; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPhpInline(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPhpInline(this); - } - } - - public final PhpInlineContext phpInline() throws RecognitionException { - PhpInlineContext _localctx = new PhpInlineContext(_ctx, getState()); - enterRule(_localctx, 78, RULE_phpInline); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(542); - match(PHP_INLINE_START); - setState(544); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(543); - composed_php_expression(); - } - } - setState(546); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING ); - setState(548); - _la = _input.LA(1); - if ( !(_la==EOF || _la==PHP_EXIT) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Regular_echoContext extends ParserRuleContext { - public TerminalNode CONTENT_TAG_OPEN() { return getToken(BladeAntlrParser.CONTENT_TAG_OPEN, 0); } - public TerminalNode CONTENT_TAG_CLOSE() { return getToken(BladeAntlrParser.CONTENT_TAG_CLOSE, 0); } - public List echo_expr() { - return getRuleContexts(Echo_exprContext.class); - } - public Echo_exprContext echo_expr(int i) { - return getRuleContext(Echo_exprContext.class,i); - } - public Regular_echoContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_regular_echo; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterRegular_echo(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitRegular_echo(this); - } - } - - public final Regular_echoContext regular_echo() throws RecognitionException { - Regular_echoContext _localctx = new Regular_echoContext(_ctx, getState()); - enterRule(_localctx, 80, RULE_regular_echo); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(550); - match(CONTENT_TAG_OPEN); - setState(554); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING) { - { - { - setState(551); - echo_expr(); - } - } - setState(556); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(557); - match(CONTENT_TAG_CLOSE); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Raw_echoContext extends ParserRuleContext { - public TerminalNode RAW_TAG_OPEN() { return getToken(BladeAntlrParser.RAW_TAG_OPEN, 0); } - public TerminalNode RAW_TAG_CLOSE() { return getToken(BladeAntlrParser.RAW_TAG_CLOSE, 0); } - public List echo_expr() { - return getRuleContexts(Echo_exprContext.class); - } - public Echo_exprContext echo_expr(int i) { - return getRuleContext(Echo_exprContext.class,i); - } - public Raw_echoContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_raw_echo; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterRaw_echo(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitRaw_echo(this); - } - } - - public final Raw_echoContext raw_echo() throws RecognitionException { - Raw_echoContext _localctx = new Raw_echoContext(_ctx, getState()); - enterRule(_localctx, 82, RULE_raw_echo); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(559); - match(RAW_TAG_OPEN); - setState(563); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING) { - { - { - setState(560); - echo_expr(); - } - } - setState(565); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(566); - match(RAW_TAG_CLOSE); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Echo_exprContext extends ParserRuleContext { - public Composed_php_expressionContext composed_php_expression() { - return getRuleContext(Composed_php_expressionContext.class,0); - } - public Echo_exprContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_echo_expr; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterEcho_expr(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitEcho_expr(this); - } - } - - public final Echo_exprContext echo_expr() throws RecognitionException { - Echo_exprContext _localctx = new Echo_exprContext(_ctx, getState()); - enterRule(_localctx, 84, RULE_echo_expr); - try { - enterOuterAlt(_localctx, 1); - { - setState(568); - composed_php_expression(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Class_expr_usageContext extends ParserRuleContext { - public Class_name_referenceContext class_name_reference() { - return getRuleContext(Class_name_referenceContext.class,0); - } - public Object_alias_static_accessContext object_alias_static_access() { - return getRuleContext(Object_alias_static_accessContext.class,0); - } - public Object_alias_direct_accessContext object_alias_direct_access() { - return getRuleContext(Object_alias_direct_accessContext.class,0); - } - public Static_direct_class_accessContext static_direct_class_access() { - return getRuleContext(Static_direct_class_accessContext.class,0); - } - public Static_direct_namespace_class_accessContext static_direct_namespace_class_access() { - return getRuleContext(Static_direct_namespace_class_accessContext.class,0); - } - public Class_instanceContext class_instance() { - return getRuleContext(Class_instanceContext.class,0); - } - public Class_expr_usageContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_class_expr_usage; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterClass_expr_usage(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitClass_expr_usage(this); - } - } - - public final Class_expr_usageContext class_expr_usage() throws RecognitionException { - Class_expr_usageContext _localctx = new Class_expr_usageContext(_ctx, getState()); - enterRule(_localctx, 86, RULE_class_expr_usage); - try { - setState(576); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(570); - class_name_reference(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(571); - object_alias_static_access(); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(572); - object_alias_direct_access(); - } - break; - case 4: - enterOuterAlt(_localctx, 4); - { - setState(573); - static_direct_class_access(); - } - break; - case 5: - enterOuterAlt(_localctx, 5); - { - setState(574); - static_direct_namespace_class_access(); - } - break; - case 6: - enterOuterAlt(_localctx, 6); - { - setState(575); - class_instance(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Object_alias_static_accessContext extends ParserRuleContext { - public Token alias_name; - public Token static_property; - public TerminalNode PHP_STATIC_ACCESS() { return getToken(BladeAntlrParser.PHP_STATIC_ACCESS, 0); } - public TerminalNode PHP_VARIABLE() { return getToken(BladeAntlrParser.PHP_VARIABLE, 0); } - public TerminalNode PHP_IDENTIFIER() { return getToken(BladeAntlrParser.PHP_IDENTIFIER, 0); } - public Object_alias_static_accessContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_object_alias_static_access; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterObject_alias_static_access(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitObject_alias_static_access(this); - } - } - - public final Object_alias_static_accessContext object_alias_static_access() throws RecognitionException { - Object_alias_static_accessContext _localctx = new Object_alias_static_accessContext(_ctx, getState()); - enterRule(_localctx, 88, RULE_object_alias_static_access); - try { - enterOuterAlt(_localctx, 1); - { - setState(578); - ((Object_alias_static_accessContext)_localctx).alias_name = match(PHP_VARIABLE); - setState(579); - match(PHP_STATIC_ACCESS); - setState(580); - ((Object_alias_static_accessContext)_localctx).static_property = match(PHP_IDENTIFIER); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Object_alias_direct_accessContext extends ParserRuleContext { - public Token alias_name; - public Token property; - public TerminalNode PHP_INSTANCE_ACCESS() { return getToken(BladeAntlrParser.PHP_INSTANCE_ACCESS, 0); } - public TerminalNode PHP_VARIABLE() { return getToken(BladeAntlrParser.PHP_VARIABLE, 0); } - public TerminalNode PHP_IDENTIFIER() { return getToken(BladeAntlrParser.PHP_IDENTIFIER, 0); } - public Object_alias_direct_accessContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_object_alias_direct_access; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterObject_alias_direct_access(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitObject_alias_direct_access(this); - } - } - - public final Object_alias_direct_accessContext object_alias_direct_access() throws RecognitionException { - Object_alias_direct_accessContext _localctx = new Object_alias_direct_accessContext(_ctx, getState()); - enterRule(_localctx, 90, RULE_object_alias_direct_access); - try { - enterOuterAlt(_localctx, 1); - { - setState(582); - ((Object_alias_direct_accessContext)_localctx).alias_name = match(PHP_VARIABLE); - setState(583); - match(PHP_INSTANCE_ACCESS); - setState(584); - ((Object_alias_direct_accessContext)_localctx).property = match(PHP_IDENTIFIER); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Static_direct_class_accessContext extends ParserRuleContext { - public Token class_name; - public Token func_name; - public Token static_property; - public TerminalNode PHP_STATIC_ACCESS() { return getToken(BladeAntlrParser.PHP_STATIC_ACCESS, 0); } - public TerminalNode BLADE_EXPR_LPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_LPAREN, 0); } - public TerminalNode BLADE_EXPR_RPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_RPAREN, 0); } - public List PHP_IDENTIFIER() { return getTokens(BladeAntlrParser.PHP_IDENTIFIER); } - public TerminalNode PHP_IDENTIFIER(int i) { - return getToken(BladeAntlrParser.PHP_IDENTIFIER, i); - } - public List composed_php_expression() { - return getRuleContexts(Composed_php_expressionContext.class); - } - public Composed_php_expressionContext composed_php_expression(int i) { - return getRuleContext(Composed_php_expressionContext.class,i); - } - public Static_direct_class_accessContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_static_direct_class_access; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterStatic_direct_class_access(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitStatic_direct_class_access(this); - } - } - - public final Static_direct_class_accessContext static_direct_class_access() throws RecognitionException { - Static_direct_class_accessContext _localctx = new Static_direct_class_accessContext(_ctx, getState()); - enterRule(_localctx, 92, RULE_static_direct_class_access); - int _la; - try { - setState(600); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(586); - ((Static_direct_class_accessContext)_localctx).class_name = match(PHP_IDENTIFIER); - setState(587); - match(PHP_STATIC_ACCESS); - setState(588); - ((Static_direct_class_accessContext)_localctx).func_name = match(PHP_IDENTIFIER); - setState(589); - match(BLADE_EXPR_LPAREN); - setState(593); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING) { - { - { - setState(590); - composed_php_expression(); - } - } - setState(595); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(596); - match(BLADE_EXPR_RPAREN); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(597); - ((Static_direct_class_accessContext)_localctx).class_name = match(PHP_IDENTIFIER); - setState(598); - match(PHP_STATIC_ACCESS); - setState(599); - ((Static_direct_class_accessContext)_localctx).static_property = match(PHP_IDENTIFIER); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Static_direct_namespace_class_accessContext extends ParserRuleContext { - public Token namespace; - public Token class_name; - public Token func_name; - public Token static_property; - public TerminalNode PHP_STATIC_ACCESS() { return getToken(BladeAntlrParser.PHP_STATIC_ACCESS, 0); } - public TerminalNode BLADE_EXPR_LPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_LPAREN, 0); } - public TerminalNode BLADE_EXPR_RPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_RPAREN, 0); } - public List PHP_IDENTIFIER() { return getTokens(BladeAntlrParser.PHP_IDENTIFIER); } - public TerminalNode PHP_IDENTIFIER(int i) { - return getToken(BladeAntlrParser.PHP_IDENTIFIER, i); - } - public List composed_php_expression() { - return getRuleContexts(Composed_php_expressionContext.class); - } - public Composed_php_expressionContext composed_php_expression(int i) { - return getRuleContext(Composed_php_expressionContext.class,i); - } - public TerminalNode PHP_NAMESPACE_PATH() { return getToken(BladeAntlrParser.PHP_NAMESPACE_PATH, 0); } - public Static_direct_namespace_class_accessContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_static_direct_namespace_class_access; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterStatic_direct_namespace_class_access(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitStatic_direct_namespace_class_access(this); - } - } - - public final Static_direct_namespace_class_accessContext static_direct_namespace_class_access() throws RecognitionException { - Static_direct_namespace_class_accessContext _localctx = new Static_direct_namespace_class_accessContext(_ctx, getState()); - enterRule(_localctx, 94, RULE_static_direct_namespace_class_access); - int _la; - try { - setState(622); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(603); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==PHP_NAMESPACE_PATH) { - { - setState(602); - ((Static_direct_namespace_class_accessContext)_localctx).namespace = match(PHP_NAMESPACE_PATH); - } - } - - setState(605); - ((Static_direct_namespace_class_accessContext)_localctx).class_name = match(PHP_IDENTIFIER); - setState(606); - match(PHP_STATIC_ACCESS); - setState(607); - ((Static_direct_namespace_class_accessContext)_localctx).func_name = match(PHP_IDENTIFIER); - setState(608); - match(BLADE_EXPR_LPAREN); - setState(612); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING) { - { - { - setState(609); - composed_php_expression(); - } - } - setState(614); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(615); - match(BLADE_EXPR_RPAREN); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(617); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==PHP_NAMESPACE_PATH) { - { - setState(616); - ((Static_direct_namespace_class_accessContext)_localctx).namespace = match(PHP_NAMESPACE_PATH); - } - } - - setState(619); - ((Static_direct_namespace_class_accessContext)_localctx).class_name = match(PHP_IDENTIFIER); - setState(620); - match(PHP_STATIC_ACCESS); - setState(621); - ((Static_direct_namespace_class_accessContext)_localctx).static_property = match(PHP_IDENTIFIER); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Class_instanceContext extends ParserRuleContext { - public Token namespace; - public Token class_name; - public TerminalNode PHP_NEW() { return getToken(BladeAntlrParser.PHP_NEW, 0); } - public TerminalNode BLADE_EXPR_LPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_LPAREN, 0); } - public TerminalNode BLADE_EXPR_RPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_RPAREN, 0); } - public TerminalNode PHP_IDENTIFIER() { return getToken(BladeAntlrParser.PHP_IDENTIFIER, 0); } - public List composed_php_expression() { - return getRuleContexts(Composed_php_expressionContext.class); - } - public Composed_php_expressionContext composed_php_expression(int i) { - return getRuleContext(Composed_php_expressionContext.class,i); - } - public TerminalNode PHP_NAMESPACE_PATH() { return getToken(BladeAntlrParser.PHP_NAMESPACE_PATH, 0); } - public Class_instanceContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_class_instance; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterClass_instance(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitClass_instance(this); - } - } - - public final Class_instanceContext class_instance() throws RecognitionException { - Class_instanceContext _localctx = new Class_instanceContext(_ctx, getState()); - enterRule(_localctx, 96, RULE_class_instance); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(624); - match(PHP_NEW); - { - setState(626); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==PHP_NAMESPACE_PATH) { - { - setState(625); - ((Class_instanceContext)_localctx).namespace = match(PHP_NAMESPACE_PATH); - } - } - - setState(628); - ((Class_instanceContext)_localctx).class_name = match(PHP_IDENTIFIER); - } - setState(630); - match(BLADE_EXPR_LPAREN); - setState(634); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING) { - { - { - setState(631); - composed_php_expression(); - } - } - setState(636); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(637); - match(BLADE_EXPR_RPAREN); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Class_name_referenceContext extends ParserRuleContext { - public Token namespace; - public Token class_name; - public TerminalNode PHP_STATIC_ACCESS() { return getToken(BladeAntlrParser.PHP_STATIC_ACCESS, 0); } - public TerminalNode PHP_CLASS_KEYWORD() { return getToken(BladeAntlrParser.PHP_CLASS_KEYWORD, 0); } - public TerminalNode PHP_IDENTIFIER() { return getToken(BladeAntlrParser.PHP_IDENTIFIER, 0); } - public TerminalNode PHP_NAMESPACE_PATH() { return getToken(BladeAntlrParser.PHP_NAMESPACE_PATH, 0); } - public Class_name_referenceContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_class_name_reference; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterClass_name_reference(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitClass_name_reference(this); - } - } - - public final Class_name_referenceContext class_name_reference() throws RecognitionException { - Class_name_referenceContext _localctx = new Class_name_referenceContext(_ctx, getState()); - enterRule(_localctx, 98, RULE_class_name_reference); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(640); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==PHP_NAMESPACE_PATH) { - { - setState(639); - ((Class_name_referenceContext)_localctx).namespace = match(PHP_NAMESPACE_PATH); - } - } - - setState(642); - ((Class_name_referenceContext)_localctx).class_name = match(PHP_IDENTIFIER); - setState(643); - match(PHP_STATIC_ACCESS); - setState(644); - match(PHP_CLASS_KEYWORD); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class NamespacePathContext extends ParserRuleContext { - public Token namespace; - public Token class_name; - public TerminalNode PHP_IDENTIFIER() { return getToken(BladeAntlrParser.PHP_IDENTIFIER, 0); } - public TerminalNode PHP_NAMESPACE_PATH() { return getToken(BladeAntlrParser.PHP_NAMESPACE_PATH, 0); } - public NamespacePathContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_namespacePath; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterNamespacePath(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitNamespacePath(this); - } - } - - public final NamespacePathContext namespacePath() throws RecognitionException { - NamespacePathContext _localctx = new NamespacePathContext(_ctx, getState()); - enterRule(_localctx, 100, RULE_namespacePath); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(647); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==PHP_NAMESPACE_PATH) { - { - setState(646); - ((NamespacePathContext)_localctx).namespace = match(PHP_NAMESPACE_PATH); - } - } - - setState(649); - ((NamespacePathContext)_localctx).class_name = match(PHP_IDENTIFIER); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Function_callContext extends ParserRuleContext { - public Token func_name; - public TerminalNode BLADE_EXPR_LPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_LPAREN, 0); } - public TerminalNode BLADE_EXPR_RPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_RPAREN, 0); } - public TerminalNode PHP_IDENTIFIER() { return getToken(BladeAntlrParser.PHP_IDENTIFIER, 0); } - public List composed_php_expression() { - return getRuleContexts(Composed_php_expressionContext.class); - } - public Composed_php_expressionContext composed_php_expression(int i) { - return getRuleContext(Composed_php_expressionContext.class,i); - } - public Function_callContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_function_call; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterFunction_call(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitFunction_call(this); - } - } - - public final Function_callContext function_call() throws RecognitionException { - Function_callContext _localctx = new Function_callContext(_ctx, getState()); - enterRule(_localctx, 102, RULE_function_call); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(651); - ((Function_callContext)_localctx).func_name = match(PHP_IDENTIFIER); - setState(652); - match(BLADE_EXPR_LPAREN); - setState(656); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING) { - { - { - setState(653); - composed_php_expression(); - } - } - setState(658); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(659); - match(BLADE_EXPR_RPAREN); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Php_expressionContext extends ParserRuleContext { - public TerminalNode PHP_EXPRESSION() { return getToken(BladeAntlrParser.PHP_EXPRESSION, 0); } - public Php_expressionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_php_expression; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPhp_expression(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPhp_expression(this); - } - } - - public final Php_expressionContext php_expression() throws RecognitionException { - Php_expressionContext _localctx = new Php_expressionContext(_ctx, getState()); - enterRule(_localctx, 104, RULE_php_expression); - try { - enterOuterAlt(_localctx, 1); - { - setState(661); - match(PHP_EXPRESSION); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Loop_expressionContext extends ParserRuleContext { - public Simple_foreach_exprContext simple_foreach_expr() { - return getRuleContext(Simple_foreach_exprContext.class,0); - } - public List PHP_VARIABLE() { return getTokens(BladeAntlrParser.PHP_VARIABLE); } - public TerminalNode PHP_VARIABLE(int i) { - return getToken(BladeAntlrParser.PHP_VARIABLE, i); - } - public List PHP_EXPRESSION() { return getTokens(BladeAntlrParser.PHP_EXPRESSION); } - public TerminalNode PHP_EXPRESSION(int i) { - return getToken(BladeAntlrParser.PHP_EXPRESSION, i); - } - public List FOREACH_PARAM_ASSIGN() { return getTokens(BladeAntlrParser.FOREACH_PARAM_ASSIGN); } - public TerminalNode FOREACH_PARAM_ASSIGN(int i) { - return getToken(BladeAntlrParser.FOREACH_PARAM_ASSIGN, i); - } - public List FOREACH_LOOP_LPAREN() { return getTokens(BladeAntlrParser.FOREACH_LOOP_LPAREN); } - public TerminalNode FOREACH_LOOP_LPAREN(int i) { - return getToken(BladeAntlrParser.FOREACH_LOOP_LPAREN, i); - } - public List FOREACH_LOOP_RPAREN() { return getTokens(BladeAntlrParser.FOREACH_LOOP_RPAREN); } - public TerminalNode FOREACH_LOOP_RPAREN(int i) { - return getToken(BladeAntlrParser.FOREACH_LOOP_RPAREN, i); - } - public List FOREACH_AS() { return getTokens(BladeAntlrParser.FOREACH_AS); } - public TerminalNode FOREACH_AS(int i) { - return getToken(BladeAntlrParser.FOREACH_AS, i); - } - public Loop_expressionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_loop_expression; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterLoop_expression(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitLoop_expression(this); - } - } - - public final Loop_expressionContext loop_expression() throws RecognitionException { - Loop_expressionContext _localctx = new Loop_expressionContext(_ctx, getState()); - enterRule(_localctx, 106, RULE_loop_expression); - int _la; - try { - int _alt; - setState(669); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(663); - simple_foreach_expr(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(665); - _errHandler.sync(this); - _alt = 1; - do { - switch (_alt) { - case 1: - { - { - setState(664); - _la = _input.LA(1); - if ( !(_la==PHP_EXPRESSION || _la==PHP_VARIABLE || ((((_la - 139)) & ~0x3f) == 0 && ((1L << (_la - 139)) & 15L) != 0)) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - } - } - break; - default: - throw new NoViableAltException(this); - } - setState(667); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,63,_ctx); - } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Main_php_expressionContext extends ParserRuleContext { - public TerminalNode BLADE_EXPR_LPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_LPAREN, 0); } - public TerminalNode BLADE_EXPR_RPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_RPAREN, 0); } - public List composed_php_expression() { - return getRuleContexts(Composed_php_expressionContext.class); - } - public Composed_php_expressionContext composed_php_expression(int i) { - return getRuleContext(Composed_php_expressionContext.class,i); - } - public Main_php_expressionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_main_php_expression; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterMain_php_expression(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitMain_php_expression(this); - } - } - - public final Main_php_expressionContext main_php_expression() throws RecognitionException { - Main_php_expressionContext _localctx = new Main_php_expressionContext(_ctx, getState()); - enterRule(_localctx, 108, RULE_main_php_expression); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(671); - match(BLADE_EXPR_LPAREN); - setState(673); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(672); - composed_php_expression(); - } - } - setState(675); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING ); - setState(677); - match(BLADE_EXPR_RPAREN); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Composed_php_expressionContext extends ParserRuleContext { - public Class_expr_usageContext class_expr_usage() { - return getRuleContext(Class_expr_usageContext.class,0); - } - public Function_callContext function_call() { - return getRuleContext(Function_callContext.class,0); - } - public TerminalNode PHP_IDENTIFIER() { return getToken(BladeAntlrParser.PHP_IDENTIFIER, 0); } - public NamespacePathContext namespacePath() { - return getRuleContext(NamespacePathContext.class,0); - } - public TerminalNode PHP_VARIABLE() { return getToken(BladeAntlrParser.PHP_VARIABLE, 0); } - public TerminalNode PHP_NAMESPACE_PATH() { return getToken(BladeAntlrParser.PHP_NAMESPACE_PATH, 0); } - public TerminalNode EXPR_STRING() { return getToken(BladeAntlrParser.EXPR_STRING, 0); } - public TerminalNode PHP_KEYWORD() { return getToken(BladeAntlrParser.PHP_KEYWORD, 0); } - public List PHP_EXPRESSION() { return getTokens(BladeAntlrParser.PHP_EXPRESSION); } - public TerminalNode PHP_EXPRESSION(int i) { - return getToken(BladeAntlrParser.PHP_EXPRESSION, i); - } - public TerminalNode PHP_STATIC_ACCESS() { return getToken(BladeAntlrParser.PHP_STATIC_ACCESS, 0); } - public TerminalNode PHP_CLASS_KEYWORD() { return getToken(BladeAntlrParser.PHP_CLASS_KEYWORD, 0); } - public TerminalNode PHP_INSTANCE_ACCESS() { return getToken(BladeAntlrParser.PHP_INSTANCE_ACCESS, 0); } - public TerminalNode BL_SQ_LPAREN() { return getToken(BladeAntlrParser.BL_SQ_LPAREN, 0); } - public TerminalNode BL_SQ_RPAREN() { return getToken(BladeAntlrParser.BL_SQ_RPAREN, 0); } - public List composed_php_expression() { - return getRuleContexts(Composed_php_expressionContext.class); - } - public Composed_php_expressionContext composed_php_expression(int i) { - return getRuleContext(Composed_php_expressionContext.class,i); - } - public TerminalNode BLADE_EXPR_LPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_LPAREN, 0); } - public TerminalNode BLADE_EXPR_RPAREN() { return getToken(BladeAntlrParser.BLADE_EXPR_RPAREN, 0); } - public TerminalNode PHP_EXPR_STRING() { return getToken(BladeAntlrParser.PHP_EXPR_STRING, 0); } - public Composed_php_expressionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_composed_php_expression; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterComposed_php_expression(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitComposed_php_expression(this); - } - } - - public final Composed_php_expressionContext composed_php_expression() throws RecognitionException { - Composed_php_expressionContext _localctx = new Composed_php_expressionContext(_ctx, getState()); - enterRule(_localctx, 110, RULE_composed_php_expression); - int _la; - try { - int _alt; - setState(712); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(679); - class_expr_usage(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(680); - function_call(); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(681); - match(PHP_IDENTIFIER); - } - break; - case 4: - enterOuterAlt(_localctx, 4); - { - setState(682); - namespacePath(); - } - break; - case 5: - enterOuterAlt(_localctx, 5); - { - setState(683); - match(PHP_VARIABLE); - } - break; - case 6: - enterOuterAlt(_localctx, 6); - { - setState(684); - match(PHP_NAMESPACE_PATH); - } - break; - case 7: - enterOuterAlt(_localctx, 7); - { - setState(685); - match(EXPR_STRING); - } - break; - case 8: - enterOuterAlt(_localctx, 8); - { - setState(686); - match(PHP_KEYWORD); - } - break; - case 9: - enterOuterAlt(_localctx, 9); - { - setState(688); - _errHandler.sync(this); - _alt = 1; - do { - switch (_alt) { - case 1: - { - { - setState(687); - match(PHP_EXPRESSION); - } - } - break; - default: - throw new NoViableAltException(this); - } - setState(690); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,66,_ctx); - } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); - } - break; - case 10: - enterOuterAlt(_localctx, 10); - { - setState(692); - match(PHP_STATIC_ACCESS); - } - break; - case 11: - enterOuterAlt(_localctx, 11); - { - setState(693); - match(PHP_CLASS_KEYWORD); - } - break; - case 12: - enterOuterAlt(_localctx, 12); - { - setState(694); - match(PHP_INSTANCE_ACCESS); - } - break; - case 13: - enterOuterAlt(_localctx, 13); - { - setState(695); - match(BL_SQ_LPAREN); - setState(699); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING) { - { - { - setState(696); - composed_php_expression(); - } - } - setState(701); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(702); - match(BL_SQ_RPAREN); - } - break; - case 14: - enterOuterAlt(_localctx, 14); - { - setState(703); - match(BLADE_EXPR_LPAREN); - setState(707); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2139134L) != 0) || _la==EXPR_STRING) { - { - { - setState(704); - composed_php_expression(); - } - } - setState(709); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(710); - match(BLADE_EXPR_RPAREN); - } - break; - case 15: - enterOuterAlt(_localctx, 15); - { - setState(711); - match(PHP_EXPR_STRING); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Simple_foreach_exprContext extends ParserRuleContext { - public Token loop_array; - public Token key; - public Token item; - public TerminalNode FOREACH_AS() { return getToken(BladeAntlrParser.FOREACH_AS, 0); } - public List PHP_VARIABLE() { return getTokens(BladeAntlrParser.PHP_VARIABLE); } - public TerminalNode PHP_VARIABLE(int i) { - return getToken(BladeAntlrParser.PHP_VARIABLE, i); - } - public TerminalNode FOREACH_PARAM_ASSIGN() { return getToken(BladeAntlrParser.FOREACH_PARAM_ASSIGN, 0); } - public Simple_foreach_exprContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_simple_foreach_expr; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterSimple_foreach_expr(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitSimple_foreach_expr(this); - } - } - - public final Simple_foreach_exprContext simple_foreach_expr() throws RecognitionException { - Simple_foreach_exprContext _localctx = new Simple_foreach_exprContext(_ctx, getState()); - enterRule(_localctx, 112, RULE_simple_foreach_expr); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(714); - ((Simple_foreach_exprContext)_localctx).loop_array = match(PHP_VARIABLE); - setState(715); - match(FOREACH_AS); - setState(716); - ((Simple_foreach_exprContext)_localctx).key = match(PHP_VARIABLE); - setState(719); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==FOREACH_PARAM_ASSIGN) { - { - setState(717); - match(FOREACH_PARAM_ASSIGN); - setState(718); - ((Simple_foreach_exprContext)_localctx).item = match(PHP_VARIABLE); - } - } - - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class SingleArgWrapperPContext extends ParserRuleContext { - public Token idString; - public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } - public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } - public ComposedArgumentContext composedArgument() { - return getRuleContext(ComposedArgumentContext.class,0); - } - public TerminalNode BL_PARAM_STRING() { return getToken(BladeAntlrParser.BL_PARAM_STRING, 0); } - public SingleArgWrapperPContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_singleArgWrapperP; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterSingleArgWrapperP(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitSingleArgWrapperP(this); - } - } - - public final SingleArgWrapperPContext singleArgWrapperP() throws RecognitionException { - SingleArgWrapperPContext _localctx = new SingleArgWrapperPContext(_ctx, getState()); - enterRule(_localctx, 114, RULE_singleArgWrapperP); - try { - enterOuterAlt(_localctx, 1); - { - setState(721); - match(BLADE_PARAM_LPAREN); - setState(724); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { - case 1: - { - setState(722); - ((SingleArgWrapperPContext)_localctx).idString = match(BL_PARAM_STRING); - } - break; - case 2: - { - setState(723); - composedArgument(); - } - break; - } - setState(726); - match(BLADE_PARAM_RPAREN); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class DoubleArgWrapperPContext extends ParserRuleContext { - public Token idString; - public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } - public TerminalNode BL_COMMA() { return getToken(BladeAntlrParser.BL_COMMA, 0); } - public List composedArgument() { - return getRuleContexts(ComposedArgumentContext.class); - } - public ComposedArgumentContext composedArgument(int i) { - return getRuleContext(ComposedArgumentContext.class,i); - } - public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } - public TerminalNode BL_PARAM_STRING() { return getToken(BladeAntlrParser.BL_PARAM_STRING, 0); } - public DoubleArgWrapperPContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_doubleArgWrapperP; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterDoubleArgWrapperP(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitDoubleArgWrapperP(this); - } - } - - public final DoubleArgWrapperPContext doubleArgWrapperP() throws RecognitionException { - DoubleArgWrapperPContext _localctx = new DoubleArgWrapperPContext(_ctx, getState()); - enterRule(_localctx, 116, RULE_doubleArgWrapperP); - try { - enterOuterAlt(_localctx, 1); - { - setState(728); - match(BLADE_PARAM_LPAREN); - setState(731); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { - case 1: - { - setState(729); - ((DoubleArgWrapperPContext)_localctx).idString = match(BL_PARAM_STRING); - } - break; - case 2: - { - setState(730); - composedArgument(); - } - break; - } - setState(733); - match(BL_COMMA); - setState(734); - composedArgument(); - setState(735); - match(BLADE_PARAM_RPAREN); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class MultiArgWrapperContext extends ParserRuleContext { - public TerminalNode BLADE_PARAM_LPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_LPAREN, 0); } - public TerminalNode BLADE_PARAM_RPAREN() { return getToken(BladeAntlrParser.BLADE_PARAM_RPAREN, 0); } - public List composedArgument() { - return getRuleContexts(ComposedArgumentContext.class); - } - public ComposedArgumentContext composedArgument(int i) { - return getRuleContext(ComposedArgumentContext.class,i); - } - public List BL_COMMA() { return getTokens(BladeAntlrParser.BL_COMMA); } - public TerminalNode BL_COMMA(int i) { - return getToken(BladeAntlrParser.BL_COMMA, i); - } - public MultiArgWrapperContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_multiArgWrapper; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterMultiArgWrapper(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitMultiArgWrapper(this); - } - } - - public final MultiArgWrapperContext multiArgWrapper() throws RecognitionException { - MultiArgWrapperContext _localctx = new MultiArgWrapperContext(_ctx, getState()); - enterRule(_localctx, 118, RULE_multiArgWrapper); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(737); - match(BLADE_PARAM_LPAREN); - { - setState(738); - composedArgument(); - } - setState(743); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==BL_COMMA) { - { - { - setState(739); - match(BL_COMMA); - setState(740); - composedArgument(); - } - } - setState(745); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(746); - match(BLADE_PARAM_RPAREN); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class IdentifiableArgumentContext extends ParserRuleContext { - public TerminalNode BL_PARAM_STRING() { return getToken(BladeAntlrParser.BL_PARAM_STRING, 0); } - public IdentifiableArgumentContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_identifiableArgument; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterIdentifiableArgument(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitIdentifiableArgument(this); - } - } - - public final IdentifiableArgumentContext identifiableArgument() throws RecognitionException { - IdentifiableArgumentContext _localctx = new IdentifiableArgumentContext(_ctx, getState()); - enterRule(_localctx, 120, RULE_identifiableArgument); - try { - enterOuterAlt(_localctx, 1); - { - setState(748); - match(BL_PARAM_STRING); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ComposedArgumentContext extends ParserRuleContext { - public List phpExpr() { - return getRuleContexts(PhpExprContext.class); - } - public PhpExprContext phpExpr(int i) { - return getRuleContext(PhpExprContext.class,i); - } - public ComposedArgumentContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_composedArgument; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterComposedArgument(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitComposedArgument(this); - } - } - - public final ComposedArgumentContext composedArgument() throws RecognitionException { - ComposedArgumentContext _localctx = new ComposedArgumentContext(_ctx, getState()); - enterRule(_localctx, 122, RULE_composedArgument); - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(751); - _errHandler.sync(this); - _alt = 1; - do { - switch (_alt) { - case 1: - { - { - setState(750); - phpExpr(); - } - } - break; - default: - throw new NoViableAltException(this); - } - setState(753); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,74,_ctx); - } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class PhpExprContext extends ParserRuleContext { - public IdentifiableArrayContext identifiableArray() { - return getRuleContext(IdentifiableArrayContext.class,0); - } - public ArrayDefineContext arrayDefine() { - return getRuleContext(ArrayDefineContext.class,0); - } - public TerminalNode BLADE_PARAM_EXTRA() { return getToken(BladeAntlrParser.BLADE_PARAM_EXTRA, 0); } - public TerminalNode PHP_VARIABLE() { return getToken(BladeAntlrParser.PHP_VARIABLE, 0); } - public TerminalNode PHP_KEYWORD() { return getToken(BladeAntlrParser.PHP_KEYWORD, 0); } - public TerminalNode BL_PARAM_CONCAT_OPERATOR() { return getToken(BladeAntlrParser.BL_PARAM_CONCAT_OPERATOR, 0); } - public TerminalNode BL_PARAM_STRING() { return getToken(BladeAntlrParser.BL_PARAM_STRING, 0); } - public TerminalNode BL_PARAM_ASSIGN() { return getToken(BladeAntlrParser.BL_PARAM_ASSIGN, 0); } - public TerminalNode BL_NAME_STRING() { return getToken(BladeAntlrParser.BL_NAME_STRING, 0); } - public TerminalNode BL_PARAM_COMMA() { return getToken(BladeAntlrParser.BL_PARAM_COMMA, 0); } - public PhpExprContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_phpExpr; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterPhpExpr(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitPhpExpr(this); - } - } - - public final PhpExprContext phpExpr() throws RecognitionException { - PhpExprContext _localctx = new PhpExprContext(_ctx, getState()); - enterRule(_localctx, 124, RULE_phpExpr); - try { - setState(765); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(755); - identifiableArray(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(756); - arrayDefine(); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(757); - match(BLADE_PARAM_EXTRA); - } - break; - case 4: - enterOuterAlt(_localctx, 4); - { - setState(758); - match(PHP_VARIABLE); - } - break; - case 5: - enterOuterAlt(_localctx, 5); - { - setState(759); - match(PHP_KEYWORD); - } - break; - case 6: - enterOuterAlt(_localctx, 6); - { - setState(760); - match(BL_PARAM_CONCAT_OPERATOR); - } - break; - case 7: - enterOuterAlt(_localctx, 7); - { - setState(761); - match(BL_PARAM_STRING); - } - break; - case 8: - enterOuterAlt(_localctx, 8); - { - setState(762); - match(BL_PARAM_ASSIGN); - } - break; - case 9: - enterOuterAlt(_localctx, 9); - { - setState(763); - match(BL_NAME_STRING); - } - break; - case 10: - enterOuterAlt(_localctx, 10); - { - setState(764); - match(BL_PARAM_COMMA); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class IdentifiableArrayContext extends ParserRuleContext { - public TerminalNode BL_SQ_LPAREN() { return getToken(BladeAntlrParser.BL_SQ_LPAREN, 0); } - public List paramAssign() { - return getRuleContexts(ParamAssignContext.class); - } - public ParamAssignContext paramAssign(int i) { - return getRuleContext(ParamAssignContext.class,i); - } - public TerminalNode BL_SQ_RPAREN() { return getToken(BladeAntlrParser.BL_SQ_RPAREN, 0); } - public List BL_PARAM_COMMA() { return getTokens(BladeAntlrParser.BL_PARAM_COMMA); } - public TerminalNode BL_PARAM_COMMA(int i) { - return getToken(BladeAntlrParser.BL_PARAM_COMMA, i); - } - public IdentifiableArrayContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_identifiableArray; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterIdentifiableArray(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitIdentifiableArray(this); - } - } - - public final IdentifiableArrayContext identifiableArray() throws RecognitionException { - IdentifiableArrayContext _localctx = new IdentifiableArrayContext(_ctx, getState()); - enterRule(_localctx, 126, RULE_identifiableArray); - int _la; - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(767); - match(BL_SQ_LPAREN); - setState(768); - paramAssign(); - setState(773); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,76,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(769); - match(BL_PARAM_COMMA); - setState(770); - paramAssign(); - } - } - } - setState(775); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,76,_ctx); - } - setState(777); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==BL_PARAM_COMMA) { - { - setState(776); - match(BL_PARAM_COMMA); - } - } - - setState(779); - match(BL_SQ_RPAREN); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ArrayDefineContext extends ParserRuleContext { - public TerminalNode BL_SQ_LPAREN() { return getToken(BladeAntlrParser.BL_SQ_LPAREN, 0); } - public TerminalNode BL_SQ_RPAREN() { return getToken(BladeAntlrParser.BL_SQ_RPAREN, 0); } - public List phpExpr() { - return getRuleContexts(PhpExprContext.class); - } - public PhpExprContext phpExpr(int i) { - return getRuleContext(PhpExprContext.class,i); - } - public ArrayDefineContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_arrayDefine; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterArrayDefine(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitArrayDefine(this); - } - } - - public final ArrayDefineContext arrayDefine() throws RecognitionException { - ArrayDefineContext _localctx = new ArrayDefineContext(_ctx, getState()); - enterRule(_localctx, 128, RULE_arrayDefine); - int _la; - try { - setState(791); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,79,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(781); - match(BL_SQ_LPAREN); - setState(783); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(782); - phpExpr(); - } - } - setState(785); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 1475596L) != 0) || _la==BL_PARAM_CONCAT_OPERATOR || _la==BL_NAME_STRING ); - setState(787); - match(BL_SQ_RPAREN); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(789); - match(BL_SQ_LPAREN); - setState(790); - match(BL_SQ_RPAREN); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ParamAssignContext extends ParserRuleContext { - public List BL_PARAM_STRING() { return getTokens(BladeAntlrParser.BL_PARAM_STRING); } - public TerminalNode BL_PARAM_STRING(int i) { - return getToken(BladeAntlrParser.BL_PARAM_STRING, i); - } - public TerminalNode BL_PARAM_ASSIGN() { return getToken(BladeAntlrParser.BL_PARAM_ASSIGN, 0); } - public TerminalNode PHP_VARIABLE() { return getToken(BladeAntlrParser.PHP_VARIABLE, 0); } - public TerminalNode PHP_KEYWORD() { return getToken(BladeAntlrParser.PHP_KEYWORD, 0); } - public ParamAssignContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_paramAssign; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterParamAssign(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitParamAssign(this); - } - } - - public final ParamAssignContext paramAssign() throws RecognitionException { - ParamAssignContext _localctx = new ParamAssignContext(_ctx, getState()); - enterRule(_localctx, 130, RULE_paramAssign); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(793); - match(BL_PARAM_STRING); - setState(794); - match(BL_PARAM_ASSIGN); - setState(795); - _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 131084L) != 0)) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Verbatim_blockContext extends ParserRuleContext { - public TerminalNode D_VERBATIM() { return getToken(BladeAntlrParser.D_VERBATIM, 0); } - public TerminalNode D_ENDVERBATIM() { return getToken(BladeAntlrParser.D_ENDVERBATIM, 0); } - public Verbatim_blockContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_verbatim_block; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterVerbatim_block(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitVerbatim_block(this); - } - } - - public final Verbatim_blockContext verbatim_block() throws RecognitionException { - Verbatim_blockContext _localctx = new Verbatim_blockContext(_ctx, getState()); - enterRule(_localctx, 132, RULE_verbatim_block); - try { - enterOuterAlt(_localctx, 1); - { - setState(797); - match(D_VERBATIM); - setState(798); - match(D_ENDVERBATIM); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Loop_actionContext extends ParserRuleContext { - public TerminalNode D_LOOP_ACTION() { return getToken(BladeAntlrParser.D_LOOP_ACTION, 0); } - public TerminalNode D_BREAK() { return getToken(BladeAntlrParser.D_BREAK, 0); } - public Php_expressionContext php_expression() { - return getRuleContext(Php_expressionContext.class,0); - } - public Loop_actionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_loop_action; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterLoop_action(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitLoop_action(this); - } - } - - public final Loop_actionContext loop_action() throws RecognitionException { - Loop_actionContext _localctx = new Loop_actionContext(_ctx, getState()); - enterRule(_localctx, 134, RULE_loop_action); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(800); - _la = _input.LA(1); - if ( !(_la==D_BREAK || _la==D_LOOP_ACTION) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(802); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==PHP_EXPRESSION) { - { - setState(801); - php_expression(); - } - } - - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class HtmlContext extends ParserRuleContext { - public List HTML() { return getTokens(BladeAntlrParser.HTML); } - public TerminalNode HTML(int i) { - return getToken(BladeAntlrParser.HTML, i); - } - public TerminalNode HTML_COMPONENT_PREFIX() { return getToken(BladeAntlrParser.HTML_COMPONENT_PREFIX, 0); } - public TerminalNode HTML_TAG_START() { return getToken(BladeAntlrParser.HTML_TAG_START, 0); } - public TerminalNode EQ() { return getToken(BladeAntlrParser.EQ, 0); } - public TerminalNode HTML_IDENTIFIER() { return getToken(BladeAntlrParser.HTML_IDENTIFIER, 0); } - public HtmlContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_html; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).enterHtml(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeAntlrParserListener ) ((BladeAntlrParserListener)listener).exitHtml(this); - } - } - - public final HtmlContext html() throws RecognitionException { - HtmlContext _localctx = new HtmlContext(_ctx, getState()); - enterRule(_localctx, 136, RULE_html); - try { - int _alt; - setState(813); - _errHandler.sync(this); - switch (_input.LA(1)) { - case HTML: - enterOuterAlt(_localctx, 1); - { - setState(805); - _errHandler.sync(this); - _alt = 1; - do { - switch (_alt) { - case 1: - { - { - setState(804); - match(HTML); - } - } - break; - default: - throw new NoViableAltException(this); - } - setState(807); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,81,_ctx); - } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); - } - break; - case HTML_COMPONENT_PREFIX: - enterOuterAlt(_localctx, 2); - { - setState(809); - match(HTML_COMPONENT_PREFIX); - } - break; - case HTML_TAG_START: - enterOuterAlt(_localctx, 3); - { - setState(810); - match(HTML_TAG_START); - } - break; - case EQ: - enterOuterAlt(_localctx, 4); - { - setState(811); - match(EQ); - } - break; - case HTML_IDENTIFIER: - enterOuterAlt(_localctx, 5); - { - setState(812); - match(HTML_IDENTIFIER); - } - break; - default: - throw new NoViableAltException(this); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static final String _serializedATN = - "\u0004\u0001\u00ab\u0330\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ - "\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+ - "\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+ - "\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+ - "\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007"+ - "\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007"+ - "\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007"+ - "\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007"+ - "\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007"+ - "\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007"+ - "\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007"+ - "\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007"+ - "\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007"+ - ",\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u0007"+ - "1\u00022\u00072\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u0007"+ - "6\u00027\u00077\u00028\u00078\u00029\u00079\u0002:\u0007:\u0002;\u0007"+ - ";\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007?\u0002@\u0007"+ - "@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007D\u0001\u0000"+ - "\u0005\u0000\u008c\b\u0000\n\u0000\f\u0000\u008f\t\u0000\u0001\u0000\u0001"+ - "\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u0096\b\u0001\u0001"+ - "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0003\u0002\u009d"+ - "\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0003\u0003\u00af"+ - "\b\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ - "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ - "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ - "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0003\u0004\u00c7"+ - "\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u00cd"+ - "\b\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u00d1\b\u0005\u0001\u0005"+ - "\u0003\u0005\u00d4\b\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006"+ - "\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0005\u0007"+ - "\u00df\b\u0007\n\u0007\f\u0007\u00e2\t\u0007\u0001\u0007\u0001\u0007\u0001"+ - "\b\u0001\b\u0001\b\u0005\b\u00e9\b\b\n\b\f\b\u00ec\t\b\u0001\b\u0001\b"+ - "\u0001\t\u0001\t\u0001\t\u0005\t\u00f3\b\t\n\t\f\t\u00f6\t\t\u0001\t\u0001"+ - "\t\u0001\n\u0001\n\u0001\n\u0005\n\u00fd\b\n\n\n\f\n\u0100\t\n\u0001\n"+ - "\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0005\u000b\u0107\b\u000b"+ - "\n\u000b\f\u000b\u010a\t\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f"+ - "\u0001\f\u0005\f\u0111\b\f\n\f\f\f\u0114\t\f\u0001\f\u0001\f\u0001\r\u0001"+ - "\r\u0001\r\u0005\r\u011b\b\r\n\r\f\r\u011e\t\r\u0001\r\u0001\r\u0001\r"+ - "\u0005\r\u0123\b\r\n\r\f\r\u0126\t\r\u0005\r\u0128\b\r\n\r\f\r\u012b\t"+ - "\r\u0001\r\u0003\r\u012e\b\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0005"+ - "\u000e\u0134\b\u000e\n\u000e\f\u000e\u0137\t\u000e\u0001\u000f\u0001\u000f"+ - "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011"+ - "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012"+ - "\u0001\u0012\u0005\u0012\u0148\b\u0012\n\u0012\f\u0012\u014b\t\u0012\u0001"+ - "\u0012\u0005\u0012\u014e\b\u0012\n\u0012\f\u0012\u0151\t\u0012\u0001\u0012"+ - "\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ - "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0003\u0013"+ - "\u015f\b\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+ - "\u0001\u0015\u0005\u0015\u0167\b\u0015\n\u0015\f\u0015\u016a\t\u0015\u0001"+ - "\u0015\u0003\u0015\u016d\b\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0005"+ - "\u0016\u0172\b\u0016\n\u0016\f\u0016\u0175\t\u0016\u0001\u0016\u0001\u0016"+ - "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0004\u0017\u017d\b\u0017"+ - "\u000b\u0017\f\u0017\u017e\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018"+ - "\u0001\u0018\u0005\u0018\u0186\b\u0018\n\u0018\f\u0018\u0189\t\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0005\u0019\u0190"+ - "\b\u0019\n\u0019\f\u0019\u0193\t\u0019\u0001\u0019\u0001\u0019\u0001\u001a"+ - "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0005\u001a\u019c\b\u001a"+ - "\n\u001a\f\u001a\u019f\t\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001"+ - "\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0005\u001b\u01a9"+ - "\b\u001b\n\u001b\f\u001b\u01ac\t\u001b\u0001\u001b\u0001\u001b\u0001\u001c"+ - "\u0001\u001c\u0001\u001c\u0005\u001c\u01b3\b\u001c\n\u001c\f\u001c\u01b6"+ - "\t\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001"+ - "\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0004\u001e\u01c1\b\u001e\u000b"+ - "\u001e\f\u001e\u01c2\u0001\u001e\u0001\u001e\u0003\u001e\u01c7\b\u001e"+ - "\u0001\u001e\u0001\u001e\u0004\u001e\u01cb\b\u001e\u000b\u001e\f\u001e"+ - "\u01cc\u0003\u001e\u01cf\b\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0003\u001f\u01d9"+ - "\b\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ - " \u0003 \u01e3\b \u0001 \u0001 \u0003 \u01e7\b \u0001 \u0001 \u0001!\u0001"+ - "!\u0001!\u0001!\u0003!\u01ef\b!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001"+ - "!\u0001!\u0003!\u01f8\b!\u0003!\u01fa\b!\u0001!\u0001!\u0001\"\u0001\""+ - "\u0004\"\u0200\b\"\u000b\"\f\"\u0201\u0001\"\u0001\"\u0001#\u0001#\u0001"+ - "#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0003$\u020f\b$\u0001%\u0001"+ - "%\u0001&\u0001&\u0005&\u0215\b&\n&\f&\u0218\t&\u0001&\u0001&\u0001&\u0003"+ - "&\u021d\b&\u0001\'\u0001\'\u0004\'\u0221\b\'\u000b\'\f\'\u0222\u0001\'"+ - "\u0001\'\u0001(\u0001(\u0005(\u0229\b(\n(\f(\u022c\t(\u0001(\u0001(\u0001"+ - ")\u0001)\u0005)\u0232\b)\n)\f)\u0235\t)\u0001)\u0001)\u0001*\u0001*\u0001"+ - "+\u0001+\u0001+\u0001+\u0001+\u0001+\u0003+\u0241\b+\u0001,\u0001,\u0001"+ - ",\u0001,\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0005.\u0250\b.\n.\f.\u0253\t.\u0001.\u0001.\u0001.\u0001.\u0003.\u0259"+ - "\b.\u0001/\u0003/\u025c\b/\u0001/\u0001/\u0001/\u0001/\u0001/\u0005/\u0263"+ - "\b/\n/\f/\u0266\t/\u0001/\u0001/\u0003/\u026a\b/\u0001/\u0001/\u0001/"+ - "\u0003/\u026f\b/\u00010\u00010\u00030\u0273\b0\u00010\u00010\u00010\u0001"+ - "0\u00050\u0279\b0\n0\f0\u027c\t0\u00010\u00010\u00011\u00031\u0281\b1"+ - "\u00011\u00011\u00011\u00011\u00012\u00032\u0288\b2\u00012\u00012\u0001"+ - "3\u00013\u00013\u00053\u028f\b3\n3\f3\u0292\t3\u00013\u00013\u00014\u0001"+ - "4\u00015\u00015\u00045\u029a\b5\u000b5\f5\u029b\u00035\u029e\b5\u0001"+ - "6\u00016\u00046\u02a2\b6\u000b6\f6\u02a3\u00016\u00016\u00017\u00017\u0001"+ - "7\u00017\u00017\u00017\u00017\u00017\u00017\u00047\u02b1\b7\u000b7\f7"+ - "\u02b2\u00017\u00017\u00017\u00017\u00017\u00057\u02ba\b7\n7\f7\u02bd"+ - "\t7\u00017\u00017\u00017\u00057\u02c2\b7\n7\f7\u02c5\t7\u00017\u00017"+ - "\u00037\u02c9\b7\u00018\u00018\u00018\u00018\u00018\u00038\u02d0\b8\u0001"+ - "9\u00019\u00019\u00039\u02d5\b9\u00019\u00019\u0001:\u0001:\u0001:\u0003"+ - ":\u02dc\b:\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0005"+ - ";\u02e6\b;\n;\f;\u02e9\t;\u0001;\u0001;\u0001<\u0001<\u0001=\u0004=\u02f0"+ - "\b=\u000b=\f=\u02f1\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001"+ - ">\u0001>\u0001>\u0003>\u02fe\b>\u0001?\u0001?\u0001?\u0001?\u0005?\u0304"+ - "\b?\n?\f?\u0307\t?\u0001?\u0003?\u030a\b?\u0001?\u0001?\u0001@\u0001@"+ - "\u0004@\u0310\b@\u000b@\f@\u0311\u0001@\u0001@\u0001@\u0001@\u0003@\u0318"+ - "\b@\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001C\u0001C\u0003"+ - "C\u0323\bC\u0001D\u0004D\u0326\bD\u000bD\fD\u0327\u0001D\u0001D\u0001"+ - "D\u0001D\u0003D\u032e\bD\u0001D\u0000\u0000E\u0000\u0002\u0004\u0006\b"+ - "\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.02"+ - "468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088"+ - "\u0000\u000b\u0007\u0000\u001e\u001e2267MMQQ]`cc\u0004\u0000\u001f\u001f"+ - "-.PPjj\u0004\u0000/055<A\u0002\u00001133\u0001\u0000"+ - "9:\u0001\u0000no\u0001\u0001\u009b\u009b\u0002\u0000\u0001\u0002\u008b"+ - "\u008e\u0002\u0000\u0002\u0003\u0011\u0011\u0001\u0000-.\u037e\u0000\u008d"+ - "\u0001\u0000\u0000\u0000\u0002\u0095\u0001\u0000\u0000\u0000\u0004\u009c"+ - "\u0001\u0000\u0000\u0000\u0006\u00ae\u0001\u0000\u0000\u0000\b\u00c6\u0001"+ - "\u0000\u0000\u0000\n\u00c8\u0001\u0000\u0000\u0000\f\u00d7\u0001\u0000"+ - "\u0000\u0000\u000e\u00da\u0001\u0000\u0000\u0000\u0010\u00e5\u0001\u0000"+ - "\u0000\u0000\u0012\u00ef\u0001\u0000\u0000\u0000\u0014\u00f9\u0001\u0000"+ - "\u0000\u0000\u0016\u0103\u0001\u0000\u0000\u0000\u0018\u010d\u0001\u0000"+ - "\u0000\u0000\u001a\u0117\u0001\u0000\u0000\u0000\u001c\u0131\u0001\u0000"+ - "\u0000\u0000\u001e\u0138\u0001\u0000\u0000\u0000 \u013a\u0001\u0000\u0000"+ - "\u0000\"\u013f\u0001\u0000\u0000\u0000$\u0144\u0001\u0000\u0000\u0000"+ - "&\u015e\u0001\u0000\u0000\u0000(\u0160\u0001\u0000\u0000\u0000*\u0168"+ - "\u0001\u0000\u0000\u0000,\u016e\u0001\u0000\u0000\u0000.\u0178\u0001\u0000"+ - "\u0000\u00000\u0182\u0001\u0000\u0000\u00002\u018c\u0001\u0000\u0000\u0000"+ - "4\u0196\u0001\u0000\u0000\u00006\u01a2\u0001\u0000\u0000\u00008\u01af"+ - "\u0001\u0000\u0000\u0000:\u01b9\u0001\u0000\u0000\u0000<\u01bc\u0001\u0000"+ - "\u0000\u0000>\u01d2\u0001\u0000\u0000\u0000@\u01dc\u0001\u0000\u0000\u0000"+ - "B\u01ea\u0001\u0000\u0000\u0000D\u01fd\u0001\u0000\u0000\u0000F\u0205"+ - "\u0001\u0000\u0000\u0000H\u020a\u0001\u0000\u0000\u0000J\u0210\u0001\u0000"+ - "\u0000\u0000L\u021c\u0001\u0000\u0000\u0000N\u021e\u0001\u0000\u0000\u0000"+ - "P\u0226\u0001\u0000\u0000\u0000R\u022f\u0001\u0000\u0000\u0000T\u0238"+ - "\u0001\u0000\u0000\u0000V\u0240\u0001\u0000\u0000\u0000X\u0242\u0001\u0000"+ - "\u0000\u0000Z\u0246\u0001\u0000\u0000\u0000\\\u0258\u0001\u0000\u0000"+ - "\u0000^\u026e\u0001\u0000\u0000\u0000`\u0270\u0001\u0000\u0000\u0000b"+ - "\u0280\u0001\u0000\u0000\u0000d\u0287\u0001\u0000\u0000\u0000f\u028b\u0001"+ - "\u0000\u0000\u0000h\u0295\u0001\u0000\u0000\u0000j\u029d\u0001\u0000\u0000"+ - "\u0000l\u029f\u0001\u0000\u0000\u0000n\u02c8\u0001\u0000\u0000\u0000p"+ - "\u02ca\u0001\u0000\u0000\u0000r\u02d1\u0001\u0000\u0000\u0000t\u02d8\u0001"+ - "\u0000\u0000\u0000v\u02e1\u0001\u0000\u0000\u0000x\u02ec\u0001\u0000\u0000"+ - "\u0000z\u02ef\u0001\u0000\u0000\u0000|\u02fd\u0001\u0000\u0000\u0000~"+ - "\u02ff\u0001\u0000\u0000\u0000\u0080\u0317\u0001\u0000\u0000\u0000\u0082"+ - "\u0319\u0001\u0000\u0000\u0000\u0084\u031d\u0001\u0000\u0000\u0000\u0086"+ - "\u0320\u0001\u0000\u0000\u0000\u0088\u032d\u0001\u0000\u0000\u0000\u008a"+ - "\u008c\u0003\u0002\u0001\u0000\u008b\u008a\u0001\u0000\u0000\u0000\u008c"+ - "\u008f\u0001\u0000\u0000\u0000\u008d\u008b\u0001\u0000\u0000\u0000\u008d"+ - "\u008e\u0001\u0000\u0000\u0000\u008e\u0090\u0001\u0000\u0000\u0000\u008f"+ - "\u008d\u0001\u0000\u0000\u0000\u0090\u0091\u0005\u0000\u0000\u0001\u0091"+ - "\u0001\u0001\u0000\u0000\u0000\u0092\u0096\u0003\u0004\u0002\u0000\u0093"+ - "\u0096\u0003\b\u0004\u0000\u0094\u0096\u0003\u0088D\u0000\u0095\u0092"+ - "\u0001\u0000\u0000\u0000\u0095\u0093\u0001\u0000\u0000\u0000\u0095\u0094"+ - "\u0001\u0000\u0000\u0000\u0096\u0003\u0001\u0000\u0000\u0000\u0097\u009d"+ - "\u0003\u0006\u0003\u0000\u0098\u009d\u0003J%\u0000\u0099\u009d\u0003P"+ - "(\u0000\u009a\u009d\u0003R)\u0000\u009b\u009d\u0003N\'\u0000\u009c\u0097"+ - "\u0001\u0000\u0000\u0000\u009c\u0098\u0001\u0000\u0000\u0000\u009c\u0099"+ - "\u0001\u0000\u0000\u0000\u009c\u009a\u0001\u0000\u0000\u0000\u009c\u009b"+ - "\u0001\u0000\u0000\u0000\u009d\u0005\u0001\u0000\u0000\u0000\u009e\u00af"+ - "\u0003\f\u0006\u0000\u009f\u00af\u0003\n\u0005\u0000\u00a0\u00af\u0003"+ - ":\u001d\u0000\u00a1\u00af\u0003@ \u0000\u00a2\u00af\u0003B!\u0000\u00a3"+ - "\u00a4\u0007\u0000\u0000\u0000\u00a4\u00af\u0003n7\u0000\u00a5\u00af\u0007"+ - "\u0001\u0000\u0000\u00a6\u00af\u0003<\u001e\u0000\u00a7\u00af\u0003>\u001f"+ - "\u0000\u00a8\u00a9\u0005[\u0000\u0000\u00a9\u00af\u0003n7\u0000\u00aa"+ - "\u00af\u0003\u0086C\u0000\u00ab\u00af\u0005\u001b\u0000\u0000\u00ac\u00af"+ - "\u0005l\u0000\u0000\u00ad\u00af\u0003H$\u0000\u00ae\u009e\u0001\u0000"+ - "\u0000\u0000\u00ae\u009f\u0001\u0000\u0000\u0000\u00ae\u00a0\u0001\u0000"+ - "\u0000\u0000\u00ae\u00a1\u0001\u0000\u0000\u0000\u00ae\u00a2\u0001\u0000"+ - "\u0000\u0000\u00ae\u00a3\u0001\u0000\u0000\u0000\u00ae\u00a5\u0001\u0000"+ - "\u0000\u0000\u00ae\u00a6\u0001\u0000\u0000\u0000\u00ae\u00a7\u0001\u0000"+ - "\u0000\u0000\u00ae\u00a8\u0001\u0000\u0000\u0000\u00ae\u00aa\u0001\u0000"+ - "\u0000\u0000\u00ae\u00ab\u0001\u0000\u0000\u0000\u00ae\u00ac\u0001\u0000"+ - "\u0000\u0000\u00ae\u00ad\u0001\u0000\u0000\u0000\u00af\u0007\u0001\u0000"+ - "\u0000\u0000\u00b0\u00c7\u0003\u000e\u0007\u0000\u00b1\u00c7\u0003F#\u0000"+ - "\u00b2\u00c7\u0003\u0010\b\u0000\u00b3\u00c7\u0003\u0014\n\u0000\u00b4"+ - "\u00c7\u0003D\"\u0000\u00b5\u00c7\u0003\u0016\u000b\u0000\u00b6\u00c7"+ - "\u0003\u0018\f\u0000\u00b7\u00c7\u0003\u001a\r\u0000\u00b8\u00c7\u0003"+ - ".\u0017\u0000\u00b9\u00c7\u0003&\u0013\u0000\u00ba\u00c7\u0003 \u0010"+ - "\u0000\u00bb\u00c7\u0003,\u0016\u0000\u00bc\u00c7\u0003\"\u0011\u0000"+ - "\u00bd\u00c7\u0003$\u0012\u0000\u00be\u00c7\u0003(\u0014\u0000\u00bf\u00c7"+ - "\u00030\u0018\u0000\u00c0\u00c7\u00032\u0019\u0000\u00c1\u00c7\u00034"+ - "\u001a\u0000\u00c2\u00c7\u00036\u001b\u0000\u00c3\u00c7\u00038\u001c\u0000"+ - "\u00c4\u00c7\u0003\u0084B\u0000\u00c5\u00c7\u0003L&\u0000\u00c6\u00b0"+ - "\u0001\u0000\u0000\u0000\u00c6\u00b1\u0001\u0000\u0000\u0000\u00c6\u00b2"+ - "\u0001\u0000\u0000\u0000\u00c6\u00b3\u0001\u0000\u0000\u0000\u00c6\u00b4"+ - "\u0001\u0000\u0000\u0000\u00c6\u00b5\u0001\u0000\u0000\u0000\u00c6\u00b6"+ - "\u0001\u0000\u0000\u0000\u00c6\u00b7\u0001\u0000\u0000\u0000\u00c6\u00b8"+ - "\u0001\u0000\u0000\u0000\u00c6\u00b9\u0001\u0000\u0000\u0000\u00c6\u00ba"+ - "\u0001\u0000\u0000\u0000\u00c6\u00bb\u0001\u0000\u0000\u0000\u00c6\u00bc"+ - "\u0001\u0000\u0000\u0000\u00c6\u00bd\u0001\u0000\u0000\u0000\u00c6\u00be"+ - "\u0001\u0000\u0000\u0000\u00c6\u00bf\u0001\u0000\u0000\u0000\u00c6\u00c0"+ - "\u0001\u0000\u0000\u0000\u00c6\u00c1\u0001\u0000\u0000\u0000\u00c6\u00c2"+ - "\u0001\u0000\u0000\u0000\u00c6\u00c3\u0001\u0000\u0000\u0000\u00c6\u00c4"+ - "\u0001\u0000\u0000\u0000\u00c6\u00c5\u0001\u0000\u0000\u0000\u00c7\t\u0001"+ - "\u0000\u0000\u0000\u00c8\u00c9\u0007\u0002\u0000\u0000\u00c9\u00cc\u0005"+ - "\u000b\u0000\u0000\u00ca\u00cd\u0005\u0011\u0000\u0000\u00cb\u00cd\u0003"+ - "z=\u0000\u00cc\u00ca\u0001\u0000\u0000\u0000\u00cc\u00cb\u0001\u0000\u0000"+ - "\u0000\u00cd\u00d0\u0001\u0000\u0000\u0000\u00ce\u00cf\u0005\u0013\u0000"+ - "\u0000\u00cf\u00d1\u0003z=\u0000\u00d0\u00ce\u0001\u0000\u0000\u0000\u00d0"+ - "\u00d1\u0001\u0000\u0000\u0000\u00d1\u00d3\u0001\u0000\u0000\u0000\u00d2"+ - "\u00d4\u0005\u0013\u0000\u0000\u00d3\u00d2\u0001\u0000\u0000\u0000\u00d3"+ - "\u00d4\u0001\u0000\u0000\u0000\u00d4\u00d5\u0001\u0000\u0000\u0000\u00d5"+ - "\u00d6\u0005\f\u0000\u0000\u00d6\u000b\u0001\u0000\u0000\u0000\u00d7\u00d8"+ - "\u00058\u0000\u0000\u00d8\u00d9\u0003t:\u0000\u00d9\r\u0001\u0000\u0000"+ - "\u0000\u00da\u00db\u00058\u0000\u0000\u00db\u00e0\u0003r9\u0000\u00dc"+ - "\u00df\u0003\u0002\u0001\u0000\u00dd\u00df\u0005=\u0000\u0000\u00de\u00dc"+ - "\u0001\u0000\u0000\u0000\u00de\u00dd\u0001\u0000\u0000\u0000\u00df\u00e2"+ - "\u0001\u0000\u0000\u0000\u00e0\u00de\u0001\u0000\u0000\u0000\u00e0\u00e1"+ - "\u0001\u0000\u0000\u0000\u00e1\u00e3\u0001\u0000\u0000\u0000\u00e2\u00e0"+ - "\u0001\u0000\u0000\u0000\u00e3\u00e4\u0007\u0003\u0000\u0000\u00e4\u000f"+ - "\u0001\u0000\u0000\u0000\u00e5\u00e6\u0005E\u0000\u0000\u00e6\u00ea\u0003"+ - "r9\u0000\u00e7\u00e9\u0003\u0002\u0001\u0000\u00e8\u00e7\u0001\u0000\u0000"+ - "\u0000\u00e9\u00ec\u0001\u0000\u0000\u0000\u00ea\u00e8\u0001\u0000\u0000"+ - "\u0000\u00ea\u00eb\u0001\u0000\u0000\u0000\u00eb\u00ed\u0001\u0000\u0000"+ - "\u0000\u00ec\u00ea\u0001\u0000\u0000\u0000\u00ed\u00ee\u0005F\u0000\u0000"+ - "\u00ee\u0011\u0001\u0000\u0000\u0000\u00ef\u00f0\u0005I\u0000\u0000\u00f0"+ - "\u00f4\u0003r9\u0000\u00f1\u00f3\u0003\u0002\u0001\u0000\u00f2\u00f1\u0001"+ - "\u0000\u0000\u0000\u00f3\u00f6\u0001\u0000\u0000\u0000\u00f4\u00f2\u0001"+ - "\u0000\u0000\u0000\u00f4\u00f5\u0001\u0000\u0000\u0000\u00f5\u00f7\u0001"+ - "\u0000\u0000\u0000\u00f6\u00f4\u0001\u0000\u0000\u0000\u00f7\u00f8\u0005"+ - "J\u0000\u0000\u00f8\u0013\u0001\u0000\u0000\u0000\u00f9\u00fa\u0005G\u0000"+ - "\u0000\u00fa\u00fe\u0003r9\u0000\u00fb\u00fd\u0003\u0002\u0001\u0000\u00fc"+ - "\u00fb\u0001\u0000\u0000\u0000\u00fd\u0100\u0001\u0000\u0000\u0000\u00fe"+ - "\u00fc\u0001\u0000\u0000\u0000\u00fe\u00ff\u0001\u0000\u0000\u0000\u00ff"+ - "\u0101\u0001\u0000\u0000\u0000\u0100\u00fe\u0001\u0000\u0000\u0000\u0101"+ - "\u0102\u0005H\u0000\u0000\u0102\u0015\u0001\u0000\u0000\u0000\u0103\u0104"+ - "\u0005K\u0000\u0000\u0104\u0108\u0003r9\u0000\u0105\u0107\u0003\u0002"+ - "\u0001\u0000\u0106\u0105\u0001\u0000\u0000\u0000\u0107\u010a\u0001\u0000"+ - "\u0000\u0000\u0108\u0106\u0001\u0000\u0000\u0000\u0108\u0109\u0001\u0000"+ - "\u0000\u0000\u0109\u010b\u0001\u0000\u0000\u0000\u010a\u0108\u0001\u0000"+ - "\u0000\u0000\u010b\u010c\u0005L\u0000\u0000\u010c\u0017\u0001\u0000\u0000"+ - "\u0000\u010d\u010e\u0005N\u0000\u0000\u010e\u0112\u0003n7\u0000\u010f"+ - "\u0111\u0003\u0002\u0001\u0000\u0110\u010f\u0001\u0000\u0000\u0000\u0111"+ - "\u0114\u0001\u0000\u0000\u0000\u0112\u0110\u0001\u0000\u0000\u0000\u0112"+ - "\u0113\u0001\u0000\u0000\u0000\u0113\u0115\u0001\u0000\u0000\u0000\u0114"+ - "\u0112\u0001\u0000\u0000\u0000\u0115\u0116\u0005O\u0000\u0000\u0116\u0019"+ - "\u0001\u0000\u0000\u0000\u0117\u0118\u0005\u0019\u0000\u0000\u0118\u011c"+ - "\u0003l6\u0000\u0119\u011b\u0003\u0002\u0001\u0000\u011a\u0119\u0001\u0000"+ - "\u0000\u0000\u011b\u011e\u0001\u0000\u0000\u0000\u011c\u011a\u0001\u0000"+ - "\u0000\u0000\u011c\u011d\u0001\u0000\u0000\u0000\u011d\u0129\u0001\u0000"+ - "\u0000\u0000\u011e\u011c\u0001\u0000\u0000\u0000\u011f\u0120\u0005\u001a"+ - "\u0000\u0000\u0120\u0124\u0003l6\u0000\u0121\u0123\u0003\u0002\u0001\u0000"+ - "\u0122\u0121\u0001\u0000\u0000\u0000\u0123\u0126\u0001\u0000\u0000\u0000"+ - "\u0124\u0122\u0001\u0000\u0000\u0000\u0124\u0125\u0001\u0000\u0000\u0000"+ - "\u0125\u0128\u0001\u0000\u0000\u0000\u0126\u0124\u0001\u0000\u0000\u0000"+ - "\u0127\u011f\u0001\u0000\u0000\u0000\u0128\u012b\u0001\u0000\u0000\u0000"+ - "\u0129\u0127\u0001\u0000\u0000\u0000\u0129\u012a\u0001\u0000\u0000\u0000"+ - "\u012a\u012d\u0001\u0000\u0000\u0000\u012b\u0129\u0001\u0000\u0000\u0000"+ - "\u012c\u012e\u0003\u001c\u000e\u0000\u012d\u012c\u0001\u0000\u0000\u0000"+ - "\u012d\u012e\u0001\u0000\u0000\u0000\u012e\u012f\u0001\u0000\u0000\u0000"+ - "\u012f\u0130\u0003\u001e\u000f\u0000\u0130\u001b\u0001\u0000\u0000\u0000"+ - "\u0131\u0135\u0005\u001b\u0000\u0000\u0132\u0134\u0003\u0002\u0001\u0000"+ - "\u0133\u0132\u0001\u0000\u0000\u0000\u0134\u0137\u0001\u0000\u0000\u0000"+ - "\u0135\u0133\u0001\u0000\u0000\u0000\u0135\u0136\u0001\u0000\u0000\u0000"+ - "\u0136\u001d\u0001\u0000\u0000\u0000\u0137\u0135\u0001\u0000\u0000\u0000"+ - "\u0138\u0139\u0005\u001c\u0000\u0000\u0139\u001f\u0001\u0000\u0000\u0000"+ - "\u013a\u013b\u0005!\u0000\u0000\u013b\u013c\u0003n7\u0000\u013c\u013d"+ - "\u0003*\u0015\u0000\u013d\u013e\u0005\"\u0000\u0000\u013e!\u0001\u0000"+ - "\u0000\u0000\u013f\u0140\u0005#\u0000\u0000\u0140\u0141\u0003l6\u0000"+ - "\u0141\u0142\u0003*\u0015\u0000\u0142\u0143\u0005$\u0000\u0000\u0143#"+ - "\u0001\u0000\u0000\u0000\u0144\u014f\u0005X\u0000\u0000\u0145\u0149\u0005"+ - "\u000b\u0000\u0000\u0146\u0148\u0003z=\u0000\u0147\u0146\u0001\u0000\u0000"+ - "\u0000\u0148\u014b\u0001\u0000\u0000\u0000\u0149\u0147\u0001\u0000\u0000"+ - "\u0000\u0149\u014a\u0001\u0000\u0000\u0000\u014a\u014c\u0001\u0000\u0000"+ - "\u0000\u014b\u0149\u0001\u0000\u0000\u0000\u014c\u014e\u0005\f\u0000\u0000"+ - "\u014d\u0145\u0001\u0000\u0000\u0000\u014e\u0151\u0001\u0000\u0000\u0000"+ - "\u014f\u014d\u0001\u0000\u0000\u0000\u014f\u0150\u0001\u0000\u0000\u0000"+ - "\u0150\u0152\u0001\u0000\u0000\u0000\u0151\u014f\u0001\u0000\u0000\u0000"+ - "\u0152\u0153\u0003*\u0015\u0000\u0153\u0154\u0005Y\u0000\u0000\u0154%"+ - "\u0001\u0000\u0000\u0000\u0155\u0156\u0005V\u0000\u0000\u0156\u0157\u0003"+ - "r9\u0000\u0157\u0158\u0003*\u0015\u0000\u0158\u0159\u0005W\u0000\u0000"+ - "\u0159\u015f\u0001\u0000\u0000\u0000\u015a\u015b\u0005T\u0000\u0000\u015b"+ - "\u015c\u0003*\u0015\u0000\u015c\u015d\u0005U\u0000\u0000\u015d\u015f\u0001"+ - "\u0000\u0000\u0000\u015e\u0155\u0001\u0000\u0000\u0000\u015e\u015a\u0001"+ - "\u0000\u0000\u0000\u015f\'\u0001\u0000\u0000\u0000\u0160\u0161\u0005Z"+ - "\u0000\u0000\u0161\u0162\u0003n7\u0000\u0162\u0163\u0003*\u0015\u0000"+ - "\u0163\u0164\u0005\\\u0000\u0000\u0164)\u0001\u0000\u0000\u0000\u0165"+ - "\u0167\u0003\u0002\u0001\u0000\u0166\u0165\u0001\u0000\u0000\u0000\u0167"+ - "\u016a\u0001\u0000\u0000\u0000\u0168\u0166\u0001\u0000\u0000\u0000\u0168"+ - "\u0169\u0001\u0000\u0000\u0000\u0169\u016c\u0001\u0000\u0000\u0000\u016a"+ - "\u0168\u0001\u0000\u0000\u0000\u016b\u016d\u0003\u001c\u000e\u0000\u016c"+ - "\u016b\u0001\u0000\u0000\u0000\u016c\u016d\u0001\u0000\u0000\u0000\u016d"+ - "+\u0001\u0000\u0000\u0000\u016e\u016f\u0005R\u0000\u0000\u016f\u0173\u0003"+ - "h4\u0000\u0170\u0172\u0003\u0002\u0001\u0000\u0171\u0170\u0001\u0000\u0000"+ - "\u0000\u0172\u0175\u0001\u0000\u0000\u0000\u0173\u0171\u0001\u0000\u0000"+ - "\u0000\u0173\u0174\u0001\u0000\u0000\u0000\u0174\u0176\u0001\u0000\u0000"+ - "\u0000\u0175\u0173\u0001\u0000\u0000\u0000\u0176\u0177\u0005S\u0000\u0000"+ - "\u0177-\u0001\u0000\u0000\u0000\u0178\u0179\u0005\u001d\u0000\u0000\u0179"+ - "\u017c\u0003h4\u0000\u017a\u017d\u0003\u0002\u0001\u0000\u017b\u017d\u0005"+ - "-\u0000\u0000\u017c\u017a\u0001\u0000\u0000\u0000\u017c\u017b\u0001\u0000"+ - "\u0000\u0000\u017d\u017e\u0001\u0000\u0000\u0000\u017e\u017c\u0001\u0000"+ - "\u0000\u0000\u017e\u017f\u0001\u0000\u0000\u0000\u017f\u0180\u0001\u0000"+ - "\u0000\u0000\u0180\u0181\u0005 \u0000\u0000\u0181/\u0001\u0000\u0000\u0000"+ - "\u0182\u0183\u0005+\u0000\u0000\u0183\u0187\u0003h4\u0000\u0184\u0186"+ - "\u0003\u0002\u0001\u0000\u0185\u0184\u0001\u0000\u0000\u0000\u0186\u0189"+ - "\u0001\u0000\u0000\u0000\u0187\u0185\u0001\u0000\u0000\u0000\u0187\u0188"+ - "\u0001\u0000\u0000\u0000\u0188\u018a\u0001\u0000\u0000\u0000\u0189\u0187"+ - "\u0001\u0000\u0000\u0000\u018a\u018b\u0005,\u0000\u0000\u018b1\u0001\u0000"+ - "\u0000\u0000\u018c\u018d\u0005\'\u0000\u0000\u018d\u0191\u0003h4\u0000"+ - "\u018e\u0190\u0003\u0002\u0001\u0000\u018f\u018e\u0001\u0000\u0000\u0000"+ - "\u0190\u0193\u0001\u0000\u0000\u0000\u0191\u018f\u0001\u0000\u0000\u0000"+ - "\u0191\u0192\u0001\u0000\u0000\u0000\u0192\u0194\u0001\u0000\u0000\u0000"+ - "\u0193\u0191\u0001\u0000\u0000\u0000\u0194\u0195\u0005(\u0000\u0000\u0195"+ - "3\u0001\u0000\u0000\u0000\u0196\u0197\u0005%\u0000\u0000\u0197\u0198\u0005"+ - "\u008b\u0000\u0000\u0198\u0199\u0003j5\u0000\u0199\u019d\u0005\u008c\u0000"+ - "\u0000\u019a\u019c\u0003\u0002\u0001\u0000\u019b\u019a\u0001\u0000\u0000"+ - "\u0000\u019c\u019f\u0001\u0000\u0000\u0000\u019d\u019b\u0001\u0000\u0000"+ - "\u0000\u019d\u019e\u0001\u0000\u0000\u0000\u019e\u01a0\u0001\u0000\u0000"+ - "\u0000\u019f\u019d\u0001\u0000\u0000\u0000\u01a0\u01a1\u0005&\u0000\u0000"+ - "\u01a15\u0001\u0000\u0000\u0000\u01a2\u01a3\u0005)\u0000\u0000\u01a3\u01a4"+ - "\u0005\u008b\u0000\u0000\u01a4\u01a5\u0003j5\u0000\u01a5\u01aa\u0005\u008c"+ - "\u0000\u0000\u01a6\u01a9\u0003\u0002\u0001\u0000\u01a7\u01a9\u0005!\u0000"+ - "\u0000\u01a8\u01a6\u0001\u0000\u0000\u0000\u01a8\u01a7\u0001\u0000\u0000"+ - "\u0000\u01a9\u01ac\u0001\u0000\u0000\u0000\u01aa\u01a8\u0001\u0000\u0000"+ - "\u0000\u01aa\u01ab\u0001\u0000\u0000\u0000\u01ab\u01ad\u0001\u0000\u0000"+ - "\u0000\u01ac\u01aa\u0001\u0000\u0000\u0000\u01ad\u01ae\u0005*\u0000\u0000"+ - "\u01ae7\u0001\u0000\u0000\u0000\u01af\u01b0\u0005a\u0000\u0000\u01b0\u01b4"+ - "\u0003n7\u0000\u01b1\u01b3\u0003\u0002\u0001\u0000\u01b2\u01b1\u0001\u0000"+ - "\u0000\u0000\u01b3\u01b6\u0001\u0000\u0000\u0000\u01b4\u01b2\u0001\u0000"+ - "\u0000\u0000\u01b4\u01b5\u0001\u0000\u0000\u0000\u01b5\u01b7\u0001\u0000"+ - "\u0000\u0000\u01b6\u01b4\u0001\u0000\u0000\u0000\u01b7\u01b8\u0005b\u0000"+ - "\u0000\u01b89\u0001\u0000\u0000\u0000\u01b9\u01ba\u0005D\u0000\u0000\u01ba"+ - "\u01bb\u0003r9\u0000\u01bb;\u0001\u0000\u0000\u0000\u01bc\u01bd\u0005"+ - "k\u0000\u0000\u01bd\u01ce\u0005\r\u0000\u0000\u01be\u01c0\u0005\u000f"+ - "\u0000\u0000\u01bf\u01c1\u0005\u0086\u0000\u0000\u01c0\u01bf\u0001\u0000"+ - "\u0000\u0000\u01c1\u01c2\u0001\u0000\u0000\u0000\u01c2\u01c0\u0001\u0000"+ - "\u0000\u0000\u01c2\u01c3\u0001\u0000\u0000\u0000\u01c3\u01c4\u0001\u0000"+ - "\u0000\u0000\u01c4\u01c6\u0005\u0090\u0000\u0000\u01c5\u01c7\u0005\u0086"+ - "\u0000\u0000\u01c6\u01c5\u0001\u0000\u0000\u0000\u01c6\u01c7\u0001\u0000"+ - "\u0000\u0000\u01c7\u01cf\u0001\u0000\u0000\u0000\u01c8\u01cf\u0005\u0086"+ - "\u0000\u0000\u01c9\u01cb\u0003n7\u0000\u01ca\u01c9\u0001\u0000\u0000\u0000"+ - "\u01cb\u01cc\u0001\u0000\u0000\u0000\u01cc\u01ca\u0001\u0000\u0000\u0000"+ - "\u01cc\u01cd\u0001\u0000\u0000\u0000\u01cd\u01cf\u0001\u0000\u0000\u0000"+ - "\u01ce\u01be\u0001\u0000\u0000\u0000\u01ce\u01c8\u0001\u0000\u0000\u0000"+ - "\u01ce\u01ca\u0001\u0000\u0000\u0000\u01cf\u01d0\u0001\u0000\u0000\u0000"+ - "\u01d0\u01d1\u0005\u000e\u0000\u0000\u01d1=\u0001\u0000\u0000\u0000\u01d2"+ - "\u01d3\u0005f\u0000\u0000\u01d3\u01d4\u0005\u000b\u0000\u0000\u01d4\u01d5"+ - "\u0003z=\u0000\u01d5\u01d8\u0005\u0013\u0000\u0000\u01d6\u01d9\u0003x"+ - "<\u0000\u01d7\u01d9\u0003z=\u0000\u01d8\u01d6\u0001\u0000\u0000\u0000"+ - "\u01d8\u01d7\u0001\u0000\u0000\u0000\u01d9\u01da\u0001\u0000\u0000\u0000"+ - "\u01da\u01db\u0005\f\u0000\u0000\u01db?\u0001\u0000\u0000\u0000\u01dc"+ - "\u01dd\u0007\u0004\u0000\u0000\u01dd\u01de\u0005\u000b\u0000\u0000\u01de"+ - "\u01df\u0003z=\u0000\u01df\u01e2\u0005\u0013\u0000\u0000\u01e0\u01e3\u0005"+ - "\u0011\u0000\u0000\u01e1\u01e3\u0003z=\u0000\u01e2\u01e0\u0001\u0000\u0000"+ - "\u0000\u01e2\u01e1\u0001\u0000\u0000\u0000\u01e3\u01e6\u0001\u0000\u0000"+ - "\u0000\u01e4\u01e5\u0005\u0013\u0000\u0000\u01e5\u01e7\u0003z=\u0000\u01e6"+ - "\u01e4\u0001\u0000\u0000\u0000\u01e6\u01e7\u0001\u0000\u0000\u0000\u01e7"+ - "\u01e8\u0001\u0000\u0000\u0000\u01e8\u01e9\u0005\f\u0000\u0000\u01e9A"+ - "\u0001\u0000\u0000\u0000\u01ea\u01eb\u00054\u0000\u0000\u01eb\u01ee\u0005"+ - "\u000b\u0000\u0000\u01ec\u01ef\u0005\u0011\u0000\u0000\u01ed\u01ef\u0003"+ - "z=\u0000\u01ee\u01ec\u0001\u0000\u0000\u0000\u01ee\u01ed\u0001\u0000\u0000"+ - "\u0000\u01ef\u01f0\u0001\u0000\u0000\u0000\u01f0\u01f1\u0005\u0013\u0000"+ - "\u0000\u01f1\u01f2\u0003z=\u0000\u01f2\u01f3\u0005\u0013\u0000\u0000\u01f3"+ - "\u01f9\u0003z=\u0000\u01f4\u01f7\u0005\u0013\u0000\u0000\u01f5\u01f8\u0003"+ - "x<\u0000\u01f6\u01f8\u0003z=\u0000\u01f7\u01f5\u0001\u0000\u0000\u0000"+ - "\u01f7\u01f6\u0001\u0000\u0000\u0000\u01f8\u01fa\u0001\u0000\u0000\u0000"+ - "\u01f9\u01f4\u0001\u0000\u0000\u0000\u01f9\u01fa\u0001\u0000\u0000\u0000"+ - "\u01fa\u01fb\u0001\u0000\u0000\u0000\u01fb\u01fc\u0005\f\u0000\u0000\u01fc"+ - "C\u0001\u0000\u0000\u0000\u01fd\u01ff\u0005B\u0000\u0000\u01fe\u0200\u0003"+ - "\u0002\u0001\u0000\u01ff\u01fe\u0001\u0000\u0000\u0000\u0200\u0201\u0001"+ - "\u0000\u0000\u0000\u0201\u01ff\u0001\u0000\u0000\u0000\u0201\u0202\u0001"+ - "\u0000\u0000\u0000\u0202\u0203\u0001\u0000\u0000\u0000\u0203\u0204\u0005"+ - "C\u0000\u0000\u0204E\u0001\u0000\u0000\u0000\u0205\u0206\u0007\u0005\u0000"+ - "\u0000\u0206\u0207\u0003r9\u0000\u0207\u0208\u0003*\u0015\u0000\u0208"+ - "\u0209\u0005\u001c\u0000\u0000\u0209G\u0001\u0000\u0000\u0000\u020a\u020e"+ - "\u0005m\u0000\u0000\u020b\u020c\u0005\u000b\u0000\u0000\u020c\u020f\u0005"+ - "\f\u0000\u0000\u020d\u020f\u0003v;\u0000\u020e\u020b\u0001\u0000\u0000"+ - "\u0000\u020e\u020d\u0001\u0000\u0000\u0000\u020fI\u0001\u0000\u0000\u0000"+ - "\u0210\u0211\u0007\u0006\u0000\u0000\u0211K\u0001\u0000\u0000\u0000\u0212"+ - "\u0216\u0005g\u0000\u0000\u0213\u0215\u0003n7\u0000\u0214\u0213\u0001"+ - "\u0000\u0000\u0000\u0215\u0218\u0001\u0000\u0000\u0000\u0216\u0214\u0001"+ - "\u0000\u0000\u0000\u0216\u0217\u0001\u0000\u0000\u0000\u0217\u0219\u0001"+ - "\u0000\u0000\u0000\u0218\u0216\u0001\u0000\u0000\u0000\u0219\u021d\u0005"+ - "\u0098\u0000\u0000\u021a\u021b\u0005g\u0000\u0000\u021b\u021d\u0003l6"+ - "\u0000\u021c\u0212\u0001\u0000\u0000\u0000\u021c\u021a\u0001\u0000\u0000"+ - "\u0000\u021dM\u0001\u0000\u0000\u0000\u021e\u0220\u0005r\u0000\u0000\u021f"+ - "\u0221\u0003n7\u0000\u0220\u021f\u0001\u0000\u0000\u0000\u0221\u0222\u0001"+ - "\u0000\u0000\u0000\u0222\u0220\u0001\u0000\u0000\u0000\u0222\u0223\u0001"+ - "\u0000\u0000\u0000\u0223\u0224\u0001\u0000\u0000\u0000\u0224\u0225\u0007"+ - "\u0007\u0000\u0000\u0225O\u0001\u0000\u0000\u0000\u0226\u022a\u0005p\u0000"+ - "\u0000\u0227\u0229\u0003T*\u0000\u0228\u0227\u0001\u0000\u0000\u0000\u0229"+ - "\u022c\u0001\u0000\u0000\u0000\u022a\u0228\u0001\u0000\u0000\u0000\u022a"+ - "\u022b\u0001\u0000\u0000\u0000\u022b\u022d\u0001\u0000\u0000\u0000\u022c"+ - "\u022a\u0001\u0000\u0000\u0000\u022d\u022e\u0005\u007f\u0000\u0000\u022e"+ - "Q\u0001\u0000\u0000\u0000\u022f\u0233\u0005q\u0000\u0000\u0230\u0232\u0003"+ - "T*\u0000\u0231\u0230\u0001\u0000\u0000\u0000\u0232\u0235\u0001\u0000\u0000"+ - "\u0000\u0233\u0231\u0001\u0000\u0000\u0000\u0233\u0234\u0001\u0000\u0000"+ - "\u0000\u0234\u0236\u0001\u0000\u0000\u0000\u0235\u0233\u0001\u0000\u0000"+ - "\u0000\u0236\u0237\u0005\u0081\u0000\u0000\u0237S\u0001\u0000\u0000\u0000"+ - "\u0238\u0239\u0003n7\u0000\u0239U\u0001\u0000\u0000\u0000\u023a\u0241"+ - "\u0003b1\u0000\u023b\u0241\u0003X,\u0000\u023c\u0241\u0003Z-\u0000\u023d"+ - "\u0241\u0003\\.\u0000\u023e\u0241\u0003^/\u0000\u023f\u0241\u0003`0\u0000"+ - "\u0240\u023a\u0001\u0000\u0000\u0000\u0240\u023b\u0001\u0000\u0000\u0000"+ - "\u0240\u023c\u0001\u0000\u0000\u0000\u0240\u023d\u0001\u0000\u0000\u0000"+ - "\u0240\u023e\u0001\u0000\u0000\u0000\u0240\u023f\u0001\u0000\u0000\u0000"+ - "\u0241W\u0001\u0000\u0000\u0000\u0242\u0243\u0005\u0002\u0000\u0000\u0243"+ - "\u0244\u0005\u0007\u0000\u0000\u0244\u0245\u0005\u0005\u0000\u0000\u0245"+ - "Y\u0001\u0000\u0000\u0000\u0246\u0247\u0005\u0002\u0000\u0000\u0247\u0248"+ - "\u0005\t\u0000\u0000\u0248\u0249\u0005\u0005\u0000\u0000\u0249[\u0001"+ - "\u0000\u0000\u0000\u024a\u024b\u0005\u0005\u0000\u0000\u024b\u024c\u0005"+ - "\u0007\u0000\u0000\u024c\u024d\u0005\u0005\u0000\u0000\u024d\u0251\u0005"+ - "\r\u0000\u0000\u024e\u0250\u0003n7\u0000\u024f\u024e\u0001\u0000\u0000"+ - "\u0000\u0250\u0253\u0001\u0000\u0000\u0000\u0251\u024f\u0001\u0000\u0000"+ - "\u0000\u0251\u0252\u0001\u0000\u0000\u0000\u0252\u0254\u0001\u0000\u0000"+ - "\u0000\u0253\u0251\u0001\u0000\u0000\u0000\u0254\u0259\u0005\u000e\u0000"+ - "\u0000\u0255\u0256\u0005\u0005\u0000\u0000\u0256\u0257\u0005\u0007\u0000"+ - "\u0000\u0257\u0259\u0005\u0005\u0000\u0000\u0258\u024a\u0001\u0000\u0000"+ - "\u0000\u0258\u0255\u0001\u0000\u0000\u0000\u0259]\u0001\u0000\u0000\u0000"+ - "\u025a\u025c\u0005\u0006\u0000\u0000\u025b\u025a\u0001\u0000\u0000\u0000"+ - "\u025b\u025c\u0001\u0000\u0000\u0000\u025c\u025d\u0001\u0000\u0000\u0000"+ - "\u025d\u025e\u0005\u0005\u0000\u0000\u025e\u025f\u0005\u0007\u0000\u0000"+ - "\u025f\u0260\u0005\u0005\u0000\u0000\u0260\u0264\u0005\r\u0000\u0000\u0261"+ - "\u0263\u0003n7\u0000\u0262\u0261\u0001\u0000\u0000\u0000\u0263\u0266\u0001"+ - "\u0000\u0000\u0000\u0264\u0262\u0001\u0000\u0000\u0000\u0264\u0265\u0001"+ - "\u0000\u0000\u0000\u0265\u0267\u0001\u0000\u0000\u0000\u0266\u0264\u0001"+ - "\u0000\u0000\u0000\u0267\u026f\u0005\u000e\u0000\u0000\u0268\u026a\u0005"+ - "\u0006\u0000\u0000\u0269\u0268\u0001\u0000\u0000\u0000\u0269\u026a\u0001"+ - "\u0000\u0000\u0000\u026a\u026b\u0001\u0000\u0000\u0000\u026b\u026c\u0005"+ - "\u0005\u0000\u0000\u026c\u026d\u0005\u0007\u0000\u0000\u026d\u026f\u0005"+ - "\u0005\u0000\u0000\u026e\u025b\u0001\u0000\u0000\u0000\u026e\u0269\u0001"+ - "\u0000\u0000\u0000\u026f_\u0001\u0000\u0000\u0000\u0270\u0272\u0005\u0004"+ - "\u0000\u0000\u0271\u0273\u0005\u0006\u0000\u0000\u0272\u0271\u0001\u0000"+ - "\u0000\u0000\u0272\u0273\u0001\u0000\u0000\u0000\u0273\u0274\u0001\u0000"+ - "\u0000\u0000\u0274\u0275\u0005\u0005\u0000\u0000\u0275\u0276\u0001\u0000"+ - "\u0000\u0000\u0276\u027a\u0005\r\u0000\u0000\u0277\u0279\u0003n7\u0000"+ - "\u0278\u0277\u0001\u0000\u0000\u0000\u0279\u027c\u0001\u0000\u0000\u0000"+ - "\u027a\u0278\u0001\u0000\u0000\u0000\u027a\u027b\u0001\u0000\u0000\u0000"+ - "\u027b\u027d\u0001\u0000\u0000\u0000\u027c\u027a\u0001\u0000\u0000\u0000"+ - "\u027d\u027e\u0005\u000e\u0000\u0000\u027ea\u0001\u0000\u0000\u0000\u027f"+ - "\u0281\u0005\u0006\u0000\u0000\u0280\u027f\u0001\u0000\u0000\u0000\u0280"+ - "\u0281\u0001\u0000\u0000\u0000\u0281\u0282\u0001\u0000\u0000\u0000\u0282"+ - "\u0283\u0005\u0005\u0000\u0000\u0283\u0284\u0005\u0007\u0000\u0000\u0284"+ - "\u0285\u0005\b\u0000\u0000\u0285c\u0001\u0000\u0000\u0000\u0286\u0288"+ - "\u0005\u0006\u0000\u0000\u0287\u0286\u0001\u0000\u0000\u0000\u0287\u0288"+ - "\u0001\u0000\u0000\u0000\u0288\u0289\u0001\u0000\u0000\u0000\u0289\u028a"+ - "\u0005\u0005\u0000\u0000\u028ae\u0001\u0000\u0000\u0000\u028b\u028c\u0005"+ - "\u0005\u0000\u0000\u028c\u0290\u0005\r\u0000\u0000\u028d\u028f\u0003n"+ - "7\u0000\u028e\u028d\u0001\u0000\u0000\u0000\u028f\u0292\u0001\u0000\u0000"+ - "\u0000\u0290\u028e\u0001\u0000\u0000\u0000\u0290\u0291\u0001\u0000\u0000"+ - "\u0000\u0291\u0293\u0001\u0000\u0000\u0000\u0292\u0290\u0001\u0000\u0000"+ - "\u0000\u0293\u0294\u0005\u000e\u0000\u0000\u0294g\u0001\u0000\u0000\u0000"+ - "\u0295\u0296\u0005\u0001\u0000\u0000\u0296i\u0001\u0000\u0000\u0000\u0297"+ - "\u029e\u0003p8\u0000\u0298\u029a\u0007\b\u0000\u0000\u0299\u0298\u0001"+ - "\u0000\u0000\u0000\u029a\u029b\u0001\u0000\u0000\u0000\u029b\u0299\u0001"+ - "\u0000\u0000\u0000\u029b\u029c\u0001\u0000\u0000\u0000\u029c\u029e\u0001"+ - "\u0000\u0000\u0000\u029d\u0297\u0001\u0000\u0000\u0000\u029d\u0299\u0001"+ - "\u0000\u0000\u0000\u029ek\u0001\u0000\u0000\u0000\u029f\u02a1\u0005\r"+ - "\u0000\u0000\u02a0\u02a2\u0003n7\u0000\u02a1\u02a0\u0001\u0000\u0000\u0000"+ - "\u02a2\u02a3\u0001\u0000\u0000\u0000\u02a3\u02a1\u0001\u0000\u0000\u0000"+ - "\u02a3\u02a4\u0001\u0000\u0000\u0000\u02a4\u02a5\u0001\u0000\u0000\u0000"+ - "\u02a5\u02a6\u0005\u000e\u0000\u0000\u02a6m\u0001\u0000\u0000\u0000\u02a7"+ - "\u02c9\u0003V+\u0000\u02a8\u02c9\u0003f3\u0000\u02a9\u02c9\u0005\u0005"+ - "\u0000\u0000\u02aa\u02c9\u0003d2\u0000\u02ab\u02c9\u0005\u0002\u0000\u0000"+ - "\u02ac\u02c9\u0005\u0006\u0000\u0000\u02ad\u02c9\u0005\u0086\u0000\u0000"+ - "\u02ae\u02c9\u0005\u0003\u0000\u0000\u02af\u02b1\u0005\u0001\u0000\u0000"+ - "\u02b0\u02af\u0001\u0000\u0000\u0000\u02b1\u02b2\u0001\u0000\u0000\u0000"+ - "\u02b2\u02b0\u0001\u0000\u0000\u0000\u02b2\u02b3\u0001\u0000\u0000\u0000"+ - "\u02b3\u02c9\u0001\u0000\u0000\u0000\u02b4\u02c9\u0005\u0007\u0000\u0000"+ - "\u02b5\u02c9\u0005\b\u0000\u0000\u02b6\u02c9\u0005\t\u0000\u0000\u02b7"+ - "\u02bb\u0005\u000f\u0000\u0000\u02b8\u02ba\u0003n7\u0000\u02b9\u02b8\u0001"+ - "\u0000\u0000\u0000\u02ba\u02bd\u0001\u0000\u0000\u0000\u02bb\u02b9\u0001"+ - "\u0000\u0000\u0000\u02bb\u02bc\u0001\u0000\u0000\u0000\u02bc\u02be\u0001"+ - "\u0000\u0000\u0000\u02bd\u02bb\u0001\u0000\u0000\u0000\u02be\u02c9\u0005"+ - "\u0090\u0000\u0000\u02bf\u02c3\u0005\r\u0000\u0000\u02c0\u02c2\u0003n"+ - "7\u0000\u02c1\u02c0\u0001\u0000\u0000\u0000\u02c2\u02c5\u0001\u0000\u0000"+ - "\u0000\u02c3\u02c1\u0001\u0000\u0000\u0000\u02c3\u02c4\u0001\u0000\u0000"+ - "\u0000\u02c4\u02c6\u0001\u0000\u0000\u0000\u02c5\u02c3\u0001\u0000\u0000"+ - "\u0000\u02c6\u02c9\u0005\u000e\u0000\u0000\u02c7\u02c9\u0005\u0015\u0000"+ - "\u0000\u02c8\u02a7\u0001\u0000\u0000\u0000\u02c8\u02a8\u0001\u0000\u0000"+ - "\u0000\u02c8\u02a9\u0001\u0000\u0000\u0000\u02c8\u02aa\u0001\u0000\u0000"+ - "\u0000\u02c8\u02ab\u0001\u0000\u0000\u0000\u02c8\u02ac\u0001\u0000\u0000"+ - "\u0000\u02c8\u02ad\u0001\u0000\u0000\u0000\u02c8\u02ae\u0001\u0000\u0000"+ - "\u0000\u02c8\u02b0\u0001\u0000\u0000\u0000\u02c8\u02b4\u0001\u0000\u0000"+ - "\u0000\u02c8\u02b5\u0001\u0000\u0000\u0000\u02c8\u02b6\u0001\u0000\u0000"+ - "\u0000\u02c8\u02b7\u0001\u0000\u0000\u0000\u02c8\u02bf\u0001\u0000\u0000"+ - "\u0000\u02c8\u02c7\u0001\u0000\u0000\u0000\u02c9o\u0001\u0000\u0000\u0000"+ - "\u02ca\u02cb\u0005\u0002\u0000\u0000\u02cb\u02cc\u0005\u008d\u0000\u0000"+ - "\u02cc\u02cf\u0005\u0002\u0000\u0000\u02cd\u02ce\u0005\u008e\u0000\u0000"+ - "\u02ce\u02d0\u0005\u0002\u0000\u0000\u02cf\u02cd\u0001\u0000\u0000\u0000"+ - "\u02cf\u02d0\u0001\u0000\u0000\u0000\u02d0q\u0001\u0000\u0000\u0000\u02d1"+ - "\u02d4\u0005\u000b\u0000\u0000\u02d2\u02d5\u0005\u0011\u0000\u0000\u02d3"+ - "\u02d5\u0003z=\u0000\u02d4\u02d2\u0001\u0000\u0000\u0000\u02d4\u02d3\u0001"+ - "\u0000\u0000\u0000\u02d5\u02d6\u0001\u0000\u0000\u0000\u02d6\u02d7\u0005"+ - "\f\u0000\u0000\u02d7s\u0001\u0000\u0000\u0000\u02d8\u02db\u0005\u000b"+ - "\u0000\u0000\u02d9\u02dc\u0005\u0011\u0000\u0000\u02da\u02dc\u0003z=\u0000"+ - "\u02db\u02d9\u0001\u0000\u0000\u0000\u02db\u02da\u0001\u0000\u0000\u0000"+ - "\u02dc\u02dd\u0001\u0000\u0000\u0000\u02dd\u02de\u0005\u0013\u0000\u0000"+ - "\u02de\u02df\u0003z=\u0000\u02df\u02e0\u0005\f\u0000\u0000\u02e0u\u0001"+ - "\u0000\u0000\u0000\u02e1\u02e2\u0005\u000b\u0000\u0000\u02e2\u02e7\u0003"+ - "z=\u0000\u02e3\u02e4\u0005\u0013\u0000\u0000\u02e4\u02e6\u0003z=\u0000"+ - "\u02e5\u02e3\u0001\u0000\u0000\u0000\u02e6\u02e9\u0001\u0000\u0000\u0000"+ - "\u02e7\u02e5\u0001\u0000\u0000\u0000\u02e7\u02e8\u0001\u0000\u0000\u0000"+ - "\u02e8\u02ea\u0001\u0000\u0000\u0000\u02e9\u02e7\u0001\u0000\u0000\u0000"+ - "\u02ea\u02eb\u0005\f\u0000\u0000\u02ebw\u0001\u0000\u0000\u0000\u02ec"+ - "\u02ed\u0005\u0011\u0000\u0000\u02edy\u0001\u0000\u0000\u0000\u02ee\u02f0"+ - "\u0003|>\u0000\u02ef\u02ee\u0001\u0000\u0000\u0000\u02f0\u02f1\u0001\u0000"+ - "\u0000\u0000\u02f1\u02ef\u0001\u0000\u0000\u0000\u02f1\u02f2\u0001\u0000"+ - "\u0000\u0000\u02f2{\u0001\u0000\u0000\u0000\u02f3\u02fe\u0003~?\u0000"+ - "\u02f4\u02fe\u0003\u0080@\u0000\u02f5\u02fe\u0005\n\u0000\u0000\u02f6"+ - "\u02fe\u0005\u0002\u0000\u0000\u02f7\u02fe\u0005\u0003\u0000\u0000\u02f8"+ - "\u02fe\u0005\u0092\u0000\u0000\u02f9\u02fe\u0005\u0011\u0000\u0000\u02fa"+ - "\u02fe\u0005\u0012\u0000\u0000\u02fb\u02fe\u0005\u0095\u0000\u0000\u02fc"+ - "\u02fe\u0005\u0014\u0000\u0000\u02fd\u02f3\u0001\u0000\u0000\u0000\u02fd"+ - "\u02f4\u0001\u0000\u0000\u0000\u02fd\u02f5\u0001\u0000\u0000\u0000\u02fd"+ - "\u02f6\u0001\u0000\u0000\u0000\u02fd\u02f7\u0001\u0000\u0000\u0000\u02fd"+ - "\u02f8\u0001\u0000\u0000\u0000\u02fd\u02f9\u0001\u0000\u0000\u0000\u02fd"+ - "\u02fa\u0001\u0000\u0000\u0000\u02fd\u02fb\u0001\u0000\u0000\u0000\u02fd"+ - "\u02fc\u0001\u0000\u0000\u0000\u02fe}\u0001\u0000\u0000\u0000\u02ff\u0300"+ - "\u0005\u000f\u0000\u0000\u0300\u0305\u0003\u0082A\u0000\u0301\u0302\u0005"+ - "\u0014\u0000\u0000\u0302\u0304\u0003\u0082A\u0000\u0303\u0301\u0001\u0000"+ - "\u0000\u0000\u0304\u0307\u0001\u0000\u0000\u0000\u0305\u0303\u0001\u0000"+ - "\u0000\u0000\u0305\u0306\u0001\u0000\u0000\u0000\u0306\u0309\u0001\u0000"+ - "\u0000\u0000\u0307\u0305\u0001\u0000\u0000\u0000\u0308\u030a\u0005\u0014"+ - "\u0000\u0000\u0309\u0308\u0001\u0000\u0000\u0000\u0309\u030a\u0001\u0000"+ - "\u0000\u0000\u030a\u030b\u0001\u0000\u0000\u0000\u030b\u030c\u0005\u0090"+ - "\u0000\u0000\u030c\u007f\u0001\u0000\u0000\u0000\u030d\u030f\u0005\u000f"+ - "\u0000\u0000\u030e\u0310\u0003|>\u0000\u030f\u030e\u0001\u0000\u0000\u0000"+ - "\u0310\u0311\u0001\u0000\u0000\u0000\u0311\u030f\u0001\u0000\u0000\u0000"+ - "\u0311\u0312\u0001\u0000\u0000\u0000\u0312\u0313\u0001\u0000\u0000\u0000"+ - "\u0313\u0314\u0005\u0090\u0000\u0000\u0314\u0318\u0001\u0000\u0000\u0000"+ - "\u0315\u0316\u0005\u000f\u0000\u0000\u0316\u0318\u0005\u0090\u0000\u0000"+ - "\u0317\u030d\u0001\u0000\u0000\u0000\u0317\u0315\u0001\u0000\u0000\u0000"+ - "\u0318\u0081\u0001\u0000\u0000\u0000\u0319\u031a\u0005\u0011\u0000\u0000"+ - "\u031a\u031b\u0005\u0012\u0000\u0000\u031b\u031c\u0007\t\u0000\u0000\u031c"+ - "\u0083\u0001\u0000\u0000\u0000\u031d\u031e\u0005h\u0000\u0000\u031e\u031f"+ - "\u0005i\u0000\u0000\u031f\u0085\u0001\u0000\u0000\u0000\u0320\u0322\u0007"+ - "\n\u0000\u0000\u0321\u0323\u0003h4\u0000\u0322\u0321\u0001\u0000\u0000"+ - "\u0000\u0322\u0323\u0001\u0000\u0000\u0000\u0323\u0087\u0001\u0000\u0000"+ - "\u0000\u0324\u0326\u0005\u0017\u0000\u0000\u0325\u0324\u0001\u0000\u0000"+ - "\u0000\u0326\u0327\u0001\u0000\u0000\u0000\u0327\u0325\u0001\u0000\u0000"+ - "\u0000\u0327\u0328\u0001\u0000\u0000\u0000\u0328\u032e\u0001\u0000\u0000"+ - "\u0000\u0329\u032e\u0005s\u0000\u0000\u032a\u032e\u0005u\u0000\u0000\u032b"+ - "\u032e\u0005{\u0000\u0000\u032c\u032e\u0005z\u0000\u0000\u032d\u0325\u0001"+ - "\u0000\u0000\u0000\u032d\u0329\u0001\u0000\u0000\u0000\u032d\u032a\u0001"+ - "\u0000\u0000\u0000\u032d\u032b\u0001\u0000\u0000\u0000\u032d\u032c\u0001"+ - "\u0000\u0000\u0000\u032e\u0089\u0001\u0000\u0000\u0000S\u008d\u0095\u009c"+ - "\u00ae\u00c6\u00cc\u00d0\u00d3\u00de\u00e0\u00ea\u00f4\u00fe\u0108\u0112"+ - "\u011c\u0124\u0129\u012d\u0135\u0149\u014f\u015e\u0168\u016c\u0173\u017c"+ - "\u017e\u0187\u0191\u019d\u01a8\u01aa\u01b4\u01c2\u01c6\u01cc\u01ce\u01d8"+ - "\u01e2\u01e6\u01ee\u01f7\u01f9\u0201\u020e\u0216\u021c\u0222\u022a\u0233"+ - "\u0240\u0251\u0258\u025b\u0264\u0269\u026e\u0272\u027a\u0280\u0287\u0290"+ - "\u029b\u029d\u02a3\u02b2\u02bb\u02c3\u02c8\u02cf\u02d4\u02db\u02e7\u02f1"+ - "\u02fd\u0305\u0309\u0311\u0317\u0322\u0327\u032d"; - public static final ATN _ATN = - new ATNDeserializer().deserialize(_serializedATN.toCharArray()); - static { - _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; - for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { - _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); - } - } -} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserBaseListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserBaseListener.java deleted file mode 100644 index 72ff3e8ffd63..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserBaseListener.java +++ /dev/null @@ -1,897 +0,0 @@ -// Generated from BladeAntlrParser.g4 by ANTLR 4.13.0 - - /* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.syntax.antlr4.v10; - -/** - * Parser generated for netbeans blade editor - * Some elements have been simplified to optimize parser speed - * For example - * - switch statement have a loos validation - * - generic block statement "@isset" | "@unless" are grouped togehter - * - the start match and end match will be checked in the parser - */ - - -import org.antlr.v4.runtime.ParserRuleContext; -import org.antlr.v4.runtime.tree.ErrorNode; -import org.antlr.v4.runtime.tree.TerminalNode; - -/** - * This class provides an empty implementation of {@link BladeAntlrParserListener}, - * which can be extended to create a listener which only needs to handle a subset - * of the available methods. - */ -@SuppressWarnings("CheckReturnValue") -public class BladeAntlrParserBaseListener implements BladeAntlrParserListener { - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterFile(BladeAntlrParser.FileContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitFile(BladeAntlrParser.FileContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterGeneral_statement(BladeAntlrParser.General_statementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitGeneral_statement(BladeAntlrParser.General_statementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterInline_statement(BladeAntlrParser.Inline_statementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitInline_statement(BladeAntlrParser.Inline_statementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterInline_directive(BladeAntlrParser.Inline_directiveContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitInline_directive(BladeAntlrParser.Inline_directiveContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterBlock_statement(BladeAntlrParser.Block_statementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitBlock_statement(BladeAntlrParser.Block_statementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterIdentifiableType(BladeAntlrParser.IdentifiableTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitIdentifiableType(BladeAntlrParser.IdentifiableTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterSection_inline(BladeAntlrParser.Section_inlineContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitSection_inline(BladeAntlrParser.Section_inlineContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterSection(BladeAntlrParser.SectionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitSection(BladeAntlrParser.SectionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterPush(BladeAntlrParser.PushContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitPush(BladeAntlrParser.PushContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterPushOnce(BladeAntlrParser.PushOnceContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitPushOnce(BladeAntlrParser.PushOnceContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterPushIf(BladeAntlrParser.PushIfContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitPushIf(BladeAntlrParser.PushIfContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterPrepend(BladeAntlrParser.PrependContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitPrepend(BladeAntlrParser.PrependContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterFragmentD(BladeAntlrParser.FragmentDContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitFragmentD(BladeAntlrParser.FragmentDContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterIf(BladeAntlrParser.IfContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitIf(BladeAntlrParser.IfContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterElse(BladeAntlrParser.ElseContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitElse(BladeAntlrParser.ElseContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterEndif(BladeAntlrParser.EndifContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitEndif(BladeAntlrParser.EndifContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterEmpty_block(BladeAntlrParser.Empty_blockContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitEmpty_block(BladeAntlrParser.Empty_blockContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterConditional_block(BladeAntlrParser.Conditional_blockContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitConditional_block(BladeAntlrParser.Conditional_blockContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterAuth_block(BladeAntlrParser.Auth_blockContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitAuth_block(BladeAntlrParser.Auth_blockContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterEnv_block(BladeAntlrParser.Env_blockContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitEnv_block(BladeAntlrParser.Env_blockContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterPermission(BladeAntlrParser.PermissionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitPermission(BladeAntlrParser.PermissionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterSimple_conditional_stm(BladeAntlrParser.Simple_conditional_stmContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitSimple_conditional_stm(BladeAntlrParser.Simple_conditional_stmContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterError_block(BladeAntlrParser.Error_blockContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitError_block(BladeAntlrParser.Error_blockContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterSwitch(BladeAntlrParser.SwitchContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitSwitch(BladeAntlrParser.SwitchContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterWhile(BladeAntlrParser.WhileContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitWhile(BladeAntlrParser.WhileContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterFor(BladeAntlrParser.ForContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitFor(BladeAntlrParser.ForContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterForeach(BladeAntlrParser.ForeachContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitForeach(BladeAntlrParser.ForeachContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterForelse(BladeAntlrParser.ForelseContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitForelse(BladeAntlrParser.ForelseContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterSession(BladeAntlrParser.SessionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitSession(BladeAntlrParser.SessionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterStack(BladeAntlrParser.StackContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitStack(BladeAntlrParser.StackContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterAsset_bundler(BladeAntlrParser.Asset_bundlerContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitAsset_bundler(BladeAntlrParser.Asset_bundlerContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterInject(BladeAntlrParser.InjectContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitInject(BladeAntlrParser.InjectContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterIncludeCond(BladeAntlrParser.IncludeCondContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitIncludeCond(BladeAntlrParser.IncludeCondContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterEach(BladeAntlrParser.EachContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitEach(BladeAntlrParser.EachContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterOnce_block(BladeAntlrParser.Once_blockContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitOnce_block(BladeAntlrParser.Once_blockContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterCondSection(BladeAntlrParser.CondSectionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitCondSection(BladeAntlrParser.CondSectionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterCustom_directive(BladeAntlrParser.Custom_directiveContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitCustom_directive(BladeAntlrParser.Custom_directiveContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterPossibleDirective(BladeAntlrParser.PossibleDirectiveContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitPossibleDirective(BladeAntlrParser.PossibleDirectiveContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterPhp_blade(BladeAntlrParser.Php_bladeContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitPhp_blade(BladeAntlrParser.Php_bladeContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterPhpInline(BladeAntlrParser.PhpInlineContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitPhpInline(BladeAntlrParser.PhpInlineContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterRegular_echo(BladeAntlrParser.Regular_echoContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitRegular_echo(BladeAntlrParser.Regular_echoContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterRaw_echo(BladeAntlrParser.Raw_echoContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitRaw_echo(BladeAntlrParser.Raw_echoContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterEcho_expr(BladeAntlrParser.Echo_exprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitEcho_expr(BladeAntlrParser.Echo_exprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterClass_expr_usage(BladeAntlrParser.Class_expr_usageContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitClass_expr_usage(BladeAntlrParser.Class_expr_usageContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterObject_alias_static_access(BladeAntlrParser.Object_alias_static_accessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitObject_alias_static_access(BladeAntlrParser.Object_alias_static_accessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterObject_alias_direct_access(BladeAntlrParser.Object_alias_direct_accessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitObject_alias_direct_access(BladeAntlrParser.Object_alias_direct_accessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterStatic_direct_class_access(BladeAntlrParser.Static_direct_class_accessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitStatic_direct_class_access(BladeAntlrParser.Static_direct_class_accessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterStatic_direct_namespace_class_access(BladeAntlrParser.Static_direct_namespace_class_accessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitStatic_direct_namespace_class_access(BladeAntlrParser.Static_direct_namespace_class_accessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterClass_instance(BladeAntlrParser.Class_instanceContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitClass_instance(BladeAntlrParser.Class_instanceContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterClass_name_reference(BladeAntlrParser.Class_name_referenceContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitClass_name_reference(BladeAntlrParser.Class_name_referenceContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterNamespacePath(BladeAntlrParser.NamespacePathContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitNamespacePath(BladeAntlrParser.NamespacePathContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterFunction_call(BladeAntlrParser.Function_callContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitFunction_call(BladeAntlrParser.Function_callContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterPhp_expression(BladeAntlrParser.Php_expressionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitPhp_expression(BladeAntlrParser.Php_expressionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterLoop_expression(BladeAntlrParser.Loop_expressionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitLoop_expression(BladeAntlrParser.Loop_expressionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterMain_php_expression(BladeAntlrParser.Main_php_expressionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitMain_php_expression(BladeAntlrParser.Main_php_expressionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterComposed_php_expression(BladeAntlrParser.Composed_php_expressionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitComposed_php_expression(BladeAntlrParser.Composed_php_expressionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterSimple_foreach_expr(BladeAntlrParser.Simple_foreach_exprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitSimple_foreach_expr(BladeAntlrParser.Simple_foreach_exprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterSingleArgWrapperP(BladeAntlrParser.SingleArgWrapperPContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitSingleArgWrapperP(BladeAntlrParser.SingleArgWrapperPContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterDoubleArgWrapperP(BladeAntlrParser.DoubleArgWrapperPContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitDoubleArgWrapperP(BladeAntlrParser.DoubleArgWrapperPContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterMultiArgWrapper(BladeAntlrParser.MultiArgWrapperContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitMultiArgWrapper(BladeAntlrParser.MultiArgWrapperContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterIdentifiableArgument(BladeAntlrParser.IdentifiableArgumentContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitIdentifiableArgument(BladeAntlrParser.IdentifiableArgumentContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterComposedArgument(BladeAntlrParser.ComposedArgumentContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitComposedArgument(BladeAntlrParser.ComposedArgumentContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterPhpExpr(BladeAntlrParser.PhpExprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitPhpExpr(BladeAntlrParser.PhpExprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterIdentifiableArray(BladeAntlrParser.IdentifiableArrayContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitIdentifiableArray(BladeAntlrParser.IdentifiableArrayContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterArrayDefine(BladeAntlrParser.ArrayDefineContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitArrayDefine(BladeAntlrParser.ArrayDefineContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterParamAssign(BladeAntlrParser.ParamAssignContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitParamAssign(BladeAntlrParser.ParamAssignContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterVerbatim_block(BladeAntlrParser.Verbatim_blockContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitVerbatim_block(BladeAntlrParser.Verbatim_blockContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterLoop_action(BladeAntlrParser.Loop_actionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitLoop_action(BladeAntlrParser.Loop_actionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterHtml(BladeAntlrParser.HtmlContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitHtml(BladeAntlrParser.HtmlContext ctx) { } - - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterEveryRule(ParserRuleContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitEveryRule(ParserRuleContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void visitTerminal(TerminalNode node) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void visitErrorNode(ErrorNode node) { } -} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserListener.java deleted file mode 100644 index 06e4ab155ee2..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParserListener.java +++ /dev/null @@ -1,729 +0,0 @@ -// Generated from BladeAntlrParser.g4 by ANTLR 4.13.0 - - /* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.syntax.antlr4.v10; - -/** - * Parser generated for netbeans blade editor - * Some elements have been simplified to optimize parser speed - * For example - * - switch statement have a loos validation - * - generic block statement "@isset" | "@unless" are grouped togehter - * - the start match and end match will be checked in the parser - */ - -import org.antlr.v4.runtime.tree.ParseTreeListener; - -/** - * This interface defines a complete listener for a parse tree produced by - * {@link BladeAntlrParser}. - */ -public interface BladeAntlrParserListener extends ParseTreeListener { - /** - * Enter a parse tree produced by {@link BladeAntlrParser#file}. - * @param ctx the parse tree - */ - void enterFile(BladeAntlrParser.FileContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#file}. - * @param ctx the parse tree - */ - void exitFile(BladeAntlrParser.FileContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#general_statement}. - * @param ctx the parse tree - */ - void enterGeneral_statement(BladeAntlrParser.General_statementContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#general_statement}. - * @param ctx the parse tree - */ - void exitGeneral_statement(BladeAntlrParser.General_statementContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#inline_statement}. - * @param ctx the parse tree - */ - void enterInline_statement(BladeAntlrParser.Inline_statementContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#inline_statement}. - * @param ctx the parse tree - */ - void exitInline_statement(BladeAntlrParser.Inline_statementContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#inline_directive}. - * @param ctx the parse tree - */ - void enterInline_directive(BladeAntlrParser.Inline_directiveContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#inline_directive}. - * @param ctx the parse tree - */ - void exitInline_directive(BladeAntlrParser.Inline_directiveContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#block_statement}. - * @param ctx the parse tree - */ - void enterBlock_statement(BladeAntlrParser.Block_statementContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#block_statement}. - * @param ctx the parse tree - */ - void exitBlock_statement(BladeAntlrParser.Block_statementContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#identifiableType}. - * @param ctx the parse tree - */ - void enterIdentifiableType(BladeAntlrParser.IdentifiableTypeContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#identifiableType}. - * @param ctx the parse tree - */ - void exitIdentifiableType(BladeAntlrParser.IdentifiableTypeContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#section_inline}. - * @param ctx the parse tree - */ - void enterSection_inline(BladeAntlrParser.Section_inlineContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#section_inline}. - * @param ctx the parse tree - */ - void exitSection_inline(BladeAntlrParser.Section_inlineContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#section}. - * @param ctx the parse tree - */ - void enterSection(BladeAntlrParser.SectionContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#section}. - * @param ctx the parse tree - */ - void exitSection(BladeAntlrParser.SectionContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#push}. - * @param ctx the parse tree - */ - void enterPush(BladeAntlrParser.PushContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#push}. - * @param ctx the parse tree - */ - void exitPush(BladeAntlrParser.PushContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#pushOnce}. - * @param ctx the parse tree - */ - void enterPushOnce(BladeAntlrParser.PushOnceContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#pushOnce}. - * @param ctx the parse tree - */ - void exitPushOnce(BladeAntlrParser.PushOnceContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#pushIf}. - * @param ctx the parse tree - */ - void enterPushIf(BladeAntlrParser.PushIfContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#pushIf}. - * @param ctx the parse tree - */ - void exitPushIf(BladeAntlrParser.PushIfContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#prepend}. - * @param ctx the parse tree - */ - void enterPrepend(BladeAntlrParser.PrependContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#prepend}. - * @param ctx the parse tree - */ - void exitPrepend(BladeAntlrParser.PrependContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#fragmentD}. - * @param ctx the parse tree - */ - void enterFragmentD(BladeAntlrParser.FragmentDContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#fragmentD}. - * @param ctx the parse tree - */ - void exitFragmentD(BladeAntlrParser.FragmentDContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#if}. - * @param ctx the parse tree - */ - void enterIf(BladeAntlrParser.IfContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#if}. - * @param ctx the parse tree - */ - void exitIf(BladeAntlrParser.IfContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#else}. - * @param ctx the parse tree - */ - void enterElse(BladeAntlrParser.ElseContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#else}. - * @param ctx the parse tree - */ - void exitElse(BladeAntlrParser.ElseContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#endif}. - * @param ctx the parse tree - */ - void enterEndif(BladeAntlrParser.EndifContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#endif}. - * @param ctx the parse tree - */ - void exitEndif(BladeAntlrParser.EndifContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#empty_block}. - * @param ctx the parse tree - */ - void enterEmpty_block(BladeAntlrParser.Empty_blockContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#empty_block}. - * @param ctx the parse tree - */ - void exitEmpty_block(BladeAntlrParser.Empty_blockContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#conditional_block}. - * @param ctx the parse tree - */ - void enterConditional_block(BladeAntlrParser.Conditional_blockContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#conditional_block}. - * @param ctx the parse tree - */ - void exitConditional_block(BladeAntlrParser.Conditional_blockContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#auth_block}. - * @param ctx the parse tree - */ - void enterAuth_block(BladeAntlrParser.Auth_blockContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#auth_block}. - * @param ctx the parse tree - */ - void exitAuth_block(BladeAntlrParser.Auth_blockContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#env_block}. - * @param ctx the parse tree - */ - void enterEnv_block(BladeAntlrParser.Env_blockContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#env_block}. - * @param ctx the parse tree - */ - void exitEnv_block(BladeAntlrParser.Env_blockContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#permission}. - * @param ctx the parse tree - */ - void enterPermission(BladeAntlrParser.PermissionContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#permission}. - * @param ctx the parse tree - */ - void exitPermission(BladeAntlrParser.PermissionContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#simple_conditional_stm}. - * @param ctx the parse tree - */ - void enterSimple_conditional_stm(BladeAntlrParser.Simple_conditional_stmContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#simple_conditional_stm}. - * @param ctx the parse tree - */ - void exitSimple_conditional_stm(BladeAntlrParser.Simple_conditional_stmContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#error_block}. - * @param ctx the parse tree - */ - void enterError_block(BladeAntlrParser.Error_blockContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#error_block}. - * @param ctx the parse tree - */ - void exitError_block(BladeAntlrParser.Error_blockContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#switch}. - * @param ctx the parse tree - */ - void enterSwitch(BladeAntlrParser.SwitchContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#switch}. - * @param ctx the parse tree - */ - void exitSwitch(BladeAntlrParser.SwitchContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#while}. - * @param ctx the parse tree - */ - void enterWhile(BladeAntlrParser.WhileContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#while}. - * @param ctx the parse tree - */ - void exitWhile(BladeAntlrParser.WhileContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#for}. - * @param ctx the parse tree - */ - void enterFor(BladeAntlrParser.ForContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#for}. - * @param ctx the parse tree - */ - void exitFor(BladeAntlrParser.ForContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#foreach}. - * @param ctx the parse tree - */ - void enterForeach(BladeAntlrParser.ForeachContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#foreach}. - * @param ctx the parse tree - */ - void exitForeach(BladeAntlrParser.ForeachContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#forelse}. - * @param ctx the parse tree - */ - void enterForelse(BladeAntlrParser.ForelseContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#forelse}. - * @param ctx the parse tree - */ - void exitForelse(BladeAntlrParser.ForelseContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#session}. - * @param ctx the parse tree - */ - void enterSession(BladeAntlrParser.SessionContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#session}. - * @param ctx the parse tree - */ - void exitSession(BladeAntlrParser.SessionContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#stack}. - * @param ctx the parse tree - */ - void enterStack(BladeAntlrParser.StackContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#stack}. - * @param ctx the parse tree - */ - void exitStack(BladeAntlrParser.StackContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#asset_bundler}. - * @param ctx the parse tree - */ - void enterAsset_bundler(BladeAntlrParser.Asset_bundlerContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#asset_bundler}. - * @param ctx the parse tree - */ - void exitAsset_bundler(BladeAntlrParser.Asset_bundlerContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#inject}. - * @param ctx the parse tree - */ - void enterInject(BladeAntlrParser.InjectContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#inject}. - * @param ctx the parse tree - */ - void exitInject(BladeAntlrParser.InjectContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#includeCond}. - * @param ctx the parse tree - */ - void enterIncludeCond(BladeAntlrParser.IncludeCondContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#includeCond}. - * @param ctx the parse tree - */ - void exitIncludeCond(BladeAntlrParser.IncludeCondContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#each}. - * @param ctx the parse tree - */ - void enterEach(BladeAntlrParser.EachContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#each}. - * @param ctx the parse tree - */ - void exitEach(BladeAntlrParser.EachContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#once_block}. - * @param ctx the parse tree - */ - void enterOnce_block(BladeAntlrParser.Once_blockContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#once_block}. - * @param ctx the parse tree - */ - void exitOnce_block(BladeAntlrParser.Once_blockContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#condSection}. - * @param ctx the parse tree - */ - void enterCondSection(BladeAntlrParser.CondSectionContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#condSection}. - * @param ctx the parse tree - */ - void exitCondSection(BladeAntlrParser.CondSectionContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#custom_directive}. - * @param ctx the parse tree - */ - void enterCustom_directive(BladeAntlrParser.Custom_directiveContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#custom_directive}. - * @param ctx the parse tree - */ - void exitCustom_directive(BladeAntlrParser.Custom_directiveContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#possibleDirective}. - * @param ctx the parse tree - */ - void enterPossibleDirective(BladeAntlrParser.PossibleDirectiveContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#possibleDirective}. - * @param ctx the parse tree - */ - void exitPossibleDirective(BladeAntlrParser.PossibleDirectiveContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#php_blade}. - * @param ctx the parse tree - */ - void enterPhp_blade(BladeAntlrParser.Php_bladeContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#php_blade}. - * @param ctx the parse tree - */ - void exitPhp_blade(BladeAntlrParser.Php_bladeContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#phpInline}. - * @param ctx the parse tree - */ - void enterPhpInline(BladeAntlrParser.PhpInlineContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#phpInline}. - * @param ctx the parse tree - */ - void exitPhpInline(BladeAntlrParser.PhpInlineContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#regular_echo}. - * @param ctx the parse tree - */ - void enterRegular_echo(BladeAntlrParser.Regular_echoContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#regular_echo}. - * @param ctx the parse tree - */ - void exitRegular_echo(BladeAntlrParser.Regular_echoContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#raw_echo}. - * @param ctx the parse tree - */ - void enterRaw_echo(BladeAntlrParser.Raw_echoContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#raw_echo}. - * @param ctx the parse tree - */ - void exitRaw_echo(BladeAntlrParser.Raw_echoContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#echo_expr}. - * @param ctx the parse tree - */ - void enterEcho_expr(BladeAntlrParser.Echo_exprContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#echo_expr}. - * @param ctx the parse tree - */ - void exitEcho_expr(BladeAntlrParser.Echo_exprContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#class_expr_usage}. - * @param ctx the parse tree - */ - void enterClass_expr_usage(BladeAntlrParser.Class_expr_usageContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#class_expr_usage}. - * @param ctx the parse tree - */ - void exitClass_expr_usage(BladeAntlrParser.Class_expr_usageContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#object_alias_static_access}. - * @param ctx the parse tree - */ - void enterObject_alias_static_access(BladeAntlrParser.Object_alias_static_accessContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#object_alias_static_access}. - * @param ctx the parse tree - */ - void exitObject_alias_static_access(BladeAntlrParser.Object_alias_static_accessContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#object_alias_direct_access}. - * @param ctx the parse tree - */ - void enterObject_alias_direct_access(BladeAntlrParser.Object_alias_direct_accessContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#object_alias_direct_access}. - * @param ctx the parse tree - */ - void exitObject_alias_direct_access(BladeAntlrParser.Object_alias_direct_accessContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#static_direct_class_access}. - * @param ctx the parse tree - */ - void enterStatic_direct_class_access(BladeAntlrParser.Static_direct_class_accessContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#static_direct_class_access}. - * @param ctx the parse tree - */ - void exitStatic_direct_class_access(BladeAntlrParser.Static_direct_class_accessContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#static_direct_namespace_class_access}. - * @param ctx the parse tree - */ - void enterStatic_direct_namespace_class_access(BladeAntlrParser.Static_direct_namespace_class_accessContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#static_direct_namespace_class_access}. - * @param ctx the parse tree - */ - void exitStatic_direct_namespace_class_access(BladeAntlrParser.Static_direct_namespace_class_accessContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#class_instance}. - * @param ctx the parse tree - */ - void enterClass_instance(BladeAntlrParser.Class_instanceContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#class_instance}. - * @param ctx the parse tree - */ - void exitClass_instance(BladeAntlrParser.Class_instanceContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#class_name_reference}. - * @param ctx the parse tree - */ - void enterClass_name_reference(BladeAntlrParser.Class_name_referenceContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#class_name_reference}. - * @param ctx the parse tree - */ - void exitClass_name_reference(BladeAntlrParser.Class_name_referenceContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#namespacePath}. - * @param ctx the parse tree - */ - void enterNamespacePath(BladeAntlrParser.NamespacePathContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#namespacePath}. - * @param ctx the parse tree - */ - void exitNamespacePath(BladeAntlrParser.NamespacePathContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#function_call}. - * @param ctx the parse tree - */ - void enterFunction_call(BladeAntlrParser.Function_callContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#function_call}. - * @param ctx the parse tree - */ - void exitFunction_call(BladeAntlrParser.Function_callContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#php_expression}. - * @param ctx the parse tree - */ - void enterPhp_expression(BladeAntlrParser.Php_expressionContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#php_expression}. - * @param ctx the parse tree - */ - void exitPhp_expression(BladeAntlrParser.Php_expressionContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#loop_expression}. - * @param ctx the parse tree - */ - void enterLoop_expression(BladeAntlrParser.Loop_expressionContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#loop_expression}. - * @param ctx the parse tree - */ - void exitLoop_expression(BladeAntlrParser.Loop_expressionContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#main_php_expression}. - * @param ctx the parse tree - */ - void enterMain_php_expression(BladeAntlrParser.Main_php_expressionContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#main_php_expression}. - * @param ctx the parse tree - */ - void exitMain_php_expression(BladeAntlrParser.Main_php_expressionContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#composed_php_expression}. - * @param ctx the parse tree - */ - void enterComposed_php_expression(BladeAntlrParser.Composed_php_expressionContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#composed_php_expression}. - * @param ctx the parse tree - */ - void exitComposed_php_expression(BladeAntlrParser.Composed_php_expressionContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#simple_foreach_expr}. - * @param ctx the parse tree - */ - void enterSimple_foreach_expr(BladeAntlrParser.Simple_foreach_exprContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#simple_foreach_expr}. - * @param ctx the parse tree - */ - void exitSimple_foreach_expr(BladeAntlrParser.Simple_foreach_exprContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#singleArgWrapperP}. - * @param ctx the parse tree - */ - void enterSingleArgWrapperP(BladeAntlrParser.SingleArgWrapperPContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#singleArgWrapperP}. - * @param ctx the parse tree - */ - void exitSingleArgWrapperP(BladeAntlrParser.SingleArgWrapperPContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#doubleArgWrapperP}. - * @param ctx the parse tree - */ - void enterDoubleArgWrapperP(BladeAntlrParser.DoubleArgWrapperPContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#doubleArgWrapperP}. - * @param ctx the parse tree - */ - void exitDoubleArgWrapperP(BladeAntlrParser.DoubleArgWrapperPContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#multiArgWrapper}. - * @param ctx the parse tree - */ - void enterMultiArgWrapper(BladeAntlrParser.MultiArgWrapperContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#multiArgWrapper}. - * @param ctx the parse tree - */ - void exitMultiArgWrapper(BladeAntlrParser.MultiArgWrapperContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#identifiableArgument}. - * @param ctx the parse tree - */ - void enterIdentifiableArgument(BladeAntlrParser.IdentifiableArgumentContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#identifiableArgument}. - * @param ctx the parse tree - */ - void exitIdentifiableArgument(BladeAntlrParser.IdentifiableArgumentContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#composedArgument}. - * @param ctx the parse tree - */ - void enterComposedArgument(BladeAntlrParser.ComposedArgumentContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#composedArgument}. - * @param ctx the parse tree - */ - void exitComposedArgument(BladeAntlrParser.ComposedArgumentContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#phpExpr}. - * @param ctx the parse tree - */ - void enterPhpExpr(BladeAntlrParser.PhpExprContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#phpExpr}. - * @param ctx the parse tree - */ - void exitPhpExpr(BladeAntlrParser.PhpExprContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#identifiableArray}. - * @param ctx the parse tree - */ - void enterIdentifiableArray(BladeAntlrParser.IdentifiableArrayContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#identifiableArray}. - * @param ctx the parse tree - */ - void exitIdentifiableArray(BladeAntlrParser.IdentifiableArrayContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#arrayDefine}. - * @param ctx the parse tree - */ - void enterArrayDefine(BladeAntlrParser.ArrayDefineContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#arrayDefine}. - * @param ctx the parse tree - */ - void exitArrayDefine(BladeAntlrParser.ArrayDefineContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#paramAssign}. - * @param ctx the parse tree - */ - void enterParamAssign(BladeAntlrParser.ParamAssignContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#paramAssign}. - * @param ctx the parse tree - */ - void exitParamAssign(BladeAntlrParser.ParamAssignContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#verbatim_block}. - * @param ctx the parse tree - */ - void enterVerbatim_block(BladeAntlrParser.Verbatim_blockContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#verbatim_block}. - * @param ctx the parse tree - */ - void exitVerbatim_block(BladeAntlrParser.Verbatim_blockContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#loop_action}. - * @param ctx the parse tree - */ - void enterLoop_action(BladeAntlrParser.Loop_actionContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#loop_action}. - * @param ctx the parse tree - */ - void exitLoop_action(BladeAntlrParser.Loop_actionContext ctx); - /** - * Enter a parse tree produced by {@link BladeAntlrParser#html}. - * @param ctx the parse tree - */ - void enterHtml(BladeAntlrParser.HtmlContext ctx); - /** - * Exit a parse tree produced by {@link BladeAntlrParser#html}. - * @param ctx the parse tree - */ - void exitHtml(BladeAntlrParser.HtmlContext ctx); -} \ No newline at end of file From 71c87adcee06ca7a3fc13561305fe908517df94d Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Fri, 11 Oct 2024 09:51:41 +0300 Subject: [PATCH 29/43] remove out of the ide parsing implementation and utils, replace it with standard parser flow --- .../php/blade/editor/BladeLanguage.java | 2 + .../php/blade/editor/actions/FindUsage.java | 1 - .../completion/PhpCodeCompletionService.java | 84 ++-- .../editor/directives/CustomDirectives.java | 48 ++- .../php/blade/editor/parser/BladeParser.java | 2 +- .../php/blade/editor/parser/ParsingUtils.java | 362 ------------------ .../php/blade/editor/path/BladePathUtils.java | 5 +- .../editor/refactoring/BladePathInfo.java | 4 +- .../editor/refactoring/BladePathUsage.java | 6 +- .../RefactoringActionsProvider.java | 18 +- 10 files changed, 111 insertions(+), 421 deletions(-) delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java index d871175ce64d..d20626376cb5 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java @@ -50,6 +50,7 @@ import org.netbeans.modules.php.blade.editor.navigator.BladeStructureScanner; import org.netbeans.modules.php.blade.editor.parser.BladeParser; import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; +import org.netbeans.modules.php.blade.syntax.StringUtils; /** * @@ -92,6 +93,7 @@ public BladeLanguage() { public static final String MIME_TYPE = "text/x-blade"; //NOI18N public static final String FILE_EXTENSION_SUFFIX = ".blade"; //NOI18N public static final String FILE_EXTENSION = "blade.php"; //NOI18N + public static final String FILE_EXTENSION_WITH_DOT = StringUtils.DOT + FILE_EXTENSION; @Override public Language getLexerLanguage() { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/FindUsage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/FindUsage.java index 62d1715761c8..c48a5d25c61b 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/FindUsage.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/FindUsage.java @@ -21,7 +21,6 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.AbstractAction; -import javax.swing.text.JTextComponent; import org.netbeans.modules.php.blade.editor.path.BladePathUtils; import org.netbeans.modules.php.blade.editor.refactoring.BladePathInfo; import org.netbeans.modules.php.blade.editor.refactoring.WhereBladePathUsedRefactoringUIImpl; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java index 630fe4dab509..d988f3448cd6 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java @@ -20,20 +20,30 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; +import javax.swing.text.BadLocationException; import org.antlr.v4.runtime.Token; import org.netbeans.api.annotations.common.NonNull; import org.netbeans.api.project.Project; +import org.netbeans.editor.BaseDocument; import org.netbeans.modules.csl.api.CodeCompletionContext; import org.netbeans.modules.csl.api.CodeCompletionHandler; import org.netbeans.modules.csl.api.CodeCompletionResult; import org.netbeans.modules.csl.api.CompletionProposal; import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.modules.parsing.api.ParserManager; +import org.netbeans.modules.parsing.api.ResultIterator; +import org.netbeans.modules.parsing.api.Source; +import org.netbeans.modules.parsing.api.UserTask; +import org.netbeans.modules.parsing.spi.ParseException; import org.netbeans.modules.parsing.spi.indexing.support.QuerySupport; +import org.netbeans.modules.php.api.util.FileUtils; import org.netbeans.modules.php.blade.csl.elements.ClassElement; import org.netbeans.modules.php.blade.csl.elements.ElementType; import org.netbeans.modules.php.blade.csl.elements.NamedElement; import org.netbeans.modules.php.blade.editor.EditorStringUtils; +import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexFunctionResult; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; @@ -41,10 +51,11 @@ import static org.netbeans.modules.php.blade.editor.parser.BladeParserResult.ReferenceType.PHP_CLASS; import static org.netbeans.modules.php.blade.editor.parser.BladeParserResult.ReferenceType.PHP_CONSTANT; import static org.netbeans.modules.php.blade.editor.parser.BladeParserResult.ReferenceType.PHP_NAMESPACE_PATH_TYPE; -import org.netbeans.modules.php.blade.editor.parser.ParsingUtils; import org.netbeans.modules.php.editor.csl.PHPLanguage; +import org.netbeans.modules.php.editor.parser.PHPParseResult; import org.netbeans.spi.project.ui.support.ProjectConvertors; import org.openide.filesystems.FileObject; +import org.openide.util.Exceptions; /** * @@ -59,43 +70,62 @@ public String getPrefix() { } public List getCompletionProposal(int offset, Token currentToken) { - List proposals = new ArrayList<>(); + final List proposals = new ArrayList<>(); String phpSnippet = currentToken.getText(); String phpStart = " completionProposals, diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java index 8ec1e0b57cac..61d923e2482b 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java @@ -21,6 +21,7 @@ import java.io.File; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; @@ -30,8 +31,13 @@ import java.util.logging.Logger; import org.netbeans.api.project.Project; import org.netbeans.modules.csl.api.DeclarationFinder; -import org.netbeans.modules.php.blade.editor.parser.ParsingUtils; +import org.netbeans.modules.parsing.api.ParserManager; +import org.netbeans.modules.parsing.api.ResultIterator; +import org.netbeans.modules.parsing.api.Source; +import org.netbeans.modules.parsing.api.UserTask; +import org.netbeans.modules.parsing.spi.ParseException; import org.netbeans.modules.php.blade.project.BladeProjectProperties; +import org.netbeans.modules.php.editor.parser.PHPParseResult; import org.netbeans.modules.php.editor.parser.astnodes.Expression; import org.netbeans.modules.php.editor.parser.astnodes.FunctionInvocation; import org.netbeans.modules.php.editor.parser.astnodes.Scalar; @@ -40,6 +46,7 @@ import org.openide.filesystems.FileEvent; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; +import org.openide.util.Exceptions; /** * @@ -138,19 +145,34 @@ private void rescanFile(FileObject file) { } public void addDirectiveNamesFromFile(FileObject file) { - ParsingUtils parsingUtils = new ParsingUtils(); - parsingUtils.parseFileObject(file); - FunctionInvocationVisitor functionInvocationVisitor = new FunctionInvocationVisitor(); - if (parsingUtils.getParserResult() != null && parsingUtils.getParserResult().getProgram() != null) { - parsingUtils.getParserResult().getProgram().accept(functionInvocationVisitor); - List directiveList = functionInvocationVisitor.getDirectives(); - - if (directiveList.isEmpty()) { - return; - } + final Source source = Source.create(file); + + if (source == null) { + return; + } - customDirectiveList.addAll(directiveList); - customDirectives.put(file, directiveList); + try { + ParserManager.parse(Collections.singleton(source), new UserTask() { + @Override + public void run(ResultIterator resultIterator) throws Exception { + PHPParseResult result = (PHPParseResult) resultIterator.getParserResult(); + if (result == null || result.getProgram() == null) { + return; + } + FunctionInvocationVisitor functionInvocationVisitor = new FunctionInvocationVisitor(); + result.getProgram().accept(functionInvocationVisitor); + List directiveList = functionInvocationVisitor.getDirectives(); + + if (directiveList.isEmpty()) { + return; + } + + customDirectiveList.addAll(directiveList); + customDirectives.put(file, directiveList); + } + }); + } catch (ParseException ex) { + Exceptions.printStackTrace(ex); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java index 49460a03eaec..149d9a2041b3 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParser.java @@ -42,7 +42,7 @@ public void parse(Snapshot snapshot, Task task, SourceModificationEvent event) t } if (task.getClass().getName().contains("HtmlCssIndexContributor")) { // NOI18N - LOGGER.log(Level.INFO, "Skipped parsing for {0}", task.getClass().getName()); + LOGGER.log(Level.INFO, "Skipped parsing for {0}", task.getClass().getName()); // NOI18N return; } BladeParserResult parserResult = createParserResult(snapshot); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java deleted file mode 100644 index 7d9e2974419d..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java +++ /dev/null @@ -1,362 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.editor.parser; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Collections; -import java.util.Date; -import java.util.Enumeration; -import javax.swing.text.Document; -import org.netbeans.modules.parsing.api.ParserManager; -import org.netbeans.modules.parsing.api.ResultIterator; -import org.netbeans.modules.parsing.api.Source; -import org.netbeans.modules.parsing.api.UserTask; -import org.netbeans.modules.parsing.spi.ParseException; -import org.netbeans.modules.parsing.spi.Parser; -import org.netbeans.modules.php.api.util.FileUtils; -import org.netbeans.modules.php.editor.parser.PHPParseResult; -import org.openide.filesystems.AbstractFileSystem; -import org.openide.filesystems.DefaultAttributes; -import org.openide.filesystems.FileChangeListener; -import org.openide.filesystems.FileLock; -import org.openide.filesystems.FileObject; -import org.openide.filesystems.FileStateInvalidException; -import org.openide.filesystems.FileSystem; -import org.openide.util.Exceptions; -import org.openide.cookies.EditorCookie; -import org.openide.loaders.DataObject; - -/** - * - * @author bogdan - */ -public final class ParsingUtils { - - private PHPParseResult phpParserResult; - - public FakeFileObject createFileObject(String phpText) { - return new FakeFileObject(phpText); - } - - public void parsePhpText(String phpText) { - FakeFileObject file = new FakeFileObject(phpText); - parseFileObject(file); - } - - public void parseFileObject(FileObject file) { - Document doc = openDocument(file); - - try { - Source source = Source.create(doc); - - if (source == null) { - return; - } - - Document sourceDoc = source.getDocument(false); - - if (sourceDoc == null) { - return; - } - - source.createSnapshot(); - ParserManager.parse(Collections.singletonList(source), new UserTask() { - - @Override - public void run(ResultIterator resultIterator) throws Exception { - Parser.Result parserResult = resultIterator.getParserResult(); - if (parserResult instanceof PHPParseResult) { - phpParserResult = (PHPParseResult) parserResult; - } - } - }); - - } catch (ParseException ex) { - Exceptions.printStackTrace(ex); - } - } - - public PHPParseResult getParserResult() { - return phpParserResult; - } - - public Document openDocument(FileObject f) { - try { - DataObject dataObject = DataObject.find(f); - EditorCookie ec = dataObject.getLookup().lookup(EditorCookie.class); - return ec.openDocument(); - } catch (IOException ex) { - throw new IllegalStateException(ex); - } - } - - public class FakeFileObject extends FileObject { - - InputStream stream; - FileObject parent; - - public FakeFileObject(String text) { - stream = new ByteArrayInputStream(text.getBytes()); - } - - @Override - public String getName() { - return "test"; - } - - @Override - public String getExt() { - return "php"; - } - - @Override - public void rename(FileLock fl, String string, String string1) throws IOException { - // - } - - @Override - public FileSystem getFileSystem() throws FileStateInvalidException { - return new FakeFileSystem(); - } - - public void setParent(FileObject parent) { - this.parent = parent; - } - - @Override - public FileObject getParent() { - return parent; - } - - @Override - public boolean isFolder() { - return false; - } - - @Override - public Date lastModified() { - return new Date(); - } - - @Override - public boolean isRoot() { - return false; - } - - @Override - public boolean isData() { - return false; - } - - @Override - public boolean isValid() { - return true; - } - - @Override - public void delete(FileLock fl) throws IOException { - // - } - - @Override - public Object getAttribute(String string) { - return null; - } - - @Override - public void setAttribute(String string, Object o) throws IOException { - // - } - - @Override - public Enumeration getAttributes() { - return null; - } - - @Override - public void addFileChangeListener(FileChangeListener fl) { - // - } - - @Override - public void removeFileChangeListener(FileChangeListener fl) { - // - } - - @Override - public long getSize() { - return 1; - } - - @Override - public InputStream getInputStream() throws FileNotFoundException { - return stream; - } - - @Override - public OutputStream getOutputStream(FileLock fl) throws IOException { - return null; - } - - @Override - public FileLock lock() throws IOException { - return null; - } - - //deprecated - @SuppressWarnings("deprecation") - @Override - public void setImportant(boolean bln) { - // - } - - @Override - public FileObject[] getChildren() { - return new FileObject[0]; - } - - @Override - public FileObject getFileObject(String string, String string1) { - return null; - } - - @Override - public FileObject createFolder(String string) throws IOException { - return null; - } - - @Override - public FileObject createData(String string, String string1) throws IOException { - return null; - } - - //deprecated - @SuppressWarnings("deprecation") - @Override - public boolean isReadOnly() { - return true; - } - - } - - class FakeFileSystem extends AbstractFileSystem - implements AbstractFileSystem.Info, AbstractFileSystem.List, AbstractFileSystem.Change { - - String dir = "dir"; - - @SuppressWarnings(value = "LeakingThisInConstructor") - public FakeFileSystem() { - this.info = this; - this.list = this; - this.change = this; - this.attr = new DefaultAttributes(info, change, list); - } - - @Override - public String getDisplayName() { - return "Fake FS"; - } - - @Override - public boolean isReadOnly() { - return true; - } - - @Override - public Date lastModified(String name) { - return new Date(5000L); - } - - @Override - public boolean folder(String name) { - return dir.equals(name); - } - - @Override - public boolean readOnly(String name) { - return false; - } - - @Override - public String mimeType(String name) { - return FileUtils.PHP_MIME_TYPE; - } - - @Override - public long size(String name) { - return 0; - } - - @Override - public InputStream inputStream(String name) throws FileNotFoundException { - return new ByteArrayInputStream(new byte[0]); - } - - @Override - public OutputStream outputStream(String name) throws IOException { - return new ByteArrayOutputStream(); - } - - @Override - public void lock(String name) throws IOException { - } - - @Override - public void unlock(String name) { - } - - @Override - public void markUnimportant(String name) { - } - - @Override - public String[] children(String f) { - if ("".equals(f)) { - return new String[]{dir}; - } else { - return new String[]{"empty.txt"}; - } - } - - @Override - public void createFolder(String name) throws IOException { - throw new IOException(); - } - - @Override - public void createData(String name) throws IOException { - throw new IOException(); - } - - @Override - public void rename(String oldName, String newName) throws IOException { - } - - @Override - public void delete(String name) throws IOException { - throw new IOException(); - } - - } -} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java index fc13e922114f..ca82146620a5 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java @@ -43,7 +43,6 @@ public final class BladePathUtils { public static final String LARAVEL_RESOURCES = "resources"; //NOI18N public static final String LARAVEL_VIEW_FOLDER = "views"; //NOI18N public static final String LARAVEL_VIEW_PATH = LARAVEL_RESOURCES + StringUtils.FORWARD_SLASH + LARAVEL_VIEW_FOLDER; - public static final String BLADE_EXT = "." + BladeLanguage.FILE_EXTENSION; //NOI18N private BladePathUtils() { @@ -312,11 +311,11 @@ public static String getRelativeProjectPath(FileObject currentFile) { } public static String toBladeViewPath(String filePath) { - return filePath.replace(BLADE_EXT, "").replace(StringUtils.FORWARD_SLASH, StringUtils.DOT); //NOI18N + return filePath.replace(BladeLanguage.FILE_EXTENSION_WITH_DOT, "").replace(StringUtils.FORWARD_SLASH, StringUtils.DOT); //NOI18N } public static String viewPathToFilePath(String viewPath) { - return viewPath.replace(StringUtils.DOT, StringUtils.FORWARD_SLASH) + BLADE_EXT; + return viewPath.replace(StringUtils.DOT, StringUtils.FORWARD_SLASH) + BladeLanguage.FILE_EXTENSION_WITH_DOT; } public static HashSet getDefaultRoots(Project project) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathInfo.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathInfo.java index a37be0c2dec5..528a48d06c5f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathInfo.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathInfo.java @@ -64,10 +64,10 @@ public boolean equals(Object obj) { return false; } final BladePathInfo other = (BladePathInfo) obj; - if (!Objects.equals(this.bladePath, other.bladePath)) { + if (!Objects.equals(this.bladePath, other.getBladePath())) { return false; } - return Objects.equals(this.sourceFile, other.sourceFile); + return Objects.equals(this.sourceFile, other.getSourceFile()); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathUsage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathUsage.java index dc67db853139..0703164f5162 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathUsage.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/BladePathUsage.java @@ -121,9 +121,9 @@ public Problem prepare(RefactoringElementsBag refactoringElements) { //offset quote symbols String annotatedLine = lineText.substring(0, start - rowStart + 1) - + "" + + "" //NOI18N + lineText.substring(start - rowStart + 1, end - rowStart + 2) - + "" + + "" //NOI18N + lineText.substring(end - rowStart + 2); refactoringElements.add(query, new BladeRefactoringElementImpl(annotatedLine, fo, bounds)); } catch (BadLocationException | IOException ex) { @@ -170,7 +170,7 @@ public BladeRefactoringElementImpl(String annotatedLine, FileObject file, Positi @Override public String getText() { - return "Element usage"; + return "Element usage"; //NOI18N } @Override diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/RefactoringActionsProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/RefactoringActionsProvider.java index 4807dfda165e..7cd17e15e90a 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/RefactoringActionsProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/refactoring/RefactoringActionsProvider.java @@ -26,6 +26,7 @@ import org.netbeans.api.lexer.TokenHierarchy; import org.netbeans.api.lexer.TokenSequence; import org.netbeans.modules.editor.NbEditorUtilities; +import org.netbeans.modules.php.blade.editor.BladeLanguage; import org.netbeans.modules.refactoring.api.ui.ExplorerContext; import org.netbeans.modules.refactoring.spi.ui.ActionsImplementationProvider; import org.netbeans.modules.refactoring.spi.ui.UI; @@ -63,7 +64,7 @@ public void doFindUsages(Lookup lookup) { FileObject file = NbEditorUtilities.getFileObject(doc); int caretPos = c.getCaretPosition(); - String name = "Unknown"; + String name = "Unknown"; //NOI18N if (abstractDoc != null) { abstractDoc.readLock(); @@ -109,20 +110,20 @@ public void doCopy(final Lookup lookup) { Node node = lookup.lookup(Node.class); FileObject file = node.getLookup().lookup(FileObject.class); FileObject dirTarget = (dir!= null && dir.isFolder()) ? dir : file.getParent(); - + String bladeExtension = BladeLanguage.FILE_EXTENSION_WITH_DOT; String name = file.getNameExt(); String existingFileName = file.getNameExt(); int counter = 1; while(counter < 50 && dirTarget.getFileObject(existingFileName)!= null){ //shouldn't be the case - existingFileName = name.substring(0, name.length() - ".blade.php".length()) + "_" + counter + ".blade.php"; + existingFileName = name.substring(0, name.length() - bladeExtension.length()) + "_" + counter + bladeExtension; //NOI18N counter++; } - String incrementSuffix = counter > 1 ? "_" + (counter - 1) : ""; - String resultName = existingFileName.substring(0, name.length() - ".blade.php".length()) + incrementSuffix; + String incrementSuffix = counter > 1 ? "_" + (counter - 1) : ""; //NOI18N + String resultName = existingFileName.substring(0, name.length() - bladeExtension.length()) + incrementSuffix; try { - FileUtil.copyFile(file, dirTarget, resultName, "blade.php"); + FileUtil.copyFile(file, dirTarget, resultName, BladeLanguage.FILE_EXTENSION); } catch (IOException ex) { Exceptions.printStackTrace(ex); } @@ -134,8 +135,7 @@ public boolean isBlade(Lookup lookup) { boolean ret = false; Node node = lookup.lookup(Node.class); - //hack to identify a blade file ? - if (node != null && node.getDisplayName().endsWith(".blade.php")) { + if (node != null && node.getDisplayName().endsWith(BladeLanguage.FILE_EXTENSION_WITH_DOT)) { ret = true; } return ret; @@ -150,7 +150,7 @@ public static FileObject getTarget(Lookup look) { if (n == null) { return null; } - DataObject dob = n.getCookie(DataObject.class); + DataObject dob = n.getLookup().lookup(DataObject.class); if (dob != null) { return dob.getPrimaryFile(); } From 73d39563819420d2dc04175ae955bd994a1c5414 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Fri, 11 Oct 2024 20:24:32 +0300 Subject: [PATCH 30/43] code compliance updates --- .../php/blade/editor/actions/BladeUtils.java | 38 ------------------- .../ViewAntlrColoringTokensAction.java | 24 ++++++------ .../ViewAntlrFormatterTokensAction.java | 27 +++++++------ .../actions/ViewAntlrLexerTokensAction.java | 25 ++++++------ .../php/blade/editor/cache/QueryCache.java | 2 - .../completion/BladeCompletionItem.java | 1 - .../completion/BladeCompletionProposal.java | 1 - .../BladePhpCompletionProvider.java | 4 +- .../completion/PhpCodeCompletionService.java | 6 +-- .../blade/editor/completion/TooltipDoc.java | 22 ++++++----- .../AttributeCompletionService.java | 6 +-- .../ComponentsCompletionService.java | 3 +- .../modules/php/blade/syntax/StringUtils.java | 12 +++++- 13 files changed, 67 insertions(+), 104 deletions(-) delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/BladeUtils.java diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/BladeUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/BladeUtils.java deleted file mode 100644 index dc2c1860edc9..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/BladeUtils.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.editor.actions; - -/** - * - * @author bogdan - */ -public final class BladeUtils { - - private BladeUtils() { - - } - - public static String replaceLinesAndTabs(String input) { - String escapedString = input; - escapedString = escapedString.replaceAll("\n", "\\\\n"); - escapedString = escapedString.replaceAll("\r", "\\\\r"); - escapedString = escapedString.replaceAll("\t", "\\\\t"); - return escapedString; - } -} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrColoringTokensAction.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrColoringTokensAction.java index 5cd8fc115eb2..12c63d243d98 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrColoringTokensAction.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrColoringTokensAction.java @@ -37,8 +37,8 @@ import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Vocabulary; +import org.netbeans.modules.php.blade.syntax.StringUtils; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrColoringLexer; -import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrColoringLexer.*; import org.openide.awt.ActionID; import org.openide.awt.ActionRegistration; import org.openide.filesystems.FileObject; @@ -54,12 +54,12 @@ @ActionRegistration(displayName = "AntlrColoring Tokens") public class ViewAntlrColoringTokensAction extends AbstractAction implements ActionListener { - Node node; + private final Node node; private transient JEditorPane viewer; public ViewAntlrColoringTokensAction(Node node) { this.node = node; - putValue(NAME, "AntlrColoring Tokens"); + putValue(NAME, "AntlrColoring Tokens"); // NOI18N } @Override @@ -88,10 +88,10 @@ public int getPersistenceType() { } protected void initComponents() { - setName("Antlr coloring token preview - " + fileObject.getName()); + setName("Antlr coloring token preview - " + fileObject.getName()); // NOI18N setLayout(new BorderLayout()); viewer = new JEditorPane(); - viewer.setContentType("text/plain"); + viewer.setContentType("text/plain"); // NOI18N viewer.setEditable(false); //viewer.addHyperlinkListener(this::linkHandler); @@ -114,18 +114,18 @@ protected void initComponents() { for (Token token : tokens.getTokens()) { int tokenId = token.getType(); String text = token.getText(); - result.append("Token #"); + result.append("Token #"); // NOI18N result.append(tokenId); - result.append(" "); + result.append(" "); // NOI18N result.append(vocabulary.getDisplayName(tokenId)); - String tokenText = BladeUtils.replaceLinesAndTabs(text); + String tokenText = StringUtils.replaceLinesAndTabs(text); if (!tokenText.isEmpty()) { - result.append(" "); - result.append("["); + result.append(" "); // NOI18N + result.append("["); // NOI18N result.append(token); - result.append("]"); + result.append("]"); // NOI18N } - result.append("\n"); + result.append("\n"); // NOI18N } EditorKit kit = viewer.getEditorKit(); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrFormatterTokensAction.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrFormatterTokensAction.java index cc7118492588..7d7850e2b9a5 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrFormatterTokensAction.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrFormatterTokensAction.java @@ -37,8 +37,8 @@ import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Vocabulary; +import org.netbeans.modules.php.blade.syntax.StringUtils; import org.netbeans.modules.php.blade.syntax.antlr4.formatter.BladeAntlrFormatterLexer; -import static org.netbeans.modules.php.blade.syntax.antlr4.formatter.BladeAntlrFormatterLexer.*; import org.openide.awt.ActionID; import org.openide.awt.ActionRegistration; import org.openide.filesystems.FileObject; @@ -54,12 +54,12 @@ @ActionRegistration(displayName = "AntlrFormatter Tokens") public class ViewAntlrFormatterTokensAction extends AbstractAction implements ActionListener { - Node node; + private final Node node; private transient JEditorPane viewer; public ViewAntlrFormatterTokensAction(Node node) { this.node = node; - putValue(NAME, "AntlrFormatter Tokens"); + putValue(NAME, "AntlrFormatter Tokens"); // NOI18N } @Override @@ -88,12 +88,11 @@ public int getPersistenceType() { } protected void initComponents() { - setName("Antlr formatter token preview - " + fileObject.getName()); + setName("Antlr formatter token preview - " + fileObject.getName()); // NOI18N setLayout(new BorderLayout()); viewer = new JEditorPane(); - viewer.setContentType("text/plain"); - viewer.setEditable(false); - //viewer.addHyperlinkListener(this::linkHandler); + viewer.setContentType("text/plain"); // NOI18N + viewer.setEditable(false); JPanel panel = new JPanel(new BorderLayout()); panel.add(new JScrollPane(viewer), BorderLayout.CENTER); @@ -114,18 +113,18 @@ protected void initComponents() { for (Token token : tokens.getTokens()) { int tokenId = token.getType(); String text = token.getText(); - result.append("Token #"); + result.append("Token #"); // NOI18N result.append(tokenId); - result.append(" "); + result.append(" "); // NOI18N result.append(vocabulary.getDisplayName(tokenId)); - String tokenText = BladeUtils.replaceLinesAndTabs(text); + String tokenText = StringUtils.replaceLinesAndTabs(text); if (!tokenText.isEmpty()) { - result.append(" "); - result.append("["); + result.append(" "); // NOI18N + result.append("["); // NOI18N result.append(token); - result.append("]"); + result.append("]"); // NOI18N } - result.append("\n"); + result.append("\n"); // NOI18N } EditorKit kit = viewer.getEditorKit(); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrLexerTokensAction.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrLexerTokensAction.java index 6d1da2cd48a9..cc9bac96909f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrLexerTokensAction.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/actions/ViewAntlrLexerTokensAction.java @@ -37,8 +37,8 @@ import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Vocabulary; +import org.netbeans.modules.php.blade.syntax.StringUtils; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; -import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; import org.openide.awt.ActionID; import org.openide.awt.ActionRegistration; import org.openide.filesystems.FileObject; @@ -54,12 +54,12 @@ @ActionRegistration(displayName = "AntlrLexer Tokens") public class ViewAntlrLexerTokensAction extends AbstractAction implements ActionListener { - Node node; + private final Node node; private transient JEditorPane viewer; public ViewAntlrLexerTokensAction(Node node) { this.node = node; - putValue(NAME, "AntlrLexer Tokens"); + putValue(NAME, "AntlrLexer Tokens"); // NOI18N } @Override @@ -88,12 +88,11 @@ public int getPersistenceType() { } protected void initComponents() { - setName("Antlr token preview - " + fileObject.getName()); + setName("Antlr token preview - " + fileObject.getName()); // NOI18N setLayout(new BorderLayout()); viewer = new JEditorPane(); - viewer.setContentType("text/plain"); + viewer.setContentType("text/plain"); // NOI18N viewer.setEditable(false); - //viewer.addHyperlinkListener(this::linkHandler); JPanel panel = new JPanel(new BorderLayout()); panel.add(new JScrollPane(viewer), BorderLayout.CENTER); @@ -114,18 +113,18 @@ protected void initComponents() { for (Token token : tokens.getTokens()) { int tokenId = token.getType(); String text = token.getText(); - result.append("Token #"); + result.append("Token #"); // NOI18N result.append(tokenId); - result.append(" "); + result.append(" "); // NOI18N result.append(vocabulary.getDisplayName(tokenId)); - String tokenText = BladeUtils.replaceLinesAndTabs(text); + String tokenText = StringUtils.replaceLinesAndTabs(text); if (!tokenText.isEmpty()) { - result.append(" "); - result.append("["); + result.append(" "); // NOI18N + result.append("["); // NOI18N result.append(token); - result.append("]"); + result.append("]"); // NOI18N } - result.append("\n"); + result.append("\n"); // NOI18N } EditorKit kit = viewer.getEditorKit(); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java index e971d6dfbaa5..5cabba310317 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/cache/QueryCache.java @@ -37,8 +37,6 @@ public final class QueryCache { private Map> cacheMap; private Long cacheTimeout; - //private static final Map QUERY_SUPPORT_INDEX = new WeakHashMap<>(); - public QueryCache() { this(DEFAULT_CACHE_TIMEOUT); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java index b7c72735d1d9..8608d0ccf3ae 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java @@ -33,7 +33,6 @@ import org.netbeans.modules.php.blade.editor.ResourceUtilities; import org.netbeans.modules.php.blade.editor.path.BladePathUtils; import org.netbeans.modules.php.blade.syntax.BladeDirectivesUtils; -import org.netbeans.modules.php.blade.syntax.StringUtils; import org.netbeans.spi.editor.completion.CompletionItem; import org.netbeans.spi.editor.completion.CompletionTask; import org.netbeans.spi.editor.completion.support.CompletionUtilities; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java index c415eb89406c..89bf47ffa7b4 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java @@ -21,7 +21,6 @@ import java.util.Collections; import java.util.Set; import javax.swing.ImageIcon; -import org.netbeans.api.annotations.common.NonNull; import org.netbeans.modules.csl.api.CompletionProposal; import org.netbeans.modules.csl.api.ElementHandle; import org.netbeans.modules.csl.api.ElementKind; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java index e6e62c46e3d0..d1f042f75dc6 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java @@ -220,6 +220,7 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse String pathName = EditorStringUtils.stripSurroundingQuotes(currentToken.getText()); if (!pathName.contains(BladePathUtils.LARAVEL_RESOURCES)) { + break; } int lastSlash = pathName.lastIndexOf(StringUtils.FORWARD_SLASH); @@ -255,8 +256,7 @@ private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffse addAssetPathCompletionItem(jsPath, file.getPath(), pathOffset, resultSet, CompletionType.JS_FILE); } } - } - if (isCssPath) { + } else if (isCssPath) { FileObject cssFolder = projectDir.getFileObject(CSS_ASSET_FOLDER); if (cssFolder == null || !cssFolder.isValid()) { break; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java index d988f3448cd6..47b26df4bee7 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java @@ -31,7 +31,6 @@ import org.netbeans.modules.csl.api.CodeCompletionHandler; import org.netbeans.modules.csl.api.CodeCompletionResult; import org.netbeans.modules.csl.api.CompletionProposal; -import org.netbeans.modules.csl.spi.ParserResult; import org.netbeans.modules.parsing.api.ParserManager; import org.netbeans.modules.parsing.api.ResultIterator; import org.netbeans.modules.parsing.api.Source; @@ -43,7 +42,6 @@ import org.netbeans.modules.php.blade.csl.elements.ElementType; import org.netbeans.modules.php.blade.csl.elements.NamedElement; import org.netbeans.modules.php.blade.editor.EditorStringUtils; -import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexFunctionResult; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; @@ -72,7 +70,7 @@ public String getPrefix() { public List getCompletionProposal(int offset, Token currentToken) { final List proposals = new ArrayList<>(); String phpSnippet = currentToken.getText(); - String phpStart = " { + String filePath = ""; // NOI18N if (elementHandle.getFileObject() != null){ filePath = BladePathUtils.getRelativeProjectPath(elementHandle.getFileObject()); } - return Documentation.create(String.format("
      %s
      ", "blade path") - + "
      " + filePath + "
      ", null); - case CUSTOM_DIRECTIVE: - String docInfo = String.format("
      %s
      ", "custom directive") - + "
      " + elementHandle.getFileObject().getNameExt() + "
      "; + return Documentation.create(String.format("
      %s
      ", "blade path") // NOI18N + + "
      " + filePath + "
      ", null); // NOI18N + } + case CUSTOM_DIRECTIVE -> { + String docInfo = String.format("
      %s
      ", "custom directive") // NOI18N + + "
      " + elementHandle.getFileObject().getNameExt() + "
      "; // NOI18N return Documentation.create(docInfo, null); + } } return result; } public static Documentation generateFunctionDoc(PhpFunctionElement elementHandle) { - String info = "
      " + elementHandle.getName() + elementHandle.getParamsAsString() + "
      "; + String info = "
      " + elementHandle.getName() + elementHandle.getParamsAsString() + "
      "; // NOI18N if (elementHandle.getNamespace() != null){ - info += "
      " + elementHandle.getNamespace() + "
      "; + info += "
      " + elementHandle.getNamespace() + "
      "; // NOI18N } info += "
      " + elementHandle.getFileObject().getNameExt() + "
      "; - info += String.format("
      %s
      ", "php function"); + info += String.format("
      %s
      ", "php function"); // NOI18N return Documentation.create(info, null); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java index a7e005c2d528..499042ed1753 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java @@ -28,9 +28,9 @@ * @author bhaidu */ @AttributeRegister({ - @Attribute(name = "class"), // NOI18N - @Attribute(name = "id"), // NOI18N - @Attribute(name = "title"), // NOI18N + @Attribute(name = "class"), + @Attribute(name = "id"), + @Attribute(name = "title"), }) public class AttributeCompletionService { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java index b6e47db5a3fc..fe0564788c17 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java @@ -18,7 +18,6 @@ */ package org.netbeans.modules.php.blade.editor.components; -import org.netbeans.modules.php.blade.editor.components.annotation.NamespaceRegister; import org.netbeans.modules.php.blade.editor.components.annotation.Namespace; import java.util.ArrayList; import java.util.Collection; @@ -31,7 +30,7 @@ import org.openide.filesystems.FileObject; /** - * most frequently used plugins for laravel + * * * @author bhaidu */ diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java index 33e06e448fc2..0403ffc63e0c 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java @@ -26,7 +26,7 @@ public final class StringUtils { public static final String DOT = "."; //NOI18N public static final String FORWARD_SLASH = "/"; //NOI18N - + private StringUtils() { } @@ -56,11 +56,19 @@ public static String toKebabCase(String str) { } public static String kebabToCamel(String str) { - String[] words = str.toLowerCase().split("-"); + String[] words = str.toLowerCase().split("-"); // NOI18N String camelCase = words[0]; for (int i = 1; i < words.length; i++) { camelCase += words[i].substring(0, 1).toUpperCase() + words[i].substring(1); } return capitalize(camelCase); } + + public static String replaceLinesAndTabs(String input) { + String escapedString = input; + escapedString = escapedString.replaceAll("\n", "\\\\n"); // NOI18N + escapedString = escapedString.replaceAll("\r", "\\\\r"); // NOI18N + escapedString = escapedString.replaceAll("\t", "\\\\t"); // NOI18N + return escapedString; + } } From 0a6f22e7e1434ca2043af13a67dcebd19fb11f4f Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Fri, 11 Oct 2024 21:13:00 +0300 Subject: [PATCH 31/43] rebased branch, remove apache commons lang lib, update antlr parser build config --- php/php.blade/build.xml | 5 ++++- php/php.blade/nbproject/project.xml | 8 -------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/php/php.blade/build.xml b/php/php.blade/build.xml index 409c84c8400b..8340f6bfa957 100644 --- a/php/php.blade/build.xml +++ b/php/php.blade/build.xml @@ -25,7 +25,10 @@ - + + + + diff --git a/php/php.blade/nbproject/project.xml b/php/php.blade/nbproject/project.xml index 3c5e9b333144..96180d2c4deb 100644 --- a/php/php.blade/nbproject/project.xml +++ b/php/php.blade/nbproject/project.xml @@ -25,14 +25,6 @@ org.netbeans.modules.php.blade - - org.apache.commons.lang3 - - - - 3.12.0 - - org.netbeans.api.annotations.common From 5d69251717d179fee25c812492153b71884e5177 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Sat, 12 Oct 2024 07:26:48 +0300 Subject: [PATCH 32/43] add classpathref attribute in build config --- php/php.blade/build.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/php/php.blade/build.xml b/php/php.blade/build.xml index 8340f6bfa957..3940738e8402 100644 --- a/php/php.blade/build.xml +++ b/php/php.blade/build.xml @@ -22,26 +22,26 @@ Builds, tests, and runs the project org.netbeans.modules.php.blade - + - + - + - + From 5ee63cb32d26972a6f7101157288f97b0d931978 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Sat, 19 Oct 2024 15:11:50 +0300 Subject: [PATCH 33/43] add antlr-parser to build-init, add new directives --- php/php.blade/build.xml | 3 +- .../php/blade/syntax/DirectivesList.java | 3 ++ .../antlr4/v10/BladeAntlrColoringLexer.g4 | 5 ++-- .../syntax/antlr4/v10/BladeAntlrLexer.g4 | 2 ++ .../syntax/antlr4/v10/BladeAntlrParser.g4 | 3 ++ .../lexer/BladeLexerTest/css_at_rules.pass | 28 +++++++++---------- ..._01.blade.php.testCompletion_01.completion | 4 +++ ...unclosed_section_error_01.blade.php.errors | 2 +- .../unopend_set_error_01.blade.php.errors | 2 +- 9 files changed, 33 insertions(+), 19 deletions(-) diff --git a/php/php.blade/build.xml b/php/php.blade/build.xml index 3940738e8402..a5c7fe4e103d 100644 --- a/php/php.blade/build.xml +++ b/php/php.blade/build.xml @@ -22,7 +22,8 @@ Builds, tests, and runs the project org.netbeans.modules.php.blade - + + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/DirectivesList.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/DirectivesList.java index 9cf06abac872..e52b065e1538 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/DirectivesList.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/DirectivesList.java @@ -66,6 +66,7 @@ @Directive(name = "@includeWhen", params = true), @Directive(name = "@includeUnless", params = true), @Directive(name = "@each", params = true), + @Directive(name = "@verbatim", endtag = "@endverbatim"), //statement @Directive(name = "@switch", params = true, endtag = "@endswitch"), @Directive(name = "@case", params = true), @@ -104,6 +105,8 @@ @Directive(name = "@dd", params = true), @Directive(name = "@json", params = true), @Directive(name = "@vite", params = true, since = "11"), + @Directive(name = "@when", params = true, since = "11"), + @Directive(name = "@bool", params = true, since = "11"), //styles @Directive(name = "@class", params = true, since = "8"), @Directive(name = "@style", params = true, since = "9"), diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 index f043c562cacb..628a8ffdd84b 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 @@ -79,7 +79,8 @@ PHP_INLINE : '' | '' | EOF); D_GENERIC_BLOCK_DIRECTIVES : ('@' DirectivesWithEndTag | '@sectionMissing' | '@hasSection') (' ')* {this._input.LA(1) == '('}? ->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); D_GENERIC_INLINE_DIRECTIVES : ('@elseif' | Include | '@extends' | '@each' | '@yield' | '@props' | '@method' - | '@class' | '@style' | '@aware' | '@break' | '@continue' | '@selected' | '@disabled' | '@readonly' | '@required') (' ')* {this._input.LA(1) == '('}? ->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); + | '@class' | '@style' | '@aware' | '@break' | '@continue' | '@selected' | '@disabled' + | '@readonly' | '@required' | '@when' | '@bool') (' ')* {this._input.LA(1) == '('}? ->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); D_GENERIC_INLINE_MIXED_DIRECTIVES : ('@break' | '@continue')->type(DIRECTIVE); @@ -105,12 +106,12 @@ D_END : ('@end' NameString)->type(DIRECTIVE); D_LIVEWIRE : ('@livewireStyles' | '@bukStyles' | '@livewireScripts' | '@bukScripts' | '@click' ('.away')? '=')->type(DIRECTIVE); D_ASSET_BUNDLER : '@vite' (' ')* {this._input.LA(1) == '('}? ->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); +D_CSS_AT_RULE : ('@supports' | '@container' | '@scope' | '@media') (' ')* {this._input.LA(1) == '('}? ->type(HTML); //we will decide that a custom directive has expression to avoid email matching D_CUSTOM : ('@' NameString (' ')* {this._input.LA(1) == '('}? ) ->pushMode(LOOK_FOR_PHP_EXPRESSION); D_UNKNOWN : '@' NameString; -//TODO move all known directives to fragment? //hack to allow completion for directives //it doesn't trigger completion D_AT : '@' (' ' | '>' | [\n\r])?; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 index c285838d54a3..759712bd0d21 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 @@ -193,6 +193,8 @@ D_HTML_ATTR_EXPR : ('@checked' | '@disabled' | '@readonly' | '@required' | '@sel D_AWARE : '@aware'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); //misc +D_BOOL : '@bool'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_WHEN : '@when'->pushMode(LOOK_FOR_BLADE_PARAMETERS); D_SESSION : '@session'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); D_ENDSESSION : '@endsession'; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 index 6e285b0d9312..c8519a118e8d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 @@ -84,6 +84,8 @@ inline_directive: | loop_action | D_ELSE //custom block directives? | D_MISC + | D_WHEN doubleArgWrapperPwithFallback + | D_BOOL singleArgWrapperP | custom_directive ; @@ -232,6 +234,7 @@ simple_foreach_expr: loop_array=PHP_VARIABLE FOREACH_AS key=PHP_VARIABLE (FOREAC singleArgWrapperP: BLADE_PARAM_LPAREN (idString=BL_PARAM_STRING | composedArgument) BLADE_PARAM_RPAREN; doubleArgWrapperP: BLADE_PARAM_LPAREN (idString=BL_PARAM_STRING | composedArgument) BL_COMMA composedArgument BLADE_PARAM_RPAREN; +doubleArgWrapperPwithFallback: BLADE_PARAM_LPAREN composedArgument BL_COMMA composedArgument (BL_COMMA composedArgument)? BLADE_PARAM_RPAREN; multiArgWrapper : BLADE_PARAM_LPAREN (composedArgument) (BL_COMMA composedArgument)* BLADE_PARAM_RPAREN; identifiableArgument : BL_PARAM_STRING; diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass index b0b7da2c04a4..5e37b1080811 100644 --- a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass @@ -14,20 +14,20 @@ Token #12 HTML [}] Token #13 HTML [\n ] Token #14 HTML [}] Token #15 HTML [\n ] -Token #16 BLADE_DIRECTIVE [@supports ] -Token #17 BLADE_PAREN [(] -Token #18 PHP_BLADE_EXPRESSION [transform-origin: 5% 5%] -Token #19 BLADE_PAREN [)] -Token #20 HTML [ ] -Token #21 HTML [{] -Token #22 HTML [\n ] -Token #23 HTML [}] -Token #24 HTML [\n ] -Token #25 BLADE_DIRECTIVE [@container ] -Token #26 BLADE_PAREN [(] -Token #27 PHP_BLADE_EXPRESSION [width > 400px] -Token #28 BLADE_PAREN [)] -Token #29 HTML [ ] +Token #16 HTML [@supports ] +Token #17 HTML [(transform-origin: 5] +Token #18 HTML [%] +Token #19 HTML [ 5] +Token #20 HTML [%] +Token #21 HTML [) ] +Token #22 HTML [{] +Token #23 HTML [\n ] +Token #24 HTML [}] +Token #25 HTML [\n ] +Token #26 HTML [@container ] +Token #27 HTML [(width ] +Token #28 HTML [>] +Token #29 HTML [ 400px) ] Token #30 HTML [{] Token #31 HTML [\n h2 ] Token #32 HTML [{] diff --git a/php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php.testCompletion_01.completion b/php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php.testCompletion_01.completion index 977291474786..fd8264c5abc1 100644 --- a/php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php.testCompletion_01.completion +++ b/php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php.testCompletion_01.completion @@ -22,8 +22,10 @@ CONSTRUCTO @once CONSTRUCTO @overwrite CONSTRUCTO @php CONSTRUCTO @stop +CONSTRUCTO @verbatim CONSTRUCTO @auth() CONSTRUCTO @auth() ... @endauth +CONSTRUCTO @bool() v11 CONSTRUCTO @can() v5.1 CONSTRUCTO @can() ... @endcan v5.1 CONSTRUCTO @canany() v5.8 @@ -92,5 +94,7 @@ CONSTRUCTO @switch() ... @endswitch CONSTRUCTO @unless() CONSTRUCTO @unless() ... @endunless CONSTRUCTO @use() +CONSTRUCTO @verbatim ... @endverbatim CONSTRUCTO @vite() v11 +CONSTRUCTO @when() v11 CONSTRUCTO @yield() diff --git a/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_section_error_01.blade.php.errors b/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_section_error_01.blade.php.errors index 1a63fb4530c0..e0f95cb5ef61 100644 --- a/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_section_error_01.blade.php.errors +++ b/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_section_error_01.blade.php.errors @@ -1 +1 @@ -[[13,13]-mismatched input '' expecting {HTML, '@if', '@else', '@switch', '@case', '@default', '@empty', D_COND_BLOCK_START, '@foreach', '@for', '@forelse', '@while', '@break', D_LOOP_ACTION, '@include', '@includeIf', '@includeWhen', '@includeFirst', '@includeUnless', '@each', '@extends', '@js', '@json', '@section', '@hasSection', '@sectionMissing', '@endsection', '@yield', '@parent', '@show', '@overwrite', '@stop', '@append', '@once', '@stack', '@push', '@pushIf', '@prepend', '@props', '@fragment', '@csrf', '@method', '@error', '@production', '@env', D_AUTH_START, D_PERMISSION_START, D_PERMISSION_ELSE, '@class', '@style', D_HTML_ATTR_EXPR, '@aware', '@session', D_DD, '@lang', '@use', '@inject', D_PHP, '@verbatim', D_LIVEWIRE, '@vite', '@viteReactRefresh', D_CUSTOM, D_UNKNOWN_ATTR_ENC, D_UNKNOWN, '{{', '{!!', PHP_INLINE_START, HTML_COMPONENT_PREFIX, HTML_TAG_START, HTML_IDENTIFIER, '='}] 13-13:mismatched input '' expecting {HTML, '@if', '@else', '@switch', '@case', '@default', '@empty', D_COND_BLOCK_START, '@foreach', '@for', '@forelse', '@while', '@break', D_LOOP_ACTION, '@include', '@includeIf', '@includeWhen', '@includeFirst', '@includeUnless', '@each', '@extends', '@js', '@json', '@section', '@hasSection', '@sectionMissing', '@endsection', '@yield', '@parent', '@show', '@overwrite', '@stop', '@append', '@once', '@stack', '@push', '@pushIf', '@prepend', '@props', '@fragment', '@csrf', '@method', '@error', '@production', '@env', D_AUTH_START, D_PERMISSION_START, D_PERMISSION_ELSE, '@class', '@style', D_HTML_ATTR_EXPR, '@aware', '@session', D_DD, '@lang', '@use', '@inject', D_PHP, '@verbatim', D_LIVEWIRE, '@vite', '@viteReactRefresh', D_CUSTOM, D_UNKNOWN_ATTR_ENC, D_UNKNOWN, '{{', '{!!', PHP_INLINE_START, HTML_COMPONENT_PREFIX, HTML_TAG_START, HTML_IDENTIFIER, '='} +[[13,13]-mismatched input '' expecting {HTML, '@if', '@else', '@switch', '@case', '@default', '@empty', D_COND_BLOCK_START, '@foreach', '@for', '@forelse', '@while', '@break', D_LOOP_ACTION, '@include', '@includeIf', '@includeWhen', '@includeFirst', '@includeUnless', '@each', '@extends', '@js', '@json', '@section', '@hasSection', '@sectionMissing', '@endsection', '@yield', '@parent', '@show', '@overwrite', '@stop', '@append', '@once', '@stack', '@push', '@pushIf', '@prepend', '@props', '@fragment', '@csrf', '@method', '@error', '@production', '@env', D_AUTH_START, D_PERMISSION_START, D_PERMISSION_ELSE, '@class', '@style', D_HTML_ATTR_EXPR, '@aware', '@bool', '@when', '@session', D_DD, '@lang', '@use', '@inject', D_PHP, '@verbatim', D_LIVEWIRE, '@vite', '@viteReactRefresh', D_CUSTOM, D_UNKNOWN_ATTR_ENC, D_UNKNOWN, '{{', '{!!', PHP_INLINE_START, HTML_COMPONENT_PREFIX, HTML_TAG_START, HTML_IDENTIFIER, '='}] 13-13:mismatched input '' expecting {HTML, '@if', '@else', '@switch', '@case', '@default', '@empty', D_COND_BLOCK_START, '@foreach', '@for', '@forelse', '@while', '@break', D_LOOP_ACTION, '@include', '@includeIf', '@includeWhen', '@includeFirst', '@includeUnless', '@each', '@extends', '@js', '@json', '@section', '@hasSection', '@sectionMissing', '@endsection', '@yield', '@parent', '@show', '@overwrite', '@stop', '@append', '@once', '@stack', '@push', '@pushIf', '@prepend', '@props', '@fragment', '@csrf', '@method', '@error', '@production', '@env', D_AUTH_START, D_PERMISSION_START, D_PERMISSION_ELSE, '@class', '@style', D_HTML_ATTR_EXPR, '@aware', '@bool', '@when', '@session', D_DD, '@lang', '@use', '@inject', D_PHP, '@verbatim', D_LIVEWIRE, '@vite', '@viteReactRefresh', D_CUSTOM, D_UNKNOWN_ATTR_ENC, D_UNKNOWN, '{{', '{!!', PHP_INLINE_START, HTML_COMPONENT_PREFIX, HTML_TAG_START, HTML_IDENTIFIER, '='} diff --git a/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors b/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors index fbdadaa275b4..71bf68737896 100644 --- a/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors +++ b/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors @@ -1 +1 @@ -[[15,15]-extraneous input '@endif' expecting {, HTML, '@if', '@else', '@switch', '@case', '@default', '@empty', D_COND_BLOCK_START, '@foreach', '@for', '@forelse', '@while', '@break', D_LOOP_ACTION, '@include', '@includeIf', '@includeWhen', '@includeFirst', '@includeUnless', '@each', '@extends', '@js', '@json', '@section', '@hasSection', '@sectionMissing', '@yield', '@once', '@stack', '@push', '@pushIf', '@prepend', '@props', '@fragment', '@csrf', '@method', '@error', '@production', '@env', D_AUTH_START, D_PERMISSION_START, D_PERMISSION_ELSE, '@class', '@style', D_HTML_ATTR_EXPR, '@aware', '@session', D_DD, '@lang', '@use', '@inject', D_PHP, '@verbatim', D_LIVEWIRE, '@vite', '@viteReactRefresh', D_CUSTOM, D_UNKNOWN_ATTR_ENC, D_UNKNOWN, '{{', '{!!', PHP_INLINE_START, HTML_COMPONENT_PREFIX, HTML_TAG_START, HTML_IDENTIFIER, '='}] 15-15:extraneous input '@endif' expecting {, HTML, '@if', '@else', '@switch', '@case', '@default', '@empty', D_COND_BLOCK_START, '@foreach', '@for', '@forelse', '@while', '@break', D_LOOP_ACTION, '@include', '@includeIf', '@includeWhen', '@includeFirst', '@includeUnless', '@each', '@extends', '@js', '@json', '@section', '@hasSection', '@sectionMissing', '@yield', '@once', '@stack', '@push', '@pushIf', '@prepend', '@props', '@fragment', '@csrf', '@method', '@error', '@production', '@env', D_AUTH_START, D_PERMISSION_START, D_PERMISSION_ELSE, '@class', '@style', D_HTML_ATTR_EXPR, '@aware', '@session', D_DD, '@lang', '@use', '@inject', D_PHP, '@verbatim', D_LIVEWIRE, '@vite', '@viteReactRefresh', D_CUSTOM, D_UNKNOWN_ATTR_ENC, D_UNKNOWN, '{{', '{!!', PHP_INLINE_START, HTML_COMPONENT_PREFIX, HTML_TAG_START, HTML_IDENTIFIER, '='} +[[15,15]-extraneous input '@endif' expecting {, HTML, '@if', '@else', '@switch', '@case', '@default', '@empty', D_COND_BLOCK_START, '@foreach', '@for', '@forelse', '@while', '@break', D_LOOP_ACTION, '@include', '@includeIf', '@includeWhen', '@includeFirst', '@includeUnless', '@each', '@extends', '@js', '@json', '@section', '@hasSection', '@sectionMissing', '@yield', '@once', '@stack', '@push', '@pushIf', '@prepend', '@props', '@fragment', '@csrf', '@method', '@error', '@production', '@env', D_AUTH_START, D_PERMISSION_START, D_PERMISSION_ELSE, '@class', '@style', D_HTML_ATTR_EXPR, '@aware', '@bool', '@when', '@session', D_DD, '@lang', '@use', '@inject', D_PHP, '@verbatim', D_LIVEWIRE, '@vite', '@viteReactRefresh', D_CUSTOM, D_UNKNOWN_ATTR_ENC, D_UNKNOWN, '{{', '{!!', PHP_INLINE_START, HTML_COMPONENT_PREFIX, HTML_TAG_START, HTML_IDENTIFIER, '='}] 15-15:extraneous input '@endif' expecting {, HTML, '@if', '@else', '@switch', '@case', '@default', '@empty', D_COND_BLOCK_START, '@foreach', '@for', '@forelse', '@while', '@break', D_LOOP_ACTION, '@include', '@includeIf', '@includeWhen', '@includeFirst', '@includeUnless', '@each', '@extends', '@js', '@json', '@section', '@hasSection', '@sectionMissing', '@yield', '@once', '@stack', '@push', '@pushIf', '@prepend', '@props', '@fragment', '@csrf', '@method', '@error', '@production', '@env', D_AUTH_START, D_PERMISSION_START, D_PERMISSION_ELSE, '@class', '@style', D_HTML_ATTR_EXPR, '@aware', '@bool', '@when', '@session', D_DD, '@lang', '@use', '@inject', D_PHP, '@verbatim', D_LIVEWIRE, '@vite', '@viteReactRefresh', D_CUSTOM, D_UNKNOWN_ATTR_ENC, D_UNKNOWN, '{{', '{!!', PHP_INLINE_START, HTML_COMPONENT_PREFIX, HTML_TAG_START, HTML_IDENTIFIER, '='} From c38e5ce77d78b1dea54b48436182e7b56deaffeb Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Mon, 21 Oct 2024 21:54:46 +0300 Subject: [PATCH 34/43] php embedding adjustments, fix parser error for includeFirst --- .../php/blade/editor/BladeBracesMatcher.java | 2 -- .../antlr4/v10/BladeAntlrColoringLexer.g4 | 36 +++++++------------ .../syntax/antlr4/v10/BladeAntlrParser.g4 | 3 +- .../antlr4/v10/ColoringLexerAdaptor.java | 34 ++++++++++++++++-- 4 files changed, 45 insertions(+), 30 deletions(-) diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java index c52431097c2f..764162d63403 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java @@ -18,10 +18,8 @@ */ package org.netbeans.modules.php.blade.editor; -import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; -import java.util.List; import java.util.Set; import javax.swing.text.BadLocationException; import org.antlr.v4.runtime.Token; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 index 628a8ffdd84b..fe3d90827d11 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 @@ -76,11 +76,11 @@ fragment SpecialChars : '°'; PHP_INLINE : '' | '' | EOF); -D_GENERIC_BLOCK_DIRECTIVES : ('@' DirectivesWithEndTag | '@sectionMissing' | '@hasSection') (' ')* {this._input.LA(1) == '('}? ->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); +D_GENERIC_BLOCK_DIRECTIVES : ('@' DirectivesWithEndTag | '@sectionMissing' | '@hasSection') (' ')* {this._input.LA(1) == '('}? ->pushMode(INSIDE_PHP_EXPRESSION),type(DIRECTIVE); D_GENERIC_INLINE_DIRECTIVES : ('@elseif' | Include | '@extends' | '@each' | '@yield' | '@props' | '@method' | '@class' | '@style' | '@aware' | '@break' | '@continue' | '@selected' | '@disabled' - | '@readonly' | '@required' | '@when' | '@bool') (' ')* {this._input.LA(1) == '('}? ->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); + | '@readonly' | '@required' | '@when' | '@bool') (' ')* {this._input.LA(1) == '('}? ->pushMode(INSIDE_PHP_EXPRESSION),type(DIRECTIVE); D_GENERIC_INLINE_MIXED_DIRECTIVES : ('@break' | '@continue')->type(DIRECTIVE); @@ -90,25 +90,25 @@ D_GENERIC_END_TAGS : ('@stop' | '@show' | '@overwrite' | '@viteReactRefresh' | ' D_VERBATIM : '@verbatim' ->pushMode(VERBATIM_MODE), type(DIRECTIVE); D_ENDVERBATIM : '@endverbatim'->type(DIRECTIVE); -D_MISC : ('@dd' | '@dump' | '@js' | '@json' | '@inject') (' ')* {this._input.LA(1) == '('}? ->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); +D_MISC : ('@dd' | '@dump' | '@js' | '@json' | '@inject') (' ')* {this._input.LA(1) == '('}? ->pushMode(INSIDE_PHP_EXPRESSION),type(DIRECTIVE); D_SIMPLE : ('@else' | '@csrf' | '@default' | '@append' | '@parent')->type(DIRECTIVE); //php emebeddings -D_PHP_SHORT : '@php' (' ')? {this._input.LA(1) == '('}? ->type(D_PHP),pushMode(LOOK_FOR_PHP_EXPRESSION); +D_PHP_SHORT : '@php' (' ')? {this._input.LA(1) == '('}? ->type(D_PHP),pushMode(INSIDE_PHP_EXPRESSION); D_PHP : '@php'->pushMode(BLADE_INLINE_PHP); //allow php expression highlight for custom directives which start with 'end' also -D_END_ARG : ('@end' NameString) (' ')* {this._input.LA(1) == '('}?->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); +D_END_ARG : ('@end' NameString) (' ')* {this._input.LA(1) == '('}?->pushMode(INSIDE_PHP_EXPRESSION),type(DIRECTIVE); D_END : ('@end' NameString)->type(DIRECTIVE); //known plugins D_LIVEWIRE : ('@livewireStyles' | '@bukStyles' | '@livewireScripts' | '@bukScripts' | '@click' ('.away')? '=')->type(DIRECTIVE); -D_ASSET_BUNDLER : '@vite' (' ')* {this._input.LA(1) == '('}? ->pushMode(LOOK_FOR_PHP_EXPRESSION),type(DIRECTIVE); +D_ASSET_BUNDLER : '@vite' (' ')* {this._input.LA(1) == '('}? ->pushMode(INSIDE_PHP_EXPRESSION),type(DIRECTIVE); D_CSS_AT_RULE : ('@supports' | '@container' | '@scope' | '@media') (' ')* {this._input.LA(1) == '('}? ->type(HTML); //we will decide that a custom directive has expression to avoid email matching -D_CUSTOM : ('@' NameString (' ')* {this._input.LA(1) == '('}? ) ->pushMode(LOOK_FOR_PHP_EXPRESSION); +D_CUSTOM : ('@' NameString (' ')* {this._input.LA(1) == '('}? ) ->pushMode(INSIDE_PHP_EXPRESSION); D_UNKNOWN : '@' NameString; @@ -165,28 +165,16 @@ RAW_ECHO_EXPR : ~[ !{}]+ {this.consumeNotEscapedEchoToken();}; RAW_ECHO_EXPR_MORE : . [ ]* {this.consumeNotEscapedEchoToken();}; EXIT_RAW_ECHO_EOF : EOF->type(ERROR),popMode; -// @directive ()? -mode LOOK_FOR_PHP_EXPRESSION; - -BLADE_PAREN : '(' {this.increaseRoundParenBalance();} ->pushMode(INSIDE_PHP_EXPRESSION); - -AFTER_DIRECTIVE : NameString->type(ERROR), popMode; -L_OTHER : . ->type(ERROR), popMode; - -// @directive (?) +// @directive ( ) mode INSIDE_PHP_EXPRESSION; -OPEN_EXPR_PAREN : {this.getRoundParenBalance() == 0}? '(' {this.increaseRoundParenBalance();} {this.consumeExprToken();}; -CLOSE_EXPR_PAREN : {this.getRoundParenBalance() <= 1}? ')' {this.resetRoundParenBalance();}->type(BLADE_PAREN),mode(DEFAULT_MODE); - -LPAREN : {this.getRoundParenBalance() > 0}? '(' {this.increaseRoundParenBalance();} {this.consumeExprToken();}; -RPAREN : {this.getRoundParenBalance() > 0}? ')' {this.decreaseRoundParenBalance();} {this.consumeExprToken();}; - -//in case of lexer restart context -EXIT_RPAREN : . {this._input.LA(1) == ')' && this.getRoundParenBalance() <= 1}?->type(PHP_EXPRESSION); +OPEN_PAREN : '(' {this.consumeOpenParen();}; +CLOSE_PAREN : ')' {this.consumeCloseParen();}; PHP_EXPRESSION_COMMENT : ('/*' .*? '*/')->skip; +WS_EXPRESSION_MORE : [ ]+ {this.consumeExprToken();}; + PHP_EXPRESSION_MORE : . {this.consumeExprToken();}; EXIT_EOF : EOF->type(ERROR),mode(DEFAULT_MODE); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 index c8519a118e8d..85101ddffb97 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 @@ -74,7 +74,8 @@ inline_directive: | stack | includeCond | each - | (D_INCLUDE_FIRST | D_CLASS | D_STYLE | D_METHOD | D_PROPS + | D_INCLUDE_FIRST BLADE_PARAM_LPAREN composedArgument BL_COMMA composedArgument BLADE_PARAM_RPAREN + | (D_CLASS | D_STYLE | D_METHOD | D_PROPS | D_DD | D_JS | D_JS | D_AWARE | D_HTML_ATTR_EXPR | D_CASE | D_JSON) composed_php_expression | (D_CSRF | D_LOOP_ACTION | D_BREAK | D_LIVEWIRE | D_DEFAULT) | asset_bundler diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java index 9b86fe5199eb..58199cdbe91a 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java @@ -120,9 +120,37 @@ public void consumeNotEscapedEchoToken() { this.more(); } } - - public void consumeExprToken(){ - this.more(); + + public void consumeExprToken() { + if (this._input.LA(1) == ')' && this.getRoundParenBalance() <= 1) { + this.setType(BladeAntlrColoringLexer.PHP_EXPRESSION); + } else { + this.more(); + } + } + + public void consumeOpenParen() { + this.increaseRoundParenBalance(); + if (this.roundParenBalance == 1) { + this.setType(BladeAntlrColoringLexer.BLADE_PAREN); + } else { + this.more(); + } + } + + public void consumeCloseParen() { + this.decreaseRoundParenBalance(); + if (this.roundParenBalance <= 0) { + this.resetRoundParenBalance(); + this.setType(BladeAntlrColoringLexer.BLADE_PAREN); + this.mode(DEFAULT_MODE); + } else { + if (this._input.LA(1) == ')' && this.roundParenBalance == 1) { + this.setType(BladeAntlrColoringLexer.PHP_EXPRESSION); + } else { + this.more(); + } + } } } From 7b80f2ba1833f23ec6e874cd0952270a21ad5902 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Sat, 22 Feb 2025 14:55:38 +0200 Subject: [PATCH 35/43] refactor part2 from personal plugin evolution --- php/php.blade/build.xml | 26 +- .../blade/csl/elements/DirectiveElement.java | 2 +- .../blade/csl/elements/PhpKeywordElement.java | 83 + .../php/blade/editor/BladeBracesMatcher.java | 281 -- .../php/blade/editor/BladeCommentHandler.java | 1 + .../blade/editor/BladeDeclarationFinder.java | 466 --- .../php/blade/editor/BladeLanguage.java | 1 + .../blade/editor/BladeSemanticAnalyzer.java | 7 +- .../php/blade/editor/FileSystemUtils.java | 53 + .../blade/editor/HyperlinkProviderImpl.java | 77 +- .../php/blade/editor/ResourceUtilities.java | 14 +- .../editor/braces/BladeBracesMatcher.java | 308 ++ .../completion/BladeCompletionBuilder.java | 56 - .../completion/BladeCompletionHandler.java | 325 +- .../completion/BladeCompletionItem.java | 358 -- .../completion/BladeCompletionProposal.java | 131 +- .../completion/BladeCompletionProvider.java | 299 -- .../BladePhpCompletionProvider.java | 362 -- .../DirectiveCompletionBuilder.java | 66 - .../completion/PhpCodeCompletionContext.java | 68 - .../completion/PhpCodeCompletionService.java | 454 +-- .../BladeHtmlCompletionProvider.java | 281 ++ .../AttributeCompletionService.java | 53 - .../editor/components/ComponentModel.java | 64 + .../ComponentsCompletionService.java | 60 - .../components/ComponentsQueryService.java | 153 + .../plugins/LivewireComponentResource.java | 28 + .../declaration/BladeDeclarationFinder.java | 579 +++ .../ComponentDeclarationService.java | 3 +- .../PhpElementsDeclarationService.java | 80 + .../editor/directives/CustomDirectives.java | 116 +- .../editor/hints/BladeHintsProvider.java | 25 +- .../php/blade/editor/hints/Bundle.properties | 27 + .../hints/PhpDirectiveSyntaxErrorRule.java | 81 + .../blade/editor/indexing/BladeIndexer.java | 70 +- .../blade/editor/indexing/IndexManager.java | 2 +- .../blade/editor/indexing/PhpIndexUtils.java | 209 +- .../blade/editor/lexer/BladeLexerUtils.java | 97 +- .../php/blade/editor/lexer/BladeTokenId.java | 31 +- .../navigator/DirectiveStructureItem.java | 125 + .../parser/BladeComponentTagOccurences.java | 52 + .../BladeCustomDirectiveOccurences.java | 66 + .../editor/parser/BladeDirectiveScope.java | 56 + .../editor/parser/BladeParserResult.java | 879 +---- .../parser/BladePhpExpressionOccurences.java | 100 + .../parser/BladeReferenceIdsCollection.java | 105 + .../php/blade/editor/parser/BladeScope.java | 59 + .../php/blade/editor/parser/ParsingUtils.java | 153 + .../listeners/CustomDirectivesListener.java | 48 + .../PhpExpressionOccurenceListener.java | 183 + .../parser/listeners/ReferenceIdListener.java | 113 + .../parser/listeners/ScopeListener.java | 94 + .../parser/listeners/StructureListener.java | 204 ++ .../php/blade/editor/path/BladePathUtils.java | 79 +- .../editor/ui/customizer/UIOptionsUtils.java | 40 + .../AssetsBundlerSupport.java} | 19 +- .../blade/project/BladeProjectProperties.java | 67 +- .../blade/project/BladeProjectSupport.java | 1 + .../php/blade/project/ComponentsSupport.java | 182 +- .../blade/syntax/BladeDirectivesUtils.java | 73 +- .../php/blade/syntax/BladeTagsUtils.java | 18 +- .../modules/php/blade/syntax/StringUtils.java | 10 +- .../php/blade/syntax/ViewPathUtils.java | 50 + .../blade/syntax/annotation/PhpKeyword.java | 31 + .../syntax/annotation/PhpKeywordRegister.java | 34 + .../html_components/BladeHtmlAntlrLexer.g4 | 52 + .../html_components/BladeHtmlAntlrLexer.java | 303 ++ .../html_components/BladeHtmlAntlrParser.g4 | 20 + .../html_components/BladeHtmlAntlrParser.java | 225 ++ .../BladeHtmlAntlrParserBaseListener.java | 74 + .../BladeHtmlAntlrParserListener.java | 40 + .../html_components/BladeHtmlAntlrUtils.java | 55 + .../antlr4/html_components/LexerAdaptor.java | 46 + .../syntax/antlr4/php/BladePhpAntlrLexer.g4 | 109 + .../syntax/antlr4/php/BladePhpAntlrLexer.java | 629 ++++ .../syntax/antlr4/php/BladePhpAntlrParser.g4 | 211 ++ .../antlr4/php/BladePhpAntlrParser.java | 3208 +++++++++++++++++ .../php/BladePhpAntlrParserBaseListener.java | 390 ++ .../php/BladePhpAntlrParserListener.java | 302 ++ .../syntax/antlr4/php/BladePhpAntlrUtils.java | 57 + .../syntax/antlr4/php/BladePhpCommonLexer.g4 | 88 + .../antlr4/php/BladePhpSnippetParser.java | 402 +++ .../blade/syntax/antlr4/php/LexerAdaptor.java | 53 + .../syntax/antlr4/php/ParserAdaptor.java | 45 + .../antlr4/utils/BaseBladeAntlrUtils.java | 131 + .../syntax/antlr4/v10/BladeAntlrLexer.g4 | 592 ++- .../syntax/antlr4/v10/BladeAntlrParser.g4 | 321 +- .../syntax/antlr4/v10/BladeAntlrUtils.java | 292 -- .../blade/syntax/antlr4/v10/LexerAdaptor.java | 126 +- .../php/blade/syntax/php/PhpKeywordList.java | 41 + .../{ => braces}/BladeBracesMatcherTest.java | 3 +- .../editor/parser/ParserPerformanceTest.java | 10 +- .../syntax/antlr4/php/BladePhpAntlrLexer.g4 | 73 + .../syntax/antlr4/php/BladePhpAntlrLexer.java | 629 ++++ .../syntax/antlr4/php/BladePhpAntlrParser.g4 | 175 + .../antlr4/php/BladePhpAntlrParser.java | 3208 +++++++++++++++++ .../php/BladePhpAntlrParserBaseListener.java | 390 ++ .../php/BladePhpAntlrParserListener.java | 302 ++ .../syntax/antlr4/php/BladePhpAntlrUtils.java | 57 + .../syntax/antlr4/php/BladePhpCommonLexer.g4 | 70 + .../antlr4/php/BladePhpSnippetParser.java | 346 ++ .../blade/syntax/antlr4/php/LexerAdaptor.java | 53 + .../syntax/antlr4/php/ParserAdaptor.java | 45 + 103 files changed, 16934 insertions(+), 4477 deletions(-) create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpKeywordElement.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/FileSystemUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/braces/BladeBracesMatcher.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionBuilder.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionBuilder.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionContext.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/providers/BladeHtmlCompletionProvider.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentModel.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsQueryService.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/components/plugins/LivewireComponentResource.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/BladeDeclarationFinder.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/PhpElementsDeclarationService.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/Bundle.properties create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/PhpDirectiveSyntaxErrorRule.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/DirectiveStructureItem.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeComponentTagOccurences.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeCustomDirectiveOccurences.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeDirectiveScope.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladePhpExpressionOccurences.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeReferenceIdsCollection.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeScope.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/CustomDirectivesListener.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/PhpExpressionOccurenceListener.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/ReferenceIdListener.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/ScopeListener.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/StructureListener.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UIOptionsUtils.java rename php/php.blade/src/org/netbeans/modules/php/blade/{editor/completion/DirectiveCompletionList.java => project/AssetsBundlerSupport.java} (68%) create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/ViewPathUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/PhpKeyword.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/PhpKeywordRegister.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrLexer.g4 create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrLexer.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParser.g4 create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParser.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParserBaseListener.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParserListener.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/LexerAdaptor.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.g4 create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.g4 create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserBaseListener.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserListener.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpCommonLexer.g4 create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpSnippetParser.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/LexerAdaptor.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/ParserAdaptor.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/utils/BaseBladeAntlrUtils.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/php/PhpKeywordList.java rename php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/{ => braces}/BladeBracesMatcherTest.java (97%) create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.g4 create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.g4 create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserBaseListener.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserListener.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrUtils.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpCommonLexer.g4 create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpSnippetParser.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/LexerAdaptor.java create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/ParserAdaptor.java diff --git a/php/php.blade/build.xml b/php/php.blade/build.xml index a5c7fe4e103d..0662dbc74675 100644 --- a/php/php.blade/build.xml +++ b/php/php.blade/build.xml @@ -25,31 +25,49 @@ - + + + - - + + + - + + + + + + + + + + + + + + + + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/DirectiveElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/DirectiveElement.java index 41f4a1db91ae..6d8eabac9cdf 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/DirectiveElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/DirectiveElement.java @@ -28,7 +28,7 @@ public class DirectiveElement extends NamedElement { public DirectiveElement(String name, FileObject file) { - super(name, file, ElementType.PATH); + super(name, file, ElementType.DIRECTIVE); } @Override diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpKeywordElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpKeywordElement.java new file mode 100644 index 000000000000..1a580dd2a133 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/PhpKeywordElement.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.csl.elements; + +import java.util.HashSet; +import java.util.Set; +import org.netbeans.modules.csl.api.ElementHandle; +import org.netbeans.modules.csl.api.ElementKind; +import org.netbeans.modules.csl.api.Modifier; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class PhpKeywordElement implements ElementHandle { + + private final String name; + + public PhpKeywordElement(String name){ + this.name = name; + } + + @Override + public String getName() { + return name; + } + + @Override + public FileObject getFileObject() { + return null; + } + + @Override + public String getMimeType() { + return BladeLanguage.MIME_TYPE; + } + + @Override + public String getIn() { + return null; + } + + @Override + public ElementKind getKind() { + return ElementKind.KEYWORD; + } + + @Override + public Set getModifiers() { + return new HashSet<>(); + } + + @Override + public boolean signatureEquals(ElementHandle handle) { + return name.equals(handle.getName()); + } + + @Override + public OffsetRange getOffsetRange(ParserResult pr) { + return OffsetRange.NONE; + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java deleted file mode 100644 index 764162d63403..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcher.java +++ /dev/null @@ -1,281 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.editor; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; -import javax.swing.text.BadLocationException; -import org.antlr.v4.runtime.Token; -import org.netbeans.api.annotations.common.CheckForNull; -import org.netbeans.api.annotations.common.NonNull; -import org.netbeans.api.editor.mimelookup.MimeRegistration; -import org.netbeans.editor.BaseDocument; -import org.netbeans.modules.php.blade.syntax.BladeDirectivesUtils; -import org.netbeans.modules.php.blade.syntax.BladeTagsUtils; -import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; -import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; -import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrUtils; -import org.netbeans.spi.editor.bracesmatching.BracesMatcher; -import org.netbeans.spi.editor.bracesmatching.BracesMatcherFactory; -import org.netbeans.spi.editor.bracesmatching.MatcherContext; - -/** - * brace matcher - block directives : @if @endif .. - output echo statements {{ - * }} {!! !!} - * - * @author bogdan - */ -public class BladeBracesMatcher implements BracesMatcher { - - public enum BraceDirectionType { - END_TO_START, START_TO_END, CUSTOM_START_TO_END, CURLY_END_TO_START, CURLY_START_TO_END, STOP, NONE - }; - private final MatcherContext context; - private Token originToken; - private BraceDirectionType currentDirection = BraceDirectionType.NONE; - - private BladeBracesMatcher(MatcherContext context) { - this.context = context; - } - - @Override - public int[] findOrigin() throws InterruptedException, BadLocationException { - int[] result = null; - originToken = null; - BaseDocument document = (BaseDocument) context.getDocument(); - document.readLock(); - try { - Token currentToken = BladeAntlrUtils.getToken(context.getDocument(), context.getSearchOffset()); - - if (currentToken == null) { - return result; - } - - if (!shouldLookForBraceMatch(currentToken)) { - return result; - } - - originToken = currentToken; - int start = currentToken.getStartIndex(); - int end = currentToken.getStopIndex(); - - String tokenText = originToken.getText(); - - if (!tokenText.startsWith("@") // NOI18N - && !tokenText.startsWith("{") // NOI18N - && !tokenText.endsWith("}")) // NOI18N - { - return result; - } - - currentDirection = findBraceDirectionType(tokenText, currentToken); - - if (currentDirection.equals(BraceDirectionType.STOP)) { - return result; - } - - result = new int[]{start, end + 1}; - } finally { - document.readUnlock(); - } - return result; - } - - @Override - public int[] findMatches() throws InterruptedException, BadLocationException { - if (originToken == null) { - return null; - } - - String tokenText = originToken.getText(); - - return switch (currentDirection) { - case CURLY_START_TO_END -> findCloseTag(); - case CURLY_END_TO_START -> findOpenTag(); - case START_TO_END -> findDirectiveEnd(tokenText); - case CUSTOM_START_TO_END -> findCustomDirectiveEnd(tokenText); - case END_TO_START -> findOriginForDirectiveEnd(tokenText); - case NONE, STOP -> null; - }; - } - - private static boolean shouldLookForBraceMatch(@NonNull Token currentToken) { - return switch (currentToken.getType()) { - case HTML, PHP_EXPRESSION, AT, BLADE_COMMENT, ERROR -> false; - default -> true; - }; - } - - private BraceDirectionType findBraceDirectionType(String tokenText, Token token) { - boolean isCloseTag = Arrays.asList(BladeTagsUtils.outputCloseTags()).indexOf(tokenText) >= 0; - - if (isCloseTag) { - return BraceDirectionType.CURLY_END_TO_START; - } - - boolean isStartTag = Arrays.asList(BladeTagsUtils.outputStartTags()).indexOf(tokenText) >= 0; - - if (isStartTag) { - return BraceDirectionType.CURLY_START_TO_END; - } - - if (tokenText.startsWith(BladeDirectivesUtils.END_DIRECTIVE_PREFIX) || - tokenText.equals(BladeDirectivesUtils.DIRECTIVE_SHOW)) { - return BraceDirectionType.END_TO_START; - } - - if (BladeDirectivesUtils.directiveStart2EndPair(tokenText) != null) { - return BraceDirectionType.START_TO_END; - } - - if (token.getType() == BladeAntlrLexer.D_CUSTOM - || token.getType() == BladeAntlrLexer.D_UNKNOWN) { - return BraceDirectionType.CUSTOM_START_TO_END; - } - - return BraceDirectionType.STOP; - } - - private int[] findOpenTag() { - int matchTokenType = BladeAntlrUtils.getTagPairTokenType(originToken.getType()); - Set skipableTokenTypes = new HashSet<>(); - skipableTokenTypes.add(HTML); - Token startToken = BladeAntlrUtils.findBackwardWithStop(context.getDocument(), - originToken, - matchTokenType, - skipableTokenTypes); - - if (startToken != null) { - int start = startToken.getStartIndex(); - int end = startToken.getStopIndex(); - return new int[]{start, end + 1}; - } - - return null; - } - - private int[] findCloseTag() { - int matchTokenType = BladeAntlrUtils.getTagPairTokenType(originToken.getType()); - Set skipableTokenTypes = new HashSet<>(); - skipableTokenTypes.add(HTML); - Token endToken = BladeAntlrUtils.findForwardWithStop(context.getDocument(), - originToken, - matchTokenType, - skipableTokenTypes); - - if (endToken != null) { - int start = endToken.getStartIndex(); - int end = endToken.getStopIndex(); - return new int[]{start, end + 1}; - } - - return null; - } - - @CheckForNull - private int[] findDirectiveEnd(String directive) { - String[] pair = BladeDirectivesUtils.directiveStart2EndPair(directive); - if (pair == null){ - return null; - } - Set startDirectiveForBalance = new HashSet<>(); - Set stopDirectives = Set.of(pair); - - for (String endDirective : pair) { - String[] startDirectives = BladeDirectivesUtils.directiveEnd2StartPair(endDirective); - - if (startDirectives != null) { - startDirectiveForBalance.addAll(Arrays.asList(startDirectives)); - } - } - - Token endToken = BladeAntlrUtils.findForward(context.getDocument(), - originToken, - stopDirectives, - startDirectiveForBalance); - - if (endToken != null) { - int start = endToken.getStartIndex(); - int end = endToken.getStopIndex(); - return new int[]{start, end + 1}; - } - - return null; - } - - @CheckForNull - private int[] findCustomDirectiveEnd(String directive) { - String endPrefix = BladeDirectivesUtils.END_DIRECTIVE_PREFIX; - String[] pair = new String[]{endPrefix + directive.substring(1)}; - Set stopDirectives = Set.of(pair); - Set startDirectiveForBalance = Set.of(directive); - - Token endToken = BladeAntlrUtils.findForward(context.getDocument(), - originToken, - stopDirectives, - startDirectiveForBalance); - - if (endToken != null) { - int start = endToken.getStartIndex(); - int end = endToken.getStopIndex(); - return new int[]{start, end + 1}; - } - - return null; - } - - @CheckForNull - private int[] findOriginForDirectiveEnd(String directive) { - String[] pair = BladeDirectivesUtils.directiveEnd2StartPair(directive); - Set endDirectivesForBalance = new HashSet<>(); - Set openDirectives = Set.of(pair); - - for (String startDirective : pair) { - String[] endDirectives = BladeDirectivesUtils.directiveStart2EndPair(startDirective); - - if (endDirectives != null) { - endDirectivesForBalance.addAll(Arrays.asList(endDirectives)); - } - } - - Token startToken = BladeAntlrUtils.findBackward(context.getDocument(), - originToken, - openDirectives, - endDirectivesForBalance); - - if (startToken != null) { - int start = startToken.getStartIndex(); - int end = startToken.getStopIndex(); - return new int[]{start, end + 1}; - } - - return null; - } - - @MimeRegistration(service = BracesMatcherFactory.class, mimeType = BladeLanguage.MIME_TYPE, position = 0) - public static final class Factory implements BracesMatcherFactory { - - @Override - public BracesMatcher createMatcher(MatcherContext context) { - return new BladeBracesMatcher(context); - } - - } -} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java index de2a4869e7a7..a360ec49483c 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeCommentHandler.java @@ -85,6 +85,7 @@ public void run() { case BLADE_DIRECTIVE -> { bounds[0] = ts.offset(); + //looking for directive arguments bounds if (ts.moveNext() && ts.token().id() == BladeTokenId.PHP_BLADE_EXPRESSION) { bounds[1] = ts.offset() + ts.token().length(); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java deleted file mode 100644 index e4e0f3ea78d9..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeDeclarationFinder.java +++ /dev/null @@ -1,466 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.editor; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.swing.text.BadLocationException; -import javax.swing.text.Document; -import org.antlr.v4.runtime.CharStreams; -import org.netbeans.api.project.Project; -import org.netbeans.modules.csl.api.DeclarationFinder; -import org.netbeans.modules.csl.api.OffsetRange; -import org.netbeans.modules.csl.spi.ParserResult; -import org.netbeans.editor.BaseDocument; -import org.netbeans.modules.csl.api.ElementHandle; -import org.netbeans.modules.csl.api.HtmlFormatter; -import org.netbeans.modules.php.blade.csl.elements.ElementType; -import org.netbeans.modules.php.blade.csl.elements.NamedElement; -import org.netbeans.modules.php.blade.csl.elements.PathElement; -import org.netbeans.modules.php.blade.csl.elements.PhpFunctionElement; -import org.netbeans.modules.php.blade.editor.declaration.ComponentDeclarationService; -import org.netbeans.modules.php.blade.editor.declaration.VitePathDeclarationService; -import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; -import org.netbeans.modules.php.blade.editor.directives.CustomDirectives.CustomDirective; -import org.netbeans.modules.php.blade.editor.indexing.BladeIndex; -import org.netbeans.modules.php.blade.editor.indexing.PhpIndexFunctionResult; -import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; -import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; -import org.netbeans.modules.php.blade.editor.indexing.QueryUtils; -import org.netbeans.modules.php.blade.editor.lexer.BladeLexerUtils; -import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; -import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.FieldAccessReference; -import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.Reference; -import org.netbeans.modules.php.blade.editor.path.BladePathUtils; -import org.netbeans.modules.php.blade.syntax.StringUtils; -import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; -import org.netbeans.spi.lexer.antlr4.AntlrTokenSequence; -import org.openide.filesystems.FileObject; -import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; -import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrUtils; -import org.netbeans.spi.project.ui.support.ProjectConvertors; -import org.openide.filesystems.FileUtil; - -/** - * focuses mainly on string inputs - * - * ?? TODO implement a Extension module - * - * @author bhaidu - */ -public class BladeDeclarationFinder implements DeclarationFinder { - - private int currentTokenId; - private String tokenText; - private static final Logger LOGGER = Logger.getLogger(BladeDeclarationFinder.class.getName()); - - @Override - public OffsetRange getReferenceSpan(Document document, int caretOffset) { - BaseDocument baseDoc = (BaseDocument) document; - - AntlrTokenSequence tokens = null; - OffsetRange offsetRange = OffsetRange.NONE; - tokenText = null; - int lineOffset = caretOffset; - - try { - String text = baseDoc.getText(0, baseDoc.getLength()); - tokens = new AntlrTokenSequence(new BladeAntlrLexer(CharStreams.fromString(text))); - } catch (BadLocationException ex) { - LOGGER.log(Level.WARNING, "Invalid offset: {0}", ex.offsetRequested()); // NOI18N - } - - if (tokens == null || tokens.isEmpty()) { - return offsetRange; - } - - tokens.seekTo(lineOffset); - - if (tokens.hasNext()) { - org.antlr.v4.runtime.Token nt = tokens.next().get(); - - switch (nt.getType()) { - case D_CUSTOM, PHP_IDENTIFIER, PHP_NAMESPACE_PATH -> { - return new OffsetRange(nt.getStartIndex(), nt.getStopIndex() + 1); - } - case HTML_COMPONENT_PREFIX -> { - //direct detection - currentTokenId = HTML_COMPONENT_PREFIX; - - if (nt.getText().length() <= 3) { - return offsetRange; - } - - tokenText = nt.getText(); - - return new OffsetRange(nt.getStartIndex() + 1, nt.getStopIndex() + 1); - } - } - - if (!tokens.hasPrevious()) { - return offsetRange; - } - - if (nt.getType() == BL_PARAM_STRING || nt.getType() == EXPR_STRING) { - Set tokensToMatch = BladeLexerUtils.TOKENS_WITH_IDENTIFIABLE_PARAM; - Set tokensStop = Set.of(HTML); - org.antlr.v4.runtime.Token matchedToken = BladeAntlrUtils.findBackward(tokens, tokensToMatch, tokensStop); - int offsetCorrection = caretOffset - lineOffset; - if (matchedToken != null) { - offsetRange = new OffsetRange(nt.getStartIndex() + offsetCorrection, nt.getStopIndex() + offsetCorrection + 1); - } - return offsetRange; - } - } - return offsetRange; - } - - @Override - public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) { - BladeParserResult parserResult = (BladeParserResult) info; - - FileObject currentFile = parserResult.getFileObject(); - DeclarationLocation location = DeclarationLocation.NONE; - - if (tokenText != null && currentTokenId == HTML_COMPONENT_PREFIX) { - String componentId = tokenText.substring(3); - String className = StringUtils.kebabToCamel(componentId); - ComponentDeclarationService componentComplervice = new ComponentDeclarationService(); - Collection indexedReferences = componentComplervice.queryComponents(className, currentFile); - - for (PhpIndexResult indexReference : indexedReferences) { - NamedElement resultHandle = new NamedElement(className, indexReference.declarationFile, ElementType.LARAVEL_COMPONENT); - DeclarationLocation constantLocation = new DeclarationFinder.DeclarationLocation(indexReference.declarationFile, indexReference.getStartOffset(), resultHandle); - if (location.equals(DeclarationLocation.NONE)) { - location = constantLocation; - } - location.addAlternative(new AlternativeLocationImpl(constantLocation)); - - if (!location.equals(DeclarationLocation.NONE)) { - FileObject resource = componentComplervice.getComponentResourceFile(componentId, indexReference.name, currentFile); - if (resource != null) { - PathElement resourceHandle = new PathElement(componentId, resource); - DeclarationLocation resourceLocation = new DeclarationFinder.DeclarationLocation(resource, indexReference.getStartOffset(), resourceHandle); - location.addAlternative(new AlternativeLocationImpl(resourceLocation)); - } - } - } - return location; - } - - FieldAccessReference fieldAccessReference = parserResult.findFieldAccessRefrence(caretOffset); - - if (fieldAccessReference != null) { - switch (fieldAccessReference.type) { - case STATIC_FIELD_ACCESS -> { - switch (fieldAccessReference.fieldType) { - case CONSTANT -> { - Collection indexConstantsResults = PhpIndexUtils.queryExactClassConstants(currentFile, fieldAccessReference.fieldName, fieldAccessReference.ownerClass.identifier); - for (PhpIndexResult indexResult : indexConstantsResults) { - NamedElement resultHandle = new NamedElement(fieldAccessReference.fieldName, indexResult.declarationFile, ElementType.PHP_CONSTANT); - DeclarationLocation constantLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); - if (location.equals(DeclarationLocation.NONE)) { - location = constantLocation; - } - location.addAlternative(new AlternativeLocationImpl(constantLocation)); - } - return location; - } - } - } - } - } - - Reference reference = parserResult.findOccuredRefrence(caretOffset); - - if (reference == null) { - return location; - } - - Project projectOwner = ProjectConvertors.getNonConvertorOwner(currentFile); - - if (projectOwner == null) { - return location; - } - - FileObject sourceFolder = projectOwner.getProjectDirectory(); - String referenceIdentifier = reference.identifier; - - switch (reference.type) { - case EXTENDS, INCLUDE, INCLUDE_IF, EACH, INCLUDE_COND -> { - String viewPath = referenceIdentifier; - List includedFiles = BladePathUtils.findFileObjectsForBladeViewPath(currentFile, viewPath); - - if (includedFiles.isEmpty()) { - return DeclarationLocation.NONE; - } - - for (FileObject includedFile : includedFiles) { - PathElement elHandle = new PathElement(referenceIdentifier, includedFile); - DeclarationLocation dln = new DeclarationFinder.DeclarationLocation(includedFile, 0, elHandle); - if (location.equals(DeclarationLocation.NONE)) { - location = dln; - } - location.addAlternative(new AlternativeLocationImpl(dln)); - } - return location; - } - case SECTION, HAS_SECTION, SECTION_MISSING -> { - String yieldId = referenceIdentifier; - List yields = QueryUtils.findYieldReferences(yieldId, currentFile); - if (yields == null) { - return DeclarationLocation.NONE; - } - - for (BladeIndex.IndexedReference yieldReference : yields) { - String yieldReferenceId = yieldReference.getReference().identifier; - NamedElement yieldIdHandle = new NamedElement(yieldReferenceId, - yieldReference.getOriginFile(), ElementType.YIELD_ID); - int startOccurence = yieldReference.getReference().defOffset.getStart(); - DeclarationLocation dlyieldItem = new DeclarationFinder.DeclarationLocation(yieldReference.getOriginFile(), startOccurence, yieldIdHandle); - if (location.equals(DeclarationLocation.NONE)) { - location = dlyieldItem; - } - location.addAlternative(new AlternativeLocationImpl(dlyieldItem)); - } - - return location; - } - case PUSH, PUSH_IF, PREPEND -> { - String stackId = referenceIdentifier; - List stacks = QueryUtils.findStacksReferences(stackId, currentFile); - - if (stacks == null) { - return DeclarationLocation.NONE; - } - - for (BladeIndex.IndexedReference stackReference : stacks) { - String stackReferenceId = stackReference.getReference().identifier; - NamedElement yieldIdHandle = new NamedElement(stackReferenceId, stackReference.getOriginFile(), ElementType.STACK_ID); - int startOccurence = stackReference.getReference().defOffset.getStart(); - DeclarationLocation dlstack = new DeclarationFinder.DeclarationLocation(stackReference.getOriginFile(), startOccurence, yieldIdHandle); - if (location.equals(DeclarationLocation.NONE)) { - location = dlstack; - } - location.addAlternative(new AlternativeLocationImpl(dlstack)); - } - - return location; - } - case CUSTOM_DIRECTIVE -> { - String directiveNameFound = reference.identifier; - DeclarationLocation dlcustomDirective = DeclarationLocation.NONE; - - CustomDirectives.getInstance(projectOwner).filterAction(new CustomDirectives.FilterCallbackDeclaration(dlcustomDirective) { - @Override - public void filterDirectiveName(CustomDirective directive, FileObject file) { - if (directive.getName().equals(directiveNameFound)) { - NamedElement customDirectiveHandle = new NamedElement(directiveNameFound, file, ElementType.CUSTOM_DIRECTIVE); - DeclarationFinder.DeclarationLocation newLoc = new DeclarationFinder.DeclarationLocation(file, directive.getOffset(), customDirectiveHandle); - this.location.addAlternative(new AlternativeLocationImpl(newLoc)); - } - } - }); - - if (!dlcustomDirective.getAlternativeLocations().isEmpty()) { - for (AlternativeLocation loc : dlcustomDirective.getAlternativeLocations()) { - dlcustomDirective = loc.getLocation(); - } - } - return dlcustomDirective; - } - case PHP_CLASS -> { - Collection indexClassResults; - String namespace = reference.namespace; - - if (namespace != null && reference.namespace.length() > 2) { - indexClassResults = PhpIndexUtils.queryExactNamespaceClasses(reference.identifier, - EditorStringUtils.trimNamespace(namespace), - sourceFolder - ); - } else { - indexClassResults = PhpIndexUtils.queryExactClass(sourceFolder, reference.identifier); - } - - for (PhpIndexResult indexResult : indexClassResults) { - NamedElement resultHandle = new NamedElement(referenceIdentifier, indexResult.declarationFile, ElementType.PHP_CLASS); - DeclarationLocation classLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); - if (location.equals(DeclarationLocation.NONE)) { - location = classLocation; - } - location.addAlternative(new AlternativeLocationImpl(classLocation)); - } - return location; - } - case PHP_METHOD -> { - if (reference.ownerClass == null) { - return location; - } - String queryNamespace = reference.namespace; - - if (queryNamespace != null && queryNamespace.length() > 2) { - queryNamespace = EditorStringUtils.trimNamespace(queryNamespace); - } else { - queryNamespace = null; - } - Collection indexMethodResults = PhpIndexUtils.queryExactClassMethods(sourceFolder, - referenceIdentifier, reference.ownerClass, queryNamespace); - - for (PhpIndexFunctionResult indexResult : indexMethodResults) { - PhpFunctionElement resultHandle = new PhpFunctionElement( - referenceIdentifier, - indexResult.declarationFile, - ElementType.PHP_FUNCTION, - indexResult.getClassNamespace(), - indexResult.getParams() - ); - DeclarationLocation functionLocation = new DeclarationFinder.DeclarationLocation( - indexResult.declarationFile, - indexResult.getStartOffset(), resultHandle); - if (location.equals(DeclarationLocation.NONE)) { - location = functionLocation; - } - location.addAlternative(new AlternativeLocationImpl(functionLocation)); - } - return location; - } - case PHP_FUNCTION -> { - Collection indexResults = PhpIndexUtils.queryExactFunctions(sourceFolder, reference.identifier); - - for (PhpIndexFunctionResult indexResult : indexResults) { - PhpFunctionElement resultHandle = new PhpFunctionElement( - referenceIdentifier, - indexResult.declarationFile, - ElementType.PHP_FUNCTION, - indexResult.getParams() - ); - DeclarationLocation functionLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); - if (location.equals(DeclarationLocation.NONE)) { - location = functionLocation; - } - location.addAlternative(new AlternativeLocationImpl(functionLocation)); - } - return location; - } - case PHP_CONSTANT -> { - Collection indexConstantsResults = PhpIndexUtils.queryExactConstants(sourceFolder, reference.identifier); - - for (PhpIndexResult indexResult : indexConstantsResults) { - NamedElement resultHandle = new NamedElement(referenceIdentifier, indexResult.declarationFile, ElementType.PHP_CONSTANT); - DeclarationLocation constantLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); - if (location.equals(DeclarationLocation.NONE)) { - location = constantLocation; - } - location.addAlternative(new AlternativeLocationImpl(constantLocation)); - } - return location; - } - case USE, INJECT, PHP_NAMESPACE_PATH_TYPE -> { - Collection indexNamespaceResults; - if (reference.namespace != null) { - indexNamespaceResults = PhpIndexUtils.queryExactNamespaceClasses(reference.identifier, - EditorStringUtils.trimNamespace(reference.namespace), - sourceFolder - ); - for (PhpIndexResult indexResult : indexNamespaceResults) { - NamedElement resultHandle = new NamedElement(referenceIdentifier, indexResult.declarationFile, ElementType.PHP_CLASS); - DeclarationLocation classLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); - if (location.equals(DeclarationLocation.NONE)) { - location = classLocation; - } - location.addAlternative(new AlternativeLocationImpl(classLocation)); - } - } else { - indexNamespaceResults = PhpIndexUtils.queryNamespace(sourceFolder, reference.identifier); - - for (PhpIndexResult indexResult : indexNamespaceResults) { - NamedElement resultHandle = new NamedElement(referenceIdentifier, indexResult.declarationFile, ElementType.PHP_NAMESPACE); - DeclarationLocation constantLocation = new DeclarationFinder.DeclarationLocation( - indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); - if (location.equals(DeclarationLocation.NONE)) { - location = constantLocation; - } - location.addAlternative(new AlternativeLocationImpl(constantLocation)); - } - } - return location; - } - case VITE_PATH -> { - VitePathDeclarationService vitePathDeclService = new VitePathDeclarationService(sourceFolder); - FileObject viteAssetFile = vitePathDeclService.findFileObject(referenceIdentifier); - if (viteAssetFile == null || !viteAssetFile.isValid()) { - return location; - } - NamedElement resultHandle = new NamedElement(referenceIdentifier, viteAssetFile, ElementType.ASSET_FILE); - DeclarationLocation constantLocation = new DeclarationFinder.DeclarationLocation(viteAssetFile, 0, resultHandle); - if (location.equals(DeclarationLocation.NONE)) { - location = constantLocation; - } - location.addAlternative(new AlternativeLocationImpl(constantLocation)); - return location; - } - } - - return DeclarationLocation.NONE; - } - - private static class AlternativeLocationImpl implements AlternativeLocation { - - private final DeclarationLocation location; - - public AlternativeLocationImpl(DeclarationLocation location) { - this.location = location; - } - - @Override - public ElementHandle getElement() { - return getLocation().getElement(); - } - - @Override - public String getDisplayHtml(HtmlFormatter formatter) { - ElementHandle el = getLocation().getElement(); - if (el != null) { - formatter.appendText(el.getName()); - if (el.getFileObject() != null) { - formatter.appendText(" in "); // NOI18N - formatter.appendText(FileUtil.getFileDisplayName(el.getFileObject())); - } - return formatter.getText(); - } - return getLocation().toString(); - } - - @Override - public DeclarationFinder.DeclarationLocation getLocation() { - return location; - } - - @Override - public int compareTo(DeclarationFinder.AlternativeLocation o) { - return 0; - } - - } -} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java index d20626376cb5..b2a4b1b28c8e 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeLanguage.java @@ -18,6 +18,7 @@ */ package org.netbeans.modules.php.blade.editor; +import org.netbeans.modules.php.blade.editor.declaration.BladeDeclarationFinder; import org.netbeans.modules.php.blade.editor.hints.BladeHintsProvider; import org.netbeans.api.lexer.Language; import org.netbeans.modules.parsing.spi.Parser; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeSemanticAnalyzer.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeSemanticAnalyzer.java index 7d69ad749b68..ac34e485cac6 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeSemanticAnalyzer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/BladeSemanticAnalyzer.java @@ -30,7 +30,6 @@ import org.netbeans.modules.parsing.spi.SchedulerEvent; import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; -import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.Reference; import org.netbeans.modules.php.blade.project.ProjectUtils; import org.openide.filesystems.FileObject; @@ -87,8 +86,10 @@ public void run(BladeParserResult parserResult, SchedulerEvent event) { FileObject fo = parserResult.getFileObject(); Project project = ProjectUtils.getMainOwner(fo); CustomDirectives ct = CustomDirectives.getInstance(project); - for (Map.Entry entry : parserResult.customDirectivesReferences.entrySet()) { - if (entry.getValue().type == BladeParserResult.ReferenceType.POSSIBLE_DIRECTIVE && ct.customDirectiveConfigured(entry.getValue().identifier) ) { + + //highlight custom directives which are not found in the project configuration + for (Map.Entry entry : parserResult.getBladeCustomDirectiveOccurences().getAll().entrySet()) { + if (ct.customDirectiveConfigured(entry.getValue()) ) { highlights.put(entry.getKey(), CUSTOM_DIRECTIVE_SET); continue; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/FileSystemUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/FileSystemUtils.java new file mode 100644 index 000000000000..239c3ba57228 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/FileSystemUtils.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor; + +import javax.swing.text.Document; +import org.netbeans.api.project.Project; +import org.netbeans.modules.editor.NbEditorUtilities; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.openide.filesystems.FileObject; +import org.openide.loaders.DataObject; + +/** + * + * @author bogdan + */ +public final class FileSystemUtils { + + private FileSystemUtils() { + + } + + public static FileObject getFileObjectFromDoc(Document doc) { + DataObject dObject = NbEditorUtilities.getDataObject(doc); + if (dObject != null) { + return dObject.getPrimaryFile().getParent(); + } + return null; + } + + public static Project getProjectOwner(Document doc) { + FileObject file = getFileObjectFromDoc(doc); + if (file == null){ + return null; + } + return ProjectUtils.getMainOwner(file); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java index a8cc5b2fda94..d6fe93fc5091 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java @@ -19,7 +19,9 @@ package org.netbeans.modules.php.blade.editor; import java.io.IOException; +import java.util.Arrays; import java.util.EnumSet; +import java.util.HashSet; import java.util.List; import java.util.Set; import javax.swing.text.Document; @@ -33,6 +35,7 @@ import org.netbeans.api.lexer.TokenSequence; import org.netbeans.api.project.Project; import org.netbeans.editor.BaseDocument; +import static org.netbeans.lib.editor.hyperlink.spi.HyperlinkType.GO_TO_DECLARATION; import org.netbeans.modules.php.api.util.FileUtils; import org.netbeans.modules.php.blade.editor.lexer.PHPLexerUtils; import org.netbeans.modules.php.blade.editor.path.BladePathUtils; @@ -46,7 +49,7 @@ /** * Similar to a declaration finder - * causes ordinal error + * * * @author bhaidu */ @@ -58,7 +61,11 @@ public class HyperlinkProviderImpl implements HyperlinkProviderExt { private String tooltipText = ""; // NOI18N private FileObject goToFile; private int goToOffset = 0; - public static final String FILE_TITLE = "Blade Template File"; + public static final int MIN_STRING_IDENTIIFER_LENGTH = 5; + public static final String FILE_TITLE = "Blade Template File"; // NOI18N + + String[] viewMethods = new String[]{"view", "render", "make"}; // NOI18N + Set viewMethodSet = new HashSet<>(Arrays.asList(viewMethods)); public enum DeclarationType { VIEW_PATH; @@ -106,7 +113,7 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { //2 char config are not that relevant //2 qoute char an 3 char minimum length text - if (focusedText.length() < 5 || !EditorStringUtils.isQuotedString(focusedText)) { + if (focusedText.length() < MIN_STRING_IDENTIIFER_LENGTH || !EditorStringUtils.isQuotedString(focusedText)) { return null; } @@ -124,30 +131,25 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { if (prevTokenId != null && id.equals(PHPTokenId.PHP_STRING)) { methodName = text; //tooltip text - switch (methodName) { - case "view", "make", "render" -> { // NOI18N - FileObject currentFile = EditorUtils.getFileObject(doc); - - if (currentFile == null) { - return null; - } - List includedFiles = BladePathUtils.findFileObjectsForBladeViewPath(currentFile, identifiableText); - String viewPath = BladePathUtils.toBladeToProjectFilePath(identifiableText); - - for (FileObject includedFile : includedFiles) { - goToFile = includedFile; - tooltipText = FILE_TITLE - + " : " + viewPath // NOI18N - + "

      " + identifiableText + ""; // NOI18N - goToOffset = 0; - break; - } - - return new int[]{startOffset, startOffset + currentToken.length()}; - } - default -> { + if (viewMethodSet.contains(methodName)) { + FileObject currentFile = EditorUtils.getFileObject(doc); + + if (currentFile == null) { return null; } + List includedFiles = BladePathUtils.findFileObjectsForBladeViewPath(currentFile, identifiableText); + String viewPath = BladePathUtils.toBladeToProjectFilePath(identifiableText); + + for (FileObject includedFile : includedFiles) { + goToFile = includedFile; + tooltipText = FILE_TITLE + + " : " + viewPath // NOI18N + + "

      " + identifiableText + ""; // NOI18N + goToOffset = 0; + break; + } + + return new int[]{startOffset, startOffset + currentToken.length()}; } } @@ -160,25 +162,12 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { @Override public void performClickAction(Document doc, int offset, HyperlinkType type) { - switch (type) { - case GO_TO_DECLARATION -> { - switch (methodName) { - case "view", "make", "render" -> // NOI18N - { - if (goToFile != null) { - openDocument(goToFile, goToOffset); - } - } - default -> { - //no-op - } - } - } - case ALT_HYPERLINK -> { - JTextComponent focused = EditorRegistry.focusedComponent(); - if (focused != null && focused.getDocument() == doc) { - focused.setCaretPosition(offset); - } + if (!type.equals(GO_TO_DECLARATION)) { + return; + } + if (viewMethodSet.contains(methodName)) { + if (goToFile != null) { + openDocument(goToFile, goToOffset); } } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java index da54f586d1c4..54fc509913a6 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ResourceUtilities.java @@ -34,18 +34,22 @@ public final class ResourceUtilities { public static final String BLADE_VIEW = ICON_BASE + "icons/blade_file.png"; //NOI18N public static final String LAYOUT_IDENTIFIER = ICON_BASE + "icons/layout.png"; //NOI18N public static final String COMPONENT_TAG = "org/netbeans/modules/html/custom/resources/custom_html_element.png"; //NOI18N - + public static final String CSS_FILE = "org/netbeans/modules/css/visual/resources/style_sheet_16.png"; //NOI18N + public static final String JS_FILE = "org/netbeans/modules/css/visual/resources/javascript.png"; //NOI18N + public static final String CUSTOM_HTML_ICON = "org/netbeans/modules/html/custom/resources/custom_html_element.png"; //NOI18N + public static final String XML_ATTRIBUTE_ICON = "org/netbeans/modules/xml/schema/completion/resources/attribute.png"; //NOI18N + private ResourceUtilities() { - + } @CheckForNull - public static ImageIcon loadResourceIcon(String path){ + public static ImageIcon loadResourceIcon(String path) { return ImageUtilities.loadImageIcon(ICON_BASE + path, false); } - + @CheckForNull - public static ImageIcon loadLayoutIcon(){ + public static ImageIcon loadLayoutIcon() { return ImageUtilities.loadImageIcon(LAYOUT_IDENTIFIER, false); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/braces/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/braces/BladeBracesMatcher.java new file mode 100644 index 000000000000..d21b77a2af9e --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/braces/BladeBracesMatcher.java @@ -0,0 +1,308 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.braces; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import javax.swing.text.BadLocationException; +import org.antlr.v4.runtime.Token; +import org.netbeans.api.editor.mimelookup.MimeRegistration; +import org.netbeans.api.lexer.TokenHierarchy; +import org.netbeans.api.project.Project; +import org.netbeans.editor.BaseDocument; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.modules.php.blade.editor.FileSystemUtils; +import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; +import org.netbeans.modules.php.blade.editor.directives.CustomDirectives.CustomDirective; +import org.netbeans.modules.php.blade.editor.lexer.BladeLexerUtils; +import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; +import org.netbeans.modules.php.blade.syntax.BladeDirectivesUtils; +import static org.netbeans.modules.php.blade.syntax.BladeDirectivesUtils.END_DIRECTIVE_PREFIX; +import org.netbeans.modules.php.blade.syntax.BladeTagsUtils; +import org.netbeans.modules.php.blade.syntax.antlr4.utils.BaseBladeAntlrUtils; +import static org.netbeans.modules.php.blade.syntax.BladeTagsUtils.*; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexerUtils; +import org.netbeans.spi.editor.bracesmatching.BracesMatcher; +import org.netbeans.spi.editor.bracesmatching.BracesMatcherFactory; +import org.netbeans.spi.editor.bracesmatching.MatcherContext; +import org.netbeans.spi.lexer.antlr4.AntlrTokenSequence; + +/** + * brace matcher - block directives : @if @endif .. - output echo statements {{ + * }} {!! !!} + * + * @author bogdan + */ +public class BladeBracesMatcher implements BracesMatcher { + + public enum BraceDirectionType { + BLOCK_DIRECTIVE_END_TO_START, BLOCK_DIRECTIVE_START_TO_END, + CUSTOM_START_TO_END, CUSTOM_END_TO_START, + CURLY_END_TO_START, CURLY_START_TO_END, STOP + } + private final MatcherContext context; + private String tokenText; + private int tokenOffset; + private BraceDirectionType currentDirection; + + private BladeBracesMatcher(MatcherContext context) { + this.context = context; + } + + @Override + public int[] findOrigin() throws InterruptedException, BadLocationException { + int[] result = null; + tokenText = null; + tokenOffset = context.getSearchOffset(); + BaseDocument document = (BaseDocument) context.getDocument(); + document.readLock(); + try { + TokenHierarchy th = TokenHierarchy.get(document); + org.netbeans.api.lexer.Token token = BladeLexerUtils.getBladeToken(th, context.getSearchOffset()); + + if (token == null) { + return result; + } + + BladeTokenId id = token.id(); + tokenOffset = token.offset(th); + + switch (id) { + case BLADE_DIRECTIVE: { + tokenText = token.text().toString().trim(); + currentDirection = findDirectiveBlockDirectionType(tokenText); + if (currentDirection.equals(BraceDirectionType.STOP)) { + return result; + } + return new int[]{tokenOffset, tokenOffset + token.length()}; + } + case BLADE_ECHO_DELIMITOR: { + tokenText = token.text().toString().trim(); + currentDirection = isStartTag(tokenText) ? BraceDirectionType.CURLY_START_TO_END : BraceDirectionType.CURLY_END_TO_START; + return new int[]{tokenOffset, tokenOffset + token.length()}; + } + case BLADE_CUSTOM_DIRECTIVE: { + tokenText = token.text().toString().trim(); + Project projectOwner = FileSystemUtils.getProjectOwner(document); + if (projectOwner == null) { + return result; + } + CustomDirectives customDirectives = CustomDirectives.getInstance(projectOwner); + if (customDirectives == null) { + return result; + } + for (List directiveCollection : customDirectives.getCustomDirectives().values()) { + for (CustomDirective customDirective : directiveCollection) { + if (customDirective.isBlockDirective() + && tokenText.equals(customDirective.getName())) { + currentDirection = BraceDirectionType.CUSTOM_START_TO_END; + return new int[]{tokenOffset, tokenOffset + token.length()}; + } + } + } + return result; + } + } + } finally { + document.readUnlock(); + } + return result; + } + + @Override + public int[] findMatches() throws InterruptedException, BadLocationException { + int[] result = null; + + if (tokenText == null) { + return result; + } + + return switch (currentDirection) { + case BLOCK_DIRECTIVE_START_TO_END -> findBlockDirectiveEnd(tokenText); + case BLOCK_DIRECTIVE_END_TO_START -> findBlockDirectiveStart(tokenText); + case CUSTOM_START_TO_END -> findCustomDirectiveEnd(tokenText); + case CUSTOM_END_TO_START -> findCustomDirectiveStart(tokenText); + case CURLY_START_TO_END -> findCloseTag(); + case CURLY_END_TO_START -> findOpenTag(); + default -> result; + }; + } + + private int[] findBlockDirectiveEnd(String directive) { + String[] endings = BladeDirectivesUtils.blockDirectiveEndings(directive); + + if (endings == null) { + return null; + } + + Set openingDirectives = BladeDirectivesUtils.blockDirectiveOpeningsSet(endings); + Set endDirectives = new HashSet<>(Arrays.asList(endings)); + + int searchOffset = tokenOffset + tokenText.length() + 1; + AntlrTokenSequence ats = BladeAntlrLexerUtils.getTokens(context.getDocument()); + + Token endToken = BaseBladeAntlrUtils.findForward(ats, + searchOffset, + endDirectives, + openingDirectives); + + return outputRange(endToken); + } + + private int[] findBlockDirectiveStart(String directive) { + String[] openings = BladeDirectivesUtils.blockDirectiveOpenings(directive); + + if (openings == null) { + if (!directive.startsWith(END_DIRECTIVE_PREFIX)) { + return null; + } + Project projectOwner = FileSystemUtils.getProjectOwner(context.getDocument()); + if (projectOwner == null) { + return null; + } + CustomDirectives customDirectives = CustomDirectives.getInstance(projectOwner); + if (customDirectives == null) { + return null; + } + String startTag = BladeDirectivesUtils.AT + directive.substring(END_DIRECTIVE_PREFIX.length()); // NOI18N + for (List directiveCollection : customDirectives.getCustomDirectives().values()) { + for (CustomDirective customDirective : directiveCollection) { + if (customDirective.isBlockDirective() + && startTag.equals(customDirective.getName())) { + openings = new String[]{startTag}; + break; + } + } + } + if (openings == null) { + return null; + } + } + + Set endDirectivesForBalance = BladeDirectivesUtils.blockDirectiveEndingsSet(openings); + Set openDirectives = new HashSet<>(Arrays.asList(openings)); + + int searchOffset = tokenOffset - 1; + AntlrTokenSequence ats = BladeAntlrLexerUtils.getTokens(context.getDocument()); + + Token startToken = BaseBladeAntlrUtils.findBackward(ats, + searchOffset, + openDirectives, + endDirectivesForBalance); + + return outputRange(startToken); + } + + public int[] findOpenTag() { + AntlrTokenSequence ats = BladeAntlrLexerUtils.getTokens(context.getDocument()); + String matchText = tokenText.equals(CONTENT_TAG_CLOSE) ? CONTENT_TAG_OPEN : RAW_TAG_OPEN; + int searchOffset = tokenOffset + tokenText.length() + 1; + Token startToken = BladeAntlrLexerUtils.findBackward(ats, + searchOffset, + new HashSet<>(Arrays.asList(matchText)), + new HashSet<>()); + + return outputRange(startToken); + } + + public int[] findCloseTag() { + AntlrTokenSequence ats = BladeAntlrLexerUtils.getTokens(context.getDocument()); + String matchText = tokenText.equals(CONTENT_TAG_OPEN) ? CONTENT_TAG_CLOSE : RAW_TAG_CLOSE; + int searchOffset = tokenOffset - 1; + Token endToken = BladeAntlrLexerUtils.findForward(ats, + searchOffset, + new HashSet<>(Arrays.asList(matchText)), + new HashSet<>()); + + return outputRange(endToken); + } + + public int[] findCustomDirectiveEnd(String directive) { + String[] pair = new String[]{BladeDirectivesUtils.END_DIRECTIVE_PREFIX + directive.substring(1)}; + Set stopDirectives = new HashSet<>(Arrays.asList(pair)); + Set startDirectiveForBalance = new HashSet<>(); + startDirectiveForBalance.add(directive); + + AntlrTokenSequence ats = BladeAntlrLexerUtils.getTokens(context.getDocument()); + int searchOffset = tokenOffset - 1; + Token endToken = BaseBladeAntlrUtils.findForward(ats, + searchOffset, + stopDirectives, + startDirectiveForBalance); + + return outputRange(endToken); + } + + public int[] findCustomDirectiveStart(String directive) { + int endTextLength = BladeDirectivesUtils.END_DIRECTIVE_PREFIX.length(); + String[] pair = new String[]{directive.substring(endTextLength)}; + Set stopDirectives = new HashSet<>(Arrays.asList(pair)); + Set startDirectiveForBalance = new HashSet<>(); + startDirectiveForBalance.add(directive); + + AntlrTokenSequence ats = BladeAntlrLexerUtils.getTokens(context.getDocument()); + int searchOffset = tokenOffset + tokenText.length() + 1; + Token endToken = BaseBladeAntlrUtils.findBackward(ats, + searchOffset, + stopDirectives, + startDirectiveForBalance); + + return outputRange(endToken); + } + + private boolean isStartTag(String tag) { + return Arrays.asList(BladeTagsUtils.outputStartTags()).indexOf(tag) >= 0; + } + + private BraceDirectionType findDirectiveBlockDirectionType(String tokenText) { + if (tokenText.startsWith(BladeDirectivesUtils.END_DIRECTIVE_PREFIX) + || tokenText.equals(BladeDirectivesUtils.DIRECTIVE_SHOW) + || tokenText.equals(BladeDirectivesUtils.DIRECTIVE_ELSEIF) + || tokenText.equals(BladeDirectivesUtils.DIRECTIVE_ELSE)) { + return BraceDirectionType.BLOCK_DIRECTIVE_END_TO_START; + } else if (BladeDirectivesUtils.blockDirectiveEndings(tokenText) != null) { + return BraceDirectionType.BLOCK_DIRECTIVE_START_TO_END; + } + + return BraceDirectionType.STOP; + } + + private int[] outputRange(Token token) { + if (token != null) { + String rangeTokenText = token.getText().trim(); + int start = token.getStartIndex(); + int end = start + rangeTokenText.length(); + return new int[]{start, end}; + } + + return null; + } + + @MimeRegistration(service = BracesMatcherFactory.class, mimeType = BladeLanguage.MIME_TYPE, position = 110) + public static final class Factory implements BracesMatcherFactory { + + @Override + public BracesMatcher createMatcher(MatcherContext context) { + return new BladeBracesMatcher(context); + } + + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionBuilder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionBuilder.java deleted file mode 100644 index b16ea8e5d3e0..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionBuilder.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.editor.completion; - -/** - * - * @author bogdan - */ -public class BladeCompletionBuilder { - - //----------- Factory methods -------------- - public static BladeCompletionItem createTag(String name, int substitutionOffset) { - return new BladeCompletionItem.BladeTag(name, substitutionOffset); - } - - public static BladeCompletionItem createViewPath(String name, - int substitutionOffset, boolean isFolder, String path) { - return new BladeCompletionItem.ViewPath(name, substitutionOffset, isFolder, path); - } - - public static BladeCompletionItem createInlineDirective(String directive, - int substitutionOffset, String description) { - return new BladeCompletionItem.InlineDirective(directive, substitutionOffset, description); - } - - public static BladeCompletionItem createDirectiveWithArg(String directive, - int substitutionOffset, String description) { - return new BladeCompletionItem.DirectiveWithArg(directive, substitutionOffset, description); - } - - public static BladeCompletionItem createBlockDirective(String directive, - String endTag, int substitutionOffset, String description) { - return new BladeCompletionItem.BlockDirective(directive, endTag, substitutionOffset, description); - } - - public static BladeCompletionItem createBlockDirectiveWithArg(String directive, - String endTag, int substitutionOffset, String description) { - return new BladeCompletionItem.BlockDirectiveWithArg(directive, endTag, substitutionOffset, description); - } -} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java index 10997bd3751f..377d8afdd6f5 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionHandler.java @@ -18,6 +18,7 @@ */ package org.netbeans.modules.php.blade.editor.completion; +import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -28,8 +29,9 @@ import org.netbeans.editor.BaseDocument; import javax.swing.text.Document; import javax.swing.text.JTextComponent; -import org.antlr.v4.runtime.Token; import org.netbeans.api.annotations.common.NonNull; +import org.netbeans.api.lexer.TokenHierarchy; +import org.netbeans.api.lexer.TokenSequence; import org.netbeans.api.project.Project; import org.netbeans.modules.csl.api.CodeCompletionContext; import org.netbeans.modules.csl.api.CodeCompletionHandler; @@ -38,6 +40,7 @@ import org.netbeans.modules.csl.api.CompletionProposal; import org.netbeans.modules.csl.api.Documentation; import org.netbeans.modules.csl.api.ElementHandle; +import org.netbeans.modules.csl.api.OffsetRange; import org.netbeans.modules.csl.api.ParameterInfo; import org.netbeans.modules.csl.spi.DefaultCompletionResult; import org.netbeans.modules.csl.spi.ParserResult; @@ -45,20 +48,26 @@ import org.netbeans.modules.php.blade.csl.elements.DirectiveElement; import org.netbeans.modules.php.blade.csl.elements.ElementType; import org.netbeans.modules.php.blade.csl.elements.NamedElement; +import org.netbeans.modules.php.blade.csl.elements.PathElement; import org.netbeans.modules.php.blade.csl.elements.PhpFunctionElement; -import org.netbeans.modules.php.blade.csl.elements.TagElement; +import org.netbeans.modules.php.blade.editor.BladeLanguage; import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; +import org.netbeans.modules.php.blade.editor.indexing.BladeIndex; +import org.netbeans.modules.php.blade.editor.lexer.BladeLexerUtils; +import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; +import static org.netbeans.modules.php.blade.editor.lexer.BladeTokenId.BLADE_DIRECTIVE_UNKNOWN; +import org.netbeans.modules.php.blade.editor.parser.BladeDirectiveScope; import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; -import org.netbeans.modules.php.blade.editor.preferences.ModulePreferences; +import org.netbeans.modules.php.blade.editor.path.BladePathUtils; +import org.netbeans.modules.php.blade.project.AssetsBundlerSupport; import org.netbeans.modules.php.blade.project.ProjectUtils; -import org.netbeans.modules.php.blade.syntax.BladeTags; -import org.netbeans.modules.php.blade.syntax.BladeVariables; +import org.netbeans.modules.php.blade.syntax.DirectivesList; +import org.netbeans.modules.php.blade.syntax.StringUtils; +import org.netbeans.modules.php.blade.syntax.ViewPathUtils; import org.netbeans.modules.php.blade.syntax.annotation.Directive; -import org.netbeans.modules.php.blade.syntax.annotation.Tag; -import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrUtils; import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; -import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser.CONTENT_TAG_OPEN; import org.openide.filesystems.FileObject; +import org.openide.util.Exceptions; /** * @@ -67,6 +76,8 @@ public class BladeCompletionHandler implements CodeCompletionHandler2 { private static final Logger LOGGER = Logger.getLogger(BladeCompletionHandler.class.getName()); + private static final String AT = "@"; //NOI18N + private static final String BLADE_LOOP_VAR = "$loop"; //NOI18N @Override public CodeCompletionResult complete(CodeCompletionContext completionContext) { @@ -88,40 +99,63 @@ public CodeCompletionResult complete(CodeCompletionContext completionContext) { BladeParserResult parserResult = (BladeParserResult) completionContext.getParserResult(); - final List completionProposals = new ArrayList<>(); + final TokenHierarchy th = parserResult.getSnapshot().getTokenHierarchy(); + + if (th == null) { + return CodeCompletionResult.NONE; + } - Token currentToken = BladeAntlrUtils.getToken(doc, offset - 1); + TokenSequence ts = BladeLexerUtils.getBladeTokenSequenceDoc(th, offset); - if (currentToken == null) { + if (ts == null) { return CodeCompletionResult.NONE; } - String prefix = currentToken.getText(); + ts.move(offset); - if (prefix == null) { + if (!ts.moveNext() && !ts.movePrevious()) { return CodeCompletionResult.NONE; } - String tokenText = currentToken.getText(); - FileObject fo = completionContext.getParserResult().getSnapshot().getSource().getFileObject(); - //D_UNKNOWN_ATTR_ENC hack to fix completion not triggered in html embedded text - if (tokenText.startsWith("@") // NOI18N - && currentToken.getType() != D_UNKNOWN_ATTR_ENC) { - completeDirectives(completionProposals, completionContext, fo, currentToken); - } else { - if (prefix.length() == 1) { - return CodeCompletionResult.NONE; - } - switch (currentToken.getType()) { - case PHP_IDENTIFIER, PHP_NAMESPACE_PATH -> PhpCodeCompletionService.completePhpCode(completionProposals, parserResult, offset, prefix); - case PHP_EXPRESSION -> completePhpSnippet(completionProposals, offset, currentToken); - case PHP_VARIABLE -> completeScopedVariables(completionProposals, completionContext, parserResult, currentToken); - case CONTENT_TAG_OPEN, RAW_TAG_OPEN -> { - //{{ | {!! - if (!ModulePreferences.isAutoTagCompletionEnabled()) { - completeBladeTags(completionProposals, completionContext, currentToken); + FileObject fo = parserResult.getSnapshot().getSource().getFileObject(); + + final List completionProposals = new ArrayList<>(); + + OffsetRange phpExprRange = parserResult.getBladePhpExpressionOccurences() + .findPhpExpressionLocation(offset); + + String contextPrefix = completionContext.getPrefix(); + + if (contextPrefix.startsWith(AT) && phpExprRange == null) { + completeDirectives(completionProposals, offset, fo, contextPrefix); + return new DefaultCompletionResult(completionProposals, false); + } else if (phpExprRange != null) { + BladeParserResult.BladeStringReference reference = parserResult.getBladeReferenceIdsCollection() + .findOccuredRefrence(offset); + + if (reference != null) { + completeBladeReference(completionProposals, fo, reference, offset); + } else if (isNotPhpAssignmentExpr(contextPrefix)) { + BladeDirectiveScope scope = parserResult.getBladeScope().findScope(offset); + + if (scope != null) { + int anchorOffset = computeAnchorOffset(contextPrefix, offset); + for (String variableName : scope.getScopeVariables()) { + if (variableName.startsWith(contextPrefix)) { + NamedElement variableElement = new NamedElement(variableName, fo, ElementType.VARIABLE); + completionProposals.add(new BladeCompletionProposal.VariableItem(variableElement, anchorOffset, variableName)); + } + } + + if (scope.getScopeType() == D_FOREACH && BLADE_LOOP_VAR.startsWith(contextPrefix)) { //NOI18N + NamedElement variableElement = new NamedElement(BLADE_LOOP_VAR, fo, ElementType.VARIABLE); + completionProposals.add(new BladeCompletionProposal.VariableItem(variableElement, anchorOffset, BLADE_LOOP_VAR)); } } + } else { + CharSequence snapshotExpr = completionContext.getParserResult().getSnapshot().getText().subSequence(phpExprRange.getStart(), phpExprRange.getEnd()); + PhpCodeCompletionService.completePhpCode(completionProposals, + snapshotExpr.toString(), phpExprRange.getStart(), offset, fo); } } @@ -130,85 +164,136 @@ public CodeCompletionResult complete(CodeCompletionContext completionContext) { } long time = System.currentTimeMillis() - startTime; - if (time > 2000){ - LOGGER.info(String.format("complete() with results took %d ms", time)); // NOI18N + if (time > 2000) { + LOGGER.info(String.format("complete() with results took %d ms", time)); //NOI18N } return new DefaultCompletionResult(completionProposals, false); } + + private boolean isNotPhpAssignmentExpr(String contextPrefix){ + return contextPrefix.startsWith("$") && !contextPrefix.contains("="); //NOI18N + } + private void completeBladeReference(final List completionProposals, + FileObject fo, BladeParserResult.BladeStringReference reference, int offset) { + switch (reference.antlrTokentype) { + case D_EXTENDS, D_INCLUDE, D_INCLUDE_IF, D_INCLUDE_WHEN, D_INCLUDE_UNLESS, D_INCLUDE_FIRST, D_EACH -> { + completeViewPath(completionProposals, reference.identifier, fo, offset); + } + case D_SECTION, D_HAS_SECTION, D_SECTION_MISSING -> { + String yieldId = reference.identifier; + completeYieldIdFromIndex(completionProposals, yieldId, fo, offset); + } + case D_PUSH, D_PUSH_IF, D_PUSH_ONCE, D_PREPEND -> { + String stackId = reference.identifier; + completeStackIdFromIndex(completionProposals, stackId, fo, offset); + } + case D_VITE -> { + String assetPath = reference.identifier; + completeResourcePath(completionProposals, assetPath, fo, offset); + } + } + } - /** - * proxy completion using the original php code completion service - * - * @param completionProposals - * @param offset - * @param currentToken - */ - private void completePhpSnippet(final List completionProposals, - int offset, Token currentToken) { - PhpCodeCompletionService phpCodeCompletion = new PhpCodeCompletionService(); - for (CompletionProposal proposal : phpCodeCompletion.getCompletionProposal(offset, currentToken)) { - String proposalPrefix = proposal.getInsertPrefix(); - if (proposalPrefix.startsWith(phpCodeCompletion.getPrefix())) { - completionProposals.add(proposal); + private void completeViewPath(final List completionProposals, + String pathName, FileObject fo, int offset) { + int pathOffset = ViewPathUtils.getViewPathSeparatorOffset(pathName, offset); + List childrenFiles = BladePathUtils.getParentChildrenFromPrefixPath(fo, pathName); + for (FileObject file : childrenFiles) { + String pathFileName = file.getName(); + boolean isFolder = file.isFolder(); + if (!isFolder) { + pathFileName = pathFileName.replace(BladeLanguage.FILE_EXTENSION_SUFFIX, ""); // NOI18N } + PathElement pathEl = new PathElement(pathFileName, file); + completionProposals.add(new BladeCompletionProposal.ViewPathProposal(pathEl, pathOffset, pathFileName, isFolder)); } } - private void completeScopedVariables(final List completionProposals, - CodeCompletionContext completionContext, BladeParserResult parserResult, Token currentToken) { - String variablePrefix = currentToken.getText(); - Set scopedVariables = parserResult.findLoopVariablesForScope(completionContext.getCaretOffset()); - FileObject fo = completionContext.getParserResult().getSnapshot().getSource().getFileObject(); - - if (scopedVariables != null && !scopedVariables.isEmpty()) { - int anchorOffset = completionContext.getCaretOffset() - variablePrefix.length(); - - if (BladeVariables.LOOP_VAR.startsWith(variablePrefix)) { - String variableName = BladeVariables.LOOP_VAR; - NamedElement variableElement = new NamedElement(variableName, fo, ElementType.VARIABLE); - completionProposals.add(new BladeCompletionProposal.BladeVariableItem(variableElement, anchorOffset, variableName)); + private void completeYieldIdFromIndex(final List completionProposals, + String prefixIdentifier, FileObject fo, int offset) { + BladeIndex bladeIndex; + Project project = ProjectUtils.getMainOwner(fo); + int anchorOffset = computeAnchorOffset(prefixIdentifier, offset); + + try { + bladeIndex = BladeIndex.get(project); + List indexedReferences = bladeIndex.queryYieldIds(prefixIdentifier); + for (BladeIndex.IndexedReferenceId indexReference : indexedReferences) { + NamedElement yieldIdEl = new NamedElement(indexReference.getIdenfiier(), fo, ElementType.YIELD_ID); + completionProposals.add(new BladeCompletionProposal.LayoutIdentifierProposal(yieldIdEl, anchorOffset, indexReference.getIdenfiier())); } - for (String variableName : scopedVariables) { - if (variableName.startsWith(variablePrefix)) { - NamedElement variableElement = new NamedElement(variableName, fo, ElementType.VARIABLE); - completionProposals.add(new BladeCompletionProposal.VariableItem(variableElement, anchorOffset, variableName)); - } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + } + + private void completeStackIdFromIndex(final List completionProposals, + String prefixIdentifier, FileObject fo, int offset) { + BladeIndex bladeIndex; + Project project = ProjectUtils.getMainOwner(fo); + int anchorOffset = computeAnchorOffset(prefixIdentifier, offset); + + try { + bladeIndex = BladeIndex.get(project); + List indexedReferences = bladeIndex.queryStacksIndexedReferences(prefixIdentifier); + for (BladeIndex.IndexedReferenceId indexReference : indexedReferences) { + NamedElement yieldIdEl = new NamedElement(indexReference.getIdenfiier(), fo, ElementType.STACK_ID); + completionProposals.add(new BladeCompletionProposal.LayoutIdentifierProposal(yieldIdEl, anchorOffset, indexReference.getIdenfiier())); } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); } } - /** - * BLADES - * - * @param completionProposals - * @param completionContext - * @param parserResult - * @param currentToken - */ - private void completeBladeTags(final List completionProposals, - CodeCompletionContext completionContext, Token currentToken) { - String tagStart = currentToken.getText(); - - int anchorOffset = computeAnchorOffset(tagStart, completionContext.getCaretOffset()); - BladeTags tagsContainer = new BladeTags(); - Tag[] tags = tagsContainer.getTags(); - for (Tag tag : tags) { - if (tag.openTag().startsWith(tagStart)) { - TagElement tagElement = new TagElement(tag.closeTag()); - completionProposals.add(new BladeCompletionProposal.BladeTag(tagElement, anchorOffset, tag)); + private void completeResourcePath(final List completionProposals, + String pathPrefix, FileObject fo, int offset) { + + FileObject projectDir = ProjectUtils.getProjectDirectory(fo); + + if (projectDir == null) { + return; + } + + FileObject resourceDir = projectDir.getFileObject(AssetsBundlerSupport.RESOURCE_ROOT); + + if (resourceDir == null) { + return; + } + + int firstSlash = pathPrefix.indexOf(StringUtils.FORWARD_SLASH); + int lastSlash = pathPrefix.lastIndexOf(StringUtils.FORWARD_SLASH); + + if (firstSlash == -1 && AssetsBundlerSupport.RESOURCE_ROOT.startsWith(pathPrefix)) { + + int anchorOffset = computeAnchorOffset(pathPrefix, offset); + for (FileObject file : resourceDir.getChildren()) { + if (!file.isFolder() || file.getName().equals(BladePathUtils.LARAVEL_VIEW_FOLDER)) { + continue; + } + + String proposedFolder = AssetsBundlerSupport.RESOURCE_ROOT + StringUtils.FORWARD_SLASH + file.getName(); + PathElement pathEl = new PathElement(proposedFolder, file); + completionProposals.add(new BladeCompletionProposal.FilePathProposal(pathEl, anchorOffset, proposedFolder, true)); + } + } else { + int anchorOffset = computeAnchorOffset(pathPrefix, offset) + lastSlash + 1; + List fileList = BladePathUtils.filterFilesFromRootFolder(new FileObject[]{projectDir}, pathPrefix, lastSlash); + for (FileObject file : fileList) { + String proposedPath = file.getNameExt(); + PathElement pathEl = new PathElement(proposedPath, file); + completionProposals.add(new BladeCompletionProposal.FilePathProposal(pathEl, anchorOffset, proposedPath, file.isFolder())); } } } private void completeDirectives(final List completionProposals, - CodeCompletionContext completionContext, FileObject fo, Token currentToken) { - String prefix = currentToken.getText(); - DirectiveCompletionList completionList = new DirectiveCompletionList(); + int caretOffset, FileObject fo, String prefix) { + DirectivesList listClass = new DirectivesList(); - int anchorOffset = computeAnchorOffset(prefix, completionContext.getCaretOffset()); + int anchorOffset = computeAnchorOffset(prefix, caretOffset); - for (Directive directive : completionList.getDirectives()) { + for (Directive directive : listClass.getDirectives()) { String directiveName = directive.name(); if (directiveName.startsWith(prefix)) { DirectiveElement directiveEl = new DirectiveElement(directiveName, fo); @@ -219,7 +304,6 @@ private void completeDirectives(final List completionProposa completionProposals.add(new BladeCompletionProposal.BlockDirectiveWithArg(directiveEl, anchorOffset, directive)); } } else { - completionProposals.add(new BladeCompletionProposal.InlineDirective(directiveEl, anchorOffset, directive)); if (!directive.endtag().isEmpty()) { completionProposals.add(new BladeCompletionProposal.BlockDirective(directiveEl, anchorOffset, directive)); @@ -234,7 +318,7 @@ private void completeDirectives(final List completionProposa public void filterDirectiveName(CustomDirectives.CustomDirective directive, FileObject file) { DirectiveElement directiveEl = new DirectiveElement(directive.getName(), file); if (directive.getName().startsWith(prefix)) { - int anchorOffset = computeAnchorOffset(prefix, completionContext.getCaretOffset()); + int anchorOffset = computeAnchorOffset(prefix, caretOffset); completionProposals.add( new BladeCompletionProposal.CustomDirective( directiveEl, @@ -258,7 +342,40 @@ public ElementHandle resolveLink(String string, ElementHandle eh) { @Override public String getPrefix(ParserResult info, int offset, boolean upToOffset) { - return null; + + BaseDocument document = (BaseDocument) info.getSnapshot().getSource().getDocument(false); + + if (document == null) { + return null; + } + try { + document.readLock(); + TokenSequence ts = BladeLexerUtils.getTokenSequence(document, offset); + + if (ts == null) { + return null; + } + + ts.move(offset); + + if (!ts.moveNext() && !ts.movePrevious()) { + return null; + } + org.netbeans.api.lexer.Token token = ts.token(); + + String tokenPrefix = token.text().toString().trim(); + BladeTokenId tokenId = token.id(); + if (tokenId.equals(BLADE_DIRECTIVE_UNKNOWN)) { + //sanitize adiacent emebedding hack to trigger blade completion + //ex: "@$caret" or @$caret> + if (tokenPrefix.endsWith("\"") || tokenPrefix.endsWith(">")) { // NOI18N + return tokenPrefix.substring(0, tokenPrefix.length() - 1); + } + } + return tokenPrefix; + } finally { + document.readUnlock(); + } } @Override @@ -267,16 +384,18 @@ public CodeCompletionHandler.QueryType getAutoQuery(JTextComponent component, St return CodeCompletionHandler.QueryType.NONE; } - if (typedText.startsWith("@")) { // NOI18N + if (typedText.startsWith(AT)) { return CodeCompletionHandler.QueryType.ALL_COMPLETION; } char lastChar = typedText.charAt(typedText.length() - 1); - return switch (lastChar) { - case '\n' -> CodeCompletionHandler.QueryType.STOP; - default -> CodeCompletionHandler.QueryType.ALL_COMPLETION; - }; + switch (lastChar) { + case '\n': + return CodeCompletionHandler.QueryType.STOP; + default: + return CodeCompletionHandler.QueryType.ALL_COMPLETION; + } } @Override @@ -306,17 +425,17 @@ public ParameterInfo parameters(ParserResult pr, int i, CompletionProposal cp) { @Override public Documentation documentElement(ParserResult parserResult, ElementHandle elementHandle, Callable cancel) { Documentation result = null; - if (elementHandle instanceof PhpFunctionElement phpFunctionElement) { - return TooltipDoc.generateFunctionDoc(phpFunctionElement); + if (elementHandle instanceof PhpFunctionElement) { + return TooltipDoc.generateFunctionDoc((PhpFunctionElement) elementHandle); } else if (elementHandle instanceof DirectiveElement) { return result; - } else if (elementHandle instanceof NamedElement namedElement) { - return TooltipDoc.generateDoc(namedElement); + } else if (elementHandle instanceof NamedElement) { + return TooltipDoc.generateDoc((NamedElement) elementHandle); } return result; } - - public static int computeAnchorOffset(@NonNull String prefix, int offset){ + + private int computeAnchorOffset(@NonNull String prefix, int offset) { return offset - prefix.length(); } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java deleted file mode 100644 index 8608d0ccf3ae..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionItem.java +++ /dev/null @@ -1,358 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.editor.completion; - -import java.awt.Color; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.event.KeyEvent; -import javax.swing.ImageIcon; -import javax.swing.text.BadLocationException; -import javax.swing.text.Caret; -import javax.swing.text.JTextComponent; -import org.netbeans.api.annotations.common.NullAllowed; -import org.netbeans.api.editor.completion.Completion; -import org.netbeans.editor.BaseDocument; -import org.netbeans.lib.editor.codetemplates.api.CodeTemplateManager; -import org.netbeans.modules.php.blade.editor.ResourceUtilities; -import org.netbeans.modules.php.blade.editor.path.BladePathUtils; -import org.netbeans.modules.php.blade.syntax.BladeDirectivesUtils; -import org.netbeans.spi.editor.completion.CompletionItem; -import org.netbeans.spi.editor.completion.CompletionTask; -import org.netbeans.spi.editor.completion.support.CompletionUtilities; -import org.openide.util.ImageUtilities; - -/** - * - * @author bhaidu - */ -public abstract class BladeCompletionItem implements CompletionItem { - - protected static final int DEFAULT_SORT_PRIORITY = 20; - private final int substitutionOffset; - private final String name; - @NullAllowed - private final String description; - private boolean shift; - - BladeCompletionItem(String name, int substitutionOffset, String description) { - this.name = name; - this.substitutionOffset = substitutionOffset; - this.description = description; - } - - public String getName() { - return this.name; - } - - public String getDescription() { - return this.description; - } - - @Override - public void defaultAction(JTextComponent component) { - if (component != null) { - if (!shift) { - Completion.get().hideDocumentation(); - Completion.get().hideCompletion(); - } - int caretOffset = component.getSelectionEnd(); - int len = caretOffset - substitutionOffset; - if (len >= 0) { - substituteText(component, len); - } - } - } - - @Override - public void processKeyEvent(KeyEvent e) { - shift = (e.getKeyCode() == KeyEvent.VK_ENTER && e.getID() == KeyEvent.KEY_PRESSED && e.isShiftDown()); - } - - @Override - public int getPreferredWidth(Graphics grphcs, Font font) { - return CompletionUtilities.getPreferredWidth(getLeftHtmlText(), getRightHtmlText(), grphcs, font); - } - - @Override - public void render(Graphics g, Font defaultFont, Color defaultColor, Color backgroundColor, int width, int height, boolean selected) { - CompletionUtilities.renderHtml(getIcon(), getLeftHtmlText(), getRightHtmlText(), g, defaultFont, defaultColor, width, height, selected); - } - - @Override - public CompletionTask createDocumentationTask() { - return null; - } - - @Override - public CompletionTask createToolTipTask() { - return null; - } - - @Override - public boolean instantSubstitution(JTextComponent component) { - if (component != null) { - try { - int caretOffset = component.getSelectionEnd(); - if (caretOffset > substitutionOffset) { - String currentText = component.getDocument().getText(substitutionOffset, caretOffset - substitutionOffset); - if (!getSubstituteText().startsWith(currentText)) { - return false; - } - } - } catch (BadLocationException ble) { - } - } - defaultAction(component); - return true; - } - - @Override - public int getSortPriority() { - return DEFAULT_SORT_PRIORITY; - } - - @Override - public CharSequence getSortText() { - return getItemText(); - } - - @Override - public CharSequence getInsertPrefix() { - return getItemText(); - } - - protected ImageIcon getIcon() { - return null; - } - - protected String getLeftHtmlText() { - return name; - } - - protected String getRightHtmlText() { - return null; - } - - protected String getSubstituteText() { - return getItemText(); - } - - public String getItemText() { - return name; - } - - private boolean substituteText(JTextComponent component, int len) { - return substituteText(component, getSubstituteText(), len, 0); - } - - private boolean substituteText(JTextComponent c, final String substituteText, final int len, int moveBack) { - final BaseDocument doc = (BaseDocument) c.getDocument(); - final boolean[] result = new boolean[1]; - result[0] = true; - - doc.runAtomic(new Runnable() { - @Override - public void run() { - try { - //test whether we are trying to insert sg. what is already present in the text - String currentText = doc.getText(substitutionOffset, (doc.getLength() - substitutionOffset) < substituteText.length() ? (doc.getLength() - substitutionOffset) : substituteText.length()); - if (!substituteText.equals(currentText)) { - //remove common part - doc.remove(substitutionOffset, len); - insertString(doc, substitutionOffset, substituteText, c); - } else { - c.setCaretPosition(c.getSelectionEnd() + substituteText.length() - len); - } - } catch (BadLocationException ex) { - result[0] = false; - } - - } - }); - - //format the inserted text - reindent(c); - - if (moveBack != 0) { - Caret caret = c.getCaret(); - int dot = caret.getDot(); - caret.setDot(dot - moveBack); - } - - return result[0]; - } - - protected void insertString(BaseDocument doc, int substitutionOffset, - String substituteText, JTextComponent c) throws BadLocationException { - doc.insertString(substitutionOffset, substituteText, null); - } - - protected void reindent(JTextComponent c) { - - } - - public static class BladeTag extends BladeCompletionItem { - - public BladeTag(String name, int substitutionOffset) { - super(name, substitutionOffset, null); - } - } - - public static class InlineDirective extends BladeCompletionItem { - - public InlineDirective(String directive, int substitutionOffset, - String description) { - super(directive, substitutionOffset, description); - } - - @Override - protected String getRightHtmlText() { - return getDescription(); - } - - @Override - protected ImageIcon getIcon() { - String path = ResourceUtilities.DIRECTIVE_ICON; - return ImageUtilities.loadImageIcon(path, false); - } - } - - public static class DirectiveWithArg extends InlineDirective { - - public DirectiveWithArg(String directive, int substitutionOffset, - String description) { - super(directive, substitutionOffset, description); - } - - @Override - protected String getSubstituteText() { - return switch (getName()) { - case BladeDirectivesUtils.DIRECTIVE_INCLUDE, BladeDirectivesUtils.DIRECTIVE_EXTENDS -> - getItemText() + "('${path}')"; // NOI18N - default -> - getItemText() + "($$${arg})"; // NOI18N - }; - } - - @Override - protected String getLeftHtmlText() { - return getName() + "()"; // NOI18N - } - - @Override - protected void insertString(BaseDocument doc, int substitutionOffset, - String substituteText, JTextComponent ctx) throws BadLocationException { - ctx.setCaretPosition(substitutionOffset); - CodeTemplateManager.get(doc).createTemporary(substituteText).insert(ctx); - } - } - - public static class BlockDirective extends BladeCompletionItem { - - private final String endTag; - - public BlockDirective(String directive, String endTag, int substitutionOffset, - String description) { - super(directive, substitutionOffset, description); - this.endTag = endTag; - } - - @Override - protected String getSubstituteText() { - return getItemText() + "\n${selection}${cursor}\n" + endTag; // NOI18N - } - - @Override - protected String getLeftHtmlText() { - return getName() + " ... " + endTag; // NOI18N - } - - @Override - protected String getRightHtmlText() { - return getDescription(); - } - - @Override - protected ImageIcon getIcon() { - String path = ResourceUtilities.DIRECTIVE_ICON; - return ImageUtilities.loadImageIcon(path, false); - } - - @Override - protected void insertString(BaseDocument doc, int substitutionOffset, - String substituteText, JTextComponent ctx) throws BadLocationException { - ctx.setCaretPosition(substitutionOffset); - CodeTemplateManager.get(doc).createTemporary(substituteText).insert(ctx); - } - - public String getEndTag() { - return endTag; - } - } - - public static class BlockDirectiveWithArg extends BlockDirective { - - public BlockDirectiveWithArg(String directive, String endTag, int substitutionOffset, String description) { - super(directive, endTag, substitutionOffset, description); - } - - @Override - protected String getSubstituteText() { - return switch (getName()) { - case BladeDirectivesUtils.DIRECTIVE_FOREACH -> - getItemText() + "($$${array} as $$${item})\n${selection}${cursor}\n" + getEndTag(); // NOI18N - default -> getItemText() + "($$${arg})\n\n${selection}${cursor}\n" + getEndTag(); // NOI18N - }; - } - - @Override - protected String getLeftHtmlText() { - return getName() + "() ... " + getEndTag(); // NOI18N - } - - } - - public static class ViewPath extends BladeCompletionItem { - - private final boolean isFolder; - private final String filePath; - - public ViewPath(String name, int substitutionOffset, - boolean isFolder, String filePath) { - super(name, substitutionOffset, null); - this.isFolder = isFolder; - this.filePath = filePath; - } - - @Override - protected ImageIcon getIcon() { - String path = ResourceUtilities.BLADE_VIEW; - if (isFolder) { - path = ResourceUtilities.FOLDER; - } - return ImageUtilities.loadImageIcon(path, false); - } - - @Override - protected String getRightHtmlText() { - return BladePathUtils.removeViewsFolderFromPath(filePath); - } - } -} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java index 89bf47ffa7b4..89556b4ad24f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProposal.java @@ -32,7 +32,6 @@ import org.netbeans.modules.php.blade.syntax.BladeDirectivesUtils; import org.netbeans.modules.php.blade.syntax.annotation.Directive; import org.netbeans.modules.php.blade.syntax.annotation.Tag; - import org.openide.filesystems.FileObject; import org.openide.util.ImageUtilities; @@ -143,8 +142,12 @@ public ElementKind getKind() { public boolean isSmart() { return true; } - - public Directive getDirective(){ + + public String getPreviewValue() { + return previewValue; + } + + public Directive getDirective() { return directive; } @@ -184,6 +187,27 @@ public ElementKind getKind() { public int getSortPrioOverride() { return -50;//priority } + + @Override + public String getCustomInsertTemplate() { + String insertText = getElement().getName(); + return insertText; + } + + @Override + public String getRhsHtml(HtmlFormatter formatter) { + String info = getElement().getName(); + + if (info.startsWith(EditorStringUtils.NAMESPACE_SEPARATOR)){ + info = info.substring(1); + } + int slashPos = info.indexOf(EditorStringUtils.NAMESPACE_SEPARATOR); + if (slashPos > -1){ + return info.substring(0, slashPos); + } else { + return info; + } + } } public static class DirectiveItem extends BladeCompletionProposal { @@ -197,10 +221,12 @@ public DirectiveItem(ElementHandle element, int anchorOffset, String previewValu public static class ClassItem extends PhpElementItem { private String namespace = null; - - public ClassItem(ClassElement element, int anchorOffset, String previewValue) { + private final boolean autoCompleteNamespace; + + public ClassItem(ClassElement element, int anchorOffset, String previewValue, boolean autoCompleteNamespace) { super(element, anchorOffset, previewValue); this.namespace = element.getNamespace(); + this.autoCompleteNamespace = autoCompleteNamespace; } @Override @@ -223,10 +249,12 @@ public int getSortPrioOverride() { @Override public String getCustomInsertTemplate() { - if (namespace != null && namespace.length() > 0) { + if (autoCompleteNamespace == true && namespace != null && namespace.length() > 0) { return EditorStringUtils.NAMESPACE_SEPARATOR + namespace + EditorStringUtils.NAMESPACE_SEPARATOR + getElement().getName(); // NOI18N } - return getElement().getName(); + + String insertText = getElement().getName(); + return insertText; } } @@ -325,7 +353,7 @@ public String getCustomInsertTemplate() { @Override public String getLhsHtml(HtmlFormatter formatter) { - return tag.openTag() + " " + tag.closeTag(); + return tag.openTag() + " " + tag.closeTag(); // NOI18N } @Override @@ -339,6 +367,61 @@ public int getSortPrioOverride() { } } + public static class LayoutIdentifierProposal extends BladeCompletionProposal { + + public LayoutIdentifierProposal(ElementHandle element, int anchorOffset, String previewValue) { + super(element, anchorOffset, previewValue); + } + + @Override + public ImageIcon getIcon() { + String path = ResourceUtilities.LAYOUT_IDENTIFIER; + return ImageUtilities.loadImageIcon(path, false); + } + } + + public static class ViewPathProposal extends BladeCompletionProposal { + + private final boolean isFolder; + + public ViewPathProposal(ElementHandle element, int anchorOffset, String previewValue, boolean isFolder) { + super(element, anchorOffset, previewValue); + this.isFolder = isFolder; + } + + @Override + public ImageIcon getIcon() { + String path = ResourceUtilities.BLADE_VIEW; + if (isFolder) { + path = ResourceUtilities.FOLDER; + } + return ImageUtilities.loadImageIcon(path, false); + } + } + + public static class FilePathProposal extends BladeCompletionProposal { + + private final boolean isFolder; + + public FilePathProposal(ElementHandle element, int anchorOffset, String previewValue, boolean isFolder) { + super(element, anchorOffset, previewValue); + this.isFolder = isFolder; + } + + @Override + public ImageIcon getIcon() { + String path = ResourceUtilities.BLADE_VIEW; + if (isFolder) { + path = ResourceUtilities.FOLDER; + } else if (getPreviewValue().endsWith(".css")) { // NOI18N + path = ResourceUtilities.CSS_FILE; + } else if (getPreviewValue().endsWith(".js")) { // NOI18N + path = ResourceUtilities.JS_FILE; + } + return ImageUtilities.loadImageIcon(path, false); + } + } + public static class DirectiveProposal extends BladeCompletionProposal { public DirectiveProposal(ElementHandle element, int anchorOffset, Directive directive) { @@ -401,10 +484,15 @@ public DirectiveWithArg(ElementHandle element, int anchorOffset, Directive direc @Override public String getCustomInsertTemplate() { - return switch (getName()) { - case BladeDirectivesUtils.DIRECTIVE_INCLUDE, BladeDirectivesUtils.DIRECTIVE_EXTENDS -> getName() + "('${path}')"; // NOI18N - default -> getName() + "($$${arg})"; // NOI18N - }; + switch (getName()) { + case BladeDirectivesUtils.DIRECTIVE_INCLUDE: + case BladeDirectivesUtils.DIRECTIVE_EXTENDS: { + return getName() + "('${path}')"; // NOI18N + } + default: { + return getName() + "($$${arg})"; // NOI18N + } + } } @Override @@ -444,13 +532,18 @@ public String getLhsHtml(HtmlFormatter formatter) { @Override public String getCustomInsertTemplate() { - return switch (getName()) { - case BladeDirectivesUtils.DIRECTIVE_FOREACH -> // NOI18N - getName() + "($$${array} as $$${item})\n ${selection}${cursor}\n" + getDirective().endtag(); // NOI18N - case BladeDirectivesUtils.DIRECTIVE_SECTION, BladeDirectivesUtils.DIRECTIVE_SESSION -> // NOI18N - getName() + "('${id}')\n ${cursor}\n" + getDirective().endtag(); // NOI18N - default -> getName() + "($$${arg})\n ${cursor}\n" + getDirective().endtag(); // NOI18N - }; + switch (getName()) { + case BladeDirectivesUtils.DIRECTIVE_FOREACH: { + return getName() + "($$${array} as $$${item})\n ${selection}${cursor}\n" + getDirective().endtag(); // NOI18N + } + case BladeDirectivesUtils.DIRECTIVE_SECTION: + case BladeDirectivesUtils.DIRECTIVE_SESSION: { + return getName() + "('${id}')\n ${cursor}\n" + getDirective().endtag(); // NOI18N + } + default: { + return getName() + "($$${arg})\n ${cursor}\n" + getDirective().endtag(); // NOI18N + } + } } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java deleted file mode 100644 index 4ab80e7ae1a3..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladeCompletionProvider.java +++ /dev/null @@ -1,299 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.editor.completion; - -import java.util.Collection; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.swing.text.BadLocationException; -import javax.swing.text.JTextComponent; -import javax.swing.text.Document; -import org.antlr.v4.runtime.CharStreams; -import org.antlr.v4.runtime.Token; -import org.netbeans.api.editor.document.EditorDocumentUtils; -import org.netbeans.api.editor.mimelookup.MimeRegistration; -import org.netbeans.api.editor.mimelookup.MimeRegistrations; -import org.netbeans.api.project.Project; -import org.netbeans.modules.php.blade.editor.BladeLanguage; -import org.netbeans.modules.php.blade.editor.ResourceUtilities; -import org.netbeans.modules.php.blade.editor.completion.BladeCompletionItem.BladeTag; -import org.netbeans.modules.php.blade.editor.components.AttributeCompletionService; -import org.netbeans.modules.php.blade.editor.components.ComponentsCompletionService; -import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; -import org.netbeans.modules.php.blade.editor.directives.CustomDirectives.CustomDirective; -import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; -import org.netbeans.modules.php.blade.project.ComponentsSupport; -import org.netbeans.modules.php.blade.project.ProjectUtils; -import org.netbeans.modules.php.blade.syntax.StringUtils; -import org.netbeans.modules.php.blade.syntax.annotation.Directive; -import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; -import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; -import org.netbeans.spi.editor.completion.CompletionItem; -import org.netbeans.spi.editor.completion.CompletionProvider; -import static org.netbeans.spi.editor.completion.CompletionProvider.COMPLETION_QUERY_TYPE; -import org.netbeans.spi.editor.completion.CompletionResultSet; -import org.netbeans.spi.editor.completion.CompletionTask; -import org.netbeans.spi.editor.completion.support.AsyncCompletionQuery; -import org.netbeans.spi.editor.completion.support.AsyncCompletionTask; -import org.netbeans.spi.editor.completion.support.CompletionUtilities; -import org.netbeans.spi.lexer.antlr4.AntlrTokenSequence; -import org.openide.filesystems.FileObject; -import org.openide.util.Exceptions; - -/** - * - * @author bhaidu - */ -@MimeRegistrations({ - @MimeRegistration(mimeType = "text/html", service = CompletionProvider.class, position=102), - @MimeRegistration(mimeType = BladeLanguage.MIME_TYPE, service = CompletionProvider.class, position=0) -}) -public class BladeCompletionProvider implements CompletionProvider { - - public static final int MIN_COMPONENT_PREFIX_LENGTH = 3; - private static final Logger LOGGER = Logger.getLogger(BladeCompletionProvider.class.getName()); - - public enum CompletionType { - BLADE_PATH, - YIELD_ID, - DIRECTIVE, - HTML_COMPONENT_TAG - } - - @Override - public CompletionTask createTask(int queryType, JTextComponent component) { - return new AsyncCompletionTask(new BladeCompletionQuery(), component); - } - - @Override - public int getAutoQueryTypes(JTextComponent component, String typedText) { - FileObject fo = EditorDocumentUtils.getFileObject(component.getDocument()); - if (fo == null || !fo.getMIMEType().equals(BladeLanguage.MIME_TYPE)) { - return 0; - } - - if (typedText.length() == 0) { - return 0; - } - - //don't autocomplete on space, \n, ) - if (typedText.trim().isEmpty()) { - //TODO this stops raw tags to autocomplete - return 0; - } - - char lastChar = typedText.charAt(typedText.length() - 1); - return switch (lastChar) { - case ')', '\n', '<', '>' -> 0; - default -> COMPLETION_QUERY_TYPE; - }; - } - - private class BladeCompletionQuery extends AsyncCompletionQuery { - - public BladeCompletionQuery() { - } - - @Override - protected void query(CompletionResultSet resultSet, Document doc, int caretOffset) { - long startTime = System.currentTimeMillis(); - - try { - FileObject fo = EditorDocumentUtils.getFileObject(doc); - - if (fo == null || !fo.getMIMEType().equals(BladeLanguage.MIME_TYPE)) { - return; - } - - AntlrTokenSequence tokens; - try { - String docText = doc.getText(0, doc.getLength()); - tokens = new AntlrTokenSequence(new BladeAntlrLexer(CharStreams.fromString(docText))); - } catch (BadLocationException ex) { - Exceptions.printStackTrace(ex); - return; - } finally { - } - - if (tokens.isEmpty()) { - return; - } - - if (caretOffset > 1) { - tokens.seekTo(caretOffset - 1); - } else { - tokens.seekTo(caretOffset); - } - - Token currentToken; - - if (!tokens.hasNext() && tokens.hasPrevious()) { - //the carret got too far - currentToken = tokens.previous().get(); - } else if (tokens.hasNext()) { - currentToken = tokens.next().get(); - } else { - return; - } - - if (currentToken == null) { - return; - } - - if (currentToken.getText().trim().length() == 0) { - return; - } - - switch (currentToken.getType()) { - case HTML_IDENTIFIER -> completeAttributes(currentToken.getText(), caretOffset, resultSet); - case HTML -> { - String nText = currentToken.getText(); - if (ComponentsSupport.LIVEWIRE_NAME.startsWith(nText)) { - addHtmlTagCompletionItem(nText, ComponentsSupport.LIVEWIRE_NAME, caretOffset, resultSet); - } - } - case HTML_COMPONENT_PREFIX -> { - String compPrefix = currentToken.getText().length() > MIN_COMPONENT_PREFIX_LENGTH ? StringUtils.kebabToCamel(currentToken.getText().substring(MIN_COMPONENT_PREFIX_LENGTH)) : ""; // NOI18N - completeComponents(compPrefix, fo, caretOffset, resultSet); - } - case D_UNKNOWN_ATTR_ENC -> completeDirectives(currentToken.getText(), doc, caretOffset, resultSet); - default -> { - } - } - } finally { - long time = System.currentTimeMillis() - startTime; - if (time > 2000) { - LOGGER.log(Level.INFO, "Slow completion time detected. {0}ms", time); // NOI18N - } - resultSet.finish(); - } - } - } - - private void completeDirectives(String prefix, Document doc, int carretOffset, CompletionResultSet resultSet) { - int startOffset = carretOffset - prefix.length(); - DirectiveCompletionList completionList = new DirectiveCompletionList(); - - for (Directive directive : completionList.getDirectives()) { - String directiveName = directive.name(); - if (directiveName.startsWith(prefix)) { - if (directive.params()) { - resultSet.addItem(DirectiveCompletionBuilder.itemWithArg( - startOffset, carretOffset, prefix, directiveName, directive.description(), doc)); - if (!directive.endtag().isEmpty()) { - resultSet.addItem(DirectiveCompletionBuilder.itemWithArg( - startOffset, carretOffset, prefix, directiveName, directive.endtag(), directive.description(), doc)); - } - } else { - resultSet.addItem(DirectiveCompletionBuilder.simpleItem( - startOffset, directiveName, directive.description())); - if (!directive.endtag().isEmpty()) { - resultSet.addItem(DirectiveCompletionBuilder.simpleItem( - startOffset, carretOffset, prefix, directiveName, directive.endtag(), directive.description(), doc)); - } - } - - } - } - - FileObject fo = EditorDocumentUtils.getFileObject(doc); - Project project = ProjectUtils.getMainOwner(fo); - - CustomDirectives.getInstance(project).filterAction(new CustomDirectives.FilterCallback() { - @Override - public void filterDirectiveName(CustomDirective customDirective, FileObject file) { - if (customDirective.getName().startsWith(prefix)) { - resultSet.addItem(DirectiveCompletionBuilder.itemWithArg( - startOffset, carretOffset, prefix, customDirective.getName(), - "custom directive", doc, file)); // NOI18N - } - } - }); - } - - private void completeComponents(String prefixIdentifier, FileObject fo, - int caretOffset, CompletionResultSet resultSet) { - - int insertOffset = caretOffset - prefixIdentifier.length(); - ComponentsCompletionService componentComplervice = new ComponentsCompletionService(); - Collection indexedReferences = componentComplervice.queryComponents(prefixIdentifier, fo); - if (indexedReferences == null) { - return; - } - for (PhpIndexResult indexReference : indexedReferences) { - addComponentIdCompletionItem(indexReference, - insertOffset, resultSet); - } - - } - - private void completeAttributes(String prefix, int caretOffset, CompletionResultSet resultSet) { - int insertOffset = caretOffset; - AttributeCompletionService attributeCompletionService = new AttributeCompletionService(); - Collection attributes = attributeCompletionService.queryComponents(prefix); - - for (String attribute : attributes) { - addSimplAttributeItem(prefix, attribute, insertOffset, resultSet); - } - } - - private void addHtmlTagCompletionItem(String prefix, String tagName, - int caretOffset, CompletionResultSet resultSet) { - - int insertOffset = caretOffset - prefix.length(); - BladeTag item = new BladeTag(tagName, insertOffset); - resultSet.addItem(item); - } - - private void addSimplAttributeItem(String prefix, String attributeName, int caretOffset, CompletionResultSet resultSet) { - int insertOffset = caretOffset - prefix.length(); - CompletionItem item = CompletionUtilities.newCompletionItemBuilder(attributeName) - .startOffset(insertOffset) - .leftHtmlText(attributeName) - .sortPriority(1) - .build(); - resultSet.addItem(item); - } - - private void addComponentIdCompletionItem(PhpIndexResult indexReference, - int caretOffset, CompletionResultSet resultSet) { - - String tagName = StringUtils.toKebabCase(indexReference.name); - CompletionItem item = CompletionUtilities.newCompletionItemBuilder(tagName) - .iconResource(getReferenceIcon(CompletionType.HTML_COMPONENT_TAG)) - .startOffset(caretOffset) - .leftHtmlText(tagName) - .rightHtmlText(indexReference.namespace) - .sortPriority(1) - .build(); - resultSet.addItem(item); - } - - private static String getReferenceIcon(CompletionType type) { - return switch (type) { - case HTML_COMPONENT_TAG -> - ResourceUtilities.COMPONENT_TAG; - case YIELD_ID -> - ResourceUtilities.LAYOUT_IDENTIFIER; - default -> - ResourceUtilities.DIRECTIVE_ICON; - }; - } - -} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java deleted file mode 100644 index d1f042f75dc6..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/BladePhpCompletionProvider.java +++ /dev/null @@ -1,362 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.editor.completion; - -import java.io.IOException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.swing.text.BadLocationException; -import javax.swing.text.JTextComponent; -import javax.swing.text.Document; -import org.antlr.v4.runtime.CharStreams; -import org.antlr.v4.runtime.Token; -import org.netbeans.api.editor.document.EditorDocumentUtils; -import org.netbeans.api.editor.mimelookup.MimeRegistration; -import org.netbeans.api.editor.mimelookup.MimeRegistrations; -import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; -import org.netbeans.api.project.Project; -import org.netbeans.modules.php.api.util.FileUtils; -import org.netbeans.modules.php.blade.editor.BladeLanguage; -import org.netbeans.modules.php.blade.editor.EditorStringUtils; -import org.netbeans.modules.php.blade.editor.ResourceUtilities; -import org.netbeans.modules.php.blade.editor.indexing.BladeIndex; -import org.netbeans.modules.php.blade.editor.indexing.BladeIndex.IndexedReferenceId; -import org.netbeans.modules.php.blade.editor.lexer.BladeLexerUtils; -import org.netbeans.modules.php.blade.editor.path.BladePathUtils; -import org.netbeans.modules.php.blade.project.ProjectUtils; -import org.netbeans.modules.php.blade.syntax.StringUtils; -import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; -import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrUtils; -import org.netbeans.spi.editor.completion.CompletionItem; -import org.netbeans.spi.editor.completion.CompletionProvider; -import org.netbeans.spi.editor.completion.CompletionResultSet; -import org.netbeans.spi.editor.completion.CompletionTask; -import org.netbeans.spi.editor.completion.support.AsyncCompletionQuery; -import org.netbeans.spi.editor.completion.support.AsyncCompletionTask; -import org.netbeans.spi.editor.completion.support.CompletionUtilities; -import org.netbeans.spi.lexer.antlr4.AntlrTokenSequence; -import org.openide.filesystems.FileObject; -import org.openide.util.Exceptions; - -/** - * - * @author bhaidu - */ -@MimeRegistrations({ - @MimeRegistration(mimeType = FileUtils.PHP_MIME_TYPE, service = CompletionProvider.class, position = 102),} -) -public class BladePhpCompletionProvider implements CompletionProvider { - - private static final Logger LOGGER = Logger.getLogger(BladePhpCompletionProvider.class.getName()); - public static final String JS_ASSET_FOLDER = "resources/js"; // NOI18N - public static final String CSS_ASSET_FOLDER = "resources/css"; // NOI18N - - public enum CompletionType { - BLADE_PATH, - YIELD_ID, - DIRECTIVE, - HTML_COMPONENT_TAG, - FOLDER, - CSS_FILE, - JS_FILE - } - - @Override - public CompletionTask createTask(int queryType, JTextComponent component) { - return new AsyncCompletionTask(new BladeCompletionQuery(), component); - } - - @Override - public int getAutoQueryTypes(JTextComponent component, String typedText) { - FileObject fo = EditorDocumentUtils.getFileObject(component.getDocument()); - if (fo == null || !fo.getMIMEType().equals(BladeLanguage.MIME_TYPE)) { - return 0; - } - - if (typedText.length() == 0) { - return 0; - } - - //don't autocomplete on space, \n, ) - if (typedText.trim().isEmpty()) { - return 0; - } - - char lastChar = typedText.charAt(typedText.length() - 1); - return switch (lastChar) { - case ')', '\n', '<', '>' -> - 0; - default -> - COMPLETION_QUERY_TYPE; - }; - } - - private class BladeCompletionQuery extends AsyncCompletionQuery { - - public BladeCompletionQuery() { - } - - @Override - protected void query(CompletionResultSet resultSet, Document doc, int caretOffset) { - long startTime = System.currentTimeMillis(); - doQuery(resultSet, doc, caretOffset); - long time = System.currentTimeMillis() - startTime; - if (time > 2000) { - LOGGER.log(Level.INFO, "Slow completion time detected. {0}ms", time); // NOI18N - } - resultSet.finish(); - } - } - - private void doQuery(CompletionResultSet resultSet, Document doc, int caretOffset) { - FileObject fo = EditorDocumentUtils.getFileObject(doc); - - if (fo == null || !fo.getMIMEType().equals(BladeLanguage.MIME_TYPE)) { - return; - } - - AntlrTokenSequence tokens; - try { - String docText = doc.getText(0, doc.getLength()); - tokens = new AntlrTokenSequence(new BladeAntlrLexer(CharStreams.fromString(docText))); - } catch (BadLocationException ex) { - Exceptions.printStackTrace(ex); - return; - } - - if (tokens.isEmpty()) { - return; - } - - if (caretOffset > 1) { - tokens.seekTo(caretOffset - 1); - } else { - tokens.seekTo(caretOffset); - } - - Token currentToken; - - if (!tokens.hasNext() && tokens.hasPrevious()) { - //the carret got too far - currentToken = tokens.previous().get(); - } else if (tokens.hasNext()) { - currentToken = tokens.next().get(); - } else { - return; - } - - if (currentToken == null) { - return; - } - - if (currentToken.getText().trim().length() == 0) { - return; - } - - switch (currentToken.getType()) { - case BL_PARAM_STRING -> { - String pathName = EditorStringUtils.stripSurroundingQuotes(currentToken.getText()); - Set tokensToMatch = BladeLexerUtils.TOKENS_WITH_IDENTIFIABLE_PARAM; - Set tokensStop = Set.of(HTML, BL_COMMA, BL_PARAM_CONCAT_OPERATOR); - - Token directiveToken = BladeAntlrUtils.findBackward(tokens, tokensToMatch, tokensStop); - if (directiveToken == null) { - return; - } - switch (directiveToken.getType()) { - case D_EXTENDS, D_INCLUDE, D_INCLUDE_IF, D_INCLUDE_WHEN, D_INCLUDE_UNLESS, D_EACH -> { - int lastDotPos; - - if (pathName.endsWith(StringUtils.DOT)) { - lastDotPos = pathName.length(); - } else { - lastDotPos = pathName.lastIndexOf(StringUtils.DOT); - } - int pathOffset; - - if (lastDotPos > 0) { - int dotFix = pathName.endsWith(StringUtils.DOT) ? 0 : 1; - pathOffset = caretOffset - pathName.length() + lastDotPos + dotFix; - } else { - pathOffset = caretOffset - pathName.length(); - } - List childrenFiles = BladePathUtils.getParentChildrenFromPrefixPath(fo, pathName); - for (FileObject file : childrenFiles) { - String pathFileName = file.getName(); - if (!file.isFolder()) { - pathFileName = pathFileName.replace(BladeLanguage.FILE_EXTENSION_SUFFIX, ""); // NOI18N - } - completeBladePath(pathFileName, file, pathOffset, resultSet); - } - return; - } - case D_SECTION, D_HAS_SECTION -> - completeYieldIdFromIndex(pathName, fo, caretOffset, resultSet); - case D_PUSH, D_PUSH_IF, D_PREPEND -> - completeStackIdFromIndex(pathName, fo, caretOffset, resultSet); - } - } - case EXPR_STRING -> { - String pathName = EditorStringUtils.stripSurroundingQuotes(currentToken.getText()); - - if (!pathName.contains(BladePathUtils.LARAVEL_RESOURCES)) { - break; - } - - int lastSlash = pathName.lastIndexOf(StringUtils.FORWARD_SLASH); - - FileObject projectDir = ProjectUtils.getProjectDirectory(fo); - - if (projectDir == null) { - break; - } - - int pathOffset = caretOffset - pathName.length(); - //laravel framework - if (lastSlash < 0) { - String jsDirRoot = JS_ASSET_FOLDER; - FileObject jsFolder = projectDir.getFileObject(JS_ASSET_FOLDER); - addAssetPathCompletionItem(jsDirRoot, jsFolder.getPath(), pathOffset, resultSet, CompletionType.FOLDER); - String cssDirRoot = CSS_ASSET_FOLDER; - FileObject cssFolder = projectDir.getFileObject(CSS_ASSET_FOLDER); - addAssetPathCompletionItem(cssDirRoot, cssFolder.getPath(), pathOffset, resultSet, CompletionType.FOLDER); - } - - boolean isJsPath = JS_ASSET_FOLDER.startsWith(pathName) || pathName.startsWith(JS_ASSET_FOLDER); - boolean isCssPath = CSS_ASSET_FOLDER.startsWith(pathName) || pathName.startsWith(CSS_ASSET_FOLDER); - - if (isJsPath) { - FileObject jsFolder = projectDir.getFileObject(JS_ASSET_FOLDER); - if (jsFolder == null || !jsFolder.isValid()) { - break; - } - for (FileObject file : jsFolder.getChildren()) { - String jsPath = JS_ASSET_FOLDER + StringUtils.FORWARD_SLASH + file.getNameExt(); - if (jsPath.startsWith(pathName)) { - addAssetPathCompletionItem(jsPath, file.getPath(), pathOffset, resultSet, CompletionType.JS_FILE); - } - } - } else if (isCssPath) { - FileObject cssFolder = projectDir.getFileObject(CSS_ASSET_FOLDER); - if (cssFolder == null || !cssFolder.isValid()) { - break; - } - for (FileObject file : cssFolder.getChildren()) { - String jsPath = CSS_ASSET_FOLDER + StringUtils.FORWARD_SLASH + file.getNameExt(); - if (jsPath.startsWith(pathName)) { - addAssetPathCompletionItem(jsPath, file.getPath(), pathOffset, resultSet, CompletionType.CSS_FILE); - } - } - } - } - default -> { - //skip any action - } - } - } - - private void completeYieldIdFromIndex(String prefixIdentifier, FileObject fo, - int caretOffset, CompletionResultSet resultSet) { - BladeIndex bladeIndex; - Project project = ProjectUtils.getMainOwner(fo); - int insertOffset = caretOffset - prefixIdentifier.length(); - try { - bladeIndex = BladeIndex.get(project); - List indexedReferences = bladeIndex.queryYieldIds(prefixIdentifier); - for (IndexedReferenceId indexReference : indexedReferences) { - addYieldIdCompletionItem(indexReference.getIdenfiier(), indexReference.getOriginFile(), - insertOffset, resultSet); - } - } catch (IOException ex) { - Exceptions.printStackTrace(ex); - } - } - - private void completeStackIdFromIndex(String prefixIdentifier, FileObject fo, - int caretOffset, CompletionResultSet resultSet) { - BladeIndex bladeIndex; - Project project = ProjectUtils.getMainOwner(fo); - int insertOffset = caretOffset - prefixIdentifier.length(); - try { - bladeIndex = BladeIndex.get(project); - List indexedReferences = bladeIndex.queryStacksIndexedReferences(prefixIdentifier); - for (IndexedReferenceId indexReference : indexedReferences) { - addYieldIdCompletionItem(indexReference.getIdenfiier(), indexReference.getOriginFile(), - insertOffset, resultSet); - } - } catch (IOException ex) { - Exceptions.printStackTrace(ex); - } - } - - private void completeBladePath(String bladePath, FileObject originFile, - int caretOffset, CompletionResultSet resultSet) { - - String filePath = originFile.getPath(); - - BladeCompletionItem item = BladeCompletionBuilder.createViewPath( - bladePath, caretOffset, originFile.isFolder(), filePath); - resultSet.addItem(item); - } - - private void addYieldIdCompletionItem(String identifier, FileObject fo, - int caretOffset, CompletionResultSet resultSet) { - - String filePath = fo.getPath(); - - CompletionItem item = CompletionUtilities.newCompletionItemBuilder(identifier) - .iconResource(getReferenceIcon(CompletionType.YIELD_ID)) - .startOffset(caretOffset) - .leftHtmlText(identifier) - .rightHtmlText(BladePathUtils.removeViewsFolderFromPath(filePath)) - .sortPriority(1) - .build(); - resultSet.addItem(item); - } - - private void addAssetPathCompletionItem(String preview, String info, - int caretOffset, CompletionResultSet resultSet, CompletionType type) { - CompletionItem item = CompletionUtilities.newCompletionItemBuilder(preview) - .iconResource(getReferenceIcon(type)) - .startOffset(caretOffset) - .leftHtmlText(preview) - .rightHtmlText(info) - .sortPriority(1) - .build(); - resultSet.addItem(item); - } - - private static String getReferenceIcon(CompletionType type) { - return switch (type) { - case FOLDER -> - ResourceUtilities.FOLDER; - case CSS_FILE -> - "org/netbeans/modules/css/visual/resources/style_sheet_16.png"; // NOI18N - case JS_FILE -> - "org/netbeans/modules/javascript2/editor/resources/javascript.png"; // NOI18N - default -> - ResourceUtilities.LAYOUT_IDENTIFIER; - }; - } - -} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionBuilder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionBuilder.java deleted file mode 100644 index 67091496f139..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionBuilder.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.editor.completion; - -import javax.swing.text.Document; -import org.netbeans.spi.editor.completion.CompletionItem; -import org.openide.filesystems.FileObject; - -/** - * - * @author bogdan - */ -public class DirectiveCompletionBuilder { - - public static CompletionItem simpleItem(int startOffset, String directive, - String description) { - - return BladeCompletionBuilder.createInlineDirective(directive, startOffset, description); - } - - public static CompletionItem simpleItem(int startOffset, int carretOffset, - String prefix, String directive, String endtag, - String description, Document doc) { - - return BladeCompletionBuilder.createBlockDirective( - directive, endtag, startOffset, description); - } - - public static CompletionItem itemWithArg(int startOffset, int carretOffset, - String prefix, String directive, - String description, Document doc) { - - return BladeCompletionBuilder.createDirectiveWithArg(directive, startOffset, description); - } - - public static CompletionItem itemWithArg(int startOffset, int carretOffset, - String prefix, String directive, String endtag, - String description, Document doc) { - - return BladeCompletionBuilder.createBlockDirectiveWithArg( - directive, endtag, startOffset, description); - } - - public static CompletionItem itemWithArg(int startOffset, int carretOffset, - String prefix, String directive, - String description, Document doc, - FileObject file) { - return BladeCompletionBuilder.createDirectiveWithArg(directive, startOffset, description); - } -} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionContext.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionContext.java deleted file mode 100644 index 2fd4d6f5ae1a..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionContext.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.editor.completion; - -import org.netbeans.modules.csl.api.CodeCompletionContext; -import org.netbeans.modules.csl.api.CodeCompletionHandler; -import org.netbeans.modules.csl.spi.ParserResult; - -/** - * used to trigger php.editor package completion flow - * - * @author bhaidu - */ -public class PhpCodeCompletionContext { - - public static CodeCompletionContext completionContext(int carretOffset, - ParserResult phpParserResult, - String phpPrefix) { - return new CodeCompletionContext() { - @Override - public int getCaretOffset() { - //the offset should be taken from compiler - return carretOffset; - } - - @Override - public ParserResult getParserResult() { - return phpParserResult; - } - - @Override - public String getPrefix() { - return phpPrefix; - } - - @Override - public boolean isPrefixMatch() { - return true; - } - - @Override - public CodeCompletionHandler.QueryType getQueryType() { - return CodeCompletionHandler.QueryType.COMPLETION; - } - - @Override - public boolean isCaseSensitive() { - return true; - } - }; - } -} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java index 47b26df4bee7..07707bf4e6e9 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java @@ -18,314 +18,207 @@ */ package org.netbeans.modules.php.blade.editor.completion; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; -import javax.swing.text.BadLocationException; -import org.antlr.v4.runtime.Token; +import java.util.Set; +import javax.swing.ImageIcon; import org.netbeans.api.annotations.common.NonNull; +import org.netbeans.api.annotations.common.NullAllowed; import org.netbeans.api.project.Project; -import org.netbeans.editor.BaseDocument; -import org.netbeans.modules.csl.api.CodeCompletionContext; -import org.netbeans.modules.csl.api.CodeCompletionHandler; -import org.netbeans.modules.csl.api.CodeCompletionResult; import org.netbeans.modules.csl.api.CompletionProposal; -import org.netbeans.modules.parsing.api.ParserManager; -import org.netbeans.modules.parsing.api.ResultIterator; -import org.netbeans.modules.parsing.api.Source; -import org.netbeans.modules.parsing.api.UserTask; -import org.netbeans.modules.parsing.spi.ParseException; -import org.netbeans.modules.parsing.spi.indexing.support.QuerySupport; -import org.netbeans.modules.php.api.util.FileUtils; +import org.netbeans.modules.csl.api.ElementHandle; +import org.netbeans.modules.csl.api.ElementKind; +import org.netbeans.modules.csl.api.HtmlFormatter; +import org.netbeans.modules.csl.api.Modifier; import org.netbeans.modules.php.blade.csl.elements.ClassElement; import org.netbeans.modules.php.blade.csl.elements.ElementType; import org.netbeans.modules.php.blade.csl.elements.NamedElement; +import org.netbeans.modules.php.blade.csl.elements.PhpKeywordElement; import org.netbeans.modules.php.blade.editor.EditorStringUtils; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexFunctionResult; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; -import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; -import static org.netbeans.modules.php.blade.editor.parser.BladeParserResult.ReferenceType.PHP_CLASS; -import static org.netbeans.modules.php.blade.editor.parser.BladeParserResult.ReferenceType.PHP_CONSTANT; -import static org.netbeans.modules.php.blade.editor.parser.BladeParserResult.ReferenceType.PHP_NAMESPACE_PATH_TYPE; -import org.netbeans.modules.php.editor.csl.PHPLanguage; -import org.netbeans.modules.php.editor.parser.PHPParseResult; -import org.netbeans.spi.project.ui.support.ProjectConvertors; +import org.netbeans.modules.php.blade.syntax.annotation.PhpKeyword; +import org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpAntlrLexer; +import org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpAntlrUtils; +import org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpSnippetParser; +import static org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpSnippetParser.PhpReferenceType.PHP_NAMESPACE; +import org.netbeans.modules.php.blade.syntax.php.PhpKeywordList; import org.openide.filesystems.FileObject; -import org.openide.util.Exceptions; /** * * @author bogdan */ -public final class PhpCodeCompletionService { +public class PhpCodeCompletionService { - private String prefix = ""; - - public String getPrefix() { - return prefix; - } + public static void completePhpCode(final List completionProposals, + String snapshotExpr, int exprStart, int offset, FileObject fo) { + int referencedOffset = offset - exprStart - 1; - public List getCompletionProposal(int offset, Token currentToken) { - final List proposals = new ArrayList<>(); - String phpSnippet = currentToken.getText(); - String phpStart = " completionProposals, - BladeParserResult parserResult, - int offset, String prefix) { - BladeParserResult.FieldAccessReference fieldAccessReference = parserResult.findFieldAccessRefrence(offset); + int completionOffset = exprStart + targetetToken.getStartIndex(); - FileObject fo = parserResult.getSnapshot().getSource().getFileObject(); + String phpIdentifier = ""; // NOI18N - if (fieldAccessReference != null) { - completeClassConstants(prefix, fieldAccessReference.ownerClass.identifier, offset, completionProposals, fo); - completeClassMethods(prefix, fieldAccessReference, offset, completionProposals, fo); - return; + if (targetetToken.getType() != BladePhpAntlrLexer.DOUBLE_COLON) { + phpIdentifier = targetetToken.getText(); + } else { + //double colon offset increase "::" + completionOffset += targetetToken.getText().length(); } - //based on ParserResult implementation - //inside tag {{ }} and inside directive expression differences - BladeParserResult.Reference elementReference = parserResult.findOccuredRefrence(offset); + BladePhpSnippetParser phpSnippetParser = new BladePhpSnippetParser(snapshotExpr, fo, exprStart); + phpSnippetParser.parse(); + BladePhpSnippetParser.PhpReference phpRef = phpSnippetParser.findIdentifierReference(referencedOffset); + BladePhpSnippetParser.FieldAcces fieldAccess = phpSnippetParser.findFieldAccessReference(referencedOffset); - if (elementReference == null) { - completeNamespace(prefix, offset, completionProposals, fo); - completePhpClasses(prefix, offset, completionProposals, fo); - completePhpFunctions(prefix, offset, completionProposals, fo); - completeConstants(prefix, offset, completionProposals, fo); - return; + if (fieldAccess != null) { + if (fieldAccess.owner.namespace == null) { + completeClassConstants(completionProposals, phpIdentifier, fieldAccess.owner.identifier, completionOffset, fo); + } + completeClassMethods(completionProposals, phpIdentifier, fieldAccess, completionOffset, fo); + } else if (phpRef != null) { + if (phpRef.namespace != null){ + boolean globalNamespace = phpRef.namespace.startsWith(EditorStringUtils.NAMESPACE_SEPARATOR); + String namespaceQuery = globalNamespace ? phpRef.namespace.substring(1) : phpRef.namespace; + + if (phpRef.identifier != null){ + completeNamespaceClasses(completionProposals, phpRef.identifier, namespaceQuery, completionOffset, fo); + completeNamespace(completionProposals, namespaceQuery + EditorStringUtils.NAMESPACE_SEPARATOR + phpRef.identifier, completionOffset, fo); + } else { + completeNamespace(completionProposals, namespaceQuery, completionOffset, fo); + } + } else if (phpRef.type.equals(PHP_NAMESPACE)){ + completeAllRelativeNamespacesClasses(completionProposals, phpRef.identifier, offset, fo); + } + } else if (targetetToken.getType() == BladePhpAntlrLexer.IDENTIFIER) { + //no context but with identifier + completePhpKeywords(completionProposals, phpIdentifier, completionOffset); + completePhpFunctions(completionProposals, phpIdentifier, completionOffset, fo); + completePhpClasses(completionProposals, phpIdentifier, completionOffset, fo); + completeNamespace(completionProposals, phpIdentifier, completionOffset + 1, fo); } + //add variable flow - switch (elementReference.type) { - case PHP_CONSTANT: - case PHP_CLASS: - completeNamespace(prefix, offset, completionProposals, fo); - completePhpClasses(prefix, offset, completionProposals, fo); - completeConstants(prefix, offset, completionProposals, fo); - break; - case PHP_NAMESPACE_PATH_TYPE: - String prefixNamespace = elementReference.namespace != null ? elementReference.namespace + prefix : prefix; - completeNamespace(prefixNamespace, offset, completionProposals, fo); - - //we are after '\[a-z]' - if (elementReference.namespace != null) { - String classQuery = prefix; - String namespace = elementReference.namespace; - int substringStartOffset = namespace.startsWith(EditorStringUtils.NAMESPACE_SEPARATOR) ? 1 : 0; - String namespacePath = namespace.substring(substringStartOffset) + classQuery; - Collection indexedNamespaces = PhpIndexUtils.queryNamespaces( - fo, namespacePath, QuerySupport.Kind.PREFIX - ); - - int anchorOffset = computeAnchorOffset(prefix, offset); - - for (PhpIndexResult indexResult : indexedNamespaces) { - completionProposals.add(new BladeCompletionProposal.NamespaceItem( - namespaceElement(indexResult), anchorOffset, indexResult.name)); - } - } else if (prefix.endsWith(EditorStringUtils.NAMESPACE_SEPARATOR)) { - //the identifier is the namespace - int substringOffset = elementReference.identifier.startsWith(EditorStringUtils.NAMESPACE_SEPARATOR) ? 1 : 0; - String namespacePath = elementReference.identifier.substring(substringOffset, elementReference.identifier.length() - 1); - Collection indexClassResults = PhpIndexUtils.queryAllNamespaceClasses(fo, namespacePath); - int anchorOffset = computeAnchorOffset(namespacePath, offset + namespacePath.length()); - for (PhpIndexResult indexResult : indexClassResults) { - completionProposals.add(new BladeCompletionProposal.ClassItem(classElement(indexResult), anchorOffset, indexResult.name)); - } - } - break; + } + + private static void completePhpKeywords(final List completionProposals, + String prefix, int caretOffset) { + PhpKeywordList keywordList = new PhpKeywordList(); + for (PhpKeyword keyword : keywordList.getKeywords()) { + if (keyword.name().startsWith(prefix)) { + PhpKeywordElement keywordEl = new PhpKeywordElement(keyword.name()); + completionProposals.add(new PhpKeywordProposal(keywordEl, caretOffset)); + } } } - private static void completePhpClasses(String prefix, int offset, - final List completionProposals, - FileObject fo) { + private static void completePhpClasses(final List completionProposals, + String prefix, int offset, FileObject fo) { Collection indexClassResults = PhpIndexUtils.queryClass(fo, prefix); if (indexClassResults.isEmpty()) { return; } - int anchorOffset = computeAnchorOffset(prefix, offset); for (PhpIndexResult indexResult : indexClassResults) { completionProposals.add(new BladeCompletionProposal.ClassItem( - classElement(indexResult), anchorOffset, indexResult.name)); + classElement(indexResult), offset, indexResult.name, true)); } } - private static void completePhpFunctions(String prefix, int offset, - final List completionProposals, - FileObject fo) { + private static void completePhpFunctions(final List completionProposals, + String prefix, int offset, FileObject fo) { Collection indexedFunctions = PhpIndexUtils.queryFunctions( fo, prefix); if (indexedFunctions.isEmpty()) { return; } - int anchorOffset = computeAnchorOffset(prefix, offset); - for (PhpIndexFunctionResult indexResult : indexedFunctions) { - //to be completed - //might add syntax completion cursor - String preview = indexResult.name + indexResult.getParamsAsString(); - completionProposals.add(new BladeCompletionProposal.FunctionItem( - functionElement(indexResult), - anchorOffset, - preview) - ); - } - } - - /** - * Warning this doesn't check access permission (private, protected) - * - * @param prefix - * @param fieldAccessReference - * @param offset - * @param completionProposals - * @param fo - */ - private static void completeClassMethods(String prefix, BladeParserResult.FieldAccessReference fieldAccessReference, - int offset, - final List completionProposals, - FileObject fo) { - Collection indexedFunctions = PhpIndexUtils.queryClassMethods( - fo, prefix, fieldAccessReference.ownerClass.identifier, - fieldAccessReference.ownerClass.namespace); - if (indexedFunctions.isEmpty()) { - return; - } - - int anchorOffset = computeAnchorOffset(prefix, offset); for (PhpIndexFunctionResult indexResult : indexedFunctions) { - //to be completed - //might add syntax completion cursor String preview = indexResult.name + indexResult.getParamsAsString(); completionProposals.add(new BladeCompletionProposal.FunctionItem( functionElement(indexResult), - anchorOffset, - indexResult.getClassNamespace(), + offset, preview) ); } } - private static void completeNamespace(String prefix, int offset, - final List completionProposals, - FileObject fo) { + private static void completeNamespace(final List completionProposals, + String prefix, int offset, FileObject fo) { - if (!prefix.startsWith(EditorStringUtils.NAMESPACE_SEPARATOR) && !Character.isUpperCase(prefix.charAt(0))) { - //skip lowercase string from namespce search - return; - } - - //TODO check if this really matters - Project projectOwner = ProjectConvertors.getNonConvertorOwner(fo); - if (projectOwner == null) { - return; - } int substringOffset = prefix.startsWith(EditorStringUtils.NAMESPACE_SEPARATOR) ? 1 : 0; + Collection indexClassResults = PhpIndexUtils.queryNamespace( - projectOwner.getProjectDirectory(), prefix.substring(substringOffset) + fo, prefix.substring(substringOffset) ); + if (indexClassResults.isEmpty()) { return; } - int anchorOffset = computeAnchorOffset(prefix, offset + substringOffset); - + int firstSeparator = Math.max(0, prefix.lastIndexOf(EditorStringUtils.NAMESPACE_SEPARATOR)); + int anchorOffset = offset - firstSeparator - 1; for (PhpIndexResult indexResult : indexClassResults) { + if (!indexResult.name.startsWith(prefix)){ + continue; + } completionProposals.add(new BladeCompletionProposal.NamespaceItem( namespaceElement(indexResult), anchorOffset, indexResult.name)); } } + + private static void completeAllRelativeNamespacesClasses(final List completionProposals, + String prefix, int offset, FileObject fo) { - private static void completeConstants(String prefix, int offset, - final List completionProposals, - FileObject fo) { - Collection indexClassResults = PhpIndexUtils.queryConstants(fo, prefix); + int substringOffset = prefix.startsWith(EditorStringUtils.NAMESPACE_SEPARATOR) ? 1 : 0; + + Collection indexClassResults = PhpIndexUtils.queryAllNamespaceClasses( + fo, prefix.substring(substringOffset) + ); - //treat only uppercase strings - if (!Character.isUpperCase(prefix.charAt(0))) { + if (indexClassResults.isEmpty()) { return; } + for (PhpIndexResult indexResult : indexClassResults) { + completionProposals.add(new BladeCompletionProposal.ClassItem( + classElement(indexResult), offset, indexResult.name, false)); + } + } + + private static void completeNamespaceClasses(final List completionProposals, + String prefix, String namespace, int offset, FileObject fo) { + + Collection indexClassResults = PhpIndexUtils.queryNamespaceClassesName(fo, prefix, namespace) ; + if (indexClassResults.isEmpty()) { return; } - int anchorOffset = computeAnchorOffset(prefix, offset); - for (PhpIndexResult indexResult : indexClassResults) { - completionProposals.add(new BladeCompletionProposal.ConstantItem( - constantElement(indexResult), anchorOffset, indexResult.name)); + completionProposals.add(new BladeCompletionProposal.ClassItem( + classElement(indexResult), offset, indexResult.name, false)); } } - private static void completeClassConstants(String prefix, String ownerClass, int offset, - final List completionProposals, - FileObject fo) { + private static void completeClassConstants(final List completionProposals, + String prefix, String ownerClass, int offset, FileObject fo) { Collection indexClassResults = PhpIndexUtils.queryClassConstants( fo, prefix, ownerClass); //treat only uppercase strings - if (!Character.isUpperCase(prefix.charAt(0))) { + if (prefix.length() > 0 && !Character.isUpperCase(prefix.charAt(0))) { return; } @@ -333,15 +226,43 @@ private static void completeClassConstants(String prefix, String ownerClass, int return; } - int anchorOffset = computeAnchorOffset(prefix, offset); - for (PhpIndexResult indexResult : indexClassResults) { completionProposals.add(new BladeCompletionProposal.ConstantItem( - constantElement(indexResult), anchorOffset, indexResult.name)); + constantElement(indexResult), offset, indexResult.name)); + } + } + + /** + * warning this doesn't check visibility : public, private, protected + * + * @param completionProposals + * @param prefix + * @param fieldAccessReference + * @param offset + * @param fo + */ + private static void completeClassMethods(final List completionProposals, + String prefix, BladePhpSnippetParser.FieldAcces fieldAccessReference, + int offset, FileObject fo) { + Collection indexedFunctions = PhpIndexUtils.queryClassMethods( + fo, prefix, fieldAccessReference.owner.identifier, + fieldAccessReference.owner.namespace, fieldAccessReference.type); + + if (indexedFunctions.isEmpty()) { + return; + } + + for (PhpIndexFunctionResult indexResult : indexedFunctions) { + String preview = indexResult.name + indexResult.getParamsAsString(); + completionProposals.add(new BladeCompletionProposal.FunctionItem( + functionElement(indexResult), + offset, + indexResult.getClassNamespace(), + preview) + ); } } - //TODO might move in a factory for NamedElement private static ClassElement classElement(PhpIndexResult indexResult) { return new ClassElement(indexResult.name, indexResult.namespace, @@ -372,4 +293,97 @@ private static NamedElement namedElement(String preview, PhpIndexResult indexRes public static int computeAnchorOffset(@NonNull String prefix, int offset) { return offset - prefix.length(); } + + public abstract static class PhpCompletionProposal implements CompletionProposal { + + private final ElementHandle element; + private final int anchorOffset; + @NullAllowed + private final String description; + + public PhpCompletionProposal(ElementHandle element, int anchorOffset, String description) { + this.element = element; + this.anchorOffset = anchorOffset; + this.description = description; + } + + @Override + public int getAnchorOffset() { + return anchorOffset; + } + + @Override + public ElementHandle getElement() { + return element; + } + + @Override + public String getName() { + return element.getName(); + } + + @Override + public String getSortText() { + return getName(); + } + + @Override + public int getSortPrioOverride() { + return 0; + } + + @Override + public String getLhsHtml(HtmlFormatter formatter) { + return getName(); + } + + @Override + public ImageIcon getIcon() { + return null; + } + + @Override + public Set getModifiers() { + return Collections.emptySet(); + } + + @Override + public String getCustomInsertTemplate() { + return null; + } + + @Override + public String getInsertPrefix() { + return getName(); + + } + + @Override + public String getRhsHtml(HtmlFormatter formatter) { + return ""; // NOI18N + } + + @Override + public ElementKind getKind() { + return ElementKind.CONSTRUCTOR; + } + + @Override + public boolean isSmart() { + return true; + } + + public String getDescription() { + return description; + } + + } + + public static class PhpKeywordProposal extends PhpCompletionProposal { + + public PhpKeywordProposal(ElementHandle element, int anchorOffset) { + super(element, anchorOffset, null); + } + + } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/providers/BladeHtmlCompletionProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/providers/BladeHtmlCompletionProvider.java new file mode 100644 index 000000000000..04abf598ff58 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/providers/BladeHtmlCompletionProvider.java @@ -0,0 +1,281 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.completion.providers; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.text.AbstractDocument; +import javax.swing.text.BadLocationException; +import javax.swing.text.JTextComponent; +import javax.swing.text.Document; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.Token; +import org.netbeans.api.editor.document.EditorDocumentUtils; +import org.netbeans.api.editor.mimelookup.MimeRegistration; +import org.netbeans.api.editor.mimelookup.MimeRegistrations; +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.modules.php.blade.editor.FileSystemUtils; +import static org.netbeans.modules.php.blade.editor.ResourceUtilities.CUSTOM_HTML_ICON; +import static org.netbeans.modules.php.blade.editor.ResourceUtilities.XML_ATTRIBUTE_ICON; +import org.netbeans.modules.php.blade.editor.components.ComponentModel; +import org.netbeans.modules.php.blade.editor.components.ComponentsQueryService; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; +import org.netbeans.modules.php.blade.project.ComponentsSupport; +import org.netbeans.modules.php.blade.syntax.BladeTagsUtils; +import org.netbeans.modules.php.blade.syntax.StringUtils; +import org.netbeans.modules.php.blade.syntax.antlr4.html_components.BladeHtmlAntlrLexer; +import org.netbeans.modules.php.blade.syntax.antlr4.html_components.BladeHtmlAntlrUtils; +import org.netbeans.modules.php.editor.parser.astnodes.FormalParameter; +import org.netbeans.spi.editor.completion.CompletionItem; +import org.netbeans.spi.editor.completion.CompletionProvider; +import static org.netbeans.spi.editor.completion.CompletionProvider.COMPLETION_QUERY_TYPE; +import org.netbeans.spi.editor.completion.CompletionResultSet; +import org.netbeans.spi.editor.completion.CompletionTask; +import org.netbeans.spi.editor.completion.support.AsyncCompletionQuery; +import org.netbeans.spi.editor.completion.support.AsyncCompletionTask; +import org.netbeans.spi.editor.completion.support.CompletionUtilities; +import org.netbeans.spi.lexer.antlr4.AntlrTokenSequence; +import org.openide.filesystems.FileObject; + +/** + * + * @author bhaidu + */ +@MimeRegistrations(value = { + @MimeRegistration(mimeType = "text/html", service = CompletionProvider.class), + @MimeRegistration(mimeType = BladeLanguage.MIME_TYPE, service = CompletionProvider.class) +}) +public class BladeHtmlCompletionProvider implements CompletionProvider { + + private static final Logger LOGGER = Logger.getLogger(BladeHtmlCompletionProvider.class.getName()); + + @Override + public CompletionTask createTask(int queryType, JTextComponent component) { + return new AsyncCompletionTask(new BladeCompletionQuery(), component); + } + + @Override + public int getAutoQueryTypes(JTextComponent component, String typedText) { + FileObject fo = EditorDocumentUtils.getFileObject(component.getDocument()); + if (fo == null || !fo.getMIMEType().equals(BladeLanguage.MIME_TYPE)) { + return 0; + } + + if (typedText.length() == 0) { + return 0; + } + + //don't autocomplete on space, \n, ) + if (typedText.trim().isEmpty()) { + return 0; + } + + char lastChar = typedText.charAt(typedText.length() - 1); + switch (lastChar) { + case ')': + case '\n': + case '<': + case '>': + return 0; + } + return COMPLETION_QUERY_TYPE; + } + + private class BladeCompletionQuery extends AsyncCompletionQuery { + + public BladeCompletionQuery() { + } + + @Override + protected void query(CompletionResultSet resultSet, Document doc, int caretOffset) { + long startTime = System.currentTimeMillis(); + AbstractDocument adoc = (AbstractDocument) doc; + try { + FileObject fo = EditorDocumentUtils.getFileObject(doc); + + if (fo == null || !fo.getMIMEType().equals(BladeLanguage.MIME_TYPE)) { + return; + } + + adoc.readLock(); + AntlrTokenSequence tokens; + String typedText; + try { + String text = doc.getText(0, doc.getLength()); + typedText = doc.getText(caretOffset - 1, 1); + tokens = new AntlrTokenSequence(new BladeHtmlAntlrLexer(CharStreams.fromString(text))); + } catch (BadLocationException ex) { + return; + } finally { + adoc.readUnlock(); + } + + if (!tokens.isEmpty()) { + tokens.seekTo(caretOffset); + Token queryToken; + + if (tokens.hasNext()) { + queryToken = tokens.next().get(); + } else if (tokens.hasPrevious()) { + queryToken = tokens.previous().get(); + } else { + return; + } + + int queryTokenOffset = queryToken.getStartIndex(); + + //check for context where we have inline css code or offseted blade tags + if (queryTokenOffset > caretOffset) { + int correction = typedText.equals("!") //NOI18N + || typedText.equals("}") ? 0 : 1; //NOI18N + tokens.seekTo(caretOffset - correction); + queryToken = tokens.next().get(); + queryTokenOffset = queryToken.getStartIndex(); + } + + String queryText = queryToken.getText(); + int textLength = queryText.length(); + int endOffset = queryTokenOffset + textLength; + + if (endOffset < caretOffset){ + //out of range + return; + } + + switch (queryToken.getType()) { + case BladeHtmlAntlrLexer.TAG_PART: { + tokens.seekTo(queryToken.getStartIndex() - 1); + if (tokens.hasNext()){ + Token previousToken = tokens.next().get(); + if (previousToken.getType() == BladeHtmlAntlrLexer.RAW_TAG_OPEN && queryText.equals("!")){ //NOI18N + addBladeTagCompletionItem(BladeTagsUtils.RAW_TAG_CLOSE, caretOffset, resultSet); //NOI18N + } + } + break; + } + case BladeHtmlAntlrLexer.HTML_COMPONENT_OPEN_TAG: { + String identifier = ComponentsSupport.tag2ClassName(queryToken.getText()); + completeComponents(identifier, fo, caretOffset, resultSet); + break; + } + case BladeHtmlAntlrLexer.COMPONENT_ATTRIBUTE: { + Set stopTokens = new HashSet<>(); + stopTokens.add(BladeHtmlAntlrLexer.HTML_COMPONENT_OPEN_TAG); + stopTokens.add(BladeHtmlAntlrLexer.GT); + String attributeIdentifier = queryText.startsWith(":") ? queryText.substring(1) : queryText; //NOI18N + Token componentToken = BladeHtmlAntlrUtils.findBackwardWithStop(tokens, BladeHtmlAntlrLexer.HTML_COMPONENT_OPEN_TAG, stopTokens); + if (componentToken != null && componentToken.getType() == BladeHtmlAntlrLexer.HTML_COMPONENT_OPEN_TAG) { + ComponentsQueryService componentComplervice = new ComponentsQueryService(); + String identifier = ComponentsSupport.tag2ClassName(componentToken.getText()); + Collection indexedReferences = componentComplervice.findComponentClass(identifier, fo); + Project projectOwner = FileSystemUtils.getProjectOwner(doc); + ComponentsSupport componentSupport = ComponentsSupport.getInstance(projectOwner); + + if (componentSupport == null){ + break; + } + + for (PhpIndexResult indexReference : indexedReferences) { + ComponentModel componentModel = componentSupport.findComponentClass(indexReference.declarationFile); + if (componentModel == null){ + continue; + } + for (FormalParameter parameter : componentModel.getConstructorProperties()){ + String parameterName = parameter.getParameterName().toString().substring(1); + if (parameterName.startsWith(attributeIdentifier)){ + addSimplAttributeItem(attributeIdentifier, parameterName, caretOffset, resultSet); + } + } + } + } + break; + } + } + + } + } finally { + long time = System.currentTimeMillis() - startTime; + if (time > 2000) { + LOGGER.log(Level.INFO, "Slow completion time detected. {0}ms", time); //NOI18N + } + resultSet.finish(); + } + } + } + + private void completeComponents(String prefixIdentifier, FileObject fo, + int caretOffset, CompletionResultSet resultSet) { + + int insertOffset = caretOffset - prefixIdentifier.length(); + ComponentsQueryService componentComplervice = new ComponentsQueryService(); + Collection indexedReferences = componentComplervice.queryComponents(prefixIdentifier, fo); + + for (PhpIndexResult indexReference : indexedReferences) { + addComponentIdCompletionItem(indexReference, + insertOffset, resultSet); + } + + } + + private void addSimplAttributeItem(String prefix, String attributeName, int caretOffset, CompletionResultSet resultSet) { + int insertOffset = caretOffset - prefix.length(); + CompletionItem item = CompletionUtilities.newCompletionItemBuilder(attributeName) + .iconResource(XML_ATTRIBUTE_ICON) + .startOffset(insertOffset) + .leftHtmlText(attributeName) + .rightHtmlText(" component attribute") //NOI18N + .sortPriority(1) + .build(); + resultSet.addItem(item); + } + + private void addComponentIdCompletionItem(PhpIndexResult indexReference, + int caretOffset, CompletionResultSet resultSet) { + + String tagName = StringUtils.toKebabCase(indexReference.name); + CompletionItem item = CompletionUtilities.newCompletionItemBuilder(tagName) + .iconResource(CUSTOM_HTML_ICON) + .startOffset(caretOffset) + .leftHtmlText(tagName) + .rightHtmlText(indexReference.namespace) + .sortPriority(1) + .build(); + resultSet.addItem(item); + } + + + private void addBladeTagCompletionItem(String tag, + int caretOffset, CompletionResultSet resultSet) { + + String tagName = StringUtils.toKebabCase(tag); + CompletionItem item = CompletionUtilities.newCompletionItemBuilder(tagName) + .iconResource(CUSTOM_HTML_ICON) + .startOffset(caretOffset) + .leftHtmlText(tagName) + .rightHtmlText(tag) + .sortPriority(1) + .build(); + resultSet.addItem(item); + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java deleted file mode 100644 index 499042ed1753..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/AttributeCompletionService.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.editor.components; - -import java.util.ArrayList; -import java.util.Collection; -import org.netbeans.modules.php.blade.editor.components.annotation.Attribute; -import org.netbeans.modules.php.blade.editor.components.annotation.AttributeRegister; - -/** - * - * @author bhaidu - */ -@AttributeRegister({ - @Attribute(name = "class"), - @Attribute(name = "id"), - @Attribute(name = "title"), -}) -public class AttributeCompletionService { - - public Collection queryComponents(String prefix) { - Collection results = new ArrayList<>(); - - for (Attribute attrName : getAttributes()) { - if (attrName.name().startsWith(prefix)){ - results.add(attrName.name()); - } - } - - return results; - } - - public Attribute[] getAttributes() { - AttributeRegister attributeRegister = this.getClass().getAnnotation(AttributeRegister.class); - return attributeRegister.value(); - } -} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentModel.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentModel.java new file mode 100644 index 000000000000..1576220ac0b1 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentModel.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.components; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import org.netbeans.modules.php.editor.parser.astnodes.FormalParameter; +import org.openide.filesystems.FileObject; + +/** + * Basic model class for to store information for a laravel component php class + * + * @author bhaidu + */ +public class ComponentModel { + + private final FileObject file; + private boolean isValid = false; + private final Set constructorProperties = new HashSet<>(); + + private final String[] componentParentClassNames = new String[]{"Component", "BladeComponent"}; // NOI18N + private final Set componentParentClassNamesSet = new HashSet<>(Arrays.asList(componentParentClassNames)); + + public ComponentModel(FileObject file) { + this.file = file; + } + + public boolean isValid() { + return isValid; + } + + public void checkClassValidity(String className) { + isValid = componentParentClassNamesSet.contains(className); + } + + public void addConstructorProperty(FormalParameter property) { + constructorProperties.add(property); + } + + public Set getConstructorProperties() { + return constructorProperties; + } + + public FileObject getFile() { + return file; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java deleted file mode 100644 index fe0564788c17..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsCompletionService.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.editor.components; - -import org.netbeans.modules.php.blade.editor.components.annotation.Namespace; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Map; -import org.netbeans.api.project.Project; -import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; -import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; -import org.netbeans.modules.php.blade.project.ComponentsSupport; -import org.netbeans.modules.php.blade.project.ProjectUtils; -import org.openide.filesystems.FileObject; - -/** - * - * - * @author bhaidu - */ - -public class ComponentsCompletionService { - - public Collection queryComponents(String prefix, FileObject fo) { - Collection results = new ArrayList<>(); - Project project = ProjectUtils.getMainOwner(fo); - - if (project == null){ - return results; - } - - ComponentsSupport componentSupport = ComponentsSupport.getInstance(project); - - if (!componentSupport.isScanned()){ - componentSupport.scanForInstalledComponents(); - } - - for (Map.Entry namespace : componentSupport.getInstalledComponentNamespace().entrySet()){ - results.addAll(PhpIndexUtils.queryNamespaceClassesName(prefix, namespace.getValue().path(), fo)); - } - - return results; - } -} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsQueryService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsQueryService.java new file mode 100644 index 000000000000..84c09294764e --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/ComponentsQueryService.java @@ -0,0 +1,153 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.components; + +import org.netbeans.modules.php.blade.editor.components.annotation.Namespace; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Map; +import org.netbeans.api.annotations.common.CheckForNull; +import org.netbeans.api.project.Project; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.php.blade.editor.BladeLanguage; +import org.netbeans.modules.php.blade.editor.components.plugins.LivewireComponentResource; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; +import org.netbeans.modules.php.blade.project.ComponentsSupport; +import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.netbeans.modules.php.blade.syntax.StringUtils; +import org.openide.filesystems.FileObject; + +/** + * Service class used to search, from index, info about a php component class using identified project related filters like : + * - namespace + * - file path + * + * + * + * @author bhaidu + */ +public class ComponentsQueryService { + + + public Collection queryComponents(String prefix, FileObject fo) { + Collection results = new ArrayList<>(); + Project project = ProjectUtils.getMainOwner(fo); + + if (project == null) { + return results; + } + + ComponentsSupport componentSupport = ComponentsSupport.getInstance(project); + + if (!componentSupport.isScanned()) { + componentSupport.scanForInstalledComponents(); + componentSupport.scanCustomComponentsFolders(); + } + + for (Map.Entry namespace : componentSupport.getInstalledComponentNamespace().entrySet()) { + results.addAll(PhpIndexUtils.queryNamespaceClassesName(fo, prefix, namespace.getValue().path())); + } + + for (Map.Entry componentEntry : componentSupport.getComponentClassCollection().entrySet()) { + FileObject parentDir = componentEntry.getKey().getParent(); + if (componentSupport.getInstalledComponentNamespace().containsKey(parentDir)) { + continue; + } + String className = componentEntry.getKey().getName(); + if (className.toLowerCase().startsWith(prefix)) { + results.add(new PhpIndexResult(className, componentEntry.getKey(), PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); + } + } + + return results; + } + + public Collection findComponentClass(String prefixClassName, FileObject fo) { + Collection results = new ArrayList<>(); + Project project = ProjectUtils.getMainOwner(fo); + + if (project == null) { + return results; + } + + ComponentsSupport componentSupport = ComponentsSupport.getInstance(project); + + if (!componentSupport.isScanned()) { + componentSupport.scanForInstalledComponents(); + componentSupport.scanCustomComponentsFolders(); + } else if (componentSupport.getComponentClassCollection().isEmpty()) { + componentSupport.scanCustomComponentsFolders(); + } + + for (Map.Entry namespace : componentSupport.getInstalledComponentNamespace().entrySet()) { + results.addAll(PhpIndexUtils.queryExactNamespaceClasses(prefixClassName, namespace.getValue().path(), fo)); + } + + if (prefixClassName.contains(StringUtils.DOT)) { + //NOT a complete flow, but it should cover the necessities + String classPathParts[] = prefixClassName.split(StringUtils.ESCAPED_DOT); + String prefixClassPathName = classPathParts[classPathParts.length - 1]; + for (Map.Entry componentEntry : componentSupport.getComponentClassCollection().entrySet()) { + String className = componentEntry.getKey().getName().toLowerCase(); + if (className.equals(prefixClassPathName)) { + results.add(new PhpIndexResult(className, componentEntry.getKey(), PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); + } + } + } else { + for (Map.Entry componentEntry : componentSupport.getComponentClassCollection().entrySet()) { + FileObject parentDir = componentEntry.getKey().getParent(); + if (componentSupport.getInstalledComponentNamespace().containsKey(parentDir)) { + continue; + } + String className = componentEntry.getKey().getName(); + if (className.equals(prefixClassName)) { + results.add(new PhpIndexResult(className, componentEntry.getKey(), PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); + } + } + } + + return results; + } + + @CheckForNull + public FileObject getComponentResourceFile(String componentId, String classQualifiedName, FileObject sourceFo) { + if (classQualifiedName.toLowerCase().contains(LivewireComponentResource.LIVEWIRE_NAME)) { + return getLivewireComponentResourceFile(componentId, sourceFo); + } + + return null; + } + + @CheckForNull + public FileObject getLivewireComponentResourceFile(String componentId, FileObject sourceFo) { + Project project = ProjectUtils.getMainOwner(sourceFo); + if (project == null) { + return null; + } + + FileObject componentResource = project.getProjectDirectory().getFileObject(LivewireComponentResource.RESOURCE_PATH + componentId + BladeLanguage.FILE_EXTENSION_WITH_DOT); // NOI18N + + if (componentResource != null && componentResource.isValid()) { + return componentResource; + } + + return null; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/plugins/LivewireComponentResource.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/plugins/LivewireComponentResource.java new file mode 100644 index 000000000000..c4660168a962 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/components/plugins/LivewireComponentResource.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.components.plugins; + +/** + * + * @author bogdan + */ +public class LivewireComponentResource { + public static final String LIVEWIRE_NAME = "livewire"; // NOI18N + public static final String RESOURCE_PATH = "resources/views/livewire/"; // NOI18N +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/BladeDeclarationFinder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/BladeDeclarationFinder.java new file mode 100644 index 000000000000..d3f6827bbd6b --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/BladeDeclarationFinder.java @@ -0,0 +1,579 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.declaration; + +import java.util.Collection; +import java.util.List; +import javax.swing.text.AbstractDocument; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import org.netbeans.api.html.lexer.HTMLTokenId; +import org.netbeans.api.lexer.Token; +import org.netbeans.api.lexer.TokenHierarchy; +import org.netbeans.api.lexer.TokenSequence; +import org.netbeans.api.project.Project; +import org.netbeans.modules.csl.api.DeclarationFinder; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.modules.csl.api.ElementHandle; +import org.netbeans.modules.csl.api.HtmlFormatter; +import org.netbeans.modules.php.blade.csl.elements.ElementType; +import org.netbeans.modules.php.blade.csl.elements.NamedElement; +import org.netbeans.modules.php.blade.csl.elements.PathElement; +import org.netbeans.modules.php.blade.csl.elements.PhpFunctionElement; +import org.netbeans.modules.php.blade.editor.components.ComponentsQueryService; +import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; +import org.netbeans.modules.php.blade.editor.directives.CustomDirectives.CustomDirective; +import org.netbeans.modules.php.blade.editor.indexing.BladeIndex; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexFunctionResult; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; +import org.netbeans.modules.php.blade.editor.indexing.QueryUtils; +import org.netbeans.modules.php.blade.editor.lexer.BladeLexerUtils; +import org.netbeans.modules.php.blade.editor.lexer.BladeTokenId; +import static org.netbeans.modules.php.blade.editor.lexer.BladeTokenId.BLADE_CUSTOM_DIRECTIVE; +import static org.netbeans.modules.php.blade.editor.lexer.BladeTokenId.BLADE_PAREN; +import static org.netbeans.modules.php.blade.editor.lexer.BladeTokenId.HTML; +import static org.netbeans.modules.php.blade.editor.lexer.BladeTokenId.PHP_BLADE_ECHO_EXPR; +import static org.netbeans.modules.php.blade.editor.lexer.BladeTokenId.PHP_BLADE_EXPRESSION; +import static org.netbeans.modules.php.blade.editor.lexer.BladeTokenId.PHP_BLADE_INLINE_CODE; +import org.netbeans.modules.php.blade.editor.parser.BladeCustomDirectiveOccurences.CustomDirectiveOccurence; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.BladeStringReference; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.Reference; +import org.netbeans.modules.php.blade.editor.path.BladePathUtils; +import org.netbeans.modules.php.blade.project.ComponentsSupport; +import static org.netbeans.modules.php.blade.project.ComponentsSupport.COMPONENT_TAG_NAME_PREFIX; +import org.netbeans.modules.php.blade.syntax.StringUtils; +import static org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpAntlrParser.IDENTIFIER; +import org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpAntlrUtils; +import org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpSnippetParser.PhpReference; +import org.openide.filesystems.FileObject; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; +import org.openide.filesystems.FileUtil; +import org.openide.util.Exceptions; +import static org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpSnippetParser.PhpReferenceType.PHP_FUNCTION; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexerUtils; +import org.netbeans.modules.php.editor.lexer.PHPTokenId; +import org.netbeans.spi.project.ui.support.ProjectConvertors; + +/** + * declaration finder for : + * - include paths + * - section related yields + * - stack locations + * - vite assets path + * - custom directive definitions + * - components class origin + * + * + * @author bhaidu + */ +public class BladeDeclarationFinder implements DeclarationFinder { + + @Override + public OffsetRange getReferenceSpan(Document document, int caretOffset) { + OffsetRange offsetRange = OffsetRange.NONE; + AbstractDocument adoc = (AbstractDocument) document; + + try { + adoc.readLock(); + TokenSequence ts = BladeLexerUtils.getTokenSequence(document, caretOffset); + + if (ts == null) { + return offsetRange; + } + + ts.move(caretOffset); + + if (!ts.moveNext() && !ts.movePrevious()) { + return offsetRange; + } + + Token token = ts.token(); + String caretTokenText = token.text().toString(); + BladeTokenId id = token.id(); + int tokenStart = ts.offset(); + + switch (id) { + case BLADE_CUSTOM_DIRECTIVE: { + return new OffsetRange(tokenStart, tokenStart + caretTokenText.length()); + } + case PHP_BLADE_EXPRESSION: { + return getReferenceSpanInsidePhpExpr(document, ts, token, caretOffset); + } + case PHP_BLADE_ECHO_EXPR: + case PHP_BLADE_INLINE_CODE: { + return getPhpReferenceSpan(caretTokenText, caretOffset, tokenStart); + } + case PHP_INLINE: { + TokenSequence tsPhp = BladeLexerUtils.getPhpTokenSequence(document, caretOffset); + if (tsPhp == null) { + return offsetRange; + } + tsPhp.move(caretOffset); + + if (!tsPhp.moveNext() && !tsPhp.movePrevious()) { + return offsetRange; + } + + Token phpToken = tsPhp.token(); + PHPTokenId phpTokenId = phpToken.id(); + if (phpTokenId.equals(PHPTokenId.PHP_STRING)) { + return new OffsetRange(tsPhp.offset(), tsPhp.offset() + phpToken.length()); + } + break; + } + case HTML: { + TokenHierarchy th = TokenHierarchy.get(document); + Token htmlToken = BladeLexerUtils.getHtmlToken(th, caretOffset); + + if (htmlToken == null) { + return offsetRange; + } + + HTMLTokenId htmlTokenId = htmlToken.id(); + int tokenOffset = htmlToken.offset(th); + + if (htmlTokenId.equals(HTMLTokenId.TAG_OPEN)) { + String tag = htmlToken.text().toString(); + if (tag.startsWith(COMPONENT_TAG_NAME_PREFIX)) { // NOI18N + return new OffsetRange(tokenOffset, tokenOffset + htmlToken.length()); + } + } + + break; + } + + } + } finally { + adoc.readUnlock(); + } + + return offsetRange; + } + + public OffsetRange getReferenceSpanInsidePhpExpr(Document document, + TokenSequence ts, + Token token, int caretOffset) { + + OffsetRange offsetRange = OffsetRange.NONE; + int phpExprStart = ts.offset(); + ts.movePrevious(); + + boolean prevTokenIsParenthesis = ts.token().id().equals(BLADE_PAREN); + + if (prevTokenIsParenthesis && !ts.movePrevious()) { + //move before the parenthesis + return offsetRange; + } + + Token prevToken = ts.token(); + int start = ts.offset(); + int snippetLength = prevToken.length() + token.length() + 2; + int end = ts.offset() + snippetLength; + + boolean isBetween = start <= caretOffset && caretOffset <= end; + + if (!isBetween) { + return offsetRange; + } + + if (snippetLength > document.getLength()) { + return offsetRange; + } + + try { + String snippet = document.getText(start, snippetLength); + int parenPos = snippet.indexOf("("); // NOI18N + String directive = snippet.startsWith("@") && parenPos != -1 ? snippet.substring(0, parenPos) : null; // NOI18N + int referencedOffset = caretOffset - start; + + if (directive != null) {//we can filter for identifiable directives here + org.antlr.v4.runtime.Token targetetToken = BladeAntlrLexerUtils.getToken(snippet, referencedOffset); + if (targetetToken != null && targetetToken.getType() == IDENTIFIABLE_STRING) { + offsetRange = new OffsetRange(targetetToken.getStartIndex() + start, start + targetetToken.getStopIndex() + 1); + return offsetRange; + } + } + //php context + return getPhpReferenceSpan(token.text().toString(), caretOffset, phpExprStart); + } catch (BadLocationException ex) { + Exceptions.printStackTrace(ex); + } + return offsetRange; + } + + @Override + public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) { + DeclarationLocation location = DeclarationLocation.NONE; + final TokenHierarchy th = info.getSnapshot().getTokenHierarchy(); + + if (th == null) { + return location; + } + + TokenSequence ts = BladeLexerUtils.getBladeTokenSequenceDoc(th, caretOffset); + + if (ts == null) { + return location; + } + + ts.move(caretOffset); + + if (!ts.moveNext() && !ts.movePrevious()) { + return location; + } + + Token token = ts.token(); + BladeTokenId id = token.id(); + + BladeParserResult parserResult = (BladeParserResult) info; + FileObject currentFile = parserResult.getFileObject(); + + switch (id) { + case BLADE_CUSTOM_DIRECTIVE: { + return findCustomDirectiveDeclaration(parserResult, caretOffset, currentFile, location); + } + case HTML: { + return findComponentClassDeclaration(th, caretOffset, currentFile, location); + } + } + //we can have string or php reference + BladeStringReference bladeReference = parserResult.getBladeReferenceIdsCollection().findOccuredRefrence(caretOffset); + OffsetRange caretRange; + + if (bladeReference != null) { + String referenceIdentifier = bladeReference.identifier; + + switch (bladeReference.antlrTokentype) { + case D_SECTION: + case D_HAS_SECTION: + case D_SECTION_MISSING: { + String yieldId = referenceIdentifier; + List yields = QueryUtils.findYieldReferences(yieldId, currentFile); + if (yields == null) { + return DeclarationLocation.NONE; + } + + for (BladeIndex.IndexedReference yieldReference : yields) { + location = buildDeclarationLocationFromIndex(location, yieldReference, ElementType.YIELD_ID); + } + + return location; + } + case D_EXTENDS: + case D_INCLUDE: + case D_INCLUDE_IF: + case D_INCLUDE_WHEN: + case D_INCLUDE_UNLESS: + case D_INCLUDE_FIRST: + case D_EACH: { + String viewPath = referenceIdentifier; + List includedFiles = BladePathUtils.findFileObjectsForBladeViewPath(currentFile, viewPath); + + if (includedFiles.isEmpty()) { + return DeclarationLocation.NONE; + } + + for (FileObject includedFile : includedFiles) { + PathElement elHandle = new PathElement(referenceIdentifier, includedFile); + DeclarationLocation dln = new DeclarationFinder.DeclarationLocation(includedFile, 0, elHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = dln; + } + location.addAlternative(new AlternativeLocationImpl(dln)); + } + return location; + } + case D_PUSH: + case D_PUSH_IF: + case D_PREPEND: { + String stackId = referenceIdentifier; + List stacks = QueryUtils.findStacksReferences(stackId, currentFile); + + if (stacks == null) { + return DeclarationLocation.NONE; + } + + for (BladeIndex.IndexedReference stackReference : stacks) { + String stackReferenceId = stackReference.getReference().identifier; + NamedElement yieldIdHandle = new NamedElement(stackReferenceId, stackReference.getOriginFile(), ElementType.STACK_ID); + int startOccurence = stackReference.getReference().defOffset.getStart(); + DeclarationLocation dlstack = new DeclarationFinder.DeclarationLocation(stackReference.getOriginFile(), startOccurence, yieldIdHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = dlstack; + } + location.addAlternative(new AlternativeLocationImpl(dlstack)); + } + + return location; + } + case D_VITE: { + String vitePath = referenceIdentifier; + Project projectOwner = ProjectConvertors.getNonConvertorOwner(currentFile); + + if (projectOwner == null || projectOwner.getProjectDirectory() == null) { + return location; + } + + FileObject assetFile = projectOwner.getProjectDirectory().getFileObject(vitePath); + + if (assetFile != null) { + NamedElement resultHandle = new NamedElement(referenceIdentifier, assetFile, ElementType.ASSET_FILE); + DeclarationLocation constantLocation = new DeclarationFinder.DeclarationLocation(assetFile, 0, resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = constantLocation; + } + location.addAlternative(new AlternativeLocationImpl(constantLocation)); + return location; + } + } + } + } else if ((caretRange = parserResult.getBladePhpExpressionOccurences().findPhpExpressionLocation(caretOffset)) != null) { + int referenceOffset = caretOffset - caretRange.getStart(); + PhpElementsDeclarationService phpDeclService = new PhpElementsDeclarationService(); + PhpReference phpRef = phpDeclService.findReferenceAtCaret(info, caretRange, referenceOffset, currentFile); + + if (phpRef == null) { + return location; + } + + switch (phpRef.type) { + case PHP_FUNCTION: { + Collection functionResults = PhpIndexUtils.queryExactFunctions(currentFile, phpRef.identifier); + return phpDeclService.buildFunctionDeclLocation(phpRef, functionResults); + } + case PHP_CLASS: { + Collection results; + if (phpRef.namespace != null) { + results = PhpIndexUtils.queryExactNamespaceClasses(phpRef.identifier, phpRef.namespace, currentFile); + } else { + results = PhpIndexUtils.queryExactClass(phpRef.identifier, currentFile); + } + + if (results != null && !results.isEmpty()) { + return phpDeclService.buildDeclLocation(phpRef.identifier, ElementType.PHP_CLASS, results); + } + + return location; + } + case PHP_METHOD: { + String queryNamespace = phpRef.namespace; + + if (phpRef.ownerClass == null){ + return location; + } + + Collection indexMethodResults = PhpIndexUtils.queryExactClassMethods(currentFile, + phpRef.identifier, phpRef.ownerClass.identifier, queryNamespace); + + for (PhpIndexFunctionResult indexResult : indexMethodResults) { + PhpFunctionElement resultHandle = new PhpFunctionElement( + phpRef.identifier, + indexResult.declarationFile, + ElementType.PHP_FUNCTION, + indexResult.getClassNamespace(), + indexResult.getParams() + ); + DeclarationLocation functionLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = functionLocation; + } + location.addAlternative(new AlternativeLocationImpl(functionLocation)); + } + return location; + } + case PHP_CLASS_CONSTANT: { + Collection results = null; + if (phpRef.ownerClass != null) { + results = PhpIndexUtils.queryExactClassConstants(phpRef.identifier, phpRef.ownerClass.identifier, currentFile); + } + if (results != null && !results.isEmpty()) { + return phpDeclService.buildDeclLocation(phpRef.identifier, ElementType.PHP_CONSTANT, results); + } + + return location; + } + } + } + + return DeclarationLocation.NONE; + } + + private DeclarationLocation findCustomDirectiveDeclaration( + BladeParserResult parserResult, int caretOffset, FileObject currentFile, + DeclarationLocation location + ) { + Project projectOwner = ProjectConvertors.getNonConvertorOwner(currentFile); + if (projectOwner == null) { + return location; + } + + CustomDirectiveOccurence customDirectiveOccurence = parserResult.getBladeCustomDirectiveOccurences().findCustomDirectiveOccurence(caretOffset); + + if (customDirectiveOccurence == null) { + return location; + } + + CustomDirectives.getInstance(projectOwner).filterAction(new CustomDirectives.FilterCallbackDeclaration(location) { + @Override + public void filterDirectiveName(CustomDirective directive, FileObject file) { + if (directive.getName().equals(customDirectiveOccurence.directiveName)) { + NamedElement customDirectiveHandle = new NamedElement(customDirectiveOccurence.directiveName, file, ElementType.CUSTOM_DIRECTIVE); + DeclarationFinder.DeclarationLocation newLoc = new DeclarationFinder.DeclarationLocation(file, directive.getOffset(), customDirectiveHandle); + this.location.addAlternative(new AlternativeLocationImpl(newLoc)); + } + } + }); + + if (!location.getAlternativeLocations().isEmpty()) { + for (AlternativeLocation loc : location.getAlternativeLocations()) { + location = loc.getLocation(); + } + } + return location; + } + + private DeclarationLocation findComponentClassDeclaration( + TokenHierarchy th, int caretOffset, FileObject currentFile, DeclarationLocation location) { + Project projectOwner = ProjectConvertors.getNonConvertorOwner(currentFile); + if (projectOwner == null) { + return location; + } + + Token htmlToken = BladeLexerUtils.getHtmlToken(th, caretOffset); + + if (htmlToken == null) { + return location; + } + + HTMLTokenId htmlTokenId = htmlToken.id(); + + if (htmlTokenId.equals(HTMLTokenId.TAG_OPEN)) { + String tag = htmlToken.text().toString(); + if (!tag.startsWith(COMPONENT_TAG_NAME_PREFIX)) { + return location; + } + ComponentsQueryService componentComplervice = new ComponentsQueryService(); + String className = StringUtils.kebabToCamel(tag.substring(COMPONENT_TAG_NAME_PREFIX.length())); + + Collection indexedReferences = componentComplervice.findComponentClass(className, currentFile); + ComponentsSupport componentSupport = ComponentsSupport.getInstance(projectOwner); + + if (componentSupport == null) { + return location; + } + + for (PhpIndexResult indexReference : indexedReferences) { + NamedElement resultHandle = new NamedElement(className, indexReference.declarationFile, ElementType.LARAVEL_COMPONENT); + DeclarationLocation constantLocation = new DeclarationFinder.DeclarationLocation(indexReference.declarationFile, indexReference.getStartOffset(), resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = constantLocation; + } + location.addAlternative(new AlternativeLocationImpl(constantLocation)); + + if (!location.equals(DeclarationLocation.NONE)) { + FileObject resource = componentComplervice.getComponentResourceFile(tag, indexReference.name, currentFile); + if (resource != null) { + PathElement resourceHandle = new PathElement(tag, resource); + DeclarationLocation resourceLocation = new DeclarationFinder.DeclarationLocation(resource, indexReference.getStartOffset(), resourceHandle); + location.addAlternative(new AlternativeLocationImpl(resourceLocation)); + } + } + } + } + return location; + } + + public static class AlternativeLocationImpl implements AlternativeLocation { + + private final DeclarationLocation location; + + public AlternativeLocationImpl(DeclarationLocation location) { + this.location = location; + } + + @Override + public ElementHandle getElement() { + return getLocation().getElement(); + } + + @Override + public String getDisplayHtml(HtmlFormatter formatter) { + ElementHandle el = getLocation().getElement(); + if (el != null) { + formatter.appendText(el.getName()); + if (el.getFileObject() != null) { + formatter.appendText(" in "); // NOI18N + formatter.appendText(FileUtil.getFileDisplayName(el.getFileObject())); + } + return formatter.getText(); + } + return getLocation().toString(); + } + + @Override + public DeclarationFinder.DeclarationLocation getLocation() { + return location; + } + + @Override + public int compareTo(DeclarationFinder.AlternativeLocation o) { + return 0; + } + + } + + //php context + public OffsetRange getPhpReferenceSpan(String phpExpr, int caretOffset, int phpExprStart) { + OffsetRange offsetRange = OffsetRange.NONE; + + int referencedOffset = caretOffset - phpExprStart; + org.antlr.v4.runtime.Token targetetToken = BladePhpAntlrUtils.getToken(phpExpr, referencedOffset); + + if (targetetToken == null) { + return offsetRange; + } + + if (targetetToken.getType() == IDENTIFIER) { + offsetRange = new OffsetRange(targetetToken.getStartIndex() + phpExprStart, phpExprStart + targetetToken.getStopIndex() + 1); + return offsetRange; + } + + return offsetRange; + } + + private DeclarationLocation buildDeclarationLocationFromIndex(DeclarationLocation location, + BladeIndex.IndexedReference indexedReference, ElementType type) { + Reference reference = indexedReference.getReference(); + String referenceId = reference.identifier; + FileObject originFile = indexedReference.getOriginFile(); + NamedElement referenceHandle = new NamedElement(referenceId, originFile, type); + int startOccurence = reference.defOffset.getStart(); + DeclarationLocation declItem = new DeclarationFinder.DeclarationLocation(originFile, startOccurence, referenceHandle); + + if (location.equals(DeclarationLocation.NONE)) { + location = declItem; + } + + location.addAlternative(new AlternativeLocationImpl(declItem)); + return location; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java index 36ccd003cd92..422ae00901fa 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/ComponentDeclarationService.java @@ -25,6 +25,7 @@ import org.netbeans.api.project.Project; import org.netbeans.modules.php.blade.editor.BladeLanguage; import org.netbeans.modules.php.blade.editor.components.annotation.Namespace; +import org.netbeans.modules.php.blade.editor.components.plugins.LivewireComponentResource; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils; import org.netbeans.modules.php.blade.project.ComponentsSupport; @@ -60,7 +61,7 @@ public Collection queryComponents(String prefix, FileObject fo) @CheckForNull public FileObject getComponentResourceFile(String componentId, String classQualifiedName, FileObject sourceFo) { - if (classQualifiedName.toLowerCase().contains(ComponentsSupport.LIVEWIRE_NAME)){ + if (classQualifiedName.toLowerCase().contains(LivewireComponentResource.LIVEWIRE_NAME)){ return getLivewireComponentResourceFile(componentId, sourceFo); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/PhpElementsDeclarationService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/PhpElementsDeclarationService.java new file mode 100644 index 000000000000..d9294b889f1d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/PhpElementsDeclarationService.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.declaration; + +import java.util.Collection; +import org.netbeans.modules.csl.api.DeclarationFinder; +import org.netbeans.modules.csl.api.DeclarationFinder.DeclarationLocation; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.csl.spi.ParserResult; +import org.netbeans.modules.php.blade.csl.elements.ElementType; +import org.netbeans.modules.php.blade.csl.elements.NamedElement; +import org.netbeans.modules.php.blade.csl.elements.PhpFunctionElement; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexFunctionResult; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; +import org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpSnippetParser; +import static org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpSnippetParser.PhpReference; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class PhpElementsDeclarationService { + + public PhpReference findReferenceAtCaret(ParserResult info, OffsetRange phpExprRange, int referenceOffset, FileObject file) { + CharSequence phpExprSnippet = info.getSnapshot().getText().subSequence(phpExprRange.getStart(), phpExprRange.getEnd()); + BladePhpSnippetParser phpSnippetParser = new BladePhpSnippetParser(phpExprSnippet.toString(), file, referenceOffset); + phpSnippetParser.parse(); + return phpSnippetParser.findIdentifierReference(referenceOffset); + } + + public DeclarationLocation buildFunctionDeclLocation(PhpReference phpRef, + Collection functionResults) { + DeclarationLocation location = DeclarationLocation.NONE; + for (PhpIndexFunctionResult indexResult : functionResults) { + PhpFunctionElement resultHandle = new PhpFunctionElement( + phpRef.identifier, + indexResult.declarationFile, + ElementType.PHP_FUNCTION, + indexResult.getParams() + ); + DeclarationLocation functionLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = functionLocation; + } + location.addAlternative(new BladeDeclarationFinder.AlternativeLocationImpl(functionLocation)); + } + + return location; + } + + public DeclarationLocation buildDeclLocation(String referenceIdentifier, ElementType type, Collection indexedResults) { + DeclarationLocation location = DeclarationLocation.NONE; + for (PhpIndexResult indexResult : indexedResults) { + NamedElement resultHandle = new NamedElement(referenceIdentifier, indexResult.declarationFile, type); + DeclarationLocation classLocation = new DeclarationFinder.DeclarationLocation(indexResult.declarationFile, indexResult.getStartOffset(), resultHandle); + if (location.equals(DeclarationLocation.NONE)) { + location = classLocation; + } + location.addAlternative(new BladeDeclarationFinder.AlternativeLocationImpl(classLocation)); + } + return location; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java index 61d923e2482b..0666626a63da 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java @@ -37,6 +37,9 @@ import org.netbeans.modules.parsing.api.UserTask; import org.netbeans.modules.parsing.spi.ParseException; import org.netbeans.modules.php.blade.project.BladeProjectProperties; +import static org.netbeans.modules.php.blade.project.BladeProjectSupport.APP_PROVIDER_RELATIVE_PATH; +import static org.netbeans.modules.php.blade.syntax.BladeDirectivesUtils.DIRECTIVE_ELSE; +import static org.netbeans.modules.php.blade.syntax.BladeDirectivesUtils.END_DIRECTIVE_PREFIX; import org.netbeans.modules.php.editor.parser.PHPParseResult; import org.netbeans.modules.php.editor.parser.astnodes.Expression; import org.netbeans.modules.php.editor.parser.astnodes.FunctionInvocation; @@ -58,7 +61,7 @@ public final class CustomDirectives { private static final Map INSTANCES = new WeakHashMap<>(); private final Map> customDirectives = new LinkedHashMap<>(); - private List customDirectiveList = new ArrayList<>(); + public List customDirectiveList = new ArrayList<>(); private final FileChangeListener fileChangeListener = new FileChangeListenerImpl(); @@ -95,15 +98,9 @@ private CustomDirectives(Project project) { } private void extractCustomDirectives() { - LOGGER.info("Extracting custom directives"); // NOI18N - BladeProjectProperties bladeProperties = BladeProjectProperties.getInstance(project); - - if (bladeProperties == null) { - return; - } - - String[] compilerPathList = bladeProperties.getDirectiveRegistrationsPathList(); - FileObject defaultAppProvider = project.getProjectDirectory().getFileObject("app/Providers/AppServiceProvider.php"); // NOI18N + LOGGER.info("Extracting custom directives"); + String[] compilerPathList = BladeProjectProperties.getInstance(project).getCompilerPathList(); + FileObject defaultAppProvider = project.getProjectDirectory().getFileObject(APP_PROVIDER_RELATIVE_PATH); String defaultAppPath = ""; if (defaultAppProvider != null) { @@ -150,7 +147,6 @@ public void addDirectiveNamesFromFile(FileObject file) { if (source == null) { return; } - try { ParserManager.parse(Collections.singleton(source), new UserTask() { @Override @@ -180,6 +176,41 @@ public Map> getCustomDirectives() { return customDirectives; } + public void filterAction(FilterCallback callback) { + for (Map.Entry> entry : customDirectives.entrySet()) { + if (!entry.getKey().isValid()) { + continue; + } + + for (CustomDirective directive : entry.getValue()) { + callback.filterDirectiveName(directive, entry.getKey()); + } + + } + } + + public void filterAction(FilterCallbackDeclaration callback) { + for (Map.Entry> entry : customDirectives.entrySet()) { + if (!entry.getKey().isValid()) { + continue; + } + + for (CustomDirective directive : entry.getValue()) { + callback.filterDirectiveName(directive, entry.getKey()); + } + + } + } + + public boolean customDirectiveConfigured(String query) { + for (CustomDirectives.CustomDirective customDirective : customDirectiveList) { + if (customDirective.name.equals(query)) { + return true; + } + } + return false; + } + public class DirectiveNames { private final List directiveNames; @@ -226,12 +257,15 @@ public void visit(FunctionInvocation node) { if (directiveName != null && directiveName instanceof Scalar) { Scalar name = (Scalar) directiveName; String escapedDirectiveName = name.getStringValue().replaceAll("^[\"|\']|[\"|[\']]$", ""); // NOI18N - directives.add(new CustomDirective("@" + escapedDirectiveName, name.getStartOffset())); + //Custom If Statements - if (functionName.equals("if")) { + if (functionName.equals("if")) { // NOI18N + directives.add(new CustomDirective("@" + escapedDirectiveName, name.getStartOffset(), true)); // NOI18N directives.add(new CustomDirective("@unless" + escapedDirectiveName, name.getStartOffset())); // NOI18N - directives.add(new CustomDirective("@else" + escapedDirectiveName, name.getStartOffset())); // NOI18N - directives.add(new CustomDirective("@end" + escapedDirectiveName, name.getStartOffset())); // NOI18N + directives.add(new CustomDirective(DIRECTIVE_ELSE + escapedDirectiveName, name.getStartOffset())); + directives.add(new CustomDirective(END_DIRECTIVE_PREFIX + escapedDirectiveName, name.getStartOffset())); + } else { + directives.add(new CustomDirective("@" + escapedDirectiveName, name.getStartOffset())); // NOI18N } } } @@ -265,41 +299,6 @@ private void processFile(FileObject file) { } - public void filterAction(FilterCallback callback) { - for (Map.Entry> entry : customDirectives.entrySet()) { - if (!entry.getKey().isValid()) { - continue; - } - - for (CustomDirective directive : entry.getValue()) { - callback.filterDirectiveName(directive, entry.getKey()); - } - - } - } - - public void filterAction(FilterCallbackDeclaration callback) { - for (Map.Entry> entry : customDirectives.entrySet()) { - if (!entry.getKey().isValid()) { - continue; - } - - for (CustomDirective directive : entry.getValue()) { - callback.filterDirectiveName(directive, entry.getKey()); - } - - } - } - - public boolean customDirectiveConfigured(String query) { - for (CustomDirectives.CustomDirective customDirective : customDirectiveList) { - if (customDirective.name.equals(query)) { - return true; - } - } - return false; - } - public static interface FilterCallback { public void filterDirectiveName(CustomDirective directive, FileObject file); @@ -320,16 +319,21 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { public static class CustomDirective { private final String name; - private int offset = 0; + private final int offset; + private final boolean isBlockDirective; + + public CustomDirective(String name, int offset) { + this(name, offset, false); + } public CustomDirective(String name) { - this.name = name; - this.offset = 0; + this(name, 0, false); } - public CustomDirective(String name, int offset) { + public CustomDirective(String name, int offset, boolean isBlock) { this.name = name; this.offset = offset; + this.isBlockDirective = isBlock; } public String getName() { @@ -339,5 +343,9 @@ public String getName() { public int getOffset() { return offset; } + + public boolean isBlockDirective() { + return isBlockDirective; + } } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java index a952d3a209ac..0523b1baabe4 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java @@ -32,7 +32,9 @@ import org.netbeans.modules.csl.api.Rule.ErrorRule; import org.netbeans.modules.csl.api.RuleContext; import org.netbeans.modules.csl.api.HintsProvider; +import org.netbeans.modules.php.blade.editor.BladeLanguage; import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; +import static org.netbeans.modules.php.blade.editor.hints.PhpDirectiveSyntaxErrorRule.PHP_SYNTAX_ERROR_HINT_ID; import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; import org.netbeans.modules.php.blade.editor.path.BladePathUtils; import org.netbeans.modules.php.blade.project.ProjectUtils; @@ -71,16 +73,12 @@ public void computeHints(HintsManager manager, RuleContext context, List h continue; } if (astRule instanceof UnknownDirective) { - for (Map.Entry entry : parserResult.customDirectivesReferences.entrySet()) { - if (entry.getValue().type == BladeParserResult.ReferenceType.POSSIBLE_DIRECTIVE) { - continue; - } - - if (ct.customDirectiveConfigured(entry.getValue().identifier)) { + for (Map.Entry entry : parserResult.getBladeCustomDirectiveOccurences().getAll().entrySet()) { + if (ct.customDirectiveConfigured(entry.getValue())) { continue; } hints.add(new Hint(astRule, - "Unknown directive. Try adding the provider class file using Project -> Properties -> Custom Directives", + "Unknown directive. Try adding the provider class file using Project -> Properties -> Custom Directives", //NOI18N context.parserResult.getSnapshot().getSource().getFileObject(), entry.getKey(), Collections.emptyList(), @@ -91,7 +89,7 @@ public void computeHints(HintsManager manager, RuleContext context, List h } //validate path config - for (Map.Entry> entry : parserResult.includeBladeOccurences.entrySet()) { + for (Map.Entry> entry : parserResult.getBladeReferenceIdsCollection().getIncludePathsOccurences().entrySet()) { FileObject realFile = BladePathUtils.findFileObjectForBladeViewPath(parserResult.getFileObject(), entry.getKey()); if (realFile != null) { @@ -180,6 +178,17 @@ public List getBuiltinRules() { public RuleContext createRuleContext() { return new BladeRuleContext(); } + + public static boolean phpSyntaxErrorsDisplayEnabled() { + HintsManager bladeHintsManager = HintsProvider.HintsManager.getManagerForMimeType(BladeLanguage.MIME_TYPE); + Map> allHints = bladeHintsManager.getHints(); + List phpSyntaxHints = allHints.get(PHP_SYNTAX_ERROR_HINT_ID); //NOI18N + if (phpSyntaxHints == null || phpSyntaxHints.isEmpty()) { + return false; + } + Rule.AstRule rule = phpSyntaxHints.get(0); + return bladeHintsManager.isEnabled(rule); + } private static final class BladeRule implements ErrorRule { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/Bundle.properties b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/Bundle.properties new file mode 100644 index 000000000000..eac084f5fafe --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/Bundle.properties @@ -0,0 +1,27 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +UnknownDirectiveHintMsg=Unknown directive. Try adding the provider class file using Project -> Properties -> Custom Directives +BladeViewNotFound=Blade path not found.\ +For custom blade context you can try to set the root folder using:\ +Project -> Properties -> Laravel Blade -> Views Folder + +AST_Rule_UnknownDirective=Unknown Directive +AST_Rule_UnknownDirectiveDescription=Unknown Directive. The directive my not be in the base laravel blade compiler and was not found in the custom list. + +AST_Rule_PhpSyntaxError=`@php` directive syntax error +AST_Rule_PhpSyntaxErrorDescription=Php Syntax error for `@php` directives diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/PhpDirectiveSyntaxErrorRule.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/PhpDirectiveSyntaxErrorRule.java new file mode 100644 index 000000000000..dadddb12c38b --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/PhpDirectiveSyntaxErrorRule.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.hints; + +import java.util.Collections; +import java.util.Set; +import java.util.prefs.Preferences; +import javax.swing.JComponent; +import org.netbeans.modules.csl.api.HintSeverity; +import org.netbeans.modules.csl.api.Rule; +import org.netbeans.modules.csl.api.RuleContext; +import org.openide.util.NbBundle; + +/** + * + * @author bogdan + */ +public class PhpDirectiveSyntaxErrorRule implements Rule.AstRule { + public static final String PHP_SYNTAX_ERROR_HINT_ID = "blade.hint.php_syntax_errors"; //NOI18N + + @Override + public boolean getDefaultEnabled() { + return false; + } + + @Override + public JComponent getCustomizer(Preferences node) { + return null; + } + + @Override + public boolean appliesTo(RuleContext context) { + return context instanceof BladeHintsProvider.BladeRuleContext; + } + + @Override + public boolean showInTasklist() { + return true; + } + + @Override + public HintSeverity getDefaultSeverity() { + return HintSeverity.ERROR; + } + + @Override + public Set getKinds() { + return Collections.singleton(PHP_SYNTAX_ERROR_HINT_ID); + } + + @Override + public String getId() { + return PHP_SYNTAX_ERROR_HINT_ID; + } + + @Override + public String getDescription() { + return NbBundle.getMessage(PhpDirectiveSyntaxErrorRule.class, "AST_Rule_PhpSyntaxError"); //NOI18N + } + + @Override + public String getDisplayName() { + return NbBundle.getMessage(PhpDirectiveSyntaxErrorRule.class, "AST_Rule_PhpSyntaxErrorDescription"); //NOI18N + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndexer.java index d7f9f5d5a32d..923cfd351097 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndexer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/BladeIndexer.java @@ -38,8 +38,10 @@ import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.Reference; import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.ReferenceType; +import org.netbeans.modules.php.blade.editor.parser.BladeReferenceIdsCollection; import org.netbeans.modules.php.blade.editor.path.BladePathUtils; import org.netbeans.modules.php.blade.project.ProjectUtils; +import org.netbeans.modules.php.blade.syntax.StringUtils; import org.openide.filesystems.FileObject; import org.openide.util.Exceptions; @@ -59,39 +61,41 @@ public class BladeIndexer extends EmbeddingIndexer { public static final String INCLUDE_PATH = "include"; //NOI18N public static final String BLADE_PATH = "path"; //NOI18N public static final String INFO_SEPARATOR = "#"; //NOI18N + public static final String RANGE_SEPARATOR = ";"; //NOI18N @Override protected void index(Indexable indxbl, Parser.Result result, Context context) { long startTime = System.currentTimeMillis(); - LOGGER.log(Level.INFO, "Indexer requested {0}", context.getIndexFolder().getName()); + BladeParserResult parserResult; - if (result instanceof BladeParserResult) { - parserResult = (BladeParserResult) result; - } else { + + if (!(result instanceof BladeParserResult)) { return; } - //we have errors + parserResult = (BladeParserResult) result; + if (!parserResult.getDiagnostics().isEmpty()) { return; } - // LOGGER.log(Level.INFO, "indexing {0}", result.getSnapshot().getSource().getFileObject().getName()); + try { IndexingSupport support = IndexingSupport.getInstance(context); - // we need to remove old documents (document per object, not file) + support.removeDocuments(indxbl); IndexDocument document = support.createDocument(indxbl); - if (!parserResult.getYieldReferences().isEmpty()) { - storeYieldReferences(parserResult.getYieldReferences(), document); + BladeReferenceIdsCollection referenceCollection = parserResult.getBladeReferenceIdsCollection(); + if (!referenceCollection.getYieldIdOccurences().isEmpty()) { + storeYieldReferences(referenceCollection.getYieldIdOccurences(), document); } - if (!parserResult.getStackReferences().isEmpty()) { - storeStackReferences(parserResult.getStackReferences(), document); + if (!referenceCollection.getStackIdOccurences().isEmpty()) { + storeStackReferences(referenceCollection.getStackIdOccurences(), document); } - if (!parserResult.includeBladeOccurences.isEmpty()) { - storeIncludePathReferences(parserResult.includeBladeOccurences, document); + if (!referenceCollection.getIncludePathsOccurences().isEmpty()) { + storeIncludePathReferences(referenceCollection.getIncludePathsOccurences(), document); } storeFilePathAsBladePath(parserResult.getSnapshot().getSource().getFileObject(), document); @@ -99,7 +103,11 @@ protected void index(Indexable indxbl, Parser.Result result, Context context) { document.addPair(BLADE_INDEXED, Boolean.TRUE.toString(), true, true); support.addDocument(document); - LOGGER.log(Level.INFO, "Indexer finished {0}", System.currentTimeMillis() - startTime); + long time = System.currentTimeMillis() - startTime; + + if (time > 2000) { + LOGGER.log(Level.INFO, "Indexer for " + context.getIndexFolder().getName() + " finished in {0} ms", System.currentTimeMillis() - startTime); + } } catch (IOException ex) { LOGGER.log(Level.WARNING, null, ex); Exceptions.printStackTrace(ex); @@ -108,28 +116,28 @@ protected void index(Indexable indxbl, Parser.Result result, Context context) { } } - private void storeYieldReferences(Map yields, IndexDocument document) { + private void storeYieldReferences(Map yields, IndexDocument document) { - for (Map.Entry entry : yields.entrySet()) { + for (Map.Entry entry : yields.entrySet()) { StringBuilder sb = new StringBuilder(); - Reference ref = entry.getValue(); + OffsetRange range = entry.getValue(); //used for completion document.addPair(YIELD_ID, entry.getKey(), true, true); - sb.append(entry.getKey()).append(INFO_SEPARATOR).append(ref.defOffset.getStart()).append(";").append(ref.defOffset.getEnd()); //NOI18N + sb.append(entry.getKey()).append(INFO_SEPARATOR).append(range.getStart()).append(RANGE_SEPARATOR).append(range.getEnd()); //used for declaration finder document.addPair(YIELD_REFERENCE, sb.toString(), true, true); } } - private void storeStackReferences(Map stacks, IndexDocument document) { + private void storeStackReferences(Map stacks, IndexDocument document) { - for (Map.Entry entry : stacks.entrySet()) { + for (Map.Entry entry : stacks.entrySet()) { StringBuilder sb = new StringBuilder(); - Reference ref = entry.getValue(); + OffsetRange range = entry.getValue(); //used for completion document.addPair(STACK_ID, entry.getKey(), true, true); - //do we need end ?? - sb.append(entry.getKey()).append(INFO_SEPARATOR).append(ref.defOffset.getStart()).append(";").append(ref.defOffset.getEnd()); //NOI18N + + sb.append(entry.getKey()).append(INFO_SEPARATOR).append(range.getStart()).append(RANGE_SEPARATOR).append(range.getEnd()); //used for declaration finder document.addPair(STACK_REFERENCE, sb.toString(), true, true); } @@ -146,8 +154,8 @@ private void storeFilePathAsBladePath(FileObject fo, IndexDocument document) { for (FileObject root : roots) { String rootPath = root.getPath(); if (filePath.startsWith(rootPath)) { - String bladeFormatPath = BladePathUtils.toBladeViewPath(filePath.replace(rootPath, "")); - if (bladeFormatPath.startsWith(".")) { + String bladeFormatPath = BladePathUtils.toBladeViewPath(filePath.replace(rootPath, "")); //NOI18N + if (bladeFormatPath.startsWith(StringUtils.DOT)) { bladeFormatPath = bladeFormatPath.substring(1, bladeFormatPath.length()); } document.addPair(BLADE_PATH, bladeFormatPath, true, true); @@ -163,7 +171,7 @@ public static Reference extractYieldDataFromIndex(String index) { } String name = mainElements[0]; - String offsets[] = mainElements[1].split(";"); + String offsets[] = mainElements[1].split(RANGE_SEPARATOR); int start = 0; int end = 1; @@ -183,7 +191,7 @@ public static Reference extractStackDataFromIndex(String index) { } String name = mainElements[0]; - String offsets[] = mainElements[1].split(";"); + String offsets[] = mainElements[1].split(RANGE_SEPARATOR); int start = 0; int end = 1; @@ -203,7 +211,7 @@ public static Reference extractTemplatePathDataFromIndex(String indexInfo) { } String name = mainElements[0]; - String offsets[] = mainElements[1].split(";"); + String offsets[] = mainElements[1].split(RANGE_SEPARATOR); int start = 0; int end = 1; @@ -230,8 +238,8 @@ private void storeIncludePathReferences(Map> includes, sb.append(entry.getKey()).append(INFO_SEPARATOR); for (OffsetRange range : entry.getValue()) { - sb.append(range.getStart()); //NOI18N - sb.append(";");//NOI18N + sb.append(range.getStart()); + sb.append(RANGE_SEPARATOR); } document.addPair(INCLUDE_PATH, sb.toString(), true, true); @@ -242,7 +250,7 @@ private void storeIncludePathReferences(Map> includes, public static class Factory extends EmbeddingIndexerFactory { public static final String NAME = "blade"; //NOI18N - public static final int VERSION = 2; + public static final int VERSION = 3; @Override public EmbeddingIndexer createIndexer(Indexable indxbl, Snapshot snapshot) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/IndexManager.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/IndexManager.java index ad978bedf16c..276562426772 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/IndexManager.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/IndexManager.java @@ -57,7 +57,7 @@ public static void reindexProjectViews(Project project) { } else { //falback String projectDir = project.getProjectDirectory().getPath(); - File viewPath = new File(projectDir + "/views"); + File viewPath = new File(projectDir + "/views"); // NOI18N if (viewPath.exists()) { FileObject fileObj = FileUtil.toFileObject(viewPath); Enumeration children = fileObj.getChildren(true); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java index 0be45ca0f1d7..25dd1b657c0e 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java @@ -43,15 +43,27 @@ * * @author bhaidu */ -public final class PhpIndexUtils { +public class PhpIndexUtils { public final static String ESCAPED_NAMESPACE_SEPARATOR = "\\\\"; // NOI18N private final static QueryCache> cache = new QueryCache(); private final static QueryCache> functionCache = new QueryCache(); + private final static int SIGN_NAME_POS = 1; + private final static int SIGN_METHOD_OFFSET_POS = 2; + private final static int SIGN_METHOD_PARAMS_POS = 3; + private final static int SIGN_NAMESPACE_ROOT_POS = 2; + private final static int SIGN_CLASS_NAMESPACE_POS = 4; + private final static String PHP_INDEX_INFO_SEPARATOR = ";"; + + private final static int MIN_NAMESPACE_LENGTH = 3; - public static final int MIN_NAMESPACE_PREFIX_LENGTH = 3; private static final Map QUERY_SUPPORT_INSTANCES = new WeakHashMap<>(); + public enum FieldAccessType { + STATIC, + DIRECT + } + private PhpIndexUtils() { } @@ -82,8 +94,8 @@ public static Collection queryClass(FileObject fo, String prefix String[] values = indexResult.getValues(PHPIndexer.FIELD_CLASS); for (String value : values) { Signature sig = Signature.get(value); - String fullName = sig.string(1); - String namespace = sig.string(4); + String fullName = sig.string(SIGN_NAME_POS); + String namespace = sig.string(SIGN_CLASS_NAMESPACE_POS); if (fullName.length() > 0 && fullName.startsWith(prefix)) { results.add(new PhpIndexResult(fullName, namespace, @@ -102,11 +114,11 @@ public static Collection queryClass(FileObject fo, String prefix return results; } - public static Collection queryNamespaceClassesName(String prefix, - String namespace, FileObject fo) { + public static Collection queryNamespaceClassesName(FileObject fo, String prefix, + String namespace) { QuerySupport phpindex = QuerySupportFactory.get(fo); Collection results = new ArrayList<>(); - String queryPrefix = prefix.toLowerCase() + ".*" + namespace.replace(NAMESPACE_SEPARATOR, ESCAPED_NAMESPACE_SEPARATOR) + ";.*"; // NOI18N + String queryPrefix = prefix.toLowerCase() + ".*" + namespace.replace(NAMESPACE_SEPARATOR, ESCAPED_NAMESPACE_SEPARATOR) + ";.*";// NOI18N try { Collection indexResults = phpindex.query( @@ -116,12 +128,11 @@ public static Collection queryNamespaceClassesName(String prefix FileObject indexFile = indexResult.getFile(); String[] values = indexResult.getValues(PHPIndexer.FIELD_CLASS); - //should use this approach on methods - //String[] fields = indexResult.getValues(PHPIndexer.FIELD_FIELD); + for (String value : values) { Signature sig = Signature.get(value); - String fullName = sig.string(1); - String classNamespace = sig.string(4); + String fullName = sig.string(SIGN_NAME_POS); + String classNamespace = sig.string(SIGN_CLASS_NAMESPACE_POS); if (fullName.length() > 0 && classNamespace.length() > 0 && classNamespace.startsWith(namespace)) { @@ -135,7 +146,7 @@ public static Collection queryNamespaceClassesName(String prefix } return results; } - + public static Collection queryExactNamespaceClasses(String identifier, String namespace, FileObject fo) { QuerySupport phpindex = QuerySupportFactory.get(fo); @@ -143,23 +154,23 @@ public static Collection queryExactNamespaceClasses(String ident try { Collection indexResults = phpindex.query( - PHPIndexer.FIELD_TOP_LEVEL, namespace.toLowerCase(), QuerySupport.Kind.EXACT, + PHPIndexer.FIELD_TOP_LEVEL, namespace.toLowerCase(), QuerySupport.Kind.EXACT, new String[]{ PHPIndexer.FIELD_NAMESPACE }); for (IndexResult indexResult : indexResults) { FileObject indexFile = indexResult.getFile(); - - if (!indexFile.getName().equals(identifier)) { + + if (!indexFile.getName().equals(identifier)){ continue; } - + String namespaceValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); - - if (namespaceValue == null) { + + if (namespaceValue == null){ continue; } - + results.add(new PhpIndexResult(namespace + NAMESPACE_SEPARATOR + identifier, indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); } } catch (IOException ex) { @@ -167,7 +178,7 @@ public static Collection queryExactNamespaceClasses(String ident } return results; } - + public static Collection queryComponentClass(String identifier, String namespace, FileObject fo) { QuerySupport phpindex = QuerySupportFactory.get(fo); @@ -175,18 +186,18 @@ public static Collection queryComponentClass(String identifier, try { Collection indexResults = phpindex.query( - PHPIndexer.FIELD_TOP_LEVEL, namespace.toLowerCase(), QuerySupport.Kind.PREFIX, + PHPIndexer.FIELD_TOP_LEVEL, namespace.toLowerCase(), QuerySupport.Kind.PREFIX, new String[]{ PHPIndexer.FIELD_NAMESPACE }); for (IndexResult indexResult : indexResults) { String namespaceValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); - if (namespaceValue == null) { + if (namespaceValue == null){ continue; } Signature sig = Signature.get(namespaceValue); - String name = sig.string(1); - String domainName = sig.string(2); + String name = sig.string(SIGN_NAME_POS); + String domainName = sig.string(SIGN_NAMESPACE_ROOT_POS); FileObject indexFile = indexResult.getFile(); if (indexFile.getName().equals(identifier)) { results.add(new PhpIndexResult(domainName + NAMESPACE_SEPARATOR + name + NAMESPACE_SEPARATOR + indexFile.getName(), @@ -199,7 +210,7 @@ public static Collection queryComponentClass(String identifier, return results; } - public static Collection queryExactClass(FileObject fo, String identifier) { + public static Collection queryExactClass(String identifier, FileObject fo) { QuerySupport phpindex = QuerySupportFactory.get(fo); QueryCache> selfCache = getCache(fo, identifier); if (selfCache != null && selfCache.containsKey(identifier)) { @@ -216,7 +227,7 @@ public static Collection queryExactClass(FileObject fo, String i String[] values = indexResult.getValues(PHPIndexer.FIELD_CLASS); for (String value : values) { Signature sig = Signature.get(value); - String name = sig.string(1); + String name = sig.string(SIGN_NAME_POS); if (name.length() > 0 && name.equals(identifier)) { results.add(new PhpIndexResult(name, indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); } @@ -244,11 +255,11 @@ public static Collection queryFunctions(FileObject fo, S String[] values = indexResult.getValues(PHPIndexer.FIELD_BASE); for (String value : values) { Signature sig = Signature.get(value); - String name = sig.string(1); + String name = sig.string(SIGN_NAME_POS); if (name.length() > 0 && name.startsWith(prefix)) { - Integer offset = sig.integer(2); - String params = sig.string(3); + Integer offset = sig.integer(SIGN_METHOD_OFFSET_POS); + String params = sig.string(SIGN_METHOD_PARAMS_POS); results.add(new PhpIndexFunctionResult( name, indexFile, PhpIndexResult.Type.FUNCTION, @@ -285,8 +296,8 @@ public static Collection queryExactFunctions(FileObject String name = sig.string(1); if (name.length() > 0 && name.equals(prefix)) { - Integer offset = sig.integer(2); - String params = sig.string(3); + Integer offset = sig.integer(SIGN_METHOD_OFFSET_POS); + String params = sig.string(SIGN_METHOD_PARAMS_POS); results.add(new PhpIndexFunctionResult(name, indexFile, PhpIndexResult.Type.FUNCTION, new OffsetRange(offset, offset + name.length()), @@ -305,13 +316,11 @@ public static Collection queryExactFunctions(FileObject return results; } - //should query the class before? public static Collection queryExactClassMethods(FileObject fo, String method, String className, String queryNamespace) { QuerySupport phpindex = QuerySupportFactory.get(fo); Collection results = new ArrayList<>(); - //for the moment a quick hack - //maybe send the classNamePath directly? + String regexQuery = className.toLowerCase(); try { Collection indexResults = phpindex.query(PHPIndexer.FIELD_CLASS, regexQuery, @@ -326,32 +335,33 @@ public static Collection queryExactClassMethods(FileObje for (String classValue : classValues) { Signature sig = Signature.get(classValue); - String name = sig.string(1); - String namespace = sig.string(4); - if (name.length() > 0 && name.equals(className)) { - if (queryNamespace != null && !namespace.equals(queryNamespace)) { + String name = sig.string(SIGN_NAME_POS); + String namespace = sig.string(SIGN_CLASS_NAMESPACE_POS); + if (name.length() > 0 && name.equals(className) + ) { + if (queryNamespace != null && !namespace.equals(queryNamespace)){ continue; } classSignature = sig; - - if (namespace.length() > 0) { + + if (namespace.length() > 0){ classNamespace = namespace + NAMESPACE_SEPARATOR + className; } } } - - if (classSignature == null) { + + if (classSignature == null){ continue; } - + String[] values = indexResult.getValues(PHPIndexer.FIELD_METHOD); for (String value : values) { Signature sig = Signature.get(value); - String name = sig.string(1); + String name = sig.string(SIGN_NAME_POS); if (name.length() > 0 && name.equals(method)) { - Integer offset = sig.integer(2); - String params = sig.string(3); + Integer offset = sig.integer(SIGN_METHOD_OFFSET_POS); + String params = sig.string(SIGN_METHOD_PARAMS_POS); results.add(new PhpIndexFunctionResult(name, indexFile, PhpIndexResult.Type.FUNCTION, new OffsetRange(offset, offset + name.length()), @@ -366,9 +376,9 @@ public static Collection queryExactClassMethods(FileObje } return results; } - + /** - * + * * * @param fo * @param method @@ -377,12 +387,14 @@ public static Collection queryExactClassMethods(FileObje * @return */ public static Collection queryClassMethods(FileObject fo, - String method, String className, String queryNamespace) { + String method, String className, String queryNamespace, FieldAccessType accessType) { QuerySupport phpindex = QuerySupportFactory.get(fo); Collection results = new ArrayList<>(); - String queryNamespacePath = queryNamespace; - if (queryNamespace != null && queryNamespace.length() > MIN_NAMESPACE_PREFIX_LENGTH) { - queryNamespacePath = EditorStringUtils.trimNamespace(queryNamespace); + + if (queryNamespace != null && queryNamespace.length() > MIN_NAMESPACE_LENGTH){ + int startOffset = queryNamespace.startsWith(NAMESPACE_SEPARATOR) ? 1 : 0; + int endOffset = queryNamespace.endsWith(NAMESPACE_SEPARATOR) ? 1 : 0; + queryNamespace = queryNamespace.substring(startOffset, queryNamespace.length() - endOffset); } //should query the class befoe //for the moment a quick hack @@ -400,34 +412,41 @@ public static Collection queryClassMethods(FileObject fo for (String classValue : classValues) { Signature sig = Signature.get(classValue); - String name = sig.string(1); + String name = sig.string(SIGN_NAME_POS); if (name.length() > 0 && name.equals(className)) { classSignature = sig; - String namespace = sig.string(4); - - if (queryNamespacePath != null && !namespace.equals(queryNamespacePath)) { + String namespace = sig.string(SIGN_CLASS_NAMESPACE_POS); + + if (queryNamespace != null && !namespace.equals(queryNamespace) ){ classSignature = null; continue; } - - if (namespace.length() > 0) { - classNamespace = namespace + EditorStringUtils.NAMESPACE_SEPARATOR + className; + + if (namespace.length() > 0){ + classNamespace = namespace + NAMESPACE_SEPARATOR + className; } } } - if (classSignature == null) { + if (classSignature == null){ continue; } String[] values = indexResult.getValues(PHPIndexer.FIELD_METHOD); for (String value : values) { Signature sig = Signature.get(value); - String name = sig.string(1); + String name = sig.string(SIGN_NAME_POS); + Integer funcAccessType = sig.integer(5); + //todo find where does the value 9 come from + if (accessType.equals(FieldAccessType.STATIC) && funcAccessType != 9){ + //only public static methods + continue; + } + if (name.length() > 0 && name.startsWith(method)) { - Integer offset = sig.integer(2); - String params = sig.string(3); + Integer offset = sig.integer(SIGN_METHOD_OFFSET_POS); + String params = sig.string(SIGN_METHOD_PARAMS_POS); results.add(new PhpIndexFunctionResult(name, indexFile, PhpIndexResult.Type.FUNCTION, new OffsetRange(offset, offset + name.length()), @@ -456,10 +475,10 @@ public static Collection queryConstants(FileObject fo, String pr String[] values = indexResult.getValues(PHPIndexer.FIELD_CONST); for (String value : values) { Signature sig = Signature.get(value); - String name = sig.string(1); + String name = sig.string(SIGN_NAME_POS); if (name.length() > 0 && name.startsWith(prefix)) { - Integer offset = sig.integer(2); + Integer offset = sig.integer(SIGN_METHOD_OFFSET_POS); results.add(new PhpIndexResult(name, indexFile, PhpIndexResult.Type.CONSTANT, new OffsetRange(offset, offset + name.length()))); } } @@ -469,7 +488,7 @@ public static Collection queryConstants(FileObject fo, String pr } return results; } - + public static Collection queryNamespace(FileObject fo, String prefix) { QuerySupport phpindex = QuerySupportFactory.get(fo); Collection results = new ArrayList<>(); @@ -493,7 +512,7 @@ public static Collection queryNamespace(FileObject fo, String pr try { Collection indexResults = phpindex.query( - PHPIndexer.FIELD_TOP_LEVEL, queryPrefix + NAMESPACE_SEPARATOR, QuerySupport.Kind.PREFIX, new String[]{ + PHPIndexer.FIELD_TOP_LEVEL, queryPrefix, QuerySupport.Kind.PREFIX, new String[]{ PHPIndexer.FIELD_NAMESPACE, PHPIndexer.FIELD_TOP_LEVEL}); for (IndexResult indexResult : indexResults) { FileObject indexFile = indexResult.getFile(); @@ -506,8 +525,8 @@ public static Collection queryNamespace(FileObject fo, String pr } Signature sig = Signature.get(firstValue); - String name = sig.string(1); - String namespace = sig.string(2); + String name = sig.string(SIGN_NAME_POS); + String namespace = sig.string(SIGN_NAMESPACE_ROOT_POS); String fullNamespace = ""; // NOI18N @@ -529,7 +548,7 @@ public static Collection queryNamespace(FileObject fo, String pr } return results; } - + public static Collection queryNamespaces(FileObject fo, String namespace, QuerySupport.Kind queryType) { QuerySupport phpindex = QuerySupportFactory.get(fo); @@ -538,7 +557,7 @@ public static Collection queryNamespaces(FileObject fo, String n try { Collection indexResults = phpindex.query( - PHPIndexer.FIELD_TOP_LEVEL, queryPrefix, queryType, + PHPIndexer.FIELD_TOP_LEVEL, queryPrefix, queryType, new String[]{ PHPIndexer.FIELD_NAMESPACE, PHPIndexer.FIELD_TOP_LEVEL @@ -547,7 +566,7 @@ public static Collection queryNamespaces(FileObject fo, String n FileObject indexFile = indexResult.getFile(); String namespaceValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); //no namespace found - if (namespaceValue == null) { + if (namespaceValue == null){ continue; } results.add(new PhpIndexResult(namespaceValue, indexFile, PhpIndexResult.Type.NAMESPACE, new OffsetRange(0, 1))); @@ -559,12 +578,12 @@ public static Collection queryNamespaces(FileObject fo, String n } /** - * a optimized hack solution assuming that the name of the class is the same - * with the file - * + * a optimized hack solution + * assuming that the name of the class is the same with the file + * * @param fo * @param namespace - * @return + * @return */ public static Collection queryAllNamespaceClasses(FileObject fo, String namespace) { QuerySupport phpindex = QuerySupportFactory.get(fo); @@ -573,7 +592,7 @@ public static Collection queryAllNamespaceClasses(FileObject fo, try { Collection indexResults = phpindex.query( - PHPIndexer.FIELD_TOP_LEVEL, queryPrefix, QuerySupport.Kind.EXACT, + PHPIndexer.FIELD_TOP_LEVEL, queryPrefix, QuerySupport.Kind.PREFIX, new String[]{ PHPIndexer.FIELD_NAMESPACE, PHPIndexer.FIELD_TOP_LEVEL @@ -582,7 +601,7 @@ public static Collection queryAllNamespaceClasses(FileObject fo, FileObject indexFile = indexResult.getFile(); String namespaceValue = indexResult.getValue(PHPIndexer.FIELD_NAMESPACE); //no namespace found - if (namespaceValue == null) { + if (namespaceValue == null){ continue; } results.add(new PhpIndexResult(indexFile.getName(), indexFile, PhpIndexResult.Type.CLASS, new OffsetRange(0, 1))); @@ -611,10 +630,10 @@ public static Collection queryClassConstants(FileObject fo, Stri String[] values = indexResult.getValues(PHPIndexer.FIELD_CLASS_CONST); for (String value : values) { Signature sig = Signature.get(value); - String name = sig.string(1); + String name = sig.string(SIGN_NAME_POS); if (name.length() > 0 && name.startsWith(prefix)) { - Integer offset = sig.integer(2); + Integer offset = sig.integer(SIGN_METHOD_OFFSET_POS); results.add(new PhpIndexResult(name, indexFile, PhpIndexResult.Type.CONSTANT, new OffsetRange(offset, offset + name.length()))); } } @@ -624,16 +643,16 @@ public static Collection queryClassConstants(FileObject fo, Stri } return results; } - + /** * @notused TO BE continued - * + * * @param fo * @param prefix * @param ownerClass - * @return + * @return */ - public static Collection queryClassProperties(FileObject fo, String prefix, String ownerClass) { + public static Collection queryClassProperties(FileObject fo, String prefix, String ownerClass){ QuerySupport phpindex = QuerySupportFactory.get(fo); Collection results = new ArrayList<>(); String queryPrefix = prefix.toLowerCase(); @@ -645,16 +664,16 @@ public static Collection queryClassProperties(FileObject fo, Str //internal php index String classOwnerName = indexResult.getValue(PHPIndexer.FIELD_CLASS); - if (classOwnerName == null || !classOwnerName.startsWith(ownerClass.toLowerCase() + ";")) { + if (classOwnerName == null || !classOwnerName.startsWith(ownerClass.toLowerCase() + PHP_INDEX_INFO_SEPARATOR)) { continue; } String[] values = indexResult.getValues(PHPIndexer.FIELD_FIELD); for (String value : values) { Signature sig = Signature.get(value); - String name = sig.string(1); + String name = sig.string(SIGN_NAME_POS); if (name.length() > 0 && name.equals(prefix)) { - Integer offset = sig.integer(2); + Integer offset = sig.integer(SIGN_METHOD_OFFSET_POS); results.add(new PhpIndexResult(name, indexFile, PhpIndexResult.Type.CONSTANT, new OffsetRange(offset, offset + name.length()))); } } @@ -665,7 +684,7 @@ public static Collection queryClassProperties(FileObject fo, Str return results; } - public static Collection queryExactClassConstants(FileObject fo, String prefix, String ownerClass) { + public static Collection queryExactClassConstants(String prefix, String ownerClass, FileObject fo) { QuerySupport phpindex = QuerySupportFactory.get(fo); Collection results = new ArrayList<>(); String queryPrefix = prefix.toLowerCase(); @@ -677,16 +696,16 @@ public static Collection queryExactClassConstants(FileObject fo, //internal php index String classOwnerName = indexResult.getValue(PHPIndexer.FIELD_CLASS); - if (!classOwnerName.startsWith(ownerClass.toLowerCase() + ";")) { + if (!classOwnerName.startsWith(ownerClass.toLowerCase() + PHP_INDEX_INFO_SEPARATOR)) { continue; } String[] values = indexResult.getValues(PHPIndexer.FIELD_CLASS_CONST); for (String value : values) { Signature sig = Signature.get(value); - String name = sig.string(1); + String name = sig.string(SIGN_NAME_POS); if (name.length() > 0 && name.equals(prefix)) { - Integer offset = sig.integer(2); + Integer offset = sig.integer(SIGN_METHOD_OFFSET_POS); results.add(new PhpIndexResult(name, indexFile, PhpIndexResult.Type.CONSTANT, new OffsetRange(offset, offset + name.length()))); } } @@ -710,10 +729,10 @@ public static Collection queryExactConstants(FileObject fo, Stri String[] values = indexResult.getValues(PHPIndexer.FIELD_CONST); for (String value : values) { Signature sig = Signature.get(value); - String name = sig.string(1); + String name = sig.string(SIGN_NAME_POS); if (name.length() > 0 && name.equals(prefix)) { - Integer offset = sig.integer(2); + Integer offset = sig.integer(SIGN_METHOD_OFFSET_POS); results.add(new PhpIndexResult(name, indexFile, PhpIndexResult.Type.FUNCTION, new OffsetRange(offset, offset + name.length()))); } } @@ -747,10 +766,10 @@ static List parseParameters(final String signature) { } /** + * See more info on org.netbeans.modules.php.editor.model.impl.ParameterImpl for signature structure * - * * @param sig - * @return + * @return */ static String parseOneParameter(String sig) { String retval = null; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java index 53ded031355e..6ba9eea6d89d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexerUtils.java @@ -18,15 +18,15 @@ */ package org.netbeans.modules.php.blade.editor.lexer; -import java.util.Arrays; -import java.util.HashSet; import java.util.List; -import java.util.Set; import javax.swing.text.Document; +import org.netbeans.api.html.lexer.HTMLTokenId; import org.netbeans.api.lexer.Language; +import org.netbeans.api.lexer.Token; import org.netbeans.api.lexer.TokenHierarchy; import org.netbeans.api.lexer.TokenSequence; -import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; +import org.netbeans.editor.BaseDocument; +import org.netbeans.modules.php.blade.editor.BladeLanguage; import org.netbeans.modules.php.editor.lexer.PHPTokenId; /** @@ -38,22 +38,100 @@ public final class BladeLexerUtils { private BladeLexerUtils() { } + + public static TokenSequence getLockedPhpTokenSequence(Document doc, int offset) { + BaseDocument baseDoc = (BaseDocument) doc; + TokenSequence tokenSequence = null; + baseDoc.readLock(); + try { + TokenHierarchy hierarchy = TokenHierarchy.get(baseDoc); + tokenSequence = hierarchy.tokenSequence(PHPTokenId.language()); + } finally { + baseDoc.readUnlock(); + } + if (tokenSequence != null) { + tokenSequence.move(offset); + tokenSequence.moveNext(); + } + return tokenSequence; - public static final Set TOKENS_WITH_IDENTIFIABLE_PARAM = Set.of( - D_EXTENDS, D_INCLUDE, D_INCLUDE_IF, D_INCLUDE_WHEN, - D_INCLUDE_UNLESS, D_EACH, D_SECTION, D_HAS_SECTION, D_SECTION_MISSING, - D_PUSH, D_PUSH_IF, D_PREPEND, D_USE, D_INJECT, D_ASSET_BUNDLER - );; + } public static TokenSequence getPhpTokenSequence(TokenHierarchy th, final int offset) { return getTokenSequence(th, offset, PHPTokenId.language()); } + public static TokenSequence getPhpTokenSequence(final Document document, final int offset) { TokenHierarchy th = TokenHierarchy.get(document); return getTokenSequence(th, offset, PHPTokenId.language()); } + public static TokenSequence getHtmlTokenSequence(TokenHierarchy th, final int offset) { + return getTokenSequence(th, offset, HTMLTokenId.language()); + } + + public static TokenSequence getHtmlTokenSequence(final Document document, final int offset) { + TokenHierarchy th = TokenHierarchy.get(document); + return getTokenSequence(th, offset, HTMLTokenId.language()); + } + + public static Token getHtmlToken(TokenHierarchy th, final int offset) { + TokenSequence tsHtml = BladeLexerUtils.getHtmlTokenSequence(th, offset); + if (tsHtml == null) { + return null; + } + tsHtml.move(offset); + + if (!tsHtml.moveNext() && !tsHtml.movePrevious()) { + return null; + } + + return tsHtml.token(); + } + + public static TokenSequence getTokenSequence(final Document document, final int offset) { + return getBladeTokenSequence(TokenHierarchy.get(document), offset); + } + + public static TokenSequence getBladeTokenSequence(TokenHierarchy th, int offset) { + BladeLanguage lang = new BladeLanguage(); + TokenSequence ts = th.tokenSequence(lang.getLexerLanguage()); + + return ts; + } + + public static TokenSequence getBladeTokenSequenceDoc(TokenHierarchy th, int offset) { + BladeLanguage lang = new BladeLanguage(); + TokenSequence ts = th.tokenSequence(lang.getLexerLanguage()); + + return ts; + } + + public static Token getBladeToken(final Document document, final int offset){ + TokenSequence ts = getTokenSequence(document, offset); + return getBladeToken(ts, offset); + } + + public static Token getBladeToken(TokenHierarchy th, final int offset){ + TokenSequence ts = getBladeTokenSequence(th, offset); + return getBladeToken(ts, offset); + } + + public static Token getBladeToken(TokenSequence ts, final int offset){ + if (ts == null){ + return null; + } + + ts.move(offset); + + if (!ts.moveNext() && !ts.movePrevious()) { + return null; + } + + return ts.token(); + } + @SuppressWarnings({"unchecked", "rawtypes"}) public static TokenSequence getTokenSequence(final TokenHierarchy th, final int offset, final Language language) { @@ -78,4 +156,5 @@ public static TokenSequence getTokenSequence(final TokenHierarc } return ts; } + } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java index cd1126e90f71..cc86179377ef 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java @@ -37,20 +37,23 @@ * @author bogdan */ public enum BladeTokenId implements TokenId { - BLADE_COMMENT_START("blade_comment"), - BLADE_COMMENT("blade_comment"), - BLADE_COMMENT_END("blade_comment"), - BLADE_DIRECTIVE("blade_directive"), - BLADE_ECHO_DELIMITOR("blade_echo_delimiters"), - BLADE_PAREN(""), - HTML("html"), - WS_D("html"), - BLADE_DIRECTIVE_UNKNOWN("at_string"), - PHP_BLADE_EXPRESSION("blade_php"), - PHP_BLADE_ECHO_EXPR("blade_php"), - PHP_BLADE_INLINE_CODE("blade_php"), - PHP_INLINE("php"), - OTHER("error"); + BLADE_COMMENT_START("blade_comment"), // NOI18N + BLADE_COMMENT("blade_comment"), // NOI18N + BLADE_COMMENT_END("blade_comment"), // NOI18N + BLADE_DIRECTIVE("blade_directive"), // NOI18N + BLADE_CUSTOM_DIRECTIVE("blade_directive"), // NOI18N + BLADE_ECHO_DELIMITOR("blade_echo_delimiters"), // NOI18N + BLADE_TAG_ERROR("html"), // NOI18N + BLADE_PAREN("token"), // NOI18N + BLADE_COMPONENT_ATTRIBUTE("blade_comp_attribute"), // NOI18N + HTML("html"), // NOI18N + WS_D("html"), // NOI18N + BLADE_DIRECTIVE_UNKNOWN("at_string"), // NOI18N + PHP_BLADE_EXPRESSION("blade_php"), // NOI18N + PHP_BLADE_ECHO_EXPR("blade_php"), // NOI18N + PHP_BLADE_INLINE_CODE("blade_php"), // NOI18N + PHP_INLINE("php"), // NOI18N + OTHER("error"); // NOI18N private final String category; BladeTokenId(String category) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/DirectiveStructureItem.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/DirectiveStructureItem.java new file mode 100644 index 000000000000..91b0416201b7 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/navigator/DirectiveStructureItem.java @@ -0,0 +1,125 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.navigator; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import javax.swing.ImageIcon; +import org.netbeans.modules.csl.api.ElementKind; +import org.netbeans.modules.csl.api.HtmlFormatter; +import org.netbeans.modules.csl.api.StructureItem; +import org.netbeans.modules.php.blade.editor.ResourceUtilities; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public abstract class DirectiveStructureItem extends BladeStructureItem { + + private String identifierArg; + + public DirectiveStructureItem(String name, FileObject source, int startOffset, int stopOffset) { + super(name, source, startOffset, stopOffset); + } + + public DirectiveStructureItem(String name, String identifierArg, FileObject source, int startOffset, int stopOffset) { + super(name, source, startOffset, stopOffset); + this.identifierArg = identifierArg; + } + + public String getDirectiveIdentiferArg() { + return identifierArg; + } + + @Override + public ElementKind getKind() { + return ElementKind.CLASS; + } + + @Override + public String getHtml(HtmlFormatter formatter) { + formatter.appendText(getName()); + if (getDirectiveIdentiferArg() != null) { + formatter.appendText(" "); //NOI18N + formatter.appendHtml(""); //NOI18N + formatter.appendHtml(""); //NOI18N + formatter.appendText(getDirectiveIdentiferArg()); + formatter.appendHtml(""); //NOI18N + formatter.appendHtml(""); //NOI18N + } + return formatter.getText(); + } + + @Override + public ImageIcon getCustomIcon() { + return ResourceUtilities.loadLayoutIcon(); + } + + public static class DirectiveInlineStructureItem extends DirectiveStructureItem { + + public DirectiveInlineStructureItem(String name, String identifierArg, FileObject source, int startOffset, int stopOffset) { + super(name, identifierArg, source, startOffset, stopOffset); + } + + @Override + public boolean isLeaf() { + return true; + } + + @Override + public List getNestedItems() { + return Collections.emptyList(); + } + } + + public static final class DirectiveBlockStructureItem extends DirectiveStructureItem { + + private int depth; + public final List nestedItems = new ArrayList<>(); + + public DirectiveBlockStructureItem(String name, FileObject source, int startOffset, int stopOffset) { + super(name, source, startOffset, stopOffset); + } + + public DirectiveBlockStructureItem(String name, String identifierArg, FileObject source, int startOffset, int stopOffset) { + super(name, identifierArg, source, startOffset, stopOffset); + } + + @Override + public boolean isLeaf() { + return nestedItems.isEmpty(); + } + + @Override + public List getNestedItems() { + return nestedItems; + } + + public void setDepth(int depth) { + this.depth = depth; + } + + public int getDepth() { + return depth; + } + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeComponentTagOccurences.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeComponentTagOccurences.java new file mode 100644 index 000000000000..17cbaec4e49b --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeComponentTagOccurences.java @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.parser; + +import java.util.Set; +import java.util.TreeSet; +import org.netbeans.modules.csl.api.OffsetRange; + +/** + * + * @author bogdan + */ +public class BladeComponentTagOccurences { + + private final Set bladeComponentTagOcurences = new TreeSet<>(); + + public void markPhpExpressionOccurence(OffsetRange range) { + bladeComponentTagOcurences.add(range); + } + + public OffsetRange findOffsetBladeComponentTag(int offset) { + for (OffsetRange range : bladeComponentTagOcurences) { + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return range; + } + } + + return null; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeCustomDirectiveOccurences.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeCustomDirectiveOccurences.java new file mode 100644 index 000000000000..04ba3ce945df --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeCustomDirectiveOccurences.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.parser; + +import java.util.Map; +import java.util.TreeMap; +import org.netbeans.modules.csl.api.OffsetRange; + +/** + * + * @author bogdan + */ +public class BladeCustomDirectiveOccurences { + + private final Map customDirectiveOccurences = new TreeMap<>(); + + public void markPhpExpressionOccurence(OffsetRange range, String directiveLabel) { + customDirectiveOccurences.put(range, directiveLabel); + } + + public Map getAll() { + return customDirectiveOccurences; + } + + public CustomDirectiveOccurence findCustomDirectiveOccurence(int offset) { + for (Map.Entry entry : customDirectiveOccurences.entrySet()) { + + if (offset < entry.getKey().getStart()) { + //excedeed the offset range + break; + } + + if (entry.getKey().containsInclusive(offset)) { + return new CustomDirectiveOccurence(entry.getKey(), entry.getValue()); + } + } + + return null; + } + + public static class CustomDirectiveOccurence{ + public final OffsetRange range; + public final String directiveName; + + public CustomDirectiveOccurence(OffsetRange range, String directiveName){ + this.range = range; + this.directiveName = directiveName; + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeDirectiveScope.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeDirectiveScope.java new file mode 100644 index 000000000000..25da0386397c --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeDirectiveScope.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.parser; + +import java.util.HashSet; +import java.util.Set; +/** + * + * @author bogdan + */ +public class BladeDirectiveScope { + + private final int bladeAntlrTokenType; + private final Set variables = new HashSet<>(); + private BladeDirectiveScope child; + + public BladeDirectiveScope(int tokenType) { + this.bladeAntlrTokenType = tokenType; + } + + public void addVariable(String varName) { + variables.add(varName); + } + + public Set getScopeVariables() { + return variables; + } + + public int getScopeType() { + return bladeAntlrTokenType; + } + + public void setChild(BladeDirectiveScope child) { + this.child = child; + } + + public BladeDirectiveScope getChild() { + return child; + } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java index 5f5bd3137dbf..09bd83689f27 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java @@ -19,16 +19,7 @@ package org.netbeans.modules.php.blade.editor.parser; import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedHashSet; import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; -import java.util.logging.Level; -import java.util.logging.Logger; import org.antlr.v4.runtime.ANTLRErrorListener; import org.antlr.v4.runtime.BaseErrorListener; import org.netbeans.modules.csl.api.Error; @@ -42,21 +33,20 @@ import org.antlr.v4.runtime.RecognitionException; import org.antlr.v4.runtime.Recognizer; import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.tree.ParseTreeListener; -import org.antlr.v4.runtime.tree.TerminalNode; import org.netbeans.api.annotations.common.NonNull; import org.netbeans.api.annotations.common.NullAllowed; import org.netbeans.modules.csl.api.Severity; import org.netbeans.modules.csl.spi.DefaultError; -import org.netbeans.modules.php.blade.editor.EditorStringUtils; +import org.netbeans.modules.php.blade.editor.hints.BladeHintsProvider; import org.netbeans.modules.php.blade.editor.navigator.BladeStructureItem; -import org.netbeans.modules.php.blade.editor.navigator.BladeStructureItem.DirectiveBlockStructureItem; -import org.netbeans.modules.php.blade.editor.navigator.BladeStructureItem.DirectiveInlineStructureItem; -import org.netbeans.modules.php.blade.syntax.BladeDirectivesUtils; +import org.netbeans.modules.php.blade.editor.parser.listeners.CustomDirectivesListener; +import org.netbeans.modules.php.blade.editor.parser.listeners.PhpExpressionOccurenceListener; +import org.netbeans.modules.php.blade.editor.parser.listeners.ReferenceIdListener; +import org.netbeans.modules.php.blade.editor.parser.listeners.ScopeListener; +import org.netbeans.modules.php.blade.editor.parser.listeners.StructureListener; +import org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpSnippetParser; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; -import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser; -import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParserBaseListener; import org.openide.filesystems.FileObject; /** @@ -65,24 +55,16 @@ */ public class BladeParserResult extends ParserResult { - private static final Logger LOGGER = Logger.getLogger(BladeParserResult.class.getSimpleName()); - public final List errors = new ArrayList<>(); - private final Map yieldReferences = new TreeMap<>(); - private final Map stackReferences = new TreeMap<>(); - public final Map> includeBladeOccurences = new HashMap<>(); - public final Map occurancesForDeclaration = new TreeMap<>(); - public final Map phpClassOccurences = new TreeMap<>(); - public final Map phpFunctionOccurences = new TreeMap<>(); - public final Map phpMethodOccurences = new TreeMap<>(); - public final Map phpConstantOccurences = new TreeMap<>(); - public final Map phpNamespacePathOccurences = new TreeMap<>(); - public final Map customDirectivesReferences = new TreeMap<>(); - public final Map fieldCallType = new TreeMap<>(); - public final Map> loopScopedVariables = new TreeMap<>(); + private final List errors = new ArrayList<>(); + private final List phpErrors = new ArrayList<>(); public final List structure = new ArrayList<>(); public final List folds = new ArrayList<>(); - volatile private boolean finished = false; - volatile private boolean debugMode = false; + public final BladeReferenceIdsCollection bladeRreferenceIdsCollection = new BladeReferenceIdsCollection(); + public final BladePhpExpressionOccurences bladePhpExpressionOccurences = new BladePhpExpressionOccurences(); + public final BladeCustomDirectiveOccurences bladeCustomDirectiveOccurences = new BladeCustomDirectiveOccurences(); + public final BladeScope bladeScope = new BladeScope(); + + private volatile boolean finished = false; public enum ReferenceType { YIELD, STACK, SECTION, PUSH, PUSH_IF, PREPEND, INCLUDE, INCLUDE_IF, @@ -90,7 +72,7 @@ public enum ReferenceType { SECTION_MISSING, USE, INJECT, CUSTOM_DIRECTIVE, POSSIBLE_DIRECTIVE, PHP_FUNCTION, PHP_CLASS, PHP_METHOD, PHP_CONSTANT, PHP_NAMESPACE, PHP_NAMESPACE_PATH_TYPE, STATIC_FIELD_ACCESS, VITE_PATH, - TEMPLATE_PATH, + TEMPLATE_PATH; } public BladeParserResult(Snapshot snapshot) { @@ -107,37 +89,36 @@ protected BladeAntlrParser createParser(Snapshot snapshot) { } public BladeParserResult get(String taskClass) { - long startTime = System.currentTimeMillis(); - if (debugMode){ - LOGGER.log(Level.INFO, "PARSER TRIGGERED BY {0}", taskClass); // NOI18N - } if (!finished) { + String taskClassL = taskClass.toLowerCase(); BladeAntlrParser parser = createParser(getSnapshot()); parser.setBuildParseTree(false); parser.addErrorListener(createErrorListener()); - parser.addParseListener(createDeclarationReferencesListener()); - parser.addParseListener(createPhpElementsOccurencesListener()); + parser.addParseListener(new ReferenceIdListener(bladeRreferenceIdsCollection)); + parser.addParseListener(new PhpExpressionOccurenceListener(bladePhpExpressionOccurences)); + parser.addParseListener(new CustomDirectivesListener(bladeCustomDirectiveOccurences)); - if (taskClass.toLowerCase().contains("completion")) { // NOI18N - parser.addParseListener(createVariableListener()); + if (taskClassL.contains("completion")) { //NOI18N + parser.addParseListener(new ScopeListener(bladeScope)); } - parser.addParseListener(createStructureListener()); - - if (taskClass.toLowerCase().contains("hints")) { // NOI18N - parser.addParseListener(createSemanticsListener()); + //avoid on index + if (!taskClassL.contains(".indexing.repository")) { //NOI18N + parser.addParseListener(new StructureListener(structure, folds, getFileObject())); } + + evaluateParser(parser); - if (debugMode){ - LOGGER.info(String.format("Parser evaluated in %d ms " + taskClass + " | " + this.getFileObject().getNameExt(), System.currentTimeMillis() - startTime)); // NOI18N + + if (allowPhpSyntaxParsingForTask(taskClassL) + && BladeHintsProvider.phpSyntaxErrorsDisplayEnabled() + ) { + phpSyntaxAnalyzer(); } + finished = true; } - long time = System.currentTimeMillis() - startTime; - - if (debugMode){ - LOGGER.info(String.format("finished parser took %d ms " + this.getFileObject().getNameExt(), time)); // NOI18N - } + return this; } @@ -145,751 +126,86 @@ protected void evaluateParser(BladeAntlrParser parser) { parser.file(); } - protected ParseTreeListener createDeclarationReferencesListener() { - - return new BladeAntlrParserBaseListener() { - @Override - public void exitDoubleArgWrapperP(BladeAntlrParser.DoubleArgWrapperPContext ctx) { - Token directive = ctx.getParent().getStart(); - if (directive == null) { - return; - } - - Token paramString = ctx.idString; - - if (paramString == null || paramString.getText().length() < 3) { - return; - } - - addIdentifiableOccurenceForDeclaration(directive, paramString); - } - - @Override - public void exitSingleArgWrapperP(BladeAntlrParser.SingleArgWrapperPContext ctx) { - Token directive = ctx.getParent().getStart(); - if (directive == null) { - return; - } - - Token paramString = ctx.idString; - - if (paramString == null || paramString.getText().length() < 3) { - return; - } - - addIdentifiableOccurenceForDeclaration(directive, paramString); - } - - @Override - public void exitIncludeCond(BladeAntlrParser.IncludeCondContext ctx) { - Token directive = ctx.d_name; - if (directive == null) { - return; - } - - Token paramString = ctx.idString; - - if (paramString == null || paramString.getText().length() < 3) { - return; - } - - addIdentifiableOccurenceForDeclaration(directive, paramString); - } - - @Override - public void exitEach(BladeAntlrParser.EachContext ctx) { - Token directive = ctx.getStart(); - if (directive == null) { - return; - } - - Token paramString = ctx.idString; - - if (paramString == null || paramString.getText().length() < 3) { - return; - } - - addIdentifiableOccurenceForDeclaration(directive, paramString); - } - - @Override - public void exitIdentifiableType(BladeAntlrParser.IdentifiableTypeContext ctx) { - Token directive = ctx.d_name; - if (directive == null) { - return; - } - - Token paramString = ctx.idString; - - if (paramString == null || paramString.getText().length() < 3) { - return; - } - - addIdentifiableOccurenceForDeclaration(directive, paramString); - } - - @Override - public void exitCustom_directive(BladeAntlrParser.Custom_directiveContext ctx) { - String directiveName = ctx.getStart().getText(); - OffsetRange range = new OffsetRange(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex() + 1); - occurancesForDeclaration.put(range, new Reference(ReferenceType.CUSTOM_DIRECTIVE, directiveName, range)); - } - - /** - * for @stack, @yield, @each, @include() - */ - private void addIdentifiableOccurenceForDeclaration(Token directive, - Token paramString) { - - OffsetRange range = new OffsetRange(paramString.getStartIndex(), paramString.getStopIndex()); - String bladeParamText = EditorStringUtils.stripSurroundingQuotes(paramString.getText()); - - //used for indexing - switch (directive.getType()) { - case D_STACK -> addStackReference(ReferenceType.STACK, bladeParamText, range); - case D_YIELD -> addYieldReference(ReferenceType.YIELD, bladeParamText, range); - } - - ReferenceType type = getReferenceType(directive.getType()); - - if (type == null) { - return; - } - - Reference ref; - if (type.equals(ReferenceType.USE) || type.equals(ReferenceType.INJECT)) { - int lastSlashPos = bladeParamText.lastIndexOf(EditorStringUtils.NAMESPACE_SEPARATOR); - if (lastSlashPos < 0 || lastSlashPos >= bladeParamText.length() - 1) { - return; - } - range = new OffsetRange(paramString.getStartIndex(), paramString.getStopIndex()); - //extracting the namespace and classname - ref = new Reference(type, bladeParamText.substring(lastSlashPos + 1), range, null, bladeParamText.substring(0, lastSlashPos)); - } else { - ref = new Reference(type, bladeParamText, range); - } - - occurancesForDeclaration.put(range, ref); - - switch (directive.getType()) { - case D_EACH, D_INCLUDE_WHEN, D_INCLUDE_UNLESS, D_INCLUDE, D_INCLUDE_IF, D_INCLUDE_FIRST -> { - if (bladeParamText.contains("::")) { // NOI18N - //don't include package resources - break; - } - markIncludeBladeOccurrence(bladeParamText, range); - } - } - } - - @Override - public void exitAsset_bundler(BladeAntlrParser.Asset_bundlerContext ctx) { - if (ctx.id_string != null){ - Token idToken = ctx.id_string; - String path = idToken.getText(); - path = EditorStringUtils.stripSurroundingQuotes(path); - OffsetRange range = new OffsetRange(idToken.getStartIndex(), idToken.getStopIndex()); - Reference ref = new Reference(ReferenceType.VITE_PATH, path, range); - occurancesForDeclaration.put(range, ref); - return; - } - Token dirToken = ctx.dir; - String dir = ""; - if (dirToken != null){ - dir = dirToken.getText(); - } - - for (TerminalNode node : ctx.EXPR_STRING()){ - Token symbolNode = node.getSymbol(); - if (symbolNode == null){ - continue; - } - String path = node.getText(); - if (path.equals(dir)){ - //skipping last parameter - continue; - } - path = EditorStringUtils.stripSurroundingQuotes(path); - OffsetRange range = new OffsetRange(symbolNode.getStartIndex(), symbolNode.getStopIndex()); - Reference ref = new Reference(ReferenceType.VITE_PATH, path, range); - occurancesForDeclaration.put(range, ref); - } - } - - }; - - } - - private ParseTreeListener createVariableListener() { - return new BladeAntlrParserBaseListener() { - List foreachVariableList = new ArrayList<>(); - int foreachBalance = 0; - - @Override - public void exitSimple_foreach_expr(BladeAntlrParser.Simple_foreach_exprContext ctx) { - ForeachVariables foreachVariables = new ForeachVariables(); - foreachVariables.arrayVariable = ctx.loop_array.getText(); - if (ctx.item != null) { - foreachVariables.keyVariable = ctx.key.getText(); - foreachVariables.itemVariable = ctx.item.getText(); - } else { - - foreachVariables.itemVariable = ctx.key.getText(); - } - foreachVariableList.add(foreachVariables); - } - - @Override - public void enterForeach(BladeAntlrParser.ForeachContext ctx) { - foreachBalance++; - } - - @Override - public void exitForeach(BladeAntlrParser.ForeachContext ctx) { - if (!foreachVariableList.isEmpty()) { - Set varList = new LinkedHashSet<>(); - for (ForeachVariables foreachVariables : foreachVariableList) { - - varList.add(foreachVariables.arrayVariable); - if (foreachVariables.keyVariable != null) { - varList.add(foreachVariables.keyVariable); - } - varList.add(foreachVariables.itemVariable); - - } - OffsetRange range = new OffsetRange(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex() + 1); - loopScopedVariables.put(range, varList); - } - - foreachBalance--; - //reset - if (foreachBalance < 0) { - foreachVariableList.clear(); - } - } - - @Override - public void exitForelse(BladeAntlrParser.ForelseContext ctx) { - if (!foreachVariableList.isEmpty()) { - Set varList = new LinkedHashSet<>(); - for (ForeachVariables foreachVariables : foreachVariableList) { - - varList.add(foreachVariables.arrayVariable); - if (foreachVariables.keyVariable != null) { - varList.add(foreachVariables.keyVariable); - } - varList.add(foreachVariables.itemVariable); - - } - OffsetRange range = new OffsetRange(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex() + 1); - loopScopedVariables.put(range, varList); - } - - //reset - foreachVariableList.clear(); - } - - @Override - public void exitFile(BladeAntlrParser.FileContext ctx) { - foreachVariableList.clear(); - } - }; - } - - private ParseTreeListener createPhpElementsOccurencesListener() { - return new BladeAntlrParserBaseListener() { - /** - * handling isolated PHP_IDENTIFIER to reference them as possible - * constants - */ - @Override - public void exitComposed_php_expression(BladeAntlrParser.Composed_php_expressionContext ctx) { - if (ctx.PHP_IDENTIFIER() != null && ctx.PHP_IDENTIFIER().getSymbol() != null) { - String identifierString = ctx.PHP_IDENTIFIER().getSymbol().getText(); - if (identifierString != null && org.netbeans.modules.php.blade.syntax.StringUtils.isUpperCase(identifierString)) { - OffsetRange range = new OffsetRange(ctx.PHP_IDENTIFIER().getSymbol().getStartIndex(), ctx.PHP_IDENTIFIER().getSymbol().getStopIndex() + 1); - phpConstantOccurences.put(range, identifierString); - } - } - if (ctx.PHP_NAMESPACE_PATH() != null && ctx.PHP_NAMESPACE_PATH().getSymbol() != null) { - String identifierString = ctx.PHP_NAMESPACE_PATH().getSymbol().getText(); - if (identifierString != null) { - OffsetRange range = new OffsetRange(ctx.PHP_NAMESPACE_PATH().getSymbol().getStartIndex(), ctx.PHP_NAMESPACE_PATH().getSymbol().getStopIndex() + 1); - phpNamespacePathOccurences.put(range, identifierString); - } - } - } - - @Override - public void exitNamespacePath(BladeAntlrParser.NamespacePathContext ctx) { - if (ctx.PHP_IDENTIFIER() == null || ctx.PHP_NAMESPACE_PATH() == null) { - return; - } - String namespace = ctx.PHP_NAMESPACE_PATH().getSymbol().getText(); - Token classIdentifier = ctx.PHP_IDENTIFIER().getSymbol(); - String className = classIdentifier.getText(); - OffsetRange classRange = new OffsetRange(classIdentifier.getStartIndex(), classIdentifier.getStopIndex() + 1); - OffsetRange range = new OffsetRange(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex() + 1); - occurancesForDeclaration.put(range, new Reference(ReferenceType.PHP_NAMESPACE_PATH_TYPE, className, classRange, null, namespace)); - } - - @Override - public void exitStatic_direct_namespace_class_access(BladeAntlrParser.Static_direct_namespace_class_accessContext ctx) { - if (ctx.class_name == null) { - return; - } - - Token classIdentifier = ctx.class_name; - String className = classIdentifier.getText(); - OffsetRange range = new OffsetRange(classIdentifier.getStartIndex(), classIdentifier.getStopIndex() + 1); - - Reference classReference = new Reference( - ReferenceType.PHP_CLASS, - className, range, - null, - ctx.namespace.getText() - ); - occurancesForDeclaration.put(range, classReference); - - OffsetRange callRange = null; - int start = ctx.PHP_STATIC_ACCESS().getSymbol().getStartIndex(); - String fieldName = null; - FieldType fieldType = null; - - if (ctx.static_property != null) { - //constants - callRange = new OffsetRange(start, ctx.static_property.getStopIndex() + 1); - fieldName = ctx.static_property.getText(); - fieldType = FieldType.CONSTANT; - } else if (ctx.func_name != null) { - //methods - callRange = new OffsetRange(start, ctx.func_name.getStopIndex() + 1);//bad - fieldName = ctx.func_name.getText(); - fieldType = FieldType.METHOD; - OffsetRange functionRange = new OffsetRange(ctx.func_name.getStartIndex(), ctx.func_name.getStopIndex() + 1); - - phpMethodOccurences.put(functionRange, - new Reference(ReferenceType.PHP_METHOD, - fieldName, range, className, - ctx.namespace.getText()) - ); - - } - - if (callRange != null) { - FieldAccessReference fieldAccess = new FieldAccessReference( - ReferenceType.STATIC_FIELD_ACCESS, - classReference, - fieldName, - fieldType - ); - fieldCallType.put(callRange, fieldAccess); - } - } - - //this will be always static - @Override - public void exitStatic_direct_class_access(BladeAntlrParser.Static_direct_class_accessContext ctx) { - if (ctx.class_name == null) { - return; - } - - Token classIdentifier = ctx.class_name; - String className = classIdentifier.getText(); - OffsetRange range = new OffsetRange(classIdentifier.getStartIndex(), classIdentifier.getStopIndex() + 1); - - phpClassOccurences.put(range, className); - - OffsetRange callRange = null; - int start = ctx.PHP_STATIC_ACCESS().getSymbol().getStartIndex(); - String fieldName = null; - FieldType fieldType = null; - if (ctx.static_property != null) { - //constants - callRange = new OffsetRange(start, ctx.static_property.getStopIndex() + 1); - fieldName = ctx.static_property.getText(); - fieldType = FieldType.CONSTANT; - } else if (ctx.func_name != null) { - //methods - callRange = new OffsetRange(start, ctx.func_name.getStopIndex() + 1); - fieldName = ctx.func_name.getText(); - fieldType = FieldType.METHOD; - OffsetRange functionRange = new OffsetRange(ctx.func_name.getStartIndex(), ctx.func_name.getStopIndex() + 1); - phpMethodOccurences.put(functionRange, new Reference(ReferenceType.PHP_METHOD, fieldName, range, className)); - } - - if (callRange != null) { - Reference classReference = new Reference( - ReferenceType.PHP_CLASS, - className, range, - null, - null - ); - FieldAccessReference fieldAccess = new FieldAccessReference( - ReferenceType.STATIC_FIELD_ACCESS, - classReference, - fieldName, - fieldType - ); - fieldCallType.put(callRange, fieldAccess); - } - } - - @Override - public void exitFunction_call(BladeAntlrParser.Function_callContext ctx) { - if (ctx.func_name == null || ctx.func_name.getText() == null) { - return; - } - String functionName = ctx.func_name.getText(); - OffsetRange range = new OffsetRange(ctx.func_name.getStartIndex(), ctx.func_name.getStopIndex() + 1); - phpFunctionOccurences.put(range, functionName); - } - }; - } - - private ParseTreeListener createStructureListener() { - - return new BladeAntlrParserBaseListener() { - - final List lexerStructure = new ArrayList<>(); - int blockBalance = 0; - String identifier; - - @Override - public void enterInline_directive(BladeAntlrParser.Inline_directiveContext ctx) { - identifier = null; - } - - @Override - public void exitIdentifiableType(BladeAntlrParser.IdentifiableTypeContext ctx) { - Token directive = ctx.d_name; - if (directive == null) { - return; - } - - Token paramString = ctx.idString; - - if (paramString == null || paramString.getText().length() < 3) { - return; - } - - String bladeParamText = paramString.getText(); - identifier = EditorStringUtils.stripSurroundingQuotes(bladeParamText); - } - - @Override - public void exitInline_directive(BladeAntlrParser.Inline_directiveContext ctx) { - Token directiveToken = ctx.getStart(); - - if (directiveToken == null) { - return; - } - - DirectiveInlineStructureItem inlineElement; - String directiveName = directiveToken.getText(); - - inlineElement = new DirectiveInlineStructureItem(directiveName, identifier, - getFileObject(), directiveToken.getStartIndex(), directiveToken.getStopIndex() + 1); - - if (blockBalance > 0) { - lexerStructure.add(inlineElement); - } else { - structure.add(inlineElement); - } - - } - - @Override - public void enterBlock_statement(BladeAntlrParser.Block_statementContext ctx) { - identifier = null; - blockBalance++; - } - - @Override - public void exitBlock_statement(BladeAntlrParser.Block_statementContext ctx) { - blockBalance--; - Token directiveToken = ctx.getStart(); - - if (directiveToken == null) { - return; - } - - String directiveName = directiveToken.getText(); - DirectiveBlockStructureItem blockItem = new DirectiveBlockStructureItem(directiveName, identifier, - getFileObject(), ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex() + 1); - - blockItem.nestedItems.addAll(lexerStructure); - lexerStructure.clear(); - if (blockBalance > 0 && !directiveName.startsWith(BladeDirectivesUtils.DIRECTIVE_ELSE)) { - lexerStructure.add(blockItem); - } else { - structure.add(blockItem); - } - //folds - int start = ctx.getStart().getStartIndex() + 1 + directiveName.length(); - int end = ctx.getStop().getStartIndex();//the start of the close directive - - if (start > end) { - return; - } - OffsetRange range = new OffsetRange(start, end); - if (!folds.contains(range)) { - folds.add(range); - } - } - }; - } - - private ReferenceType getReferenceType(int type) { - return switch (type) { - case D_INCLUDE -> ReferenceType.INCLUDE; - case D_INCLUDE_IF -> ReferenceType.INCLUDE_IF; - case D_EXTENDS -> ReferenceType.EXTENDS; - case D_USE -> ReferenceType.USE; - case D_INJECT -> ReferenceType.INJECT; - case D_SECTION -> ReferenceType.SECTION; - case D_HAS_SECTION -> ReferenceType.HAS_SECTION; - case D_SECTION_MISSING -> ReferenceType.SECTION_MISSING; - case D_PUSH -> ReferenceType.PUSH; - case D_PUSH_IF -> ReferenceType.PUSH_IF; - case D_PREPEND -> ReferenceType.PREPEND; - case D_EACH -> ReferenceType.EACH; - default -> null; - }; - } - - /** - * might move to a model all these processing - * - * @param offset - * @return - */ - public Reference findOccuredRefrence(int offset) { - - //TODO could do a similar thing and generate the Reference class on loop - for (Map.Entry entry : occurancesForDeclaration.entrySet()) { - OffsetRange range = entry.getKey(); - - if (offset < range.getStart()) { - //excedeed the offset range - break; - } - - if (range.containsInclusive(offset)) { - return entry.getValue(); - } - } - - for (Map.Entry entry : phpFunctionOccurences.entrySet()) { - OffsetRange range = entry.getKey(); - - if (offset < range.getStart()) { - //excedeed the offset range - break; - } - - if (range.containsInclusive(offset)) { - return new Reference(ReferenceType.PHP_FUNCTION, entry.getValue(), range); - } - } - - for (Map.Entry entry : phpClassOccurences.entrySet()) { - OffsetRange range = entry.getKey(); - - if (offset < range.getStart()) { - //excedeed the offset range - break; - } - - if (range.containsInclusive(offset)) { - return new Reference(ReferenceType.PHP_CLASS, entry.getValue(), range); - } - } - - for (Map.Entry entry : phpMethodOccurences.entrySet()) { - OffsetRange range = entry.getKey(); - - if (offset < range.getStart()) { - //excedeed the offset range - break; - } - - if (range.containsInclusive(offset)) { - return entry.getValue(); - } - } - - for (Map.Entry entry : phpConstantOccurences.entrySet()) { - OffsetRange range = entry.getKey(); - - if (offset < range.getStart()) { - //excedeed the offset range - break; - } - - if (range.containsInclusive(offset)) { - return new Reference(ReferenceType.PHP_CONSTANT, entry.getValue(), range); - } - } - - for (Map.Entry entry : phpNamespacePathOccurences.entrySet()) { - OffsetRange range = entry.getKey(); - - if (offset < range.getStart()) { - //excedeed the offset range - break; - } - - if (range.containsInclusive(offset)) { - return new Reference(ReferenceType.PHP_NAMESPACE_PATH_TYPE, entry.getValue(), range); - } - } - - return null; - } - - public FieldAccessReference findFieldAccessRefrence(int offset) { - for (Map.Entry entry : fieldCallType.entrySet()) { - OffsetRange range = entry.getKey(); - - if (offset < range.getStart()) { - //excedeed the offset range - break; - } - - if (range.containsInclusive(offset)) { - return entry.getValue(); - } - } - - return null; + @Override + protected boolean processingFinished() { + return finished; } - protected final void markIncludeBladeOccurrence(String refName, OffsetRange or) { - includeBladeOccurences.computeIfAbsent(refName, s -> new ArrayList<>()).add(or); + @Override + public List getDiagnostics() { + return errors; } - //not used so far - public Collection findIncludeOccurrence(String refName) { - ArrayList ret = new ArrayList<>(); - if (includeBladeOccurences.containsKey(refName)) { - ret.addAll(includeBladeOccurences.get(refName)); - } - return ret; + public void addError(Error error) { + errors.add(error); } - public Set findLoopVariablesForScope(int offset) { - - Set variableList = new LinkedHashSet<>(); - - for (Map.Entry> entry : loopScopedVariables.entrySet()) { - OffsetRange range = entry.getKey(); - - if (offset < range.getStart()) { - //excedeed the offset range - break; - } - - if (range.containsInclusive(offset)) { - variableList.addAll(entry.getValue()); - } - } + @Override + protected void invalidate() { - if (variableList.isEmpty()) { - return null; - } - return variableList; } - private ParseTreeListener createSemanticsListener() { - return new BladeAntlrParserBaseListener() { - int ifBalance = 0; - int ifStart = 0; - - @Override - public void exitCustom_directive(BladeAntlrParser.Custom_directiveContext ctx) { - String directiveName = ctx.getStart().getText(); - OffsetRange range = new OffsetRange(ctx.getStart().getStartIndex(), ctx.getStart().getStartIndex() + directiveName.length()); - customDirectivesReferences.put(range, new Reference(ReferenceType.CUSTOM_DIRECTIVE, directiveName, range)); - } - - @Override - public void exitPossibleDirective(BladeAntlrParser.PossibleDirectiveContext ctx) { - String directiveName = ctx.getStart().getText(); - OffsetRange range = new OffsetRange(ctx.getStart().getStartIndex(), ctx.getStart().getStartIndex() + directiveName.length()); - customDirectivesReferences.put(range, new Reference(ReferenceType.POSSIBLE_DIRECTIVE, directiveName, range)); - } - - @Override - public void enterIf(BladeAntlrParser.IfContext ctx) { - ifBalance++; - ifStart = ctx.getStart().getStartIndex(); - } - - @Override - public void exitEndif(BladeAntlrParser.EndifContext ctx) { - ifBalance--; - } - + private ANTLRErrorListener createErrorListener() { + return new BaseErrorListener() { @Override - public void exitFile(BladeAntlrParser.FileContext ctx) { - if (ifBalance != 0) { - errors.add(new BladeError("Unclosed @if", getFileObject(), ifStart, ctx.getStart().getStopIndex(), Severity.ERROR)); + public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { + int errorPosition = 0; + if (offendingSymbol instanceof Token) { + Token offendingToken = (Token) offendingSymbol; + errorPosition = offendingToken.getStartIndex(); } + errors.add(new BladeError(null, msg, null, getFileObject(), errorPosition, errorPosition, Severity.ERROR)); } }; } - public void addYieldReference(ReferenceType type, String yieldId, OffsetRange range) { - Reference ref = new Reference(type, yieldId, range); - yieldReferences.put(ref.identifier, ref); + public final FileObject getFileObject() { + return getSnapshot().getSource().getFileObject(); } - public void addStackReference(ReferenceType type, String stackId, OffsetRange range) { - Reference ref = new Reference(type, stackId, range); - stackReferences.put(ref.identifier, ref); + public BladeReferenceIdsCollection getBladeReferenceIdsCollection() { + return bladeRreferenceIdsCollection; } - @Override - protected boolean processingFinished() { - return finished; + public BladePhpExpressionOccurences getBladePhpExpressionOccurences() { + return bladePhpExpressionOccurences; } - @Override - public List getDiagnostics() { - return new ArrayList<>(errors); + public BladeCustomDirectiveOccurences getBladeCustomDirectiveOccurences() { + return bladeCustomDirectiveOccurences; } - @Override - protected void invalidate() { - loopScopedVariables.clear(); + public BladeScope getBladeScope() { + return bladeScope; } - public Map getYieldReferences() { - return yieldReferences; + public void phpSyntaxAnalyzer() { + for (OffsetRange range : getBladePhpExpressionOccurences().getPhpInlineOccurences()) { + CharSequence snapshotExpr = getSnapshot().getText().subSequence(range.getStart(), range.getEnd()); + BladePhpSnippetParser phpSnippetParser = new BladePhpSnippetParser(snapshotExpr.toString(), getFileObject(), range.getStart()); + phpSnippetParser.parse(); + errors.addAll(phpSnippetParser.getDiagnostics()); + } } - public Map getStackReferences() { - return stackReferences; - } + public static class BladeStringReference { - protected ANTLRErrorListener createErrorListener() { - return new BaseErrorListener() { - @Override - public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { - int errorPosition = 0; - if (offendingSymbol instanceof Token offendingToken) { - errorPosition = offendingToken.getStartIndex(); - } - errors.add(new BladeError(msg, getFileObject(), errorPosition, errorPosition, Severity.ERROR)); - } + public final int antlrTokentype; + public final String identifier; - }; + public BladeStringReference(int antlrTokentype, String identifier) { + this.antlrTokentype = antlrTokentype; + this.identifier = identifier; + } } - - public final FileObject getFileObject() { - return getSnapshot().getSource().getFileObject(); + + private boolean allowPhpSyntaxParsingForTask(String taskClassL){ + return !taskClassL.contains("completion") //NOI18N + && !taskClassL.contains("declaration") //NOI18N + && !taskClassL.contains(".indexing.repository") //NOI18N + && !taskClassL.contains("csl.navigation") //NOI18N + ; } public static class Reference { @@ -931,27 +247,20 @@ public enum FieldType { METHOD; } - public static class FieldAccessReference { - - public final ReferenceType type; - public final Reference ownerClass; - public final String fieldName; - public final FieldType fieldType; + /** + * seems that java caches only this class ? BladeError is not found in some + * occasions + */ + public static class BladeError extends DefaultError implements org.netbeans.modules.csl.api.Error.Badging { - public FieldAccessReference(ReferenceType type, Reference ownerClass, - String fieldName, FieldType fieldType) { - this.type = type; - this.ownerClass = ownerClass; - this.fieldName = fieldName; - this.fieldType = fieldType; + public BladeError(@NullAllowed String key, @NonNull String displayName, @NullAllowed String description, @NonNull FileObject file, @NonNull int start, @NonNull int end, @NonNull Severity severity) { + super(key, displayName, description, file, start, end, severity); } - } - public class ForeachVariables { + @Override + public boolean showExplorerBadge() { + return true; + } - public String arrayVariable; - public String keyVariable; - public String itemVariable; } - } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladePhpExpressionOccurences.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladePhpExpressionOccurences.java new file mode 100644 index 000000000000..1f92bb2e3984 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladePhpExpressionOccurences.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.parser; + +import java.util.Set; +import java.util.TreeSet; +import org.netbeans.modules.csl.api.OffsetRange; +/** + * + * @author bogdan + */ +public class BladePhpExpressionOccurences { + + private final Set phpInlineExpressionLocations = new TreeSet<>(); + private final Set phpOutputExpressionLocations = new TreeSet<>(); + private final Set phpForeachExpressionLocations = new TreeSet<>(); + + public void markPhpInlineExpressionOccurence(OffsetRange range) { + phpInlineExpressionLocations.add(range); + } + + public void markPhpOutputExpressionOccurence(OffsetRange range) { + phpOutputExpressionLocations.add(range); + } + + public void markPhpForeachExpressionOccurence(OffsetRange range) { + phpForeachExpressionLocations.add(range); + } + + public OffsetRange findPhpExpressionLocation(int offset) { + + //OUTPUT + for (OffsetRange range : phpOutputExpressionLocations) { + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return range; + } + } + + for (OffsetRange range : phpInlineExpressionLocations) { + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return range; + } + } + + //FOREACH + for (OffsetRange range : phpForeachExpressionLocations) { + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return range; + } + } + + return null; + } + + public Set getPhpInlineOccurences() { + return phpInlineExpressionLocations; + } + + public Set getPhpOutputOccurences() { + return phpOutputExpressionLocations; + } + + public Set getPhpForeachOccurences() { + return phpForeachExpressionLocations; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeReferenceIdsCollection.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeReferenceIdsCollection.java new file mode 100644 index 000000000000..118f10597cfd --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeReferenceIdsCollection.java @@ -0,0 +1,105 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.parser; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import org.antlr.v4.runtime.Token; +import org.netbeans.api.annotations.common.CheckForNull; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.php.blade.editor.EditorStringUtils; +import static org.netbeans.modules.php.blade.editor.parser.BladeParserResult.BladeStringReference; + +/** + * + * @author bogdan + */ +public class BladeReferenceIdsCollection { + + private final Map referenceIds = new TreeMap<>(); + private final Map> includePathsOccurences = new HashMap<>(); + + private final Map yieldIdsOccurences = new HashMap<>(); + private final Map stackIdsOccurences = new HashMap<>(); + + public String sanitizeIdentifier(Token identifiableStringToken) { + String rawReferenceId = identifiableStringToken.getText(); + return EditorStringUtils.stripSurroundingQuotes(rawReferenceId.trim()); + } + + public OffsetRange extractOffset(Token identifiableStringToken) { + //TODO extract the whitespace fragment + return new OffsetRange(identifiableStringToken.getStartIndex(), + identifiableStringToken.getStopIndex() + 1); + } + + public void addReferenceId(int type, String referenceId, OffsetRange range) { + BladeStringReference reference = new BladeStringReference(type, referenceId); + referenceIds.put(range, reference); + } + + @CheckForNull + public BladeStringReference findOccuredRefrence(int offset) { + for (Map.Entry entry : referenceIds.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return entry.getValue(); + } + } + + return null; + } + + public Map getReferenceIds() { + return referenceIds; + } + + public void markIncludeBladeOccurrence(String refName, OffsetRange or) { + includePathsOccurences.computeIfAbsent(refName, s -> new ArrayList<>()).add(or); + } + + public Map> getIncludePathsOccurences() { + return includePathsOccurences; + } + + public void addYieldOccurence(String identifier, OffsetRange range) { + yieldIdsOccurences.putIfAbsent(identifier, range); + } + + public Map getYieldIdOccurences() { + return yieldIdsOccurences; + } + + public void addStackOccurence(String identifier, OffsetRange range) { + stackIdsOccurences.putIfAbsent(identifier, range); + } + + public Map getStackIdOccurences() { + return stackIdsOccurences; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeScope.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeScope.java new file mode 100644 index 000000000000..35a3dcd22502 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeScope.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.parser; + +import java.util.Map; +import java.util.TreeMap; +import org.netbeans.modules.csl.api.OffsetRange; + +/** + * helps identifying block directive context. + * Ex: identifying if we have nested loops for foreach variable autocomplete + * @foreach($array1 as $item1) + * @foreach($array2 as $item2) + * + * @author bogdan + */ +public class BladeScope { + + private final Map scopeRange = new TreeMap<>(); + + + public void markScope(OffsetRange range, BladeDirectiveScope scope) { + scopeRange.put(range, scope); + } + + public BladeDirectiveScope findScope(int offset) { + for (Map.Entry entry : scopeRange.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return entry.getValue(); + } + } + + return null; + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java new file mode 100644 index 000000000000..df96faf0c30a --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/ParsingUtils.java @@ -0,0 +1,153 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.parser; + +/** + * + * @author bogdan + */ +import java.io.IOException; +import java.util.Collections; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import org.netbeans.editor.BaseDocument; +import org.netbeans.modules.parsing.api.ParserManager; +import org.netbeans.modules.parsing.api.ResultIterator; +import org.netbeans.modules.parsing.api.Source; +import org.netbeans.modules.parsing.api.UserTask; +import org.netbeans.modules.parsing.spi.ParseException; +import org.netbeans.modules.parsing.spi.Parser; +import org.netbeans.modules.php.editor.parser.PHPParseResult; +import org.openide.filesystems.FileObject; +import org.openide.util.Exceptions; +import org.openide.cookies.EditorCookie; +import org.openide.loaders.DataObject; + +/** + * + * @author bogdan + */ +public final class ParsingUtils { + + public ParsingUtils() { + + } + + private PHPParseResult phpParserResult; + + public BaseDocument createPhpBaseDocument(String content) { + String mimeType = "text/x-php5"; //NOI18N + try { + BaseDocument doc = new BaseDocument(true, mimeType) { + @Override + public boolean isIdentifierPart(char ch) { + return super.isIdentifierPart(ch); + } + }; + + doc.putProperty("mimeType", mimeType); //NOI18N + doc.insertString(0,content, null); + + return doc; + } catch (BadLocationException ex) { + return null; + } + } + + public void parseFileObject(FileObject file) { + Document doc = openDocument(file); + + try { + Source source = Source.create(doc); + + if (source == null) { + return; + } + + Document sourceDoc = source.getDocument(false); + + if (sourceDoc == null) { + return; + } + + source.createSnapshot(); + ParserManager.parseWhenScanFinished(Collections.singletonList(source), new UserTask() { + + @Override + public void run(ResultIterator resultIterator) throws Exception { + Parser.Result parserResult = resultIterator.getParserResult(); + if (parserResult instanceof PHPParseResult) { + phpParserResult = (PHPParseResult) parserResult; + } + } + }); + + } catch (ParseException ex) { + Exceptions.printStackTrace(ex); + } + } + + public void laterParseFileObject(FileObject file) { + Document doc = openDocument(file); + + try { + Source source = Source.create(doc); + + if (source == null) { + return; + } + + Document sourceDoc = source.getDocument(false); + + if (sourceDoc == null) { + return; + } + + source.createSnapshot(); + ParserManager.parseWhenScanFinished(Collections.singletonList(source), new UserTask() { + + @Override + public void run(ResultIterator resultIterator) throws Exception { + Parser.Result parserResult = resultIterator.getParserResult(); + if (parserResult instanceof PHPParseResult) { + phpParserResult = (PHPParseResult) parserResult; + } + } + }); + + } catch (ParseException ex) { + Exceptions.printStackTrace(ex); + } + } + + public PHPParseResult getParserResult() { + return phpParserResult; + } + + private Document openDocument(FileObject f) { + try { + DataObject dataObject = DataObject.find(f); + EditorCookie ec = dataObject.getLookup().lookup(EditorCookie.class); + return ec.openDocument(); + } catch (IOException ex) { + throw new IllegalStateException(ex); + } + + } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/CustomDirectivesListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/CustomDirectivesListener.java new file mode 100644 index 000000000000..239aaa4d56d9 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/CustomDirectivesListener.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.parser.listeners; + +import org.antlr.v4.runtime.Token; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.php.blade.editor.parser.BladeCustomDirectiveOccurences; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParserBaseListener; + +/** + * + * @author bogdan + */ +public class CustomDirectivesListener extends BladeAntlrParserBaseListener { + + private final BladeCustomDirectiveOccurences phpExprOccurences; + + public CustomDirectivesListener(BladeCustomDirectiveOccurences phpExprOccurences) { + this.phpExprOccurences = phpExprOccurences; + } + + @Override + public void exitCustomDirective(BladeAntlrParser.CustomDirectiveContext ctx) { + if (ctx.D_CUSTOM() == null){ + return; + } + Token customDirective = ctx.D_CUSTOM().getSymbol(); + OffsetRange range = new OffsetRange(customDirective.getStartIndex() + 1, customDirective.getStopIndex()); + phpExprOccurences.markPhpExpressionOccurence(range, customDirective.getText()); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/PhpExpressionOccurenceListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/PhpExpressionOccurenceListener.java new file mode 100644 index 000000000000..ce4a2296a087 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/PhpExpressionOccurenceListener.java @@ -0,0 +1,183 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.parser.listeners; + +import org.antlr.v4.runtime.Token; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.php.blade.editor.parser.BladePhpExpressionOccurences; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParserBaseListener; + +/** + * + * @author bogdan + */ +public class PhpExpressionOccurenceListener extends BladeAntlrParserBaseListener { + + private final BladePhpExpressionOccurences phpExprOccurences; + + public PhpExpressionOccurenceListener(BladePhpExpressionOccurences phpExprOccurences) { + this.phpExprOccurences = phpExprOccurences; + } + + @Override + public void exitIdentifiableArgDirective(BladeAntlrParser.IdentifiableArgDirectiveContext ctx) { + if (ctx.LPAREN() == null || ctx.RPAREN() == null) { + return; + } + + Token leftParen = ctx.LPAREN().getSymbol(); + Token rightParen = ctx.RPAREN().getSymbol(); + + if (leftParen.getStartIndex() + 1 >= rightParen.getStopIndex()) { + return; + } + + markPhpOutputExprOccurence(leftParen, rightParen, 1); + } + + @Override + public void exitForeachLoopArguments(BladeAntlrParser.ForeachLoopArgumentsContext ctx) { + if (ctx.LPAREN() == null || ctx.RPAREN() == null) { + return; + } + + Token leftParen = ctx.LPAREN().getSymbol(); + Token rightParen = ctx.RPAREN().getSymbol(); + + if (leftParen.getStartIndex() + 1 >= rightParen.getStopIndex()) { + return; + } + + markPhpForeachExprOccurence(leftParen, rightParen, 1); + } + + @Override + public void exitMultipleArgDirective(BladeAntlrParser.MultipleArgDirectiveContext ctx) { + if (ctx.LPAREN() == null || ctx.RPAREN() == null) { + return; + } + + Token leftParen = ctx.LPAREN().getSymbol(); + Token rightParen = ctx.RPAREN().getSymbol(); + + if (leftParen.getStartIndex() + 1 >= rightParen.getStopIndex()) { + return; + } + + markPhpOutputExprOccurence(leftParen, rightParen, 1); + } + + @Override + public void exitDirectiveArguments(BladeAntlrParser.DirectiveArgumentsContext ctx) { + if (ctx.LPAREN() == null || ctx.RPAREN() == null) { + return; + } + Token leftParen = ctx.LPAREN().getSymbol(); + Token rightParen = ctx.RPAREN().getSymbol(); + markPhpOutputExprOccurence(leftParen, rightParen, 1); + } + + @Override + public void exitBlockIdentifiableArgDirective(BladeAntlrParser.BlockIdentifiableArgDirectiveContext ctx) { + if (ctx.LPAREN() == null || ctx.RPAREN() == null) { + return; + } + Token leftParen = ctx.LPAREN().getSymbol(); + Token rightParen = ctx.RPAREN().getSymbol(); + markPhpOutputExprOccurence(leftParen, rightParen, 1); + } + + + @Override + public void exitBladeContentTags(BladeAntlrParser.BladeContentTagsContext ctx) { + if (ctx.BLADE_CONTENT_OPEN_TAG() == null || ctx.BLADE_CONTENT_CLOSE_TAG() == null) { + return; + } + Token openTag = ctx.BLADE_CONTENT_OPEN_TAG().getSymbol(); + Token closeTag = ctx.BLADE_CONTENT_CLOSE_TAG().getSymbol(); + markPhpOutputExprOccurence(openTag, closeTag, 1); + } + + @Override + public void exitBladeRawTags(BladeAntlrParser.BladeRawTagsContext ctx) { + if (ctx.start == null || ctx.stop == null) { + return; + } + Token openTag = ctx.start; + Token closeTag = ctx.stop; + markPhpOutputExprOccurence(openTag, closeTag, 1); + } + + @Override + public void exitBladePhpBlock(BladeAntlrParser.BladePhpBlockContext ctx) { + if (ctx.D_PHP() == null || ctx.D_ENDPHP() == null) { + return; + } + Token openTag = ctx.D_PHP().getSymbol(); + Token closeTag = ctx.D_ENDPHP().getSymbol(); + markPhpExprOccurence(openTag, closeTag, 1); + } + + @Override + public void exitPhpInline(BladeAntlrParser.PhpInlineContext ctx) { + if (ctx.start == null || ctx.stop == null) { + return; + } + Token openTag = ctx.start; + Token closeTag = ctx.stop; + markPhpExprOccurence(openTag, closeTag, 1); + } + + private void markPhpExprOccurence(Token start, Token end, int offset) { + int startOffset = start.getStopIndex() + offset; + int endOffset = end.getStartIndex(); + + if (startOffset > endOffset){ + return; + } + + OffsetRange range = new OffsetRange(startOffset, endOffset); + phpExprOccurences.markPhpInlineExpressionOccurence(range); + } + + private void markPhpOutputExprOccurence(Token start, Token end, int offset) { + int startOffset = start.getStopIndex() + offset; + int endOffset = end.getStartIndex(); + + if (startOffset > endOffset){ + return; + } + + OffsetRange range = new OffsetRange(startOffset, endOffset); + phpExprOccurences.markPhpOutputExpressionOccurence(range); + } + + private void markPhpForeachExprOccurence(Token start, Token end, int offset) { + int startOffset = start.getStopIndex() + offset; + int endOffset = end.getStartIndex(); + + if (startOffset > endOffset){ + return; + } + + OffsetRange range = new OffsetRange(startOffset, endOffset); + phpExprOccurences.markPhpForeachExpressionOccurence(range); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/ReferenceIdListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/ReferenceIdListener.java new file mode 100644 index 000000000000..033640106fbc --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/ReferenceIdListener.java @@ -0,0 +1,113 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.parser.listeners; + +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.tree.TerminalNode; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.php.blade.editor.parser.BladeReferenceIdsCollection; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParserBaseListener; + +/** + * + * @author bogdan + */ +public class ReferenceIdListener extends BladeAntlrParserBaseListener { + + private final BladeReferenceIdsCollection referenceIdsCollection; + + public ReferenceIdListener(BladeReferenceIdsCollection referenceIdsCollection) { + this.referenceIdsCollection = referenceIdsCollection; + } + + @Override + public void exitIdentifiableArgDirective(BladeAntlrParser.IdentifiableArgDirectiveContext ctx) { + int tokenType = ctx.getStart().getType(); + + if (ctx.IDENTIFIABLE_STRING() == null || ctx.IDENTIFIABLE_STRING().getSymbol() == null) { + return; + } + + Token token = ctx.IDENTIFIABLE_STRING().getSymbol(); + String identifier = referenceIdsCollection.sanitizeIdentifier(token); + OffsetRange range = referenceIdsCollection.extractOffset(token); + + referenceIdsCollection.addReferenceId(tokenType, identifier, range); + + switch (tokenType) { + case D_EXTENDS: + case D_INCLUDE: + case D_INCLUDE_IF: + case D_INCLUDE_WHEN: + case D_INCLUDE_UNLESS: { + referenceIdsCollection.markIncludeBladeOccurrence(identifier, range); + break; + } + case D_YIELD: { + referenceIdsCollection.addYieldOccurence(identifier, range); + break; + } + case D_STACK: { + referenceIdsCollection.addStackOccurence(identifier, range); + break; + } + } + } + + @Override + public void exitBlockIdentifiableArgDirective(BladeAntlrParser.BlockIdentifiableArgDirectiveContext ctx) { + if (ctx.IDENTIFIABLE_STRING() == null || ctx.IDENTIFIABLE_STRING().getSymbol() == null) { + return; + } + + Token identifierToken = ctx.IDENTIFIABLE_STRING().getSymbol(); + addIdentifierReference(ctx.getStart(), identifierToken); + } + + @Override + public void exitMultipleArgDirective(BladeAntlrParser.MultipleArgDirectiveContext ctx) { + int tokenType = ctx.getStart().getType(); + + for (TerminalNode identifierNode : ctx.IDENTIFIABLE_STRING()) { + Token identifierToken = identifierNode.getSymbol(); + if (identifierToken != null) { + String identifier = referenceIdsCollection.sanitizeIdentifier(identifierToken); + OffsetRange range = referenceIdsCollection.extractOffset(identifierToken); + + referenceIdsCollection.addReferenceId(tokenType, identifier, range); + + switch (tokenType) { + case D_EACH: { + referenceIdsCollection.markIncludeBladeOccurrence(identifier, range); + break; + } + } + } + } + } + + private void addIdentifierReference(Token directive, Token token) { + String identifier = referenceIdsCollection.sanitizeIdentifier(token); + OffsetRange range = referenceIdsCollection.extractOffset(token); + + referenceIdsCollection.addReferenceId(directive.getType(), identifier, range); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/ScopeListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/ScopeListener.java new file mode 100644 index 000000000000..b11d2fb1ef82 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/ScopeListener.java @@ -0,0 +1,94 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.parser.listeners; + +import org.antlr.v4.runtime.Token; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.php.blade.editor.parser.BladeDirectiveScope; +import org.netbeans.modules.php.blade.editor.parser.BladeScope; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParserBaseListener; +/** + * + * @author bogdan + */ +public class ScopeListener extends BladeAntlrParserBaseListener { + + private final BladeScope bladeScope; + private BladeDirectiveScope bufferScope; + int bladeScopeBalance = 0; + + public ScopeListener(BladeScope bladeScope) { + this.bladeScope = bladeScope; + } + + @Override + public void enterForeachStatement(BladeAntlrParser.ForeachStatementContext ctx) { + if (bufferScope == null) { + bufferScope = new BladeDirectiveScope(ctx.start.getType()); + } else { + bufferScope.setChild(new BladeDirectiveScope(ctx.start.getType())); + } + bladeScopeBalance++; + } + + @Override + public void exitForeachLoopArguments(BladeAntlrParser.ForeachLoopArgumentsContext ctx) { + if (bufferScope == null) { + return; + } + if (ctx.LPAREN() == null || ctx.RPAREN() == null) { + return; + } + + Token leftParen = ctx.LPAREN().getSymbol(); + Token rightParen = ctx.RPAREN().getSymbol(); + + if (leftParen.getStartIndex() + 1 >= rightParen.getStopIndex()) { + return; + } + + if (ctx.main_array != null) { + bufferScope.addVariable(ctx.main_array.getText()); + } + + if (ctx.array_item != null) { + bufferScope.addVariable(ctx.array_item.getText()); + } + + if (ctx.array_value != null) { + bufferScope.addVariable(ctx.array_value.getText()); + } + } + + @Override + public void exitForeachStatement(BladeAntlrParser.ForeachStatementContext ctx) { + Token start = ctx.start; + Token stop = ctx.stop; + + OffsetRange range = new OffsetRange(start.getStartIndex(), + stop.getStopIndex() + 1); + + bladeScopeBalance--; + if (bufferScope != null && bladeScopeBalance == 0) { + bladeScope.markScope(range, bufferScope); + bufferScope = null; + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/StructureListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/StructureListener.java new file mode 100644 index 000000000000..27c3c36df0c4 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/StructureListener.java @@ -0,0 +1,204 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.parser.listeners; + +import java.util.ArrayList; +import java.util.List; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.tree.TerminalNode; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.php.blade.editor.EditorStringUtils; +import org.netbeans.modules.php.blade.editor.navigator.BladeStructureItem; +import org.netbeans.modules.php.blade.editor.navigator.DirectiveStructureItem.DirectiveBlockStructureItem; +import org.netbeans.modules.php.blade.editor.navigator.DirectiveStructureItem.DirectiveInlineStructureItem; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParserBaseListener; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class StructureListener extends BladeAntlrParserBaseListener { + + public final List structure; + public final List folds; + private final FileObject file; + + private final List inlineNestedElements = new ArrayList<>(); + private final List blockNestedElements = new ArrayList<>(); + private DirectiveBlockStructureItem previousItem; + private int depth = 0; + private String identifier; + + public StructureListener(final List structure, final List folds, FileObject file) { + this.structure = structure; + this.folds = folds; + this.file = file; + } + + @Override + public void enterBlockDirective(BladeAntlrParser.BlockDirectiveContext ctx) { + identifier = null; + depth++; + } + + @Override + public void enterBlockIdentifiableArgDirective(BladeAntlrParser.BlockIdentifiableArgDirectiveContext ctx) { + identifier = null; + depth++; + } + + @Override + public void exitBlockDirective(BladeAntlrParser.BlockDirectiveContext ctx) { + depth--; + + Token directiveToken = ctx.getStart(); + Token endToken = ctx.getStop(); + addBlockDirective(directiveToken, endToken); + } + + @Override + public void exitBlockIdentifiableArgDirective(BladeAntlrParser.BlockIdentifiableArgDirectiveContext ctx) { + depth--; + identifier = null; + Token directiveToken = ctx.getStart(); + Token endToken = ctx.getStop(); + markIdentifier(ctx.IDENTIFIABLE_STRING()); + addBlockDirective(directiveToken, endToken); + } + + @Override + public void exitIdentifiableArgDirective(BladeAntlrParser.IdentifiableArgDirectiveContext ctx) { + Token directiveToken = ctx.getStart(); + + if (directiveToken == null) { + return; + } + identifier = null; + markIdentifier(ctx.IDENTIFIABLE_STRING()); + addInlineDirective(directiveToken); + } + + @Override + public void exitMultipleArgDirective(BladeAntlrParser.MultipleArgDirectiveContext ctx) { + Token directiveToken = ctx.getStart(); + + if (directiveToken == null) { + return; + } + + identifier = null; + addInlineDirective(directiveToken); + } + + @Override + public void exitInlineDirective(BladeAntlrParser.InlineDirectiveContext ctx) { + Token directiveToken = ctx.getStart(); + + if (directiveToken == null) { + return; + } + + identifier = null; + addInlineDirective(directiveToken); + } + + @Override + public void exitCustomDirective(BladeAntlrParser.CustomDirectiveContext ctx) { + Token directiveToken = ctx.getStart(); + + if (directiveToken == null) { + return; + } + + identifier = null; + addInlineDirective(directiveToken); + } + + private void addInlineDirective(Token directiveToken) { + DirectiveInlineStructureItem inlineElement; + String directiveName = directiveToken.getText().trim(); + + inlineElement = new DirectiveInlineStructureItem(directiveName, identifier, + file, directiveToken.getStartIndex(), directiveToken.getStopIndex() + 1); + + if (depth > 0) { + inlineNestedElements.add(inlineElement); + } else { + structure.add(inlineElement); + } + } + + private void markIdentifier(TerminalNode identifierNode) { + identifier = null; + if (identifierNode != null) { + Token identifiableStringToken = identifierNode.getSymbol(); + + if (identifiableStringToken != null && identifiableStringToken.getText().length() >= 3) { + String bladeParamText = identifiableStringToken.getText(); + identifier = EditorStringUtils.stripSurroundingQuotes(bladeParamText); + } + } + } + + private void addBlockDirective(Token directiveToken, Token endToken) { + + if (directiveToken == null) { + return; + } + + String directiveName = directiveToken.getText().trim(); + DirectiveBlockStructureItem blockItem = new DirectiveBlockStructureItem(directiveName, identifier, + file, directiveToken.getStartIndex(), endToken.getStopIndex() + 1); + + blockItem.setDepth(depth); + + if (!inlineNestedElements.isEmpty()) { + blockItem.nestedItems.addAll(inlineNestedElements); + inlineNestedElements.clear(); + } + if (previousItem != null && depth > 0 && previousItem.getDepth() == depth) { + blockNestedElements.add(blockItem); + } else if (previousItem != null && depth > 0 && previousItem.getDepth() > depth) { + blockItem.nestedItems.addAll(blockNestedElements); + blockNestedElements.clear(); + blockNestedElements.add(blockItem); + } else if (depth > 0) { + blockNestedElements.add(blockItem); + } else { + blockItem.nestedItems.addAll(blockNestedElements); + blockNestedElements.clear(); + structure.add(blockItem); + } + + previousItem = blockItem; + //folds + int start = directiveToken.getStartIndex() + 1 + directiveName.length(); + int end = endToken.getStartIndex();//the start of the close directive + + if (start > end) { + return; + } + OffsetRange range = new OffsetRange(start, end); + if (!folds.contains(range)) { + folds.add(range); + } + } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java index ca82146620a5..4b5cd114985d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/path/BladePathUtils.java @@ -129,7 +129,7 @@ public static List getParentChildrenFromPrefixPath(FileObject contex return list; } - HashSet viewRoots = getDefaultRoots(project); + List viewRoots = getDefaultRootsList(project); viewRoots.addAll(getCustomViewsRoots(project, contextFile)); if (viewRoots.isEmpty()) { @@ -137,58 +137,52 @@ public static List getParentChildrenFromPrefixPath(FileObject contex } String unixPath = prefixViewPath.replace(StringUtils.DOT, StringUtils.FORWARD_SLASH); - int relativeSlash; - //fix issues with lastIndexOf search - relativeSlash = unixPath.lastIndexOf(StringUtils.FORWARD_SLASH); + int lastSlash = unixPath.lastIndexOf(StringUtils.FORWARD_SLASH); - HashSet filteredViewRoots = new HashSet<>(); + return filterFilesFromRootFolder(viewRoots.toArray(new FileObject[0]), unixPath, lastSlash); + } - Map relativeFilePathMap = new HashMap<>(); + public static List filterFilesFromRootFolder(FileObject[] viewRoots, String unixPath, int lastSlash) { + + List list = new ArrayList<>(); - if (relativeSlash > 0) { + if (lastSlash > 0) { //filter only relative folders + return filterFromRelativeSlash(viewRoots, unixPath, lastSlash); + } else { for (FileObject rootFolder : viewRoots) { - FileObject relativeViewRoot = rootFolder.getFileObject(unixPath.substring(0, relativeSlash)); - - if (relativeViewRoot != null && relativeViewRoot.isValid()) { - relativeFilePathMap.put(unixPath, relativeViewRoot); + for (FileObject file : rootFolder.getChildren()) { + String filePath = file.getPath().replace(rootFolder.getPath() + StringUtils.FORWARD_SLASH, ""); //NOI18N + if (filePath.startsWith(unixPath)) { + list.add(file); + } } } - } else { - //include all root folders - filteredViewRoots = viewRoots; + } - String relativePrefixToCompare; + return list; + } - if (relativeSlash > 0) { - //extract the path name prefix - relativePrefixToCompare = unixPath.substring(relativeSlash + 1, unixPath.length()); - } else { - //root reference - relativePrefixToCompare = unixPath; - } + public static List filterFromRelativeSlash(FileObject[] viewRoots, String unixPath, int lastSlash) { + Map relativeFilePathMap = new HashMap<>(); + List list = new ArrayList<>(); + boolean folderEnd = unixPath.endsWith(StringUtils.FORWARD_SLASH); + for (FileObject rootFolder : viewRoots) { + FileObject relativeViewRoot = rootFolder.getFileObject(unixPath.substring(0, lastSlash)); - if (unixPath.endsWith(StringUtils.FORWARD_SLASH)) { - //add children - for (FileObject rootFolder : filteredViewRoots) { - list.addAll(Arrays.asList(rootFolder.getChildren())); + if (relativeViewRoot != null && relativeViewRoot.isValid()) { + relativeFilePathMap.put(unixPath, relativeViewRoot); } + } + + if (folderEnd) { for (Map.Entry entry : relativeFilePathMap.entrySet()) { list.addAll(Arrays.asList(entry.getValue().getChildren())); } } else { - //filter by filename in relative context - for (FileObject rootFolder : filteredViewRoots) { - for (FileObject file : rootFolder.getChildren()) { - String filePath = file.getPath().replace(rootFolder.getPath() + StringUtils.FORWARD_SLASH, ""); //NOI18N - if (filePath.startsWith(relativePrefixToCompare)) { - list.add(file); - } - } - } - + String relativePrefixToCompare = unixPath.substring(lastSlash + 1, unixPath.length()); for (Map.Entry entry : relativeFilePathMap.entrySet()) { for (FileObject file : entry.getValue().getChildren()) { if (file.getName().startsWith(relativePrefixToCompare)) { @@ -198,8 +192,6 @@ public static List getParentChildrenFromPrefixPath(FileObject contex } } - //empty list - viewRoots.clear(); return list; } @@ -329,6 +321,17 @@ public static HashSet getDefaultRoots(Project project) { return defaultList; } + public static List getDefaultRootsList(Project project) { + ArrayList list = new ArrayList<>(); + FileObject defaultViewsRoot = project.getProjectDirectory().getFileObject(LARAVEL_VIEW_PATH); + + if (defaultViewsRoot != null && defaultViewsRoot.isValid()) { + list.add(defaultViewsRoot); + } + + return list; + } + public static String toBladeToProjectFilePath(String path) { return LARAVEL_VIEW_PATH + StringUtils.FORWARD_SLASH + viewPathToFilePath(path); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UIOptionsUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UIOptionsUtils.java new file mode 100644 index 000000000000..8d430fbaf2f4 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/UIOptionsUtils.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.ui.customizer; + +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +/** + * + * @author bogdan + */ +public class UiOptionsUtils { + + public static final String FILE_ITEM_SEPARATOR = "|"; // NOI18N + + public static String encodeToStrings(Enumeration list) { + List result = new ArrayList<>(); + while (list.hasMoreElements()) { + result.add(list.nextElement()); + } + + return String.join(FILE_ITEM_SEPARATOR, result); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionList.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/AssetsBundlerSupport.java similarity index 68% rename from php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionList.java rename to php/php.blade/src/org/netbeans/modules/php/blade/project/AssetsBundlerSupport.java index 3ac0ae5cdb8c..a665a8ba4549 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/DirectiveCompletionList.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/AssetsBundlerSupport.java @@ -16,15 +16,16 @@ * specific language governing permissions and limitations * under the License. */ -package org.netbeans.modules.php.blade.editor.completion; +package org.netbeans.modules.php.blade.project; -import org.netbeans.modules.php.blade.syntax.DirectivesList; -import org.netbeans.modules.php.blade.syntax.annotation.Directive; - -public final class DirectiveCompletionList { +/** + * + * @author bogdan + */ +public class AssetsBundlerSupport { - public Directive[] getDirectives() { - DirectivesList listClass = new DirectivesList(); - return listClass.getDirectives(); - } + public static final String RESOURCE_ROOT = "resources"; // NOI18N + public static final String JS_ASSET_FOLDER = RESOURCE_ROOT + "/js"; // NOI18N + public static final String CSS_ASSET_FOLDER = RESOURCE_ROOT + "/css"; // NOI18N + } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java index 238ee06029da..f044378a426a 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectProperties.java @@ -29,6 +29,7 @@ import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectUtils; +import org.netbeans.modules.php.blade.editor.ui.customizer.UiOptionsUtils; import org.openide.util.NbPreferences; /** @@ -42,14 +43,15 @@ public final class BladeProjectProperties { private static final Map INSTANCES = new HashMap<>(); private static final String DIRECTIVE_CUSTOMIZER_PATH_LIST = "directive_customizer.path.list"; // NOI18N private static final String VIEW_PATH_LIST = "views.path.list"; // NOI18N + private static final String BLADE_COMPONENT_CLASS_FOLDER_LIST = "blade_component_class.folder.list"; // NOI18N private static final String NON_LARAVEL_DECL_FINDER = "non_laravel.decl.finder"; // NOI18N private final Project project; private DefaultListModel directiveCustomizerPathList = new DefaultListModel(); private DefaultListModel viewsPathList = new DefaultListModel(); + private DefaultListModel bladeComponentsClassFolderList = new DefaultListModel(); // enable declaration finder outside of framework plugin private final AtomicBoolean nonLaravelDeclFinder = new AtomicBoolean(false); - // the pipe "|" char needs to be escaped public static final String ESCAPED_VIEW_PATH_SEPARATOR = "\\|"; // NOI18N @@ -58,10 +60,14 @@ private BladeProjectProperties(Project project) { initModelsFromPreferences(); } - @CheckForNull public static BladeProjectProperties getInstance(Project project) { synchronized (INSTANCES) { - return INSTANCES.computeIfAbsent(project, k -> new BladeProjectProperties(project)); + if (INSTANCES.containsKey(project)) { + return INSTANCES.get(project); + } + BladeProjectProperties instance = new BladeProjectProperties(project); + INSTANCES.put(project, instance); + return instance; } } @@ -82,15 +88,16 @@ private void initModelsFromPreferences() { directiveCustomizerPathList = createModelForDirectiveCusomizerPathList(); viewsPathList = createModelForViewsPathList(); nonLaravelDeclFinder.set(getPreferences().getBoolean(NON_LARAVEL_DECL_FINDER, false)); + this.bladeComponentsClassFolderList = createModelForBladeComponentFolderList(); } public void storeDirectiveCustomizerPaths() { - String includePath = encodeToStrings(directiveCustomizerPathList.elements()); + String includePath = UiOptionsUtils.encodeToStrings(directiveCustomizerPathList.elements()); getPreferences().put(DIRECTIVE_CUSTOMIZER_PATH_LIST, includePath); } public void storeViewsPaths() { - String includePath = encodeToStrings(viewsPathList.elements()); + String includePath = UiOptionsUtils.encodeToStrings(viewsPathList.elements()); getPreferences().put(VIEW_PATH_LIST, includePath); } @@ -116,16 +123,16 @@ public void removeViewsPath(int index) { } public void setViewsPathList(DefaultListModel list) { - String includePath = encodeToStrings(list.elements()); + String includePath = UiOptionsUtils.encodeToStrings(list.elements()); getPreferences().put(VIEW_PATH_LIST, includePath); } public DefaultListModel createModelForDirectiveCusomizerPathList() { - return createFilePathModelFromPreferences(DIRECTIVE_CUSTOMIZER_PATH_LIST); + return creatModelFromPreferences(DIRECTIVE_CUSTOMIZER_PATH_LIST); } public DefaultListModel createModelForViewsPathList() { - return createFilePathModelFromPreferences(VIEW_PATH_LIST); + return creatModelFromPreferences(VIEW_PATH_LIST); } public DefaultListModel getModelForDirectiveCusomizerPathList() { @@ -140,7 +147,29 @@ public boolean getNonLaravelDeclFinderFlag() { return nonLaravelDeclFinder.get(); } - private DefaultListModel createFilePathModelFromPreferences(String pathName) { + //blade components + public void addCustomBladeComponentClassFolder(String path) { + bladeComponentsClassFolderList.addElement(path); + } + + public void removeCustomBladeComponentClassFolder(int index) { + bladeComponentsClassFolderList.remove(index); + } + + public DefaultListModel createModelForBladeComponentFolderList() { + return creatModelFromPreferences(BLADE_COMPONENT_CLASS_FOLDER_LIST); + } + + public DefaultListModel getModelForBladeComponentsClassFolderList() { + return bladeComponentsClassFolderList; + } + + public void storeBladeComponentsFolder() { + String includePath = UiOptionsUtils.encodeToStrings(bladeComponentsClassFolderList.elements()); + getPreferences().put(BLADE_COMPONENT_CLASS_FOLDER_LIST, includePath); + } + + private DefaultListModel creatModelFromPreferences(String pathName) { DefaultListModel model = new DefaultListModel<>(); String encodedCompilerPathList = getPreferences().get(pathName, null); String[] paths; @@ -161,11 +190,11 @@ private DefaultListModel createFilePathModelFromPreferences(String pathN return model; } - public String[] getDirectiveRegistrationsPathList() { - String encodedDirectiveRegistrationPathList = getPreferences().get(DIRECTIVE_CUSTOMIZER_PATH_LIST, null); + public String[] getCompilerPathList() { + String encodedCompilerPathList = getPreferences().get(DIRECTIVE_CUSTOMIZER_PATH_LIST, null); String[] paths = new String[]{}; - if (encodedDirectiveRegistrationPathList != null) { - return encodedDirectiveRegistrationPathList.split(ESCAPED_VIEW_PATH_SEPARATOR, -1); + if (encodedCompilerPathList != null) { + return encodedCompilerPathList.split(ESCAPED_VIEW_PATH_SEPARATOR, -1); } return paths; } @@ -178,6 +207,15 @@ public String[] getViewsFolderPathList() { } return paths; } + + public String[] getBladeComponentsClassPathList() { + String encodedBladeComponentFolderPathList = getPreferences().get(BLADE_COMPONENT_CLASS_FOLDER_LIST, null); + String[] paths = new String[]{}; + if (encodedBladeComponentFolderPathList != null) { + return encodedBladeComponentFolderPathList.split(ESCAPED_VIEW_PATH_SEPARATOR, -1); + } + return paths; + } public void addPreferenceChangeListener(PreferenceChangeListener preferenceChangeListener) { getPreferences().addPreferenceChangeListener(preferenceChangeListener); @@ -187,7 +225,4 @@ public void removePreferenceChangeListener(PreferenceChangeListener preferenceCh getPreferences().removePreferenceChangeListener(preferenceChangeListener); } - public static String encodeToStrings(Enumeration list) { - return String.join(ESCAPED_VIEW_PATH_SEPARATOR, Collections.list(list)); - } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectSupport.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectSupport.java index f8cbd7e6caae..cc4ae8be57ad 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectSupport.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/BladeProjectSupport.java @@ -26,6 +26,7 @@ * @author bhaidu */ public class BladeProjectSupport extends ProjectOpenedHook { + public static final String APP_PROVIDER_RELATIVE_PATH = "app/Providers/AppServiceProvider.php"; // NOI18N private final Project project; public BladeProjectSupport(Project project) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java b/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java index 585e6d518acb..0c4256db0490 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/project/ComponentsSupport.java @@ -18,33 +18,66 @@ */ package org.netbeans.modules.php.blade.project; +import java.io.File; +import java.util.Enumeration; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicBoolean; import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.editor.components.ComponentModel; import org.netbeans.modules.php.blade.editor.components.annotation.Namespace; import org.netbeans.modules.php.blade.editor.components.annotation.NamespaceRegister; +import org.netbeans.modules.php.blade.editor.parser.ParsingUtils; +import org.netbeans.modules.php.blade.syntax.StringUtils; +import org.netbeans.modules.php.editor.parser.PHPParseResult; +import org.netbeans.modules.php.editor.parser.astnodes.ASTNode; +import org.netbeans.modules.php.editor.parser.astnodes.ClassDeclaration; +import org.netbeans.modules.php.editor.parser.astnodes.Expression; +import org.netbeans.modules.php.editor.parser.astnodes.FormalParameter; +import org.netbeans.modules.php.editor.parser.astnodes.MethodDeclaration; +import org.netbeans.modules.php.editor.parser.astnodes.visitors.DefaultVisitor; import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; +import org.openide.util.Cancellable; +import org.openide.util.RequestProcessor; /** + * + * Laravel Project support for blade components + * + * At the first action request for a blade component tag completion or decl + * finder the scan for blade components configuration will be triggered. + * + * The usage of ComponentModels collection is to have information about the file + * and custom attributes * * @author bogdan */ +//list of most common laravel framework directory paths for blade components classes @NamespaceRegister({ @Namespace(path = "App\\View\\Components", fromApp = true, relativeFilePath = "app/View/Components"), @Namespace(path = "App\\Http\\Livewire", fromApp = true, relativeFilePath = "app/Http/Livewire"), - @Namespace(path = "App\\Livewire", fromApp = true, relativeFilePath = "app/Livewire"), + @Namespace(path = "App\\Livewire", fromApp = true, relativeFilePath = "app/Livewire"),//from 10 @Namespace(path = "Illuminate\\Console\\View\\Components"), - @Namespace(path = "BladeUI\\Icons\\Components", packageName = "blade-ui-kit/blade-icons"), - @Namespace(path = "BladeUIKit\\Components", packageName = "blade-ui-kit/blade-ui-kit"),}) + @Namespace(path = "BladeUI\\Icons\\Components", packageName = "blade-ui-kit/blade-icons", relativeFilePath = "blade-ui-kit/blade-icons/src/Components"), + @Namespace(path = "BladeUIKit\\Components", packageName = "blade-ui-kit/blade-ui-kit", relativeFilePath = "blade-ui-kit/blade-ui-kit/src/Components"),}) public class ComponentsSupport { - public static final String LIVEWIRE_NAME = "livewire"; // NOI18N - + public static final String COMPONENT_TAG_NAME_PREFIX = "x-"; //NOI18N + public static final String COMPONENT_TAG_PREFIX = "<" + COMPONENT_TAG_NAME_PREFIX; //NOI18N + public static final int COMPONENT_TAG_PREFIX_LENGTH = COMPONENT_TAG_PREFIX.length(); + private static final Map INSTANCES = new HashMap<>(); private final Map installedComponentNamespace = new HashMap<>(); - private boolean scanned = false; + + private static final RequestProcessor RP = new RequestProcessor(ComponentsSupport.class); + private static final AtomicBoolean installationScan = new AtomicBoolean(false); private final Project project; + private final Map componentClassCollection = new HashMap<>(); + private ComponentsSupport(Project project) { this.project = project; } @@ -62,11 +95,11 @@ public static ComponentsSupport getInstance(Project project) { public void scanForInstalledComponents() { for (Namespace namespace : getRegisteredNamespaces()) { - FileObject fo; + FileObject fo = null; if (namespace.fromApp()) { //check if folder exists fo = project.getProjectDirectory().getFileObject(namespace.relativeFilePath()); - } else { + } else if (namespace.relativeFilePath() != null && namespace.relativeFilePath().length() > 0) { fo = project.getProjectDirectory().getFileObject("vendor/" + namespace.relativeFilePath()); // NOI18N } @@ -74,12 +107,35 @@ public void scanForInstalledComponents() { continue; } installedComponentNamespace.put(fo, namespace); + RP.submit(new ComponentParsingTask(fo, componentClassCollection)); + } + + installationScan.set(true); + } + + public void scanCustomComponentsFolders() { + BladeProjectProperties bladeProperties = BladeProjectProperties.getInstance(project); + String componentsFolder[] = bladeProperties.getBladeComponentsClassPathList(); + for (String folder : componentsFolder) { + if (folder.length() == 0) { + continue; + } + File folderFile = new File(folder); + if (!folderFile.exists()) { + continue; + } + + FileObject folderObj = FileUtil.toFileObject(folderFile); + RP.submit(new ComponentParsingTask(folderObj, componentClassCollection)); } - scanned = true; + } + + public void scanBladeComponentsClassFolder(FileObject file) { + RP.submit(new ComponentParsingTask(file, componentClassCollection)); } public boolean isScanned() { - return scanned; + return installationScan.get(); } public Map getInstalledComponentNamespace() { @@ -90,4 +146,110 @@ public Namespace[] getRegisteredNamespaces() { NamespaceRegister namespaceRegister = this.getClass().getAnnotation(NamespaceRegister.class); return namespaceRegister.value(); } + + public Map getComponentClassCollection() { + return componentClassCollection; + } + + public ComponentModel findComponentClass(FileObject file) { + return componentClassCollection.get(file); + } + + public static String tag2ClassName(String identifier) { + return identifier.length() > COMPONENT_TAG_PREFIX_LENGTH ? StringUtils.kebabToCamel(identifier.substring(COMPONENT_TAG_PREFIX_LENGTH)) : ""; // NOI18N + } + + private final class ComponentParsingTask implements Runnable, Cancellable { + + private final FileObject root; + private volatile boolean cancelled; + private volatile Future future; + private final Map componentCollection; + + private ComponentParsingTask(FileObject root, Map componentCollection) { + this.root = root; + this.componentCollection = componentCollection; + } + + @Override + public void run() { + //recursive search + Enumeration children = root.getChildren(true); + while (children.hasMoreElements()) { + FileObject file = children.nextElement(); + if (file.isFolder() || !file.getExt().endsWith("php")) { // NOI18N + continue; + } + if (!cancelled) { + ParsingUtils parsingUtils = new ParsingUtils(); + parsingUtils.laterParseFileObject(file); + PHPParseResult result = parsingUtils.getParserResult(); + if (result != null) { + ComponentModel model = new ComponentModel(file); + result.getProgram().accept(new ComponentModelVisitor(model)); + if (model.isValid()) { + componentCollection.putIfAbsent(file, model); + } + } + } + } + } + + @Override + public boolean cancel() { + cancelled = true; + if (future != null) { + future.cancel(true); + } + return true; + } + } + + private class ComponentModelVisitor extends DefaultVisitor { + + private final ComponentModel model; + + public ComponentModelVisitor(ComponentModel model) { + this.model = model; + } + + @Override + public void scan(ASTNode node) { + if (node != null) { + super.scan(node); + } + } + + @Override + public void visit(ClassDeclaration node) { + super.visit(node); + Expression superClass = node.getSuperClass(); + String superClassName = sanitazeClassName(superClass.toString()); + model.checkClassValidity(superClassName); + } + + @Override + public void visit(MethodDeclaration node) { + if (node.getFunction() == null) { + return; + } + String functionName = node.getFunction().getFunctionName().getName(); + if (functionName.equals("__construct")) { // NOI18N + List formalParameters = node.getFunction().getFormalParameters(); + for (FormalParameter parameter : formalParameters) { + model.addConstructorProperty(parameter); + } + } + } + + @Override + public void visit(FormalParameter node) { + //short constructor + model.addConstructorProperty(node); + } + + private String sanitazeClassName(String className) { + return className.replace("\\", ""); // NOI18N + } + } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java index ceaad59fc130..19911519846a 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeDirectivesUtils.java @@ -18,6 +18,10 @@ */ package org.netbeans.modules.php.blade.syntax; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.modules.php.blade.syntax.annotation.Directive; /** @@ -27,6 +31,7 @@ */ public final class BladeDirectivesUtils { + public static final String AT = "@"; // NOI18N public static final String END_DIRECTIVE_PREFIX = "@end"; // NOI18N public static final String DIRECTIVE_SECTION = "@section"; // NOI18N public static final String DIRECTIVE_HAS_SECTION = "@hasSection"; // NOI18N @@ -35,51 +40,91 @@ public final class BladeDirectivesUtils { public static final String DIRECTIVE_SHOW = "@show"; // NOI18N public static final String DIRECTIVE_STOP = "@stop"; // NOI18N public static final String DIRECTIVE_APPEND = "@append"; // NOI18N + public static final String DIRECTIVE_OVERWRITE = "@overwrite"; // NOI18N public static final String DIRECTIVE_IF = "@if"; // NOI18N + public static final String DIRECTIVE_ELSEIF = "@elseif"; // NOI18N public static final String DIRECTIVE_ELSE = "@else"; // NOI18N public static final String DIRECTIVE_ENDIF = "@endif"; // NOI18N public static final String DIRECTIVE_FOREACH = "@foreach"; // NOI18N public static final String DIRECTIVE_INCLUDE = "@include"; // NOI18N public static final String DIRECTIVE_EXTENDS = "@extends"; // NOI18N public static final String DIRECTIVE_SESSION = "@session"; // NOI18N - - public static String[] directiveStart2EndPair(String directive){ - if (directive.equals(DIRECTIVE_SECTION)){ - return new String[]{DIRECTIVE_ENDSECTION, DIRECTIVE_SHOW, DIRECTIVE_STOP, DIRECTIVE_APPEND}; + public static final String DIRECTIVE_CAN = "@can"; // NOI18N + + public static String[] blockDirectiveEndings(String directive) { + + if (directive.equals(DIRECTIVE_SECTION)) { + return new String[]{DIRECTIVE_ENDSECTION, DIRECTIVE_SHOW, DIRECTIVE_STOP, DIRECTIVE_APPEND, DIRECTIVE_OVERWRITE}; } + DirectivesList listClass = new DirectivesList(); - for (Directive directiveEl : listClass.getDirectives()){ - if (!directiveEl.name().equals(directive)){ + for (Directive directiveEl : listClass.getDirectives()) { + + if (!directiveEl.name().equals(directive)) { continue; } - if (directiveEl.endtag().isEmpty()){ + if (directiveEl.endtag().isEmpty()) { return null; } return new String[]{directiveEl.endtag()}; } return null; } - - public static String[] directiveEnd2StartPair(String directive){ - //still easier with switch + + @CheckForNull + public static String[] blockDirectiveOpenings(String directive) { switch (directive) { case DIRECTIVE_ENDIF -> { return new String[]{DIRECTIVE_IF, DIRECTIVE_HAS_SECTION, DIRECTIVE_SECTION_MISSING}; } - case DIRECTIVE_ENDSECTION, DIRECTIVE_APPEND, DIRECTIVE_STOP, DIRECTIVE_SHOW -> { + case DIRECTIVE_ELSEIF -> { + return new String[]{DIRECTIVE_IF, DIRECTIVE_ELSEIF}; + } + case DIRECTIVE_ELSE -> { + return new String[]{DIRECTIVE_IF, DIRECTIVE_ELSEIF, DIRECTIVE_CAN}; + } + case DIRECTIVE_ENDSECTION, DIRECTIVE_APPEND, DIRECTIVE_STOP, DIRECTIVE_SHOW, DIRECTIVE_OVERWRITE -> { return new String[]{DIRECTIVE_SECTION}; } } DirectivesList listClass = new DirectivesList(); - for (Directive directiveEl : listClass.getDirectives()){ - if (directiveEl.endtag().isEmpty()){ + for (Directive directiveEl : listClass.getDirectives()) { + if (directiveEl.endtag().isEmpty()) { continue; } - if (directiveEl.endtag().equals(directive)){ + if (directiveEl.endtag().equals(directive)) { return new String[]{directiveEl.name()}; } } return null; } + + public static Set blockDirectiveOpeningsSet(String[] endings) { + Set result = new HashSet<>(); + + for (String endDirective : endings) { + String[] startDirectives = blockDirectiveOpenings(endDirective); + + if (startDirectives != null) { + result.addAll(Arrays.asList(startDirectives)); + } + } + + return result; + } + + public static Set blockDirectiveEndingsSet(String[] openings) { + Set result = new HashSet<>(); + + for (String startDirective : openings) { + String[] endDirectives = blockDirectiveEndings(startDirective); + + if (endDirectives != null) { + result.addAll((Arrays.asList(endDirectives))); + } + } + + return result; + } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTagsUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTagsUtils.java index 197f2f8cce1a..981f4a98503a 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTagsUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/BladeTagsUtils.java @@ -22,13 +22,23 @@ * * @author bhaidu */ -public class BladeTagsUtils { +public final class BladeTagsUtils { + public static final String CONTENT_TAG_OPEN = "{{"; //NOI18N + public static final String CONTENT_TAG_CLOSE = "}}"; //NOI18N + + public static final String RAW_TAG_OPEN = "{!!"; //NOI18N + public static final String RAW_TAG_CLOSE = "!!}"; //NOI18N + + private BladeTagsUtils(){ + + } + public static String[] outputCloseTags() { - return new String[]{"}}", "!!}"}; //NOI18N + return new String[]{CONTENT_TAG_CLOSE, RAW_TAG_CLOSE}; } public static String[] outputStartTags() { - return new String[]{"{{", "{!!"}; //NOI18N + return new String[]{CONTENT_TAG_OPEN, RAW_TAG_OPEN}; } -} +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java index 0403ffc63e0c..1e6252e3d6da 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/StringUtils.java @@ -25,6 +25,7 @@ public final class StringUtils { public static final String DOT = "."; //NOI18N + public static final String ESCAPED_DOT = "\\."; //NOI18N public static final String FORWARD_SLASH = "/"; //NOI18N private StringUtils() { @@ -52,11 +53,12 @@ public static String capitalize(String str) { } public static String toKebabCase(String str) { - return str.replaceAll("([A-Z])", "-$1").toLowerCase().substring(1); // NOI18N + return str.replaceAll("([A-Z])", "-$1").toLowerCase().substring(1); //NOI18N } public static String kebabToCamel(String str) { - String[] words = str.toLowerCase().split("-"); // NOI18N + str = str.toLowerCase(); + String[] words = str.split("-"); //NOI18N String camelCase = words[0]; for (int i = 1; i < words.length; i++) { camelCase += words[i].substring(0, 1).toUpperCase() + words[i].substring(1); @@ -64,6 +66,10 @@ public static String kebabToCamel(String str) { return capitalize(camelCase); } + public static boolean isWhitespace(String text) { + return text.replaceAll(" ", "").isEmpty(); //NOI18N + } + public static String replaceLinesAndTabs(String input) { String escapedString = input; escapedString = escapedString.replaceAll("\n", "\\\\n"); // NOI18N diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/ViewPathUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/ViewPathUtils.java new file mode 100644 index 000000000000..9342677c8a98 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/ViewPathUtils.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax; + +/** + * + * @author bogdan + */ +public final class ViewPathUtils { + + private ViewPathUtils() { + + } + + public static int getViewPathSeparatorOffset(String pathName, int offset) { + int lastDotPos; + + if (pathName.endsWith(StringUtils.DOT)) { + lastDotPos = pathName.length(); + } else { + lastDotPos = pathName.lastIndexOf(StringUtils.DOT); + } + int pathOffset; + + if (lastDotPos > 0) { + int dotFix = pathName.endsWith(StringUtils.DOT) ? 0 : 1; + pathOffset = offset - pathName.length() + lastDotPos + dotFix; + } else { + pathOffset = offset - pathName.length(); + } + + return pathOffset; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/PhpKeyword.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/PhpKeyword.java new file mode 100644 index 000000000000..6d9424111a6b --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/PhpKeyword.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax.annotation; + +/** + * + * @author bhaidu + */ +public @interface PhpKeyword { + String name(); + boolean params() default false; + boolean parenExpr() default false; + String description() default ""; + String category() default ""; +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/PhpKeywordRegister.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/PhpKeywordRegister.java new file mode 100644 index 000000000000..9e59d4dc88f7 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/annotation/PhpKeywordRegister.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * + * @author bhaidu + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(value = {ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PACKAGE}) +public @interface PhpKeywordRegister { + public PhpKeyword[] value(); +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrLexer.g4 new file mode 100644 index 000000000000..df8fb3423e71 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrLexer.g4 @@ -0,0 +1,52 @@ +lexer grammar BladeHtmlAntlrLexer; + +@header{ + package org.netbeans.modules.php.blade.syntax.antlr4.html_components; +} + +@lexer::members { + boolean tagOpened = false; + boolean insideTag = false; + int contentTagBalance = 0; + int rawTagBalance = 0; +} + +options { + superClass = LexerAdaptor; + caseInsensitive = true; +} + +fragment Identifier + : [a-z\u0080-\ufffe][a-z0-9-_\u0080-\ufffe]*; + + +HTML_COMPONENT_OPEN_TAG : '' {insideTag = false;}; + +BLADE_COMMENT_START : '{{--' ->pushMode(INSIDE_BLADE_COMMENT), skip; + +BLADE_TAG_ESCAPE : '@' ('{')+->skip; +CONTENT_TAG_OPEN : '{{' {contentTagBalance++;}->skip; +CONTENT_TAG_CLOSE : '}}' {contentTagBalance--;}->skip; + +RAW_TAG_OPEN : '{!!' {rawTagBalance++;}; +RAW_TAG_CLOSE : '!!}' {rawTagBalance--;}; + +WS : ((' ')+ | [\r\n]+)->skip; + +TAG_PART : '!' | '!!'; + +OTHER : . ->skip; + +//============================================== + +mode INSIDE_BLADE_COMMENT; + +BLADE_COMMENT_END : '--}}'->popMode, skip; + +BLADE_COMMENT_MORE : . ->skip; + +BLADE_COMMENT_EOF : EOF->popMode, skip; \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrLexer.java new file mode 100644 index 000000000000..524449a8fe8e --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrLexer.java @@ -0,0 +1,303 @@ +// Generated from BladeHtmlAntlrLexer.g4 by ANTLR 4.13.0 + + package org.netbeans.modules.php.blade.syntax.antlr4.html_components; + +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +public class BladeHtmlAntlrLexer extends LexerAdaptor { + static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + HTML_COMPONENT_OPEN_TAG=1, COMPONENT_ATTRIBUTE=2, GT=3, BLADE_COMMENT_START=4, + BLADE_TAG_ESCAPE=5, CONTENT_TAG_OPEN=6, CONTENT_TAG_CLOSE=7, RAW_TAG_OPEN=8, + RAW_TAG_CLOSE=9, WS=10, TAG_PART=11, OTHER=12, BLADE_COMMENT_END=13, BLADE_COMMENT_MORE=14, + BLADE_COMMENT_EOF=15; + public static final int + INSIDE_BLADE_COMMENT=1; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN" + }; + + public static String[] modeNames = { + "DEFAULT_MODE", "INSIDE_BLADE_COMMENT" + }; + + private static String[] makeRuleNames() { + return new String[] { + "Identifier", "HTML_COMPONENT_OPEN_TAG", "COMPONENT_ATTRIBUTE", "GT", + "BLADE_COMMENT_START", "BLADE_TAG_ESCAPE", "CONTENT_TAG_OPEN", "CONTENT_TAG_CLOSE", + "RAW_TAG_OPEN", "RAW_TAG_CLOSE", "WS", "TAG_PART", "OTHER", "BLADE_COMMENT_END", + "BLADE_COMMENT_MORE", "BLADE_COMMENT_EOF" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, "'>'", "'{{--'", null, null, null, "'{!!'", "'!!}'", + null, null, null, "'--}}'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "HTML_COMPONENT_OPEN_TAG", "COMPONENT_ATTRIBUTE", "GT", "BLADE_COMMENT_START", + "BLADE_TAG_ESCAPE", "CONTENT_TAG_OPEN", "CONTENT_TAG_CLOSE", "RAW_TAG_OPEN", + "RAW_TAG_CLOSE", "WS", "TAG_PART", "OTHER", "BLADE_COMMENT_END", "BLADE_COMMENT_MORE", + "BLADE_COMMENT_EOF" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + + boolean tagOpened = false; + boolean insideTag = false; + int contentTagBalance = 0; + int rawTagBalance = 0; + + + public BladeHtmlAntlrLexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "BladeHtmlAntlrLexer.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public String[] getChannelNames() { return channelNames; } + + @Override + public String[] getModeNames() { return modeNames; } + + @Override + public ATN getATN() { return _ATN; } + + @Override + public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { + switch (ruleIndex) { + case 1: + HTML_COMPONENT_OPEN_TAG_action((RuleContext)_localctx, actionIndex); + break; + case 3: + GT_action((RuleContext)_localctx, actionIndex); + break; + case 6: + CONTENT_TAG_OPEN_action((RuleContext)_localctx, actionIndex); + break; + case 7: + CONTENT_TAG_CLOSE_action((RuleContext)_localctx, actionIndex); + break; + case 8: + RAW_TAG_OPEN_action((RuleContext)_localctx, actionIndex); + break; + case 9: + RAW_TAG_CLOSE_action((RuleContext)_localctx, actionIndex); + break; + } + } + private void HTML_COMPONENT_OPEN_TAG_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 0: + tagOpened = true;insideTag = true; + break; + } + } + private void GT_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 1: + insideTag = false; + break; + } + } + private void CONTENT_TAG_OPEN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 2: + contentTagBalance++; + break; + } + } + private void CONTENT_TAG_CLOSE_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 3: + contentTagBalance--; + break; + } + } + private void RAW_TAG_OPEN_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 4: + rawTagBalance++; + break; + } + } + private void RAW_TAG_CLOSE_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 5: + rawTagBalance--; + break; + } + } + @Override + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { + switch (ruleIndex) { + case 2: + return COMPONENT_ATTRIBUTE_sempred((RuleContext)_localctx, predIndex); + } + return true; + } + private boolean COMPONENT_ATTRIBUTE_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 0: + return insideTag == true && contentTagBalance == 0 && rawTagBalance == 0; + } + return true; + } + + public static final String _serializedATN = + "\u0004\u0000\u000f\u0093\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+ + "\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003"+ + "\u0007\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006"+ + "\u0007\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002"+ + "\n\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002"+ + "\u000e\u0007\u000e\u0002\u000f\u0007\u000f\u0001\u0000\u0001\u0000\u0005"+ + "\u0000%\b\u0000\n\u0000\f\u0000(\t\u0000\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003"+ + "\u00012\b\u0001\u0001\u0001\u0003\u00015\b\u0001\u0003\u00017\b\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004"+ + "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0005"+ + "\u0001\u0005\u0004\u0005L\b\u0005\u000b\u0005\f\u0005M\u0001\u0005\u0001"+ + "\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b"+ + "\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0004"+ + "\nm\b\n\u000b\n\f\nn\u0001\n\u0004\nr\b\n\u000b\n\f\ns\u0003\nv\b\n\u0001"+ + "\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b}\b\u000b\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0000\u0000\u0010"+ + "\u0002\u0000\u0004\u0001\u0006\u0002\b\u0003\n\u0004\f\u0005\u000e\u0006"+ + "\u0010\u0007\u0012\b\u0014\t\u0016\n\u0018\u000b\u001a\f\u001c\r\u001e"+ + "\u000e \u000f\u0002\u0000\u0001\u0004\u0003\u0000AZaz\u0080\u8000\ufffe"+ + "\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002\u0000XXxx\u0002\u0000\n"+ + "\n\r\r\u0099\u0000\u0004\u0001\u0000\u0000\u0000\u0000\u0006\u0001\u0000"+ + "\u0000\u0000\u0000\b\u0001\u0000\u0000\u0000\u0000\n\u0001\u0000\u0000"+ + "\u0000\u0000\f\u0001\u0000\u0000\u0000\u0000\u000e\u0001\u0000\u0000\u0000"+ + "\u0000\u0010\u0001\u0000\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000"+ + "\u0000\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000"+ + "\u0000\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000"+ + "\u0001\u001c\u0001\u0000\u0000\u0000\u0001\u001e\u0001\u0000\u0000\u0000"+ + "\u0001 \u0001\u0000\u0000\u0000\u0002\"\u0001\u0000\u0000\u0000\u0004"+ + ")\u0001\u0000\u0000\u0000\u0006:\u0001\u0000\u0000\u0000\b>\u0001\u0000"+ + "\u0000\u0000\nA\u0001\u0000\u0000\u0000\fI\u0001\u0000\u0000\u0000\u000e"+ + "Q\u0001\u0000\u0000\u0000\u0010X\u0001\u0000\u0000\u0000\u0012_\u0001"+ + "\u0000\u0000\u0000\u0014e\u0001\u0000\u0000\u0000\u0016u\u0001\u0000\u0000"+ + "\u0000\u0018|\u0001\u0000\u0000\u0000\u001a~\u0001\u0000\u0000\u0000\u001c"+ + "\u0082\u0001\u0000\u0000\u0000\u001e\u008a\u0001\u0000\u0000\u0000 \u008e"+ + "\u0001\u0000\u0000\u0000\"&\u0007\u0000\u0000\u0000#%\u0007\u0001\u0000"+ + "\u0000$#\u0001\u0000\u0000\u0000%(\u0001\u0000\u0000\u0000&$\u0001\u0000"+ + "\u0000\u0000&\'\u0001\u0000\u0000\u0000\'\u0003\u0001\u0000\u0000\u0000"+ + "(&\u0001\u0000\u0000\u0000)*\u0005<\u0000\u0000*+\u0007\u0002\u0000\u0000"+ + "+,\u0005-\u0000\u0000,6\u0001\u0000\u0000\u0000-4\u0003\u0002\u0000\u0000"+ + "./\u0005:\u0000\u0000/2\u0005:\u0000\u000002\u0005.\u0000\u00001.\u0001"+ + "\u0000\u0000\u000010\u0001\u0000\u0000\u000023\u0001\u0000\u0000\u0000"+ + "35\u0003\u0002\u0000\u000041\u0001\u0000\u0000\u000045\u0001\u0000\u0000"+ + "\u000057\u0001\u0000\u0000\u00006-\u0001\u0000\u0000\u000067\u0001\u0000"+ + "\u0000\u000078\u0001\u0000\u0000\u000089\u0006\u0001\u0000\u00009\u0005"+ + "\u0001\u0000\u0000\u0000:;\u0004\u0002\u0000\u0000;<\u0005:\u0000\u0000"+ + "<=\u0003\u0002\u0000\u0000=\u0007\u0001\u0000\u0000\u0000>?\u0005>\u0000"+ + "\u0000?@\u0006\u0003\u0001\u0000@\t\u0001\u0000\u0000\u0000AB\u0005{\u0000"+ + "\u0000BC\u0005{\u0000\u0000CD\u0005-\u0000\u0000DE\u0005-\u0000\u0000"+ + "EF\u0001\u0000\u0000\u0000FG\u0006\u0004\u0002\u0000GH\u0006\u0004\u0003"+ + "\u0000H\u000b\u0001\u0000\u0000\u0000IK\u0005@\u0000\u0000JL\u0005{\u0000"+ + "\u0000KJ\u0001\u0000\u0000\u0000LM\u0001\u0000\u0000\u0000MK\u0001\u0000"+ + "\u0000\u0000MN\u0001\u0000\u0000\u0000NO\u0001\u0000\u0000\u0000OP\u0006"+ + "\u0005\u0003\u0000P\r\u0001\u0000\u0000\u0000QR\u0005{\u0000\u0000RS\u0005"+ + "{\u0000\u0000ST\u0001\u0000\u0000\u0000TU\u0006\u0006\u0004\u0000UV\u0001"+ + "\u0000\u0000\u0000VW\u0006\u0006\u0003\u0000W\u000f\u0001\u0000\u0000"+ + "\u0000XY\u0005}\u0000\u0000YZ\u0005}\u0000\u0000Z[\u0001\u0000\u0000\u0000"+ + "[\\\u0006\u0007\u0005\u0000\\]\u0001\u0000\u0000\u0000]^\u0006\u0007\u0003"+ + "\u0000^\u0011\u0001\u0000\u0000\u0000_`\u0005{\u0000\u0000`a\u0005!\u0000"+ + "\u0000ab\u0005!\u0000\u0000bc\u0001\u0000\u0000\u0000cd\u0006\b\u0006"+ + "\u0000d\u0013\u0001\u0000\u0000\u0000ef\u0005!\u0000\u0000fg\u0005!\u0000"+ + "\u0000gh\u0005}\u0000\u0000hi\u0001\u0000\u0000\u0000ij\u0006\t\u0007"+ + "\u0000j\u0015\u0001\u0000\u0000\u0000km\u0005 \u0000\u0000lk\u0001\u0000"+ + "\u0000\u0000mn\u0001\u0000\u0000\u0000nl\u0001\u0000\u0000\u0000no\u0001"+ + "\u0000\u0000\u0000ov\u0001\u0000\u0000\u0000pr\u0007\u0003\u0000\u0000"+ + "qp\u0001\u0000\u0000\u0000rs\u0001\u0000\u0000\u0000sq\u0001\u0000\u0000"+ + "\u0000st\u0001\u0000\u0000\u0000tv\u0001\u0000\u0000\u0000ul\u0001\u0000"+ + "\u0000\u0000uq\u0001\u0000\u0000\u0000vw\u0001\u0000\u0000\u0000wx\u0006"+ + "\n\u0003\u0000x\u0017\u0001\u0000\u0000\u0000y}\u0005!\u0000\u0000z{\u0005"+ + "!\u0000\u0000{}\u0005!\u0000\u0000|y\u0001\u0000\u0000\u0000|z\u0001\u0000"+ + "\u0000\u0000}\u0019\u0001\u0000\u0000\u0000~\u007f\t\u0000\u0000\u0000"+ + "\u007f\u0080\u0001\u0000\u0000\u0000\u0080\u0081\u0006\f\u0003\u0000\u0081"+ + "\u001b\u0001\u0000\u0000\u0000\u0082\u0083\u0005-\u0000\u0000\u0083\u0084"+ + "\u0005-\u0000\u0000\u0084\u0085\u0005}\u0000\u0000\u0085\u0086\u0005}"+ + "\u0000\u0000\u0086\u0087\u0001\u0000\u0000\u0000\u0087\u0088\u0006\r\b"+ + "\u0000\u0088\u0089\u0006\r\u0003\u0000\u0089\u001d\u0001\u0000\u0000\u0000"+ + "\u008a\u008b\t\u0000\u0000\u0000\u008b\u008c\u0001\u0000\u0000\u0000\u008c"+ + "\u008d\u0006\u000e\u0003\u0000\u008d\u001f\u0001\u0000\u0000\u0000\u008e"+ + "\u008f\u0005\u0000\u0000\u0001\u008f\u0090\u0001\u0000\u0000\u0000\u0090"+ + "\u0091\u0006\u000f\b\u0000\u0091\u0092\u0006\u000f\u0003\u0000\u0092!"+ + "\u0001\u0000\u0000\u0000\u000b\u0000\u0001&146Mnsu|\t\u0001\u0001\u0000"+ + "\u0001\u0003\u0001\u0005\u0001\u0000\u0006\u0000\u0000\u0001\u0006\u0002"+ + "\u0001\u0007\u0003\u0001\b\u0004\u0001\t\u0005\u0004\u0000\u0000"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParser.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParser.g4 new file mode 100644 index 000000000000..504f3dd1ce01 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParser.g4 @@ -0,0 +1,20 @@ +parser grammar BladeHtmlAntlrParser; + +@header{ + /** + * Parser generated for netbeans blade editor + * Some elements have been simplified to optimize parser speed + * For example + * - switch statement have a loos validation + * - generic block statement "@isset" | "@unless" are grouped togehter + * - the start match and end match will be checked in the parser + */ + package org.netbeans.modules.php.blade.syntax.antlr4.html_components; +} + +options { tokenVocab = BladeHtmlAntlrLexer; } + +root : element* EOF; + +element : + HTML_COMPONENT_OPEN_TAG; \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParser.java new file mode 100644 index 000000000000..378db25e860d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParser.java @@ -0,0 +1,225 @@ +// Generated from BladeHtmlAntlrParser.g4 by ANTLR 4.13.0 + + /** + * Parser generated for netbeans blade editor + * Some elements have been simplified to optimize parser speed + * For example + * - switch statement have a loos validation + * - generic block statement "@isset" | "@unless" are grouped togehter + * - the start match and end match will be checked in the parser + */ + package org.netbeans.modules.php.blade.syntax.antlr4.html_components; + +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.misc.*; +import org.antlr.v4.runtime.tree.*; +import java.util.List; +import java.util.Iterator; +import java.util.ArrayList; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +public class BladeHtmlAntlrParser extends Parser { + static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + HTML_COMPONENT_OPEN_TAG=1, COMPONENT_ATTRIBUTE=2, GT=3, BLADE_COMMENT_START=4, + BLADE_TAG_ESCAPE=5, CONTENT_TAG_OPEN=6, CONTENT_TAG_CLOSE=7, RAW_TAG_OPEN=8, + RAW_TAG_CLOSE=9, WS=10, TAG_PART=11, OTHER=12, BLADE_COMMENT_END=13, BLADE_COMMENT_MORE=14, + BLADE_COMMENT_EOF=15; + public static final int + RULE_root = 0, RULE_element = 1; + private static String[] makeRuleNames() { + return new String[] { + "root", "element" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, "'>'", "'{{--'", null, null, null, "'{!!'", "'!!}'", + null, null, null, "'--}}'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "HTML_COMPONENT_OPEN_TAG", "COMPONENT_ATTRIBUTE", "GT", "BLADE_COMMENT_START", + "BLADE_TAG_ESCAPE", "CONTENT_TAG_OPEN", "CONTENT_TAG_CLOSE", "RAW_TAG_OPEN", + "RAW_TAG_CLOSE", "WS", "TAG_PART", "OTHER", "BLADE_COMMENT_END", "BLADE_COMMENT_MORE", + "BLADE_COMMENT_EOF" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + @Override + public String getGrammarFileName() { return "BladeHtmlAntlrParser.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public ATN getATN() { return _ATN; } + + public BladeHtmlAntlrParser(TokenStream input) { + super(input); + _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @SuppressWarnings("CheckReturnValue") + public static class RootContext extends ParserRuleContext { + public TerminalNode EOF() { return getToken(BladeHtmlAntlrParser.EOF, 0); } + public List element() { + return getRuleContexts(ElementContext.class); + } + public ElementContext element(int i) { + return getRuleContext(ElementContext.class,i); + } + public RootContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_root; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeHtmlAntlrParserListener ) ((BladeHtmlAntlrParserListener)listener).enterRoot(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeHtmlAntlrParserListener ) ((BladeHtmlAntlrParserListener)listener).exitRoot(this); + } + } + + public final RootContext root() throws RecognitionException { + RootContext _localctx = new RootContext(_ctx, getState()); + enterRule(_localctx, 0, RULE_root); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(7); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==HTML_COMPONENT_OPEN_TAG) { + { + { + setState(4); + element(); + } + } + setState(9); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(10); + match(EOF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ElementContext extends ParserRuleContext { + public TerminalNode HTML_COMPONENT_OPEN_TAG() { return getToken(BladeHtmlAntlrParser.HTML_COMPONENT_OPEN_TAG, 0); } + public ElementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_element; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladeHtmlAntlrParserListener ) ((BladeHtmlAntlrParserListener)listener).enterElement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladeHtmlAntlrParserListener ) ((BladeHtmlAntlrParserListener)listener).exitElement(this); + } + } + + public final ElementContext element() throws RecognitionException { + ElementContext _localctx = new ElementContext(_ctx, getState()); + enterRule(_localctx, 2, RULE_element); + try { + enterOuterAlt(_localctx, 1); + { + setState(12); + match(HTML_COMPONENT_OPEN_TAG); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static final String _serializedATN = + "\u0004\u0001\u000f\u000f\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0001\u0000\u0005\u0000\u0006\b\u0000\n\u0000\f\u0000\t\t\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0000\u0000\u0002"+ + "\u0000\u0002\u0000\u0000\r\u0000\u0007\u0001\u0000\u0000\u0000\u0002\f"+ + "\u0001\u0000\u0000\u0000\u0004\u0006\u0003\u0002\u0001\u0000\u0005\u0004"+ + "\u0001\u0000\u0000\u0000\u0006\t\u0001\u0000\u0000\u0000\u0007\u0005\u0001"+ + "\u0000\u0000\u0000\u0007\b\u0001\u0000\u0000\u0000\b\n\u0001\u0000\u0000"+ + "\u0000\t\u0007\u0001\u0000\u0000\u0000\n\u000b\u0005\u0000\u0000\u0001"+ + "\u000b\u0001\u0001\u0000\u0000\u0000\f\r\u0005\u0001\u0000\u0000\r\u0003"+ + "\u0001\u0000\u0000\u0000\u0001\u0007"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParserBaseListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParserBaseListener.java new file mode 100644 index 000000000000..c2acd3a7a176 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParserBaseListener.java @@ -0,0 +1,74 @@ +// Generated from BladeHtmlAntlrParser.g4 by ANTLR 4.13.0 + + /** + * Parser generated for netbeans blade editor + * Some elements have been simplified to optimize parser speed + * For example + * - switch statement have a loos validation + * - generic block statement "@isset" | "@unless" are grouped togehter + * - the start match and end match will be checked in the parser + */ + package org.netbeans.modules.php.blade.syntax.antlr4.html_components; + + +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.tree.ErrorNode; +import org.antlr.v4.runtime.tree.TerminalNode; + +/** + * This class provides an empty implementation of {@link BladeHtmlAntlrParserListener}, + * which can be extended to create a listener which only needs to handle a subset + * of the available methods. + */ +@SuppressWarnings("CheckReturnValue") +public class BladeHtmlAntlrParserBaseListener implements BladeHtmlAntlrParserListener { + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterRoot(BladeHtmlAntlrParser.RootContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitRoot(BladeHtmlAntlrParser.RootContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterElement(BladeHtmlAntlrParser.ElementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitElement(BladeHtmlAntlrParser.ElementContext ctx) { } + + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void visitTerminal(TerminalNode node) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void visitErrorNode(ErrorNode node) { } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParserListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParserListener.java new file mode 100644 index 000000000000..513add1ee9de --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParserListener.java @@ -0,0 +1,40 @@ +// Generated from BladeHtmlAntlrParser.g4 by ANTLR 4.13.0 + + /** + * Parser generated for netbeans blade editor + * Some elements have been simplified to optimize parser speed + * For example + * - switch statement have a loos validation + * - generic block statement "@isset" | "@unless" are grouped togehter + * - the start match and end match will be checked in the parser + */ + package org.netbeans.modules.php.blade.syntax.antlr4.html_components; + +import org.antlr.v4.runtime.tree.ParseTreeListener; + +/** + * This interface defines a complete listener for a parse tree produced by + * {@link BladeHtmlAntlrParser}. + */ +public interface BladeHtmlAntlrParserListener extends ParseTreeListener { + /** + * Enter a parse tree produced by {@link BladeHtmlAntlrParser#root}. + * @param ctx the parse tree + */ + void enterRoot(BladeHtmlAntlrParser.RootContext ctx); + /** + * Exit a parse tree produced by {@link BladeHtmlAntlrParser#root}. + * @param ctx the parse tree + */ + void exitRoot(BladeHtmlAntlrParser.RootContext ctx); + /** + * Enter a parse tree produced by {@link BladeHtmlAntlrParser#element}. + * @param ctx the parse tree + */ + void enterElement(BladeHtmlAntlrParser.ElementContext ctx); + /** + * Exit a parse tree produced by {@link BladeHtmlAntlrParser#element}. + * @param ctx the parse tree + */ + void exitElement(BladeHtmlAntlrParser.ElementContext ctx); +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrUtils.java new file mode 100644 index 000000000000..c31becb85a19 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrUtils.java @@ -0,0 +1,55 @@ +/* +Licensed to the Apache Software Foundation (ASF) + */ +package org.netbeans.modules.php.blade.syntax.antlr4.html_components; + +import java.util.Set; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.Token; +import org.netbeans.modules.php.blade.syntax.antlr4.utils.BaseBladeAntlrUtils; +import org.netbeans.spi.lexer.antlr4.AntlrTokenSequence; + +/** + * + * @author bogdan + */ +public final class BladeHtmlAntlrUtils extends BaseBladeAntlrUtils { + + public static AntlrTokenSequence getTokens(Document doc) { + + try { + String text = doc.getText(0, doc.getLength()); + return new AntlrTokenSequence(new BladeHtmlAntlrLexer(CharStreams.fromString(text))); + } catch (BadLocationException ex) { + + } + return null; + } + + + public static Token findBackwardWithStop( + AntlrTokenSequence tokens, int tokenMatch, Set stopTokens) { + if (tokens == null || tokens.isEmpty()) { + return null; + } + + while (tokens.hasPrevious()) { + Token pt = tokens.previous().get(); + if (pt == null) { + continue; + } + + if (pt.getType() == tokenMatch) { + return pt; + } + + if (stopTokens.contains(pt.getType())) { + return null; + } + } + + return null; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/LexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/LexerAdaptor.java new file mode 100644 index 000000000000..61620489f937 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/LexerAdaptor.java @@ -0,0 +1,46 @@ +/* +Licensed to the Apache Software Foundation (ASF) + */ +package org.netbeans.modules.php.blade.syntax.antlr4.html_components; + +import org.netbeans.modules.php.blade.syntax.antlr4.php.*; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.*; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.atn.ATN; +import org.antlr.v4.runtime.misc.Interval; + +/** + * + * @author bogdan + */ +public abstract class LexerAdaptor extends Lexer { + + private int _currentRuleType = Token.INVALID_TYPE; + public int exitIfModePosition = 0; + public boolean compomentTagOpen = false; + + public LexerAdaptor(CharStream input) { + super(input); + } + + public int getCurrentRuleType() { + return _currentRuleType; + } + + public void setCurrentRuleType(int ruleType) { + this._currentRuleType = ruleType; + } + + @Override + public Token emit() { + return super.emit(); + } + + @Override + public void reset() { + setCurrentRuleType(Token.INVALID_TYPE); + super.reset(); + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.g4 new file mode 100644 index 000000000000..22a5993f5ff6 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.g4 @@ -0,0 +1,109 @@ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +lexer grammar BladePhpAntlrLexer; +import BladePhpCommonLexer; + +@header{ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + package org.netbeans.modules.php.blade.syntax.antlr4.php; +} + +@lexer::members { + int rparenBalance = 0; + int sqparenBalance = 0; + int curlyparenBalance = 0; +} + +options { + superClass = LexerAdaptor; + caseInsensitive = true; +} + +LINE_COMMENT : LineComment->skip; + +ARRAY : 'array'; +AS : 'as'; +ECHO : 'echo'; +IF : 'if'; +ELSEIF : 'elseif' | 'else if'; +ELSE : 'else'; +NEW : 'new'; +CLASS : 'class'; +FUNCTION : 'function'; +LANG_CONSTRUCT : 'empty' | 'isset'; +MATCH : 'match'; +FOREACH : 'foreach'; + +COMMA : ',' ; + +LPAREN : '('; +RPAREN : ')'; + +LSQUAREBRACKET: '['; +RSQUAREBRACKET: ']'; + +LCURLYBRACE: '{'; +RCURLYBRACE: '}'; + +IDENTIFIER : Identifier; + +PHP_VARIABLE : PhpVariable; + +DOLLAR : '$'; + +NAMESPACE_SEPARATOR : '\\'; +DOUBLE_COLON : '::'; +ARROW : '=>'; +OBJECT_OPERATOR : '->'; + +SEMI_COLON : ';'; + +COMPARISON_OPERATOR : ('==' | '!=' | '>' | '<') '='?; + +LOGICAL_UNION_OPERATOR : '&&' | '||'; + +STRING_LITERAL : StringLiteral; + + +STYLE_COMMENT : '/*' .*? '*/' [\n\r]*->skip; + +WS : ((' ')+ | [\r\n]+)->skip; + +//testing purpose +PHP_DIRECTIVE : ('@php' | '@endphp')->skip; + +OTHER : . ->skip; + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.java new file mode 100644 index 000000000000..e4d981210318 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.java @@ -0,0 +1,629 @@ +// Generated from BladePhpAntlrLexer.g4 by ANTLR 4.13.0 + + package org.netbeans.modules.php.blade.syntax.antlr4.php; + +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +public class BladePhpAntlrLexer extends LexerAdaptor { + static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + HTML=1, BLADE_COMMENT=2, LINE_COMMENT=3, ARRAY=4, AS=5, ECHO=6, IF=7, + ELSEIF=8, ELSE=9, NEW=10, CLASS=11, FUNCTION=12, LANG_CONSTRUCT=13, MATCH=14, + FOREACH=15, COMMA=16, LPAREN=17, RPAREN=18, LSQUAREBRACKET=19, RSQUAREBRACKET=20, + LCURLYBRACE=21, RCURLYBRACE=22, IDENTIFIER=23, PHP_VARIABLE=24, DOLLAR=25, + NAMESPACE_SEPARATOR=26, DOUBLE_COLON=27, ARROW=28, OBJECT_OPERATOR=29, + SEMI_COLON=30, COMPARISON_OPERATOR=31, LOGICAL_UNION_OPERATOR=32, STRING_LITERAL=33, + STYLE_COMMENT=34, WS=35, PHP_DIRECTIVE=36, OTHER=37, BLADE_COMMENT_START=38, + EMAIL_SUBSTRING=39, VERSION_WITH_AT=40, BLADE_COMMENT_END=41, BLADE_COMMENT_PEEK=42, + BLADE_COMMENT_MORE=43, BLADE_COMMENT_EOF=44; + public static final int + INSIDE_BLADE_COMMENT=1; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN" + }; + + public static String[] modeNames = { + "DEFAULT_MODE", "INSIDE_BLADE_COMMENT" + }; + + private static String[] makeRuleNames() { + return new String[] { + "LINE_COMMENT", "ARRAY", "AS", "ECHO", "IF", "ELSEIF", "ELSE", "NEW", + "CLASS", "FUNCTION", "LANG_CONSTRUCT", "MATCH", "FOREACH", "COMMA", "LPAREN", + "RPAREN", "LSQUAREBRACKET", "RSQUAREBRACKET", "LCURLYBRACE", "RCURLYBRACE", + "IDENTIFIER", "PHP_VARIABLE", "DOLLAR", "NAMESPACE_SEPARATOR", "DOUBLE_COLON", + "ARROW", "OBJECT_OPERATOR", "SEMI_COLON", "COMPARISON_OPERATOR", "LOGICAL_UNION_OPERATOR", + "STRING_LITERAL", "STYLE_COMMENT", "WS", "PHP_DIRECTIVE", "OTHER", "Identifier", + "HtmlIdentifier", "ESC_DOUBLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING_FRAGMENT", + "SINGLE_QUOTED_STRING_FRAGMENT", "StringLiteral", "LineComment", "PhpVariable", + "Digit", "BLADE_COMMENT_START", "EMAIL_SUBSTRING", "VERSION_WITH_AT", + "D_ESCAPES", "BLADE_COMMENT_END", "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", + "BLADE_COMMENT_EOF" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, "'array'", "'as'", "'echo'", "'if'", null, "'else'", + "'new'", "'class'", "'function'", null, "'match'", "'foreach'", "','", + "'('", "')'", "'['", "']'", "'{'", "'}'", null, null, "'$'", "'\\'", + "'::'", "'=>'", "'->'", "';'", null, null, null, null, null, null, null, + "'{{--'", null, null, "'--}}'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "HTML", "BLADE_COMMENT", "LINE_COMMENT", "ARRAY", "AS", "ECHO", + "IF", "ELSEIF", "ELSE", "NEW", "CLASS", "FUNCTION", "LANG_CONSTRUCT", + "MATCH", "FOREACH", "COMMA", "LPAREN", "RPAREN", "LSQUAREBRACKET", "RSQUAREBRACKET", + "LCURLYBRACE", "RCURLYBRACE", "IDENTIFIER", "PHP_VARIABLE", "DOLLAR", + "NAMESPACE_SEPARATOR", "DOUBLE_COLON", "ARROW", "OBJECT_OPERATOR", "SEMI_COLON", + "COMPARISON_OPERATOR", "LOGICAL_UNION_OPERATOR", "STRING_LITERAL", "STYLE_COMMENT", + "WS", "PHP_DIRECTIVE", "OTHER", "BLADE_COMMENT_START", "EMAIL_SUBSTRING", + "VERSION_WITH_AT", "BLADE_COMMENT_END", "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", + "BLADE_COMMENT_EOF" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + + int rparenBalance = 0; + int sqparenBalance = 0; + int curlyparenBalance = 0; + + + public BladePhpAntlrLexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "BladePhpAntlrLexer.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public String[] getChannelNames() { return channelNames; } + + @Override + public String[] getModeNames() { return modeNames; } + + @Override + public ATN getATN() { return _ATN; } + + @Override + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { + switch (ruleIndex) { + case 49: + return BLADE_COMMENT_PEEK_sempred((RuleContext)_localctx, predIndex); + } + return true; + } + private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 0: + return + this._input.LA(1) == '-' && + this._input.LA(2) == '-' && + this._input.LA(3) == '}' && + this._input.LA(4) == '}' + ; + } + return true; + } + + public static final String _serializedATN = + "\u0004\u0000,\u02c7\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000\u0007"+ + "\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007"+ + "\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007"+ + "\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n"+ + "\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002"+ + "\u000e\u0007\u000e\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002"+ + "\u0011\u0007\u0011\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002"+ + "\u0014\u0007\u0014\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002"+ + "\u0017\u0007\u0017\u0002\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002"+ + "\u001a\u0007\u001a\u0002\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002"+ + "\u001d\u0007\u001d\u0002\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002"+ + " \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002"+ + "%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002"+ + "*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002"+ + "/\u0007/\u00020\u00070\u00021\u00071\u00022\u00072\u00023\u00073\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001"+ + "\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u008d\b\u0005\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b"+ + "\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0003\n\u00b1\b\n\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001"+ + "\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001"+ + "\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001"+ + "\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ + "\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001c\u0001"+ + "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0003\u001c\u00e7\b\u001c\u0001"+ + "\u001c\u0003\u001c\u00ea\b\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001"+ + "\u001d\u0003\u001d\u00f0\b\u001d\u0001\u001e\u0001\u001e\u0001\u001f\u0001"+ + "\u001f\u0001\u001f\u0001\u001f\u0005\u001f\u00f8\b\u001f\n\u001f\f\u001f"+ + "\u00fb\t\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0005\u001f"+ + "\u0101\b\u001f\n\u001f\f\u001f\u0104\t\u001f\u0001\u001f\u0001\u001f\u0001"+ + " \u0004 \u0109\b \u000b \f \u010a\u0001 \u0004 \u010e\b \u000b \f \u010f"+ + "\u0003 \u0112\b \u0001 \u0001 \u0001!\u0001!\u0001!\u0001!\u0001!\u0001"+ + "!\u0001!\u0001!\u0001!\u0001!\u0001!\u0003!\u0121\b!\u0001!\u0001!\u0001"+ + "\"\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0005#\u012b\b#\n#\f#\u012e\t"+ + "#\u0001$\u0001$\u0005$\u0132\b$\n$\f$\u0135\t$\u0001%\u0001%\u0001&\u0001"+ + "&\u0001&\u0005&\u013c\b&\n&\f&\u013f\t&\u0001&\u0001&\u0001\'\u0001\'"+ + "\u0001\'\u0001\'\u0005\'\u0147\b\'\n\'\f\'\u014a\t\'\u0001\'\u0001\'\u0001"+ + "(\u0001(\u0003(\u0150\b(\u0001)\u0001)\u0001)\u0001)\u0005)\u0156\b)\n"+ + ")\f)\u0159\t)\u0001*\u0001*\u0001*\u0001+\u0001+\u0001,\u0001,\u0001,"+ + "\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001.\u0001.\u0001.\u0003.\u0171\b.\u0004.\u0173\b.\u000b.\f"+ + ".\u0174\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0003/\u0180\b/\u0001/\u0001/\u0001/\u0001/\u0003/\u0186\b/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0004/\u0190\b/\u000b/\f/"+ + "\u0191\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0004/"+ + "\u019c\b/\u000b/\f/\u019d\u0001/\u0001/\u0001/\u0003/\u01a3\b/\u0003/"+ + "\u01a5\b/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0003/\u02a6\b/\u0001/\u0005"+ + "/\u02a9\b/\n/\f/\u02ac\t/\u0003/\u02ae\b/\u0001/\u0001/\u00010\u00010"+ + "\u00010\u00010\u00010\u00010\u00010\u00010\u00011\u00011\u00011\u0001"+ + "1\u00011\u00012\u00012\u00012\u00012\u00013\u00013\u00013\u00013\u0001"+ + "3\u0002\u00f9\u013d\u00004\u0002\u0003\u0004\u0004\u0006\u0005\b\u0006"+ + "\n\u0007\f\b\u000e\t\u0010\n\u0012\u000b\u0014\f\u0016\r\u0018\u000e\u001a"+ + "\u000f\u001c\u0010\u001e\u0011 \u0012\"\u0013$\u0014&\u0015(\u0016*\u0017"+ + ",\u0018.\u00190\u001a2\u001b4\u001c6\u001d8\u001e:\u001f< >!@\"B#D$F%"+ + "H\u0000J\u0000L\u0000N\u0000P\u0000R\u0000T\u0000V\u0000X\u0000Z&\\\'"+ + "^(`\u0000b)d*f+h,\u0002\u0000\u0001\u001e\u0002\u0000AAaa\u0002\u0000"+ + "RRrr\u0002\u0000YYyy\u0002\u0000SSss\u0002\u0000EEee\u0002\u0000CCcc\u0002"+ + "\u0000HHhh\u0002\u0000OOoo\u0002\u0000IIii\u0002\u0000FFff\u0002\u0000"+ + "LLll\u0002\u0000NNnn\u0002\u0000WWww\u0002\u0000UUuu\u0002\u0000TTtt\u0002"+ + "\u0000MMmm\u0002\u0000PPpp\u0002\u0000<<>>\u0002\u0000\n\n\r\r\u0002\u0000"+ + "DDdd\u0004\u0000AZ__az\u0080\u8000\ufffe\u0005\u000009AZ__az\u0080\u8000"+ + "\ufffe\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002\u0000\"\"\\\\\u0002"+ + "\u0000\'\'\\\\\u0001\u0000 \u0002\u0000GGgg\u0002\u0000BBbb\u0002\u0000"+ + "KKkk\u0002\u0000VVvv\u02f4\u0000\u0002\u0001\u0000\u0000\u0000\u0000\u0004"+ + "\u0001\u0000\u0000\u0000\u0000\u0006\u0001\u0000\u0000\u0000\u0000\b\u0001"+ + "\u0000\u0000\u0000\u0000\n\u0001\u0000\u0000\u0000\u0000\f\u0001\u0000"+ + "\u0000\u0000\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0010\u0001\u0000"+ + "\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000\u0000\u0014\u0001\u0000"+ + "\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000"+ + "\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000"+ + "\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000"+ + "\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000"+ + "\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*"+ + "\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000"+ + "\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000"+ + "\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008"+ + "\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000"+ + "\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000"+ + "\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F"+ + "\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000\\\u0001"+ + "\u0000\u0000\u0000\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001\u0000\u0000"+ + "\u0000\u0001b\u0001\u0000\u0000\u0000\u0001d\u0001\u0000\u0000\u0000\u0001"+ + "f\u0001\u0000\u0000\u0000\u0001h\u0001\u0000\u0000\u0000\u0002j\u0001"+ + "\u0000\u0000\u0000\u0004n\u0001\u0000\u0000\u0000\u0006t\u0001\u0000\u0000"+ + "\u0000\bw\u0001\u0000\u0000\u0000\n|\u0001\u0000\u0000\u0000\f\u008c\u0001"+ + "\u0000\u0000\u0000\u000e\u008e\u0001\u0000\u0000\u0000\u0010\u0093\u0001"+ + "\u0000\u0000\u0000\u0012\u0097\u0001\u0000\u0000\u0000\u0014\u009d\u0001"+ + "\u0000\u0000\u0000\u0016\u00b0\u0001\u0000\u0000\u0000\u0018\u00b2\u0001"+ + "\u0000\u0000\u0000\u001a\u00b8\u0001\u0000\u0000\u0000\u001c\u00c0\u0001"+ + "\u0000\u0000\u0000\u001e\u00c2\u0001\u0000\u0000\u0000 \u00c4\u0001\u0000"+ + "\u0000\u0000\"\u00c6\u0001\u0000\u0000\u0000$\u00c8\u0001\u0000\u0000"+ + "\u0000&\u00ca\u0001\u0000\u0000\u0000(\u00cc\u0001\u0000\u0000\u0000*"+ + "\u00ce\u0001\u0000\u0000\u0000,\u00d0\u0001\u0000\u0000\u0000.\u00d2\u0001"+ + "\u0000\u0000\u00000\u00d4\u0001\u0000\u0000\u00002\u00d6\u0001\u0000\u0000"+ + "\u00004\u00d9\u0001\u0000\u0000\u00006\u00dc\u0001\u0000\u0000\u00008"+ + "\u00df\u0001\u0000\u0000\u0000:\u00e6\u0001\u0000\u0000\u0000<\u00ef\u0001"+ + "\u0000\u0000\u0000>\u00f1\u0001\u0000\u0000\u0000@\u00f3\u0001\u0000\u0000"+ + "\u0000B\u0111\u0001\u0000\u0000\u0000D\u0120\u0001\u0000\u0000\u0000F"+ + "\u0124\u0001\u0000\u0000\u0000H\u0128\u0001\u0000\u0000\u0000J\u012f\u0001"+ + "\u0000\u0000\u0000L\u0136\u0001\u0000\u0000\u0000N\u0138\u0001\u0000\u0000"+ + "\u0000P\u0142\u0001\u0000\u0000\u0000R\u014f\u0001\u0000\u0000\u0000T"+ + "\u0151\u0001\u0000\u0000\u0000V\u015a\u0001\u0000\u0000\u0000X\u015d\u0001"+ + "\u0000\u0000\u0000Z\u015f\u0001\u0000\u0000\u0000\\\u0167\u0001\u0000"+ + "\u0000\u0000^\u016d\u0001\u0000\u0000\u0000`\u02ad\u0001\u0000\u0000\u0000"+ + "b\u02b1\u0001\u0000\u0000\u0000d\u02b9\u0001\u0000\u0000\u0000f\u02be"+ + "\u0001\u0000\u0000\u0000h\u02c2\u0001\u0000\u0000\u0000jk\u0003T)\u0000"+ + "kl\u0001\u0000\u0000\u0000lm\u0006\u0000\u0000\u0000m\u0003\u0001\u0000"+ + "\u0000\u0000no\u0007\u0000\u0000\u0000op\u0007\u0001\u0000\u0000pq\u0007"+ + "\u0001\u0000\u0000qr\u0007\u0000\u0000\u0000rs\u0007\u0002\u0000\u0000"+ + "s\u0005\u0001\u0000\u0000\u0000tu\u0007\u0000\u0000\u0000uv\u0007\u0003"+ + "\u0000\u0000v\u0007\u0001\u0000\u0000\u0000wx\u0007\u0004\u0000\u0000"+ + "xy\u0007\u0005\u0000\u0000yz\u0007\u0006\u0000\u0000z{\u0007\u0007\u0000"+ + "\u0000{\t\u0001\u0000\u0000\u0000|}\u0007\b\u0000\u0000}~\u0007\t\u0000"+ + "\u0000~\u000b\u0001\u0000\u0000\u0000\u007f\u0080\u0007\u0004\u0000\u0000"+ + "\u0080\u0081\u0007\n\u0000\u0000\u0081\u0082\u0007\u0003\u0000\u0000\u0082"+ + "\u0083\u0007\u0004\u0000\u0000\u0083\u0084\u0007\b\u0000\u0000\u0084\u008d"+ + "\u0007\t\u0000\u0000\u0085\u0086\u0007\u0004\u0000\u0000\u0086\u0087\u0007"+ + "\n\u0000\u0000\u0087\u0088\u0007\u0003\u0000\u0000\u0088\u0089\u0007\u0004"+ + "\u0000\u0000\u0089\u008a\u0005 \u0000\u0000\u008a\u008b\u0007\b\u0000"+ + "\u0000\u008b\u008d\u0007\t\u0000\u0000\u008c\u007f\u0001\u0000\u0000\u0000"+ + "\u008c\u0085\u0001\u0000\u0000\u0000\u008d\r\u0001\u0000\u0000\u0000\u008e"+ + "\u008f\u0007\u0004\u0000\u0000\u008f\u0090\u0007\n\u0000\u0000\u0090\u0091"+ + "\u0007\u0003\u0000\u0000\u0091\u0092\u0007\u0004\u0000\u0000\u0092\u000f"+ + "\u0001\u0000\u0000\u0000\u0093\u0094\u0007\u000b\u0000\u0000\u0094\u0095"+ + "\u0007\u0004\u0000\u0000\u0095\u0096\u0007\f\u0000\u0000\u0096\u0011\u0001"+ + "\u0000\u0000\u0000\u0097\u0098\u0007\u0005\u0000\u0000\u0098\u0099\u0007"+ + "\n\u0000\u0000\u0099\u009a\u0007\u0000\u0000\u0000\u009a\u009b\u0007\u0003"+ + "\u0000\u0000\u009b\u009c\u0007\u0003\u0000\u0000\u009c\u0013\u0001\u0000"+ + "\u0000\u0000\u009d\u009e\u0007\t\u0000\u0000\u009e\u009f\u0007\r\u0000"+ + "\u0000\u009f\u00a0\u0007\u000b\u0000\u0000\u00a0\u00a1\u0007\u0005\u0000"+ + "\u0000\u00a1\u00a2\u0007\u000e\u0000\u0000\u00a2\u00a3\u0007\b\u0000\u0000"+ + "\u00a3\u00a4\u0007\u0007\u0000\u0000\u00a4\u00a5\u0007\u000b\u0000\u0000"+ + "\u00a5\u0015\u0001\u0000\u0000\u0000\u00a6\u00a7\u0007\u0004\u0000\u0000"+ + "\u00a7\u00a8\u0007\u000f\u0000\u0000\u00a8\u00a9\u0007\u0010\u0000\u0000"+ + "\u00a9\u00aa\u0007\u000e\u0000\u0000\u00aa\u00b1\u0007\u0002\u0000\u0000"+ + "\u00ab\u00ac\u0007\b\u0000\u0000\u00ac\u00ad\u0007\u0003\u0000\u0000\u00ad"+ + "\u00ae\u0007\u0003\u0000\u0000\u00ae\u00af\u0007\u0004\u0000\u0000\u00af"+ + "\u00b1\u0007\u000e\u0000\u0000\u00b0\u00a6\u0001\u0000\u0000\u0000\u00b0"+ + "\u00ab\u0001\u0000\u0000\u0000\u00b1\u0017\u0001\u0000\u0000\u0000\u00b2"+ + "\u00b3\u0007\u000f\u0000\u0000\u00b3\u00b4\u0007\u0000\u0000\u0000\u00b4"+ + "\u00b5\u0007\u000e\u0000\u0000\u00b5\u00b6\u0007\u0005\u0000\u0000\u00b6"+ + "\u00b7\u0007\u0006\u0000\u0000\u00b7\u0019\u0001\u0000\u0000\u0000\u00b8"+ + "\u00b9\u0007\t\u0000\u0000\u00b9\u00ba\u0007\u0007\u0000\u0000\u00ba\u00bb"+ + "\u0007\u0001\u0000\u0000\u00bb\u00bc\u0007\u0004\u0000\u0000\u00bc\u00bd"+ + "\u0007\u0000\u0000\u0000\u00bd\u00be\u0007\u0005\u0000\u0000\u00be\u00bf"+ + "\u0007\u0006\u0000\u0000\u00bf\u001b\u0001\u0000\u0000\u0000\u00c0\u00c1"+ + "\u0005,\u0000\u0000\u00c1\u001d\u0001\u0000\u0000\u0000\u00c2\u00c3\u0005"+ + "(\u0000\u0000\u00c3\u001f\u0001\u0000\u0000\u0000\u00c4\u00c5\u0005)\u0000"+ + "\u0000\u00c5!\u0001\u0000\u0000\u0000\u00c6\u00c7\u0005[\u0000\u0000\u00c7"+ + "#\u0001\u0000\u0000\u0000\u00c8\u00c9\u0005]\u0000\u0000\u00c9%\u0001"+ + "\u0000\u0000\u0000\u00ca\u00cb\u0005{\u0000\u0000\u00cb\'\u0001\u0000"+ + "\u0000\u0000\u00cc\u00cd\u0005}\u0000\u0000\u00cd)\u0001\u0000\u0000\u0000"+ + "\u00ce\u00cf\u0003H#\u0000\u00cf+\u0001\u0000\u0000\u0000\u00d0\u00d1"+ + "\u0003V*\u0000\u00d1-\u0001\u0000\u0000\u0000\u00d2\u00d3\u0005$\u0000"+ + "\u0000\u00d3/\u0001\u0000\u0000\u0000\u00d4\u00d5\u0005\\\u0000\u0000"+ + "\u00d51\u0001\u0000\u0000\u0000\u00d6\u00d7\u0005:\u0000\u0000\u00d7\u00d8"+ + "\u0005:\u0000\u0000\u00d83\u0001\u0000\u0000\u0000\u00d9\u00da\u0005="+ + "\u0000\u0000\u00da\u00db\u0005>\u0000\u0000\u00db5\u0001\u0000\u0000\u0000"+ + "\u00dc\u00dd\u0005-\u0000\u0000\u00dd\u00de\u0005>\u0000\u0000\u00de7"+ + "\u0001\u0000\u0000\u0000\u00df\u00e0\u0005;\u0000\u0000\u00e09\u0001\u0000"+ + "\u0000\u0000\u00e1\u00e2\u0005=\u0000\u0000\u00e2\u00e7\u0005=\u0000\u0000"+ + "\u00e3\u00e4\u0005!\u0000\u0000\u00e4\u00e7\u0005=\u0000\u0000\u00e5\u00e7"+ + "\u0007\u0011\u0000\u0000\u00e6\u00e1\u0001\u0000\u0000\u0000\u00e6\u00e3"+ + "\u0001\u0000\u0000\u0000\u00e6\u00e5\u0001\u0000\u0000\u0000\u00e7\u00e9"+ + "\u0001\u0000\u0000\u0000\u00e8\u00ea\u0005=\u0000\u0000\u00e9\u00e8\u0001"+ + "\u0000\u0000\u0000\u00e9\u00ea\u0001\u0000\u0000\u0000\u00ea;\u0001\u0000"+ + "\u0000\u0000\u00eb\u00ec\u0005&\u0000\u0000\u00ec\u00f0\u0005&\u0000\u0000"+ + "\u00ed\u00ee\u0005|\u0000\u0000\u00ee\u00f0\u0005|\u0000\u0000\u00ef\u00eb"+ + "\u0001\u0000\u0000\u0000\u00ef\u00ed\u0001\u0000\u0000\u0000\u00f0=\u0001"+ + "\u0000\u0000\u0000\u00f1\u00f2\u0003R(\u0000\u00f2?\u0001\u0000\u0000"+ + "\u0000\u00f3\u00f4\u0005/\u0000\u0000\u00f4\u00f5\u0005*\u0000\u0000\u00f5"+ + "\u00f9\u0001\u0000\u0000\u0000\u00f6\u00f8\t\u0000\u0000\u0000\u00f7\u00f6"+ + "\u0001\u0000\u0000\u0000\u00f8\u00fb\u0001\u0000\u0000\u0000\u00f9\u00fa"+ + "\u0001\u0000\u0000\u0000\u00f9\u00f7\u0001\u0000\u0000\u0000\u00fa\u00fc"+ + "\u0001\u0000\u0000\u0000\u00fb\u00f9\u0001\u0000\u0000\u0000\u00fc\u00fd"+ + "\u0005*\u0000\u0000\u00fd\u00fe\u0005/\u0000\u0000\u00fe\u0102\u0001\u0000"+ + "\u0000\u0000\u00ff\u0101\u0007\u0012\u0000\u0000\u0100\u00ff\u0001\u0000"+ + "\u0000\u0000\u0101\u0104\u0001\u0000\u0000\u0000\u0102\u0100\u0001\u0000"+ + "\u0000\u0000\u0102\u0103\u0001\u0000\u0000\u0000\u0103\u0105\u0001\u0000"+ + "\u0000\u0000\u0104\u0102\u0001\u0000\u0000\u0000\u0105\u0106\u0006\u001f"+ + "\u0000\u0000\u0106A\u0001\u0000\u0000\u0000\u0107\u0109\u0005 \u0000\u0000"+ + "\u0108\u0107\u0001\u0000\u0000\u0000\u0109\u010a\u0001\u0000\u0000\u0000"+ + "\u010a\u0108\u0001\u0000\u0000\u0000\u010a\u010b\u0001\u0000\u0000\u0000"+ + "\u010b\u0112\u0001\u0000\u0000\u0000\u010c\u010e\u0007\u0012\u0000\u0000"+ + "\u010d\u010c\u0001\u0000\u0000\u0000\u010e\u010f\u0001\u0000\u0000\u0000"+ + "\u010f\u010d\u0001\u0000\u0000\u0000\u010f\u0110\u0001\u0000\u0000\u0000"+ + "\u0110\u0112\u0001\u0000\u0000\u0000\u0111\u0108\u0001\u0000\u0000\u0000"+ + "\u0111\u010d\u0001\u0000\u0000\u0000\u0112\u0113\u0001\u0000\u0000\u0000"+ + "\u0113\u0114\u0006 \u0000\u0000\u0114C\u0001\u0000\u0000\u0000\u0115\u0116"+ + "\u0005@\u0000\u0000\u0116\u0117\u0007\u0010\u0000\u0000\u0117\u0118\u0007"+ + "\u0006\u0000\u0000\u0118\u0121\u0007\u0010\u0000\u0000\u0119\u011a\u0005"+ + "@\u0000\u0000\u011a\u011b\u0007\u0004\u0000\u0000\u011b\u011c\u0007\u000b"+ + "\u0000\u0000\u011c\u011d\u0007\u0013\u0000\u0000\u011d\u011e\u0007\u0010"+ + "\u0000\u0000\u011e\u011f\u0007\u0006\u0000\u0000\u011f\u0121\u0007\u0010"+ + "\u0000\u0000\u0120\u0115\u0001\u0000\u0000\u0000\u0120\u0119\u0001\u0000"+ + "\u0000\u0000\u0121\u0122\u0001\u0000\u0000\u0000\u0122\u0123\u0006!\u0000"+ + "\u0000\u0123E\u0001\u0000\u0000\u0000\u0124\u0125\t\u0000\u0000\u0000"+ + "\u0125\u0126\u0001\u0000\u0000\u0000\u0126\u0127\u0006\"\u0000\u0000\u0127"+ + "G\u0001\u0000\u0000\u0000\u0128\u012c\u0007\u0014\u0000\u0000\u0129\u012b"+ + "\u0007\u0015\u0000\u0000\u012a\u0129\u0001\u0000\u0000\u0000\u012b\u012e"+ + "\u0001\u0000\u0000\u0000\u012c\u012a\u0001\u0000\u0000\u0000\u012c\u012d"+ + "\u0001\u0000\u0000\u0000\u012dI\u0001\u0000\u0000\u0000\u012e\u012c\u0001"+ + "\u0000\u0000\u0000\u012f\u0133\u0007\u0014\u0000\u0000\u0130\u0132\u0007"+ + "\u0016\u0000\u0000\u0131\u0130\u0001\u0000\u0000\u0000\u0132\u0135\u0001"+ + "\u0000\u0000\u0000\u0133\u0131\u0001\u0000\u0000\u0000\u0133\u0134\u0001"+ + "\u0000\u0000\u0000\u0134K\u0001\u0000\u0000\u0000\u0135\u0133\u0001\u0000"+ + "\u0000\u0000\u0136\u0137\u0007\u0017\u0000\u0000\u0137M\u0001\u0000\u0000"+ + "\u0000\u0138\u013d\u0005\"\u0000\u0000\u0139\u013c\u0003L%\u0000\u013a"+ + "\u013c\t\u0000\u0000\u0000\u013b\u0139\u0001\u0000\u0000\u0000\u013b\u013a"+ + "\u0001\u0000\u0000\u0000\u013c\u013f\u0001\u0000\u0000\u0000\u013d\u013e"+ + "\u0001\u0000\u0000\u0000\u013d\u013b\u0001\u0000\u0000\u0000\u013e\u0140"+ + "\u0001\u0000\u0000\u0000\u013f\u013d\u0001\u0000\u0000\u0000\u0140\u0141"+ + "\u0005\"\u0000\u0000\u0141O\u0001\u0000\u0000\u0000\u0142\u0148\u0005"+ + "\'\u0000\u0000\u0143\u0147\b\u0018\u0000\u0000\u0144\u0145\u0005\\\u0000"+ + "\u0000\u0145\u0147\t\u0000\u0000\u0000\u0146\u0143\u0001\u0000\u0000\u0000"+ + "\u0146\u0144\u0001\u0000\u0000\u0000\u0147\u014a\u0001\u0000\u0000\u0000"+ + "\u0148\u0146\u0001\u0000\u0000\u0000\u0148\u0149\u0001\u0000\u0000\u0000"+ + "\u0149\u014b\u0001\u0000\u0000\u0000\u014a\u0148\u0001\u0000\u0000\u0000"+ + "\u014b\u014c\u0005\'\u0000\u0000\u014cQ\u0001\u0000\u0000\u0000\u014d"+ + "\u0150\u0003N&\u0000\u014e\u0150\u0003P\'\u0000\u014f\u014d\u0001\u0000"+ + "\u0000\u0000\u014f\u014e\u0001\u0000\u0000\u0000\u0150S\u0001\u0000\u0000"+ + "\u0000\u0151\u0152\u0005/\u0000\u0000\u0152\u0153\u0005/\u0000\u0000\u0153"+ + "\u0157\u0001\u0000\u0000\u0000\u0154\u0156\b\u0012\u0000\u0000\u0155\u0154"+ + "\u0001\u0000\u0000\u0000\u0156\u0159\u0001\u0000\u0000\u0000\u0157\u0155"+ + "\u0001\u0000\u0000\u0000\u0157\u0158\u0001\u0000\u0000\u0000\u0158U\u0001"+ + "\u0000\u0000\u0000\u0159\u0157\u0001\u0000\u0000\u0000\u015a\u015b\u0005"+ + "$\u0000\u0000\u015b\u015c\u0003H#\u0000\u015cW\u0001\u0000\u0000\u0000"+ + "\u015d\u015e\u000209\u0000\u015eY\u0001\u0000\u0000\u0000\u015f\u0160"+ + "\u0005{\u0000\u0000\u0160\u0161\u0005{\u0000\u0000\u0161\u0162\u0005-"+ + "\u0000\u0000\u0162\u0163\u0005-\u0000\u0000\u0163\u0164\u0001\u0000\u0000"+ + "\u0000\u0164\u0165\u0006,\u0001\u0000\u0165\u0166\u0006,\u0000\u0000\u0166"+ + "[\u0001\u0000\u0000\u0000\u0167\u0168\u0005@\u0000\u0000\u0168\u0169\u0003"+ + "H#\u0000\u0169\u016a\u0005.\u0000\u0000\u016a\u016b\u0001\u0000\u0000"+ + "\u0000\u016b\u016c\u0006-\u0000\u0000\u016c]\u0001\u0000\u0000\u0000\u016d"+ + "\u0172\u0005@\u0000\u0000\u016e\u0170\u0003X+\u0000\u016f\u0171\u0005"+ + ".\u0000\u0000\u0170\u016f\u0001\u0000\u0000\u0000\u0170\u0171\u0001\u0000"+ + "\u0000\u0000\u0171\u0173\u0001\u0000\u0000\u0000\u0172\u016e\u0001\u0000"+ + "\u0000\u0000\u0173\u0174\u0001\u0000\u0000\u0000\u0174\u0172\u0001\u0000"+ + "\u0000\u0000\u0174\u0175\u0001\u0000\u0000\u0000\u0175\u0176\u0001\u0000"+ + "\u0000\u0000\u0176\u0177\u0006.\u0000\u0000\u0177_\u0001\u0000\u0000\u0000"+ + "\u0178\u0179\u0005{\u0000\u0000\u0179\u017a\u0005{\u0000\u0000\u017a\u02ae"+ + "\u0005{\u0000\u0000\u017b\u017c\u0005@\u0000\u0000\u017c\u017d\u0005@"+ + "\u0000\u0000\u017d\u017f\u0001\u0000\u0000\u0000\u017e\u0180\u0005@\u0000"+ + "\u0000\u017f\u017e\u0001\u0000\u0000\u0000\u017f\u0180\u0001\u0000\u0000"+ + "\u0000\u0180\u02ae\u0001\u0000\u0000\u0000\u0181\u0182\u0005@\u0000\u0000"+ + "\u0182\u0183\u0005{\u0000\u0000\u0183\u0185\u0001\u0000\u0000\u0000\u0184"+ + "\u0186\u0005{\u0000\u0000\u0185\u0184\u0001\u0000\u0000\u0000\u0185\u0186"+ + "\u0001\u0000\u0000\u0000\u0186\u02ae\u0001\u0000\u0000\u0000\u0187\u0188"+ + "\u0005@\u0000\u0000\u0188\u0189\u0007\u000f\u0000\u0000\u0189\u018a\u0007"+ + "\u0004\u0000\u0000\u018a\u018b\u0007\u0013\u0000\u0000\u018b\u018c\u0007"+ + "\b\u0000\u0000\u018c\u018d\u0007\u0000\u0000\u0000\u018d\u018f\u0001\u0000"+ + "\u0000\u0000\u018e\u0190\u0007\u0019\u0000\u0000\u018f\u018e\u0001\u0000"+ + "\u0000\u0000\u0190\u0191\u0001\u0000\u0000\u0000\u0191\u018f\u0001\u0000"+ + "\u0000\u0000\u0191\u0192\u0001\u0000\u0000\u0000\u0192\u01a4\u0001\u0000"+ + "\u0000\u0000\u0193\u0194\u0007\u0003\u0000\u0000\u0194\u0195\u0007\u0005"+ + "\u0000\u0000\u0195\u0196\u0007\u0001\u0000\u0000\u0196\u0197\u0007\u0004"+ + "\u0000\u0000\u0197\u0198\u0007\u0004\u0000\u0000\u0198\u0199\u0007\u000b"+ + "\u0000\u0000\u0199\u019b\u0001\u0000\u0000\u0000\u019a\u019c\u0007\u0019"+ + "\u0000\u0000\u019b\u019a\u0001\u0000\u0000\u0000\u019c\u019d\u0001\u0000"+ + "\u0000\u0000\u019d\u019b\u0001\u0000\u0000\u0000\u019d\u019e\u0001\u0000"+ + "\u0000\u0000\u019e\u01a2\u0001\u0000\u0000\u0000\u019f\u01a0\u0007\u0000"+ + "\u0000\u0000\u01a0\u01a1\u0007\u000b\u0000\u0000\u01a1\u01a3\u0007\u0013"+ + "\u0000\u0000\u01a2\u019f\u0001\u0000\u0000\u0000\u01a2\u01a3\u0001\u0000"+ + "\u0000\u0000\u01a3\u01a5\u0001\u0000\u0000\u0000\u01a4\u0193\u0001\u0000"+ + "\u0000\u0000\u01a4\u01a5\u0001\u0000\u0000\u0000\u01a5\u02ae\u0001\u0000"+ + "\u0000\u0000\u01a6\u01a7\u0005@\u0000\u0000\u01a7\u01a8\u0007\u0005\u0000"+ + "\u0000\u01a8\u01a9\u0007\u0006\u0000\u0000\u01a9\u01aa\u0007\u0000\u0000"+ + "\u0000\u01aa\u01ab\u0007\u0001\u0000\u0000\u01ab\u01ac\u0007\u0003\u0000"+ + "\u0000\u01ac\u01ad\u0007\u0004\u0000\u0000\u01ad\u02a6\u0007\u000e\u0000"+ + "\u0000\u01ae\u01af\u0005@\u0000\u0000\u01af\u01b0\u0007\b\u0000\u0000"+ + "\u01b0\u01b1\u0007\u000f\u0000\u0000\u01b1\u01b2\u0007\u0010\u0000\u0000"+ + "\u01b2\u01b3\u0007\u0007\u0000\u0000\u01b3\u01b4\u0007\u0001\u0000\u0000"+ + "\u01b4\u02a6\u0007\u000e\u0000\u0000\u01b5\u01b6\u0005@\u0000\u0000\u01b6"+ + "\u01b7\u0007\u000b\u0000\u0000\u01b7\u01b8\u0007\u0000\u0000\u0000\u01b8"+ + "\u01b9\u0007\u000f\u0000\u0000\u01b9\u01ba\u0007\u0004\u0000\u0000\u01ba"+ + "\u01bb\u0007\u0003\u0000\u0000\u01bb\u01bc\u0007\u0010\u0000\u0000\u01bc"+ + "\u01bd\u0007\u0000\u0000\u0000\u01bd\u01be\u0007\u0005\u0000\u0000\u01be"+ + "\u02a6\u0007\u0004\u0000\u0000\u01bf\u01c0\u0005@\u0000\u0000\u01c0\u01c1"+ + "\u0007\u0013\u0000\u0000\u01c1\u01c2\u0007\u0007\u0000\u0000\u01c2\u01c3"+ + "\u0007\u0005\u0000\u0000\u01c3\u01c4\u0007\r\u0000\u0000\u01c4\u01c5\u0007"+ + "\u000f\u0000\u0000\u01c5\u01c6\u0007\u0004\u0000\u0000\u01c6\u01c7\u0007"+ + "\u000b\u0000\u0000\u01c7\u02a6\u0007\u000e\u0000\u0000\u01c8\u01c9\u0005"+ + "@\u0000\u0000\u01c9\u01ca\u0007\t\u0000\u0000\u01ca\u01cb\u0007\u0007"+ + "\u0000\u0000\u01cb\u01cc\u0007\u000b\u0000\u0000\u01cc\u01cd\u0007\u000e"+ + "\u0000\u0000\u01cd\u01ce\u0005-\u0000\u0000\u01ce\u01cf\u0007\t\u0000"+ + "\u0000\u01cf\u01d0\u0007\u0000\u0000\u0000\u01d0\u01d1\u0007\u0005\u0000"+ + "\u0000\u01d1\u02a6\u0007\u0004\u0000\u0000\u01d2\u01d3\u0005@\u0000\u0000"+ + "\u01d3\u01d4\u0007\u0010\u0000\u0000\u01d4\u01d5\u0007\u0000\u0000\u0000"+ + "\u01d5\u01d6\u0007\u001a\u0000\u0000\u01d6\u02a6\u0007\u0004\u0000\u0000"+ + "\u01d7\u01d8\u0005@\u0000\u0000\u01d8\u01d9\u0007\n\u0000\u0000\u01d9"+ + "\u01da\u0007\u0000\u0000\u0000\u01da\u01db\u0007\u0002\u0000\u0000\u01db"+ + "\u01dc\u0007\u0004\u0000\u0000\u01dc\u02a6\u0007\u0001\u0000\u0000\u01dd"+ + "\u01de\u0005@\u0000\u0000\u01de\u01df\u0007\u0003\u0000\u0000\u01df\u01e0"+ + "\u0007\r\u0000\u0000\u01e0\u01e1\u0007\u0010\u0000\u0000\u01e1\u01e2\u0007"+ + "\u0010\u0000\u0000\u01e2\u01e3\u0007\u0007\u0000\u0000\u01e3\u01e4\u0007"+ + "\u0001\u0000\u0000\u01e4\u01e5\u0007\u000e\u0000\u0000\u01e5\u02a6\u0007"+ + "\u0003\u0000\u0000\u01e6\u01e7\u0005@\u0000\u0000\u01e7\u01e8\u0007\u000e"+ + "\u0000\u0000\u01e8\u01e9\u0007\u0000\u0000\u0000\u01e9\u01ea\u0007\b\u0000"+ + "\u0000\u01ea\u01eb\u0007\n\u0000\u0000\u01eb\u01ec\u0007\f\u0000\u0000"+ + "\u01ec\u01ed\u0007\b\u0000\u0000\u01ed\u01ee\u0007\u000b\u0000\u0000\u01ee"+ + "\u02a6\u0007\u0013\u0000\u0000\u01ef\u01f0\u0005@\u0000\u0000\u01f0\u01f1"+ + "\u0007\u0000\u0000\u0000\u01f1\u01f2\u0007\u0010\u0000\u0000\u01f2\u01f3"+ + "\u0007\u0010\u0000\u0000\u01f3\u01f4\u0007\n\u0000\u0000\u01f4\u02a6\u0007"+ + "\u0002\u0000\u0000\u01f5\u01f6\u0005@\u0000\u0000\u01f6\u01f7\u0005-\u0000"+ + "\u0000\u01f7\u01f8\u0007\f\u0000\u0000\u01f8\u01f9\u0007\u0004\u0000\u0000"+ + "\u01f9\u01fa\u0007\u001b\u0000\u0000\u01fa\u01fb\u0007\u001c\u0000\u0000"+ + "\u01fb\u01fc\u0007\b\u0000\u0000\u01fc\u01fd\u0007\u000e\u0000\u0000\u01fd"+ + "\u01fe\u0005-\u0000\u0000\u01fe\u01ff\u0007\u001c\u0000\u0000\u01ff\u0200"+ + "\u0007\u0004\u0000\u0000\u0200\u0201\u0007\u0002\u0000\u0000\u0201\u0202"+ + "\u0007\t\u0000\u0000\u0202\u0203\u0007\u0001\u0000\u0000\u0203\u0204\u0007"+ + "\u0000\u0000\u0000\u0204\u0205\u0007\u000f\u0000\u0000\u0205\u0206\u0007"+ + "\u0004\u0000\u0000\u0206\u02a6\u0007\u0003\u0000\u0000\u0207\u0208\u0005"+ + "@\u0000\u0000\u0208\u0209\u0007\u001c\u0000\u0000\u0209\u020a\u0007\u0004"+ + "\u0000\u0000\u020a\u020b\u0007\u0002\u0000\u0000\u020b\u020c\u0007\t\u0000"+ + "\u0000\u020c\u020d\u0007\u0001\u0000\u0000\u020d\u020e\u0007\u0000\u0000"+ + "\u0000\u020e\u020f\u0007\u000f\u0000\u0000\u020f\u0210\u0007\u0004\u0000"+ + "\u0000\u0210\u02a6\u0007\u0003\u0000\u0000\u0211\u0212\u0005@\u0000\u0000"+ + "\u0212\u0213\u0007\u0005\u0000\u0000\u0213\u0214\u0007\u0007\u0000\u0000"+ + "\u0214\u0215\u0007\r\u0000\u0000\u0215\u0216\u0007\u000b\u0000\u0000\u0216"+ + "\u0217\u0007\u000e\u0000\u0000\u0217\u0218\u0007\u0004\u0000\u0000\u0218"+ + "\u0219\u0007\u0001\u0000\u0000\u0219\u021a\u0005-\u0000\u0000\u021a\u021b"+ + "\u0007\u0003\u0000\u0000\u021b\u021c\u0007\u000e\u0000\u0000\u021c\u021d"+ + "\u0007\u0002\u0000\u0000\u021d\u021e\u0007\n\u0000\u0000\u021e\u02a6\u0007"+ + "\u0004\u0000\u0000\u021f\u0220\u0005@\u0000\u0000\u0220\u0221\u0007\t"+ + "\u0000\u0000\u0221\u0222\u0007\u0007\u0000\u0000\u0222\u0223\u0007\u000b"+ + "\u0000\u0000\u0223\u0224\u0007\u000e\u0000\u0000\u0224\u0225\u0005-\u0000"+ + "\u0000\u0225\u0226\u0007\t\u0000\u0000\u0226\u0227\u0007\u0004\u0000\u0000"+ + "\u0227\u0228\u0007\u0000\u0000\u0000\u0228\u0229\u0007\u000e\u0000\u0000"+ + "\u0229\u022a\u0007\r\u0000\u0000\u022a\u022b\u0007\u0001\u0000\u0000\u022b"+ + "\u022c\u0007\u0004\u0000\u0000\u022c\u022d\u0005-\u0000\u0000\u022d\u022e"+ + "\u0007\u001d\u0000\u0000\u022e\u022f\u0007\u0000\u0000\u0000\u022f\u0230"+ + "\u0007\n\u0000\u0000\u0230\u0231\u0007\r\u0000\u0000\u0231\u0232\u0007"+ + "\u0004\u0000\u0000\u0232\u02a6\u0007\u0003\u0000\u0000\u0233\u0234\u0005"+ + "@\u0000\u0000\u0234\u0235\u0007\u0010\u0000\u0000\u0235\u0236\u0007\u0001"+ + "\u0000\u0000\u0236\u0237\u0007\u0007\u0000\u0000\u0237\u0238\u0007\u0010"+ + "\u0000\u0000\u0238\u0239\u0007\u0004\u0000\u0000\u0239\u023a\u0007\u0001"+ + "\u0000\u0000\u023a\u023b\u0007\u000e\u0000\u0000\u023b\u02a6\u0007\u0002"+ + "\u0000\u0000\u023c\u023d\u0005@\u0000\u0000\u023d\u023e\u0007\u0003\u0000"+ + "\u0000\u023e\u023f\u0007\u0005\u0000\u0000\u023f\u0240\u0007\u0007\u0000"+ + "\u0000\u0240\u0241\u0007\u0010\u0000\u0000\u0241\u02a6\u0007\u0004\u0000"+ + "\u0000\u0242\u0243\u0005@\u0000\u0000\u0243\u0244\u0007\u0003\u0000\u0000"+ + "\u0244\u0245\u0007\u000e\u0000\u0000\u0245\u0246\u0007\u0000\u0000\u0000"+ + "\u0246\u0247\u0007\u0001\u0000\u0000\u0247\u0248\u0007\u000e\u0000\u0000"+ + "\u0248\u0249\u0007\b\u0000\u0000\u0249\u024a\u0007\u000b\u0000\u0000\u024a"+ + "\u024b\u0007\u001a\u0000\u0000\u024b\u024c\u0005-\u0000\u0000\u024c\u024d"+ + "\u0007\u0003\u0000\u0000\u024d\u024e\u0007\u000e\u0000\u0000\u024e\u024f"+ + "\u0007\u0002\u0000\u0000\u024f\u0250\u0007\n\u0000\u0000\u0250\u02a6\u0007"+ + "\u0004\u0000\u0000\u0251\u0252\u0005@\u0000\u0000\u0252\u0253\u0007\u0003"+ + "\u0000\u0000\u0253\u0254\u0007\r\u0000\u0000\u0254\u0255\u0007\u0010\u0000"+ + "\u0000\u0255\u0256\u0007\u0010\u0000\u0000\u0256\u0257\u0007\u0007\u0000"+ + "\u0000\u0257\u0258\u0007\u0001\u0000\u0000\u0258\u0259\u0007\u000e\u0000"+ + "\u0000\u0259\u02a6\u0007\u0003\u0000\u0000\u025a\u025b\u0005@\u0000\u0000"+ + "\u025b\u025c\u0007\u001d\u0000\u0000\u025c\u025d\u0007\b\u0000\u0000\u025d"+ + "\u025e\u0007\u0004\u0000\u0000\u025e\u025f\u0007\f\u0000\u0000\u025f\u0260"+ + "\u0005-\u0000\u0000\u0260\u0261\u0007\u000e\u0000\u0000\u0261\u0262\u0007"+ + "\u0001\u0000\u0000\u0262\u0263\u0007\u0000\u0000\u0000\u0263\u0264\u0007"+ + "\u000b\u0000\u0000\u0264\u0265\u0007\u0003\u0000\u0000\u0265\u0266\u0007"+ + "\b\u0000\u0000\u0266\u0267\u0007\u000e\u0000\u0000\u0267\u0268\u0007\b"+ + "\u0000\u0000\u0268\u0269\u0007\u0007\u0000\u0000\u0269\u02a6\u0007\u000b"+ + "\u0000\u0000\u026a\u026b\u0005@\u0000\u0000\u026b\u026c\u0007\u0005\u0000"+ + "\u0000\u026c\u026d\u0007\u0007\u0000\u0000\u026d\u026e\u0007\u000b\u0000"+ + "\u0000\u026e\u026f\u0007\u000e\u0000\u0000\u026f\u0270\u0007\u0000\u0000"+ + "\u0000\u0270\u0271\u0007\b\u0000\u0000\u0271\u0272\u0007\u000b\u0000\u0000"+ + "\u0272\u0273\u0007\u0004\u0000\u0000\u0273\u02a6\u0007\u0001\u0000\u0000"+ + "\u0274\u0275\u0005@\u0000\u0000\u0275\u0276\u0007\u0005\u0000\u0000\u0276"+ + "\u0277\u0007\u0007\u0000\u0000\u0277\u0278\u0007\n\u0000\u0000\u0278\u0279"+ + "\u0007\u0007\u0000\u0000\u0279\u027a\u0007\u0001\u0000\u0000\u027a\u027b"+ + "\u0005-\u0000\u0000\u027b\u027c\u0007\u0010\u0000\u0000\u027c\u027d\u0007"+ + "\u0001\u0000\u0000\u027d\u027e\u0007\u0007\u0000\u0000\u027e\u027f\u0007"+ + "\t\u0000\u0000\u027f\u0280\u0007\b\u0000\u0000\u0280\u0281\u0007\n\u0000"+ + "\u0000\u0281\u02a6\u0007\u0004\u0000\u0000\u0282\u0283\u0005@\u0000\u0000"+ + "\u0283\u0284\u0007\u0003\u0000\u0000\u0284\u0285\u0007\u000e\u0000\u0000"+ + "\u0285\u0286\u0007\u0002\u0000\u0000\u0286\u0287\u0007\n\u0000\u0000\u0287"+ + "\u0288\u0007\u0004\u0000\u0000\u0288\u0289\u0007\u0003\u0000\u0000\u0289"+ + "\u028a\u0007\u0004\u0000\u0000\u028a\u02a6\u0007\u000e\u0000\u0000\u028b"+ + "\u028c\u0005@\u0000\u0000\u028c\u028d\u0007\t\u0000\u0000\u028d\u028e"+ + "\u0007\u0007\u0000\u0000\u028e\u028f\u0007\u000b\u0000\u0000\u028f\u0290"+ + "\u0007\u000e\u0000\u0000\u0290\u0291\u0005-\u0000\u0000\u0291\u0292\u0007"+ + "\u0010\u0000\u0000\u0292\u0293\u0007\u0000\u0000\u0000\u0293\u0294\u0007"+ + "\n\u0000\u0000\u0294\u0295\u0007\u0004\u0000\u0000\u0295\u0296\u0007\u000e"+ + "\u0000\u0000\u0296\u0297\u0007\u000e\u0000\u0000\u0297\u0298\u0007\u0004"+ + "\u0000\u0000\u0298\u0299\u0005-\u0000\u0000\u0299\u029a\u0007\u001d\u0000"+ + "\u0000\u029a\u029b\u0007\u0000\u0000\u0000\u029b\u029c\u0007\n\u0000\u0000"+ + "\u029c\u029d\u0007\r\u0000\u0000\u029d\u029e\u0007\u0004\u0000\u0000\u029e"+ + "\u02a6\u0007\u0003\u0000\u0000\u029f\u02a0\u0005@\u0000\u0000\u02a0\u02a1"+ + "\u0007\u000f\u0000\u0000\u02a1\u02a2\u0007\u0004\u0000\u0000\u02a2\u02a3"+ + "\u0007\u0013\u0000\u0000\u02a3\u02a4\u0007\b\u0000\u0000\u02a4\u02a6\u0007"+ + "\u0000\u0000\u0000\u02a5\u01a6\u0001\u0000\u0000\u0000\u02a5\u01ae\u0001"+ + "\u0000\u0000\u0000\u02a5\u01b5\u0001\u0000\u0000\u0000\u02a5\u01bf\u0001"+ + "\u0000\u0000\u0000\u02a5\u01c8\u0001\u0000\u0000\u0000\u02a5\u01d2\u0001"+ + "\u0000\u0000\u0000\u02a5\u01d7\u0001\u0000\u0000\u0000\u02a5\u01dd\u0001"+ + "\u0000\u0000\u0000\u02a5\u01e6\u0001\u0000\u0000\u0000\u02a5\u01ef\u0001"+ + "\u0000\u0000\u0000\u02a5\u01f5\u0001\u0000\u0000\u0000\u02a5\u0207\u0001"+ + "\u0000\u0000\u0000\u02a5\u0211\u0001\u0000\u0000\u0000\u02a5\u021f\u0001"+ + "\u0000\u0000\u0000\u02a5\u0233\u0001\u0000\u0000\u0000\u02a5\u023c\u0001"+ + "\u0000\u0000\u0000\u02a5\u0242\u0001\u0000\u0000\u0000\u02a5\u0251\u0001"+ + "\u0000\u0000\u0000\u02a5\u025a\u0001\u0000\u0000\u0000\u02a5\u026a\u0001"+ + "\u0000\u0000\u0000\u02a5\u0274\u0001\u0000\u0000\u0000\u02a5\u0282\u0001"+ + "\u0000\u0000\u0000\u02a5\u028b\u0001\u0000\u0000\u0000\u02a5\u029f\u0001"+ + "\u0000\u0000\u0000\u02a6\u02aa\u0001\u0000\u0000\u0000\u02a7\u02a9\u0007"+ + "\u0019\u0000\u0000\u02a8\u02a7\u0001\u0000\u0000\u0000\u02a9\u02ac\u0001"+ + "\u0000\u0000\u0000\u02aa\u02a8\u0001\u0000\u0000\u0000\u02aa\u02ab\u0001"+ + "\u0000\u0000\u0000\u02ab\u02ae\u0001\u0000\u0000\u0000\u02ac\u02aa\u0001"+ + "\u0000\u0000\u0000\u02ad\u0178\u0001\u0000\u0000\u0000\u02ad\u017b\u0001"+ + "\u0000\u0000\u0000\u02ad\u0181\u0001\u0000\u0000\u0000\u02ad\u0187\u0001"+ + "\u0000\u0000\u0000\u02ad\u02a5\u0001\u0000\u0000\u0000\u02ae\u02af\u0001"+ + "\u0000\u0000\u0000\u02af\u02b0\u0006/\u0002\u0000\u02b0a\u0001\u0000\u0000"+ + "\u0000\u02b1\u02b2\u0005-\u0000\u0000\u02b2\u02b3\u0005-\u0000\u0000\u02b3"+ + "\u02b4\u0005}\u0000\u0000\u02b4\u02b5\u0005}\u0000\u0000\u02b5\u02b6\u0001"+ + "\u0000\u0000\u0000\u02b6\u02b7\u00060\u0003\u0000\u02b7\u02b8\u00060\u0000"+ + "\u0000\u02b8c\u0001\u0000\u0000\u0000\u02b9\u02ba\t\u0000\u0000\u0000"+ + "\u02ba\u02bb\u00041\u0000\u0000\u02bb\u02bc\u0001\u0000\u0000\u0000\u02bc"+ + "\u02bd\u00061\u0000\u0000\u02bde\u0001\u0000\u0000\u0000\u02be\u02bf\t"+ + "\u0000\u0000\u0000\u02bf\u02c0\u0001\u0000\u0000\u0000\u02c0\u02c1\u0006"+ + "2\u0000\u0000\u02c1g\u0001\u0000\u0000\u0000\u02c2\u02c3\u0005\u0000\u0000"+ + "\u0001\u02c3\u02c4\u0001\u0000\u0000\u0000\u02c4\u02c5\u00063\u0003\u0000"+ + "\u02c5\u02c6\u00063\u0000\u0000\u02c6i\u0001\u0000\u0000\u0000 \u0000"+ + "\u0001\u008c\u00b0\u00e6\u00e9\u00ef\u00f9\u0102\u010a\u010f\u0111\u0120"+ + "\u012c\u0133\u013b\u013d\u0146\u0148\u014f\u0157\u0170\u0174\u017f\u0185"+ + "\u0191\u019d\u01a2\u01a4\u02a5\u02aa\u02ad\u0004\u0006\u0000\u0000\u0005"+ + "\u0001\u0000\u0007\u0001\u0000\u0004\u0000\u0000"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.g4 new file mode 100644 index 000000000000..a4617a63fcfd --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.g4 @@ -0,0 +1,211 @@ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +parser grammar BladePhpAntlrParser; + +@header{ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + package org.netbeans.modules.php.blade.syntax.antlr4.php; +} + +options { + superClass = ParserAdaptor; + tokenVocab = BladePhpAntlrLexer; + } + +expression : exprStatement* EOF; + +exprStatement : + //empty statement + ';' + | '{' exprStatement* '}' + | '(' exprStatement* ')' + | COMPARISON_OPERATOR exprStatement + | LOGICAL_UNION_OPERATOR functionalExpr+ + | 'foreach' '(' foreachArguments ')' + | functionalExpr + | ifStatement + | foreachDirectiveStatement + | output + | misc +; + +logicalStatement: + '(' functionalExpr* ')' + | functionalExpr (LOGICAL_UNION_OPERATOR functionalExpr)+ + | functionalExpr (COMPARISON_OPERATOR functionalExpr)+ + | functionalExpr +; + +ifStatement: + //long expr + 'if' '(' logicalStatement+ ')' '{' exprStatement* '}' + (ELSEIF '(' logicalStatement+ ')' '{' exprStatement* '}' )* + ('else' '{' exprStatement* '}')? + ; + +inputExpr: + varExpr + ; + +functionalExpr: + matchStatement + | classExpression (classMember)* + | functionExpr + | LANG_CONSTRUCT '(' functionalExpr ')' + | inputExpr + ; + +classExpression: + classInstanceStatement + | staticMethodAccess + | staticFieldAccess + | staticClassReference + | staticAccess + | aliasDirectAccess + | directMethodAccess + ; + +foreachDirectiveStatement: + {this.bladeParserContext.equals(ParserContext.FOREACH)}? foreachArguments + ; + +foreachArguments: + (array | main_array = PHP_VARIABLE) 'as' array_item=PHP_VARIABLE + | (array | main_array = PHP_VARIABLE) 'as' array_key=PHP_VARIABLE '=>' array_item=PHP_VARIABLE + | functionExpr 'as' functionExpr ('=>' functionExpr)? +; + +classInstanceStatement: + 'new' namespace? className=IDENTIFIER arguments? + ; + +matchStatement: + 'match' '(' functionalExpr ')' '{' + (functionalExpr+ (',' functionalExpr+)* '=>' functionalExpr+)* + (',' functionalExpr+ (',' functionalExpr+)* '=>' functionalExpr+)* + ','? + '}' +; +staticClassReference : + namespace? IDENTIFIER '::' CLASS +; + +staticMethodAccess : + namespace? className=IDENTIFIER '::' method=IDENTIFIER arguments +; + +staticFieldAccess : + namespace? className=IDENTIFIER '::' (const=IDENTIFIER | propertyAlias=PHP_VARIABLE | 'class') + | classAlias=PHP_VARIABLE '::' const=IDENTIFIER + | classAlias=PHP_VARIABLE '::' propertyAlias=PHP_VARIABLE +; + +staticAccess : + //should throw an error? + namespace? className=IDENTIFIER '::' +; + +aliasDirectAccess: + PHP_VARIABLE classMember + ; + +classMember: + directMethodAccess + | '->' IDENTIFIER +; + +directMethodAccess : + '->' IDENTIFIER arguments +; + +directAccess : + IDENTIFIER arguments '->' IDENTIFIER arguments +; + +functionExpr : + IDENTIFIER arguments +; + +arguments : + '(' argument (',' argument )* ')' + | '(' ')' + ; + +namespace : + '\\'? (IDENTIFIER '\\')+ + | '\\' +; + +argument: + functionalExpr + | IDENTIFIER + ; + +array: + PHP_VARIABLE array_key_item+ + | array_key_item +; + +array_key_item: + '[' array_key_item* ']' + | 'array' '(' array_key_item* ')' + | '[' (array_child '=>' array_key_item)+ ']' + | 'array' '(' (array_child '=>' array_key_item)+ ')' + | '[' array_child (',' array_child)* ','? ']' + | 'array' '(' array_child (',' array_child)* ','? ')' +; + +array_child: + functionalExpr '=>' array_key_item + | functionalExpr '=>' functionalExpr + | functionalExpr + ; + +varExpr: + array + | '$'? PHP_VARIABLE + | STRING_LITERAL +; + +misc: + 'new' PHP_VARIABLE arguments? + | 'new' namespace //incomplete namespcace + | namespace className=IDENTIFIER +; + +output: + 'echo' functionalExpr +; \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.java new file mode 100644 index 000000000000..e1ee5b6d97d8 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.java @@ -0,0 +1,3208 @@ +// Generated from BladePhpAntlrParser.g4 by ANTLR 4.13.0 + + package org.netbeans.modules.php.blade.syntax.antlr4.php; + +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.misc.*; +import org.antlr.v4.runtime.tree.*; +import java.util.List; +import java.util.Iterator; +import java.util.ArrayList; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +public class BladePhpAntlrParser extends ParserAdaptor { + static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + HTML=1, BLADE_COMMENT=2, LINE_COMMENT=3, ARRAY=4, AS=5, ECHO=6, IF=7, + ELSEIF=8, ELSE=9, NEW=10, CLASS=11, FUNCTION=12, LANG_CONSTRUCT=13, MATCH=14, + FOREACH=15, COMMA=16, LPAREN=17, RPAREN=18, LSQUAREBRACKET=19, RSQUAREBRACKET=20, + LCURLYBRACE=21, RCURLYBRACE=22, IDENTIFIER=23, PHP_VARIABLE=24, DOLLAR=25, + NAMESPACE_SEPARATOR=26, DOUBLE_COLON=27, ARROW=28, OBJECT_OPERATOR=29, + SEMI_COLON=30, COMPARISON_OPERATOR=31, LOGICAL_UNION_OPERATOR=32, STRING_LITERAL=33, + STYLE_COMMENT=34, WS=35, PHP_DIRECTIVE=36, OTHER=37, BLADE_COMMENT_START=38, + EMAIL_SUBSTRING=39, VERSION_WITH_AT=40, BLADE_COMMENT_END=41, BLADE_COMMENT_PEEK=42, + BLADE_COMMENT_MORE=43, BLADE_COMMENT_EOF=44; + public static final int + RULE_expression = 0, RULE_exprStatement = 1, RULE_logicalStatement = 2, + RULE_ifStatement = 3, RULE_inputExpr = 4, RULE_functionalExpr = 5, RULE_classExpression = 6, + RULE_foreachDirectiveStatement = 7, RULE_foreachArguments = 8, RULE_classInstanceStatement = 9, + RULE_matchStatement = 10, RULE_staticClassReference = 11, RULE_staticMethodAccess = 12, + RULE_staticFieldAccess = 13, RULE_staticAccess = 14, RULE_aliasDirectAccess = 15, + RULE_classMember = 16, RULE_directMethodAccess = 17, RULE_directAccess = 18, + RULE_functionExpr = 19, RULE_arguments = 20, RULE_namespace = 21, RULE_argument = 22, + RULE_array = 23, RULE_array_key_item = 24, RULE_array_child = 25, RULE_varExpr = 26, + RULE_misc = 27, RULE_output = 28; + private static String[] makeRuleNames() { + return new String[] { + "expression", "exprStatement", "logicalStatement", "ifStatement", "inputExpr", + "functionalExpr", "classExpression", "foreachDirectiveStatement", "foreachArguments", + "classInstanceStatement", "matchStatement", "staticClassReference", "staticMethodAccess", + "staticFieldAccess", "staticAccess", "aliasDirectAccess", "classMember", + "directMethodAccess", "directAccess", "functionExpr", "arguments", "namespace", + "argument", "array", "array_key_item", "array_child", "varExpr", "misc", + "output" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, "'array'", "'as'", "'echo'", "'if'", null, "'else'", + "'new'", "'class'", "'function'", null, "'match'", "'foreach'", "','", + "'('", "')'", "'['", "']'", "'{'", "'}'", null, null, "'$'", "'\\'", + "'::'", "'=>'", "'->'", "';'", null, null, null, null, null, null, null, + "'{{--'", null, null, "'--}}'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "HTML", "BLADE_COMMENT", "LINE_COMMENT", "ARRAY", "AS", "ECHO", + "IF", "ELSEIF", "ELSE", "NEW", "CLASS", "FUNCTION", "LANG_CONSTRUCT", + "MATCH", "FOREACH", "COMMA", "LPAREN", "RPAREN", "LSQUAREBRACKET", "RSQUAREBRACKET", + "LCURLYBRACE", "RCURLYBRACE", "IDENTIFIER", "PHP_VARIABLE", "DOLLAR", + "NAMESPACE_SEPARATOR", "DOUBLE_COLON", "ARROW", "OBJECT_OPERATOR", "SEMI_COLON", + "COMPARISON_OPERATOR", "LOGICAL_UNION_OPERATOR", "STRING_LITERAL", "STYLE_COMMENT", + "WS", "PHP_DIRECTIVE", "OTHER", "BLADE_COMMENT_START", "EMAIL_SUBSTRING", + "VERSION_WITH_AT", "BLADE_COMMENT_END", "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", + "BLADE_COMMENT_EOF" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + @Override + public String getGrammarFileName() { return "BladePhpAntlrParser.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public ATN getATN() { return _ATN; } + + public BladePhpAntlrParser(TokenStream input) { + super(input); + _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @SuppressWarnings("CheckReturnValue") + public static class ExpressionContext extends ParserRuleContext { + public TerminalNode EOF() { return getToken(BladePhpAntlrParser.EOF, 0); } + public List exprStatement() { + return getRuleContexts(ExprStatementContext.class); + } + public ExprStatementContext exprStatement(int i) { + return getRuleContext(ExprStatementContext.class,i); + } + public ExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitExpression(this); + } + } + + public final ExpressionContext expression() throws RecognitionException { + ExpressionContext _localctx = new ExpressionContext(_ctx, getState()); + enterRule(_localctx, 0, RULE_expression); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(61); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,0,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(58); + exprStatement(); + } + } + } + setState(63); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,0,_ctx); + } + setState(64); + match(EOF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ExprStatementContext extends ParserRuleContext { + public TerminalNode SEMI_COLON() { return getToken(BladePhpAntlrParser.SEMI_COLON, 0); } + public TerminalNode LCURLYBRACE() { return getToken(BladePhpAntlrParser.LCURLYBRACE, 0); } + public TerminalNode RCURLYBRACE() { return getToken(BladePhpAntlrParser.RCURLYBRACE, 0); } + public List exprStatement() { + return getRuleContexts(ExprStatementContext.class); + } + public ExprStatementContext exprStatement(int i) { + return getRuleContext(ExprStatementContext.class,i); + } + public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } + public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } + public TerminalNode COMPARISON_OPERATOR() { return getToken(BladePhpAntlrParser.COMPARISON_OPERATOR, 0); } + public TerminalNode LOGICAL_UNION_OPERATOR() { return getToken(BladePhpAntlrParser.LOGICAL_UNION_OPERATOR, 0); } + public List functionalExpr() { + return getRuleContexts(FunctionalExprContext.class); + } + public FunctionalExprContext functionalExpr(int i) { + return getRuleContext(FunctionalExprContext.class,i); + } + public TerminalNode FOREACH() { return getToken(BladePhpAntlrParser.FOREACH, 0); } + public ForeachArgumentsContext foreachArguments() { + return getRuleContext(ForeachArgumentsContext.class,0); + } + public IfStatementContext ifStatement() { + return getRuleContext(IfStatementContext.class,0); + } + public ForeachDirectiveStatementContext foreachDirectiveStatement() { + return getRuleContext(ForeachDirectiveStatementContext.class,0); + } + public OutputContext output() { + return getRuleContext(OutputContext.class,0); + } + public MiscContext misc() { + return getRuleContext(MiscContext.class,0); + } + public ExprStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_exprStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterExprStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitExprStatement(this); + } + } + + public final ExprStatementContext exprStatement() throws RecognitionException { + ExprStatementContext _localctx = new ExprStatementContext(_ctx, getState()); + enterRule(_localctx, 2, RULE_exprStatement); + try { + int _alt; + setState(101); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(66); + match(SEMI_COLON); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(67); + match(LCURLYBRACE); + setState(71); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,1,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(68); + exprStatement(); + } + } + } + setState(73); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,1,_ctx); + } + setState(74); + match(RCURLYBRACE); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(75); + match(LPAREN); + setState(79); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,2,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(76); + exprStatement(); + } + } + } + setState(81); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,2,_ctx); + } + setState(82); + match(RPAREN); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(83); + match(COMPARISON_OPERATOR); + setState(84); + exprStatement(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(85); + match(LOGICAL_UNION_OPERATOR); + setState(87); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(86); + functionalExpr(); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(89); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,3,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(91); + match(FOREACH); + setState(92); + match(LPAREN); + setState(93); + foreachArguments(); + setState(94); + match(RPAREN); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(96); + functionalExpr(); + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(97); + ifStatement(); + } + break; + case 9: + enterOuterAlt(_localctx, 9); + { + setState(98); + foreachDirectiveStatement(); + } + break; + case 10: + enterOuterAlt(_localctx, 10); + { + setState(99); + output(); + } + break; + case 11: + enterOuterAlt(_localctx, 11); + { + setState(100); + misc(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class LogicalStatementContext extends ParserRuleContext { + public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } + public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } + public List functionalExpr() { + return getRuleContexts(FunctionalExprContext.class); + } + public FunctionalExprContext functionalExpr(int i) { + return getRuleContext(FunctionalExprContext.class,i); + } + public List LOGICAL_UNION_OPERATOR() { return getTokens(BladePhpAntlrParser.LOGICAL_UNION_OPERATOR); } + public TerminalNode LOGICAL_UNION_OPERATOR(int i) { + return getToken(BladePhpAntlrParser.LOGICAL_UNION_OPERATOR, i); + } + public List COMPARISON_OPERATOR() { return getTokens(BladePhpAntlrParser.COMPARISON_OPERATOR); } + public TerminalNode COMPARISON_OPERATOR(int i) { + return getToken(BladePhpAntlrParser.COMPARISON_OPERATOR, i); + } + public LogicalStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_logicalStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterLogicalStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitLogicalStatement(this); + } + } + + public final LogicalStatementContext logicalStatement() throws RecognitionException { + LogicalStatementContext _localctx = new LogicalStatementContext(_ctx, getState()); + enterRule(_localctx, 4, RULE_logicalStatement); + int _la; + try { + setState(126); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,8,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(103); + match(LPAREN); + setState(107); + _errHandler.sync(this); + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0)) { + { + { + setState(104); + functionalExpr(); + } + } + setState(109); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(110); + match(RPAREN); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(111); + functionalExpr(); + setState(114); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(112); + match(LOGICAL_UNION_OPERATOR); + setState(113); + functionalExpr(); + } + } + setState(116); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==LOGICAL_UNION_OPERATOR ); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(118); + functionalExpr(); + setState(121); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(119); + match(COMPARISON_OPERATOR); + setState(120); + functionalExpr(); + } + } + setState(123); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==COMPARISON_OPERATOR ); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(125); + functionalExpr(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IfStatementContext extends ParserRuleContext { + public TerminalNode IF() { return getToken(BladePhpAntlrParser.IF, 0); } + public List LPAREN() { return getTokens(BladePhpAntlrParser.LPAREN); } + public TerminalNode LPAREN(int i) { + return getToken(BladePhpAntlrParser.LPAREN, i); + } + public List RPAREN() { return getTokens(BladePhpAntlrParser.RPAREN); } + public TerminalNode RPAREN(int i) { + return getToken(BladePhpAntlrParser.RPAREN, i); + } + public List LCURLYBRACE() { return getTokens(BladePhpAntlrParser.LCURLYBRACE); } + public TerminalNode LCURLYBRACE(int i) { + return getToken(BladePhpAntlrParser.LCURLYBRACE, i); + } + public List RCURLYBRACE() { return getTokens(BladePhpAntlrParser.RCURLYBRACE); } + public TerminalNode RCURLYBRACE(int i) { + return getToken(BladePhpAntlrParser.RCURLYBRACE, i); + } + public List logicalStatement() { + return getRuleContexts(LogicalStatementContext.class); + } + public LogicalStatementContext logicalStatement(int i) { + return getRuleContext(LogicalStatementContext.class,i); + } + public List exprStatement() { + return getRuleContexts(ExprStatementContext.class); + } + public ExprStatementContext exprStatement(int i) { + return getRuleContext(ExprStatementContext.class,i); + } + public List ELSEIF() { return getTokens(BladePhpAntlrParser.ELSEIF); } + public TerminalNode ELSEIF(int i) { + return getToken(BladePhpAntlrParser.ELSEIF, i); + } + public TerminalNode ELSE() { return getToken(BladePhpAntlrParser.ELSE, 0); } + public IfStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_ifStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterIfStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitIfStatement(this); + } + } + + public final IfStatementContext ifStatement() throws RecognitionException { + IfStatementContext _localctx = new IfStatementContext(_ctx, getState()); + enterRule(_localctx, 6, RULE_ifStatement); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(128); + match(IF); + setState(129); + match(LPAREN); + setState(131); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(130); + logicalStatement(); + } + } + setState(133); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253315600L) != 0) ); + setState(135); + match(RPAREN); + setState(136); + match(LCURLYBRACE); + setState(140); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,10,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(137); + exprStatement(); + } + } + } + setState(142); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,10,_ctx); + } + setState(143); + match(RCURLYBRACE); + setState(163); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,13,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(144); + match(ELSEIF); + setState(145); + match(LPAREN); + setState(147); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(146); + logicalStatement(); + } + } + setState(149); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253315600L) != 0) ); + setState(151); + match(RPAREN); + setState(152); + match(LCURLYBRACE); + setState(156); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,12,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(153); + exprStatement(); + } + } + } + setState(158); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,12,_ctx); + } + setState(159); + match(RCURLYBRACE); + } + } + } + setState(165); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,13,_ctx); + } + setState(175); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { + case 1: + { + setState(166); + match(ELSE); + setState(167); + match(LCURLYBRACE); + setState(171); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,14,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(168); + exprStatement(); + } + } + } + setState(173); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,14,_ctx); + } + setState(174); + match(RCURLYBRACE); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class InputExprContext extends ParserRuleContext { + public VarExprContext varExpr() { + return getRuleContext(VarExprContext.class,0); + } + public InputExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_inputExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterInputExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitInputExpr(this); + } + } + + public final InputExprContext inputExpr() throws RecognitionException { + InputExprContext _localctx = new InputExprContext(_ctx, getState()); + enterRule(_localctx, 8, RULE_inputExpr); + try { + enterOuterAlt(_localctx, 1); + { + setState(177); + varExpr(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FunctionalExprContext extends ParserRuleContext { + public MatchStatementContext matchStatement() { + return getRuleContext(MatchStatementContext.class,0); + } + public ClassExpressionContext classExpression() { + return getRuleContext(ClassExpressionContext.class,0); + } + public List classMember() { + return getRuleContexts(ClassMemberContext.class); + } + public ClassMemberContext classMember(int i) { + return getRuleContext(ClassMemberContext.class,i); + } + public FunctionExprContext functionExpr() { + return getRuleContext(FunctionExprContext.class,0); + } + public TerminalNode LANG_CONSTRUCT() { return getToken(BladePhpAntlrParser.LANG_CONSTRUCT, 0); } + public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } + public FunctionalExprContext functionalExpr() { + return getRuleContext(FunctionalExprContext.class,0); + } + public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } + public InputExprContext inputExpr() { + return getRuleContext(InputExprContext.class,0); + } + public FunctionalExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_functionalExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterFunctionalExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitFunctionalExpr(this); + } + } + + public final FunctionalExprContext functionalExpr() throws RecognitionException { + FunctionalExprContext _localctx = new FunctionalExprContext(_ctx, getState()); + enterRule(_localctx, 10, RULE_functionalExpr); + try { + int _alt; + setState(194); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,17,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(179); + matchStatement(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(180); + classExpression(); + setState(184); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,16,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(181); + classMember(); + } + } + } + setState(186); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,16,_ctx); + } + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(187); + functionExpr(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(188); + match(LANG_CONSTRUCT); + setState(189); + match(LPAREN); + setState(190); + functionalExpr(); + setState(191); + match(RPAREN); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(193); + inputExpr(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ClassExpressionContext extends ParserRuleContext { + public ClassInstanceStatementContext classInstanceStatement() { + return getRuleContext(ClassInstanceStatementContext.class,0); + } + public StaticMethodAccessContext staticMethodAccess() { + return getRuleContext(StaticMethodAccessContext.class,0); + } + public StaticFieldAccessContext staticFieldAccess() { + return getRuleContext(StaticFieldAccessContext.class,0); + } + public StaticClassReferenceContext staticClassReference() { + return getRuleContext(StaticClassReferenceContext.class,0); + } + public StaticAccessContext staticAccess() { + return getRuleContext(StaticAccessContext.class,0); + } + public AliasDirectAccessContext aliasDirectAccess() { + return getRuleContext(AliasDirectAccessContext.class,0); + } + public DirectMethodAccessContext directMethodAccess() { + return getRuleContext(DirectMethodAccessContext.class,0); + } + public ClassExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_classExpression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterClassExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitClassExpression(this); + } + } + + public final ClassExpressionContext classExpression() throws RecognitionException { + ClassExpressionContext _localctx = new ClassExpressionContext(_ctx, getState()); + enterRule(_localctx, 12, RULE_classExpression); + try { + setState(203); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(196); + classInstanceStatement(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(197); + staticMethodAccess(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(198); + staticFieldAccess(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(199); + staticClassReference(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(200); + staticAccess(); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(201); + aliasDirectAccess(); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(202); + directMethodAccess(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ForeachDirectiveStatementContext extends ParserRuleContext { + public ForeachArgumentsContext foreachArguments() { + return getRuleContext(ForeachArgumentsContext.class,0); + } + public ForeachDirectiveStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_foreachDirectiveStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterForeachDirectiveStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitForeachDirectiveStatement(this); + } + } + + public final ForeachDirectiveStatementContext foreachDirectiveStatement() throws RecognitionException { + ForeachDirectiveStatementContext _localctx = new ForeachDirectiveStatementContext(_ctx, getState()); + enterRule(_localctx, 14, RULE_foreachDirectiveStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(205); + if (!(this.bladeParserContext.equals(ParserContext.FOREACH))) throw new FailedPredicateException(this, "this.bladeParserContext.equals(ParserContext.FOREACH)"); + setState(206); + foreachArguments(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ForeachArgumentsContext extends ParserRuleContext { + public Token main_array; + public Token array_item; + public Token array_key; + public TerminalNode AS() { return getToken(BladePhpAntlrParser.AS, 0); } + public List PHP_VARIABLE() { return getTokens(BladePhpAntlrParser.PHP_VARIABLE); } + public TerminalNode PHP_VARIABLE(int i) { + return getToken(BladePhpAntlrParser.PHP_VARIABLE, i); + } + public ArrayContext array() { + return getRuleContext(ArrayContext.class,0); + } + public TerminalNode ARROW() { return getToken(BladePhpAntlrParser.ARROW, 0); } + public List functionExpr() { + return getRuleContexts(FunctionExprContext.class); + } + public FunctionExprContext functionExpr(int i) { + return getRuleContext(FunctionExprContext.class,i); + } + public ForeachArgumentsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_foreachArguments; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterForeachArguments(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitForeachArguments(this); + } + } + + public final ForeachArgumentsContext foreachArguments() throws RecognitionException { + ForeachArgumentsContext _localctx = new ForeachArgumentsContext(_ctx, getState()); + enterRule(_localctx, 16, RULE_foreachArguments); + try { + setState(229); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(210); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) { + case 1: + { + setState(208); + array(); + } + break; + case 2: + { + setState(209); + ((ForeachArgumentsContext)_localctx).main_array = match(PHP_VARIABLE); + } + break; + } + setState(212); + match(AS); + setState(213); + ((ForeachArgumentsContext)_localctx).array_item = match(PHP_VARIABLE); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(216); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) { + case 1: + { + setState(214); + array(); + } + break; + case 2: + { + setState(215); + ((ForeachArgumentsContext)_localctx).main_array = match(PHP_VARIABLE); + } + break; + } + setState(218); + match(AS); + setState(219); + ((ForeachArgumentsContext)_localctx).array_key = match(PHP_VARIABLE); + setState(220); + match(ARROW); + setState(221); + ((ForeachArgumentsContext)_localctx).array_item = match(PHP_VARIABLE); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(222); + functionExpr(); + setState(223); + match(AS); + setState(224); + functionExpr(); + setState(227); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,21,_ctx) ) { + case 1: + { + setState(225); + match(ARROW); + setState(226); + functionExpr(); + } + break; + } + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ClassInstanceStatementContext extends ParserRuleContext { + public Token className; + public TerminalNode NEW() { return getToken(BladePhpAntlrParser.NEW, 0); } + public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } + public NamespaceContext namespace() { + return getRuleContext(NamespaceContext.class,0); + } + public ArgumentsContext arguments() { + return getRuleContext(ArgumentsContext.class,0); + } + public ClassInstanceStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_classInstanceStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterClassInstanceStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitClassInstanceStatement(this); + } + } + + public final ClassInstanceStatementContext classInstanceStatement() throws RecognitionException { + ClassInstanceStatementContext _localctx = new ClassInstanceStatementContext(_ctx, getState()); + enterRule(_localctx, 18, RULE_classInstanceStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(231); + match(NEW); + setState(233); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,23,_ctx) ) { + case 1: + { + setState(232); + namespace(); + } + break; + } + setState(235); + ((ClassInstanceStatementContext)_localctx).className = match(IDENTIFIER); + setState(237); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) { + case 1: + { + setState(236); + arguments(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class MatchStatementContext extends ParserRuleContext { + public TerminalNode MATCH() { return getToken(BladePhpAntlrParser.MATCH, 0); } + public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } + public List functionalExpr() { + return getRuleContexts(FunctionalExprContext.class); + } + public FunctionalExprContext functionalExpr(int i) { + return getRuleContext(FunctionalExprContext.class,i); + } + public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } + public TerminalNode LCURLYBRACE() { return getToken(BladePhpAntlrParser.LCURLYBRACE, 0); } + public TerminalNode RCURLYBRACE() { return getToken(BladePhpAntlrParser.RCURLYBRACE, 0); } + public List ARROW() { return getTokens(BladePhpAntlrParser.ARROW); } + public TerminalNode ARROW(int i) { + return getToken(BladePhpAntlrParser.ARROW, i); + } + public List COMMA() { return getTokens(BladePhpAntlrParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(BladePhpAntlrParser.COMMA, i); + } + public MatchStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_matchStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterMatchStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitMatchStatement(this); + } + } + + public final MatchStatementContext matchStatement() throws RecognitionException { + MatchStatementContext _localctx = new MatchStatementContext(_ctx, getState()); + enterRule(_localctx, 20, RULE_matchStatement); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(239); + match(MATCH); + setState(240); + match(LPAREN); + setState(241); + functionalExpr(); + setState(242); + match(RPAREN); + setState(243); + match(LCURLYBRACE); + setState(268); + _errHandler.sync(this); + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0)) { + { + { + setState(245); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(244); + functionalExpr(); + } + } + setState(247); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); + setState(257); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(249); + match(COMMA); + setState(251); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(250); + functionalExpr(); + } + } + setState(253); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); + } + } + setState(259); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(260); + match(ARROW); + setState(262); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(261); + functionalExpr(); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(264); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,28,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + } + setState(270); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(296); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,34,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(271); + match(COMMA); + setState(273); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(272); + functionalExpr(); + } + } + setState(275); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); + setState(285); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(277); + match(COMMA); + setState(279); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(278); + functionalExpr(); + } + } + setState(281); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); + } + } + setState(287); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(288); + match(ARROW); + setState(290); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(289); + functionalExpr(); + } + } + setState(292); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); + } + } + } + setState(298); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,34,_ctx); + } + setState(300); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(299); + match(COMMA); + } + } + + setState(302); + match(RCURLYBRACE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StaticClassReferenceContext extends ParserRuleContext { + public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } + public TerminalNode DOUBLE_COLON() { return getToken(BladePhpAntlrParser.DOUBLE_COLON, 0); } + public TerminalNode CLASS() { return getToken(BladePhpAntlrParser.CLASS, 0); } + public NamespaceContext namespace() { + return getRuleContext(NamespaceContext.class,0); + } + public StaticClassReferenceContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_staticClassReference; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterStaticClassReference(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitStaticClassReference(this); + } + } + + public final StaticClassReferenceContext staticClassReference() throws RecognitionException { + StaticClassReferenceContext _localctx = new StaticClassReferenceContext(_ctx, getState()); + enterRule(_localctx, 22, RULE_staticClassReference); + try { + enterOuterAlt(_localctx, 1); + { + setState(305); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { + case 1: + { + setState(304); + namespace(); + } + break; + } + setState(307); + match(IDENTIFIER); + setState(308); + match(DOUBLE_COLON); + setState(309); + match(CLASS); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StaticMethodAccessContext extends ParserRuleContext { + public Token className; + public Token method; + public TerminalNode DOUBLE_COLON() { return getToken(BladePhpAntlrParser.DOUBLE_COLON, 0); } + public ArgumentsContext arguments() { + return getRuleContext(ArgumentsContext.class,0); + } + public List IDENTIFIER() { return getTokens(BladePhpAntlrParser.IDENTIFIER); } + public TerminalNode IDENTIFIER(int i) { + return getToken(BladePhpAntlrParser.IDENTIFIER, i); + } + public NamespaceContext namespace() { + return getRuleContext(NamespaceContext.class,0); + } + public StaticMethodAccessContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_staticMethodAccess; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterStaticMethodAccess(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitStaticMethodAccess(this); + } + } + + public final StaticMethodAccessContext staticMethodAccess() throws RecognitionException { + StaticMethodAccessContext _localctx = new StaticMethodAccessContext(_ctx, getState()); + enterRule(_localctx, 24, RULE_staticMethodAccess); + try { + enterOuterAlt(_localctx, 1); + { + setState(312); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { + case 1: + { + setState(311); + namespace(); + } + break; + } + setState(314); + ((StaticMethodAccessContext)_localctx).className = match(IDENTIFIER); + setState(315); + match(DOUBLE_COLON); + setState(316); + ((StaticMethodAccessContext)_localctx).method = match(IDENTIFIER); + setState(317); + arguments(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StaticFieldAccessContext extends ParserRuleContext { + public Token className; + public Token const_; + public Token propertyAlias; + public Token classAlias; + public TerminalNode DOUBLE_COLON() { return getToken(BladePhpAntlrParser.DOUBLE_COLON, 0); } + public List IDENTIFIER() { return getTokens(BladePhpAntlrParser.IDENTIFIER); } + public TerminalNode IDENTIFIER(int i) { + return getToken(BladePhpAntlrParser.IDENTIFIER, i); + } + public TerminalNode CLASS() { return getToken(BladePhpAntlrParser.CLASS, 0); } + public NamespaceContext namespace() { + return getRuleContext(NamespaceContext.class,0); + } + public List PHP_VARIABLE() { return getTokens(BladePhpAntlrParser.PHP_VARIABLE); } + public TerminalNode PHP_VARIABLE(int i) { + return getToken(BladePhpAntlrParser.PHP_VARIABLE, i); + } + public StaticFieldAccessContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_staticFieldAccess; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterStaticFieldAccess(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitStaticFieldAccess(this); + } + } + + public final StaticFieldAccessContext staticFieldAccess() throws RecognitionException { + StaticFieldAccessContext _localctx = new StaticFieldAccessContext(_ctx, getState()); + enterRule(_localctx, 26, RULE_staticFieldAccess); + try { + setState(335); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,40,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(320); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { + case 1: + { + setState(319); + namespace(); + } + break; + } + setState(322); + ((StaticFieldAccessContext)_localctx).className = match(IDENTIFIER); + setState(323); + match(DOUBLE_COLON); + setState(327); + _errHandler.sync(this); + switch (_input.LA(1)) { + case IDENTIFIER: + { + setState(324); + ((StaticFieldAccessContext)_localctx).const_ = match(IDENTIFIER); + } + break; + case PHP_VARIABLE: + { + setState(325); + ((StaticFieldAccessContext)_localctx).propertyAlias = match(PHP_VARIABLE); + } + break; + case CLASS: + { + setState(326); + match(CLASS); + } + break; + default: + throw new NoViableAltException(this); + } + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(329); + ((StaticFieldAccessContext)_localctx).classAlias = match(PHP_VARIABLE); + setState(330); + match(DOUBLE_COLON); + setState(331); + ((StaticFieldAccessContext)_localctx).const_ = match(IDENTIFIER); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(332); + ((StaticFieldAccessContext)_localctx).classAlias = match(PHP_VARIABLE); + setState(333); + match(DOUBLE_COLON); + setState(334); + ((StaticFieldAccessContext)_localctx).propertyAlias = match(PHP_VARIABLE); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StaticAccessContext extends ParserRuleContext { + public Token className; + public TerminalNode DOUBLE_COLON() { return getToken(BladePhpAntlrParser.DOUBLE_COLON, 0); } + public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } + public NamespaceContext namespace() { + return getRuleContext(NamespaceContext.class,0); + } + public StaticAccessContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_staticAccess; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterStaticAccess(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitStaticAccess(this); + } + } + + public final StaticAccessContext staticAccess() throws RecognitionException { + StaticAccessContext _localctx = new StaticAccessContext(_ctx, getState()); + enterRule(_localctx, 28, RULE_staticAccess); + try { + enterOuterAlt(_localctx, 1); + { + setState(338); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { + case 1: + { + setState(337); + namespace(); + } + break; + } + setState(340); + ((StaticAccessContext)_localctx).className = match(IDENTIFIER); + setState(341); + match(DOUBLE_COLON); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class AliasDirectAccessContext extends ParserRuleContext { + public TerminalNode PHP_VARIABLE() { return getToken(BladePhpAntlrParser.PHP_VARIABLE, 0); } + public ClassMemberContext classMember() { + return getRuleContext(ClassMemberContext.class,0); + } + public AliasDirectAccessContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_aliasDirectAccess; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterAliasDirectAccess(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitAliasDirectAccess(this); + } + } + + public final AliasDirectAccessContext aliasDirectAccess() throws RecognitionException { + AliasDirectAccessContext _localctx = new AliasDirectAccessContext(_ctx, getState()); + enterRule(_localctx, 30, RULE_aliasDirectAccess); + try { + enterOuterAlt(_localctx, 1); + { + setState(343); + match(PHP_VARIABLE); + setState(344); + classMember(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ClassMemberContext extends ParserRuleContext { + public DirectMethodAccessContext directMethodAccess() { + return getRuleContext(DirectMethodAccessContext.class,0); + } + public TerminalNode OBJECT_OPERATOR() { return getToken(BladePhpAntlrParser.OBJECT_OPERATOR, 0); } + public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } + public ClassMemberContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_classMember; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterClassMember(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitClassMember(this); + } + } + + public final ClassMemberContext classMember() throws RecognitionException { + ClassMemberContext _localctx = new ClassMemberContext(_ctx, getState()); + enterRule(_localctx, 32, RULE_classMember); + try { + setState(349); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(346); + directMethodAccess(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(347); + match(OBJECT_OPERATOR); + setState(348); + match(IDENTIFIER); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DirectMethodAccessContext extends ParserRuleContext { + public TerminalNode OBJECT_OPERATOR() { return getToken(BladePhpAntlrParser.OBJECT_OPERATOR, 0); } + public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } + public ArgumentsContext arguments() { + return getRuleContext(ArgumentsContext.class,0); + } + public DirectMethodAccessContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_directMethodAccess; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterDirectMethodAccess(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitDirectMethodAccess(this); + } + } + + public final DirectMethodAccessContext directMethodAccess() throws RecognitionException { + DirectMethodAccessContext _localctx = new DirectMethodAccessContext(_ctx, getState()); + enterRule(_localctx, 34, RULE_directMethodAccess); + try { + enterOuterAlt(_localctx, 1); + { + setState(351); + match(OBJECT_OPERATOR); + setState(352); + match(IDENTIFIER); + setState(353); + arguments(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DirectAccessContext extends ParserRuleContext { + public List IDENTIFIER() { return getTokens(BladePhpAntlrParser.IDENTIFIER); } + public TerminalNode IDENTIFIER(int i) { + return getToken(BladePhpAntlrParser.IDENTIFIER, i); + } + public List arguments() { + return getRuleContexts(ArgumentsContext.class); + } + public ArgumentsContext arguments(int i) { + return getRuleContext(ArgumentsContext.class,i); + } + public TerminalNode OBJECT_OPERATOR() { return getToken(BladePhpAntlrParser.OBJECT_OPERATOR, 0); } + public DirectAccessContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_directAccess; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterDirectAccess(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitDirectAccess(this); + } + } + + public final DirectAccessContext directAccess() throws RecognitionException { + DirectAccessContext _localctx = new DirectAccessContext(_ctx, getState()); + enterRule(_localctx, 36, RULE_directAccess); + try { + enterOuterAlt(_localctx, 1); + { + setState(355); + match(IDENTIFIER); + setState(356); + arguments(); + setState(357); + match(OBJECT_OPERATOR); + setState(358); + match(IDENTIFIER); + setState(359); + arguments(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FunctionExprContext extends ParserRuleContext { + public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } + public ArgumentsContext arguments() { + return getRuleContext(ArgumentsContext.class,0); + } + public FunctionExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_functionExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterFunctionExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitFunctionExpr(this); + } + } + + public final FunctionExprContext functionExpr() throws RecognitionException { + FunctionExprContext _localctx = new FunctionExprContext(_ctx, getState()); + enterRule(_localctx, 38, RULE_functionExpr); + try { + enterOuterAlt(_localctx, 1); + { + setState(361); + match(IDENTIFIER); + setState(362); + arguments(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ArgumentsContext extends ParserRuleContext { + public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } + public List argument() { + return getRuleContexts(ArgumentContext.class); + } + public ArgumentContext argument(int i) { + return getRuleContext(ArgumentContext.class,i); + } + public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } + public List COMMA() { return getTokens(BladePhpAntlrParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(BladePhpAntlrParser.COMMA, i); + } + public ArgumentsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_arguments; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterArguments(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitArguments(this); + } + } + + public final ArgumentsContext arguments() throws RecognitionException { + ArgumentsContext _localctx = new ArgumentsContext(_ctx, getState()); + enterRule(_localctx, 40, RULE_arguments); + int _la; + try { + setState(377); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(364); + match(LPAREN); + setState(365); + argument(); + setState(370); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(366); + match(COMMA); + setState(367); + argument(); + } + } + setState(372); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(373); + match(RPAREN); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(375); + match(LPAREN); + setState(376); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class NamespaceContext extends ParserRuleContext { + public List NAMESPACE_SEPARATOR() { return getTokens(BladePhpAntlrParser.NAMESPACE_SEPARATOR); } + public TerminalNode NAMESPACE_SEPARATOR(int i) { + return getToken(BladePhpAntlrParser.NAMESPACE_SEPARATOR, i); + } + public List IDENTIFIER() { return getTokens(BladePhpAntlrParser.IDENTIFIER); } + public TerminalNode IDENTIFIER(int i) { + return getToken(BladePhpAntlrParser.IDENTIFIER, i); + } + public NamespaceContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_namespace; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterNamespace(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitNamespace(this); + } + } + + public final NamespaceContext namespace() throws RecognitionException { + NamespaceContext _localctx = new NamespaceContext(_ctx, getState()); + enterRule(_localctx, 42, RULE_namespace); + int _la; + try { + int _alt; + setState(389); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(380); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NAMESPACE_SEPARATOR) { + { + setState(379); + match(NAMESPACE_SEPARATOR); + } + } + + setState(384); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(382); + match(IDENTIFIER); + setState(383); + match(NAMESPACE_SEPARATOR); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(386); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,46,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(388); + match(NAMESPACE_SEPARATOR); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ArgumentContext extends ParserRuleContext { + public FunctionalExprContext functionalExpr() { + return getRuleContext(FunctionalExprContext.class,0); + } + public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } + public ArgumentContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_argument; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterArgument(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitArgument(this); + } + } + + public final ArgumentContext argument() throws RecognitionException { + ArgumentContext _localctx = new ArgumentContext(_ctx, getState()); + enterRule(_localctx, 44, RULE_argument); + try { + setState(393); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(391); + functionalExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(392); + match(IDENTIFIER); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ArrayContext extends ParserRuleContext { + public TerminalNode PHP_VARIABLE() { return getToken(BladePhpAntlrParser.PHP_VARIABLE, 0); } + public List array_key_item() { + return getRuleContexts(Array_key_itemContext.class); + } + public Array_key_itemContext array_key_item(int i) { + return getRuleContext(Array_key_itemContext.class,i); + } + public ArrayContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_array; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterArray(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitArray(this); + } + } + + public final ArrayContext array() throws RecognitionException { + ArrayContext _localctx = new ArrayContext(_ctx, getState()); + enterRule(_localctx, 46, RULE_array); + try { + int _alt; + setState(402); + _errHandler.sync(this); + switch (_input.LA(1)) { + case PHP_VARIABLE: + enterOuterAlt(_localctx, 1); + { + setState(395); + match(PHP_VARIABLE); + setState(397); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(396); + array_key_item(); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(399); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,49,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + break; + case ARRAY: + case LSQUAREBRACKET: + enterOuterAlt(_localctx, 2); + { + setState(401); + array_key_item(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Array_key_itemContext extends ParserRuleContext { + public TerminalNode LSQUAREBRACKET() { return getToken(BladePhpAntlrParser.LSQUAREBRACKET, 0); } + public TerminalNode RSQUAREBRACKET() { return getToken(BladePhpAntlrParser.RSQUAREBRACKET, 0); } + public List array_key_item() { + return getRuleContexts(Array_key_itemContext.class); + } + public Array_key_itemContext array_key_item(int i) { + return getRuleContext(Array_key_itemContext.class,i); + } + public TerminalNode ARRAY() { return getToken(BladePhpAntlrParser.ARRAY, 0); } + public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } + public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } + public List array_child() { + return getRuleContexts(Array_childContext.class); + } + public Array_childContext array_child(int i) { + return getRuleContext(Array_childContext.class,i); + } + public List ARROW() { return getTokens(BladePhpAntlrParser.ARROW); } + public TerminalNode ARROW(int i) { + return getToken(BladePhpAntlrParser.ARROW, i); + } + public List COMMA() { return getTokens(BladePhpAntlrParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(BladePhpAntlrParser.COMMA, i); + } + public Array_key_itemContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_array_key_item; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterArray_key_item(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitArray_key_item(this); + } + } + + public final Array_key_itemContext array_key_item() throws RecognitionException { + Array_key_itemContext _localctx = new Array_key_itemContext(_ctx, getState()); + enterRule(_localctx, 48, RULE_array_key_item); + int _la; + try { + int _alt; + setState(473); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(404); + match(LSQUAREBRACKET); + setState(408); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==ARRAY || _la==LSQUAREBRACKET) { + { + { + setState(405); + array_key_item(); + } + } + setState(410); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(411); + match(RSQUAREBRACKET); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(412); + match(ARRAY); + setState(413); + match(LPAREN); + setState(417); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==ARRAY || _la==LSQUAREBRACKET) { + { + { + setState(414); + array_key_item(); + } + } + setState(419); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(420); + match(RPAREN); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(421); + match(LSQUAREBRACKET); + setState(426); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(422); + array_child(); + setState(423); + match(ARROW); + setState(424); + array_key_item(); + } + } + setState(428); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); + setState(430); + match(RSQUAREBRACKET); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(432); + match(ARRAY); + setState(433); + match(LPAREN); + setState(438); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(434); + array_child(); + setState(435); + match(ARROW); + setState(436); + array_key_item(); + } + } + setState(440); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); + setState(442); + match(RPAREN); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(444); + match(LSQUAREBRACKET); + setState(445); + array_child(); + setState(450); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,55,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(446); + match(COMMA); + setState(447); + array_child(); + } + } + } + setState(452); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,55,_ctx); + } + setState(454); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(453); + match(COMMA); + } + } + + setState(456); + match(RSQUAREBRACKET); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(458); + match(ARRAY); + setState(459); + match(LPAREN); + setState(460); + array_child(); + setState(465); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,57,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(461); + match(COMMA); + setState(462); + array_child(); + } + } + } + setState(467); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,57,_ctx); + } + setState(469); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(468); + match(COMMA); + } + } + + setState(471); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Array_childContext extends ParserRuleContext { + public List functionalExpr() { + return getRuleContexts(FunctionalExprContext.class); + } + public FunctionalExprContext functionalExpr(int i) { + return getRuleContext(FunctionalExprContext.class,i); + } + public TerminalNode ARROW() { return getToken(BladePhpAntlrParser.ARROW, 0); } + public Array_key_itemContext array_key_item() { + return getRuleContext(Array_key_itemContext.class,0); + } + public Array_childContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_array_child; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterArray_child(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitArray_child(this); + } + } + + public final Array_childContext array_child() throws RecognitionException { + Array_childContext _localctx = new Array_childContext(_ctx, getState()); + enterRule(_localctx, 50, RULE_array_child); + try { + setState(484); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(475); + functionalExpr(); + setState(476); + match(ARROW); + setState(477); + array_key_item(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(479); + functionalExpr(); + setState(480); + match(ARROW); + setState(481); + functionalExpr(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(483); + functionalExpr(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class VarExprContext extends ParserRuleContext { + public ArrayContext array() { + return getRuleContext(ArrayContext.class,0); + } + public TerminalNode PHP_VARIABLE() { return getToken(BladePhpAntlrParser.PHP_VARIABLE, 0); } + public TerminalNode DOLLAR() { return getToken(BladePhpAntlrParser.DOLLAR, 0); } + public TerminalNode STRING_LITERAL() { return getToken(BladePhpAntlrParser.STRING_LITERAL, 0); } + public VarExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_varExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterVarExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitVarExpr(this); + } + } + + public final VarExprContext varExpr() throws RecognitionException { + VarExprContext _localctx = new VarExprContext(_ctx, getState()); + enterRule(_localctx, 52, RULE_varExpr); + int _la; + try { + setState(492); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,62,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(486); + array(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(488); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==DOLLAR) { + { + setState(487); + match(DOLLAR); + } + } + + setState(490); + match(PHP_VARIABLE); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(491); + match(STRING_LITERAL); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class MiscContext extends ParserRuleContext { + public Token className; + public TerminalNode NEW() { return getToken(BladePhpAntlrParser.NEW, 0); } + public TerminalNode PHP_VARIABLE() { return getToken(BladePhpAntlrParser.PHP_VARIABLE, 0); } + public ArgumentsContext arguments() { + return getRuleContext(ArgumentsContext.class,0); + } + public NamespaceContext namespace() { + return getRuleContext(NamespaceContext.class,0); + } + public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } + public MiscContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_misc; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterMisc(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitMisc(this); + } + } + + public final MiscContext misc() throws RecognitionException { + MiscContext _localctx = new MiscContext(_ctx, getState()); + enterRule(_localctx, 54, RULE_misc); + try { + setState(504); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(494); + match(NEW); + setState(495); + match(PHP_VARIABLE); + setState(497); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { + case 1: + { + setState(496); + arguments(); + } + break; + } + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(499); + match(NEW); + setState(500); + namespace(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(501); + namespace(); + setState(502); + ((MiscContext)_localctx).className = match(IDENTIFIER); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class OutputContext extends ParserRuleContext { + public TerminalNode ECHO() { return getToken(BladePhpAntlrParser.ECHO, 0); } + public FunctionalExprContext functionalExpr() { + return getRuleContext(FunctionalExprContext.class,0); + } + public OutputContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_output; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterOutput(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitOutput(this); + } + } + + public final OutputContext output() throws RecognitionException { + OutputContext _localctx = new OutputContext(_ctx, getState()); + enterRule(_localctx, 56, RULE_output); + try { + enterOuterAlt(_localctx, 1); + { + setState(506); + match(ECHO); + setState(507); + functionalExpr(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { + switch (ruleIndex) { + case 7: + return foreachDirectiveStatement_sempred((ForeachDirectiveStatementContext)_localctx, predIndex); + } + return true; + } + private boolean foreachDirectiveStatement_sempred(ForeachDirectiveStatementContext _localctx, int predIndex) { + switch (predIndex) { + case 0: + return this.bladeParserContext.equals(ParserContext.FOREACH); + } + return true; + } + + public static final String _serializedATN = + "\u0004\u0001,\u01fe\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ + "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ + "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ + "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"+ + "\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012"+ + "\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015"+ + "\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018"+ + "\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007\u001b"+ + "\u0002\u001c\u0007\u001c\u0001\u0000\u0005\u0000<\b\u0000\n\u0000\f\u0000"+ + "?\t\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0005\u0001F\b\u0001\n\u0001\f\u0001I\t\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0005\u0001N\b\u0001\n\u0001\f\u0001Q\t\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0001X\b\u0001"+ + "\u000b\u0001\f\u0001Y\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0003\u0001f\b\u0001\u0001\u0002\u0001\u0002\u0005\u0002j\b\u0002\n\u0002"+ + "\f\u0002m\t\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0004"+ + "\u0002s\b\u0002\u000b\u0002\f\u0002t\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0004\u0002z\b\u0002\u000b\u0002\f\u0002{\u0001\u0002\u0003\u0002\u007f"+ + "\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0004\u0003\u0084\b\u0003"+ + "\u000b\u0003\f\u0003\u0085\u0001\u0003\u0001\u0003\u0001\u0003\u0005\u0003"+ + "\u008b\b\u0003\n\u0003\f\u0003\u008e\t\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0004\u0003\u0094\b\u0003\u000b\u0003\f\u0003\u0095"+ + "\u0001\u0003\u0001\u0003\u0001\u0003\u0005\u0003\u009b\b\u0003\n\u0003"+ + "\f\u0003\u009e\t\u0003\u0001\u0003\u0001\u0003\u0005\u0003\u00a2\b\u0003"+ + "\n\u0003\f\u0003\u00a5\t\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0005"+ + "\u0003\u00aa\b\u0003\n\u0003\f\u0003\u00ad\t\u0003\u0001\u0003\u0003\u0003"+ + "\u00b0\b\u0003\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0005\u0005\u00b7\b\u0005\n\u0005\f\u0005\u00ba\t\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003"+ + "\u0005\u00c3\b\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0003\u0006\u00cc\b\u0006\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\b\u0001\b\u0003\b\u00d3\b\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0003\b\u00d9\b\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0003\b\u00e4\b\b\u0003\b\u00e6\b\b\u0001\t"+ + "\u0001\t\u0003\t\u00ea\b\t\u0001\t\u0001\t\u0003\t\u00ee\b\t\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0004\n\u00f6\b\n\u000b\n\f\n\u00f7"+ + "\u0001\n\u0001\n\u0004\n\u00fc\b\n\u000b\n\f\n\u00fd\u0005\n\u0100\b\n"+ + "\n\n\f\n\u0103\t\n\u0001\n\u0001\n\u0004\n\u0107\b\n\u000b\n\f\n\u0108"+ + "\u0005\n\u010b\b\n\n\n\f\n\u010e\t\n\u0001\n\u0001\n\u0004\n\u0112\b\n"+ + "\u000b\n\f\n\u0113\u0001\n\u0001\n\u0004\n\u0118\b\n\u000b\n\f\n\u0119"+ + "\u0005\n\u011c\b\n\n\n\f\n\u011f\t\n\u0001\n\u0001\n\u0004\n\u0123\b\n"+ + "\u000b\n\f\n\u0124\u0005\n\u0127\b\n\n\n\f\n\u012a\t\n\u0001\n\u0003\n"+ + "\u012d\b\n\u0001\n\u0001\n\u0001\u000b\u0003\u000b\u0132\b\u000b\u0001"+ + "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0003\f\u0139\b\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0003\r\u0141\b\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0003\r\u0148\b\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0003\r\u0150\b\r\u0001\u000e\u0003\u000e\u0153\b\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u015e\b\u0010\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013"+ + "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0005\u0014\u0171\b\u0014"+ + "\n\u0014\f\u0014\u0174\t\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ + "\u0014\u0003\u0014\u017a\b\u0014\u0001\u0015\u0003\u0015\u017d\b\u0015"+ + "\u0001\u0015\u0001\u0015\u0004\u0015\u0181\b\u0015\u000b\u0015\f\u0015"+ + "\u0182\u0001\u0015\u0003\u0015\u0186\b\u0015\u0001\u0016\u0001\u0016\u0003"+ + "\u0016\u018a\b\u0016\u0001\u0017\u0001\u0017\u0004\u0017\u018e\b\u0017"+ + "\u000b\u0017\f\u0017\u018f\u0001\u0017\u0003\u0017\u0193\b\u0017\u0001"+ + "\u0018\u0001\u0018\u0005\u0018\u0197\b\u0018\n\u0018\f\u0018\u019a\t\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0005\u0018\u01a0\b\u0018"+ + "\n\u0018\f\u0018\u01a3\t\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0004\u0018\u01ab\b\u0018\u000b\u0018\f"+ + "\u0018\u01ac\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0018\u0004\u0018\u01b7\b\u0018\u000b\u0018"+ + "\f\u0018\u01b8\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0005\u0018\u01c1\b\u0018\n\u0018\f\u0018\u01c4\t\u0018\u0001"+ + "\u0018\u0003\u0018\u01c7\b\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0005\u0018\u01d0\b\u0018\n"+ + "\u0018\f\u0018\u01d3\t\u0018\u0001\u0018\u0003\u0018\u01d6\b\u0018\u0001"+ + "\u0018\u0001\u0018\u0003\u0018\u01da\b\u0018\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0003\u0019\u01e5\b\u0019\u0001\u001a\u0001\u001a\u0003\u001a\u01e9"+ + "\b\u001a\u0001\u001a\u0001\u001a\u0003\u001a\u01ed\b\u001a\u0001\u001b"+ + "\u0001\u001b\u0001\u001b\u0003\u001b\u01f2\b\u001b\u0001\u001b\u0001\u001b"+ + "\u0001\u001b\u0001\u001b\u0001\u001b\u0003\u001b\u01f9\b\u001b\u0001\u001c"+ + "\u0001\u001c\u0001\u001c\u0001\u001c\u0000\u0000\u001d\u0000\u0002\u0004"+ + "\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \""+ + "$&(*,.02468\u0000\u0000\u023e\u0000=\u0001\u0000\u0000\u0000\u0002e\u0001"+ + "\u0000\u0000\u0000\u0004~\u0001\u0000\u0000\u0000\u0006\u0080\u0001\u0000"+ + "\u0000\u0000\b\u00b1\u0001\u0000\u0000\u0000\n\u00c2\u0001\u0000\u0000"+ + "\u0000\f\u00cb\u0001\u0000\u0000\u0000\u000e\u00cd\u0001\u0000\u0000\u0000"+ + "\u0010\u00e5\u0001\u0000\u0000\u0000\u0012\u00e7\u0001\u0000\u0000\u0000"+ + "\u0014\u00ef\u0001\u0000\u0000\u0000\u0016\u0131\u0001\u0000\u0000\u0000"+ + "\u0018\u0138\u0001\u0000\u0000\u0000\u001a\u014f\u0001\u0000\u0000\u0000"+ + "\u001c\u0152\u0001\u0000\u0000\u0000\u001e\u0157\u0001\u0000\u0000\u0000"+ + " \u015d\u0001\u0000\u0000\u0000\"\u015f\u0001\u0000\u0000\u0000$\u0163"+ + "\u0001\u0000\u0000\u0000&\u0169\u0001\u0000\u0000\u0000(\u0179\u0001\u0000"+ + "\u0000\u0000*\u0185\u0001\u0000\u0000\u0000,\u0189\u0001\u0000\u0000\u0000"+ + ".\u0192\u0001\u0000\u0000\u00000\u01d9\u0001\u0000\u0000\u00002\u01e4"+ + "\u0001\u0000\u0000\u00004\u01ec\u0001\u0000\u0000\u00006\u01f8\u0001\u0000"+ + "\u0000\u00008\u01fa\u0001\u0000\u0000\u0000:<\u0003\u0002\u0001\u0000"+ + ";:\u0001\u0000\u0000\u0000\u0001\u0000\u0000\u0000>@\u0001\u0000\u0000\u0000?=\u0001\u0000"+ + "\u0000\u0000@A\u0005\u0000\u0000\u0001A\u0001\u0001\u0000\u0000\u0000"+ + "Bf\u0005\u001e\u0000\u0000CG\u0005\u0015\u0000\u0000DF\u0003\u0002\u0001"+ + "\u0000ED\u0001\u0000\u0000\u0000FI\u0001\u0000\u0000\u0000GE\u0001\u0000"+ + "\u0000\u0000GH\u0001\u0000\u0000\u0000HJ\u0001\u0000\u0000\u0000IG\u0001"+ + "\u0000\u0000\u0000Jf\u0005\u0016\u0000\u0000KO\u0005\u0011\u0000\u0000"+ + "LN\u0003\u0002\u0001\u0000ML\u0001\u0000\u0000\u0000NQ\u0001\u0000\u0000"+ + "\u0000OM\u0001\u0000\u0000\u0000OP\u0001\u0000\u0000\u0000PR\u0001\u0000"+ + "\u0000\u0000QO\u0001\u0000\u0000\u0000Rf\u0005\u0012\u0000\u0000ST\u0005"+ + "\u001f\u0000\u0000Tf\u0003\u0002\u0001\u0000UW\u0005 \u0000\u0000VX\u0003"+ + "\n\u0005\u0000WV\u0001\u0000\u0000\u0000XY\u0001\u0000\u0000\u0000YW\u0001"+ + "\u0000\u0000\u0000YZ\u0001\u0000\u0000\u0000Zf\u0001\u0000\u0000\u0000"+ + "[\\\u0005\u000f\u0000\u0000\\]\u0005\u0011\u0000\u0000]^\u0003\u0010\b"+ + "\u0000^_\u0005\u0012\u0000\u0000_f\u0001\u0000\u0000\u0000`f\u0003\n\u0005"+ + "\u0000af\u0003\u0006\u0003\u0000bf\u0003\u000e\u0007\u0000cf\u00038\u001c"+ + "\u0000df\u00036\u001b\u0000eB\u0001\u0000\u0000\u0000eC\u0001\u0000\u0000"+ + "\u0000eK\u0001\u0000\u0000\u0000eS\u0001\u0000\u0000\u0000eU\u0001\u0000"+ + "\u0000\u0000e[\u0001\u0000\u0000\u0000e`\u0001\u0000\u0000\u0000ea\u0001"+ + "\u0000\u0000\u0000eb\u0001\u0000\u0000\u0000ec\u0001\u0000\u0000\u0000"+ + "ed\u0001\u0000\u0000\u0000f\u0003\u0001\u0000\u0000\u0000gk\u0005\u0011"+ + "\u0000\u0000hj\u0003\n\u0005\u0000ih\u0001\u0000\u0000\u0000jm\u0001\u0000"+ + "\u0000\u0000ki\u0001\u0000\u0000\u0000kl\u0001\u0000\u0000\u0000ln\u0001"+ + "\u0000\u0000\u0000mk\u0001\u0000\u0000\u0000n\u007f\u0005\u0012\u0000"+ + "\u0000or\u0003\n\u0005\u0000pq\u0005 \u0000\u0000qs\u0003\n\u0005\u0000"+ + "rp\u0001\u0000\u0000\u0000st\u0001\u0000\u0000\u0000tr\u0001\u0000\u0000"+ + "\u0000tu\u0001\u0000\u0000\u0000u\u007f\u0001\u0000\u0000\u0000vy\u0003"+ + "\n\u0005\u0000wx\u0005\u001f\u0000\u0000xz\u0003\n\u0005\u0000yw\u0001"+ + "\u0000\u0000\u0000z{\u0001\u0000\u0000\u0000{y\u0001\u0000\u0000\u0000"+ + "{|\u0001\u0000\u0000\u0000|\u007f\u0001\u0000\u0000\u0000}\u007f\u0003"+ + "\n\u0005\u0000~g\u0001\u0000\u0000\u0000~o\u0001\u0000\u0000\u0000~v\u0001"+ + "\u0000\u0000\u0000~}\u0001\u0000\u0000\u0000\u007f\u0005\u0001\u0000\u0000"+ + "\u0000\u0080\u0081\u0005\u0007\u0000\u0000\u0081\u0083\u0005\u0011\u0000"+ + "\u0000\u0082\u0084\u0003\u0004\u0002\u0000\u0083\u0082\u0001\u0000\u0000"+ + "\u0000\u0084\u0085\u0001\u0000\u0000\u0000\u0085\u0083\u0001\u0000\u0000"+ + "\u0000\u0085\u0086\u0001\u0000\u0000\u0000\u0086\u0087\u0001\u0000\u0000"+ + "\u0000\u0087\u0088\u0005\u0012\u0000\u0000\u0088\u008c\u0005\u0015\u0000"+ + "\u0000\u0089\u008b\u0003\u0002\u0001\u0000\u008a\u0089\u0001\u0000\u0000"+ + "\u0000\u008b\u008e\u0001\u0000\u0000\u0000\u008c\u008a\u0001\u0000\u0000"+ + "\u0000\u008c\u008d\u0001\u0000\u0000\u0000\u008d\u008f\u0001\u0000\u0000"+ + "\u0000\u008e\u008c\u0001\u0000\u0000\u0000\u008f\u00a3\u0005\u0016\u0000"+ + "\u0000\u0090\u0091\u0005\b\u0000\u0000\u0091\u0093\u0005\u0011\u0000\u0000"+ + "\u0092\u0094\u0003\u0004\u0002\u0000\u0093\u0092\u0001\u0000\u0000\u0000"+ + "\u0094\u0095\u0001\u0000\u0000\u0000\u0095\u0093\u0001\u0000\u0000\u0000"+ + "\u0095\u0096\u0001\u0000\u0000\u0000\u0096\u0097\u0001\u0000\u0000\u0000"+ + "\u0097\u0098\u0005\u0012\u0000\u0000\u0098\u009c\u0005\u0015\u0000\u0000"+ + "\u0099\u009b\u0003\u0002\u0001\u0000\u009a\u0099\u0001\u0000\u0000\u0000"+ + "\u009b\u009e\u0001\u0000\u0000\u0000\u009c\u009a\u0001\u0000\u0000\u0000"+ + "\u009c\u009d\u0001\u0000\u0000\u0000\u009d\u009f\u0001\u0000\u0000\u0000"+ + "\u009e\u009c\u0001\u0000\u0000\u0000\u009f\u00a0\u0005\u0016\u0000\u0000"+ + "\u00a0\u00a2\u0001\u0000\u0000\u0000\u00a1\u0090\u0001\u0000\u0000\u0000"+ + "\u00a2\u00a5\u0001\u0000\u0000\u0000\u00a3\u00a1\u0001\u0000\u0000\u0000"+ + "\u00a3\u00a4\u0001\u0000\u0000\u0000\u00a4\u00af\u0001\u0000\u0000\u0000"+ + "\u00a5\u00a3\u0001\u0000\u0000\u0000\u00a6\u00a7\u0005\t\u0000\u0000\u00a7"+ + "\u00ab\u0005\u0015\u0000\u0000\u00a8\u00aa\u0003\u0002\u0001\u0000\u00a9"+ + "\u00a8\u0001\u0000\u0000\u0000\u00aa\u00ad\u0001\u0000\u0000\u0000\u00ab"+ + "\u00a9\u0001\u0000\u0000\u0000\u00ab\u00ac\u0001\u0000\u0000\u0000\u00ac"+ + "\u00ae\u0001\u0000\u0000\u0000\u00ad\u00ab\u0001\u0000\u0000\u0000\u00ae"+ + "\u00b0\u0005\u0016\u0000\u0000\u00af\u00a6\u0001\u0000\u0000\u0000\u00af"+ + "\u00b0\u0001\u0000\u0000\u0000\u00b0\u0007\u0001\u0000\u0000\u0000\u00b1"+ + "\u00b2\u00034\u001a\u0000\u00b2\t\u0001\u0000\u0000\u0000\u00b3\u00c3"+ + "\u0003\u0014\n\u0000\u00b4\u00b8\u0003\f\u0006\u0000\u00b5\u00b7\u0003"+ + " \u0010\u0000\u00b6\u00b5\u0001\u0000\u0000\u0000\u00b7\u00ba\u0001\u0000"+ + "\u0000\u0000\u00b8\u00b6\u0001\u0000\u0000\u0000\u00b8\u00b9\u0001\u0000"+ + "\u0000\u0000\u00b9\u00c3\u0001\u0000\u0000\u0000\u00ba\u00b8\u0001\u0000"+ + "\u0000\u0000\u00bb\u00c3\u0003&\u0013\u0000\u00bc\u00bd\u0005\r\u0000"+ + "\u0000\u00bd\u00be\u0005\u0011\u0000\u0000\u00be\u00bf\u0003\n\u0005\u0000"+ + "\u00bf\u00c0\u0005\u0012\u0000\u0000\u00c0\u00c3\u0001\u0000\u0000\u0000"+ + "\u00c1\u00c3\u0003\b\u0004\u0000\u00c2\u00b3\u0001\u0000\u0000\u0000\u00c2"+ + "\u00b4\u0001\u0000\u0000\u0000\u00c2\u00bb\u0001\u0000\u0000\u0000\u00c2"+ + "\u00bc\u0001\u0000\u0000\u0000\u00c2\u00c1\u0001\u0000\u0000\u0000\u00c3"+ + "\u000b\u0001\u0000\u0000\u0000\u00c4\u00cc\u0003\u0012\t\u0000\u00c5\u00cc"+ + "\u0003\u0018\f\u0000\u00c6\u00cc\u0003\u001a\r\u0000\u00c7\u00cc\u0003"+ + "\u0016\u000b\u0000\u00c8\u00cc\u0003\u001c\u000e\u0000\u00c9\u00cc\u0003"+ + "\u001e\u000f\u0000\u00ca\u00cc\u0003\"\u0011\u0000\u00cb\u00c4\u0001\u0000"+ + "\u0000\u0000\u00cb\u00c5\u0001\u0000\u0000\u0000\u00cb\u00c6\u0001\u0000"+ + "\u0000\u0000\u00cb\u00c7\u0001\u0000\u0000\u0000\u00cb\u00c8\u0001\u0000"+ + "\u0000\u0000\u00cb\u00c9\u0001\u0000\u0000\u0000\u00cb\u00ca\u0001\u0000"+ + "\u0000\u0000\u00cc\r\u0001\u0000\u0000\u0000\u00cd\u00ce\u0004\u0007\u0000"+ + "\u0000\u00ce\u00cf\u0003\u0010\b\u0000\u00cf\u000f\u0001\u0000\u0000\u0000"+ + "\u00d0\u00d3\u0003.\u0017\u0000\u00d1\u00d3\u0005\u0018\u0000\u0000\u00d2"+ + "\u00d0\u0001\u0000\u0000\u0000\u00d2\u00d1\u0001\u0000\u0000\u0000\u00d3"+ + "\u00d4\u0001\u0000\u0000\u0000\u00d4\u00d5\u0005\u0005\u0000\u0000\u00d5"+ + "\u00e6\u0005\u0018\u0000\u0000\u00d6\u00d9\u0003.\u0017\u0000\u00d7\u00d9"+ + "\u0005\u0018\u0000\u0000\u00d8\u00d6\u0001\u0000\u0000\u0000\u00d8\u00d7"+ + "\u0001\u0000\u0000\u0000\u00d9\u00da\u0001\u0000\u0000\u0000\u00da\u00db"+ + "\u0005\u0005\u0000\u0000\u00db\u00dc\u0005\u0018\u0000\u0000\u00dc\u00dd"+ + "\u0005\u001c\u0000\u0000\u00dd\u00e6\u0005\u0018\u0000\u0000\u00de\u00df"+ + "\u0003&\u0013\u0000\u00df\u00e0\u0005\u0005\u0000\u0000\u00e0\u00e3\u0003"+ + "&\u0013\u0000\u00e1\u00e2\u0005\u001c\u0000\u0000\u00e2\u00e4\u0003&\u0013"+ + "\u0000\u00e3\u00e1\u0001\u0000\u0000\u0000\u00e3\u00e4\u0001\u0000\u0000"+ + "\u0000\u00e4\u00e6\u0001\u0000\u0000\u0000\u00e5\u00d2\u0001\u0000\u0000"+ + "\u0000\u00e5\u00d8\u0001\u0000\u0000\u0000\u00e5\u00de\u0001\u0000\u0000"+ + "\u0000\u00e6\u0011\u0001\u0000\u0000\u0000\u00e7\u00e9\u0005\n\u0000\u0000"+ + "\u00e8\u00ea\u0003*\u0015\u0000\u00e9\u00e8\u0001\u0000\u0000\u0000\u00e9"+ + "\u00ea\u0001\u0000\u0000\u0000\u00ea\u00eb\u0001\u0000\u0000\u0000\u00eb"+ + "\u00ed\u0005\u0017\u0000\u0000\u00ec\u00ee\u0003(\u0014\u0000\u00ed\u00ec"+ + "\u0001\u0000\u0000\u0000\u00ed\u00ee\u0001\u0000\u0000\u0000\u00ee\u0013"+ + "\u0001\u0000\u0000\u0000\u00ef\u00f0\u0005\u000e\u0000\u0000\u00f0\u00f1"+ + "\u0005\u0011\u0000\u0000\u00f1\u00f2\u0003\n\u0005\u0000\u00f2\u00f3\u0005"+ + "\u0012\u0000\u0000\u00f3\u010c\u0005\u0015\u0000\u0000\u00f4\u00f6\u0003"+ + "\n\u0005\u0000\u00f5\u00f4\u0001\u0000\u0000\u0000\u00f6\u00f7\u0001\u0000"+ + "\u0000\u0000\u00f7\u00f5\u0001\u0000\u0000\u0000\u00f7\u00f8\u0001\u0000"+ + "\u0000\u0000\u00f8\u0101\u0001\u0000\u0000\u0000\u00f9\u00fb\u0005\u0010"+ + "\u0000\u0000\u00fa\u00fc\u0003\n\u0005\u0000\u00fb\u00fa\u0001\u0000\u0000"+ + "\u0000\u00fc\u00fd\u0001\u0000\u0000\u0000\u00fd\u00fb\u0001\u0000\u0000"+ + "\u0000\u00fd\u00fe\u0001\u0000\u0000\u0000\u00fe\u0100\u0001\u0000\u0000"+ + "\u0000\u00ff\u00f9\u0001\u0000\u0000\u0000\u0100\u0103\u0001\u0000\u0000"+ + "\u0000\u0101\u00ff\u0001\u0000\u0000\u0000\u0101\u0102\u0001\u0000\u0000"+ + "\u0000\u0102\u0104\u0001\u0000\u0000\u0000\u0103\u0101\u0001\u0000\u0000"+ + "\u0000\u0104\u0106\u0005\u001c\u0000\u0000\u0105\u0107\u0003\n\u0005\u0000"+ + "\u0106\u0105\u0001\u0000\u0000\u0000\u0107\u0108\u0001\u0000\u0000\u0000"+ + "\u0108\u0106\u0001\u0000\u0000\u0000\u0108\u0109\u0001\u0000\u0000\u0000"+ + "\u0109\u010b\u0001\u0000\u0000\u0000\u010a\u00f5\u0001\u0000\u0000\u0000"+ + "\u010b\u010e\u0001\u0000\u0000\u0000\u010c\u010a\u0001\u0000\u0000\u0000"+ + "\u010c\u010d\u0001\u0000\u0000\u0000\u010d\u0128\u0001\u0000\u0000\u0000"+ + "\u010e\u010c\u0001\u0000\u0000\u0000\u010f\u0111\u0005\u0010\u0000\u0000"+ + "\u0110\u0112\u0003\n\u0005\u0000\u0111\u0110\u0001\u0000\u0000\u0000\u0112"+ + "\u0113\u0001\u0000\u0000\u0000\u0113\u0111\u0001\u0000\u0000\u0000\u0113"+ + "\u0114\u0001\u0000\u0000\u0000\u0114\u011d\u0001\u0000\u0000\u0000\u0115"+ + "\u0117\u0005\u0010\u0000\u0000\u0116\u0118\u0003\n\u0005\u0000\u0117\u0116"+ + "\u0001\u0000\u0000\u0000\u0118\u0119\u0001\u0000\u0000\u0000\u0119\u0117"+ + "\u0001\u0000\u0000\u0000\u0119\u011a\u0001\u0000\u0000\u0000\u011a\u011c"+ + "\u0001\u0000\u0000\u0000\u011b\u0115\u0001\u0000\u0000\u0000\u011c\u011f"+ + "\u0001\u0000\u0000\u0000\u011d\u011b\u0001\u0000\u0000\u0000\u011d\u011e"+ + "\u0001\u0000\u0000\u0000\u011e\u0120\u0001\u0000\u0000\u0000\u011f\u011d"+ + "\u0001\u0000\u0000\u0000\u0120\u0122\u0005\u001c\u0000\u0000\u0121\u0123"+ + "\u0003\n\u0005\u0000\u0122\u0121\u0001\u0000\u0000\u0000\u0123\u0124\u0001"+ + "\u0000\u0000\u0000\u0124\u0122\u0001\u0000\u0000\u0000\u0124\u0125\u0001"+ + "\u0000\u0000\u0000\u0125\u0127\u0001\u0000\u0000\u0000\u0126\u010f\u0001"+ + "\u0000\u0000\u0000\u0127\u012a\u0001\u0000\u0000\u0000\u0128\u0126\u0001"+ + "\u0000\u0000\u0000\u0128\u0129\u0001\u0000\u0000\u0000\u0129\u012c\u0001"+ + "\u0000\u0000\u0000\u012a\u0128\u0001\u0000\u0000\u0000\u012b\u012d\u0005"+ + "\u0010\u0000\u0000\u012c\u012b\u0001\u0000\u0000\u0000\u012c\u012d\u0001"+ + "\u0000\u0000\u0000\u012d\u012e\u0001\u0000\u0000\u0000\u012e\u012f\u0005"+ + "\u0016\u0000\u0000\u012f\u0015\u0001\u0000\u0000\u0000\u0130\u0132\u0003"+ + "*\u0015\u0000\u0131\u0130\u0001\u0000\u0000\u0000\u0131\u0132\u0001\u0000"+ + "\u0000\u0000\u0132\u0133\u0001\u0000\u0000\u0000\u0133\u0134\u0005\u0017"+ + "\u0000\u0000\u0134\u0135\u0005\u001b\u0000\u0000\u0135\u0136\u0005\u000b"+ + "\u0000\u0000\u0136\u0017\u0001\u0000\u0000\u0000\u0137\u0139\u0003*\u0015"+ + "\u0000\u0138\u0137\u0001\u0000\u0000\u0000\u0138\u0139\u0001\u0000\u0000"+ + "\u0000\u0139\u013a\u0001\u0000\u0000\u0000\u013a\u013b\u0005\u0017\u0000"+ + "\u0000\u013b\u013c\u0005\u001b\u0000\u0000\u013c\u013d\u0005\u0017\u0000"+ + "\u0000\u013d\u013e\u0003(\u0014\u0000\u013e\u0019\u0001\u0000\u0000\u0000"+ + "\u013f\u0141\u0003*\u0015\u0000\u0140\u013f\u0001\u0000\u0000\u0000\u0140"+ + "\u0141\u0001\u0000\u0000\u0000\u0141\u0142\u0001\u0000\u0000\u0000\u0142"+ + "\u0143\u0005\u0017\u0000\u0000\u0143\u0147\u0005\u001b\u0000\u0000\u0144"+ + "\u0148\u0005\u0017\u0000\u0000\u0145\u0148\u0005\u0018\u0000\u0000\u0146"+ + "\u0148\u0005\u000b\u0000\u0000\u0147\u0144\u0001\u0000\u0000\u0000\u0147"+ + "\u0145\u0001\u0000\u0000\u0000\u0147\u0146\u0001\u0000\u0000\u0000\u0148"+ + "\u0150\u0001\u0000\u0000\u0000\u0149\u014a\u0005\u0018\u0000\u0000\u014a"+ + "\u014b\u0005\u001b\u0000\u0000\u014b\u0150\u0005\u0017\u0000\u0000\u014c"+ + "\u014d\u0005\u0018\u0000\u0000\u014d\u014e\u0005\u001b\u0000\u0000\u014e"+ + "\u0150\u0005\u0018\u0000\u0000\u014f\u0140\u0001\u0000\u0000\u0000\u014f"+ + "\u0149\u0001\u0000\u0000\u0000\u014f\u014c\u0001\u0000\u0000\u0000\u0150"+ + "\u001b\u0001\u0000\u0000\u0000\u0151\u0153\u0003*\u0015\u0000\u0152\u0151"+ + "\u0001\u0000\u0000\u0000\u0152\u0153\u0001\u0000\u0000\u0000\u0153\u0154"+ + "\u0001\u0000\u0000\u0000\u0154\u0155\u0005\u0017\u0000\u0000\u0155\u0156"+ + "\u0005\u001b\u0000\u0000\u0156\u001d\u0001\u0000\u0000\u0000\u0157\u0158"+ + "\u0005\u0018\u0000\u0000\u0158\u0159\u0003 \u0010\u0000\u0159\u001f\u0001"+ + "\u0000\u0000\u0000\u015a\u015e\u0003\"\u0011\u0000\u015b\u015c\u0005\u001d"+ + "\u0000\u0000\u015c\u015e\u0005\u0017\u0000\u0000\u015d\u015a\u0001\u0000"+ + "\u0000\u0000\u015d\u015b\u0001\u0000\u0000\u0000\u015e!\u0001\u0000\u0000"+ + "\u0000\u015f\u0160\u0005\u001d\u0000\u0000\u0160\u0161\u0005\u0017\u0000"+ + "\u0000\u0161\u0162\u0003(\u0014\u0000\u0162#\u0001\u0000\u0000\u0000\u0163"+ + "\u0164\u0005\u0017\u0000\u0000\u0164\u0165\u0003(\u0014\u0000\u0165\u0166"+ + "\u0005\u001d\u0000\u0000\u0166\u0167\u0005\u0017\u0000\u0000\u0167\u0168"+ + "\u0003(\u0014\u0000\u0168%\u0001\u0000\u0000\u0000\u0169\u016a\u0005\u0017"+ + "\u0000\u0000\u016a\u016b\u0003(\u0014\u0000\u016b\'\u0001\u0000\u0000"+ + "\u0000\u016c\u016d\u0005\u0011\u0000\u0000\u016d\u0172\u0003,\u0016\u0000"+ + "\u016e\u016f\u0005\u0010\u0000\u0000\u016f\u0171\u0003,\u0016\u0000\u0170"+ + "\u016e\u0001\u0000\u0000\u0000\u0171\u0174\u0001\u0000\u0000\u0000\u0172"+ + "\u0170\u0001\u0000\u0000\u0000\u0172\u0173\u0001\u0000\u0000\u0000\u0173"+ + "\u0175\u0001\u0000\u0000\u0000\u0174\u0172\u0001\u0000\u0000\u0000\u0175"+ + "\u0176\u0005\u0012\u0000\u0000\u0176\u017a\u0001\u0000\u0000\u0000\u0177"+ + "\u0178\u0005\u0011\u0000\u0000\u0178\u017a\u0005\u0012\u0000\u0000\u0179"+ + "\u016c\u0001\u0000\u0000\u0000\u0179\u0177\u0001\u0000\u0000\u0000\u017a"+ + ")\u0001\u0000\u0000\u0000\u017b\u017d\u0005\u001a\u0000\u0000\u017c\u017b"+ + "\u0001\u0000\u0000\u0000\u017c\u017d\u0001\u0000\u0000\u0000\u017d\u0180"+ + "\u0001\u0000\u0000\u0000\u017e\u017f\u0005\u0017\u0000\u0000\u017f\u0181"+ + "\u0005\u001a\u0000\u0000\u0180\u017e\u0001\u0000\u0000\u0000\u0181\u0182"+ + "\u0001\u0000\u0000\u0000\u0182\u0180\u0001\u0000\u0000\u0000\u0182\u0183"+ + "\u0001\u0000\u0000\u0000\u0183\u0186\u0001\u0000\u0000\u0000\u0184\u0186"+ + "\u0005\u001a\u0000\u0000\u0185\u017c\u0001\u0000\u0000\u0000\u0185\u0184"+ + "\u0001\u0000\u0000\u0000\u0186+\u0001\u0000\u0000\u0000\u0187\u018a\u0003"+ + "\n\u0005\u0000\u0188\u018a\u0005\u0017\u0000\u0000\u0189\u0187\u0001\u0000"+ + "\u0000\u0000\u0189\u0188\u0001\u0000\u0000\u0000\u018a-\u0001\u0000\u0000"+ + "\u0000\u018b\u018d\u0005\u0018\u0000\u0000\u018c\u018e\u00030\u0018\u0000"+ + "\u018d\u018c\u0001\u0000\u0000\u0000\u018e\u018f\u0001\u0000\u0000\u0000"+ + "\u018f\u018d\u0001\u0000\u0000\u0000\u018f\u0190\u0001\u0000\u0000\u0000"+ + "\u0190\u0193\u0001\u0000\u0000\u0000\u0191\u0193\u00030\u0018\u0000\u0192"+ + "\u018b\u0001\u0000\u0000\u0000\u0192\u0191\u0001\u0000\u0000\u0000\u0193"+ + "/\u0001\u0000\u0000\u0000\u0194\u0198\u0005\u0013\u0000\u0000\u0195\u0197"+ + "\u00030\u0018\u0000\u0196\u0195\u0001\u0000\u0000\u0000\u0197\u019a\u0001"+ + "\u0000\u0000\u0000\u0198\u0196\u0001\u0000\u0000\u0000\u0198\u0199\u0001"+ + "\u0000\u0000\u0000\u0199\u019b\u0001\u0000\u0000\u0000\u019a\u0198\u0001"+ + "\u0000\u0000\u0000\u019b\u01da\u0005\u0014\u0000\u0000\u019c\u019d\u0005"+ + "\u0004\u0000\u0000\u019d\u01a1\u0005\u0011\u0000\u0000\u019e\u01a0\u0003"+ + "0\u0018\u0000\u019f\u019e\u0001\u0000\u0000\u0000\u01a0\u01a3\u0001\u0000"+ + "\u0000\u0000\u01a1\u019f\u0001\u0000\u0000\u0000\u01a1\u01a2\u0001\u0000"+ + "\u0000\u0000\u01a2\u01a4\u0001\u0000\u0000\u0000\u01a3\u01a1\u0001\u0000"+ + "\u0000\u0000\u01a4\u01da\u0005\u0012\u0000\u0000\u01a5\u01aa\u0005\u0013"+ + "\u0000\u0000\u01a6\u01a7\u00032\u0019\u0000\u01a7\u01a8\u0005\u001c\u0000"+ + "\u0000\u01a8\u01a9\u00030\u0018\u0000\u01a9\u01ab\u0001\u0000\u0000\u0000"+ + "\u01aa\u01a6\u0001\u0000\u0000\u0000\u01ab\u01ac\u0001\u0000\u0000\u0000"+ + "\u01ac\u01aa\u0001\u0000\u0000\u0000\u01ac\u01ad\u0001\u0000\u0000\u0000"+ + "\u01ad\u01ae\u0001\u0000\u0000\u0000\u01ae\u01af\u0005\u0014\u0000\u0000"+ + "\u01af\u01da\u0001\u0000\u0000\u0000\u01b0\u01b1\u0005\u0004\u0000\u0000"+ + "\u01b1\u01b6\u0005\u0011\u0000\u0000\u01b2\u01b3\u00032\u0019\u0000\u01b3"+ + "\u01b4\u0005\u001c\u0000\u0000\u01b4\u01b5\u00030\u0018\u0000\u01b5\u01b7"+ + "\u0001\u0000\u0000\u0000\u01b6\u01b2\u0001\u0000\u0000\u0000\u01b7\u01b8"+ + "\u0001\u0000\u0000\u0000\u01b8\u01b6\u0001\u0000\u0000\u0000\u01b8\u01b9"+ + "\u0001\u0000\u0000\u0000\u01b9\u01ba\u0001\u0000\u0000\u0000\u01ba\u01bb"+ + "\u0005\u0012\u0000\u0000\u01bb\u01da\u0001\u0000\u0000\u0000\u01bc\u01bd"+ + "\u0005\u0013\u0000\u0000\u01bd\u01c2\u00032\u0019\u0000\u01be\u01bf\u0005"+ + "\u0010\u0000\u0000\u01bf\u01c1\u00032\u0019\u0000\u01c0\u01be\u0001\u0000"+ + "\u0000\u0000\u01c1\u01c4\u0001\u0000\u0000\u0000\u01c2\u01c0\u0001\u0000"+ + "\u0000\u0000\u01c2\u01c3\u0001\u0000\u0000\u0000\u01c3\u01c6\u0001\u0000"+ + "\u0000\u0000\u01c4\u01c2\u0001\u0000\u0000\u0000\u01c5\u01c7\u0005\u0010"+ + "\u0000\u0000\u01c6\u01c5\u0001\u0000\u0000\u0000\u01c6\u01c7\u0001\u0000"+ + "\u0000\u0000\u01c7\u01c8\u0001\u0000\u0000\u0000\u01c8\u01c9\u0005\u0014"+ + "\u0000\u0000\u01c9\u01da\u0001\u0000\u0000\u0000\u01ca\u01cb\u0005\u0004"+ + "\u0000\u0000\u01cb\u01cc\u0005\u0011\u0000\u0000\u01cc\u01d1\u00032\u0019"+ + "\u0000\u01cd\u01ce\u0005\u0010\u0000\u0000\u01ce\u01d0\u00032\u0019\u0000"+ + "\u01cf\u01cd\u0001\u0000\u0000\u0000\u01d0\u01d3\u0001\u0000\u0000\u0000"+ + "\u01d1\u01cf\u0001\u0000\u0000\u0000\u01d1\u01d2\u0001\u0000\u0000\u0000"+ + "\u01d2\u01d5\u0001\u0000\u0000\u0000\u01d3\u01d1\u0001\u0000\u0000\u0000"+ + "\u01d4\u01d6\u0005\u0010\u0000\u0000\u01d5\u01d4\u0001\u0000\u0000\u0000"+ + "\u01d5\u01d6\u0001\u0000\u0000\u0000\u01d6\u01d7\u0001\u0000\u0000\u0000"+ + "\u01d7\u01d8\u0005\u0012\u0000\u0000\u01d8\u01da\u0001\u0000\u0000\u0000"+ + "\u01d9\u0194\u0001\u0000\u0000\u0000\u01d9\u019c\u0001\u0000\u0000\u0000"+ + "\u01d9\u01a5\u0001\u0000\u0000\u0000\u01d9\u01b0\u0001\u0000\u0000\u0000"+ + "\u01d9\u01bc\u0001\u0000\u0000\u0000\u01d9\u01ca\u0001\u0000\u0000\u0000"+ + "\u01da1\u0001\u0000\u0000\u0000\u01db\u01dc\u0003\n\u0005\u0000\u01dc"+ + "\u01dd\u0005\u001c\u0000\u0000\u01dd\u01de\u00030\u0018\u0000\u01de\u01e5"+ + "\u0001\u0000\u0000\u0000\u01df\u01e0\u0003\n\u0005\u0000\u01e0\u01e1\u0005"+ + "\u001c\u0000\u0000\u01e1\u01e2\u0003\n\u0005\u0000\u01e2\u01e5\u0001\u0000"+ + "\u0000\u0000\u01e3\u01e5\u0003\n\u0005\u0000\u01e4\u01db\u0001\u0000\u0000"+ + "\u0000\u01e4\u01df\u0001\u0000\u0000\u0000\u01e4\u01e3\u0001\u0000\u0000"+ + "\u0000\u01e53\u0001\u0000\u0000\u0000\u01e6\u01ed\u0003.\u0017\u0000\u01e7"+ + "\u01e9\u0005\u0019\u0000\u0000\u01e8\u01e7\u0001\u0000\u0000\u0000\u01e8"+ + "\u01e9\u0001\u0000\u0000\u0000\u01e9\u01ea\u0001\u0000\u0000\u0000\u01ea"+ + "\u01ed\u0005\u0018\u0000\u0000\u01eb\u01ed\u0005!\u0000\u0000\u01ec\u01e6"+ + "\u0001\u0000\u0000\u0000\u01ec\u01e8\u0001\u0000\u0000\u0000\u01ec\u01eb"+ + "\u0001\u0000\u0000\u0000\u01ed5\u0001\u0000\u0000\u0000\u01ee\u01ef\u0005"+ + "\n\u0000\u0000\u01ef\u01f1\u0005\u0018\u0000\u0000\u01f0\u01f2\u0003("+ + "\u0014\u0000\u01f1\u01f0\u0001\u0000\u0000\u0000\u01f1\u01f2\u0001\u0000"+ + "\u0000\u0000\u01f2\u01f9\u0001\u0000\u0000\u0000\u01f3\u01f4\u0005\n\u0000"+ + "\u0000\u01f4\u01f9\u0003*\u0015\u0000\u01f5\u01f6\u0003*\u0015\u0000\u01f6"+ + "\u01f7\u0005\u0017\u0000\u0000\u01f7\u01f9\u0001\u0000\u0000\u0000\u01f8"+ + "\u01ee\u0001\u0000\u0000\u0000\u01f8\u01f3\u0001\u0000\u0000\u0000\u01f8"+ + "\u01f5\u0001\u0000\u0000\u0000\u01f97\u0001\u0000\u0000\u0000\u01fa\u01fb"+ + "\u0005\u0006\u0000\u0000\u01fb\u01fc\u0003\n\u0005\u0000\u01fc9\u0001"+ + "\u0000\u0000\u0000A=GOYekt{~\u0085\u008c\u0095\u009c\u00a3\u00ab\u00af"+ + "\u00b8\u00c2\u00cb\u00d2\u00d8\u00e3\u00e5\u00e9\u00ed\u00f7\u00fd\u0101"+ + "\u0108\u010c\u0113\u0119\u011d\u0124\u0128\u012c\u0131\u0138\u0140\u0147"+ + "\u014f\u0152\u015d\u0172\u0179\u017c\u0182\u0185\u0189\u018f\u0192\u0198"+ + "\u01a1\u01ac\u01b8\u01c2\u01c6\u01d1\u01d5\u01d9\u01e4\u01e8\u01ec\u01f1"+ + "\u01f8"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserBaseListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserBaseListener.java new file mode 100644 index 000000000000..b90702f412bf --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserBaseListener.java @@ -0,0 +1,390 @@ +// Generated from BladePhpAntlrParser.g4 by ANTLR 4.13.0 + + package org.netbeans.modules.php.blade.syntax.antlr4.php; + + +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.tree.ErrorNode; +import org.antlr.v4.runtime.tree.TerminalNode; + +/** + * This class provides an empty implementation of {@link BladePhpAntlrParserListener}, + * which can be extended to create a listener which only needs to handle a subset + * of the available methods. + */ +@SuppressWarnings("CheckReturnValue") +public class BladePhpAntlrParserBaseListener implements BladePhpAntlrParserListener { + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterExpression(BladePhpAntlrParser.ExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitExpression(BladePhpAntlrParser.ExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterExprStatement(BladePhpAntlrParser.ExprStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitExprStatement(BladePhpAntlrParser.ExprStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterLogicalStatement(BladePhpAntlrParser.LogicalStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitLogicalStatement(BladePhpAntlrParser.LogicalStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterIfStatement(BladePhpAntlrParser.IfStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitIfStatement(BladePhpAntlrParser.IfStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterInputExpr(BladePhpAntlrParser.InputExprContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitInputExpr(BladePhpAntlrParser.InputExprContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterFunctionalExpr(BladePhpAntlrParser.FunctionalExprContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitFunctionalExpr(BladePhpAntlrParser.FunctionalExprContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterClassExpression(BladePhpAntlrParser.ClassExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitClassExpression(BladePhpAntlrParser.ClassExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterForeachDirectiveStatement(BladePhpAntlrParser.ForeachDirectiveStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitForeachDirectiveStatement(BladePhpAntlrParser.ForeachDirectiveStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterForeachArguments(BladePhpAntlrParser.ForeachArgumentsContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitForeachArguments(BladePhpAntlrParser.ForeachArgumentsContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterClassInstanceStatement(BladePhpAntlrParser.ClassInstanceStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitClassInstanceStatement(BladePhpAntlrParser.ClassInstanceStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterMatchStatement(BladePhpAntlrParser.MatchStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitMatchStatement(BladePhpAntlrParser.MatchStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterStaticClassReference(BladePhpAntlrParser.StaticClassReferenceContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitStaticClassReference(BladePhpAntlrParser.StaticClassReferenceContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterStaticMethodAccess(BladePhpAntlrParser.StaticMethodAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitStaticMethodAccess(BladePhpAntlrParser.StaticMethodAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterStaticFieldAccess(BladePhpAntlrParser.StaticFieldAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitStaticFieldAccess(BladePhpAntlrParser.StaticFieldAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterStaticAccess(BladePhpAntlrParser.StaticAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitStaticAccess(BladePhpAntlrParser.StaticAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterAliasDirectAccess(BladePhpAntlrParser.AliasDirectAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitAliasDirectAccess(BladePhpAntlrParser.AliasDirectAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterClassMember(BladePhpAntlrParser.ClassMemberContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitClassMember(BladePhpAntlrParser.ClassMemberContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterDirectMethodAccess(BladePhpAntlrParser.DirectMethodAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitDirectMethodAccess(BladePhpAntlrParser.DirectMethodAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterDirectAccess(BladePhpAntlrParser.DirectAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitDirectAccess(BladePhpAntlrParser.DirectAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterFunctionExpr(BladePhpAntlrParser.FunctionExprContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitFunctionExpr(BladePhpAntlrParser.FunctionExprContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterArguments(BladePhpAntlrParser.ArgumentsContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitArguments(BladePhpAntlrParser.ArgumentsContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterNamespace(BladePhpAntlrParser.NamespaceContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitNamespace(BladePhpAntlrParser.NamespaceContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterArgument(BladePhpAntlrParser.ArgumentContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitArgument(BladePhpAntlrParser.ArgumentContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterArray(BladePhpAntlrParser.ArrayContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitArray(BladePhpAntlrParser.ArrayContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterArray_key_item(BladePhpAntlrParser.Array_key_itemContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitArray_key_item(BladePhpAntlrParser.Array_key_itemContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterArray_child(BladePhpAntlrParser.Array_childContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitArray_child(BladePhpAntlrParser.Array_childContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterVarExpr(BladePhpAntlrParser.VarExprContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitVarExpr(BladePhpAntlrParser.VarExprContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterMisc(BladePhpAntlrParser.MiscContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitMisc(BladePhpAntlrParser.MiscContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterOutput(BladePhpAntlrParser.OutputContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitOutput(BladePhpAntlrParser.OutputContext ctx) { } + + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void visitTerminal(TerminalNode node) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void visitErrorNode(ErrorNode node) { } +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserListener.java new file mode 100644 index 000000000000..2bf230beed92 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserListener.java @@ -0,0 +1,302 @@ +// Generated from BladePhpAntlrParser.g4 by ANTLR 4.13.0 + + package org.netbeans.modules.php.blade.syntax.antlr4.php; + +import org.antlr.v4.runtime.tree.ParseTreeListener; + +/** + * This interface defines a complete listener for a parse tree produced by + * {@link BladePhpAntlrParser}. + */ +public interface BladePhpAntlrParserListener extends ParseTreeListener { + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#expression}. + * @param ctx the parse tree + */ + void enterExpression(BladePhpAntlrParser.ExpressionContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#expression}. + * @param ctx the parse tree + */ + void exitExpression(BladePhpAntlrParser.ExpressionContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#exprStatement}. + * @param ctx the parse tree + */ + void enterExprStatement(BladePhpAntlrParser.ExprStatementContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#exprStatement}. + * @param ctx the parse tree + */ + void exitExprStatement(BladePhpAntlrParser.ExprStatementContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#logicalStatement}. + * @param ctx the parse tree + */ + void enterLogicalStatement(BladePhpAntlrParser.LogicalStatementContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#logicalStatement}. + * @param ctx the parse tree + */ + void exitLogicalStatement(BladePhpAntlrParser.LogicalStatementContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#ifStatement}. + * @param ctx the parse tree + */ + void enterIfStatement(BladePhpAntlrParser.IfStatementContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#ifStatement}. + * @param ctx the parse tree + */ + void exitIfStatement(BladePhpAntlrParser.IfStatementContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#inputExpr}. + * @param ctx the parse tree + */ + void enterInputExpr(BladePhpAntlrParser.InputExprContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#inputExpr}. + * @param ctx the parse tree + */ + void exitInputExpr(BladePhpAntlrParser.InputExprContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#functionalExpr}. + * @param ctx the parse tree + */ + void enterFunctionalExpr(BladePhpAntlrParser.FunctionalExprContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#functionalExpr}. + * @param ctx the parse tree + */ + void exitFunctionalExpr(BladePhpAntlrParser.FunctionalExprContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#classExpression}. + * @param ctx the parse tree + */ + void enterClassExpression(BladePhpAntlrParser.ClassExpressionContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#classExpression}. + * @param ctx the parse tree + */ + void exitClassExpression(BladePhpAntlrParser.ClassExpressionContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#foreachDirectiveStatement}. + * @param ctx the parse tree + */ + void enterForeachDirectiveStatement(BladePhpAntlrParser.ForeachDirectiveStatementContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#foreachDirectiveStatement}. + * @param ctx the parse tree + */ + void exitForeachDirectiveStatement(BladePhpAntlrParser.ForeachDirectiveStatementContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#foreachArguments}. + * @param ctx the parse tree + */ + void enterForeachArguments(BladePhpAntlrParser.ForeachArgumentsContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#foreachArguments}. + * @param ctx the parse tree + */ + void exitForeachArguments(BladePhpAntlrParser.ForeachArgumentsContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#classInstanceStatement}. + * @param ctx the parse tree + */ + void enterClassInstanceStatement(BladePhpAntlrParser.ClassInstanceStatementContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#classInstanceStatement}. + * @param ctx the parse tree + */ + void exitClassInstanceStatement(BladePhpAntlrParser.ClassInstanceStatementContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#matchStatement}. + * @param ctx the parse tree + */ + void enterMatchStatement(BladePhpAntlrParser.MatchStatementContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#matchStatement}. + * @param ctx the parse tree + */ + void exitMatchStatement(BladePhpAntlrParser.MatchStatementContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#staticClassReference}. + * @param ctx the parse tree + */ + void enterStaticClassReference(BladePhpAntlrParser.StaticClassReferenceContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#staticClassReference}. + * @param ctx the parse tree + */ + void exitStaticClassReference(BladePhpAntlrParser.StaticClassReferenceContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#staticMethodAccess}. + * @param ctx the parse tree + */ + void enterStaticMethodAccess(BladePhpAntlrParser.StaticMethodAccessContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#staticMethodAccess}. + * @param ctx the parse tree + */ + void exitStaticMethodAccess(BladePhpAntlrParser.StaticMethodAccessContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#staticFieldAccess}. + * @param ctx the parse tree + */ + void enterStaticFieldAccess(BladePhpAntlrParser.StaticFieldAccessContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#staticFieldAccess}. + * @param ctx the parse tree + */ + void exitStaticFieldAccess(BladePhpAntlrParser.StaticFieldAccessContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#staticAccess}. + * @param ctx the parse tree + */ + void enterStaticAccess(BladePhpAntlrParser.StaticAccessContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#staticAccess}. + * @param ctx the parse tree + */ + void exitStaticAccess(BladePhpAntlrParser.StaticAccessContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#aliasDirectAccess}. + * @param ctx the parse tree + */ + void enterAliasDirectAccess(BladePhpAntlrParser.AliasDirectAccessContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#aliasDirectAccess}. + * @param ctx the parse tree + */ + void exitAliasDirectAccess(BladePhpAntlrParser.AliasDirectAccessContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#classMember}. + * @param ctx the parse tree + */ + void enterClassMember(BladePhpAntlrParser.ClassMemberContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#classMember}. + * @param ctx the parse tree + */ + void exitClassMember(BladePhpAntlrParser.ClassMemberContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#directMethodAccess}. + * @param ctx the parse tree + */ + void enterDirectMethodAccess(BladePhpAntlrParser.DirectMethodAccessContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#directMethodAccess}. + * @param ctx the parse tree + */ + void exitDirectMethodAccess(BladePhpAntlrParser.DirectMethodAccessContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#directAccess}. + * @param ctx the parse tree + */ + void enterDirectAccess(BladePhpAntlrParser.DirectAccessContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#directAccess}. + * @param ctx the parse tree + */ + void exitDirectAccess(BladePhpAntlrParser.DirectAccessContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#functionExpr}. + * @param ctx the parse tree + */ + void enterFunctionExpr(BladePhpAntlrParser.FunctionExprContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#functionExpr}. + * @param ctx the parse tree + */ + void exitFunctionExpr(BladePhpAntlrParser.FunctionExprContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#arguments}. + * @param ctx the parse tree + */ + void enterArguments(BladePhpAntlrParser.ArgumentsContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#arguments}. + * @param ctx the parse tree + */ + void exitArguments(BladePhpAntlrParser.ArgumentsContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#namespace}. + * @param ctx the parse tree + */ + void enterNamespace(BladePhpAntlrParser.NamespaceContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#namespace}. + * @param ctx the parse tree + */ + void exitNamespace(BladePhpAntlrParser.NamespaceContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#argument}. + * @param ctx the parse tree + */ + void enterArgument(BladePhpAntlrParser.ArgumentContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#argument}. + * @param ctx the parse tree + */ + void exitArgument(BladePhpAntlrParser.ArgumentContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#array}. + * @param ctx the parse tree + */ + void enterArray(BladePhpAntlrParser.ArrayContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#array}. + * @param ctx the parse tree + */ + void exitArray(BladePhpAntlrParser.ArrayContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#array_key_item}. + * @param ctx the parse tree + */ + void enterArray_key_item(BladePhpAntlrParser.Array_key_itemContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#array_key_item}. + * @param ctx the parse tree + */ + void exitArray_key_item(BladePhpAntlrParser.Array_key_itemContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#array_child}. + * @param ctx the parse tree + */ + void enterArray_child(BladePhpAntlrParser.Array_childContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#array_child}. + * @param ctx the parse tree + */ + void exitArray_child(BladePhpAntlrParser.Array_childContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#varExpr}. + * @param ctx the parse tree + */ + void enterVarExpr(BladePhpAntlrParser.VarExprContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#varExpr}. + * @param ctx the parse tree + */ + void exitVarExpr(BladePhpAntlrParser.VarExprContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#misc}. + * @param ctx the parse tree + */ + void enterMisc(BladePhpAntlrParser.MiscContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#misc}. + * @param ctx the parse tree + */ + void exitMisc(BladePhpAntlrParser.MiscContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#output}. + * @param ctx the parse tree + */ + void enterOutput(BladePhpAntlrParser.OutputContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#output}. + * @param ctx the parse tree + */ + void exitOutput(BladePhpAntlrParser.OutputContext ctx); +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrUtils.java new file mode 100644 index 000000000000..f17cfb6d5b32 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrUtils.java @@ -0,0 +1,57 @@ +/* +Licensed to the Apache Software Foundation (ASF) + */ +package org.netbeans.modules.php.blade.syntax.antlr4.php; + +import org.netbeans.modules.php.blade.syntax.antlr4.v10.*; +import java.util.List; +import java.util.Set; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.Token; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser.*; +import org.netbeans.spi.lexer.antlr4.AntlrTokenSequence; + +/** + * + * @author bogdan + */ +public class BladePhpAntlrUtils { + + public static AntlrTokenSequence lexerStringScan(String text) { + CharStream cs = CharStreams.fromString(text); + BladePhpAntlrLexer lexer = new BladePhpAntlrLexer(cs); + AntlrTokenSequence tokens = new AntlrTokenSequence(lexer); + return tokens; + } + + public static Token getToken(String text, int offset) { + AntlrTokenSequence tokens = lexerStringScan(text); + if (offset > text.length()){ + return null; + } + + if (tokens.isEmpty()){ + return null; + } + + boolean hasPrev = tokens.hasPrevious(); + + while(tokens.hasNext()){ + Token test = tokens.next().get(); + String testText = test.getText(); + int x = 1; + } + + tokens.seekTo(offset); + + if (!tokens.hasNext()){ + return null; + } + Token token = tokens.next().get(); + return token; + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpCommonLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpCommonLexer.g4 new file mode 100644 index 000000000000..b7d3ed5c17af --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpCommonLexer.g4 @@ -0,0 +1,88 @@ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +lexer grammar BladePhpCommonLexer; + +tokens { + HTML, + BLADE_COMMENT +} + +fragment Identifier + : [a-z_\u0080-\ufffe][a-z0-9_\u0080-\ufffe]*; + +fragment HtmlIdentifier + : [a-z_\u0080-\ufffe][a-z0-9_\u0080-\ufffe-]*; + +fragment ESC_DOUBLE_QUOTED_STRING + : [\\"]; + +fragment DOUBLE_QUOTED_STRING_FRAGMENT + : '"' (ESC_DOUBLE_QUOTED_STRING | . )*? '"'; + +fragment SINGLE_QUOTED_STRING_FRAGMENT + : '\'' (~('\'' | '\\') | '\\' . )* '\''; + +fragment StringLiteral : DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT; + +fragment LineComment + : '//' ~ [\r\n]* + ; + +fragment PhpVariable + : '$' Identifier; + + +fragment Digit + : ('0'..'9'); + +BLADE_COMMENT_START : '{{--' ->pushMode(INSIDE_BLADE_COMMENT), skip; + +EMAIL_SUBSTRING : ('@' Identifier '.')->skip; + +VERSION_WITH_AT: '@' (Digit '.'?)+->skip; + +//escapes +D_ESCAPES + : ( + '{{{' + | '@@' '@'? + | '@{' '{'? + | '@media' [ ]+ ('screen' [ ]+ 'and'?)? + | ( '@charset' | '@import' | '@namespace' | '@document' | '@font-face' + | '@page' | '@layer' | '@supports' | '@tailwind' | '@apply' | '@-webkit-keyframes' + | '@keyframes' | '@counter-style' | '@font-feature-values' | '@property' + | '@scope' | '@starting-style' | '@supports' | '@view-transition' + | '@container' | '@color-profile' | '@styleset' | '@font-palette-values' | '@media' + ) [ ]* + )->type(HTML); + +mode INSIDE_BLADE_COMMENT; + +BLADE_COMMENT_END : '--}}'->popMode, skip; + +//hack to merge all php inputs into one token +BLADE_COMMENT_PEEK : . { + this._input.LA(1) == '-' && + this._input.LA(2) == '-' && + this._input.LA(3) == '}' && + this._input.LA(4) == '}' + }? ->skip; +BLADE_COMMENT_MORE : . ->skip; + +BLADE_COMMENT_EOF : EOF->popMode, skip; \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpSnippetParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpSnippetParser.java new file mode 100644 index 000000000000..2d4a5f747a6d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpSnippetParser.java @@ -0,0 +1,402 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax.antlr4.php; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import javax.swing.text.Document; +import org.netbeans.modules.csl.api.Error; +import org.antlr.v4.runtime.ANTLRErrorListener; +import org.antlr.v4.runtime.BaseErrorListener; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.DefaultErrorStrategy; +import org.antlr.v4.runtime.FailedPredicateException; +import org.antlr.v4.runtime.Parser; +import org.antlr.v4.runtime.RecognitionException; +import org.antlr.v4.runtime.Recognizer; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.tree.ParseTreeListener; +import org.netbeans.editor.BaseDocument; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.csl.api.Severity; +import org.netbeans.modules.parsing.api.ParserManager; +import org.netbeans.modules.parsing.api.ResultIterator; +import org.netbeans.modules.parsing.api.Source; +import org.netbeans.modules.parsing.api.UserTask; +import org.netbeans.modules.parsing.spi.ParseException; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils.FieldAccessType; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.BladeError; +import org.netbeans.modules.php.blade.editor.parser.ParsingUtils; +import org.netbeans.modules.php.editor.parser.PHPParseResult; +import org.openide.filesystems.FileObject; +import org.openide.util.Exceptions; + +/** + * + * @author bogdan + */ +public class BladePhpSnippetParser { + + private final String snippet; + private final FileObject originFile; + private final int snippetOffset; + private final List errors = new ArrayList<>(); + private final Map identifierReference = new TreeMap<>(); + private final Map fieldAccessReference = new TreeMap<>(); + + public static final String PHP_START = " 0) { + OffsetRange range = new OffsetRange(classToken.getStartIndex(), classToken.getStopIndex() + 1); + PhpReference reference = new PhpReference(PhpReferenceType.PHP_CLASS, classToken.getText(), namespace); + identifierReference.put(range, reference); + } + } + + @Override + public void exitMisc(BladePhpAntlrParser.MiscContext ctx) { + String namespace = null; + if (ctx.namespace() != null) { + namespace = ctx.namespace().getText(); + //trim the extra \\ + namespace = namespace.substring(0, namespace.length() - 1); + OffsetRange namespaceRange = new OffsetRange(ctx.namespace().getStart().getStartIndex(), + ctx.namespace().getStop().getStopIndex()); + PhpReference reference = new PhpReference(PhpReferenceType.PHP_NAMESPACE, namespace, null); + identifierReference.put(namespaceRange, reference); + } + + Token classToken = ctx.className; + if (classToken != null && classToken.getStartIndex() > 0) { + OffsetRange range = new OffsetRange(classToken.getStartIndex(), classToken.getStopIndex() + 1); + PhpReference reference = new PhpReference(PhpReferenceType.PHP_CLASS, classToken.getText(), namespace); + identifierReference.put(range, reference); + } + } + }; + } + + public PhpReference findIdentifierReference(int offset) { + for (Map.Entry entry : identifierReference.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return entry.getValue(); + } + } + + return null; + } + + public FieldAcces findFieldAccessReference(int offset) { + for (Map.Entry entry : fieldAccessReference.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return entry.getValue(); + } + } + + return null; + } + + private final class RustANTLRErrorStrategy extends DefaultErrorStrategy { + + @Override + protected void reportFailedPredicate(Parser recognizer, FailedPredicateException e) { + + } + + @Override + public void reportError(Parser recognizer, RecognitionException e) { + if (e.getMessage() == null) { + return; + } + super.reportError(recognizer, e); + } + } + + private ANTLRErrorListener createErrorListener() { + return new BaseErrorListener() { + @Override + public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { + int errorPosition = snippetOffset; + if (offendingSymbol instanceof Token) { + Token offendingToken = (Token) offendingSymbol; + errorPosition += offendingToken.getStartIndex(); + } + errors.add(new BladeError(null, "PHP error: " + msg, null, originFile, errorPosition, errorPosition, Severity.ERROR)); + } + + }; + } + + public List getDiagnostics() { + return errors; + } + + public static class PhpReference { + + public final PhpReferenceType type; + public final String identifier; + public final PhpReference ownerClass; + public final String namespace; + + public PhpReference(PhpReferenceType type, String name) { + this.type = type; + this.identifier = name; + this.namespace = null; + this.ownerClass = null; + } + + public PhpReference(PhpReferenceType type, String name, String namespace) { + this.type = type; + this.identifier = name; + this.namespace = namespace; + this.ownerClass = null; + } + + public PhpReference(PhpReferenceType type, String name, String namespace, PhpReference ownerClass) { + this.type = type; + this.identifier = name; + this.namespace = namespace; + this.ownerClass = ownerClass; + } + } + + public static class FieldAcces { + + public final FieldAccessType type; + public final PhpReference field; + public final PhpReference owner; + + public FieldAcces(FieldAccessType type, PhpReference field, PhpReference owner) { + this.type = type; + this.field = field; + this.owner = owner; + } + + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/LexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/LexerAdaptor.java new file mode 100644 index 000000000000..3271d211556d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/LexerAdaptor.java @@ -0,0 +1,53 @@ +/* +Licensed to the Apache Software Foundation (ASF) + */ +package org.netbeans.modules.php.blade.syntax.antlr4.php; + +import org.netbeans.modules.php.blade.syntax.antlr4.v10.*; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.atn.ATN; +import org.antlr.v4.runtime.misc.Interval; + +/** + * + * @author bogdan + */ +public abstract class LexerAdaptor extends Lexer { + + private int _currentRuleType = Token.INVALID_TYPE; + public int exitIfModePosition = 0; + public boolean compomentTagOpen = false; + + public LexerAdaptor(CharStream input) { + super(input); + } + + public int getCurrentRuleType() { + return _currentRuleType; + } + + public void setCurrentRuleType(int ruleType) { + this._currentRuleType = ruleType; + } + + @Override + public Token emit() { + return super.emit(); + } + + @Override + public void reset() { + setCurrentRuleType(Token.INVALID_TYPE); + super.reset(); + } + + public void startExprLookup(){ + if (this._input.LA(1) == '('){ + this.mode(BladeAntlrLexer.INSIDE_PHP_EXPRESSION); + } else { + this.skip(); + } + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/ParserAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/ParserAdaptor.java new file mode 100644 index 000000000000..c2fe4af5844e --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/ParserAdaptor.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax.antlr4.php; + +import org.antlr.v4.runtime.Parser; +import org.antlr.v4.runtime.TokenStream; + +/** + * + * @author bogdan + */ +public abstract class ParserAdaptor extends Parser { + public static enum ParserContext { + FOREACH, + OUTPUT, + STANDARD + } + + protected ParserContext bladeParserContext = ParserContext.STANDARD; + + public ParserAdaptor(TokenStream input) { + super(input); + } + + public void setBladeParserContext(ParserContext context){ + this.bladeParserContext = context; + } + +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/utils/BaseBladeAntlrUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/utils/BaseBladeAntlrUtils.java new file mode 100644 index 000000000000..c99ae5df8122 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/utils/BaseBladeAntlrUtils.java @@ -0,0 +1,131 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax.antlr4.utils; + +import java.util.Set; +import org.antlr.v4.runtime.Token; +import org.netbeans.spi.lexer.antlr4.AntlrTokenSequence; + +/** + * + * @author bogdan + */ +public class BaseBladeAntlrUtils { + + public static Token getToken(AntlrTokenSequence tokens, int offset) { + if (tokens == null || tokens.isEmpty()) { + return null; + } + + tokens.seekTo(offset); + + if (!tokens.hasNext()) { + return null; + } + + Token token = tokens.next().get(); + + //need to move back + if (token != null && tokens.hasPrevious() && token.getStartIndex() > offset && token.getStopIndex() > offset) { + token = tokens.previous().get(); + } + + return token; + } + + public static Token findForward(AntlrTokenSequence tokens, int startOffset, + Set stopTokensText, Set openTokensText) { + if (tokens == null || tokens.isEmpty()) { + return null; + } + tokens.seekTo(startOffset); + + return findForward(tokens, stopTokensText, openTokensText); + } + + private static Token findForward(AntlrTokenSequence tokens, + Set stopTokenText, Set openTokensText) { + + int openTokenBalance = 0; + + while (tokens.hasNext()) { + Token nt = tokens.next().get(); + if (nt == null) { + continue; + } + + String tokenText = nt.getText().trim(); + + if (openTokensText.contains(tokenText)) { + openTokenBalance++; + continue; + } + if (stopTokenText.contains(tokenText)) { + if (openTokenBalance > 0) { + openTokenBalance--; + } else { + return nt; + } + } + } + return null; + } + + public static Token findBackward(AntlrTokenSequence tokens, int offset, + Set stopTokenText, Set balanceTokensText) { + + if (tokens == null || tokens.isEmpty()) { + return null; + } + + tokens.seekTo(offset); + + return findBackward(tokens, stopTokenText, balanceTokensText); + } + + private static Token findBackward(AntlrTokenSequence tokens, + Set stopTokenText, Set balanceTokensText) { + + int openTokenBalance = 0; + + while (tokens.hasPrevious()) { + Token pt = tokens.previous().get(); + if (pt == null) { + continue; + } + + String tokenText = pt.getText().trim(); + + if (balanceTokensText.contains(tokenText)) { + openTokenBalance++; + continue; + } + if (stopTokenText.contains(tokenText)) { + if (openTokenBalance > 0) { + openTokenBalance--; + } else { + return pt; + } + } + } + + return null; + } + +} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 index 759712bd0d21..5ba3ac3c2c04 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 @@ -38,112 +38,73 @@ import BladeCommonLexer; * specific language governing permissions and limitations * under the License. */ + + package org.netbeans.modules.php.blade.syntax.antlr4.v10; +} -package org.netbeans.modules.php.blade.syntax.antlr4.v10; +@lexer::members { + int rparenBalance = 0; + int sqparenBalance = 0; + int curlyparenBalance = 0; + int htmlCurlyParenBalance = 0; } options { superClass = LexerAdaptor; caseInsensitive = true; } - -tokens { - PHP_EXPRESSION, - PHP_VARIABLE, - PHP_KEYWORD, - PHP_NEW, - PHP_IDENTIFIER, - PHP_NAMESPACE_PATH, - PHP_STATIC_ACCESS, - PHP_CLASS_KEYWORD, - PHP_INSTANCE_ACCESS, - BLADE_PARAM_EXTRA, - BLADE_PARAM_LPAREN, - BLADE_PARAM_RPAREN, - BLADE_EXPR_LPAREN, - BLADE_EXPR_RPAREN, - BL_SQ_LPAREN, - BL_SQ_LRAREN, - BL_PARAM_STRING, - BL_PARAM_ASSIGN, - BL_COMMA, - BL_PARAM_COMMA, - PHP_EXPR_STRING, - ERROR -} - -channels { COMMENT, PHP_CODE } - -fragment CompomentIdentifier - : [a-z\u0080-\ufffe][a-z0-9-_.:\u0080-\ufffe]*; - -fragment CssSelector - : ('#' | '.')? [a-z\u0080-\ufffe][a-z0-9-_:\u0080-\ufffe]* | CssAttrSelector; -fragment JsFunctionStart - : NameString '(' NameString* (',' (' ')* NameString)* (' ')* ')' (' ')* ('{' { this._input.LA(1) != '{'}?)?; - -fragment StringParam - : [\\'] CssSelector ((' ')* CssSelector)* [\\'] | '"' CssSelector ((' ')* CssSelector)* [\\'] '"'; - -fragment CssAttrSelector - : '[' FullIdentifier (EQ StringAttrValue)? ']'; - -fragment StringAttrValue - : '"' FullIdentifier '"' | [\\'] FullIdentifier [\\']; -//RULES +channels {PHP_CODE} +tokens { + LPAREN, + RPAREN, + D_CUSTOM, + D_DIRECTIVE, + IDENTIFIABLE_STRING, + BLADE_CONTENT_CLOSE_TAG, + LSQUAREBRACKET, + RSQUAREBRACKET, + LCURLYBRACE, + RCURLYBRACE, + D_PHP, + COMMA, + ERROR +} //conditionals -D_IF : '@if'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); -D_ELSEIF : '@elseif'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_IF : '@if' (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}; +D_ELSEIF : '@elseif' (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}; D_ELSE : '@else'; D_ENDIF : '@endif'; -D_SWITCH : '@switch'->pushMode(LOOK_FOR_PHP_EXPRESSION); -D_CASE : '@case'->pushMode(LOOK_FOR_PHP_EXPRESSION); -D_DEFAULT : '@default'; -D_ENDSWITCH : '@endswitch'; - -D_EMPTY : '@empty'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); -D_ENDEMPTY : '@endempty'; - -D_COND_BLOCK_START : ('@unless' | '@isset')->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); -D_COND_BLOCK_END : ('@endunless' | '@endisset'); - -//loops -D_FOREACH : '@foreach'->pushMode(FOREACH_LOOP_EXPRESSION); -D_ENDFOREACH : '@endforeach'; -D_FOR : '@for'->pushMode(LOOK_FOR_PHP_EXPRESSION); -D_ENDFOR : '@endfor'; -D_FORELSE : '@forelse'->pushMode(FOREACH_LOOP_EXPRESSION); -D_ENDFORELSE : '@endforelse'; -D_WHILE : '@while'->pushMode(LOOK_FOR_PHP_EXPRESSION); -D_ENDWHILE : '@endwhile'; -D_BREAK : '@break'->pushMode(LOOK_FOR_PHP_EXPRESSION); -D_LOOP_ACTION : ('@continue')->pushMode(LOOK_FOR_PHP_EXPRESSION); -//includes -D_INCLUDE : '@include'->pushMode(LOOK_FOR_BLADE_PARAMETERS); -D_INCLUDE_IF : '@includeIf'->pushMode(LOOK_FOR_BLADE_PARAMETERS); -D_INCLUDE_WHEN : '@includeWhen'->pushMode(LOOK_FOR_BLADE_PARAMETERS); -D_INCLUDE_FIRST : '@includeFirst'->pushMode(LOOK_FOR_BLADE_PARAMETERS); -D_INCLUDE_UNLESS : '@includeUnless'->pushMode(LOOK_FOR_BLADE_PARAMETERS); -D_EACH : '@each'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_UNLESS: '@unless' (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}; +D_ENDUNLESS: '@endunless'; -//layout -D_EXTENDS : '@extends'->pushMode(LOOK_FOR_BLADE_PARAMETERS); -//from livewire (converts variable to javascript syntax) -D_JS : '@js'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_ISSET: '@isset' (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}; +D_ENDISSET: '@endisset'; -//safe json_encode -D_JSON : '@json'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_SWITCH : '@switch' (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}; +D_CASE : '@case' (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}; +D_DEFAULT : '@default'; +D_ENDSWITCH : '@endswitch'; -D_SECTION : '@section'->pushMode(LOOK_FOR_BLADE_PARAMETERS); -D_HAS_SECTION : '@hasSection'->pushMode(LOOK_FOR_BLADE_PARAMETERS); -D_SECTION_MISSING : '@sectionMissing'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +//layouts +D_EXTENDS : '@extends' (' ')* {lookupMode(PHP_EXPR_WITH_FIRST_IDENTIFIABLE_STRING);}; +D_INCLUDE : '@include' (' ')* {lookupMode(PHP_EXPR_WITH_FIRST_IDENTIFIABLE_STRING);}; +D_INCLUDE_IF : '@includeIf' (' ')* {lookupMode(PHP_EXPR_WITH_FIRST_IDENTIFIABLE_STRING);}; +D_INCLUDE_WHEN : '@includeWhen' (' ')* {this.identifierStringPos = 2; lookupMode(PHP_EXPR_WITH_CUSTOM_IDENTIFIABLE_STRING_POS);}; +D_INCLUDE_UNLESS : '@includeUnless' (' ')* {this.identifierStringPos = 2; lookupMode(PHP_EXPR_WITH_CUSTOM_IDENTIFIABLE_STRING_POS);}; +D_INCLUDE_FIRST : '@includeFirst' (' ')* {lookupMode(INCLUDE_FIRST_MODE);}; +D_EACH : '@each' (' ')* {lookupMode(PHP_EXPR_EACH);}; + +D_YIELD : '@yield' (' ')* {lookupMode(PHP_EXPR_WITH_FIRST_IDENTIFIABLE_STRING);}; +D_SECTION : '@section' (' ')* {lookupMode(PHP_EXPR_WITH_FIRST_IDENTIFIABLE_STRING);}; +D_HAS_SECTION : '@hasSection' (' ')* {lookupMode(PHP_EXPR_WITH_FIRST_IDENTIFIABLE_STRING);}; +D_SECTION_MISSING : '@sectionMissing' (' ')* {lookupMode(PHP_EXPR_WITH_FIRST_IDENTIFIABLE_STRING);}; D_ENDSECTION : '@endsection'; -D_YIELD : '@yield'->pushMode(LOOK_FOR_BLADE_PARAMETERS); + D_PARENT : '@parent'; D_SHOW : '@show'; D_OVERWRITE : '@overwrite'; @@ -151,362 +112,333 @@ D_STOP : '@stop'; D_APPEND : '@append'; D_ONCE : '@once'; D_ENDONCE : '@endonce'; -D_STACK : '@stack'->pushMode(LOOK_FOR_BLADE_PARAMETERS); -D_PUSH : '@push'->pushMode(LOOK_FOR_BLADE_PARAMETERS); + +D_STACK : '@stack' (' ')* {lookupMode(PHP_EXPR_WITH_FIRST_IDENTIFIABLE_STRING);}; +D_PUSH : '@push' (' ')* {lookupMode(PHP_EXPR_WITH_FIRST_IDENTIFIABLE_STRING);}; D_ENDPUSH : '@endpush'; -D_PUSH_IF : '@pushIf'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_PUSH_IF : '@pushIf' (' ')* {lookupMode(PHP_EXPR_WITH_FIRST_IDENTIFIABLE_STRING);}; D_ENDPUSH_IF : '@endPushIf'; -D_PUSH_ONCE : '@pushOnce'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_PUSH_ONCE : '@pushOnce' (' ')* {lookupMode(PHP_EXPR_WITH_FIRST_IDENTIFIABLE_STRING);}; D_ENDPUSH_ONCE : '@endPushOnce'; -D_PREPEND : '@prepend'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_PREPEND : '@prepend' (' ')* {lookupMode(PHP_EXPR_WITH_FIRST_IDENTIFIABLE_STRING);}; D_ENDPREPEND : '@endprepend'; -D_PROPS : '@props'->pushMode(LOOK_FOR_PHP_EXPRESSION); - -D_FRAGMENT : '@fragment'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); -D_ENDFRAGMENT : '@endfragment'; - -//forms -D_CSRF : '@csrf'; -D_METHOD : '@method'->pushMode(LOOK_FOR_PHP_EXPRESSION); -D_ERROR : '@error'->pushMode(LOOK_FOR_PHP_EXPRESSION); -D_ENDERROR : '@enderror'; -//env -D_PRODUCTION : '@production'; -D_ENDPRODUCTION : '@endproduction'; -D_ENV : '@env'->pushMode(LOOK_FOR_BLADE_PARAMETERS); -D_ENDENV : '@endenv'; -//auth and roles -D_AUTH_START : ('@auth' | '@guest')->pushMode(LOOK_FOR_BLADE_PARAMETERS); -D_AUTH_END : ('@endauth' | '@endguest'); +//loops +D_FOREACH : '@foreach' (' ')* {lookupMode(FOREACH_PHP_EXPR);}; +D_ENDFOREACH : '@endforeach'; -//lazy parser -D_PERMISSION_START : '@can' ('not' | 'any')?->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); -D_PERMISSION_ELSE : '@elsecan' ('not' | 'any')?->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); -D_PERMISSION_END : '@endcan' ('not' |'any')?; +D_FOR : '@for' (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}; +D_ENDFOR : '@endfor'; -//styles, attributes -D_CLASS : '@class'->pushMode(LOOK_FOR_PHP_EXPRESSION); -D_STYLE : '@style'->pushMode(LOOK_FOR_PHP_EXPRESSION); -D_HTML_ATTR_EXPR : ('@checked' | '@disabled' | '@readonly' | '@required' | '@selected')->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); -D_AWARE : '@aware'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_FORELSE : '@forelse' (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}; +D_ENDFORELSE : '@endforelse'; -//misc -D_BOOL : '@bool'->pushMode(LOOK_FOR_BLADE_PARAMETERS); -D_WHEN : '@when'->pushMode(LOOK_FOR_BLADE_PARAMETERS); -D_SESSION : '@session'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); -D_ENDSESSION : '@endsession'; +D_WHILE : '@while' (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}; +D_ENDWHILE : '@endwhile'; -D_DD : ('@dd' | '@dump')->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); -D_LANG : '@lang'->pushMode(LOOK_FOR_BLADE_PARAMETERS); +D_BREAK : '@break' (' ')* {flexibleMode(INSIDE_PHP_EXPRESSION);}; +D_CONTINUE : '@continue' (' ')* {flexibleMode(INSIDE_PHP_EXPRESSION);}; -//php injection -D_USE : '@use'->pushMode(LOOK_FOR_BLADE_PARAMETERS); -D_INJECT : '@inject'->pushMode(LOOK_FOR_BLADE_PARAMETERS); -D_PHP_SHORT : '@php' (' ')? {this._input.LA(1) == '('}? ->type(D_PHP),pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); -D_PHP : '@php' {this._input.LA(1) == ' ' || this._input.LA(1) == '\r' || this._input.LA(1) == '\n'}?->pushMode(BLADE_INLINE_PHP); +//context +D_EMPTY : '@empty' (' ')* {flexibleMode(INSIDE_PHP_EXPRESSION);}; +D_ENDEMPTY: '@endempty'; D_VERBATIM : '@verbatim' ->pushMode(VERBATIM_MODE); D_ENDVERBATIM : '@endverbatim'; -//known plugins -D_LIVEWIRE : '@livewireStyles' | '@bukStyles' | '@livewireScripts' | '@bukScripts' | '@livewire'; -D_ASSET_BUNDLER : '@vite'->pushMode(LOOK_FOR_PHP_COMPOSED_EXPRESSION); +D_SESSION : '@session' (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}; +D_ENDSESSION : '@endsession'; -D_MISC : '@viteReactRefresh'; +//forms +D_CSRF : '@csrf'; +D_METHOD : '@method' (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}; +D_ERROR : '@error' (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}; +D_ENDERROR : '@enderror'; -//we will decide that a custom directive has expression to avoid email matching -D_CUSTOM : ('@' NameString {this._input.LA(1) == '(' || - (this._input.LA(1) == ' ' && this._input.LA(2) == '(')}? ) ->pushMode(LOOK_FOR_BLADE_PARAMETERS); +//authentification -D_UNKNOWN_ATTR_ENC : '@' NameString {this._input.LA(1) == '"'}?; -D_UNKNOWN : '@' NameString {this._input.LA(1) != '"'}?; +D_AUTH : '@auth' (' ')* {flexibleMode(INSIDE_PHP_EXPRESSION);}; +D_ENDAUTH : '@endauth'; -//display -CONTENT_TAG_OPEN : '{{' ->pushMode(INSIDE_REGULAR_ECHO); -RAW_TAG_OPEN : '{!!' ->pushMode(INSIDE_RAW_ECHO); +D_GUEST : '@guest' (' ')* {flexibleMode(INSIDE_PHP_EXPRESSION);}; +D_ELSEGUEST : '@elseguest'; +D_ENDGUEST : '@endguest'; -AT : '@'->type(HTML); -//for completion -RAW_TAG_START : '{!'->type(HTML); +D_ENV : '@env' (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}; +D_ENDENV : '@endenv'; -PHP_INLINE_START : ('pushMode(INSIDE_PHP_INLINE); +D_PRODUCTION : '@production'; +D_ENDPRODUCTION : '@endproduction'; +//permission +D_CAN : '@can' (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}; +D_ENDCAN : '@endcan'; -HTML_COMPONENT_PREFIX : ''}? ->type(HTML_COMPONENT_PREFIX); -JS_SCRIPT : ('$'? '(' StringParam | FullIdentifier ')' ('.' NameString)? | JsFunctionStart ('.' JsFunctionStart)*) ->skip; -HTML_TAG_START : '<' FullIdentifier; -HTML_CLOSE_TAG : ('')+ ->skip; -HTML_TAG_SELF_CLOSE : '/>' {this.setComponentTagOpenStatus(false);}->type(HTML); -HTML_CLOSE_SYMBOL : '>' {this.setComponentTagOpenStatus(false);} ->type(HTML); -STRING_PATH : ('"' HTML_PATH* '"' | [\\'] HTML_PATH [\\'])->skip; -HTML_PATH : (' ')* FullIdentifier ('/' FullIdentifier)+ ('.' NameString)? ('?' NameString (EQ NameString)*)? ->skip; -HTML_TEXT : (' ')* FullIdentifier ((' ')+ FullIdentifier)+ ->skip; +D_CANNOT : '@cannot' (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}; +D_CANANY : '@canany' (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}; +D_ELSECAN : '@elsecan' ('not' | 'any')? (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}; +D_ENDCANNOT : '@endcannot'; +D_ENDCANANY : '@endcanany'; +//blocks -HTML_IDENTIFIER : FullIdentifier {this.consumeHtmlIdentifier();}; +D_FRAGMENT : '@fragment' (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}; +D_ENDFRAGMENT: '@endfragment'; -EQ : '='; -WS : ((' ')+ | [\r\n]+)->skip; -OTHER : . ->skip; +D_PHP_INLINE : '@php' (' ')* {this._input.LA(1) == '('}? ->type(D_PHP),pushMode(INSIDE_PHP_EXPRESSION); -/** -* MODES -* -*/ +D_PHP : '@php' [ \r\n] ->pushMode(BLADE_INLINE_PHP); -// {{ }} -mode INSIDE_REGULAR_ECHO; +//misc +D_SIMPLE_DIRECTIVE : ('@dd' | '@dump' | '@json' | '@style' | '@class' +| '@checked' | '@disabled' | '@selected' | '@required' | '@readonly' +| '@when' | '@bool') (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}; -REGULAR_ECHO_PHP_VAR : PhpVariable->type(PHP_VARIABLE); -REGULAR_ECHO_KEYWORD : PhpKeyword->type(PHP_KEYWORD); +D_VITE : '@vite' (' ')* {lookupMode(MIXED_STRING_AND_ARRAY_IDENTIFIER);}; +D_VITE_REFRESH : '@viteReactRefresh'; -REGULAR_PHP_NAMESPACE_PATH : ('\\'? (NameString '\\')+)->type(PHP_NAMESPACE_PATH); -REGULAR_ECHO_PHP_IDENTIFIER : NameString->type(PHP_IDENTIFIER); -REGULAR_ECHO_STATIC_ACCESS : '::'->type(PHP_STATIC_ACCESS); -CONTENT_TAG_CLOSE : ('}}')->popMode; -REGULAR_ECHO_LPAREN : '(' ->type(BLADE_EXPR_LPAREN); -REGULAR_ECHO_RPAREN : ')' ->type(BLADE_EXPR_RPAREN); -REGULAR_ECHO_INSTANCE_ACCESS : '->'->type(PHP_INSTANCE_ACCESS); +D_LANG : '@lang' {lookupMode(PHP_EXPR_WITH_FIRST_IDENTIFIABLE_STRING);}; -//not treated -REGULAR_ECHO_EXPR_MORE : . ->skip; -EXIT_REGULAR_ECHO_EOF : EOF->type(ERROR),popMode; +D_INJECT : '@inject' (' ')* {this.identifierStringPos = 2; lookupMode(PHP_EXPR_WITH_CUSTOM_IDENTIFIABLE_STRING_POS);}; +D_USE : '@use' {lookupMode(PHP_EXPR_WITH_FIRST_IDENTIFIABLE_STRING);}; -// {!! !!} -mode INSIDE_RAW_ECHO; +//spatie +D_LIVEWIRE_ARG : '@livewire' (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}->type(D_SIMPLE_DIRECTIVE); +D_LIVEWIRE : ('@livewireStyles' | '@bukStyles' | '@livewireScripts' | '@bukScripts' | '@click' ('.away')? '=')->type(D_DIRECTIVE); -RAW_ECHO_PHP_VAR : PhpVariable->type(PHP_VARIABLE); -RAW_ECHO_KEYWORD : PhpKeyword->type(PHP_KEYWORD); -RAW_ECHO_PHP_NAMESPACE_PATH : ('\\'? (NameString '\\')+)->type(PHP_NAMESPACE_PATH); -RAW_ECHO_PHP_IDENTIFIER : NameString->type(PHP_IDENTIFIER); -RAW_ECHO_STATIC_ACCESS : '::'->type(PHP_STATIC_ACCESS); -RAW_TAG_CLOSE : ('!!}')->popMode; -RAW_ECHO_LPAREN : '(' ->type(BLADE_EXPR_LPAREN); -RAW_ECHO_RPAREN : ')' ->type(BLADE_EXPR_RPAREN); -RAW_ECHO_INSTANCE_ACCESS : '->'->type(PHP_INSTANCE_ACCESS); -//NOT TREATED -RAW_ECHO_EXPR_MORE : . ->skip; -EXIT_RAW_ECHO_EOF : EOF->type(ERROR),popMode; -mode LOOK_FOR_PHP_EXPRESSION; +//extra -WS_EXPR_ESCAPE : [ ]+ {this._input.LA(1) == '@'}?->skip, popMode; -WS_EXPR : [ ]+->skip; -OPEN_EXPR_PAREN_MORE : '(' ->more,pushMode(INSIDE_PHP_EXPRESSION); +BLADE_CONTENT_OPEN_TAG : '{{' {htmlCurlyParenBalance=0;}; +BLADE_TAG_ESCAPE : '@' ('{')+->skip; +//avoid curly closing -L_OHTER_ESCAPE : . {this._input.LA(1) == '@'}?->type(HTML), popMode; -L_OTHER : . ->type(HTML), popMode; +BLADE_CONTENT_CLOSE_TAG : '}}' {this.consumeCloseTag(htmlCurlyParenBalance);} ; -//{{}}, @if, @foreach -mode INSIDE_PHP_EXPRESSION; +BLADE_RAW_OPEN_TAG : '{!!'; +BLADE_RAW_CLOSE_TAG : '!!}'; -OPEN_EXPR_PAREN : {this.getRoundParenBalance() == 0}? '(' {this.increaseRoundParenBalance();} ->more; -CLOSE_EXPR_PAREN : {this.getRoundParenBalance() == 1}? ')' - {this.decreaseRoundParenBalance();}->type(PHP_EXPRESSION),mode(DEFAULT_MODE); +D_CSS_AT : CssAtWithArg->skip; +D_CSS_AT2 : CssAtWithArg (' ')* {this._input.LA(1) == '('}?->skip; +D_CUSTOM : '@' Identifier (' ')* {this._input.LA(1) == '('}?; -LPAREN : {this.getRoundParenBalance() > 0}? '(' {this.increaseRoundParenBalance();}->more; -RPAREN : {this.getRoundParenBalance() > 0}? ')' {this.decreaseRoundParenBalance();}->more; +D_ENDCUSTOM : '@end' Identifier; +D_CUSTOM_SIMPLE : '@' Identifier ->type(D_CUSTOM); -//in case of lexer restart context -EXIT_RPAREN : ')' {this.getRoundParenBalance() == 0}?->type(PHP_EXPRESSION),mode(DEFAULT_MODE); +AT : '@' ->skip; -PHP_EXPRESSION_MORE : . ->more; +COMMA : ',' ->skip; -EXIT_EOF : EOF->type(ERROR),popMode; +//for simpler syntax on parser +LPAREN : '('->skip; +RPAREN : ')'->skip; -//@if -mode LOOK_FOR_PHP_COMPOSED_EXPRESSION; +LSQUAREBRACKET: '['->skip; +RSQUAREBRACKET: ']'->skip; -WS_COMPOSED_EXPR : [ ]+->skip; -BLADE_EXPR_LPAREN : '(' {this.resetRoundParenBalance();} ->pushMode(INSIDE_PHP_COMPOSED_EXPRESSION); +LCURLYBRACE: '{' {htmlCurlyParenBalance++;}->skip; +RCURLYBRACE: '}' {htmlCurlyParenBalance--;}->skip; -L_COMPOSED_EXPR_OTHER : . ->type(HTML), popMode; +PHP_INLINE_START : ('pushMode(INSIDE_PHP_INLINE); -//{{}}, @if, @foreach -mode INSIDE_PHP_COMPOSED_EXPRESSION; +HTML_COMPONENT_OPEN_TAG : 'type(BL_SQ_LPAREN); -EXPR_SQ_RPAREN : ']' {this.decreaseSquareParenBalance();}->type(BL_SQ_RPAREN); +WS : ((' ')+ | [\r\n]+)->skip; -EXPR_CURLY_LPAREN : '{' {this.increaseCurlyParenBalance();}->type(PHP_EXPRESSION); -EXPR_CURLY_RPAREN : '}' {this.decreaseCurlyParenBalance();}->type(PHP_EXPRESSION); +OTHER : . ->skip; -EXPR_STRING : DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT; -//EXPR_ASSIGN : '=>'->type(BL_PARAM_ASSIGN); +//========================================== +//MODES -COMPOSED_EXPR_PHP_VAR : PhpVariable->type(PHP_VARIABLE); -COMPOSED_PHP_KEYWORD : PhpKeyword->type(PHP_KEYWORD); -COMPOSED_PHP_NAMESPACE_PATH : ('\\'? (NameString '\\')+)->type(PHP_NAMESPACE_PATH); -COMPOSED_EXPR_PHP_IDENTIFIER : NameString->type(PHP_IDENTIFIER); -COMPOSED_EXPR_STATIC_ACCESS : '::'->type(PHP_STATIC_ACCESS); +mode INSIDE_PHP_EXPRESSION; -COMPOSED_EXPR_LPAREN : '(' {this.increaseRoundParenBalance();}->type(BLADE_EXPR_LPAREN); -COMPOSED_EXPR_RPAREN : ')' {consumeExprRParen();}; +START_E_LPAREN: '(' {rparenBalance == 0}? {rparenBalance++;}->type(LPAREN); +E_LPAREN: '(' {rparenBalance++;}->skip; +EXIT_E_RPAREN: ')' {rparenBalance == 1}? {rparenBalance--;} ->type(RPAREN),mode(DEFAULT_MODE); +E_RPAREN: ')' {rparenBalance--;} ->skip; -//not treated -PHP_COMPOSED_EXPRESSION : . ->skip; +E_LSQUAREBRACKET: '[' {sqparenBalance++;} ->skip; +E_RSQUAREBRACKET: ']' {sqparenBalance--;}->skip; -EXIT_COMPOSED_EXPRESSION_EOF : EOF->type(ERROR),popMode; +E_LCURLYBRACE: '{' {curlyparenBalance++;}->skip; +E_RCURLYBRACE: '}' {curlyparenBalance--;}->skip; -//@section, @include etc -mode LOOK_FOR_BLADE_PARAMETERS; +E_ARG_COMMA : ',' {rparenBalance == 1 && sqparenBalance == 0 && sqparenBalance == 0}? ->type(COMMA); -WS_BL_PARAM : [ ]+->skip; -OPEN_BL_PARAM_PAREN_MORE : '(' {this.resetRoundParenBalance();} ->type(BLADE_PARAM_LPAREN),pushMode(INSIDE_BLADE_PARAMETERS); +E_OTHER : . ->skip; -L_BL_PARAM_OTHER : . ->type(HTML), popMode; +EXIT_E_EOF : EOF->type(ERROR),mode(DEFAULT_MODE); -mode FOREACH_LOOP_EXPRESSION; +//========================================== +mode PHP_EXPR_WITH_FIRST_IDENTIFIABLE_STRING; -FOREACH_WS_EXPR : [ ]+->skip; -FOREACH_LOOP_LPAREN : '(' {this.increaseRoundParenBalance();}; -FOREACH_LOOP_RPAREN : ')' {this.decreaseRoundParenBalance(); if (this.getRoundParenBalance() == 0){this.popMode();}}; +EI_IDENTIFIABLE_STRING : (' ')* STRING_LITERAL (' ')* + {this._input.LA(1) == ',' || this._input.LA(1) == ')'}? ->type(IDENTIFIABLE_STRING),mode(INSIDE_PHP_EXPRESSION); -FOREACH_AS : 'as'; +START_EI_LPAREN: '(' {rparenBalance == 0}? {rparenBalance++;}->type(LPAREN); +EI_LPAREN: '(' {rparenBalance++;}->skip; +EXIT_EI_RPAREN: ')' {rparenBalance == 1}? {rparenBalance--;} ->type(RPAREN),mode(DEFAULT_MODE); +EI_RPAREN: ')' {rparenBalance--;} ->skip,mode(INSIDE_PHP_EXPRESSION); -FOREACH_PHP_VARIABLE : PhpVariable->type(PHP_VARIABLE); +EI_OTHER : . ->skip, mode(INSIDE_PHP_EXPRESSION); -FOREACH_PARAM_ASSIGN : '=>'; +EXIT_EI_EOF : EOF->type(ERROR),mode(DEFAULT_MODE); -LOOP_COMPOSED_PHP_KEYWORD : PhpKeyword->type(PHP_EXPRESSION); +//========================================== +mode PHP_EXPR_WITH_CUSTOM_IDENTIFIABLE_STRING_POS; -LOOP_NAME_STRING : (DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT | NameString)->type(PHP_EXPRESSION); +START_ESPOS_LPAREN: '(' {rparenBalance == 0}? {rparenBalance++; this.argCounter=1;}->type(LPAREN); +ESPOS_LPAREN: '(' {rparenBalance++;}->skip; +EXIT_ESPOS_RPAREN: ')' {rparenBalance == 1}? {rparenBalance--;} ->type(RPAREN),mode(DEFAULT_MODE); +ESPOS_RPAREN: ')' {rparenBalance--;} ->skip; -LOOP_STATIC_ACCESS : '::'->type(PHP_EXPRESSION); +ESPOS_LSQUAREBRACKET: '[' {sqparenBalance++;} ->skip; +ESPOS_RSQUAREBRACKET: ']' {sqparenBalance--;}->skip; -LOOP_PHP_EXPRESSION : . ->type(PHP_EXPRESSION); -FOREACH_EOF : EOF->type(ERROR),popMode; -//( ) -mode INSIDE_BLADE_PARAMETERS; +ESPOS_LCURLYBRACE: '{' {curlyparenBalance++;}->skip; +ESPOS_RCURLYBRACE: '}' {curlyparenBalance--;}->skip; -BL_PARAM_LINE_COMMENT : LineComment->channel(COMMENT); +ESPOS_ARG_COMMA : ',' {rparenBalance == 1 && sqparenBalance == 0 && curlyparenBalance == 0}? {this.argCounter++;} ->type(COMMA); -BL_SQ_LPAREN : '[' {this.increaseSquareParenBalance();}; -BL_SQ_RPAREN : ']' {this.decreaseSquareParenBalance();}; +ESPOS_IDENTIFIABLE_STRING : (' ')* STRING_LITERAL (' ')* + {(this._input.LA(1) == ',' || this._input.LA(1) == ')') + && this.argCounter == this.identifierStringPos }? { this.identifierStringPos = 0; } ->type(IDENTIFIABLE_STRING); -BL_CURLY_LPAREN : '{' {this.increaseCurlyParenBalance();}->type(BLADE_PARAM_EXTRA); -BL_CURLY_RPAREN : '}' {this.decreaseCurlyParenBalance();}->type(BLADE_PARAM_EXTRA); +ESPOS_OTHER : . ->skip; -BL_PARAM_LPAREN : '(' {this.increaseRoundParenBalance();}->type(BLADE_PARAM_EXTRA); -BL_PARAM_RPAREN : ')' {consumeParamRParen();}; +EXIT_ESPOS_EOF : EOF->type(ERROR),mode(DEFAULT_MODE); -BL_PARAM_STRING : DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT; +//========================================== +//@each +mode PHP_EXPR_EACH; -BL_PARAM_PHP_VARIABLE : PhpVariable->type(PHP_VARIABLE); +START_EACH_LPAREN: '(' {rparenBalance == 0}? {rparenBalance++;this.argCounter=1;}->type(LPAREN); +EACH_LPAREN: '(' {rparenBalance++;}->skip; +EXIT_EACH_RPAREN: ')' {rparenBalance == 1}? {rparenBalance--;} ->type(RPAREN),mode(DEFAULT_MODE); +EACH_RPAREN: ')' {rparenBalance--;} ->skip; -BL_PARAM_ASSIGN : '=>'; +EACH_LSQUAREBRACKET: '[' {sqparenBalance++;} ->skip; +EACH_RSQUAREBRACKET: ']' {sqparenBalance--;}->skip; -BL_PARAM_PHP_KEYWORD : PhpKeyword->type(PHP_KEYWORD); +EACH_LCURLYBRACE: '{' {curlyparenBalance++;}->skip; +EACH_RCURLYBRACE: '}' {curlyparenBalance--;}->skip; -BL_PARAM_CONCAT_OPERATOR : '.'; +EACH_ARG_COMMA : ',' {rparenBalance == 1 && sqparenBalance == 0 && sqparenBalance == 0}? {this.argCounter++;} ->type(COMMA); -BL_COMMA_EL : ',' {this.consumeBladeParamComma();}; +EACH_IDENTIFIABLE_STRING : (' ')* STRING_LITERAL (' ')* + {this.argCounter == 1 && this.identifierStringPos == 1 }? { this.identifierStringPos = 4; } ->type(IDENTIFIABLE_STRING); -BL_PARAM_WS : [ \t\r\n]+->skip; +EACH_LAST_IDENTIFIABLE_STRING : (' ')* STRING_LITERAL (' ')* + {this._input.LA(1) == ')' && this.argCounter == 4 && this.identifierStringPos == 4 }? { this.identifierStringPos = 0; } ->type(IDENTIFIABLE_STRING); -BL_NAME_STRING : NameString; +EACH_OTHER : . ->skip; -BL_PARAM_MORE : . ->type(BLADE_PARAM_EXTRA); +EXIT_EACH_EOF : EOF->type(ERROR),mode(DEFAULT_MODE); -BL_PARAM_EXIT_EOF : EOF->type(ERROR),popMode; +//========================================== +//@includeFirst +mode INCLUDE_FIRST_MODE; -//@php @endphp -mode BLADE_INLINE_PHP; +START_INCF_LPAREN: '(' {rparenBalance == 0}? {rparenBalance++;this.argCounter=1;}->type(LPAREN); +INCF_LPAREN: '(' {rparenBalance++;}->skip; +EXIT_INCF_RPAREN: ')' {rparenBalance == 1}? {rparenBalance--;} ->type(RPAREN),mode(DEFAULT_MODE); +INCF_RPAREN: ')' {rparenBalance--;} ->skip; -PHP_D_BLADE_COMMENT : ('//' ~[\n\r]+)->skip; -PHP_D_BLADE_ML_COMMENT : '/*' .*? '*/' [\n\r]*->skip; +INCF_LSQUAREBRACKET: '[' {sqparenBalance++;} ->skip; +INCF_RSQUAREBRACKET: ']' {sqparenBalance--;}->skip; -D_ENDPHP : '@endphp'->popMode; -PHP_D_UNKNOWN : '@'->type(HTML),popMode; +INCF_LCURLYBRACE: '{' {curlyparenBalance++;}->skip; +INCF_RCURLYBRACE: '}' {curlyparenBalance--;}->skip; -//hack to merge all php inputs into one token -PHP_D_EXPR_SQ_LPAREN : '[' ->type(PHP_EXPRESSION); -PHP_D_EXPR_SQ_RPAREN : ']' ->type(PHP_EXPRESSION); +INCF_ARG_COMMA : ',' {rparenBalance == 1 && sqparenBalance == 0 && curlyparenBalance == 0}? {this.argCounter++;} ->type(COMMA); -PHP_D_EXPR_CURLY_LPAREN : '{' ->type(PHP_EXPRESSION); -PHP_D_EXPR_CURLY_RPAREN : '}' ->type(PHP_EXPRESSION); +INCF_IDENTIFIABLE_STRING : (' ')* STRING_LITERAL (' ')* + {rparenBalance == 1 && sqparenBalance == 1 && this.argCounter == 1}? ->type(IDENTIFIABLE_STRING) + ; -PHP_D_EXPR_STRING : (DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT)->type(PHP_EXPR_STRING); +INCF_OTHER : . ->skip; -//EXPR_ASSIGN : '=>'->type(BL_PARAM_ASSIGN); +EXIT_INCF_EOF : EOF->type(ERROR),mode(DEFAULT_MODE); -PHP_D_COMPOSED_EXPR_PHP_VAR : PhpVariable->type(PHP_VARIABLE); -PHP_D_NEW : 'new' {this._input.LA(1) == ' '}? ->type(PHP_NEW); -PHP_D_CLASS : 'class' ->type(PHP_CLASS_KEYWORD); +//========================================== +mode MIXED_STRING_AND_ARRAY_IDENTIFIER; -PHP_D_COMPOSED_PHP_KEYWORD : PhpKeyword->type(PHP_KEYWORD); +START_MIXED_S_A_LPAREN: '(' {rparenBalance == 0}? {rparenBalance++;}->type(LPAREN); +MIXED_S_A_LPAREN: '(' {rparenBalance++;}->skip; +EXIT_MIXED_S_A_RPAREN: ')' {rparenBalance == 1}? {rparenBalance--;} ->type(RPAREN),mode(DEFAULT_MODE); +MIXED_S_A_RPAREN: ')' {rparenBalance--;} ->skip; -PHP_D_NAMESPACE_PATH : ('\\'? (NameString '\\')+)->type(PHP_NAMESPACE_PATH); +MIXED_S_A_LSQUAREBRACKET: '[' {sqparenBalance++;} ->skip; +MIXED_S_A_RSQUAREBRACKET: ']' {sqparenBalance--;}->skip; -PHP_D_COMPOSED_EXPR_PHP_CLASS_IDENTIFIER : '\\' NameString->type(PHP_IDENTIFIER); -PHP_D_COMPOSED_EXPR_PHP_IDENTIFIER : NameString->type(PHP_IDENTIFIER); -PHP_D_COMPOSED_EXPR_STATIC_ACCESS : '::'->type(PHP_STATIC_ACCESS); +MIXED_S_A_LCURLYBRACE: '{' {curlyparenBalance++;}->skip; +MIXED_S_A_RCURLYBRACE: '}' {curlyparenBalance--;}->skip; -PHP_D_COMPOSED_EXPR_LPAREN : '('->type(BLADE_EXPR_LPAREN); -PHP_D_COMPOSED_EXPR_RPAREN : ')' ->type(BLADE_EXPR_RPAREN); -PHP_D_WS : ' ' ->skip; +MIXED_S_A_ARG_COMMA : ',' {rparenBalance == 1 && sqparenBalance == 1 && curlyparenBalance == 0}? ->type(COMMA); -PHP_D_EXIT_COMPOSED_EXPRESSION_EOF : EOF->type(ERROR),popMode; +MIXED_S_A_IDENTIFIABLE_STRING : (' ')* STRING_LITERAL (' ')* + {rparenBalance == 1}? ->type(IDENTIFIABLE_STRING) + ; -//untreated -PHP_D_PHP_COMPOSED_EXPRESSION : . ->skip; +MIXED_S_A_OTHER : . ->skip; -//php inline -//might think to skip tokens which are not used ?? -mode INSIDE_PHP_INLINE; +EXIT_MIXED_S_A_EOF : EOF->type(ERROR),mode(DEFAULT_MODE); -PHP_EXIT : '?>'->popMode; +//========================================== +//@foreach expr +mode FOREACH_PHP_EXPR; -PHP_INLINE_COMMENT : ('//' ~[\n\r]+)->skip; -PHP_INLINE_ML_COMMENT : ('/*' .*? '*/')->skip; -//hack to merge all php inputs into one token -PHP_EXPR_SQ_LPAREN : '[' ->type(PHP_EXPRESSION); -PHP_EXPR_SQ_RPAREN : ']' ->type(PHP_EXPRESSION); +START_FOREACH_LPAREN: '(' {rparenBalance == 0}? {rparenBalance++;}->type(LPAREN); +FOREACH_LPAREN: '(' {rparenBalance++;}->skip; +EXIT_FOREACH_RPAREN: ')' {rparenBalance == 1}? {rparenBalance--;} ->type(RPAREN),mode(DEFAULT_MODE); +FOREACH_RPAREN: ')' {rparenBalance--;} ->skip; -PHP_EXPR_CURLY_LPAREN : '{' ->type(PHP_EXPRESSION); -PHP_EXPR_CURLY_RPAREN : '}' ->type(PHP_EXPRESSION); +FOREACH_LSQUAREBRACKET: '[' {sqparenBalance++;} ->skip; +FOREACH_RSQUAREBRACKET: ']' {sqparenBalance--;}->skip; -PHP_EXPR_STRING : (DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT)->type(PHP_EXPR_STRING); +FOREACH_LCURLYBRACE: '{' {curlyparenBalance++;}->skip; +FOREACH_RCURLYBRACE: '}' {curlyparenBalance--;}->skip; -//EXPR_ASSIGN : '=>'->type(BL_PARAM_ASSIGN); +FOREACH_VAR : '$' Identifier {rparenBalance == 1}?; //not in argument -PHP_COMPOSED_EXPR_PHP_VAR : PhpVariable->type(PHP_VARIABLE); -PHP_COMPOSED_PHP_KEYWORD : PhpKeyword->type(PHP_KEYWORD); -PHP_COMPOSED_EXPR_PHP_IDENTIFIER : NameString->type(PHP_IDENTIFIER); -PHP_COMPOSED_EXPR_STATIC_ACCESS : '::'->type(PHP_STATIC_ACCESS); -//need to implement alias access -PHP_COMPOSED_EXPR_INSTANCE_ACCESS : '->'->type(PHP_INSTANCE_ACCESS); +FOREACH_AS : 'as'; -PHP_COMPOSED_EXPR_LPAREN : '('->type(BLADE_EXPR_LPAREN); -PHP_COMPOSED_EXPR_RPAREN : ')' ->type(BLADE_EXPR_RPAREN); +FOREACH_DOUBLE_ARROW : '=>' {rparenBalance == 1 && sqparenBalance == 0 && curlyparenBalance == 0}?; +FOREACH_OTHER : . ->skip; -PHP_EXIT_COMPOSED_EXPRESSION_EOF : EOF->type(PHP_EXPRESSION),popMode; +EXIT_FOREACH_EOF : EOF->type(ERROR),mode(DEFAULT_MODE); -PHP_PHP_COMPOSED_EXPRESSION : . ->type(PHP_EXPRESSION); +//========================================== +//@php @endphp +mode BLADE_INLINE_PHP; +D_ENDPHP : '@endphp'->popMode; + +BLADE_INLINE_PHP_OTHER : . ->skip; + +EXIT_BLADE_INLINE_PHP : EOF->type(ERROR),mode(DEFAULT_MODE); + +//========================================== +//@verbatim mode VERBATIM_MODE; D_ENDVERBATIM_IN_MODE : '@endverbatim'->type(D_ENDVERBATIM), mode(DEFAULT_MODE); -//hack to merge all php inputs into one token -VERBATIM_HTML : . { - this._input.LA(1) == '@' && - this._input.LA(2) == 'e' && - this._input.LA(3) == 'n' && - this._input.LA(4) == 'd' && - this._input.LA(5) == 'v' && - this._input.LA(6) == 'e' && - this._input.LA(7) == 'r' - }? ->skip; +VERBATIM_HTML : . ->skip; EXIT_VERBATIM_MOD_EOF : EOF->type(ERROR),mode(DEFAULT_MODE); -VERBATIM_HTML_MORE : . ->more; +//========================================== +mode INSIDE_PHP_INLINE; + +PHP_INLINE_EXIT : '?>'->popMode; + +PHP_INLINE_OTHER : . ->skip; + +PHP_INLINE_EOF : EOF->mode(DEFAULT_MODE); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 index 85101ddffb97..ad1a93d5ed15 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 @@ -37,222 +37,171 @@ parser grammar BladeAntlrParser; * specific language governing permissions and limitations * under the License. */ -package org.netbeans.modules.php.blade.syntax.antlr4.v10; - -/** - * Parser generated for netbeans blade editor - * Some elements have been simplified to optimize parser speed - * For example - * - switch statement have a loos validation - * - generic block statement "@isset" | "@unless" are grouped togehter - * - the start match and end match will be checked in the parser - */ + package org.netbeans.modules.php.blade.syntax.antlr4.v10; } - + @parser::members {public static int bladeVersion = 10;} options { tokenVocab = BladeAntlrLexer; } -file : general_statement* EOF; - -general_statement: inline_statement - | block_statement - | html - ; - -inline_statement: - inline_directive - | possibleDirective - | regular_echo - | raw_echo +file : (statement)* EOF; + +statement : + blockIdentifiableArgDirective + | blockDirective + | identifiableArgDirective + | multipleArgDirective + | inlineDirective + | customDirective + | bladeContentTags + | bladeRawTags + | ('}}' | '!!}') //stray tags are possible + | errorDirectives | phpInline - ; - -inline_directive: - section_inline - | identifiableType - | stack - | includeCond - | each - | D_INCLUDE_FIRST BLADE_PARAM_LPAREN composedArgument BL_COMMA composedArgument BLADE_PARAM_RPAREN - | (D_CLASS | D_STYLE | D_METHOD | D_PROPS - | D_DD | D_JS | D_JS | D_AWARE | D_HTML_ATTR_EXPR | D_CASE | D_JSON) composed_php_expression - | (D_CSRF | D_LOOP_ACTION | D_BREAK | D_LIVEWIRE | D_DEFAULT) - | asset_bundler - | inject - //using basic inline case statement to not add complexity to parser - | D_PERMISSION_ELSE composed_php_expression - | loop_action - | D_ELSE //custom block directives? - | D_MISC - | D_WHEN doubleArgWrapperPwithFallback - | D_BOOL singleArgWrapperP - | custom_directive - ; - -block_statement: - section - | condSection - | push - | pushIf - | once_block - | prepend - | fragmentD - | if - | switch - | env_block - | empty_block - | error_block - //we can consider the statements not being empty - | conditional_block - | auth_block - //lazy parser for can - | permission - | while - | for - | foreach - | forelse - | session - | verbatim_block - | php_blade - ; - -identifiableType : d_name=(D_INCLUDE | D_INCLUDE_IF | D_EXTENDS - | D_YIELD | D_USE | D_LANG) BLADE_PARAM_LPAREN (idString = BL_PARAM_STRING | composedArgument) (BL_COMMA composedArgument)? (BL_COMMA)? BLADE_PARAM_RPAREN; -section_inline: D_SECTION doubleArgWrapperP; -section : D_SECTION singleArgWrapperP (general_statement | D_PARENT)* (D_SHOW | D_STOP | D_OVERWRITE | D_ENDSECTION | D_APPEND); -push : D_PUSH singleArgWrapperP general_statement* D_ENDPUSH; -pushOnce : D_PUSH_ONCE singleArgWrapperP general_statement* D_ENDPUSH_ONCE; -pushIf : D_PUSH_IF singleArgWrapperP general_statement* D_ENDPUSH_IF; -prepend : D_PREPEND singleArgWrapperP general_statement* D_ENDPREPEND; -fragmentD : D_FRAGMENT composed_php_expression general_statement* D_ENDFRAGMENT; - -if : D_IF main_php_expression general_statement* (D_ELSEIF main_php_expression general_statement*)* else? endif; -else : D_ELSE general_statement*; -endif: D_ENDIF; -empty_block : D_EMPTY composed_php_expression simple_conditional_stm D_ENDEMPTY; - -//the consistency for these blocks need to be checked inside the parser -conditional_block : D_COND_BLOCK_START main_php_expression simple_conditional_stm D_COND_BLOCK_END; -auth_block : D_AUTH_START (BLADE_PARAM_LPAREN (composedArgument)* BLADE_PARAM_RPAREN)* simple_conditional_stm D_AUTH_END; -env_block: (D_ENV singleArgWrapperP simple_conditional_stm D_ENDENV) | D_PRODUCTION simple_conditional_stm D_ENDPRODUCTION; -permission : D_PERMISSION_START composed_php_expression simple_conditional_stm D_PERMISSION_END; - -simple_conditional_stm : general_statement* else?; -// -error_block : D_ERROR php_expression general_statement* D_ENDERROR; - -//no need to add complexity to parser -switch: D_SWITCH php_expression (general_statement | D_BREAK)+ D_ENDSWITCH; - -//loops -while : D_WHILE php_expression (general_statement)* D_ENDWHILE; -for : D_FOR php_expression (general_statement)* D_ENDFOR; -foreach : D_FOREACH FOREACH_LOOP_LPAREN loop_expression FOREACH_LOOP_RPAREN (general_statement)* D_ENDFOREACH; -forelse : D_FORELSE FOREACH_LOOP_LPAREN loop_expression FOREACH_LOOP_RPAREN (general_statement | D_EMPTY)* D_ENDFORELSE; - -//misc block -session : D_SESSION composed_php_expression general_statement* D_ENDSESSION; - -//layout -stack : D_STACK singleArgWrapperP; -asset_bundler : d_name=D_ASSET_BUNDLER BLADE_EXPR_LPAREN (BL_SQ_LPAREN id_strings=EXPR_STRING+ BL_SQ_RPAREN dir=EXPR_STRING? | id_string=EXPR_STRING | composed_php_expression+) BLADE_EXPR_RPAREN; -inject : D_INJECT BLADE_PARAM_LPAREN composedArgument BL_COMMA (identifiableArgument | composedArgument) BLADE_PARAM_RPAREN; - -includeCond : d_name=(D_INCLUDE_WHEN | D_INCLUDE_UNLESS) BLADE_PARAM_LPAREN - composedArgument - BL_COMMA - (idString=BL_PARAM_STRING | composedArgument) - (BL_COMMA composedArgument)? - BLADE_PARAM_RPAREN; - -each : D_EACH BLADE_PARAM_LPAREN - (idString=BL_PARAM_STRING | composedArgument) //default path - BL_COMMA - composedArgument - BL_COMMA - composedArgument - (BL_COMMA - (identifiableArgument | composedArgument))? //fallback - BLADE_PARAM_RPAREN; + | D_ENDCUSTOM + | htmlComponentOpenTag +; -once_block : D_ONCE general_statement+ D_ENDONCE; -condSection : (D_SECTION_MISSING | D_HAS_SECTION) singleArgWrapperP simple_conditional_stm D_ENDIF; +blockDirective : + ifStatement + | foreachStatement + | forStatement + | forElseStatement + | D_WHILE directiveArguments (statement | loopBreaks)* D_ENDWHILE + | switchStatement + | formStatements + | authStatements + | D_ONCE directiveArguments? statement* D_ENDONCE + | D_UNLESS directiveArguments statement* D_ENDUNLESS + | D_EMPTY directiveArguments statement* D_ENDEMPTY + | D_ISSET directiveArguments statement* D_ENDISSET + | D_SESSION directiveArguments statement* D_ENDSESSION + //permission + | D_CAN directiveArguments statement* (D_ELSECAN directiveArguments statement*)* (D_ELSE statement*)? D_ENDCAN + | D_CANNOT directiveArguments statement* (D_ELSECAN directiveArguments statement*)* (D_ELSE statement*)? D_ENDCANNOT + | D_CANANY directiveArguments statement* (D_ELSECAN directiveArguments statement*)* (D_ELSE statement*)? D_ENDCANANY + | bladePhpBlock + //x.11 + | D_FRAGMENT directiveArguments statement* D_ENDFRAGMENT + | D_VERBATIM D_ENDVERBATIM + | D_ELSE statement* D_ENDCUSTOM -custom_directive : D_CUSTOM ((BLADE_PARAM_LPAREN BLADE_PARAM_RPAREN) | multiArgWrapper ) ; -possibleDirective : D_UNKNOWN | D_UNKNOWN_ATTR_ENC; - -php_blade : D_PHP composed_php_expression* D_ENDPHP | D_PHP main_php_expression; +ifStatement : ifStartStatement + (elseifStatement | statement | loopBreaks)* + (D_ELSE (statement | loopBreaks)*)? + D_ENDIF; -phpInline : PHP_INLINE_START composed_php_expression+ (PHP_EXIT | EOF); -//echo +foreachStatement : D_FOREACH foreachLoopArguments + (statement | loopBreaks)* D_ENDFOREACH; -regular_echo : CONTENT_TAG_OPEN echo_expr* CONTENT_TAG_CLOSE; -raw_echo : RAW_TAG_OPEN echo_expr* RAW_TAG_CLOSE; +forStatement : D_FOR directiveArguments + (statement | loopBreaks)* D_ENDFOR; -echo_expr : composed_php_expression; +forElseStatement : D_FORELSE directiveArguments (statement | loopBreaks)* + D_EMPTY statement* D_ENDFORELSE; -class_expr_usage: class_name_reference -| object_alias_static_access -| object_alias_direct_access -| static_direct_class_access -| static_direct_namespace_class_access -| class_instance; +ifStartStatement : D_IF directiveArguments; +elseifStatement: D_ELSEIF directiveArguments statement*; -object_alias_static_access : alias_name=PHP_VARIABLE PHP_STATIC_ACCESS static_property=PHP_IDENTIFIER; -object_alias_direct_access : alias_name=PHP_VARIABLE PHP_INSTANCE_ACCESS property=PHP_IDENTIFIER; -static_direct_class_access : class_name=PHP_IDENTIFIER PHP_STATIC_ACCESS - func_name=PHP_IDENTIFIER BLADE_EXPR_LPAREN composed_php_expression* BLADE_EXPR_RPAREN - | class_name=PHP_IDENTIFIER PHP_STATIC_ACCESS static_property=PHP_IDENTIFIER +switchStatement : + D_SWITCH directiveArguments + (D_CASE directiveArguments statement* D_BREAK?)* + (D_DEFAULT statement*)? + D_ENDSWITCH ; -static_direct_namespace_class_access : namespace=PHP_NAMESPACE_PATH? class_name=PHP_IDENTIFIER PHP_STATIC_ACCESS - func_name=PHP_IDENTIFIER BLADE_EXPR_LPAREN composed_php_expression* BLADE_EXPR_RPAREN - | namespace=PHP_NAMESPACE_PATH? class_name=PHP_IDENTIFIER PHP_STATIC_ACCESS static_property=PHP_IDENTIFIER + +bladePhpBlock : + D_PHP D_ENDPHP ; -class_instance : PHP_NEW (namespace=PHP_NAMESPACE_PATH? class_name=PHP_IDENTIFIER) BLADE_EXPR_LPAREN composed_php_expression* BLADE_EXPR_RPAREN; -class_name_reference : namespace=PHP_NAMESPACE_PATH? class_name=PHP_IDENTIFIER PHP_STATIC_ACCESS PHP_CLASS_KEYWORD; +// +inlineDirective: + D_SIMPLE_DIRECTIVE directiveArguments + | D_PHP directiveArguments + | D_DIRECTIVE + | D_VITE_REFRESH +; -namespacePath : namespace=PHP_NAMESPACE_PATH? class_name=PHP_IDENTIFIER; +identifiableArgDirective : + D_SECTION '(' IDENTIFIABLE_STRING? ',' ')' + | D_EXTENDS '(' IDENTIFIABLE_STRING? (',')? ')' + | (D_INCLUDE | D_INCLUDE_IF) '(' IDENTIFIABLE_STRING? (',')? ')' + | (D_INCLUDE_WHEN | D_INCLUDE_UNLESS) '(' ',' IDENTIFIABLE_STRING? (',')? ')' + | D_YIELD '(' IDENTIFIABLE_STRING? ','? ')' + | D_STACK '(' IDENTIFIABLE_STRING? ')' + | D_LANG '(' IDENTIFIABLE_STRING? ','? ')' + | D_INJECT '(' ',' IDENTIFIABLE_STRING? ')' + | D_USE '(' IDENTIFIABLE_STRING? (',')? ')' +; -function_call : func_name=PHP_IDENTIFIER BLADE_EXPR_LPAREN composed_php_expression* BLADE_EXPR_RPAREN; +multipleArgDirective : + D_EACH '(' IDENTIFIABLE_STRING? ',' ',' (',' IDENTIFIABLE_STRING?)? ')' + | D_INCLUDE_FIRST '(' IDENTIFIABLE_STRING* (',')? ')' + | D_VITE '(' IDENTIFIABLE_STRING? (',' IDENTIFIABLE_STRING?)* ')' +; -php_expression: PHP_EXPRESSION; -loop_expression : simple_foreach_expr -| (PHP_VARIABLE | PHP_EXPRESSION | FOREACH_PARAM_ASSIGN | FOREACH_LOOP_LPAREN | FOREACH_LOOP_RPAREN | FOREACH_AS)+ //complex expression (lazy handling) +blockIdentifiableArgDirective : + D_SECTION '(' IDENTIFIABLE_STRING? ')' D_PARENT? statement* D_PARENT? (D_SHOW | D_STOP | D_OVERWRITE | D_ENDSECTION | D_APPEND) + | D_HAS_SECTION '(' IDENTIFIABLE_STRING? ')' statement* D_ENDIF + | D_SECTION_MISSING '(' IDENTIFIABLE_STRING? ')' statement* D_ENDIF + | D_PUSH '(' IDENTIFIABLE_STRING? ')' statement* D_ENDPUSH + | D_PUSH_IF '(' IDENTIFIABLE_STRING? ',' ')' statement* D_ENDPUSH_IF + | D_PUSH_ONCE '(' IDENTIFIABLE_STRING? ')' statement* D_ENDPUSH_ONCE + | D_PREPEND '(' IDENTIFIABLE_STRING? ')' statement* D_ENDPREPEND +; + +directiveWithArg : + D_EXTENDS + | D_INCLUDE + | D_YIELD ; -main_php_expression : BLADE_EXPR_LPAREN composed_php_expression+ BLADE_EXPR_RPAREN; +customDirective : + D_CUSTOM directiveArguments?; -composed_php_expression : class_expr_usage | function_call | PHP_IDENTIFIER | namespacePath | PHP_VARIABLE -| PHP_NAMESPACE_PATH | EXPR_STRING | - PHP_KEYWORD | PHP_EXPRESSION+ | PHP_STATIC_ACCESS | PHP_CLASS_KEYWORD -| PHP_INSTANCE_ACCESS | BL_SQ_LPAREN composed_php_expression* BL_SQ_RPAREN | BLADE_EXPR_LPAREN composed_php_expression* BLADE_EXPR_RPAREN | PHP_EXPR_STRING; +loopBreaks : + (D_CONTINUE | D_BREAK) directiveArguments?; -simple_foreach_expr: loop_array=PHP_VARIABLE FOREACH_AS key=PHP_VARIABLE (FOREACH_PARAM_ASSIGN item=PHP_VARIABLE)?; -singleArgWrapperP: BLADE_PARAM_LPAREN (idString=BL_PARAM_STRING | composedArgument) BLADE_PARAM_RPAREN; -doubleArgWrapperP: BLADE_PARAM_LPAREN (idString=BL_PARAM_STRING | composedArgument) BL_COMMA composedArgument BLADE_PARAM_RPAREN; -doubleArgWrapperPwithFallback: BLADE_PARAM_LPAREN composedArgument BL_COMMA composedArgument (BL_COMMA composedArgument)? BLADE_PARAM_RPAREN; -multiArgWrapper : BLADE_PARAM_LPAREN (composedArgument) (BL_COMMA composedArgument)* BLADE_PARAM_RPAREN; +formStatements: + D_ERROR '(' ','? ')' statement* (D_ELSE statement*)? D_ENDERROR + | D_CSRF + | D_METHOD directiveArguments + ; -identifiableArgument : BL_PARAM_STRING; -composedArgument : (phpExpr)+ ; +authStatements: + D_AUTH directiveArguments? statement* ((D_ELSEGUEST | D_ELSE) statement*)? D_ENDAUTH + | D_GUEST directiveArguments? statement* D_ENDGUEST + | D_ENV directiveArguments statement* D_ENDENV + | D_PRODUCTION statement* D_ENDPRODUCTION +; + +bladeContentTags: + '{{' '}}' +; -phpExpr : identifiableArray | arrayDefine | BLADE_PARAM_EXTRA | PHP_VARIABLE | PHP_KEYWORD | BL_PARAM_CONCAT_OPERATOR | BL_PARAM_STRING | BL_PARAM_ASSIGN | BL_NAME_STRING | BL_PARAM_COMMA; +bladeRawTags: + '{!!' '!!}' +; -//['key' => $value] -identifiableArray : BL_SQ_LPAREN paramAssign (BL_PARAM_COMMA paramAssign)* BL_PARAM_COMMA? BL_SQ_RPAREN; -arrayDefine : BL_SQ_LPAREN phpExpr+ BL_SQ_RPAREN -| BL_SQ_LPAREN BL_SQ_RPAREN; +errorDirectives: + directiveWithArg '(' {notifyErrorListeners("Missing closing ')'");} + | D_IF directiveArguments {notifyErrorListeners("Syntax error, expecting @elseif or @else or @endif");} + | ( D_FOREACH foreachLoopArguments | D_FOR directiveArguments ) {notifyErrorListeners("Unclosed block directive");} + | D_VERBATIM {notifyErrorListeners("Unclosed verbatim block");} + | D_SECTION '(' IDENTIFIABLE_STRING? ')' {notifyErrorListeners("Inline @section requires second argument");} +; -paramAssign : BL_PARAM_STRING BL_PARAM_ASSIGN (PHP_VARIABLE | PHP_KEYWORD | BL_PARAM_STRING); -verbatim_block : D_VERBATIM D_ENDVERBATIM; +directiveArguments : + '(' ','* ')'; -loop_action : (D_LOOP_ACTION | D_BREAK) php_expression?; +foreachLoopArguments : '(' main_array=FOREACH_VAR 'as' array_item=FOREACH_VAR (FOREACH_DOUBLE_ARROW array_value=FOREACH_VAR)? ')' + | '(' (FOREACH_VAR)* 'as' (FOREACH_VAR)* (FOREACH_DOUBLE_ARROW FOREACH_VAR*)? ')';//unscanable loop +phpInline: + PHP_INLINE_START phpInlineEnd=(PHP_INLINE_EXIT | EOF); -//html -html : HTML+ | HTML_COMPONENT_PREFIX | HTML_TAG_START | EQ | HTML_IDENTIFIER; +htmlComponentOpenTag: + HTML_COMPONENT_OPEN_TAG; \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java deleted file mode 100644 index 181cf362d0ce..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrUtils.java +++ /dev/null @@ -1,292 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.syntax.antlr4.v10; - -import java.util.List; -import java.util.Set; -import javax.swing.text.BadLocationException; -import javax.swing.text.Document; -import org.antlr.v4.runtime.CharStreams; -import org.antlr.v4.runtime.Token; -import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser.*; -import org.netbeans.spi.lexer.antlr4.AntlrTokenSequence; - -/** - * - * @author bogdan - */ -public final class BladeAntlrUtils { - - private BladeAntlrUtils() { - - } - - public static AntlrTokenSequence getTokens(Document doc) { - - try { - String text = doc.getText(0, doc.getLength()); - return new AntlrTokenSequence(new BladeAntlrLexer(CharStreams.fromString(text))); - } catch (BadLocationException ex) { - - } - return null; - } - - public static Token getToken(Document doc, int offset) { - AntlrTokenSequence tokens = getTokens(doc); - if (tokens == null || tokens.isEmpty()) { - return null; - } - - tokens.seekTo(offset); - - if (!tokens.hasNext()) { - return null; - } - - Token token = tokens.next().get(); - - //need to move back - if (token != null && tokens.hasPrevious() && token.getStartIndex() > offset && token.getStopIndex() > offset) { - token = tokens.previous().get(); - } - - return token; - } - - public static Token findForward(Document doc, Token start, - Set stopTokenText, Set openTokensText) { - - AntlrTokenSequence tokens = getTokens(doc); - - if (tokens == null || tokens.isEmpty()) { - return null; - } - - tokens.seekTo(start.getStopIndex() + 1); - - int openTokenBalance = 0; - - while (tokens.hasNext()) { - Token nt = tokens.next().get(); - if (nt == null) { - continue; - } - - String tokenText = nt.getText(); - - if (openTokensText.contains(tokenText)) { - openTokenBalance++; - continue; - } - if (stopTokenText.contains(tokenText)) { - if (openTokenBalance > 0) { - openTokenBalance--; - } else { - return nt; - } - } - } - - return null; - } - - public static Token findForward(AntlrTokenSequence tokens, - List tokensMatch, List tokensStop) { - - while (tokens.hasNext()) { - Token pt = tokens.next().get(); - if (pt == null) { - continue; - } - - if (tokensMatch.contains(pt.getType())) { - return pt; - } - - if (tokensStop.contains(pt.getType())) { - return null; - } - } - - return null; - } - - public static Token findBackward(Document doc, Token start, - Set stopTokenText, Set openTokensText) { - - AntlrTokenSequence tokens = getTokens(doc); - - if (tokens == null || tokens.isEmpty()) { - return null; - } - - tokens.seekTo(start.getStartIndex() - 1); - - int openTokenBalance = 0; - - while (tokens.hasPrevious()) { - Token pt = tokens.previous().get(); - if (pt == null) { - continue; - } - - String tokenText = pt.getText(); - - if (openTokensText.contains(tokenText)) { - openTokenBalance++; - continue; - } - if (stopTokenText.contains(tokenText)) { - if (openTokenBalance > 0) { - openTokenBalance--; - } else { - return pt; - } - } - } - - return null; - } - - public static Token findBackward(AntlrTokenSequence tokens, - Set tokensMatch, Set tokensStop) { - - while (tokens.hasPrevious()) { - Token pt = tokens.previous().get(); - if (pt == null) { - continue; - } - - if (tokensMatch.contains(pt.getType())) { - return pt; - } - - if (tokensStop.contains(pt.getType())) { - return null; - } - } - - return null; - } - - public static Token findForwardWithStop(Document doc, Token start, - int tokensMatch, Set stopTokens) { - AntlrTokenSequence tokens = getTokens(doc); - - if (tokens == null || tokens.isEmpty()) { - return null; - } - - tokens.seekTo(start.getStopIndex() + 1); - - while (tokens.hasNext()) { - Token pt = tokens.next().get(); - if (pt == null) { - continue; - } - - if (pt.getType() == tokensMatch) { - return pt; - } - - if (stopTokens.contains(pt.getType())) { - return null; - } - } - - return null; - - } - - public static Token findBackward(Document doc, Token start, - int tokensMatch, Set skipableTokens) { - AntlrTokenSequence tokens = getTokens(doc); - - if (tokens == null || tokens.isEmpty()) { - return null; - } - - tokens.seekTo(start.getStartIndex() - 1); - - while (tokens.hasPrevious()) { - Token pt = tokens.previous().get(); - if (pt == null) { - continue; - } - - if (pt.getType() == tokensMatch) { - return pt; - } - - if (skipableTokens.contains(pt.getType())) { - continue; - } - - return null; - } - - return null; - - } - - public static Token findBackwardWithStop(Document doc, Token start, - int tokensMatch, Set stopTokens) { - AntlrTokenSequence tokens = getTokens(doc); - - if (tokens == null || tokens.isEmpty()) { - return null; - } - - tokens.seekTo(start.getStartIndex() - 1); - - while (tokens.hasPrevious()) { - Token pt = tokens.previous().get(); - if (pt == null) { - continue; - } - - if (pt.getType() == tokensMatch) { - return pt; - } - - if (stopTokens.contains(pt.getType())) { - return null; - } - } - - return null; - - } - - public static int getTagPairTokenType(int tokenType) { - switch (tokenType) { - case CONTENT_TAG_OPEN: - return CONTENT_TAG_CLOSE; - case CONTENT_TAG_CLOSE: - return CONTENT_TAG_OPEN; - case RAW_TAG_OPEN: - return RAW_TAG_CLOSE; - case RAW_TAG_CLOSE: - return RAW_TAG_OPEN; - default: - return -1; - } - } -} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java index 13e667c3021e..a8a92e67136b 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/LexerAdaptor.java @@ -20,7 +20,6 @@ import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.Lexer; -import org.antlr.v4.runtime.Token; /** * @@ -28,128 +27,39 @@ */ public abstract class LexerAdaptor extends Lexer { - private int _currentRuleType = Token.INVALID_TYPE; - private int roundParenBalance = 0; - private int squareParenBalance = 0; - private int curlyParenBalance = 0; - private boolean compomentTagOpen = false; + public int exitIfModePosition = 0; + public boolean compomentTagOpen = false; + public int identifierStringPos = 1; + public int argCounter = 1; public LexerAdaptor(CharStream input) { super(input); } - - public int getCurrentRuleType() { - return _currentRuleType; - } - - public void setCurrentRuleType(int ruleType) { - this._currentRuleType = ruleType; - } - - @Override - public Token emit() { - return super.emit(); - } - - @Override - public void reset() { - setCurrentRuleType(Token.INVALID_TYPE); - super.reset(); - } - - public int getRoundParenBalance(){ - return this.roundParenBalance; - } - - public void resetRoundParenBalance(){ - this.roundParenBalance = 0; - } - - public void increaseRoundParenBalance() { - this.roundParenBalance++; - } - - public void decreaseRoundParenBalance() { - this.roundParenBalance--; - } - - public int getSquareParenBalance(){ - return this.squareParenBalance; - } - public void increaseSquareParenBalance() { - this.squareParenBalance++; - } - - public void decreaseSquareParenBalance() { - this.squareParenBalance--; - } - - public void increaseCurlyParenBalance() { - this.curlyParenBalance++; - } - - public void decreaseCurlyParenBalance() { - this.curlyParenBalance--; - } - - public boolean hasNoBladeParamOpenBracket() { - return this.roundParenBalance == 0 - && this.squareParenBalance == 0 - && this.curlyParenBalance == 0; - } - - public void consumeBladeParamComma(){ - if (this.hasNoBladeParamOpenBracket()){ - this.setType(BladeAntlrLexer.BL_COMMA); + public void lookupMode(int mode){ + if (this._input.LA(1) == '('){ + this.mode(mode); } else { - this.setType(BladeAntlrLexer.BL_PARAM_COMMA); + this.resetIdentifierStringPos(); + this.skip(); } } - public void consumeRParen(){ - //we start from 0 balance - this.roundParenBalance--; - if (this.roundParenBalance < 0) { - this.roundParenBalance = 0; - this.setType(BladeAntlrLexer.BLADE_PARAM_RPAREN); - this.mode(DEFAULT_MODE); - } else { - this.setType(BladeAntlrLexer.BLADE_PARAM_EXTRA); - } - } - - public void consumeParamRParen(){ - //we start from 0 balance - this.roundParenBalance--; - if (this.roundParenBalance < 0) { - this.roundParenBalance = 0; - this.setType(BladeAntlrLexer.BLADE_PARAM_RPAREN); - this.mode(DEFAULT_MODE); - } else { - this.setType(BladeAntlrLexer.BLADE_PARAM_EXTRA); + public void flexibleMode(int mode){ + if (this._input.LA(1) == '('){ + this.mode(mode); } } - public void consumeExprRParen(){ - //we start from 0 balance - this.roundParenBalance--; - this.setType(BladeAntlrLexer.BLADE_EXPR_RPAREN); - if (this.roundParenBalance < 0) { - this.roundParenBalance = 0; - this.mode(DEFAULT_MODE); - } - } - - public void setComponentTagOpenStatus(boolean status){ - this.compomentTagOpen = status; + public void resetIdentifierStringPos(){ + this.identifierStringPos = 1; } - public void consumeHtmlIdentifier(){ - if (this.compomentTagOpen == true) { - this.setType(BladeAntlrLexer.HTML_IDENTIFIER); + public void consumeCloseTag(int curlyBalance){ + if (curlyBalance == 0) { + this.setType(BladeAntlrLexer.BLADE_CONTENT_CLOSE_TAG); } else { - this.setType(BladeAntlrLexer.HTML); + this.skip(); } } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/php/PhpKeywordList.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/php/PhpKeywordList.java new file mode 100644 index 000000000000..49cf02c8b0a6 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/php/PhpKeywordList.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax.php; + +import org.netbeans.modules.php.blade.syntax.annotation.PhpKeyword; +import org.netbeans.modules.php.blade.syntax.annotation.PhpKeywordRegister; + +/** + * + * @author bogdan + */ +@PhpKeywordRegister({ + //conditionals + @PhpKeyword(name = "empty", parenExpr = true), + @PhpKeyword(name = "isset", parenExpr = true), + @PhpKeyword(name = "class"), + @PhpKeyword(name = "echo"), +}) +public class PhpKeywordList { + + public PhpKeyword[] getKeywords() { + PhpKeywordRegister register = this.getClass().getAnnotation(PhpKeywordRegister.class); + return register.value(); + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcherTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/braces/BladeBracesMatcherTest.java similarity index 97% rename from php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcherTest.java rename to php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/braces/BladeBracesMatcherTest.java index 388278f124d6..7f5893e688ff 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/BladeBracesMatcherTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/braces/BladeBracesMatcherTest.java @@ -16,13 +16,14 @@ * specific language governing permissions and limitations * under the License. */ -package org.netbeans.modules.php.blade.editor; +package org.netbeans.modules.php.blade.editor.braces; import java.util.Arrays; import java.util.Collections; import org.netbeans.api.editor.mimelookup.MimeLookup; import org.netbeans.editor.BaseDocument; import org.netbeans.modules.editor.bracesmatching.api.BracesMatchingTestUtils; +import org.netbeans.modules.php.blade.editor.BladeTestBase; import org.netbeans.spi.editor.bracesmatching.BracesMatcher; import org.netbeans.spi.editor.bracesmatching.BracesMatcherFactory; import org.netbeans.spi.editor.bracesmatching.MatcherContext; diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/ParserPerformanceTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/ParserPerformanceTest.java index 893f900fabcb..c8130e361a73 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/ParserPerformanceTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/ParserPerformanceTest.java @@ -21,6 +21,7 @@ import java.util.Collections; import java.util.Date; import java.util.List; +import javax.swing.text.StyledDocument; import static junit.framework.TestCase.assertNotNull; import static junit.framework.TestCase.assertTrue; import org.netbeans.modules.csl.spi.ParserResult; @@ -30,6 +31,9 @@ import org.netbeans.modules.parsing.api.UserTask; import org.netbeans.modules.parsing.spi.Parser; import org.netbeans.modules.php.blade.editor.BladeTestBase; +import org.openide.cookies.EditorCookie; +import org.openide.filesystems.FileObject; +import org.openide.loaders.DataObject; /** * @@ -46,7 +50,11 @@ public void testFile_01() throws Exception { } private void testFile(String filePath) throws Exception { - Source testSource = getTestSource(getTestFile(filePath)); + FileObject fo = getTestFile(filePath); + DataObject dobj = DataObject.find(fo); + EditorCookie ed = dobj.getCookie(org.openide.cookies.EditorCookie.class); + StyledDocument test = ed.openDocument(); + Source testSource = getTestSource(fo); Date start = new Date(); ParserManager.parse(Collections.singleton(testSource), new UserTask() { diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.g4 b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.g4 new file mode 100644 index 000000000000..caad2db208d1 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.g4 @@ -0,0 +1,73 @@ +lexer grammar BladePhpAntlrLexer; +import BladePhpCommonLexer; + +@header{ + package org.netbeans.modules.php.blade.syntax.antlr4.php; +} + +@lexer::members { + int rparenBalance = 0; + int sqparenBalance = 0; + int curlyparenBalance = 0; +} + +options { + superClass = LexerAdaptor; + caseInsensitive = true; +} + +LINE_COMMENT : LineComment->skip; + +ARRAY : 'array'; +AS : 'as'; +ECHO : 'echo'; +IF : 'if'; +ELSEIF : 'elseif' | 'else if'; +ELSE : 'else'; +NEW : 'new'; +CLASS : 'class'; +FUNCTION : 'function'; +LANG_CONSTRUCT : 'empty' | 'isset'; +MATCH : 'match'; +FOREACH : 'foreach'; + +COMMA : ',' ; + +LPAREN : '('; +RPAREN : ')'; + +LSQUAREBRACKET: '['; +RSQUAREBRACKET: ']'; + +LCURLYBRACE: '{'; +RCURLYBRACE: '}'; + +IDENTIFIER : Identifier; + +PHP_VARIABLE : PhpVariable; + +DOLLAR : '$'; + +NAMESPACE_SEPARATOR : '\\'; +DOUBLE_COLON : '::'; +ARROW : '=>'; +OBJECT_OPERATOR : '->'; + +SEMI_COLON : ';'; + +COMPARISON_OPERATOR : ('==' | '!=' | '>' | '<') '='?; + +LOGICAL_UNION_OPERATOR : '&&' | '||'; + +STRING_LITERAL : StringLiteral; + + +STYLE_COMMENT : '/*' .*? '*/' [\n\r]*->skip; + +WS : ((' ')+ | [\r\n]+)->skip; + +//testing purpose +PHP_DIRECTIVE : ('@php' | '@endphp')->skip; + +OTHER : . ->skip; + diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.java new file mode 100644 index 000000000000..e4d981210318 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.java @@ -0,0 +1,629 @@ +// Generated from BladePhpAntlrLexer.g4 by ANTLR 4.13.0 + + package org.netbeans.modules.php.blade.syntax.antlr4.php; + +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +public class BladePhpAntlrLexer extends LexerAdaptor { + static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + HTML=1, BLADE_COMMENT=2, LINE_COMMENT=3, ARRAY=4, AS=5, ECHO=6, IF=7, + ELSEIF=8, ELSE=9, NEW=10, CLASS=11, FUNCTION=12, LANG_CONSTRUCT=13, MATCH=14, + FOREACH=15, COMMA=16, LPAREN=17, RPAREN=18, LSQUAREBRACKET=19, RSQUAREBRACKET=20, + LCURLYBRACE=21, RCURLYBRACE=22, IDENTIFIER=23, PHP_VARIABLE=24, DOLLAR=25, + NAMESPACE_SEPARATOR=26, DOUBLE_COLON=27, ARROW=28, OBJECT_OPERATOR=29, + SEMI_COLON=30, COMPARISON_OPERATOR=31, LOGICAL_UNION_OPERATOR=32, STRING_LITERAL=33, + STYLE_COMMENT=34, WS=35, PHP_DIRECTIVE=36, OTHER=37, BLADE_COMMENT_START=38, + EMAIL_SUBSTRING=39, VERSION_WITH_AT=40, BLADE_COMMENT_END=41, BLADE_COMMENT_PEEK=42, + BLADE_COMMENT_MORE=43, BLADE_COMMENT_EOF=44; + public static final int + INSIDE_BLADE_COMMENT=1; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN" + }; + + public static String[] modeNames = { + "DEFAULT_MODE", "INSIDE_BLADE_COMMENT" + }; + + private static String[] makeRuleNames() { + return new String[] { + "LINE_COMMENT", "ARRAY", "AS", "ECHO", "IF", "ELSEIF", "ELSE", "NEW", + "CLASS", "FUNCTION", "LANG_CONSTRUCT", "MATCH", "FOREACH", "COMMA", "LPAREN", + "RPAREN", "LSQUAREBRACKET", "RSQUAREBRACKET", "LCURLYBRACE", "RCURLYBRACE", + "IDENTIFIER", "PHP_VARIABLE", "DOLLAR", "NAMESPACE_SEPARATOR", "DOUBLE_COLON", + "ARROW", "OBJECT_OPERATOR", "SEMI_COLON", "COMPARISON_OPERATOR", "LOGICAL_UNION_OPERATOR", + "STRING_LITERAL", "STYLE_COMMENT", "WS", "PHP_DIRECTIVE", "OTHER", "Identifier", + "HtmlIdentifier", "ESC_DOUBLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING_FRAGMENT", + "SINGLE_QUOTED_STRING_FRAGMENT", "StringLiteral", "LineComment", "PhpVariable", + "Digit", "BLADE_COMMENT_START", "EMAIL_SUBSTRING", "VERSION_WITH_AT", + "D_ESCAPES", "BLADE_COMMENT_END", "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", + "BLADE_COMMENT_EOF" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, "'array'", "'as'", "'echo'", "'if'", null, "'else'", + "'new'", "'class'", "'function'", null, "'match'", "'foreach'", "','", + "'('", "')'", "'['", "']'", "'{'", "'}'", null, null, "'$'", "'\\'", + "'::'", "'=>'", "'->'", "';'", null, null, null, null, null, null, null, + "'{{--'", null, null, "'--}}'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "HTML", "BLADE_COMMENT", "LINE_COMMENT", "ARRAY", "AS", "ECHO", + "IF", "ELSEIF", "ELSE", "NEW", "CLASS", "FUNCTION", "LANG_CONSTRUCT", + "MATCH", "FOREACH", "COMMA", "LPAREN", "RPAREN", "LSQUAREBRACKET", "RSQUAREBRACKET", + "LCURLYBRACE", "RCURLYBRACE", "IDENTIFIER", "PHP_VARIABLE", "DOLLAR", + "NAMESPACE_SEPARATOR", "DOUBLE_COLON", "ARROW", "OBJECT_OPERATOR", "SEMI_COLON", + "COMPARISON_OPERATOR", "LOGICAL_UNION_OPERATOR", "STRING_LITERAL", "STYLE_COMMENT", + "WS", "PHP_DIRECTIVE", "OTHER", "BLADE_COMMENT_START", "EMAIL_SUBSTRING", + "VERSION_WITH_AT", "BLADE_COMMENT_END", "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", + "BLADE_COMMENT_EOF" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + + int rparenBalance = 0; + int sqparenBalance = 0; + int curlyparenBalance = 0; + + + public BladePhpAntlrLexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "BladePhpAntlrLexer.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public String[] getChannelNames() { return channelNames; } + + @Override + public String[] getModeNames() { return modeNames; } + + @Override + public ATN getATN() { return _ATN; } + + @Override + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { + switch (ruleIndex) { + case 49: + return BLADE_COMMENT_PEEK_sempred((RuleContext)_localctx, predIndex); + } + return true; + } + private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 0: + return + this._input.LA(1) == '-' && + this._input.LA(2) == '-' && + this._input.LA(3) == '}' && + this._input.LA(4) == '}' + ; + } + return true; + } + + public static final String _serializedATN = + "\u0004\u0000,\u02c7\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000\u0007"+ + "\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007"+ + "\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007"+ + "\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n"+ + "\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002"+ + "\u000e\u0007\u000e\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002"+ + "\u0011\u0007\u0011\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002"+ + "\u0014\u0007\u0014\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002"+ + "\u0017\u0007\u0017\u0002\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002"+ + "\u001a\u0007\u001a\u0002\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002"+ + "\u001d\u0007\u001d\u0002\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002"+ + " \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002"+ + "%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002"+ + "*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002"+ + "/\u0007/\u00020\u00070\u00021\u00071\u00022\u00072\u00023\u00073\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001"+ + "\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u008d\b\u0005\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b"+ + "\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0003\n\u00b1\b\n\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001"+ + "\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001"+ + "\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001"+ + "\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ + "\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001c\u0001"+ + "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0003\u001c\u00e7\b\u001c\u0001"+ + "\u001c\u0003\u001c\u00ea\b\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001"+ + "\u001d\u0003\u001d\u00f0\b\u001d\u0001\u001e\u0001\u001e\u0001\u001f\u0001"+ + "\u001f\u0001\u001f\u0001\u001f\u0005\u001f\u00f8\b\u001f\n\u001f\f\u001f"+ + "\u00fb\t\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0005\u001f"+ + "\u0101\b\u001f\n\u001f\f\u001f\u0104\t\u001f\u0001\u001f\u0001\u001f\u0001"+ + " \u0004 \u0109\b \u000b \f \u010a\u0001 \u0004 \u010e\b \u000b \f \u010f"+ + "\u0003 \u0112\b \u0001 \u0001 \u0001!\u0001!\u0001!\u0001!\u0001!\u0001"+ + "!\u0001!\u0001!\u0001!\u0001!\u0001!\u0003!\u0121\b!\u0001!\u0001!\u0001"+ + "\"\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0005#\u012b\b#\n#\f#\u012e\t"+ + "#\u0001$\u0001$\u0005$\u0132\b$\n$\f$\u0135\t$\u0001%\u0001%\u0001&\u0001"+ + "&\u0001&\u0005&\u013c\b&\n&\f&\u013f\t&\u0001&\u0001&\u0001\'\u0001\'"+ + "\u0001\'\u0001\'\u0005\'\u0147\b\'\n\'\f\'\u014a\t\'\u0001\'\u0001\'\u0001"+ + "(\u0001(\u0003(\u0150\b(\u0001)\u0001)\u0001)\u0001)\u0005)\u0156\b)\n"+ + ")\f)\u0159\t)\u0001*\u0001*\u0001*\u0001+\u0001+\u0001,\u0001,\u0001,"+ + "\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001.\u0001.\u0001.\u0003.\u0171\b.\u0004.\u0173\b.\u000b.\f"+ + ".\u0174\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0003/\u0180\b/\u0001/\u0001/\u0001/\u0001/\u0003/\u0186\b/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0004/\u0190\b/\u000b/\f/"+ + "\u0191\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0004/"+ + "\u019c\b/\u000b/\f/\u019d\u0001/\u0001/\u0001/\u0003/\u01a3\b/\u0003/"+ + "\u01a5\b/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0003/\u02a6\b/\u0001/\u0005"+ + "/\u02a9\b/\n/\f/\u02ac\t/\u0003/\u02ae\b/\u0001/\u0001/\u00010\u00010"+ + "\u00010\u00010\u00010\u00010\u00010\u00010\u00011\u00011\u00011\u0001"+ + "1\u00011\u00012\u00012\u00012\u00012\u00013\u00013\u00013\u00013\u0001"+ + "3\u0002\u00f9\u013d\u00004\u0002\u0003\u0004\u0004\u0006\u0005\b\u0006"+ + "\n\u0007\f\b\u000e\t\u0010\n\u0012\u000b\u0014\f\u0016\r\u0018\u000e\u001a"+ + "\u000f\u001c\u0010\u001e\u0011 \u0012\"\u0013$\u0014&\u0015(\u0016*\u0017"+ + ",\u0018.\u00190\u001a2\u001b4\u001c6\u001d8\u001e:\u001f< >!@\"B#D$F%"+ + "H\u0000J\u0000L\u0000N\u0000P\u0000R\u0000T\u0000V\u0000X\u0000Z&\\\'"+ + "^(`\u0000b)d*f+h,\u0002\u0000\u0001\u001e\u0002\u0000AAaa\u0002\u0000"+ + "RRrr\u0002\u0000YYyy\u0002\u0000SSss\u0002\u0000EEee\u0002\u0000CCcc\u0002"+ + "\u0000HHhh\u0002\u0000OOoo\u0002\u0000IIii\u0002\u0000FFff\u0002\u0000"+ + "LLll\u0002\u0000NNnn\u0002\u0000WWww\u0002\u0000UUuu\u0002\u0000TTtt\u0002"+ + "\u0000MMmm\u0002\u0000PPpp\u0002\u0000<<>>\u0002\u0000\n\n\r\r\u0002\u0000"+ + "DDdd\u0004\u0000AZ__az\u0080\u8000\ufffe\u0005\u000009AZ__az\u0080\u8000"+ + "\ufffe\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002\u0000\"\"\\\\\u0002"+ + "\u0000\'\'\\\\\u0001\u0000 \u0002\u0000GGgg\u0002\u0000BBbb\u0002\u0000"+ + "KKkk\u0002\u0000VVvv\u02f4\u0000\u0002\u0001\u0000\u0000\u0000\u0000\u0004"+ + "\u0001\u0000\u0000\u0000\u0000\u0006\u0001\u0000\u0000\u0000\u0000\b\u0001"+ + "\u0000\u0000\u0000\u0000\n\u0001\u0000\u0000\u0000\u0000\f\u0001\u0000"+ + "\u0000\u0000\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0010\u0001\u0000"+ + "\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000\u0000\u0014\u0001\u0000"+ + "\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000"+ + "\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000"+ + "\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000"+ + "\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000"+ + "\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*"+ + "\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000"+ + "\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000"+ + "\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008"+ + "\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000"+ + "\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000"+ + "\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F"+ + "\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000\\\u0001"+ + "\u0000\u0000\u0000\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001\u0000\u0000"+ + "\u0000\u0001b\u0001\u0000\u0000\u0000\u0001d\u0001\u0000\u0000\u0000\u0001"+ + "f\u0001\u0000\u0000\u0000\u0001h\u0001\u0000\u0000\u0000\u0002j\u0001"+ + "\u0000\u0000\u0000\u0004n\u0001\u0000\u0000\u0000\u0006t\u0001\u0000\u0000"+ + "\u0000\bw\u0001\u0000\u0000\u0000\n|\u0001\u0000\u0000\u0000\f\u008c\u0001"+ + "\u0000\u0000\u0000\u000e\u008e\u0001\u0000\u0000\u0000\u0010\u0093\u0001"+ + "\u0000\u0000\u0000\u0012\u0097\u0001\u0000\u0000\u0000\u0014\u009d\u0001"+ + "\u0000\u0000\u0000\u0016\u00b0\u0001\u0000\u0000\u0000\u0018\u00b2\u0001"+ + "\u0000\u0000\u0000\u001a\u00b8\u0001\u0000\u0000\u0000\u001c\u00c0\u0001"+ + "\u0000\u0000\u0000\u001e\u00c2\u0001\u0000\u0000\u0000 \u00c4\u0001\u0000"+ + "\u0000\u0000\"\u00c6\u0001\u0000\u0000\u0000$\u00c8\u0001\u0000\u0000"+ + "\u0000&\u00ca\u0001\u0000\u0000\u0000(\u00cc\u0001\u0000\u0000\u0000*"+ + "\u00ce\u0001\u0000\u0000\u0000,\u00d0\u0001\u0000\u0000\u0000.\u00d2\u0001"+ + "\u0000\u0000\u00000\u00d4\u0001\u0000\u0000\u00002\u00d6\u0001\u0000\u0000"+ + "\u00004\u00d9\u0001\u0000\u0000\u00006\u00dc\u0001\u0000\u0000\u00008"+ + "\u00df\u0001\u0000\u0000\u0000:\u00e6\u0001\u0000\u0000\u0000<\u00ef\u0001"+ + "\u0000\u0000\u0000>\u00f1\u0001\u0000\u0000\u0000@\u00f3\u0001\u0000\u0000"+ + "\u0000B\u0111\u0001\u0000\u0000\u0000D\u0120\u0001\u0000\u0000\u0000F"+ + "\u0124\u0001\u0000\u0000\u0000H\u0128\u0001\u0000\u0000\u0000J\u012f\u0001"+ + "\u0000\u0000\u0000L\u0136\u0001\u0000\u0000\u0000N\u0138\u0001\u0000\u0000"+ + "\u0000P\u0142\u0001\u0000\u0000\u0000R\u014f\u0001\u0000\u0000\u0000T"+ + "\u0151\u0001\u0000\u0000\u0000V\u015a\u0001\u0000\u0000\u0000X\u015d\u0001"+ + "\u0000\u0000\u0000Z\u015f\u0001\u0000\u0000\u0000\\\u0167\u0001\u0000"+ + "\u0000\u0000^\u016d\u0001\u0000\u0000\u0000`\u02ad\u0001\u0000\u0000\u0000"+ + "b\u02b1\u0001\u0000\u0000\u0000d\u02b9\u0001\u0000\u0000\u0000f\u02be"+ + "\u0001\u0000\u0000\u0000h\u02c2\u0001\u0000\u0000\u0000jk\u0003T)\u0000"+ + "kl\u0001\u0000\u0000\u0000lm\u0006\u0000\u0000\u0000m\u0003\u0001\u0000"+ + "\u0000\u0000no\u0007\u0000\u0000\u0000op\u0007\u0001\u0000\u0000pq\u0007"+ + "\u0001\u0000\u0000qr\u0007\u0000\u0000\u0000rs\u0007\u0002\u0000\u0000"+ + "s\u0005\u0001\u0000\u0000\u0000tu\u0007\u0000\u0000\u0000uv\u0007\u0003"+ + "\u0000\u0000v\u0007\u0001\u0000\u0000\u0000wx\u0007\u0004\u0000\u0000"+ + "xy\u0007\u0005\u0000\u0000yz\u0007\u0006\u0000\u0000z{\u0007\u0007\u0000"+ + "\u0000{\t\u0001\u0000\u0000\u0000|}\u0007\b\u0000\u0000}~\u0007\t\u0000"+ + "\u0000~\u000b\u0001\u0000\u0000\u0000\u007f\u0080\u0007\u0004\u0000\u0000"+ + "\u0080\u0081\u0007\n\u0000\u0000\u0081\u0082\u0007\u0003\u0000\u0000\u0082"+ + "\u0083\u0007\u0004\u0000\u0000\u0083\u0084\u0007\b\u0000\u0000\u0084\u008d"+ + "\u0007\t\u0000\u0000\u0085\u0086\u0007\u0004\u0000\u0000\u0086\u0087\u0007"+ + "\n\u0000\u0000\u0087\u0088\u0007\u0003\u0000\u0000\u0088\u0089\u0007\u0004"+ + "\u0000\u0000\u0089\u008a\u0005 \u0000\u0000\u008a\u008b\u0007\b\u0000"+ + "\u0000\u008b\u008d\u0007\t\u0000\u0000\u008c\u007f\u0001\u0000\u0000\u0000"+ + "\u008c\u0085\u0001\u0000\u0000\u0000\u008d\r\u0001\u0000\u0000\u0000\u008e"+ + "\u008f\u0007\u0004\u0000\u0000\u008f\u0090\u0007\n\u0000\u0000\u0090\u0091"+ + "\u0007\u0003\u0000\u0000\u0091\u0092\u0007\u0004\u0000\u0000\u0092\u000f"+ + "\u0001\u0000\u0000\u0000\u0093\u0094\u0007\u000b\u0000\u0000\u0094\u0095"+ + "\u0007\u0004\u0000\u0000\u0095\u0096\u0007\f\u0000\u0000\u0096\u0011\u0001"+ + "\u0000\u0000\u0000\u0097\u0098\u0007\u0005\u0000\u0000\u0098\u0099\u0007"+ + "\n\u0000\u0000\u0099\u009a\u0007\u0000\u0000\u0000\u009a\u009b\u0007\u0003"+ + "\u0000\u0000\u009b\u009c\u0007\u0003\u0000\u0000\u009c\u0013\u0001\u0000"+ + "\u0000\u0000\u009d\u009e\u0007\t\u0000\u0000\u009e\u009f\u0007\r\u0000"+ + "\u0000\u009f\u00a0\u0007\u000b\u0000\u0000\u00a0\u00a1\u0007\u0005\u0000"+ + "\u0000\u00a1\u00a2\u0007\u000e\u0000\u0000\u00a2\u00a3\u0007\b\u0000\u0000"+ + "\u00a3\u00a4\u0007\u0007\u0000\u0000\u00a4\u00a5\u0007\u000b\u0000\u0000"+ + "\u00a5\u0015\u0001\u0000\u0000\u0000\u00a6\u00a7\u0007\u0004\u0000\u0000"+ + "\u00a7\u00a8\u0007\u000f\u0000\u0000\u00a8\u00a9\u0007\u0010\u0000\u0000"+ + "\u00a9\u00aa\u0007\u000e\u0000\u0000\u00aa\u00b1\u0007\u0002\u0000\u0000"+ + "\u00ab\u00ac\u0007\b\u0000\u0000\u00ac\u00ad\u0007\u0003\u0000\u0000\u00ad"+ + "\u00ae\u0007\u0003\u0000\u0000\u00ae\u00af\u0007\u0004\u0000\u0000\u00af"+ + "\u00b1\u0007\u000e\u0000\u0000\u00b0\u00a6\u0001\u0000\u0000\u0000\u00b0"+ + "\u00ab\u0001\u0000\u0000\u0000\u00b1\u0017\u0001\u0000\u0000\u0000\u00b2"+ + "\u00b3\u0007\u000f\u0000\u0000\u00b3\u00b4\u0007\u0000\u0000\u0000\u00b4"+ + "\u00b5\u0007\u000e\u0000\u0000\u00b5\u00b6\u0007\u0005\u0000\u0000\u00b6"+ + "\u00b7\u0007\u0006\u0000\u0000\u00b7\u0019\u0001\u0000\u0000\u0000\u00b8"+ + "\u00b9\u0007\t\u0000\u0000\u00b9\u00ba\u0007\u0007\u0000\u0000\u00ba\u00bb"+ + "\u0007\u0001\u0000\u0000\u00bb\u00bc\u0007\u0004\u0000\u0000\u00bc\u00bd"+ + "\u0007\u0000\u0000\u0000\u00bd\u00be\u0007\u0005\u0000\u0000\u00be\u00bf"+ + "\u0007\u0006\u0000\u0000\u00bf\u001b\u0001\u0000\u0000\u0000\u00c0\u00c1"+ + "\u0005,\u0000\u0000\u00c1\u001d\u0001\u0000\u0000\u0000\u00c2\u00c3\u0005"+ + "(\u0000\u0000\u00c3\u001f\u0001\u0000\u0000\u0000\u00c4\u00c5\u0005)\u0000"+ + "\u0000\u00c5!\u0001\u0000\u0000\u0000\u00c6\u00c7\u0005[\u0000\u0000\u00c7"+ + "#\u0001\u0000\u0000\u0000\u00c8\u00c9\u0005]\u0000\u0000\u00c9%\u0001"+ + "\u0000\u0000\u0000\u00ca\u00cb\u0005{\u0000\u0000\u00cb\'\u0001\u0000"+ + "\u0000\u0000\u00cc\u00cd\u0005}\u0000\u0000\u00cd)\u0001\u0000\u0000\u0000"+ + "\u00ce\u00cf\u0003H#\u0000\u00cf+\u0001\u0000\u0000\u0000\u00d0\u00d1"+ + "\u0003V*\u0000\u00d1-\u0001\u0000\u0000\u0000\u00d2\u00d3\u0005$\u0000"+ + "\u0000\u00d3/\u0001\u0000\u0000\u0000\u00d4\u00d5\u0005\\\u0000\u0000"+ + "\u00d51\u0001\u0000\u0000\u0000\u00d6\u00d7\u0005:\u0000\u0000\u00d7\u00d8"+ + "\u0005:\u0000\u0000\u00d83\u0001\u0000\u0000\u0000\u00d9\u00da\u0005="+ + "\u0000\u0000\u00da\u00db\u0005>\u0000\u0000\u00db5\u0001\u0000\u0000\u0000"+ + "\u00dc\u00dd\u0005-\u0000\u0000\u00dd\u00de\u0005>\u0000\u0000\u00de7"+ + "\u0001\u0000\u0000\u0000\u00df\u00e0\u0005;\u0000\u0000\u00e09\u0001\u0000"+ + "\u0000\u0000\u00e1\u00e2\u0005=\u0000\u0000\u00e2\u00e7\u0005=\u0000\u0000"+ + "\u00e3\u00e4\u0005!\u0000\u0000\u00e4\u00e7\u0005=\u0000\u0000\u00e5\u00e7"+ + "\u0007\u0011\u0000\u0000\u00e6\u00e1\u0001\u0000\u0000\u0000\u00e6\u00e3"+ + "\u0001\u0000\u0000\u0000\u00e6\u00e5\u0001\u0000\u0000\u0000\u00e7\u00e9"+ + "\u0001\u0000\u0000\u0000\u00e8\u00ea\u0005=\u0000\u0000\u00e9\u00e8\u0001"+ + "\u0000\u0000\u0000\u00e9\u00ea\u0001\u0000\u0000\u0000\u00ea;\u0001\u0000"+ + "\u0000\u0000\u00eb\u00ec\u0005&\u0000\u0000\u00ec\u00f0\u0005&\u0000\u0000"+ + "\u00ed\u00ee\u0005|\u0000\u0000\u00ee\u00f0\u0005|\u0000\u0000\u00ef\u00eb"+ + "\u0001\u0000\u0000\u0000\u00ef\u00ed\u0001\u0000\u0000\u0000\u00f0=\u0001"+ + "\u0000\u0000\u0000\u00f1\u00f2\u0003R(\u0000\u00f2?\u0001\u0000\u0000"+ + "\u0000\u00f3\u00f4\u0005/\u0000\u0000\u00f4\u00f5\u0005*\u0000\u0000\u00f5"+ + "\u00f9\u0001\u0000\u0000\u0000\u00f6\u00f8\t\u0000\u0000\u0000\u00f7\u00f6"+ + "\u0001\u0000\u0000\u0000\u00f8\u00fb\u0001\u0000\u0000\u0000\u00f9\u00fa"+ + "\u0001\u0000\u0000\u0000\u00f9\u00f7\u0001\u0000\u0000\u0000\u00fa\u00fc"+ + "\u0001\u0000\u0000\u0000\u00fb\u00f9\u0001\u0000\u0000\u0000\u00fc\u00fd"+ + "\u0005*\u0000\u0000\u00fd\u00fe\u0005/\u0000\u0000\u00fe\u0102\u0001\u0000"+ + "\u0000\u0000\u00ff\u0101\u0007\u0012\u0000\u0000\u0100\u00ff\u0001\u0000"+ + "\u0000\u0000\u0101\u0104\u0001\u0000\u0000\u0000\u0102\u0100\u0001\u0000"+ + "\u0000\u0000\u0102\u0103\u0001\u0000\u0000\u0000\u0103\u0105\u0001\u0000"+ + "\u0000\u0000\u0104\u0102\u0001\u0000\u0000\u0000\u0105\u0106\u0006\u001f"+ + "\u0000\u0000\u0106A\u0001\u0000\u0000\u0000\u0107\u0109\u0005 \u0000\u0000"+ + "\u0108\u0107\u0001\u0000\u0000\u0000\u0109\u010a\u0001\u0000\u0000\u0000"+ + "\u010a\u0108\u0001\u0000\u0000\u0000\u010a\u010b\u0001\u0000\u0000\u0000"+ + "\u010b\u0112\u0001\u0000\u0000\u0000\u010c\u010e\u0007\u0012\u0000\u0000"+ + "\u010d\u010c\u0001\u0000\u0000\u0000\u010e\u010f\u0001\u0000\u0000\u0000"+ + "\u010f\u010d\u0001\u0000\u0000\u0000\u010f\u0110\u0001\u0000\u0000\u0000"+ + "\u0110\u0112\u0001\u0000\u0000\u0000\u0111\u0108\u0001\u0000\u0000\u0000"+ + "\u0111\u010d\u0001\u0000\u0000\u0000\u0112\u0113\u0001\u0000\u0000\u0000"+ + "\u0113\u0114\u0006 \u0000\u0000\u0114C\u0001\u0000\u0000\u0000\u0115\u0116"+ + "\u0005@\u0000\u0000\u0116\u0117\u0007\u0010\u0000\u0000\u0117\u0118\u0007"+ + "\u0006\u0000\u0000\u0118\u0121\u0007\u0010\u0000\u0000\u0119\u011a\u0005"+ + "@\u0000\u0000\u011a\u011b\u0007\u0004\u0000\u0000\u011b\u011c\u0007\u000b"+ + "\u0000\u0000\u011c\u011d\u0007\u0013\u0000\u0000\u011d\u011e\u0007\u0010"+ + "\u0000\u0000\u011e\u011f\u0007\u0006\u0000\u0000\u011f\u0121\u0007\u0010"+ + "\u0000\u0000\u0120\u0115\u0001\u0000\u0000\u0000\u0120\u0119\u0001\u0000"+ + "\u0000\u0000\u0121\u0122\u0001\u0000\u0000\u0000\u0122\u0123\u0006!\u0000"+ + "\u0000\u0123E\u0001\u0000\u0000\u0000\u0124\u0125\t\u0000\u0000\u0000"+ + "\u0125\u0126\u0001\u0000\u0000\u0000\u0126\u0127\u0006\"\u0000\u0000\u0127"+ + "G\u0001\u0000\u0000\u0000\u0128\u012c\u0007\u0014\u0000\u0000\u0129\u012b"+ + "\u0007\u0015\u0000\u0000\u012a\u0129\u0001\u0000\u0000\u0000\u012b\u012e"+ + "\u0001\u0000\u0000\u0000\u012c\u012a\u0001\u0000\u0000\u0000\u012c\u012d"+ + "\u0001\u0000\u0000\u0000\u012dI\u0001\u0000\u0000\u0000\u012e\u012c\u0001"+ + "\u0000\u0000\u0000\u012f\u0133\u0007\u0014\u0000\u0000\u0130\u0132\u0007"+ + "\u0016\u0000\u0000\u0131\u0130\u0001\u0000\u0000\u0000\u0132\u0135\u0001"+ + "\u0000\u0000\u0000\u0133\u0131\u0001\u0000\u0000\u0000\u0133\u0134\u0001"+ + "\u0000\u0000\u0000\u0134K\u0001\u0000\u0000\u0000\u0135\u0133\u0001\u0000"+ + "\u0000\u0000\u0136\u0137\u0007\u0017\u0000\u0000\u0137M\u0001\u0000\u0000"+ + "\u0000\u0138\u013d\u0005\"\u0000\u0000\u0139\u013c\u0003L%\u0000\u013a"+ + "\u013c\t\u0000\u0000\u0000\u013b\u0139\u0001\u0000\u0000\u0000\u013b\u013a"+ + "\u0001\u0000\u0000\u0000\u013c\u013f\u0001\u0000\u0000\u0000\u013d\u013e"+ + "\u0001\u0000\u0000\u0000\u013d\u013b\u0001\u0000\u0000\u0000\u013e\u0140"+ + "\u0001\u0000\u0000\u0000\u013f\u013d\u0001\u0000\u0000\u0000\u0140\u0141"+ + "\u0005\"\u0000\u0000\u0141O\u0001\u0000\u0000\u0000\u0142\u0148\u0005"+ + "\'\u0000\u0000\u0143\u0147\b\u0018\u0000\u0000\u0144\u0145\u0005\\\u0000"+ + "\u0000\u0145\u0147\t\u0000\u0000\u0000\u0146\u0143\u0001\u0000\u0000\u0000"+ + "\u0146\u0144\u0001\u0000\u0000\u0000\u0147\u014a\u0001\u0000\u0000\u0000"+ + "\u0148\u0146\u0001\u0000\u0000\u0000\u0148\u0149\u0001\u0000\u0000\u0000"+ + "\u0149\u014b\u0001\u0000\u0000\u0000\u014a\u0148\u0001\u0000\u0000\u0000"+ + "\u014b\u014c\u0005\'\u0000\u0000\u014cQ\u0001\u0000\u0000\u0000\u014d"+ + "\u0150\u0003N&\u0000\u014e\u0150\u0003P\'\u0000\u014f\u014d\u0001\u0000"+ + "\u0000\u0000\u014f\u014e\u0001\u0000\u0000\u0000\u0150S\u0001\u0000\u0000"+ + "\u0000\u0151\u0152\u0005/\u0000\u0000\u0152\u0153\u0005/\u0000\u0000\u0153"+ + "\u0157\u0001\u0000\u0000\u0000\u0154\u0156\b\u0012\u0000\u0000\u0155\u0154"+ + "\u0001\u0000\u0000\u0000\u0156\u0159\u0001\u0000\u0000\u0000\u0157\u0155"+ + "\u0001\u0000\u0000\u0000\u0157\u0158\u0001\u0000\u0000\u0000\u0158U\u0001"+ + "\u0000\u0000\u0000\u0159\u0157\u0001\u0000\u0000\u0000\u015a\u015b\u0005"+ + "$\u0000\u0000\u015b\u015c\u0003H#\u0000\u015cW\u0001\u0000\u0000\u0000"+ + "\u015d\u015e\u000209\u0000\u015eY\u0001\u0000\u0000\u0000\u015f\u0160"+ + "\u0005{\u0000\u0000\u0160\u0161\u0005{\u0000\u0000\u0161\u0162\u0005-"+ + "\u0000\u0000\u0162\u0163\u0005-\u0000\u0000\u0163\u0164\u0001\u0000\u0000"+ + "\u0000\u0164\u0165\u0006,\u0001\u0000\u0165\u0166\u0006,\u0000\u0000\u0166"+ + "[\u0001\u0000\u0000\u0000\u0167\u0168\u0005@\u0000\u0000\u0168\u0169\u0003"+ + "H#\u0000\u0169\u016a\u0005.\u0000\u0000\u016a\u016b\u0001\u0000\u0000"+ + "\u0000\u016b\u016c\u0006-\u0000\u0000\u016c]\u0001\u0000\u0000\u0000\u016d"+ + "\u0172\u0005@\u0000\u0000\u016e\u0170\u0003X+\u0000\u016f\u0171\u0005"+ + ".\u0000\u0000\u0170\u016f\u0001\u0000\u0000\u0000\u0170\u0171\u0001\u0000"+ + "\u0000\u0000\u0171\u0173\u0001\u0000\u0000\u0000\u0172\u016e\u0001\u0000"+ + "\u0000\u0000\u0173\u0174\u0001\u0000\u0000\u0000\u0174\u0172\u0001\u0000"+ + "\u0000\u0000\u0174\u0175\u0001\u0000\u0000\u0000\u0175\u0176\u0001\u0000"+ + "\u0000\u0000\u0176\u0177\u0006.\u0000\u0000\u0177_\u0001\u0000\u0000\u0000"+ + "\u0178\u0179\u0005{\u0000\u0000\u0179\u017a\u0005{\u0000\u0000\u017a\u02ae"+ + "\u0005{\u0000\u0000\u017b\u017c\u0005@\u0000\u0000\u017c\u017d\u0005@"+ + "\u0000\u0000\u017d\u017f\u0001\u0000\u0000\u0000\u017e\u0180\u0005@\u0000"+ + "\u0000\u017f\u017e\u0001\u0000\u0000\u0000\u017f\u0180\u0001\u0000\u0000"+ + "\u0000\u0180\u02ae\u0001\u0000\u0000\u0000\u0181\u0182\u0005@\u0000\u0000"+ + "\u0182\u0183\u0005{\u0000\u0000\u0183\u0185\u0001\u0000\u0000\u0000\u0184"+ + "\u0186\u0005{\u0000\u0000\u0185\u0184\u0001\u0000\u0000\u0000\u0185\u0186"+ + "\u0001\u0000\u0000\u0000\u0186\u02ae\u0001\u0000\u0000\u0000\u0187\u0188"+ + "\u0005@\u0000\u0000\u0188\u0189\u0007\u000f\u0000\u0000\u0189\u018a\u0007"+ + "\u0004\u0000\u0000\u018a\u018b\u0007\u0013\u0000\u0000\u018b\u018c\u0007"+ + "\b\u0000\u0000\u018c\u018d\u0007\u0000\u0000\u0000\u018d\u018f\u0001\u0000"+ + "\u0000\u0000\u018e\u0190\u0007\u0019\u0000\u0000\u018f\u018e\u0001\u0000"+ + "\u0000\u0000\u0190\u0191\u0001\u0000\u0000\u0000\u0191\u018f\u0001\u0000"+ + "\u0000\u0000\u0191\u0192\u0001\u0000\u0000\u0000\u0192\u01a4\u0001\u0000"+ + "\u0000\u0000\u0193\u0194\u0007\u0003\u0000\u0000\u0194\u0195\u0007\u0005"+ + "\u0000\u0000\u0195\u0196\u0007\u0001\u0000\u0000\u0196\u0197\u0007\u0004"+ + "\u0000\u0000\u0197\u0198\u0007\u0004\u0000\u0000\u0198\u0199\u0007\u000b"+ + "\u0000\u0000\u0199\u019b\u0001\u0000\u0000\u0000\u019a\u019c\u0007\u0019"+ + "\u0000\u0000\u019b\u019a\u0001\u0000\u0000\u0000\u019c\u019d\u0001\u0000"+ + "\u0000\u0000\u019d\u019b\u0001\u0000\u0000\u0000\u019d\u019e\u0001\u0000"+ + "\u0000\u0000\u019e\u01a2\u0001\u0000\u0000\u0000\u019f\u01a0\u0007\u0000"+ + "\u0000\u0000\u01a0\u01a1\u0007\u000b\u0000\u0000\u01a1\u01a3\u0007\u0013"+ + "\u0000\u0000\u01a2\u019f\u0001\u0000\u0000\u0000\u01a2\u01a3\u0001\u0000"+ + "\u0000\u0000\u01a3\u01a5\u0001\u0000\u0000\u0000\u01a4\u0193\u0001\u0000"+ + "\u0000\u0000\u01a4\u01a5\u0001\u0000\u0000\u0000\u01a5\u02ae\u0001\u0000"+ + "\u0000\u0000\u01a6\u01a7\u0005@\u0000\u0000\u01a7\u01a8\u0007\u0005\u0000"+ + "\u0000\u01a8\u01a9\u0007\u0006\u0000\u0000\u01a9\u01aa\u0007\u0000\u0000"+ + "\u0000\u01aa\u01ab\u0007\u0001\u0000\u0000\u01ab\u01ac\u0007\u0003\u0000"+ + "\u0000\u01ac\u01ad\u0007\u0004\u0000\u0000\u01ad\u02a6\u0007\u000e\u0000"+ + "\u0000\u01ae\u01af\u0005@\u0000\u0000\u01af\u01b0\u0007\b\u0000\u0000"+ + "\u01b0\u01b1\u0007\u000f\u0000\u0000\u01b1\u01b2\u0007\u0010\u0000\u0000"+ + "\u01b2\u01b3\u0007\u0007\u0000\u0000\u01b3\u01b4\u0007\u0001\u0000\u0000"+ + "\u01b4\u02a6\u0007\u000e\u0000\u0000\u01b5\u01b6\u0005@\u0000\u0000\u01b6"+ + "\u01b7\u0007\u000b\u0000\u0000\u01b7\u01b8\u0007\u0000\u0000\u0000\u01b8"+ + "\u01b9\u0007\u000f\u0000\u0000\u01b9\u01ba\u0007\u0004\u0000\u0000\u01ba"+ + "\u01bb\u0007\u0003\u0000\u0000\u01bb\u01bc\u0007\u0010\u0000\u0000\u01bc"+ + "\u01bd\u0007\u0000\u0000\u0000\u01bd\u01be\u0007\u0005\u0000\u0000\u01be"+ + "\u02a6\u0007\u0004\u0000\u0000\u01bf\u01c0\u0005@\u0000\u0000\u01c0\u01c1"+ + "\u0007\u0013\u0000\u0000\u01c1\u01c2\u0007\u0007\u0000\u0000\u01c2\u01c3"+ + "\u0007\u0005\u0000\u0000\u01c3\u01c4\u0007\r\u0000\u0000\u01c4\u01c5\u0007"+ + "\u000f\u0000\u0000\u01c5\u01c6\u0007\u0004\u0000\u0000\u01c6\u01c7\u0007"+ + "\u000b\u0000\u0000\u01c7\u02a6\u0007\u000e\u0000\u0000\u01c8\u01c9\u0005"+ + "@\u0000\u0000\u01c9\u01ca\u0007\t\u0000\u0000\u01ca\u01cb\u0007\u0007"+ + "\u0000\u0000\u01cb\u01cc\u0007\u000b\u0000\u0000\u01cc\u01cd\u0007\u000e"+ + "\u0000\u0000\u01cd\u01ce\u0005-\u0000\u0000\u01ce\u01cf\u0007\t\u0000"+ + "\u0000\u01cf\u01d0\u0007\u0000\u0000\u0000\u01d0\u01d1\u0007\u0005\u0000"+ + "\u0000\u01d1\u02a6\u0007\u0004\u0000\u0000\u01d2\u01d3\u0005@\u0000\u0000"+ + "\u01d3\u01d4\u0007\u0010\u0000\u0000\u01d4\u01d5\u0007\u0000\u0000\u0000"+ + "\u01d5\u01d6\u0007\u001a\u0000\u0000\u01d6\u02a6\u0007\u0004\u0000\u0000"+ + "\u01d7\u01d8\u0005@\u0000\u0000\u01d8\u01d9\u0007\n\u0000\u0000\u01d9"+ + "\u01da\u0007\u0000\u0000\u0000\u01da\u01db\u0007\u0002\u0000\u0000\u01db"+ + "\u01dc\u0007\u0004\u0000\u0000\u01dc\u02a6\u0007\u0001\u0000\u0000\u01dd"+ + "\u01de\u0005@\u0000\u0000\u01de\u01df\u0007\u0003\u0000\u0000\u01df\u01e0"+ + "\u0007\r\u0000\u0000\u01e0\u01e1\u0007\u0010\u0000\u0000\u01e1\u01e2\u0007"+ + "\u0010\u0000\u0000\u01e2\u01e3\u0007\u0007\u0000\u0000\u01e3\u01e4\u0007"+ + "\u0001\u0000\u0000\u01e4\u01e5\u0007\u000e\u0000\u0000\u01e5\u02a6\u0007"+ + "\u0003\u0000\u0000\u01e6\u01e7\u0005@\u0000\u0000\u01e7\u01e8\u0007\u000e"+ + "\u0000\u0000\u01e8\u01e9\u0007\u0000\u0000\u0000\u01e9\u01ea\u0007\b\u0000"+ + "\u0000\u01ea\u01eb\u0007\n\u0000\u0000\u01eb\u01ec\u0007\f\u0000\u0000"+ + "\u01ec\u01ed\u0007\b\u0000\u0000\u01ed\u01ee\u0007\u000b\u0000\u0000\u01ee"+ + "\u02a6\u0007\u0013\u0000\u0000\u01ef\u01f0\u0005@\u0000\u0000\u01f0\u01f1"+ + "\u0007\u0000\u0000\u0000\u01f1\u01f2\u0007\u0010\u0000\u0000\u01f2\u01f3"+ + "\u0007\u0010\u0000\u0000\u01f3\u01f4\u0007\n\u0000\u0000\u01f4\u02a6\u0007"+ + "\u0002\u0000\u0000\u01f5\u01f6\u0005@\u0000\u0000\u01f6\u01f7\u0005-\u0000"+ + "\u0000\u01f7\u01f8\u0007\f\u0000\u0000\u01f8\u01f9\u0007\u0004\u0000\u0000"+ + "\u01f9\u01fa\u0007\u001b\u0000\u0000\u01fa\u01fb\u0007\u001c\u0000\u0000"+ + "\u01fb\u01fc\u0007\b\u0000\u0000\u01fc\u01fd\u0007\u000e\u0000\u0000\u01fd"+ + "\u01fe\u0005-\u0000\u0000\u01fe\u01ff\u0007\u001c\u0000\u0000\u01ff\u0200"+ + "\u0007\u0004\u0000\u0000\u0200\u0201\u0007\u0002\u0000\u0000\u0201\u0202"+ + "\u0007\t\u0000\u0000\u0202\u0203\u0007\u0001\u0000\u0000\u0203\u0204\u0007"+ + "\u0000\u0000\u0000\u0204\u0205\u0007\u000f\u0000\u0000\u0205\u0206\u0007"+ + "\u0004\u0000\u0000\u0206\u02a6\u0007\u0003\u0000\u0000\u0207\u0208\u0005"+ + "@\u0000\u0000\u0208\u0209\u0007\u001c\u0000\u0000\u0209\u020a\u0007\u0004"+ + "\u0000\u0000\u020a\u020b\u0007\u0002\u0000\u0000\u020b\u020c\u0007\t\u0000"+ + "\u0000\u020c\u020d\u0007\u0001\u0000\u0000\u020d\u020e\u0007\u0000\u0000"+ + "\u0000\u020e\u020f\u0007\u000f\u0000\u0000\u020f\u0210\u0007\u0004\u0000"+ + "\u0000\u0210\u02a6\u0007\u0003\u0000\u0000\u0211\u0212\u0005@\u0000\u0000"+ + "\u0212\u0213\u0007\u0005\u0000\u0000\u0213\u0214\u0007\u0007\u0000\u0000"+ + "\u0214\u0215\u0007\r\u0000\u0000\u0215\u0216\u0007\u000b\u0000\u0000\u0216"+ + "\u0217\u0007\u000e\u0000\u0000\u0217\u0218\u0007\u0004\u0000\u0000\u0218"+ + "\u0219\u0007\u0001\u0000\u0000\u0219\u021a\u0005-\u0000\u0000\u021a\u021b"+ + "\u0007\u0003\u0000\u0000\u021b\u021c\u0007\u000e\u0000\u0000\u021c\u021d"+ + "\u0007\u0002\u0000\u0000\u021d\u021e\u0007\n\u0000\u0000\u021e\u02a6\u0007"+ + "\u0004\u0000\u0000\u021f\u0220\u0005@\u0000\u0000\u0220\u0221\u0007\t"+ + "\u0000\u0000\u0221\u0222\u0007\u0007\u0000\u0000\u0222\u0223\u0007\u000b"+ + "\u0000\u0000\u0223\u0224\u0007\u000e\u0000\u0000\u0224\u0225\u0005-\u0000"+ + "\u0000\u0225\u0226\u0007\t\u0000\u0000\u0226\u0227\u0007\u0004\u0000\u0000"+ + "\u0227\u0228\u0007\u0000\u0000\u0000\u0228\u0229\u0007\u000e\u0000\u0000"+ + "\u0229\u022a\u0007\r\u0000\u0000\u022a\u022b\u0007\u0001\u0000\u0000\u022b"+ + "\u022c\u0007\u0004\u0000\u0000\u022c\u022d\u0005-\u0000\u0000\u022d\u022e"+ + "\u0007\u001d\u0000\u0000\u022e\u022f\u0007\u0000\u0000\u0000\u022f\u0230"+ + "\u0007\n\u0000\u0000\u0230\u0231\u0007\r\u0000\u0000\u0231\u0232\u0007"+ + "\u0004\u0000\u0000\u0232\u02a6\u0007\u0003\u0000\u0000\u0233\u0234\u0005"+ + "@\u0000\u0000\u0234\u0235\u0007\u0010\u0000\u0000\u0235\u0236\u0007\u0001"+ + "\u0000\u0000\u0236\u0237\u0007\u0007\u0000\u0000\u0237\u0238\u0007\u0010"+ + "\u0000\u0000\u0238\u0239\u0007\u0004\u0000\u0000\u0239\u023a\u0007\u0001"+ + "\u0000\u0000\u023a\u023b\u0007\u000e\u0000\u0000\u023b\u02a6\u0007\u0002"+ + "\u0000\u0000\u023c\u023d\u0005@\u0000\u0000\u023d\u023e\u0007\u0003\u0000"+ + "\u0000\u023e\u023f\u0007\u0005\u0000\u0000\u023f\u0240\u0007\u0007\u0000"+ + "\u0000\u0240\u0241\u0007\u0010\u0000\u0000\u0241\u02a6\u0007\u0004\u0000"+ + "\u0000\u0242\u0243\u0005@\u0000\u0000\u0243\u0244\u0007\u0003\u0000\u0000"+ + "\u0244\u0245\u0007\u000e\u0000\u0000\u0245\u0246\u0007\u0000\u0000\u0000"+ + "\u0246\u0247\u0007\u0001\u0000\u0000\u0247\u0248\u0007\u000e\u0000\u0000"+ + "\u0248\u0249\u0007\b\u0000\u0000\u0249\u024a\u0007\u000b\u0000\u0000\u024a"+ + "\u024b\u0007\u001a\u0000\u0000\u024b\u024c\u0005-\u0000\u0000\u024c\u024d"+ + "\u0007\u0003\u0000\u0000\u024d\u024e\u0007\u000e\u0000\u0000\u024e\u024f"+ + "\u0007\u0002\u0000\u0000\u024f\u0250\u0007\n\u0000\u0000\u0250\u02a6\u0007"+ + "\u0004\u0000\u0000\u0251\u0252\u0005@\u0000\u0000\u0252\u0253\u0007\u0003"+ + "\u0000\u0000\u0253\u0254\u0007\r\u0000\u0000\u0254\u0255\u0007\u0010\u0000"+ + "\u0000\u0255\u0256\u0007\u0010\u0000\u0000\u0256\u0257\u0007\u0007\u0000"+ + "\u0000\u0257\u0258\u0007\u0001\u0000\u0000\u0258\u0259\u0007\u000e\u0000"+ + "\u0000\u0259\u02a6\u0007\u0003\u0000\u0000\u025a\u025b\u0005@\u0000\u0000"+ + "\u025b\u025c\u0007\u001d\u0000\u0000\u025c\u025d\u0007\b\u0000\u0000\u025d"+ + "\u025e\u0007\u0004\u0000\u0000\u025e\u025f\u0007\f\u0000\u0000\u025f\u0260"+ + "\u0005-\u0000\u0000\u0260\u0261\u0007\u000e\u0000\u0000\u0261\u0262\u0007"+ + "\u0001\u0000\u0000\u0262\u0263\u0007\u0000\u0000\u0000\u0263\u0264\u0007"+ + "\u000b\u0000\u0000\u0264\u0265\u0007\u0003\u0000\u0000\u0265\u0266\u0007"+ + "\b\u0000\u0000\u0266\u0267\u0007\u000e\u0000\u0000\u0267\u0268\u0007\b"+ + "\u0000\u0000\u0268\u0269\u0007\u0007\u0000\u0000\u0269\u02a6\u0007\u000b"+ + "\u0000\u0000\u026a\u026b\u0005@\u0000\u0000\u026b\u026c\u0007\u0005\u0000"+ + "\u0000\u026c\u026d\u0007\u0007\u0000\u0000\u026d\u026e\u0007\u000b\u0000"+ + "\u0000\u026e\u026f\u0007\u000e\u0000\u0000\u026f\u0270\u0007\u0000\u0000"+ + "\u0000\u0270\u0271\u0007\b\u0000\u0000\u0271\u0272\u0007\u000b\u0000\u0000"+ + "\u0272\u0273\u0007\u0004\u0000\u0000\u0273\u02a6\u0007\u0001\u0000\u0000"+ + "\u0274\u0275\u0005@\u0000\u0000\u0275\u0276\u0007\u0005\u0000\u0000\u0276"+ + "\u0277\u0007\u0007\u0000\u0000\u0277\u0278\u0007\n\u0000\u0000\u0278\u0279"+ + "\u0007\u0007\u0000\u0000\u0279\u027a\u0007\u0001\u0000\u0000\u027a\u027b"+ + "\u0005-\u0000\u0000\u027b\u027c\u0007\u0010\u0000\u0000\u027c\u027d\u0007"+ + "\u0001\u0000\u0000\u027d\u027e\u0007\u0007\u0000\u0000\u027e\u027f\u0007"+ + "\t\u0000\u0000\u027f\u0280\u0007\b\u0000\u0000\u0280\u0281\u0007\n\u0000"+ + "\u0000\u0281\u02a6\u0007\u0004\u0000\u0000\u0282\u0283\u0005@\u0000\u0000"+ + "\u0283\u0284\u0007\u0003\u0000\u0000\u0284\u0285\u0007\u000e\u0000\u0000"+ + "\u0285\u0286\u0007\u0002\u0000\u0000\u0286\u0287\u0007\n\u0000\u0000\u0287"+ + "\u0288\u0007\u0004\u0000\u0000\u0288\u0289\u0007\u0003\u0000\u0000\u0289"+ + "\u028a\u0007\u0004\u0000\u0000\u028a\u02a6\u0007\u000e\u0000\u0000\u028b"+ + "\u028c\u0005@\u0000\u0000\u028c\u028d\u0007\t\u0000\u0000\u028d\u028e"+ + "\u0007\u0007\u0000\u0000\u028e\u028f\u0007\u000b\u0000\u0000\u028f\u0290"+ + "\u0007\u000e\u0000\u0000\u0290\u0291\u0005-\u0000\u0000\u0291\u0292\u0007"+ + "\u0010\u0000\u0000\u0292\u0293\u0007\u0000\u0000\u0000\u0293\u0294\u0007"+ + "\n\u0000\u0000\u0294\u0295\u0007\u0004\u0000\u0000\u0295\u0296\u0007\u000e"+ + "\u0000\u0000\u0296\u0297\u0007\u000e\u0000\u0000\u0297\u0298\u0007\u0004"+ + "\u0000\u0000\u0298\u0299\u0005-\u0000\u0000\u0299\u029a\u0007\u001d\u0000"+ + "\u0000\u029a\u029b\u0007\u0000\u0000\u0000\u029b\u029c\u0007\n\u0000\u0000"+ + "\u029c\u029d\u0007\r\u0000\u0000\u029d\u029e\u0007\u0004\u0000\u0000\u029e"+ + "\u02a6\u0007\u0003\u0000\u0000\u029f\u02a0\u0005@\u0000\u0000\u02a0\u02a1"+ + "\u0007\u000f\u0000\u0000\u02a1\u02a2\u0007\u0004\u0000\u0000\u02a2\u02a3"+ + "\u0007\u0013\u0000\u0000\u02a3\u02a4\u0007\b\u0000\u0000\u02a4\u02a6\u0007"+ + "\u0000\u0000\u0000\u02a5\u01a6\u0001\u0000\u0000\u0000\u02a5\u01ae\u0001"+ + "\u0000\u0000\u0000\u02a5\u01b5\u0001\u0000\u0000\u0000\u02a5\u01bf\u0001"+ + "\u0000\u0000\u0000\u02a5\u01c8\u0001\u0000\u0000\u0000\u02a5\u01d2\u0001"+ + "\u0000\u0000\u0000\u02a5\u01d7\u0001\u0000\u0000\u0000\u02a5\u01dd\u0001"+ + "\u0000\u0000\u0000\u02a5\u01e6\u0001\u0000\u0000\u0000\u02a5\u01ef\u0001"+ + "\u0000\u0000\u0000\u02a5\u01f5\u0001\u0000\u0000\u0000\u02a5\u0207\u0001"+ + "\u0000\u0000\u0000\u02a5\u0211\u0001\u0000\u0000\u0000\u02a5\u021f\u0001"+ + "\u0000\u0000\u0000\u02a5\u0233\u0001\u0000\u0000\u0000\u02a5\u023c\u0001"+ + "\u0000\u0000\u0000\u02a5\u0242\u0001\u0000\u0000\u0000\u02a5\u0251\u0001"+ + "\u0000\u0000\u0000\u02a5\u025a\u0001\u0000\u0000\u0000\u02a5\u026a\u0001"+ + "\u0000\u0000\u0000\u02a5\u0274\u0001\u0000\u0000\u0000\u02a5\u0282\u0001"+ + "\u0000\u0000\u0000\u02a5\u028b\u0001\u0000\u0000\u0000\u02a5\u029f\u0001"+ + "\u0000\u0000\u0000\u02a6\u02aa\u0001\u0000\u0000\u0000\u02a7\u02a9\u0007"+ + "\u0019\u0000\u0000\u02a8\u02a7\u0001\u0000\u0000\u0000\u02a9\u02ac\u0001"+ + "\u0000\u0000\u0000\u02aa\u02a8\u0001\u0000\u0000\u0000\u02aa\u02ab\u0001"+ + "\u0000\u0000\u0000\u02ab\u02ae\u0001\u0000\u0000\u0000\u02ac\u02aa\u0001"+ + "\u0000\u0000\u0000\u02ad\u0178\u0001\u0000\u0000\u0000\u02ad\u017b\u0001"+ + "\u0000\u0000\u0000\u02ad\u0181\u0001\u0000\u0000\u0000\u02ad\u0187\u0001"+ + "\u0000\u0000\u0000\u02ad\u02a5\u0001\u0000\u0000\u0000\u02ae\u02af\u0001"+ + "\u0000\u0000\u0000\u02af\u02b0\u0006/\u0002\u0000\u02b0a\u0001\u0000\u0000"+ + "\u0000\u02b1\u02b2\u0005-\u0000\u0000\u02b2\u02b3\u0005-\u0000\u0000\u02b3"+ + "\u02b4\u0005}\u0000\u0000\u02b4\u02b5\u0005}\u0000\u0000\u02b5\u02b6\u0001"+ + "\u0000\u0000\u0000\u02b6\u02b7\u00060\u0003\u0000\u02b7\u02b8\u00060\u0000"+ + "\u0000\u02b8c\u0001\u0000\u0000\u0000\u02b9\u02ba\t\u0000\u0000\u0000"+ + "\u02ba\u02bb\u00041\u0000\u0000\u02bb\u02bc\u0001\u0000\u0000\u0000\u02bc"+ + "\u02bd\u00061\u0000\u0000\u02bde\u0001\u0000\u0000\u0000\u02be\u02bf\t"+ + "\u0000\u0000\u0000\u02bf\u02c0\u0001\u0000\u0000\u0000\u02c0\u02c1\u0006"+ + "2\u0000\u0000\u02c1g\u0001\u0000\u0000\u0000\u02c2\u02c3\u0005\u0000\u0000"+ + "\u0001\u02c3\u02c4\u0001\u0000\u0000\u0000\u02c4\u02c5\u00063\u0003\u0000"+ + "\u02c5\u02c6\u00063\u0000\u0000\u02c6i\u0001\u0000\u0000\u0000 \u0000"+ + "\u0001\u008c\u00b0\u00e6\u00e9\u00ef\u00f9\u0102\u010a\u010f\u0111\u0120"+ + "\u012c\u0133\u013b\u013d\u0146\u0148\u014f\u0157\u0170\u0174\u017f\u0185"+ + "\u0191\u019d\u01a2\u01a4\u02a5\u02aa\u02ad\u0004\u0006\u0000\u0000\u0005"+ + "\u0001\u0000\u0007\u0001\u0000\u0004\u0000\u0000"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.g4 b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.g4 new file mode 100644 index 000000000000..824c08d5b262 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.g4 @@ -0,0 +1,175 @@ +parser grammar BladePhpAntlrParser; + +@header{ + package org.netbeans.modules.php.blade.syntax.antlr4.php; +} + +options { + superClass = ParserAdaptor; + tokenVocab = BladePhpAntlrLexer; + } + +expression : exprStatement* EOF; + +exprStatement : + //empty statement + ';' + | '{' exprStatement* '}' + | '(' exprStatement* ')' + | COMPARISON_OPERATOR exprStatement + | LOGICAL_UNION_OPERATOR functionalExpr+ + | 'foreach' '(' foreachArguments ')' + | functionalExpr + | ifStatement + | foreachDirectiveStatement + | output + | misc +; + +logicalStatement: + '(' functionalExpr* ')' + | functionalExpr (LOGICAL_UNION_OPERATOR functionalExpr)+ + | functionalExpr (COMPARISON_OPERATOR functionalExpr)+ + | functionalExpr +; + +ifStatement: + //long expr + 'if' '(' logicalStatement+ ')' '{' exprStatement* '}' + (ELSEIF '(' logicalStatement+ ')' '{' exprStatement* '}' )* + ('else' '{' exprStatement* '}')? + ; + +inputExpr: + varExpr + ; + +functionalExpr: + matchStatement + | classExpression (classMember)* + | functionExpr + | LANG_CONSTRUCT '(' functionalExpr ')' + | inputExpr + ; + +classExpression: + classInstanceStatement + | staticMethodAccess + | staticFieldAccess + | staticClassReference + | staticAccess + | aliasDirectAccess + | directMethodAccess + ; + +foreachDirectiveStatement: + {this.bladeParserContext.equals(ParserContext.FOREACH)}? foreachArguments + ; + +foreachArguments: + (array | main_array = PHP_VARIABLE) 'as' array_item=PHP_VARIABLE + | (array | main_array = PHP_VARIABLE) 'as' array_key=PHP_VARIABLE '=>' array_item=PHP_VARIABLE + | functionExpr 'as' functionExpr ('=>' functionExpr)? +; + +classInstanceStatement: + 'new' namespace? className=IDENTIFIER arguments? + ; + +matchStatement: + 'match' '(' functionalExpr ')' '{' + (functionalExpr+ (',' functionalExpr+)* '=>' functionalExpr+)* + (',' functionalExpr+ (',' functionalExpr+)* '=>' functionalExpr+)* + ','? + '}' +; +staticClassReference : + namespace? IDENTIFIER '::' CLASS +; + +staticMethodAccess : + namespace? className=IDENTIFIER '::' method=IDENTIFIER arguments +; + +staticFieldAccess : + namespace? className=IDENTIFIER '::' (const=IDENTIFIER | propertyAlias=PHP_VARIABLE | 'class') + | classAlias=PHP_VARIABLE '::' const=IDENTIFIER + | classAlias=PHP_VARIABLE '::' propertyAlias=PHP_VARIABLE +; + +staticAccess : + //should throw an error? + namespace? className=IDENTIFIER '::' +; + +aliasDirectAccess: + PHP_VARIABLE classMember + ; + +classMember: + directMethodAccess + | '->' IDENTIFIER +; + +directMethodAccess : + '->' IDENTIFIER arguments +; + +directAccess : + IDENTIFIER arguments '->' IDENTIFIER arguments +; + +functionExpr : + IDENTIFIER arguments +; + +arguments : + '(' argument (',' argument )* ')' + | '(' ')' + ; + +namespace : + '\\'? (IDENTIFIER '\\')+ + | '\\' +; + +argument: + functionalExpr + | IDENTIFIER + ; + +array: + PHP_VARIABLE array_key_item+ + | array_key_item +; + +array_key_item: + '[' array_key_item* ']' + | 'array' '(' array_key_item* ')' + | '[' (array_child '=>' array_key_item)+ ']' + | 'array' '(' (array_child '=>' array_key_item)+ ')' + | '[' array_child (',' array_child)* ','? ']' + | 'array' '(' array_child (',' array_child)* ','? ')' +; + +array_child: + functionalExpr '=>' array_key_item + | functionalExpr '=>' functionalExpr + | functionalExpr + ; + +varExpr: + array + | '$'? PHP_VARIABLE + | STRING_LITERAL +; + +misc: + 'new' PHP_VARIABLE arguments? + | 'new' namespace //incomplete namespcace + | namespace className=IDENTIFIER +; + +output: + 'echo' functionalExpr +; \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.java new file mode 100644 index 000000000000..e1ee5b6d97d8 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.java @@ -0,0 +1,3208 @@ +// Generated from BladePhpAntlrParser.g4 by ANTLR 4.13.0 + + package org.netbeans.modules.php.blade.syntax.antlr4.php; + +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.misc.*; +import org.antlr.v4.runtime.tree.*; +import java.util.List; +import java.util.Iterator; +import java.util.ArrayList; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +public class BladePhpAntlrParser extends ParserAdaptor { + static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + HTML=1, BLADE_COMMENT=2, LINE_COMMENT=3, ARRAY=4, AS=5, ECHO=6, IF=7, + ELSEIF=8, ELSE=9, NEW=10, CLASS=11, FUNCTION=12, LANG_CONSTRUCT=13, MATCH=14, + FOREACH=15, COMMA=16, LPAREN=17, RPAREN=18, LSQUAREBRACKET=19, RSQUAREBRACKET=20, + LCURLYBRACE=21, RCURLYBRACE=22, IDENTIFIER=23, PHP_VARIABLE=24, DOLLAR=25, + NAMESPACE_SEPARATOR=26, DOUBLE_COLON=27, ARROW=28, OBJECT_OPERATOR=29, + SEMI_COLON=30, COMPARISON_OPERATOR=31, LOGICAL_UNION_OPERATOR=32, STRING_LITERAL=33, + STYLE_COMMENT=34, WS=35, PHP_DIRECTIVE=36, OTHER=37, BLADE_COMMENT_START=38, + EMAIL_SUBSTRING=39, VERSION_WITH_AT=40, BLADE_COMMENT_END=41, BLADE_COMMENT_PEEK=42, + BLADE_COMMENT_MORE=43, BLADE_COMMENT_EOF=44; + public static final int + RULE_expression = 0, RULE_exprStatement = 1, RULE_logicalStatement = 2, + RULE_ifStatement = 3, RULE_inputExpr = 4, RULE_functionalExpr = 5, RULE_classExpression = 6, + RULE_foreachDirectiveStatement = 7, RULE_foreachArguments = 8, RULE_classInstanceStatement = 9, + RULE_matchStatement = 10, RULE_staticClassReference = 11, RULE_staticMethodAccess = 12, + RULE_staticFieldAccess = 13, RULE_staticAccess = 14, RULE_aliasDirectAccess = 15, + RULE_classMember = 16, RULE_directMethodAccess = 17, RULE_directAccess = 18, + RULE_functionExpr = 19, RULE_arguments = 20, RULE_namespace = 21, RULE_argument = 22, + RULE_array = 23, RULE_array_key_item = 24, RULE_array_child = 25, RULE_varExpr = 26, + RULE_misc = 27, RULE_output = 28; + private static String[] makeRuleNames() { + return new String[] { + "expression", "exprStatement", "logicalStatement", "ifStatement", "inputExpr", + "functionalExpr", "classExpression", "foreachDirectiveStatement", "foreachArguments", + "classInstanceStatement", "matchStatement", "staticClassReference", "staticMethodAccess", + "staticFieldAccess", "staticAccess", "aliasDirectAccess", "classMember", + "directMethodAccess", "directAccess", "functionExpr", "arguments", "namespace", + "argument", "array", "array_key_item", "array_child", "varExpr", "misc", + "output" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, "'array'", "'as'", "'echo'", "'if'", null, "'else'", + "'new'", "'class'", "'function'", null, "'match'", "'foreach'", "','", + "'('", "')'", "'['", "']'", "'{'", "'}'", null, null, "'$'", "'\\'", + "'::'", "'=>'", "'->'", "';'", null, null, null, null, null, null, null, + "'{{--'", null, null, "'--}}'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "HTML", "BLADE_COMMENT", "LINE_COMMENT", "ARRAY", "AS", "ECHO", + "IF", "ELSEIF", "ELSE", "NEW", "CLASS", "FUNCTION", "LANG_CONSTRUCT", + "MATCH", "FOREACH", "COMMA", "LPAREN", "RPAREN", "LSQUAREBRACKET", "RSQUAREBRACKET", + "LCURLYBRACE", "RCURLYBRACE", "IDENTIFIER", "PHP_VARIABLE", "DOLLAR", + "NAMESPACE_SEPARATOR", "DOUBLE_COLON", "ARROW", "OBJECT_OPERATOR", "SEMI_COLON", + "COMPARISON_OPERATOR", "LOGICAL_UNION_OPERATOR", "STRING_LITERAL", "STYLE_COMMENT", + "WS", "PHP_DIRECTIVE", "OTHER", "BLADE_COMMENT_START", "EMAIL_SUBSTRING", + "VERSION_WITH_AT", "BLADE_COMMENT_END", "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", + "BLADE_COMMENT_EOF" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + @Override + public String getGrammarFileName() { return "BladePhpAntlrParser.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public ATN getATN() { return _ATN; } + + public BladePhpAntlrParser(TokenStream input) { + super(input); + _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @SuppressWarnings("CheckReturnValue") + public static class ExpressionContext extends ParserRuleContext { + public TerminalNode EOF() { return getToken(BladePhpAntlrParser.EOF, 0); } + public List exprStatement() { + return getRuleContexts(ExprStatementContext.class); + } + public ExprStatementContext exprStatement(int i) { + return getRuleContext(ExprStatementContext.class,i); + } + public ExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitExpression(this); + } + } + + public final ExpressionContext expression() throws RecognitionException { + ExpressionContext _localctx = new ExpressionContext(_ctx, getState()); + enterRule(_localctx, 0, RULE_expression); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(61); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,0,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(58); + exprStatement(); + } + } + } + setState(63); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,0,_ctx); + } + setState(64); + match(EOF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ExprStatementContext extends ParserRuleContext { + public TerminalNode SEMI_COLON() { return getToken(BladePhpAntlrParser.SEMI_COLON, 0); } + public TerminalNode LCURLYBRACE() { return getToken(BladePhpAntlrParser.LCURLYBRACE, 0); } + public TerminalNode RCURLYBRACE() { return getToken(BladePhpAntlrParser.RCURLYBRACE, 0); } + public List exprStatement() { + return getRuleContexts(ExprStatementContext.class); + } + public ExprStatementContext exprStatement(int i) { + return getRuleContext(ExprStatementContext.class,i); + } + public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } + public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } + public TerminalNode COMPARISON_OPERATOR() { return getToken(BladePhpAntlrParser.COMPARISON_OPERATOR, 0); } + public TerminalNode LOGICAL_UNION_OPERATOR() { return getToken(BladePhpAntlrParser.LOGICAL_UNION_OPERATOR, 0); } + public List functionalExpr() { + return getRuleContexts(FunctionalExprContext.class); + } + public FunctionalExprContext functionalExpr(int i) { + return getRuleContext(FunctionalExprContext.class,i); + } + public TerminalNode FOREACH() { return getToken(BladePhpAntlrParser.FOREACH, 0); } + public ForeachArgumentsContext foreachArguments() { + return getRuleContext(ForeachArgumentsContext.class,0); + } + public IfStatementContext ifStatement() { + return getRuleContext(IfStatementContext.class,0); + } + public ForeachDirectiveStatementContext foreachDirectiveStatement() { + return getRuleContext(ForeachDirectiveStatementContext.class,0); + } + public OutputContext output() { + return getRuleContext(OutputContext.class,0); + } + public MiscContext misc() { + return getRuleContext(MiscContext.class,0); + } + public ExprStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_exprStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterExprStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitExprStatement(this); + } + } + + public final ExprStatementContext exprStatement() throws RecognitionException { + ExprStatementContext _localctx = new ExprStatementContext(_ctx, getState()); + enterRule(_localctx, 2, RULE_exprStatement); + try { + int _alt; + setState(101); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(66); + match(SEMI_COLON); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(67); + match(LCURLYBRACE); + setState(71); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,1,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(68); + exprStatement(); + } + } + } + setState(73); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,1,_ctx); + } + setState(74); + match(RCURLYBRACE); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(75); + match(LPAREN); + setState(79); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,2,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(76); + exprStatement(); + } + } + } + setState(81); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,2,_ctx); + } + setState(82); + match(RPAREN); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(83); + match(COMPARISON_OPERATOR); + setState(84); + exprStatement(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(85); + match(LOGICAL_UNION_OPERATOR); + setState(87); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(86); + functionalExpr(); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(89); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,3,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(91); + match(FOREACH); + setState(92); + match(LPAREN); + setState(93); + foreachArguments(); + setState(94); + match(RPAREN); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(96); + functionalExpr(); + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(97); + ifStatement(); + } + break; + case 9: + enterOuterAlt(_localctx, 9); + { + setState(98); + foreachDirectiveStatement(); + } + break; + case 10: + enterOuterAlt(_localctx, 10); + { + setState(99); + output(); + } + break; + case 11: + enterOuterAlt(_localctx, 11); + { + setState(100); + misc(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class LogicalStatementContext extends ParserRuleContext { + public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } + public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } + public List functionalExpr() { + return getRuleContexts(FunctionalExprContext.class); + } + public FunctionalExprContext functionalExpr(int i) { + return getRuleContext(FunctionalExprContext.class,i); + } + public List LOGICAL_UNION_OPERATOR() { return getTokens(BladePhpAntlrParser.LOGICAL_UNION_OPERATOR); } + public TerminalNode LOGICAL_UNION_OPERATOR(int i) { + return getToken(BladePhpAntlrParser.LOGICAL_UNION_OPERATOR, i); + } + public List COMPARISON_OPERATOR() { return getTokens(BladePhpAntlrParser.COMPARISON_OPERATOR); } + public TerminalNode COMPARISON_OPERATOR(int i) { + return getToken(BladePhpAntlrParser.COMPARISON_OPERATOR, i); + } + public LogicalStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_logicalStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterLogicalStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitLogicalStatement(this); + } + } + + public final LogicalStatementContext logicalStatement() throws RecognitionException { + LogicalStatementContext _localctx = new LogicalStatementContext(_ctx, getState()); + enterRule(_localctx, 4, RULE_logicalStatement); + int _la; + try { + setState(126); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,8,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(103); + match(LPAREN); + setState(107); + _errHandler.sync(this); + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0)) { + { + { + setState(104); + functionalExpr(); + } + } + setState(109); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(110); + match(RPAREN); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(111); + functionalExpr(); + setState(114); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(112); + match(LOGICAL_UNION_OPERATOR); + setState(113); + functionalExpr(); + } + } + setState(116); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==LOGICAL_UNION_OPERATOR ); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(118); + functionalExpr(); + setState(121); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(119); + match(COMPARISON_OPERATOR); + setState(120); + functionalExpr(); + } + } + setState(123); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==COMPARISON_OPERATOR ); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(125); + functionalExpr(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IfStatementContext extends ParserRuleContext { + public TerminalNode IF() { return getToken(BladePhpAntlrParser.IF, 0); } + public List LPAREN() { return getTokens(BladePhpAntlrParser.LPAREN); } + public TerminalNode LPAREN(int i) { + return getToken(BladePhpAntlrParser.LPAREN, i); + } + public List RPAREN() { return getTokens(BladePhpAntlrParser.RPAREN); } + public TerminalNode RPAREN(int i) { + return getToken(BladePhpAntlrParser.RPAREN, i); + } + public List LCURLYBRACE() { return getTokens(BladePhpAntlrParser.LCURLYBRACE); } + public TerminalNode LCURLYBRACE(int i) { + return getToken(BladePhpAntlrParser.LCURLYBRACE, i); + } + public List RCURLYBRACE() { return getTokens(BladePhpAntlrParser.RCURLYBRACE); } + public TerminalNode RCURLYBRACE(int i) { + return getToken(BladePhpAntlrParser.RCURLYBRACE, i); + } + public List logicalStatement() { + return getRuleContexts(LogicalStatementContext.class); + } + public LogicalStatementContext logicalStatement(int i) { + return getRuleContext(LogicalStatementContext.class,i); + } + public List exprStatement() { + return getRuleContexts(ExprStatementContext.class); + } + public ExprStatementContext exprStatement(int i) { + return getRuleContext(ExprStatementContext.class,i); + } + public List ELSEIF() { return getTokens(BladePhpAntlrParser.ELSEIF); } + public TerminalNode ELSEIF(int i) { + return getToken(BladePhpAntlrParser.ELSEIF, i); + } + public TerminalNode ELSE() { return getToken(BladePhpAntlrParser.ELSE, 0); } + public IfStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_ifStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterIfStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitIfStatement(this); + } + } + + public final IfStatementContext ifStatement() throws RecognitionException { + IfStatementContext _localctx = new IfStatementContext(_ctx, getState()); + enterRule(_localctx, 6, RULE_ifStatement); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(128); + match(IF); + setState(129); + match(LPAREN); + setState(131); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(130); + logicalStatement(); + } + } + setState(133); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253315600L) != 0) ); + setState(135); + match(RPAREN); + setState(136); + match(LCURLYBRACE); + setState(140); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,10,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(137); + exprStatement(); + } + } + } + setState(142); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,10,_ctx); + } + setState(143); + match(RCURLYBRACE); + setState(163); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,13,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(144); + match(ELSEIF); + setState(145); + match(LPAREN); + setState(147); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(146); + logicalStatement(); + } + } + setState(149); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253315600L) != 0) ); + setState(151); + match(RPAREN); + setState(152); + match(LCURLYBRACE); + setState(156); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,12,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(153); + exprStatement(); + } + } + } + setState(158); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,12,_ctx); + } + setState(159); + match(RCURLYBRACE); + } + } + } + setState(165); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,13,_ctx); + } + setState(175); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { + case 1: + { + setState(166); + match(ELSE); + setState(167); + match(LCURLYBRACE); + setState(171); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,14,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(168); + exprStatement(); + } + } + } + setState(173); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,14,_ctx); + } + setState(174); + match(RCURLYBRACE); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class InputExprContext extends ParserRuleContext { + public VarExprContext varExpr() { + return getRuleContext(VarExprContext.class,0); + } + public InputExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_inputExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterInputExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitInputExpr(this); + } + } + + public final InputExprContext inputExpr() throws RecognitionException { + InputExprContext _localctx = new InputExprContext(_ctx, getState()); + enterRule(_localctx, 8, RULE_inputExpr); + try { + enterOuterAlt(_localctx, 1); + { + setState(177); + varExpr(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FunctionalExprContext extends ParserRuleContext { + public MatchStatementContext matchStatement() { + return getRuleContext(MatchStatementContext.class,0); + } + public ClassExpressionContext classExpression() { + return getRuleContext(ClassExpressionContext.class,0); + } + public List classMember() { + return getRuleContexts(ClassMemberContext.class); + } + public ClassMemberContext classMember(int i) { + return getRuleContext(ClassMemberContext.class,i); + } + public FunctionExprContext functionExpr() { + return getRuleContext(FunctionExprContext.class,0); + } + public TerminalNode LANG_CONSTRUCT() { return getToken(BladePhpAntlrParser.LANG_CONSTRUCT, 0); } + public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } + public FunctionalExprContext functionalExpr() { + return getRuleContext(FunctionalExprContext.class,0); + } + public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } + public InputExprContext inputExpr() { + return getRuleContext(InputExprContext.class,0); + } + public FunctionalExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_functionalExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterFunctionalExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitFunctionalExpr(this); + } + } + + public final FunctionalExprContext functionalExpr() throws RecognitionException { + FunctionalExprContext _localctx = new FunctionalExprContext(_ctx, getState()); + enterRule(_localctx, 10, RULE_functionalExpr); + try { + int _alt; + setState(194); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,17,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(179); + matchStatement(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(180); + classExpression(); + setState(184); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,16,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(181); + classMember(); + } + } + } + setState(186); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,16,_ctx); + } + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(187); + functionExpr(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(188); + match(LANG_CONSTRUCT); + setState(189); + match(LPAREN); + setState(190); + functionalExpr(); + setState(191); + match(RPAREN); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(193); + inputExpr(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ClassExpressionContext extends ParserRuleContext { + public ClassInstanceStatementContext classInstanceStatement() { + return getRuleContext(ClassInstanceStatementContext.class,0); + } + public StaticMethodAccessContext staticMethodAccess() { + return getRuleContext(StaticMethodAccessContext.class,0); + } + public StaticFieldAccessContext staticFieldAccess() { + return getRuleContext(StaticFieldAccessContext.class,0); + } + public StaticClassReferenceContext staticClassReference() { + return getRuleContext(StaticClassReferenceContext.class,0); + } + public StaticAccessContext staticAccess() { + return getRuleContext(StaticAccessContext.class,0); + } + public AliasDirectAccessContext aliasDirectAccess() { + return getRuleContext(AliasDirectAccessContext.class,0); + } + public DirectMethodAccessContext directMethodAccess() { + return getRuleContext(DirectMethodAccessContext.class,0); + } + public ClassExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_classExpression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterClassExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitClassExpression(this); + } + } + + public final ClassExpressionContext classExpression() throws RecognitionException { + ClassExpressionContext _localctx = new ClassExpressionContext(_ctx, getState()); + enterRule(_localctx, 12, RULE_classExpression); + try { + setState(203); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(196); + classInstanceStatement(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(197); + staticMethodAccess(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(198); + staticFieldAccess(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(199); + staticClassReference(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(200); + staticAccess(); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(201); + aliasDirectAccess(); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(202); + directMethodAccess(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ForeachDirectiveStatementContext extends ParserRuleContext { + public ForeachArgumentsContext foreachArguments() { + return getRuleContext(ForeachArgumentsContext.class,0); + } + public ForeachDirectiveStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_foreachDirectiveStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterForeachDirectiveStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitForeachDirectiveStatement(this); + } + } + + public final ForeachDirectiveStatementContext foreachDirectiveStatement() throws RecognitionException { + ForeachDirectiveStatementContext _localctx = new ForeachDirectiveStatementContext(_ctx, getState()); + enterRule(_localctx, 14, RULE_foreachDirectiveStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(205); + if (!(this.bladeParserContext.equals(ParserContext.FOREACH))) throw new FailedPredicateException(this, "this.bladeParserContext.equals(ParserContext.FOREACH)"); + setState(206); + foreachArguments(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ForeachArgumentsContext extends ParserRuleContext { + public Token main_array; + public Token array_item; + public Token array_key; + public TerminalNode AS() { return getToken(BladePhpAntlrParser.AS, 0); } + public List PHP_VARIABLE() { return getTokens(BladePhpAntlrParser.PHP_VARIABLE); } + public TerminalNode PHP_VARIABLE(int i) { + return getToken(BladePhpAntlrParser.PHP_VARIABLE, i); + } + public ArrayContext array() { + return getRuleContext(ArrayContext.class,0); + } + public TerminalNode ARROW() { return getToken(BladePhpAntlrParser.ARROW, 0); } + public List functionExpr() { + return getRuleContexts(FunctionExprContext.class); + } + public FunctionExprContext functionExpr(int i) { + return getRuleContext(FunctionExprContext.class,i); + } + public ForeachArgumentsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_foreachArguments; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterForeachArguments(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitForeachArguments(this); + } + } + + public final ForeachArgumentsContext foreachArguments() throws RecognitionException { + ForeachArgumentsContext _localctx = new ForeachArgumentsContext(_ctx, getState()); + enterRule(_localctx, 16, RULE_foreachArguments); + try { + setState(229); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(210); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) { + case 1: + { + setState(208); + array(); + } + break; + case 2: + { + setState(209); + ((ForeachArgumentsContext)_localctx).main_array = match(PHP_VARIABLE); + } + break; + } + setState(212); + match(AS); + setState(213); + ((ForeachArgumentsContext)_localctx).array_item = match(PHP_VARIABLE); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(216); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) { + case 1: + { + setState(214); + array(); + } + break; + case 2: + { + setState(215); + ((ForeachArgumentsContext)_localctx).main_array = match(PHP_VARIABLE); + } + break; + } + setState(218); + match(AS); + setState(219); + ((ForeachArgumentsContext)_localctx).array_key = match(PHP_VARIABLE); + setState(220); + match(ARROW); + setState(221); + ((ForeachArgumentsContext)_localctx).array_item = match(PHP_VARIABLE); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(222); + functionExpr(); + setState(223); + match(AS); + setState(224); + functionExpr(); + setState(227); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,21,_ctx) ) { + case 1: + { + setState(225); + match(ARROW); + setState(226); + functionExpr(); + } + break; + } + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ClassInstanceStatementContext extends ParserRuleContext { + public Token className; + public TerminalNode NEW() { return getToken(BladePhpAntlrParser.NEW, 0); } + public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } + public NamespaceContext namespace() { + return getRuleContext(NamespaceContext.class,0); + } + public ArgumentsContext arguments() { + return getRuleContext(ArgumentsContext.class,0); + } + public ClassInstanceStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_classInstanceStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterClassInstanceStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitClassInstanceStatement(this); + } + } + + public final ClassInstanceStatementContext classInstanceStatement() throws RecognitionException { + ClassInstanceStatementContext _localctx = new ClassInstanceStatementContext(_ctx, getState()); + enterRule(_localctx, 18, RULE_classInstanceStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(231); + match(NEW); + setState(233); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,23,_ctx) ) { + case 1: + { + setState(232); + namespace(); + } + break; + } + setState(235); + ((ClassInstanceStatementContext)_localctx).className = match(IDENTIFIER); + setState(237); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) { + case 1: + { + setState(236); + arguments(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class MatchStatementContext extends ParserRuleContext { + public TerminalNode MATCH() { return getToken(BladePhpAntlrParser.MATCH, 0); } + public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } + public List functionalExpr() { + return getRuleContexts(FunctionalExprContext.class); + } + public FunctionalExprContext functionalExpr(int i) { + return getRuleContext(FunctionalExprContext.class,i); + } + public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } + public TerminalNode LCURLYBRACE() { return getToken(BladePhpAntlrParser.LCURLYBRACE, 0); } + public TerminalNode RCURLYBRACE() { return getToken(BladePhpAntlrParser.RCURLYBRACE, 0); } + public List ARROW() { return getTokens(BladePhpAntlrParser.ARROW); } + public TerminalNode ARROW(int i) { + return getToken(BladePhpAntlrParser.ARROW, i); + } + public List COMMA() { return getTokens(BladePhpAntlrParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(BladePhpAntlrParser.COMMA, i); + } + public MatchStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_matchStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterMatchStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitMatchStatement(this); + } + } + + public final MatchStatementContext matchStatement() throws RecognitionException { + MatchStatementContext _localctx = new MatchStatementContext(_ctx, getState()); + enterRule(_localctx, 20, RULE_matchStatement); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(239); + match(MATCH); + setState(240); + match(LPAREN); + setState(241); + functionalExpr(); + setState(242); + match(RPAREN); + setState(243); + match(LCURLYBRACE); + setState(268); + _errHandler.sync(this); + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0)) { + { + { + setState(245); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(244); + functionalExpr(); + } + } + setState(247); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); + setState(257); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(249); + match(COMMA); + setState(251); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(250); + functionalExpr(); + } + } + setState(253); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); + } + } + setState(259); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(260); + match(ARROW); + setState(262); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(261); + functionalExpr(); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(264); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,28,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + } + setState(270); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(296); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,34,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(271); + match(COMMA); + setState(273); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(272); + functionalExpr(); + } + } + setState(275); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); + setState(285); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(277); + match(COMMA); + setState(279); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(278); + functionalExpr(); + } + } + setState(281); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); + } + } + setState(287); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(288); + match(ARROW); + setState(290); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(289); + functionalExpr(); + } + } + setState(292); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); + } + } + } + setState(298); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,34,_ctx); + } + setState(300); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(299); + match(COMMA); + } + } + + setState(302); + match(RCURLYBRACE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StaticClassReferenceContext extends ParserRuleContext { + public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } + public TerminalNode DOUBLE_COLON() { return getToken(BladePhpAntlrParser.DOUBLE_COLON, 0); } + public TerminalNode CLASS() { return getToken(BladePhpAntlrParser.CLASS, 0); } + public NamespaceContext namespace() { + return getRuleContext(NamespaceContext.class,0); + } + public StaticClassReferenceContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_staticClassReference; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterStaticClassReference(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitStaticClassReference(this); + } + } + + public final StaticClassReferenceContext staticClassReference() throws RecognitionException { + StaticClassReferenceContext _localctx = new StaticClassReferenceContext(_ctx, getState()); + enterRule(_localctx, 22, RULE_staticClassReference); + try { + enterOuterAlt(_localctx, 1); + { + setState(305); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { + case 1: + { + setState(304); + namespace(); + } + break; + } + setState(307); + match(IDENTIFIER); + setState(308); + match(DOUBLE_COLON); + setState(309); + match(CLASS); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StaticMethodAccessContext extends ParserRuleContext { + public Token className; + public Token method; + public TerminalNode DOUBLE_COLON() { return getToken(BladePhpAntlrParser.DOUBLE_COLON, 0); } + public ArgumentsContext arguments() { + return getRuleContext(ArgumentsContext.class,0); + } + public List IDENTIFIER() { return getTokens(BladePhpAntlrParser.IDENTIFIER); } + public TerminalNode IDENTIFIER(int i) { + return getToken(BladePhpAntlrParser.IDENTIFIER, i); + } + public NamespaceContext namespace() { + return getRuleContext(NamespaceContext.class,0); + } + public StaticMethodAccessContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_staticMethodAccess; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterStaticMethodAccess(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitStaticMethodAccess(this); + } + } + + public final StaticMethodAccessContext staticMethodAccess() throws RecognitionException { + StaticMethodAccessContext _localctx = new StaticMethodAccessContext(_ctx, getState()); + enterRule(_localctx, 24, RULE_staticMethodAccess); + try { + enterOuterAlt(_localctx, 1); + { + setState(312); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { + case 1: + { + setState(311); + namespace(); + } + break; + } + setState(314); + ((StaticMethodAccessContext)_localctx).className = match(IDENTIFIER); + setState(315); + match(DOUBLE_COLON); + setState(316); + ((StaticMethodAccessContext)_localctx).method = match(IDENTIFIER); + setState(317); + arguments(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StaticFieldAccessContext extends ParserRuleContext { + public Token className; + public Token const_; + public Token propertyAlias; + public Token classAlias; + public TerminalNode DOUBLE_COLON() { return getToken(BladePhpAntlrParser.DOUBLE_COLON, 0); } + public List IDENTIFIER() { return getTokens(BladePhpAntlrParser.IDENTIFIER); } + public TerminalNode IDENTIFIER(int i) { + return getToken(BladePhpAntlrParser.IDENTIFIER, i); + } + public TerminalNode CLASS() { return getToken(BladePhpAntlrParser.CLASS, 0); } + public NamespaceContext namespace() { + return getRuleContext(NamespaceContext.class,0); + } + public List PHP_VARIABLE() { return getTokens(BladePhpAntlrParser.PHP_VARIABLE); } + public TerminalNode PHP_VARIABLE(int i) { + return getToken(BladePhpAntlrParser.PHP_VARIABLE, i); + } + public StaticFieldAccessContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_staticFieldAccess; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterStaticFieldAccess(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitStaticFieldAccess(this); + } + } + + public final StaticFieldAccessContext staticFieldAccess() throws RecognitionException { + StaticFieldAccessContext _localctx = new StaticFieldAccessContext(_ctx, getState()); + enterRule(_localctx, 26, RULE_staticFieldAccess); + try { + setState(335); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,40,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(320); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { + case 1: + { + setState(319); + namespace(); + } + break; + } + setState(322); + ((StaticFieldAccessContext)_localctx).className = match(IDENTIFIER); + setState(323); + match(DOUBLE_COLON); + setState(327); + _errHandler.sync(this); + switch (_input.LA(1)) { + case IDENTIFIER: + { + setState(324); + ((StaticFieldAccessContext)_localctx).const_ = match(IDENTIFIER); + } + break; + case PHP_VARIABLE: + { + setState(325); + ((StaticFieldAccessContext)_localctx).propertyAlias = match(PHP_VARIABLE); + } + break; + case CLASS: + { + setState(326); + match(CLASS); + } + break; + default: + throw new NoViableAltException(this); + } + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(329); + ((StaticFieldAccessContext)_localctx).classAlias = match(PHP_VARIABLE); + setState(330); + match(DOUBLE_COLON); + setState(331); + ((StaticFieldAccessContext)_localctx).const_ = match(IDENTIFIER); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(332); + ((StaticFieldAccessContext)_localctx).classAlias = match(PHP_VARIABLE); + setState(333); + match(DOUBLE_COLON); + setState(334); + ((StaticFieldAccessContext)_localctx).propertyAlias = match(PHP_VARIABLE); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StaticAccessContext extends ParserRuleContext { + public Token className; + public TerminalNode DOUBLE_COLON() { return getToken(BladePhpAntlrParser.DOUBLE_COLON, 0); } + public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } + public NamespaceContext namespace() { + return getRuleContext(NamespaceContext.class,0); + } + public StaticAccessContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_staticAccess; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterStaticAccess(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitStaticAccess(this); + } + } + + public final StaticAccessContext staticAccess() throws RecognitionException { + StaticAccessContext _localctx = new StaticAccessContext(_ctx, getState()); + enterRule(_localctx, 28, RULE_staticAccess); + try { + enterOuterAlt(_localctx, 1); + { + setState(338); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { + case 1: + { + setState(337); + namespace(); + } + break; + } + setState(340); + ((StaticAccessContext)_localctx).className = match(IDENTIFIER); + setState(341); + match(DOUBLE_COLON); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class AliasDirectAccessContext extends ParserRuleContext { + public TerminalNode PHP_VARIABLE() { return getToken(BladePhpAntlrParser.PHP_VARIABLE, 0); } + public ClassMemberContext classMember() { + return getRuleContext(ClassMemberContext.class,0); + } + public AliasDirectAccessContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_aliasDirectAccess; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterAliasDirectAccess(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitAliasDirectAccess(this); + } + } + + public final AliasDirectAccessContext aliasDirectAccess() throws RecognitionException { + AliasDirectAccessContext _localctx = new AliasDirectAccessContext(_ctx, getState()); + enterRule(_localctx, 30, RULE_aliasDirectAccess); + try { + enterOuterAlt(_localctx, 1); + { + setState(343); + match(PHP_VARIABLE); + setState(344); + classMember(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ClassMemberContext extends ParserRuleContext { + public DirectMethodAccessContext directMethodAccess() { + return getRuleContext(DirectMethodAccessContext.class,0); + } + public TerminalNode OBJECT_OPERATOR() { return getToken(BladePhpAntlrParser.OBJECT_OPERATOR, 0); } + public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } + public ClassMemberContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_classMember; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterClassMember(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitClassMember(this); + } + } + + public final ClassMemberContext classMember() throws RecognitionException { + ClassMemberContext _localctx = new ClassMemberContext(_ctx, getState()); + enterRule(_localctx, 32, RULE_classMember); + try { + setState(349); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(346); + directMethodAccess(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(347); + match(OBJECT_OPERATOR); + setState(348); + match(IDENTIFIER); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DirectMethodAccessContext extends ParserRuleContext { + public TerminalNode OBJECT_OPERATOR() { return getToken(BladePhpAntlrParser.OBJECT_OPERATOR, 0); } + public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } + public ArgumentsContext arguments() { + return getRuleContext(ArgumentsContext.class,0); + } + public DirectMethodAccessContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_directMethodAccess; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterDirectMethodAccess(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitDirectMethodAccess(this); + } + } + + public final DirectMethodAccessContext directMethodAccess() throws RecognitionException { + DirectMethodAccessContext _localctx = new DirectMethodAccessContext(_ctx, getState()); + enterRule(_localctx, 34, RULE_directMethodAccess); + try { + enterOuterAlt(_localctx, 1); + { + setState(351); + match(OBJECT_OPERATOR); + setState(352); + match(IDENTIFIER); + setState(353); + arguments(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DirectAccessContext extends ParserRuleContext { + public List IDENTIFIER() { return getTokens(BladePhpAntlrParser.IDENTIFIER); } + public TerminalNode IDENTIFIER(int i) { + return getToken(BladePhpAntlrParser.IDENTIFIER, i); + } + public List arguments() { + return getRuleContexts(ArgumentsContext.class); + } + public ArgumentsContext arguments(int i) { + return getRuleContext(ArgumentsContext.class,i); + } + public TerminalNode OBJECT_OPERATOR() { return getToken(BladePhpAntlrParser.OBJECT_OPERATOR, 0); } + public DirectAccessContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_directAccess; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterDirectAccess(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitDirectAccess(this); + } + } + + public final DirectAccessContext directAccess() throws RecognitionException { + DirectAccessContext _localctx = new DirectAccessContext(_ctx, getState()); + enterRule(_localctx, 36, RULE_directAccess); + try { + enterOuterAlt(_localctx, 1); + { + setState(355); + match(IDENTIFIER); + setState(356); + arguments(); + setState(357); + match(OBJECT_OPERATOR); + setState(358); + match(IDENTIFIER); + setState(359); + arguments(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FunctionExprContext extends ParserRuleContext { + public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } + public ArgumentsContext arguments() { + return getRuleContext(ArgumentsContext.class,0); + } + public FunctionExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_functionExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterFunctionExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitFunctionExpr(this); + } + } + + public final FunctionExprContext functionExpr() throws RecognitionException { + FunctionExprContext _localctx = new FunctionExprContext(_ctx, getState()); + enterRule(_localctx, 38, RULE_functionExpr); + try { + enterOuterAlt(_localctx, 1); + { + setState(361); + match(IDENTIFIER); + setState(362); + arguments(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ArgumentsContext extends ParserRuleContext { + public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } + public List argument() { + return getRuleContexts(ArgumentContext.class); + } + public ArgumentContext argument(int i) { + return getRuleContext(ArgumentContext.class,i); + } + public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } + public List COMMA() { return getTokens(BladePhpAntlrParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(BladePhpAntlrParser.COMMA, i); + } + public ArgumentsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_arguments; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterArguments(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitArguments(this); + } + } + + public final ArgumentsContext arguments() throws RecognitionException { + ArgumentsContext _localctx = new ArgumentsContext(_ctx, getState()); + enterRule(_localctx, 40, RULE_arguments); + int _la; + try { + setState(377); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(364); + match(LPAREN); + setState(365); + argument(); + setState(370); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(366); + match(COMMA); + setState(367); + argument(); + } + } + setState(372); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(373); + match(RPAREN); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(375); + match(LPAREN); + setState(376); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class NamespaceContext extends ParserRuleContext { + public List NAMESPACE_SEPARATOR() { return getTokens(BladePhpAntlrParser.NAMESPACE_SEPARATOR); } + public TerminalNode NAMESPACE_SEPARATOR(int i) { + return getToken(BladePhpAntlrParser.NAMESPACE_SEPARATOR, i); + } + public List IDENTIFIER() { return getTokens(BladePhpAntlrParser.IDENTIFIER); } + public TerminalNode IDENTIFIER(int i) { + return getToken(BladePhpAntlrParser.IDENTIFIER, i); + } + public NamespaceContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_namespace; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterNamespace(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitNamespace(this); + } + } + + public final NamespaceContext namespace() throws RecognitionException { + NamespaceContext _localctx = new NamespaceContext(_ctx, getState()); + enterRule(_localctx, 42, RULE_namespace); + int _la; + try { + int _alt; + setState(389); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(380); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NAMESPACE_SEPARATOR) { + { + setState(379); + match(NAMESPACE_SEPARATOR); + } + } + + setState(384); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(382); + match(IDENTIFIER); + setState(383); + match(NAMESPACE_SEPARATOR); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(386); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,46,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(388); + match(NAMESPACE_SEPARATOR); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ArgumentContext extends ParserRuleContext { + public FunctionalExprContext functionalExpr() { + return getRuleContext(FunctionalExprContext.class,0); + } + public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } + public ArgumentContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_argument; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterArgument(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitArgument(this); + } + } + + public final ArgumentContext argument() throws RecognitionException { + ArgumentContext _localctx = new ArgumentContext(_ctx, getState()); + enterRule(_localctx, 44, RULE_argument); + try { + setState(393); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(391); + functionalExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(392); + match(IDENTIFIER); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ArrayContext extends ParserRuleContext { + public TerminalNode PHP_VARIABLE() { return getToken(BladePhpAntlrParser.PHP_VARIABLE, 0); } + public List array_key_item() { + return getRuleContexts(Array_key_itemContext.class); + } + public Array_key_itemContext array_key_item(int i) { + return getRuleContext(Array_key_itemContext.class,i); + } + public ArrayContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_array; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterArray(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitArray(this); + } + } + + public final ArrayContext array() throws RecognitionException { + ArrayContext _localctx = new ArrayContext(_ctx, getState()); + enterRule(_localctx, 46, RULE_array); + try { + int _alt; + setState(402); + _errHandler.sync(this); + switch (_input.LA(1)) { + case PHP_VARIABLE: + enterOuterAlt(_localctx, 1); + { + setState(395); + match(PHP_VARIABLE); + setState(397); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(396); + array_key_item(); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(399); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,49,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + break; + case ARRAY: + case LSQUAREBRACKET: + enterOuterAlt(_localctx, 2); + { + setState(401); + array_key_item(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Array_key_itemContext extends ParserRuleContext { + public TerminalNode LSQUAREBRACKET() { return getToken(BladePhpAntlrParser.LSQUAREBRACKET, 0); } + public TerminalNode RSQUAREBRACKET() { return getToken(BladePhpAntlrParser.RSQUAREBRACKET, 0); } + public List array_key_item() { + return getRuleContexts(Array_key_itemContext.class); + } + public Array_key_itemContext array_key_item(int i) { + return getRuleContext(Array_key_itemContext.class,i); + } + public TerminalNode ARRAY() { return getToken(BladePhpAntlrParser.ARRAY, 0); } + public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } + public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } + public List array_child() { + return getRuleContexts(Array_childContext.class); + } + public Array_childContext array_child(int i) { + return getRuleContext(Array_childContext.class,i); + } + public List ARROW() { return getTokens(BladePhpAntlrParser.ARROW); } + public TerminalNode ARROW(int i) { + return getToken(BladePhpAntlrParser.ARROW, i); + } + public List COMMA() { return getTokens(BladePhpAntlrParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(BladePhpAntlrParser.COMMA, i); + } + public Array_key_itemContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_array_key_item; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterArray_key_item(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitArray_key_item(this); + } + } + + public final Array_key_itemContext array_key_item() throws RecognitionException { + Array_key_itemContext _localctx = new Array_key_itemContext(_ctx, getState()); + enterRule(_localctx, 48, RULE_array_key_item); + int _la; + try { + int _alt; + setState(473); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(404); + match(LSQUAREBRACKET); + setState(408); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==ARRAY || _la==LSQUAREBRACKET) { + { + { + setState(405); + array_key_item(); + } + } + setState(410); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(411); + match(RSQUAREBRACKET); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(412); + match(ARRAY); + setState(413); + match(LPAREN); + setState(417); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==ARRAY || _la==LSQUAREBRACKET) { + { + { + setState(414); + array_key_item(); + } + } + setState(419); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(420); + match(RPAREN); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(421); + match(LSQUAREBRACKET); + setState(426); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(422); + array_child(); + setState(423); + match(ARROW); + setState(424); + array_key_item(); + } + } + setState(428); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); + setState(430); + match(RSQUAREBRACKET); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(432); + match(ARRAY); + setState(433); + match(LPAREN); + setState(438); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(434); + array_child(); + setState(435); + match(ARROW); + setState(436); + array_key_item(); + } + } + setState(440); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); + setState(442); + match(RPAREN); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(444); + match(LSQUAREBRACKET); + setState(445); + array_child(); + setState(450); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,55,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(446); + match(COMMA); + setState(447); + array_child(); + } + } + } + setState(452); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,55,_ctx); + } + setState(454); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(453); + match(COMMA); + } + } + + setState(456); + match(RSQUAREBRACKET); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(458); + match(ARRAY); + setState(459); + match(LPAREN); + setState(460); + array_child(); + setState(465); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,57,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(461); + match(COMMA); + setState(462); + array_child(); + } + } + } + setState(467); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,57,_ctx); + } + setState(469); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(468); + match(COMMA); + } + } + + setState(471); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Array_childContext extends ParserRuleContext { + public List functionalExpr() { + return getRuleContexts(FunctionalExprContext.class); + } + public FunctionalExprContext functionalExpr(int i) { + return getRuleContext(FunctionalExprContext.class,i); + } + public TerminalNode ARROW() { return getToken(BladePhpAntlrParser.ARROW, 0); } + public Array_key_itemContext array_key_item() { + return getRuleContext(Array_key_itemContext.class,0); + } + public Array_childContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_array_child; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterArray_child(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitArray_child(this); + } + } + + public final Array_childContext array_child() throws RecognitionException { + Array_childContext _localctx = new Array_childContext(_ctx, getState()); + enterRule(_localctx, 50, RULE_array_child); + try { + setState(484); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(475); + functionalExpr(); + setState(476); + match(ARROW); + setState(477); + array_key_item(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(479); + functionalExpr(); + setState(480); + match(ARROW); + setState(481); + functionalExpr(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(483); + functionalExpr(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class VarExprContext extends ParserRuleContext { + public ArrayContext array() { + return getRuleContext(ArrayContext.class,0); + } + public TerminalNode PHP_VARIABLE() { return getToken(BladePhpAntlrParser.PHP_VARIABLE, 0); } + public TerminalNode DOLLAR() { return getToken(BladePhpAntlrParser.DOLLAR, 0); } + public TerminalNode STRING_LITERAL() { return getToken(BladePhpAntlrParser.STRING_LITERAL, 0); } + public VarExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_varExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterVarExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitVarExpr(this); + } + } + + public final VarExprContext varExpr() throws RecognitionException { + VarExprContext _localctx = new VarExprContext(_ctx, getState()); + enterRule(_localctx, 52, RULE_varExpr); + int _la; + try { + setState(492); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,62,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(486); + array(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(488); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==DOLLAR) { + { + setState(487); + match(DOLLAR); + } + } + + setState(490); + match(PHP_VARIABLE); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(491); + match(STRING_LITERAL); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class MiscContext extends ParserRuleContext { + public Token className; + public TerminalNode NEW() { return getToken(BladePhpAntlrParser.NEW, 0); } + public TerminalNode PHP_VARIABLE() { return getToken(BladePhpAntlrParser.PHP_VARIABLE, 0); } + public ArgumentsContext arguments() { + return getRuleContext(ArgumentsContext.class,0); + } + public NamespaceContext namespace() { + return getRuleContext(NamespaceContext.class,0); + } + public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } + public MiscContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_misc; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterMisc(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitMisc(this); + } + } + + public final MiscContext misc() throws RecognitionException { + MiscContext _localctx = new MiscContext(_ctx, getState()); + enterRule(_localctx, 54, RULE_misc); + try { + setState(504); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(494); + match(NEW); + setState(495); + match(PHP_VARIABLE); + setState(497); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { + case 1: + { + setState(496); + arguments(); + } + break; + } + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(499); + match(NEW); + setState(500); + namespace(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(501); + namespace(); + setState(502); + ((MiscContext)_localctx).className = match(IDENTIFIER); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class OutputContext extends ParserRuleContext { + public TerminalNode ECHO() { return getToken(BladePhpAntlrParser.ECHO, 0); } + public FunctionalExprContext functionalExpr() { + return getRuleContext(FunctionalExprContext.class,0); + } + public OutputContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_output; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterOutput(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitOutput(this); + } + } + + public final OutputContext output() throws RecognitionException { + OutputContext _localctx = new OutputContext(_ctx, getState()); + enterRule(_localctx, 56, RULE_output); + try { + enterOuterAlt(_localctx, 1); + { + setState(506); + match(ECHO); + setState(507); + functionalExpr(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { + switch (ruleIndex) { + case 7: + return foreachDirectiveStatement_sempred((ForeachDirectiveStatementContext)_localctx, predIndex); + } + return true; + } + private boolean foreachDirectiveStatement_sempred(ForeachDirectiveStatementContext _localctx, int predIndex) { + switch (predIndex) { + case 0: + return this.bladeParserContext.equals(ParserContext.FOREACH); + } + return true; + } + + public static final String _serializedATN = + "\u0004\u0001,\u01fe\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ + "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ + "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ + "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"+ + "\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012"+ + "\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015"+ + "\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018"+ + "\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007\u001b"+ + "\u0002\u001c\u0007\u001c\u0001\u0000\u0005\u0000<\b\u0000\n\u0000\f\u0000"+ + "?\t\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0005\u0001F\b\u0001\n\u0001\f\u0001I\t\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0005\u0001N\b\u0001\n\u0001\f\u0001Q\t\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0001X\b\u0001"+ + "\u000b\u0001\f\u0001Y\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0003\u0001f\b\u0001\u0001\u0002\u0001\u0002\u0005\u0002j\b\u0002\n\u0002"+ + "\f\u0002m\t\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0004"+ + "\u0002s\b\u0002\u000b\u0002\f\u0002t\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0004\u0002z\b\u0002\u000b\u0002\f\u0002{\u0001\u0002\u0003\u0002\u007f"+ + "\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0004\u0003\u0084\b\u0003"+ + "\u000b\u0003\f\u0003\u0085\u0001\u0003\u0001\u0003\u0001\u0003\u0005\u0003"+ + "\u008b\b\u0003\n\u0003\f\u0003\u008e\t\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0004\u0003\u0094\b\u0003\u000b\u0003\f\u0003\u0095"+ + "\u0001\u0003\u0001\u0003\u0001\u0003\u0005\u0003\u009b\b\u0003\n\u0003"+ + "\f\u0003\u009e\t\u0003\u0001\u0003\u0001\u0003\u0005\u0003\u00a2\b\u0003"+ + "\n\u0003\f\u0003\u00a5\t\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0005"+ + "\u0003\u00aa\b\u0003\n\u0003\f\u0003\u00ad\t\u0003\u0001\u0003\u0003\u0003"+ + "\u00b0\b\u0003\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0005\u0005\u00b7\b\u0005\n\u0005\f\u0005\u00ba\t\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003"+ + "\u0005\u00c3\b\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0003\u0006\u00cc\b\u0006\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\b\u0001\b\u0003\b\u00d3\b\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0003\b\u00d9\b\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0003\b\u00e4\b\b\u0003\b\u00e6\b\b\u0001\t"+ + "\u0001\t\u0003\t\u00ea\b\t\u0001\t\u0001\t\u0003\t\u00ee\b\t\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0004\n\u00f6\b\n\u000b\n\f\n\u00f7"+ + "\u0001\n\u0001\n\u0004\n\u00fc\b\n\u000b\n\f\n\u00fd\u0005\n\u0100\b\n"+ + "\n\n\f\n\u0103\t\n\u0001\n\u0001\n\u0004\n\u0107\b\n\u000b\n\f\n\u0108"+ + "\u0005\n\u010b\b\n\n\n\f\n\u010e\t\n\u0001\n\u0001\n\u0004\n\u0112\b\n"+ + "\u000b\n\f\n\u0113\u0001\n\u0001\n\u0004\n\u0118\b\n\u000b\n\f\n\u0119"+ + "\u0005\n\u011c\b\n\n\n\f\n\u011f\t\n\u0001\n\u0001\n\u0004\n\u0123\b\n"+ + "\u000b\n\f\n\u0124\u0005\n\u0127\b\n\n\n\f\n\u012a\t\n\u0001\n\u0003\n"+ + "\u012d\b\n\u0001\n\u0001\n\u0001\u000b\u0003\u000b\u0132\b\u000b\u0001"+ + "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0003\f\u0139\b\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0003\r\u0141\b\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0003\r\u0148\b\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0003\r\u0150\b\r\u0001\u000e\u0003\u000e\u0153\b\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u015e\b\u0010\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013"+ + "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0005\u0014\u0171\b\u0014"+ + "\n\u0014\f\u0014\u0174\t\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ + "\u0014\u0003\u0014\u017a\b\u0014\u0001\u0015\u0003\u0015\u017d\b\u0015"+ + "\u0001\u0015\u0001\u0015\u0004\u0015\u0181\b\u0015\u000b\u0015\f\u0015"+ + "\u0182\u0001\u0015\u0003\u0015\u0186\b\u0015\u0001\u0016\u0001\u0016\u0003"+ + "\u0016\u018a\b\u0016\u0001\u0017\u0001\u0017\u0004\u0017\u018e\b\u0017"+ + "\u000b\u0017\f\u0017\u018f\u0001\u0017\u0003\u0017\u0193\b\u0017\u0001"+ + "\u0018\u0001\u0018\u0005\u0018\u0197\b\u0018\n\u0018\f\u0018\u019a\t\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0005\u0018\u01a0\b\u0018"+ + "\n\u0018\f\u0018\u01a3\t\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0004\u0018\u01ab\b\u0018\u000b\u0018\f"+ + "\u0018\u01ac\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0018\u0004\u0018\u01b7\b\u0018\u000b\u0018"+ + "\f\u0018\u01b8\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0005\u0018\u01c1\b\u0018\n\u0018\f\u0018\u01c4\t\u0018\u0001"+ + "\u0018\u0003\u0018\u01c7\b\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0005\u0018\u01d0\b\u0018\n"+ + "\u0018\f\u0018\u01d3\t\u0018\u0001\u0018\u0003\u0018\u01d6\b\u0018\u0001"+ + "\u0018\u0001\u0018\u0003\u0018\u01da\b\u0018\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0003\u0019\u01e5\b\u0019\u0001\u001a\u0001\u001a\u0003\u001a\u01e9"+ + "\b\u001a\u0001\u001a\u0001\u001a\u0003\u001a\u01ed\b\u001a\u0001\u001b"+ + "\u0001\u001b\u0001\u001b\u0003\u001b\u01f2\b\u001b\u0001\u001b\u0001\u001b"+ + "\u0001\u001b\u0001\u001b\u0001\u001b\u0003\u001b\u01f9\b\u001b\u0001\u001c"+ + "\u0001\u001c\u0001\u001c\u0001\u001c\u0000\u0000\u001d\u0000\u0002\u0004"+ + "\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \""+ + "$&(*,.02468\u0000\u0000\u023e\u0000=\u0001\u0000\u0000\u0000\u0002e\u0001"+ + "\u0000\u0000\u0000\u0004~\u0001\u0000\u0000\u0000\u0006\u0080\u0001\u0000"+ + "\u0000\u0000\b\u00b1\u0001\u0000\u0000\u0000\n\u00c2\u0001\u0000\u0000"+ + "\u0000\f\u00cb\u0001\u0000\u0000\u0000\u000e\u00cd\u0001\u0000\u0000\u0000"+ + "\u0010\u00e5\u0001\u0000\u0000\u0000\u0012\u00e7\u0001\u0000\u0000\u0000"+ + "\u0014\u00ef\u0001\u0000\u0000\u0000\u0016\u0131\u0001\u0000\u0000\u0000"+ + "\u0018\u0138\u0001\u0000\u0000\u0000\u001a\u014f\u0001\u0000\u0000\u0000"+ + "\u001c\u0152\u0001\u0000\u0000\u0000\u001e\u0157\u0001\u0000\u0000\u0000"+ + " \u015d\u0001\u0000\u0000\u0000\"\u015f\u0001\u0000\u0000\u0000$\u0163"+ + "\u0001\u0000\u0000\u0000&\u0169\u0001\u0000\u0000\u0000(\u0179\u0001\u0000"+ + "\u0000\u0000*\u0185\u0001\u0000\u0000\u0000,\u0189\u0001\u0000\u0000\u0000"+ + ".\u0192\u0001\u0000\u0000\u00000\u01d9\u0001\u0000\u0000\u00002\u01e4"+ + "\u0001\u0000\u0000\u00004\u01ec\u0001\u0000\u0000\u00006\u01f8\u0001\u0000"+ + "\u0000\u00008\u01fa\u0001\u0000\u0000\u0000:<\u0003\u0002\u0001\u0000"+ + ";:\u0001\u0000\u0000\u0000\u0001\u0000\u0000\u0000>@\u0001\u0000\u0000\u0000?=\u0001\u0000"+ + "\u0000\u0000@A\u0005\u0000\u0000\u0001A\u0001\u0001\u0000\u0000\u0000"+ + "Bf\u0005\u001e\u0000\u0000CG\u0005\u0015\u0000\u0000DF\u0003\u0002\u0001"+ + "\u0000ED\u0001\u0000\u0000\u0000FI\u0001\u0000\u0000\u0000GE\u0001\u0000"+ + "\u0000\u0000GH\u0001\u0000\u0000\u0000HJ\u0001\u0000\u0000\u0000IG\u0001"+ + "\u0000\u0000\u0000Jf\u0005\u0016\u0000\u0000KO\u0005\u0011\u0000\u0000"+ + "LN\u0003\u0002\u0001\u0000ML\u0001\u0000\u0000\u0000NQ\u0001\u0000\u0000"+ + "\u0000OM\u0001\u0000\u0000\u0000OP\u0001\u0000\u0000\u0000PR\u0001\u0000"+ + "\u0000\u0000QO\u0001\u0000\u0000\u0000Rf\u0005\u0012\u0000\u0000ST\u0005"+ + "\u001f\u0000\u0000Tf\u0003\u0002\u0001\u0000UW\u0005 \u0000\u0000VX\u0003"+ + "\n\u0005\u0000WV\u0001\u0000\u0000\u0000XY\u0001\u0000\u0000\u0000YW\u0001"+ + "\u0000\u0000\u0000YZ\u0001\u0000\u0000\u0000Zf\u0001\u0000\u0000\u0000"+ + "[\\\u0005\u000f\u0000\u0000\\]\u0005\u0011\u0000\u0000]^\u0003\u0010\b"+ + "\u0000^_\u0005\u0012\u0000\u0000_f\u0001\u0000\u0000\u0000`f\u0003\n\u0005"+ + "\u0000af\u0003\u0006\u0003\u0000bf\u0003\u000e\u0007\u0000cf\u00038\u001c"+ + "\u0000df\u00036\u001b\u0000eB\u0001\u0000\u0000\u0000eC\u0001\u0000\u0000"+ + "\u0000eK\u0001\u0000\u0000\u0000eS\u0001\u0000\u0000\u0000eU\u0001\u0000"+ + "\u0000\u0000e[\u0001\u0000\u0000\u0000e`\u0001\u0000\u0000\u0000ea\u0001"+ + "\u0000\u0000\u0000eb\u0001\u0000\u0000\u0000ec\u0001\u0000\u0000\u0000"+ + "ed\u0001\u0000\u0000\u0000f\u0003\u0001\u0000\u0000\u0000gk\u0005\u0011"+ + "\u0000\u0000hj\u0003\n\u0005\u0000ih\u0001\u0000\u0000\u0000jm\u0001\u0000"+ + "\u0000\u0000ki\u0001\u0000\u0000\u0000kl\u0001\u0000\u0000\u0000ln\u0001"+ + "\u0000\u0000\u0000mk\u0001\u0000\u0000\u0000n\u007f\u0005\u0012\u0000"+ + "\u0000or\u0003\n\u0005\u0000pq\u0005 \u0000\u0000qs\u0003\n\u0005\u0000"+ + "rp\u0001\u0000\u0000\u0000st\u0001\u0000\u0000\u0000tr\u0001\u0000\u0000"+ + "\u0000tu\u0001\u0000\u0000\u0000u\u007f\u0001\u0000\u0000\u0000vy\u0003"+ + "\n\u0005\u0000wx\u0005\u001f\u0000\u0000xz\u0003\n\u0005\u0000yw\u0001"+ + "\u0000\u0000\u0000z{\u0001\u0000\u0000\u0000{y\u0001\u0000\u0000\u0000"+ + "{|\u0001\u0000\u0000\u0000|\u007f\u0001\u0000\u0000\u0000}\u007f\u0003"+ + "\n\u0005\u0000~g\u0001\u0000\u0000\u0000~o\u0001\u0000\u0000\u0000~v\u0001"+ + "\u0000\u0000\u0000~}\u0001\u0000\u0000\u0000\u007f\u0005\u0001\u0000\u0000"+ + "\u0000\u0080\u0081\u0005\u0007\u0000\u0000\u0081\u0083\u0005\u0011\u0000"+ + "\u0000\u0082\u0084\u0003\u0004\u0002\u0000\u0083\u0082\u0001\u0000\u0000"+ + "\u0000\u0084\u0085\u0001\u0000\u0000\u0000\u0085\u0083\u0001\u0000\u0000"+ + "\u0000\u0085\u0086\u0001\u0000\u0000\u0000\u0086\u0087\u0001\u0000\u0000"+ + "\u0000\u0087\u0088\u0005\u0012\u0000\u0000\u0088\u008c\u0005\u0015\u0000"+ + "\u0000\u0089\u008b\u0003\u0002\u0001\u0000\u008a\u0089\u0001\u0000\u0000"+ + "\u0000\u008b\u008e\u0001\u0000\u0000\u0000\u008c\u008a\u0001\u0000\u0000"+ + "\u0000\u008c\u008d\u0001\u0000\u0000\u0000\u008d\u008f\u0001\u0000\u0000"+ + "\u0000\u008e\u008c\u0001\u0000\u0000\u0000\u008f\u00a3\u0005\u0016\u0000"+ + "\u0000\u0090\u0091\u0005\b\u0000\u0000\u0091\u0093\u0005\u0011\u0000\u0000"+ + "\u0092\u0094\u0003\u0004\u0002\u0000\u0093\u0092\u0001\u0000\u0000\u0000"+ + "\u0094\u0095\u0001\u0000\u0000\u0000\u0095\u0093\u0001\u0000\u0000\u0000"+ + "\u0095\u0096\u0001\u0000\u0000\u0000\u0096\u0097\u0001\u0000\u0000\u0000"+ + "\u0097\u0098\u0005\u0012\u0000\u0000\u0098\u009c\u0005\u0015\u0000\u0000"+ + "\u0099\u009b\u0003\u0002\u0001\u0000\u009a\u0099\u0001\u0000\u0000\u0000"+ + "\u009b\u009e\u0001\u0000\u0000\u0000\u009c\u009a\u0001\u0000\u0000\u0000"+ + "\u009c\u009d\u0001\u0000\u0000\u0000\u009d\u009f\u0001\u0000\u0000\u0000"+ + "\u009e\u009c\u0001\u0000\u0000\u0000\u009f\u00a0\u0005\u0016\u0000\u0000"+ + "\u00a0\u00a2\u0001\u0000\u0000\u0000\u00a1\u0090\u0001\u0000\u0000\u0000"+ + "\u00a2\u00a5\u0001\u0000\u0000\u0000\u00a3\u00a1\u0001\u0000\u0000\u0000"+ + "\u00a3\u00a4\u0001\u0000\u0000\u0000\u00a4\u00af\u0001\u0000\u0000\u0000"+ + "\u00a5\u00a3\u0001\u0000\u0000\u0000\u00a6\u00a7\u0005\t\u0000\u0000\u00a7"+ + "\u00ab\u0005\u0015\u0000\u0000\u00a8\u00aa\u0003\u0002\u0001\u0000\u00a9"+ + "\u00a8\u0001\u0000\u0000\u0000\u00aa\u00ad\u0001\u0000\u0000\u0000\u00ab"+ + "\u00a9\u0001\u0000\u0000\u0000\u00ab\u00ac\u0001\u0000\u0000\u0000\u00ac"+ + "\u00ae\u0001\u0000\u0000\u0000\u00ad\u00ab\u0001\u0000\u0000\u0000\u00ae"+ + "\u00b0\u0005\u0016\u0000\u0000\u00af\u00a6\u0001\u0000\u0000\u0000\u00af"+ + "\u00b0\u0001\u0000\u0000\u0000\u00b0\u0007\u0001\u0000\u0000\u0000\u00b1"+ + "\u00b2\u00034\u001a\u0000\u00b2\t\u0001\u0000\u0000\u0000\u00b3\u00c3"+ + "\u0003\u0014\n\u0000\u00b4\u00b8\u0003\f\u0006\u0000\u00b5\u00b7\u0003"+ + " \u0010\u0000\u00b6\u00b5\u0001\u0000\u0000\u0000\u00b7\u00ba\u0001\u0000"+ + "\u0000\u0000\u00b8\u00b6\u0001\u0000\u0000\u0000\u00b8\u00b9\u0001\u0000"+ + "\u0000\u0000\u00b9\u00c3\u0001\u0000\u0000\u0000\u00ba\u00b8\u0001\u0000"+ + "\u0000\u0000\u00bb\u00c3\u0003&\u0013\u0000\u00bc\u00bd\u0005\r\u0000"+ + "\u0000\u00bd\u00be\u0005\u0011\u0000\u0000\u00be\u00bf\u0003\n\u0005\u0000"+ + "\u00bf\u00c0\u0005\u0012\u0000\u0000\u00c0\u00c3\u0001\u0000\u0000\u0000"+ + "\u00c1\u00c3\u0003\b\u0004\u0000\u00c2\u00b3\u0001\u0000\u0000\u0000\u00c2"+ + "\u00b4\u0001\u0000\u0000\u0000\u00c2\u00bb\u0001\u0000\u0000\u0000\u00c2"+ + "\u00bc\u0001\u0000\u0000\u0000\u00c2\u00c1\u0001\u0000\u0000\u0000\u00c3"+ + "\u000b\u0001\u0000\u0000\u0000\u00c4\u00cc\u0003\u0012\t\u0000\u00c5\u00cc"+ + "\u0003\u0018\f\u0000\u00c6\u00cc\u0003\u001a\r\u0000\u00c7\u00cc\u0003"+ + "\u0016\u000b\u0000\u00c8\u00cc\u0003\u001c\u000e\u0000\u00c9\u00cc\u0003"+ + "\u001e\u000f\u0000\u00ca\u00cc\u0003\"\u0011\u0000\u00cb\u00c4\u0001\u0000"+ + "\u0000\u0000\u00cb\u00c5\u0001\u0000\u0000\u0000\u00cb\u00c6\u0001\u0000"+ + "\u0000\u0000\u00cb\u00c7\u0001\u0000\u0000\u0000\u00cb\u00c8\u0001\u0000"+ + "\u0000\u0000\u00cb\u00c9\u0001\u0000\u0000\u0000\u00cb\u00ca\u0001\u0000"+ + "\u0000\u0000\u00cc\r\u0001\u0000\u0000\u0000\u00cd\u00ce\u0004\u0007\u0000"+ + "\u0000\u00ce\u00cf\u0003\u0010\b\u0000\u00cf\u000f\u0001\u0000\u0000\u0000"+ + "\u00d0\u00d3\u0003.\u0017\u0000\u00d1\u00d3\u0005\u0018\u0000\u0000\u00d2"+ + "\u00d0\u0001\u0000\u0000\u0000\u00d2\u00d1\u0001\u0000\u0000\u0000\u00d3"+ + "\u00d4\u0001\u0000\u0000\u0000\u00d4\u00d5\u0005\u0005\u0000\u0000\u00d5"+ + "\u00e6\u0005\u0018\u0000\u0000\u00d6\u00d9\u0003.\u0017\u0000\u00d7\u00d9"+ + "\u0005\u0018\u0000\u0000\u00d8\u00d6\u0001\u0000\u0000\u0000\u00d8\u00d7"+ + "\u0001\u0000\u0000\u0000\u00d9\u00da\u0001\u0000\u0000\u0000\u00da\u00db"+ + "\u0005\u0005\u0000\u0000\u00db\u00dc\u0005\u0018\u0000\u0000\u00dc\u00dd"+ + "\u0005\u001c\u0000\u0000\u00dd\u00e6\u0005\u0018\u0000\u0000\u00de\u00df"+ + "\u0003&\u0013\u0000\u00df\u00e0\u0005\u0005\u0000\u0000\u00e0\u00e3\u0003"+ + "&\u0013\u0000\u00e1\u00e2\u0005\u001c\u0000\u0000\u00e2\u00e4\u0003&\u0013"+ + "\u0000\u00e3\u00e1\u0001\u0000\u0000\u0000\u00e3\u00e4\u0001\u0000\u0000"+ + "\u0000\u00e4\u00e6\u0001\u0000\u0000\u0000\u00e5\u00d2\u0001\u0000\u0000"+ + "\u0000\u00e5\u00d8\u0001\u0000\u0000\u0000\u00e5\u00de\u0001\u0000\u0000"+ + "\u0000\u00e6\u0011\u0001\u0000\u0000\u0000\u00e7\u00e9\u0005\n\u0000\u0000"+ + "\u00e8\u00ea\u0003*\u0015\u0000\u00e9\u00e8\u0001\u0000\u0000\u0000\u00e9"+ + "\u00ea\u0001\u0000\u0000\u0000\u00ea\u00eb\u0001\u0000\u0000\u0000\u00eb"+ + "\u00ed\u0005\u0017\u0000\u0000\u00ec\u00ee\u0003(\u0014\u0000\u00ed\u00ec"+ + "\u0001\u0000\u0000\u0000\u00ed\u00ee\u0001\u0000\u0000\u0000\u00ee\u0013"+ + "\u0001\u0000\u0000\u0000\u00ef\u00f0\u0005\u000e\u0000\u0000\u00f0\u00f1"+ + "\u0005\u0011\u0000\u0000\u00f1\u00f2\u0003\n\u0005\u0000\u00f2\u00f3\u0005"+ + "\u0012\u0000\u0000\u00f3\u010c\u0005\u0015\u0000\u0000\u00f4\u00f6\u0003"+ + "\n\u0005\u0000\u00f5\u00f4\u0001\u0000\u0000\u0000\u00f6\u00f7\u0001\u0000"+ + "\u0000\u0000\u00f7\u00f5\u0001\u0000\u0000\u0000\u00f7\u00f8\u0001\u0000"+ + "\u0000\u0000\u00f8\u0101\u0001\u0000\u0000\u0000\u00f9\u00fb\u0005\u0010"+ + "\u0000\u0000\u00fa\u00fc\u0003\n\u0005\u0000\u00fb\u00fa\u0001\u0000\u0000"+ + "\u0000\u00fc\u00fd\u0001\u0000\u0000\u0000\u00fd\u00fb\u0001\u0000\u0000"+ + "\u0000\u00fd\u00fe\u0001\u0000\u0000\u0000\u00fe\u0100\u0001\u0000\u0000"+ + "\u0000\u00ff\u00f9\u0001\u0000\u0000\u0000\u0100\u0103\u0001\u0000\u0000"+ + "\u0000\u0101\u00ff\u0001\u0000\u0000\u0000\u0101\u0102\u0001\u0000\u0000"+ + "\u0000\u0102\u0104\u0001\u0000\u0000\u0000\u0103\u0101\u0001\u0000\u0000"+ + "\u0000\u0104\u0106\u0005\u001c\u0000\u0000\u0105\u0107\u0003\n\u0005\u0000"+ + "\u0106\u0105\u0001\u0000\u0000\u0000\u0107\u0108\u0001\u0000\u0000\u0000"+ + "\u0108\u0106\u0001\u0000\u0000\u0000\u0108\u0109\u0001\u0000\u0000\u0000"+ + "\u0109\u010b\u0001\u0000\u0000\u0000\u010a\u00f5\u0001\u0000\u0000\u0000"+ + "\u010b\u010e\u0001\u0000\u0000\u0000\u010c\u010a\u0001\u0000\u0000\u0000"+ + "\u010c\u010d\u0001\u0000\u0000\u0000\u010d\u0128\u0001\u0000\u0000\u0000"+ + "\u010e\u010c\u0001\u0000\u0000\u0000\u010f\u0111\u0005\u0010\u0000\u0000"+ + "\u0110\u0112\u0003\n\u0005\u0000\u0111\u0110\u0001\u0000\u0000\u0000\u0112"+ + "\u0113\u0001\u0000\u0000\u0000\u0113\u0111\u0001\u0000\u0000\u0000\u0113"+ + "\u0114\u0001\u0000\u0000\u0000\u0114\u011d\u0001\u0000\u0000\u0000\u0115"+ + "\u0117\u0005\u0010\u0000\u0000\u0116\u0118\u0003\n\u0005\u0000\u0117\u0116"+ + "\u0001\u0000\u0000\u0000\u0118\u0119\u0001\u0000\u0000\u0000\u0119\u0117"+ + "\u0001\u0000\u0000\u0000\u0119\u011a\u0001\u0000\u0000\u0000\u011a\u011c"+ + "\u0001\u0000\u0000\u0000\u011b\u0115\u0001\u0000\u0000\u0000\u011c\u011f"+ + "\u0001\u0000\u0000\u0000\u011d\u011b\u0001\u0000\u0000\u0000\u011d\u011e"+ + "\u0001\u0000\u0000\u0000\u011e\u0120\u0001\u0000\u0000\u0000\u011f\u011d"+ + "\u0001\u0000\u0000\u0000\u0120\u0122\u0005\u001c\u0000\u0000\u0121\u0123"+ + "\u0003\n\u0005\u0000\u0122\u0121\u0001\u0000\u0000\u0000\u0123\u0124\u0001"+ + "\u0000\u0000\u0000\u0124\u0122\u0001\u0000\u0000\u0000\u0124\u0125\u0001"+ + "\u0000\u0000\u0000\u0125\u0127\u0001\u0000\u0000\u0000\u0126\u010f\u0001"+ + "\u0000\u0000\u0000\u0127\u012a\u0001\u0000\u0000\u0000\u0128\u0126\u0001"+ + "\u0000\u0000\u0000\u0128\u0129\u0001\u0000\u0000\u0000\u0129\u012c\u0001"+ + "\u0000\u0000\u0000\u012a\u0128\u0001\u0000\u0000\u0000\u012b\u012d\u0005"+ + "\u0010\u0000\u0000\u012c\u012b\u0001\u0000\u0000\u0000\u012c\u012d\u0001"+ + "\u0000\u0000\u0000\u012d\u012e\u0001\u0000\u0000\u0000\u012e\u012f\u0005"+ + "\u0016\u0000\u0000\u012f\u0015\u0001\u0000\u0000\u0000\u0130\u0132\u0003"+ + "*\u0015\u0000\u0131\u0130\u0001\u0000\u0000\u0000\u0131\u0132\u0001\u0000"+ + "\u0000\u0000\u0132\u0133\u0001\u0000\u0000\u0000\u0133\u0134\u0005\u0017"+ + "\u0000\u0000\u0134\u0135\u0005\u001b\u0000\u0000\u0135\u0136\u0005\u000b"+ + "\u0000\u0000\u0136\u0017\u0001\u0000\u0000\u0000\u0137\u0139\u0003*\u0015"+ + "\u0000\u0138\u0137\u0001\u0000\u0000\u0000\u0138\u0139\u0001\u0000\u0000"+ + "\u0000\u0139\u013a\u0001\u0000\u0000\u0000\u013a\u013b\u0005\u0017\u0000"+ + "\u0000\u013b\u013c\u0005\u001b\u0000\u0000\u013c\u013d\u0005\u0017\u0000"+ + "\u0000\u013d\u013e\u0003(\u0014\u0000\u013e\u0019\u0001\u0000\u0000\u0000"+ + "\u013f\u0141\u0003*\u0015\u0000\u0140\u013f\u0001\u0000\u0000\u0000\u0140"+ + "\u0141\u0001\u0000\u0000\u0000\u0141\u0142\u0001\u0000\u0000\u0000\u0142"+ + "\u0143\u0005\u0017\u0000\u0000\u0143\u0147\u0005\u001b\u0000\u0000\u0144"+ + "\u0148\u0005\u0017\u0000\u0000\u0145\u0148\u0005\u0018\u0000\u0000\u0146"+ + "\u0148\u0005\u000b\u0000\u0000\u0147\u0144\u0001\u0000\u0000\u0000\u0147"+ + "\u0145\u0001\u0000\u0000\u0000\u0147\u0146\u0001\u0000\u0000\u0000\u0148"+ + "\u0150\u0001\u0000\u0000\u0000\u0149\u014a\u0005\u0018\u0000\u0000\u014a"+ + "\u014b\u0005\u001b\u0000\u0000\u014b\u0150\u0005\u0017\u0000\u0000\u014c"+ + "\u014d\u0005\u0018\u0000\u0000\u014d\u014e\u0005\u001b\u0000\u0000\u014e"+ + "\u0150\u0005\u0018\u0000\u0000\u014f\u0140\u0001\u0000\u0000\u0000\u014f"+ + "\u0149\u0001\u0000\u0000\u0000\u014f\u014c\u0001\u0000\u0000\u0000\u0150"+ + "\u001b\u0001\u0000\u0000\u0000\u0151\u0153\u0003*\u0015\u0000\u0152\u0151"+ + "\u0001\u0000\u0000\u0000\u0152\u0153\u0001\u0000\u0000\u0000\u0153\u0154"+ + "\u0001\u0000\u0000\u0000\u0154\u0155\u0005\u0017\u0000\u0000\u0155\u0156"+ + "\u0005\u001b\u0000\u0000\u0156\u001d\u0001\u0000\u0000\u0000\u0157\u0158"+ + "\u0005\u0018\u0000\u0000\u0158\u0159\u0003 \u0010\u0000\u0159\u001f\u0001"+ + "\u0000\u0000\u0000\u015a\u015e\u0003\"\u0011\u0000\u015b\u015c\u0005\u001d"+ + "\u0000\u0000\u015c\u015e\u0005\u0017\u0000\u0000\u015d\u015a\u0001\u0000"+ + "\u0000\u0000\u015d\u015b\u0001\u0000\u0000\u0000\u015e!\u0001\u0000\u0000"+ + "\u0000\u015f\u0160\u0005\u001d\u0000\u0000\u0160\u0161\u0005\u0017\u0000"+ + "\u0000\u0161\u0162\u0003(\u0014\u0000\u0162#\u0001\u0000\u0000\u0000\u0163"+ + "\u0164\u0005\u0017\u0000\u0000\u0164\u0165\u0003(\u0014\u0000\u0165\u0166"+ + "\u0005\u001d\u0000\u0000\u0166\u0167\u0005\u0017\u0000\u0000\u0167\u0168"+ + "\u0003(\u0014\u0000\u0168%\u0001\u0000\u0000\u0000\u0169\u016a\u0005\u0017"+ + "\u0000\u0000\u016a\u016b\u0003(\u0014\u0000\u016b\'\u0001\u0000\u0000"+ + "\u0000\u016c\u016d\u0005\u0011\u0000\u0000\u016d\u0172\u0003,\u0016\u0000"+ + "\u016e\u016f\u0005\u0010\u0000\u0000\u016f\u0171\u0003,\u0016\u0000\u0170"+ + "\u016e\u0001\u0000\u0000\u0000\u0171\u0174\u0001\u0000\u0000\u0000\u0172"+ + "\u0170\u0001\u0000\u0000\u0000\u0172\u0173\u0001\u0000\u0000\u0000\u0173"+ + "\u0175\u0001\u0000\u0000\u0000\u0174\u0172\u0001\u0000\u0000\u0000\u0175"+ + "\u0176\u0005\u0012\u0000\u0000\u0176\u017a\u0001\u0000\u0000\u0000\u0177"+ + "\u0178\u0005\u0011\u0000\u0000\u0178\u017a\u0005\u0012\u0000\u0000\u0179"+ + "\u016c\u0001\u0000\u0000\u0000\u0179\u0177\u0001\u0000\u0000\u0000\u017a"+ + ")\u0001\u0000\u0000\u0000\u017b\u017d\u0005\u001a\u0000\u0000\u017c\u017b"+ + "\u0001\u0000\u0000\u0000\u017c\u017d\u0001\u0000\u0000\u0000\u017d\u0180"+ + "\u0001\u0000\u0000\u0000\u017e\u017f\u0005\u0017\u0000\u0000\u017f\u0181"+ + "\u0005\u001a\u0000\u0000\u0180\u017e\u0001\u0000\u0000\u0000\u0181\u0182"+ + "\u0001\u0000\u0000\u0000\u0182\u0180\u0001\u0000\u0000\u0000\u0182\u0183"+ + "\u0001\u0000\u0000\u0000\u0183\u0186\u0001\u0000\u0000\u0000\u0184\u0186"+ + "\u0005\u001a\u0000\u0000\u0185\u017c\u0001\u0000\u0000\u0000\u0185\u0184"+ + "\u0001\u0000\u0000\u0000\u0186+\u0001\u0000\u0000\u0000\u0187\u018a\u0003"+ + "\n\u0005\u0000\u0188\u018a\u0005\u0017\u0000\u0000\u0189\u0187\u0001\u0000"+ + "\u0000\u0000\u0189\u0188\u0001\u0000\u0000\u0000\u018a-\u0001\u0000\u0000"+ + "\u0000\u018b\u018d\u0005\u0018\u0000\u0000\u018c\u018e\u00030\u0018\u0000"+ + "\u018d\u018c\u0001\u0000\u0000\u0000\u018e\u018f\u0001\u0000\u0000\u0000"+ + "\u018f\u018d\u0001\u0000\u0000\u0000\u018f\u0190\u0001\u0000\u0000\u0000"+ + "\u0190\u0193\u0001\u0000\u0000\u0000\u0191\u0193\u00030\u0018\u0000\u0192"+ + "\u018b\u0001\u0000\u0000\u0000\u0192\u0191\u0001\u0000\u0000\u0000\u0193"+ + "/\u0001\u0000\u0000\u0000\u0194\u0198\u0005\u0013\u0000\u0000\u0195\u0197"+ + "\u00030\u0018\u0000\u0196\u0195\u0001\u0000\u0000\u0000\u0197\u019a\u0001"+ + "\u0000\u0000\u0000\u0198\u0196\u0001\u0000\u0000\u0000\u0198\u0199\u0001"+ + "\u0000\u0000\u0000\u0199\u019b\u0001\u0000\u0000\u0000\u019a\u0198\u0001"+ + "\u0000\u0000\u0000\u019b\u01da\u0005\u0014\u0000\u0000\u019c\u019d\u0005"+ + "\u0004\u0000\u0000\u019d\u01a1\u0005\u0011\u0000\u0000\u019e\u01a0\u0003"+ + "0\u0018\u0000\u019f\u019e\u0001\u0000\u0000\u0000\u01a0\u01a3\u0001\u0000"+ + "\u0000\u0000\u01a1\u019f\u0001\u0000\u0000\u0000\u01a1\u01a2\u0001\u0000"+ + "\u0000\u0000\u01a2\u01a4\u0001\u0000\u0000\u0000\u01a3\u01a1\u0001\u0000"+ + "\u0000\u0000\u01a4\u01da\u0005\u0012\u0000\u0000\u01a5\u01aa\u0005\u0013"+ + "\u0000\u0000\u01a6\u01a7\u00032\u0019\u0000\u01a7\u01a8\u0005\u001c\u0000"+ + "\u0000\u01a8\u01a9\u00030\u0018\u0000\u01a9\u01ab\u0001\u0000\u0000\u0000"+ + "\u01aa\u01a6\u0001\u0000\u0000\u0000\u01ab\u01ac\u0001\u0000\u0000\u0000"+ + "\u01ac\u01aa\u0001\u0000\u0000\u0000\u01ac\u01ad\u0001\u0000\u0000\u0000"+ + "\u01ad\u01ae\u0001\u0000\u0000\u0000\u01ae\u01af\u0005\u0014\u0000\u0000"+ + "\u01af\u01da\u0001\u0000\u0000\u0000\u01b0\u01b1\u0005\u0004\u0000\u0000"+ + "\u01b1\u01b6\u0005\u0011\u0000\u0000\u01b2\u01b3\u00032\u0019\u0000\u01b3"+ + "\u01b4\u0005\u001c\u0000\u0000\u01b4\u01b5\u00030\u0018\u0000\u01b5\u01b7"+ + "\u0001\u0000\u0000\u0000\u01b6\u01b2\u0001\u0000\u0000\u0000\u01b7\u01b8"+ + "\u0001\u0000\u0000\u0000\u01b8\u01b6\u0001\u0000\u0000\u0000\u01b8\u01b9"+ + "\u0001\u0000\u0000\u0000\u01b9\u01ba\u0001\u0000\u0000\u0000\u01ba\u01bb"+ + "\u0005\u0012\u0000\u0000\u01bb\u01da\u0001\u0000\u0000\u0000\u01bc\u01bd"+ + "\u0005\u0013\u0000\u0000\u01bd\u01c2\u00032\u0019\u0000\u01be\u01bf\u0005"+ + "\u0010\u0000\u0000\u01bf\u01c1\u00032\u0019\u0000\u01c0\u01be\u0001\u0000"+ + "\u0000\u0000\u01c1\u01c4\u0001\u0000\u0000\u0000\u01c2\u01c0\u0001\u0000"+ + "\u0000\u0000\u01c2\u01c3\u0001\u0000\u0000\u0000\u01c3\u01c6\u0001\u0000"+ + "\u0000\u0000\u01c4\u01c2\u0001\u0000\u0000\u0000\u01c5\u01c7\u0005\u0010"+ + "\u0000\u0000\u01c6\u01c5\u0001\u0000\u0000\u0000\u01c6\u01c7\u0001\u0000"+ + "\u0000\u0000\u01c7\u01c8\u0001\u0000\u0000\u0000\u01c8\u01c9\u0005\u0014"+ + "\u0000\u0000\u01c9\u01da\u0001\u0000\u0000\u0000\u01ca\u01cb\u0005\u0004"+ + "\u0000\u0000\u01cb\u01cc\u0005\u0011\u0000\u0000\u01cc\u01d1\u00032\u0019"+ + "\u0000\u01cd\u01ce\u0005\u0010\u0000\u0000\u01ce\u01d0\u00032\u0019\u0000"+ + "\u01cf\u01cd\u0001\u0000\u0000\u0000\u01d0\u01d3\u0001\u0000\u0000\u0000"+ + "\u01d1\u01cf\u0001\u0000\u0000\u0000\u01d1\u01d2\u0001\u0000\u0000\u0000"+ + "\u01d2\u01d5\u0001\u0000\u0000\u0000\u01d3\u01d1\u0001\u0000\u0000\u0000"+ + "\u01d4\u01d6\u0005\u0010\u0000\u0000\u01d5\u01d4\u0001\u0000\u0000\u0000"+ + "\u01d5\u01d6\u0001\u0000\u0000\u0000\u01d6\u01d7\u0001\u0000\u0000\u0000"+ + "\u01d7\u01d8\u0005\u0012\u0000\u0000\u01d8\u01da\u0001\u0000\u0000\u0000"+ + "\u01d9\u0194\u0001\u0000\u0000\u0000\u01d9\u019c\u0001\u0000\u0000\u0000"+ + "\u01d9\u01a5\u0001\u0000\u0000\u0000\u01d9\u01b0\u0001\u0000\u0000\u0000"+ + "\u01d9\u01bc\u0001\u0000\u0000\u0000\u01d9\u01ca\u0001\u0000\u0000\u0000"+ + "\u01da1\u0001\u0000\u0000\u0000\u01db\u01dc\u0003\n\u0005\u0000\u01dc"+ + "\u01dd\u0005\u001c\u0000\u0000\u01dd\u01de\u00030\u0018\u0000\u01de\u01e5"+ + "\u0001\u0000\u0000\u0000\u01df\u01e0\u0003\n\u0005\u0000\u01e0\u01e1\u0005"+ + "\u001c\u0000\u0000\u01e1\u01e2\u0003\n\u0005\u0000\u01e2\u01e5\u0001\u0000"+ + "\u0000\u0000\u01e3\u01e5\u0003\n\u0005\u0000\u01e4\u01db\u0001\u0000\u0000"+ + "\u0000\u01e4\u01df\u0001\u0000\u0000\u0000\u01e4\u01e3\u0001\u0000\u0000"+ + "\u0000\u01e53\u0001\u0000\u0000\u0000\u01e6\u01ed\u0003.\u0017\u0000\u01e7"+ + "\u01e9\u0005\u0019\u0000\u0000\u01e8\u01e7\u0001\u0000\u0000\u0000\u01e8"+ + "\u01e9\u0001\u0000\u0000\u0000\u01e9\u01ea\u0001\u0000\u0000\u0000\u01ea"+ + "\u01ed\u0005\u0018\u0000\u0000\u01eb\u01ed\u0005!\u0000\u0000\u01ec\u01e6"+ + "\u0001\u0000\u0000\u0000\u01ec\u01e8\u0001\u0000\u0000\u0000\u01ec\u01eb"+ + "\u0001\u0000\u0000\u0000\u01ed5\u0001\u0000\u0000\u0000\u01ee\u01ef\u0005"+ + "\n\u0000\u0000\u01ef\u01f1\u0005\u0018\u0000\u0000\u01f0\u01f2\u0003("+ + "\u0014\u0000\u01f1\u01f0\u0001\u0000\u0000\u0000\u01f1\u01f2\u0001\u0000"+ + "\u0000\u0000\u01f2\u01f9\u0001\u0000\u0000\u0000\u01f3\u01f4\u0005\n\u0000"+ + "\u0000\u01f4\u01f9\u0003*\u0015\u0000\u01f5\u01f6\u0003*\u0015\u0000\u01f6"+ + "\u01f7\u0005\u0017\u0000\u0000\u01f7\u01f9\u0001\u0000\u0000\u0000\u01f8"+ + "\u01ee\u0001\u0000\u0000\u0000\u01f8\u01f3\u0001\u0000\u0000\u0000\u01f8"+ + "\u01f5\u0001\u0000\u0000\u0000\u01f97\u0001\u0000\u0000\u0000\u01fa\u01fb"+ + "\u0005\u0006\u0000\u0000\u01fb\u01fc\u0003\n\u0005\u0000\u01fc9\u0001"+ + "\u0000\u0000\u0000A=GOYekt{~\u0085\u008c\u0095\u009c\u00a3\u00ab\u00af"+ + "\u00b8\u00c2\u00cb\u00d2\u00d8\u00e3\u00e5\u00e9\u00ed\u00f7\u00fd\u0101"+ + "\u0108\u010c\u0113\u0119\u011d\u0124\u0128\u012c\u0131\u0138\u0140\u0147"+ + "\u014f\u0152\u015d\u0172\u0179\u017c\u0182\u0185\u0189\u018f\u0192\u0198"+ + "\u01a1\u01ac\u01b8\u01c2\u01c6\u01d1\u01d5\u01d9\u01e4\u01e8\u01ec\u01f1"+ + "\u01f8"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserBaseListener.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserBaseListener.java new file mode 100644 index 000000000000..b90702f412bf --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserBaseListener.java @@ -0,0 +1,390 @@ +// Generated from BladePhpAntlrParser.g4 by ANTLR 4.13.0 + + package org.netbeans.modules.php.blade.syntax.antlr4.php; + + +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.tree.ErrorNode; +import org.antlr.v4.runtime.tree.TerminalNode; + +/** + * This class provides an empty implementation of {@link BladePhpAntlrParserListener}, + * which can be extended to create a listener which only needs to handle a subset + * of the available methods. + */ +@SuppressWarnings("CheckReturnValue") +public class BladePhpAntlrParserBaseListener implements BladePhpAntlrParserListener { + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterExpression(BladePhpAntlrParser.ExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitExpression(BladePhpAntlrParser.ExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterExprStatement(BladePhpAntlrParser.ExprStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitExprStatement(BladePhpAntlrParser.ExprStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterLogicalStatement(BladePhpAntlrParser.LogicalStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitLogicalStatement(BladePhpAntlrParser.LogicalStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterIfStatement(BladePhpAntlrParser.IfStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitIfStatement(BladePhpAntlrParser.IfStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterInputExpr(BladePhpAntlrParser.InputExprContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitInputExpr(BladePhpAntlrParser.InputExprContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterFunctionalExpr(BladePhpAntlrParser.FunctionalExprContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitFunctionalExpr(BladePhpAntlrParser.FunctionalExprContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterClassExpression(BladePhpAntlrParser.ClassExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitClassExpression(BladePhpAntlrParser.ClassExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterForeachDirectiveStatement(BladePhpAntlrParser.ForeachDirectiveStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitForeachDirectiveStatement(BladePhpAntlrParser.ForeachDirectiveStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterForeachArguments(BladePhpAntlrParser.ForeachArgumentsContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitForeachArguments(BladePhpAntlrParser.ForeachArgumentsContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterClassInstanceStatement(BladePhpAntlrParser.ClassInstanceStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitClassInstanceStatement(BladePhpAntlrParser.ClassInstanceStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterMatchStatement(BladePhpAntlrParser.MatchStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitMatchStatement(BladePhpAntlrParser.MatchStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterStaticClassReference(BladePhpAntlrParser.StaticClassReferenceContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitStaticClassReference(BladePhpAntlrParser.StaticClassReferenceContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterStaticMethodAccess(BladePhpAntlrParser.StaticMethodAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitStaticMethodAccess(BladePhpAntlrParser.StaticMethodAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterStaticFieldAccess(BladePhpAntlrParser.StaticFieldAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitStaticFieldAccess(BladePhpAntlrParser.StaticFieldAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterStaticAccess(BladePhpAntlrParser.StaticAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitStaticAccess(BladePhpAntlrParser.StaticAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterAliasDirectAccess(BladePhpAntlrParser.AliasDirectAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitAliasDirectAccess(BladePhpAntlrParser.AliasDirectAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterClassMember(BladePhpAntlrParser.ClassMemberContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitClassMember(BladePhpAntlrParser.ClassMemberContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterDirectMethodAccess(BladePhpAntlrParser.DirectMethodAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitDirectMethodAccess(BladePhpAntlrParser.DirectMethodAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterDirectAccess(BladePhpAntlrParser.DirectAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitDirectAccess(BladePhpAntlrParser.DirectAccessContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterFunctionExpr(BladePhpAntlrParser.FunctionExprContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitFunctionExpr(BladePhpAntlrParser.FunctionExprContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterArguments(BladePhpAntlrParser.ArgumentsContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitArguments(BladePhpAntlrParser.ArgumentsContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterNamespace(BladePhpAntlrParser.NamespaceContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitNamespace(BladePhpAntlrParser.NamespaceContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterArgument(BladePhpAntlrParser.ArgumentContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitArgument(BladePhpAntlrParser.ArgumentContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterArray(BladePhpAntlrParser.ArrayContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitArray(BladePhpAntlrParser.ArrayContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterArray_key_item(BladePhpAntlrParser.Array_key_itemContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitArray_key_item(BladePhpAntlrParser.Array_key_itemContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterArray_child(BladePhpAntlrParser.Array_childContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitArray_child(BladePhpAntlrParser.Array_childContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterVarExpr(BladePhpAntlrParser.VarExprContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitVarExpr(BladePhpAntlrParser.VarExprContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterMisc(BladePhpAntlrParser.MiscContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitMisc(BladePhpAntlrParser.MiscContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterOutput(BladePhpAntlrParser.OutputContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitOutput(BladePhpAntlrParser.OutputContext ctx) { } + + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void enterEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void exitEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void visitTerminal(TerminalNode node) { } + /** + * {@inheritDoc} + * + *

      The default implementation does nothing.

      + */ + @Override public void visitErrorNode(ErrorNode node) { } +} \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserListener.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserListener.java new file mode 100644 index 000000000000..2bf230beed92 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserListener.java @@ -0,0 +1,302 @@ +// Generated from BladePhpAntlrParser.g4 by ANTLR 4.13.0 + + package org.netbeans.modules.php.blade.syntax.antlr4.php; + +import org.antlr.v4.runtime.tree.ParseTreeListener; + +/** + * This interface defines a complete listener for a parse tree produced by + * {@link BladePhpAntlrParser}. + */ +public interface BladePhpAntlrParserListener extends ParseTreeListener { + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#expression}. + * @param ctx the parse tree + */ + void enterExpression(BladePhpAntlrParser.ExpressionContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#expression}. + * @param ctx the parse tree + */ + void exitExpression(BladePhpAntlrParser.ExpressionContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#exprStatement}. + * @param ctx the parse tree + */ + void enterExprStatement(BladePhpAntlrParser.ExprStatementContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#exprStatement}. + * @param ctx the parse tree + */ + void exitExprStatement(BladePhpAntlrParser.ExprStatementContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#logicalStatement}. + * @param ctx the parse tree + */ + void enterLogicalStatement(BladePhpAntlrParser.LogicalStatementContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#logicalStatement}. + * @param ctx the parse tree + */ + void exitLogicalStatement(BladePhpAntlrParser.LogicalStatementContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#ifStatement}. + * @param ctx the parse tree + */ + void enterIfStatement(BladePhpAntlrParser.IfStatementContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#ifStatement}. + * @param ctx the parse tree + */ + void exitIfStatement(BladePhpAntlrParser.IfStatementContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#inputExpr}. + * @param ctx the parse tree + */ + void enterInputExpr(BladePhpAntlrParser.InputExprContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#inputExpr}. + * @param ctx the parse tree + */ + void exitInputExpr(BladePhpAntlrParser.InputExprContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#functionalExpr}. + * @param ctx the parse tree + */ + void enterFunctionalExpr(BladePhpAntlrParser.FunctionalExprContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#functionalExpr}. + * @param ctx the parse tree + */ + void exitFunctionalExpr(BladePhpAntlrParser.FunctionalExprContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#classExpression}. + * @param ctx the parse tree + */ + void enterClassExpression(BladePhpAntlrParser.ClassExpressionContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#classExpression}. + * @param ctx the parse tree + */ + void exitClassExpression(BladePhpAntlrParser.ClassExpressionContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#foreachDirectiveStatement}. + * @param ctx the parse tree + */ + void enterForeachDirectiveStatement(BladePhpAntlrParser.ForeachDirectiveStatementContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#foreachDirectiveStatement}. + * @param ctx the parse tree + */ + void exitForeachDirectiveStatement(BladePhpAntlrParser.ForeachDirectiveStatementContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#foreachArguments}. + * @param ctx the parse tree + */ + void enterForeachArguments(BladePhpAntlrParser.ForeachArgumentsContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#foreachArguments}. + * @param ctx the parse tree + */ + void exitForeachArguments(BladePhpAntlrParser.ForeachArgumentsContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#classInstanceStatement}. + * @param ctx the parse tree + */ + void enterClassInstanceStatement(BladePhpAntlrParser.ClassInstanceStatementContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#classInstanceStatement}. + * @param ctx the parse tree + */ + void exitClassInstanceStatement(BladePhpAntlrParser.ClassInstanceStatementContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#matchStatement}. + * @param ctx the parse tree + */ + void enterMatchStatement(BladePhpAntlrParser.MatchStatementContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#matchStatement}. + * @param ctx the parse tree + */ + void exitMatchStatement(BladePhpAntlrParser.MatchStatementContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#staticClassReference}. + * @param ctx the parse tree + */ + void enterStaticClassReference(BladePhpAntlrParser.StaticClassReferenceContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#staticClassReference}. + * @param ctx the parse tree + */ + void exitStaticClassReference(BladePhpAntlrParser.StaticClassReferenceContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#staticMethodAccess}. + * @param ctx the parse tree + */ + void enterStaticMethodAccess(BladePhpAntlrParser.StaticMethodAccessContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#staticMethodAccess}. + * @param ctx the parse tree + */ + void exitStaticMethodAccess(BladePhpAntlrParser.StaticMethodAccessContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#staticFieldAccess}. + * @param ctx the parse tree + */ + void enterStaticFieldAccess(BladePhpAntlrParser.StaticFieldAccessContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#staticFieldAccess}. + * @param ctx the parse tree + */ + void exitStaticFieldAccess(BladePhpAntlrParser.StaticFieldAccessContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#staticAccess}. + * @param ctx the parse tree + */ + void enterStaticAccess(BladePhpAntlrParser.StaticAccessContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#staticAccess}. + * @param ctx the parse tree + */ + void exitStaticAccess(BladePhpAntlrParser.StaticAccessContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#aliasDirectAccess}. + * @param ctx the parse tree + */ + void enterAliasDirectAccess(BladePhpAntlrParser.AliasDirectAccessContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#aliasDirectAccess}. + * @param ctx the parse tree + */ + void exitAliasDirectAccess(BladePhpAntlrParser.AliasDirectAccessContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#classMember}. + * @param ctx the parse tree + */ + void enterClassMember(BladePhpAntlrParser.ClassMemberContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#classMember}. + * @param ctx the parse tree + */ + void exitClassMember(BladePhpAntlrParser.ClassMemberContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#directMethodAccess}. + * @param ctx the parse tree + */ + void enterDirectMethodAccess(BladePhpAntlrParser.DirectMethodAccessContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#directMethodAccess}. + * @param ctx the parse tree + */ + void exitDirectMethodAccess(BladePhpAntlrParser.DirectMethodAccessContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#directAccess}. + * @param ctx the parse tree + */ + void enterDirectAccess(BladePhpAntlrParser.DirectAccessContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#directAccess}. + * @param ctx the parse tree + */ + void exitDirectAccess(BladePhpAntlrParser.DirectAccessContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#functionExpr}. + * @param ctx the parse tree + */ + void enterFunctionExpr(BladePhpAntlrParser.FunctionExprContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#functionExpr}. + * @param ctx the parse tree + */ + void exitFunctionExpr(BladePhpAntlrParser.FunctionExprContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#arguments}. + * @param ctx the parse tree + */ + void enterArguments(BladePhpAntlrParser.ArgumentsContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#arguments}. + * @param ctx the parse tree + */ + void exitArguments(BladePhpAntlrParser.ArgumentsContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#namespace}. + * @param ctx the parse tree + */ + void enterNamespace(BladePhpAntlrParser.NamespaceContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#namespace}. + * @param ctx the parse tree + */ + void exitNamespace(BladePhpAntlrParser.NamespaceContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#argument}. + * @param ctx the parse tree + */ + void enterArgument(BladePhpAntlrParser.ArgumentContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#argument}. + * @param ctx the parse tree + */ + void exitArgument(BladePhpAntlrParser.ArgumentContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#array}. + * @param ctx the parse tree + */ + void enterArray(BladePhpAntlrParser.ArrayContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#array}. + * @param ctx the parse tree + */ + void exitArray(BladePhpAntlrParser.ArrayContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#array_key_item}. + * @param ctx the parse tree + */ + void enterArray_key_item(BladePhpAntlrParser.Array_key_itemContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#array_key_item}. + * @param ctx the parse tree + */ + void exitArray_key_item(BladePhpAntlrParser.Array_key_itemContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#array_child}. + * @param ctx the parse tree + */ + void enterArray_child(BladePhpAntlrParser.Array_childContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#array_child}. + * @param ctx the parse tree + */ + void exitArray_child(BladePhpAntlrParser.Array_childContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#varExpr}. + * @param ctx the parse tree + */ + void enterVarExpr(BladePhpAntlrParser.VarExprContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#varExpr}. + * @param ctx the parse tree + */ + void exitVarExpr(BladePhpAntlrParser.VarExprContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#misc}. + * @param ctx the parse tree + */ + void enterMisc(BladePhpAntlrParser.MiscContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#misc}. + * @param ctx the parse tree + */ + void exitMisc(BladePhpAntlrParser.MiscContext ctx); + /** + * Enter a parse tree produced by {@link BladePhpAntlrParser#output}. + * @param ctx the parse tree + */ + void enterOutput(BladePhpAntlrParser.OutputContext ctx); + /** + * Exit a parse tree produced by {@link BladePhpAntlrParser#output}. + * @param ctx the parse tree + */ + void exitOutput(BladePhpAntlrParser.OutputContext ctx); +} \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrUtils.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrUtils.java new file mode 100644 index 000000000000..f17cfb6d5b32 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrUtils.java @@ -0,0 +1,57 @@ +/* +Licensed to the Apache Software Foundation (ASF) + */ +package org.netbeans.modules.php.blade.syntax.antlr4.php; + +import org.netbeans.modules.php.blade.syntax.antlr4.v10.*; +import java.util.List; +import java.util.Set; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.Token; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser.*; +import org.netbeans.spi.lexer.antlr4.AntlrTokenSequence; + +/** + * + * @author bogdan + */ +public class BladePhpAntlrUtils { + + public static AntlrTokenSequence lexerStringScan(String text) { + CharStream cs = CharStreams.fromString(text); + BladePhpAntlrLexer lexer = new BladePhpAntlrLexer(cs); + AntlrTokenSequence tokens = new AntlrTokenSequence(lexer); + return tokens; + } + + public static Token getToken(String text, int offset) { + AntlrTokenSequence tokens = lexerStringScan(text); + if (offset > text.length()){ + return null; + } + + if (tokens.isEmpty()){ + return null; + } + + boolean hasPrev = tokens.hasPrevious(); + + while(tokens.hasNext()){ + Token test = tokens.next().get(); + String testText = test.getText(); + int x = 1; + } + + tokens.seekTo(offset); + + if (!tokens.hasNext()){ + return null; + } + Token token = tokens.next().get(); + return token; + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpCommonLexer.g4 b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpCommonLexer.g4 new file mode 100644 index 000000000000..f8c69ab6cb36 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpCommonLexer.g4 @@ -0,0 +1,70 @@ +lexer grammar BladePhpCommonLexer; + +tokens { + HTML, + BLADE_COMMENT +} + +fragment Identifier + : [a-z_\u0080-\ufffe][a-z0-9_\u0080-\ufffe]*; + +fragment HtmlIdentifier + : [a-z_\u0080-\ufffe][a-z0-9_\u0080-\ufffe-]*; + +fragment ESC_DOUBLE_QUOTED_STRING + : [\\"]; + +fragment DOUBLE_QUOTED_STRING_FRAGMENT + : '"' (ESC_DOUBLE_QUOTED_STRING | . )*? '"'; + +fragment SINGLE_QUOTED_STRING_FRAGMENT + : '\'' (~('\'' | '\\') | '\\' . )* '\''; + +fragment StringLiteral : DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT; + +fragment LineComment + : '//' ~ [\r\n]* + ; + +fragment PhpVariable + : '$' Identifier; + + +fragment Digit + : ('0'..'9'); + +BLADE_COMMENT_START : '{{--' ->pushMode(INSIDE_BLADE_COMMENT), skip; + +EMAIL_SUBSTRING : ('@' Identifier '.')->skip; + +VERSION_WITH_AT: '@' (Digit '.'?)+->skip; + +//escapes +D_ESCAPES + : ( + '{{{' + | '@@' '@'? + | '@{' '{'? + | '@media' [ ]+ ('screen' [ ]+ 'and'?)? + | ( '@charset' | '@import' | '@namespace' | '@document' | '@font-face' + | '@page' | '@layer' | '@supports' | '@tailwind' | '@apply' | '@-webkit-keyframes' + | '@keyframes' | '@counter-style' | '@font-feature-values' | '@property' + | '@scope' | '@starting-style' | '@supports' | '@view-transition' + | '@container' | '@color-profile' | '@styleset' | '@font-palette-values' | '@media' + ) [ ]* + )->type(HTML); + +mode INSIDE_BLADE_COMMENT; + +BLADE_COMMENT_END : '--}}'->popMode, skip; + +//hack to merge all php inputs into one token +BLADE_COMMENT_PEEK : . { + this._input.LA(1) == '-' && + this._input.LA(2) == '-' && + this._input.LA(3) == '}' && + this._input.LA(4) == '}' + }? ->skip; +BLADE_COMMENT_MORE : . ->skip; + +BLADE_COMMENT_EOF : EOF->popMode, skip; \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpSnippetParser.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpSnippetParser.java new file mode 100644 index 000000000000..13d7fd79da19 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpSnippetParser.java @@ -0,0 +1,346 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax.antlr4.php; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import org.antlr.v4.runtime.ANTLRErrorListener; +import org.antlr.v4.runtime.BaseErrorListener; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.DefaultErrorStrategy; +import org.antlr.v4.runtime.FailedPredicateException; +import org.antlr.v4.runtime.Parser; +import org.antlr.v4.runtime.RecognitionException; +import org.antlr.v4.runtime.Recognizer; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.tree.ParseTreeListener; +import org.netbeans.modules.csl.api.OffsetRange; +import org.netbeans.modules.csl.api.Severity; +import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils.FieldAccessType; +import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.BladeError; +import org.openide.filesystems.FileObject; + +/** + * + * @author bogdan + */ +public class BladePhpSnippetParser { + + private final String snippet; + private final FileObject originFile; + private final int snippetOffset; + private final List errors = new ArrayList<>(); + private final Map identifierReference = new TreeMap<>(); + private final Map fieldAccessReference = new TreeMap<>(); + + public enum PhpReferenceType { + PHP_NAMESPACE, + PHP_CLASS, + PHP_FUNCTION, + PHP_METHOD, + PHP_CLASS_CONSTANT + } + + public BladePhpSnippetParser(String snippet, FileObject originFile, int snippetOffset) { + this.snippet = snippet; + this.originFile = originFile; + this.snippetOffset = snippetOffset; + } + + public void parse() { + CharStream cs = CharStreams.fromString(snippet); + BladePhpAntlrLexer lexer = new BladePhpAntlrLexer(cs); + CommonTokenStream tokens = new CommonTokenStream(lexer); + BladePhpAntlrParser parser = new BladePhpAntlrParser(tokens); + parser.removeErrorListeners(); + parser.setErrorHandler(new RustANTLRErrorStrategy()); + parser.addErrorListener(createErrorListener()); + //parser.setBuildParseTree(false); + parser.addParseListener(createIdentifiablePhpElementReferences()); + parser.expression(); + } + + private ParseTreeListener createIdentifiablePhpElementReferences() { + return new BladePhpAntlrParserBaseListener() { + @Override + public void exitFunctionExpr(BladePhpAntlrParser.FunctionExprContext ctx) { + if (ctx.IDENTIFIER() != null) { + Token token = ctx.IDENTIFIER().getSymbol(); + String functionName = ctx.IDENTIFIER().getText(); + OffsetRange range = new OffsetRange(token.getStartIndex(), token.getStopIndex() + 1); + PhpReference reference = new PhpReference(PhpReferenceType.PHP_FUNCTION, functionName); + identifierReference.put(range, reference); + } + } + + @Override + public void exitStaticFieldAccess(BladePhpAntlrParser.StaticFieldAccessContext ctx) { + String namespace = null; + Token classToken = ctx.className; + + if (classToken == null) { + return; + } + + if (ctx.namespace() != null) { + namespace = ctx.namespace().getText(); + namespace = namespace.substring(0, namespace.length() - 1); + OffsetRange namespaceRange = new OffsetRange(ctx.namespace().getStart().getStartIndex(), + ctx.namespace().getStop().getStopIndex()); + PhpReference reference = new PhpReference(PhpReferenceType.PHP_NAMESPACE, namespace, null); + identifierReference.put(namespaceRange, reference); + } + + OffsetRange range = new OffsetRange(classToken.getStartIndex(), classToken.getStopIndex() + 1); + PhpReference reference = new PhpReference(PhpReferenceType.PHP_CLASS, classToken.getText(), namespace); + identifierReference.put(range, reference); + + if (ctx.const_ != null) { + PhpReference methodReference = new PhpReference(PhpReferenceType.PHP_CLASS_CONSTANT, ctx.const_.getText(), namespace, reference); + OffsetRange accessRange = new OffsetRange(ctx.const_.getStartIndex(), ctx.const_.getStopIndex() + 1); + identifierReference.put(accessRange, methodReference); + FieldAcces fieldAccess = new FieldAcces(FieldAccessType.STATIC, methodReference, reference); + fieldAccessReference.put(accessRange, fieldAccess); + } + } + + @Override + public void exitStaticMethodAccess(BladePhpAntlrParser.StaticMethodAccessContext ctx) { + String namespace = null; + Token classToken = ctx.className; + + if (classToken == null) { + return; + } + if (ctx.namespace() != null) { + namespace = ctx.namespace().getText(); + //trim the extra \\ + namespace = namespace.substring(0, namespace.length() - 1); + OffsetRange namespaceRange = new OffsetRange(ctx.namespace().getStart().getStartIndex(), + ctx.namespace().getStop().getStopIndex()); + PhpReference reference = new PhpReference(PhpReferenceType.PHP_NAMESPACE, namespace, null); + identifierReference.put(namespaceRange, reference); + } + + OffsetRange range = new OffsetRange(classToken.getStartIndex(), classToken.getStopIndex() + 1); + + PhpReference reference = new PhpReference(PhpReferenceType.PHP_CLASS, classToken.getText(), namespace); + identifierReference.put(range, reference); + + if (ctx.method != null) { + PhpReference methodReference = new PhpReference(PhpReferenceType.PHP_METHOD, + ctx.method.getText(), namespace, reference); + OffsetRange accessRange = new OffsetRange(ctx.method.getStartIndex(), ctx.method.getStopIndex() + 1); + identifierReference.put(accessRange, methodReference); + FieldAcces fieldAccess = new FieldAcces(FieldAccessType.STATIC, methodReference, reference); + fieldAccessReference.put(accessRange, fieldAccess); + } + } + + @Override + public void exitStaticAccess(BladePhpAntlrParser.StaticAccessContext ctx) { + String namespace = null; + Token classToken = ctx.className; + if (classToken == null) { + return; + } + if (ctx.namespace() != null) { + namespace = ctx.namespace().getText(); + namespace = namespace.substring(0, namespace.length() - 1); + OffsetRange namespaceRange = new OffsetRange(ctx.namespace().getStart().getStartIndex(), + ctx.namespace().getStop().getStopIndex()); + PhpReference reference = new PhpReference(PhpReferenceType.PHP_NAMESPACE, namespace, null); + identifierReference.put(namespaceRange, reference); + } + + OffsetRange range = new OffsetRange(classToken.getStartIndex(), classToken.getStopIndex() + 1); + PhpReference reference = new PhpReference(PhpReferenceType.PHP_CLASS, classToken.getText(), namespace); + identifierReference.put(range, reference); + + if (ctx.DOUBLE_COLON() != null && ctx.DOUBLE_COLON().getSymbol() != null) { + //generic access +// Token dbColon = ctx.DOUBLE_COLON().getSymbol(); +// PhpReference methodReference = new PhpReference(PhpReferenceType.PHP_CLASS_CONSTANT, "", namespace); +// OffsetRange accessRange = new OffsetRange(dbColon.getStopIndex(), dbColon.getStopIndex() + 1); +// identifierReference.put(accessRange, methodReference); +// FieldAcces fieldAccess = new FieldAcces(FieldAccessType.STATIC, methodReference, reference); +// fieldAccessReference.put(accessRange, fieldAccess); + } + } + + @Override + public void exitClassInstanceStatement(BladePhpAntlrParser.ClassInstanceStatementContext ctx) { + String namespace = null; + if (ctx.namespace() != null) { + namespace = ctx.namespace().getText(); + //trim the extra \\ + namespace = namespace.substring(0, namespace.length() - 1); + OffsetRange namespaceRange = new OffsetRange(ctx.namespace().getStart().getStartIndex(), + ctx.namespace().getStop().getStopIndex()); + PhpReference reference = new PhpReference(PhpReferenceType.PHP_NAMESPACE, namespace, null); + identifierReference.put(namespaceRange, reference); + } + + Token classToken = ctx.className; + if (classToken != null && classToken.getStartIndex() > 0) { + OffsetRange range = new OffsetRange(classToken.getStartIndex(), classToken.getStopIndex() + 1); + PhpReference reference = new PhpReference(PhpReferenceType.PHP_CLASS, classToken.getText(), namespace); + identifierReference.put(range, reference); + } + } + + @Override + public void exitMisc(BladePhpAntlrParser.MiscContext ctx) { + String namespace = null; + if (ctx.namespace() != null) { + namespace = ctx.namespace().getText(); + //trim the extra \\ + namespace = namespace.substring(0, namespace.length() - 1); + OffsetRange namespaceRange = new OffsetRange(ctx.namespace().getStart().getStartIndex(), + ctx.namespace().getStop().getStopIndex()); + PhpReference reference = new PhpReference(PhpReferenceType.PHP_NAMESPACE, namespace, null); + identifierReference.put(namespaceRange, reference); + } + + Token classToken = ctx.className; + if (classToken != null && classToken.getStartIndex() > 0) { + OffsetRange range = new OffsetRange(classToken.getStartIndex(), classToken.getStopIndex() + 1); + PhpReference reference = new PhpReference(PhpReferenceType.PHP_CLASS, classToken.getText(), namespace); + identifierReference.put(range, reference); + } + } + }; + } + + public PhpReference findIdentifierReference(int offset) { + for (Map.Entry entry : identifierReference.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return entry.getValue(); + } + } + + return null; + } + + public FieldAcces findFieldAccessReference(int offset) { + for (Map.Entry entry : fieldAccessReference.entrySet()) { + OffsetRange range = entry.getKey(); + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return entry.getValue(); + } + } + + return null; + } + + private final class RustANTLRErrorStrategy extends DefaultErrorStrategy { + + @Override + protected void reportFailedPredicate(Parser recognizer, FailedPredicateException e) { + + } + + @Override + public void reportError(Parser recognizer, RecognitionException e) { + if (e.getMessage() == null) { + return; + } + super.reportError(recognizer, e); + } + } + + private ANTLRErrorListener createErrorListener() { + return new BaseErrorListener() { + @Override + public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { + int errorPosition = snippetOffset; + if (offendingSymbol instanceof Token) { + Token offendingToken = (Token) offendingSymbol; + errorPosition += offendingToken.getStartIndex(); + } + errors.add(new BladeError(null, "PHP error: " + msg, null, originFile, errorPosition, errorPosition, Severity.ERROR)); + } + + }; + } + + public List getDiagnostics() { + return errors; + } + + public static class PhpReference { + + public final PhpReferenceType type; + public final String identifier; + public final PhpReference ownerClass; + public final String namespace; + + public PhpReference(PhpReferenceType type, String name) { + this.type = type; + this.identifier = name; + this.namespace = null; + this.ownerClass = null; + } + + public PhpReference(PhpReferenceType type, String name, String namespace) { + this.type = type; + this.identifier = name; + this.namespace = namespace; + this.ownerClass = null; + } + + public PhpReference(PhpReferenceType type, String name, String namespace, PhpReference ownerClass) { + this.type = type; + this.identifier = name; + this.namespace = namespace; + this.ownerClass = ownerClass; + } + } + + public static class FieldAcces { + + public final FieldAccessType type; + public final PhpReference field; + public final PhpReference owner; + + public FieldAcces(FieldAccessType type, PhpReference field, PhpReference owner) { + this.type = type; + this.field = field; + this.owner = owner; + } + + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/LexerAdaptor.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/LexerAdaptor.java new file mode 100644 index 000000000000..3271d211556d --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/LexerAdaptor.java @@ -0,0 +1,53 @@ +/* +Licensed to the Apache Software Foundation (ASF) + */ +package org.netbeans.modules.php.blade.syntax.antlr4.php; + +import org.netbeans.modules.php.blade.syntax.antlr4.v10.*; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.atn.ATN; +import org.antlr.v4.runtime.misc.Interval; + +/** + * + * @author bogdan + */ +public abstract class LexerAdaptor extends Lexer { + + private int _currentRuleType = Token.INVALID_TYPE; + public int exitIfModePosition = 0; + public boolean compomentTagOpen = false; + + public LexerAdaptor(CharStream input) { + super(input); + } + + public int getCurrentRuleType() { + return _currentRuleType; + } + + public void setCurrentRuleType(int ruleType) { + this._currentRuleType = ruleType; + } + + @Override + public Token emit() { + return super.emit(); + } + + @Override + public void reset() { + setCurrentRuleType(Token.INVALID_TYPE); + super.reset(); + } + + public void startExprLookup(){ + if (this._input.LA(1) == '('){ + this.mode(BladeAntlrLexer.INSIDE_PHP_EXPRESSION); + } else { + this.skip(); + } + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/ParserAdaptor.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/ParserAdaptor.java new file mode 100644 index 000000000000..c2fe4af5844e --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/ParserAdaptor.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax.antlr4.php; + +import org.antlr.v4.runtime.Parser; +import org.antlr.v4.runtime.TokenStream; + +/** + * + * @author bogdan + */ +public abstract class ParserAdaptor extends Parser { + public static enum ParserContext { + FOREACH, + OUTPUT, + STANDARD + } + + protected ParserContext bladeParserContext = ParserContext.STANDARD; + + public ParserAdaptor(TokenStream input) { + super(input); + } + + public void setBladeParserContext(ParserContext context){ + this.bladeParserContext = context; + } + +} From 7188d866ba073f5964bf1953742099bb43cf3a3e Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Sun, 23 Feb 2025 13:34:28 +0200 Subject: [PATCH 36/43] wip adapt code refactor for tests --- .../blade/editor/HyperlinkProviderImpl.java | 44 +- .../editor/braces/BladeBracesMatcher.java | 2 +- .../php/blade/editor/lexer/BladeLexer.java | 72 +- .../php/blade/editor/lexer/BladeTokenId.java | 165 +- .../php/blade/editor/lexer/PHPLexerUtils.java | 55 - .../BladeTypedTextInterceptor.java | 133 +- .../modules/php/blade/resources/layer.xml | 10 +- .../syntax/antlr4/php/BladePhpAntlrLexer.java | 18 + .../antlr4/php/BladePhpAntlrParser.java | 18 + .../php/BladePhpAntlrParserBaseListener.java | 18 + .../php/BladePhpAntlrParserListener.java | 18 + .../antlr4/v10/BladeAntlrColoringLexer.g4 | 141 +- .../syntax/antlr4/v10/BladeAntlrLexer.g4 | 6 +- .../antlr4/v10/BladeColoringCommonLexer.g4 | 14 +- .../syntax/antlr4/v10/BladeCommonLexer.g4 | 39 +- .../antlr4/v10/ColoringLexerAdaptor.java | 90 +- .../options/BladeOptionsPanelController.java | 9 +- .../lexer/BladeLexerTest/css_at_rules.pass | 70 +- .../BladeLexerTest/escaped_directive.pass | 4 +- .../lexer/BladeLexerTest/escaped_tag.pass | 7 +- .../BladeLexerTest/html_javascript_01.pass | 14 +- .../lexer/blade/content_tag.pass | 15 +- .../lexer/blade/escaped_tag.pass | 24 +- .../lexer/blade/raw_tag.pass | 15 +- ...irective_bracket_error_01.blade.php.errors | 1 - ...unclosed_section_error_01.blade.php.errors | 2 +- .../unopend_set_error_01.blade.php.errors | 2 +- .../typinghooks/BladeTypinghooksTestBase.java | 17 +- .../syntax/antlr4/php/BladePhpAntlrLexer.g4 | 73 - .../syntax/antlr4/php/BladePhpAntlrLexer.java | 629 ---- .../syntax/antlr4/php/BladePhpAntlrParser.g4 | 175 - .../antlr4/php/BladePhpAntlrParser.java | 3208 ----------------- .../php/BladePhpAntlrParserBaseListener.java | 390 -- .../php/BladePhpAntlrParserListener.java | 302 -- .../syntax/antlr4/php/BladePhpAntlrUtils.java | 57 - .../syntax/antlr4/php/BladePhpCommonLexer.g4 | 70 - .../antlr4/php/BladePhpSnippetParser.java | 346 -- .../blade/syntax/antlr4/php/LexerAdaptor.java | 53 - .../syntax/antlr4/php/ParserAdaptor.java | 45 - 39 files changed, 416 insertions(+), 5955 deletions(-) delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/PHPLexerUtils.java delete mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.g4 delete mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.java delete mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.g4 delete mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.java delete mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserBaseListener.java delete mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserListener.java delete mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrUtils.java delete mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpCommonLexer.g4 delete mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpSnippetParser.java delete mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/LexerAdaptor.java delete mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/ParserAdaptor.java diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java index d6fe93fc5091..5640a4e7c749 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java @@ -37,7 +37,7 @@ import org.netbeans.editor.BaseDocument; import static org.netbeans.lib.editor.hyperlink.spi.HyperlinkType.GO_TO_DECLARATION; import org.netbeans.modules.php.api.util.FileUtils; -import org.netbeans.modules.php.blade.editor.lexer.PHPLexerUtils; +import org.netbeans.modules.php.blade.editor.lexer.BladeLexerUtils; import org.netbeans.modules.php.blade.editor.path.BladePathUtils; import org.netbeans.modules.php.blade.project.BladeProjectProperties; import org.netbeans.modules.php.editor.lexer.PHPTokenId; @@ -56,16 +56,16 @@ @MimeRegistration(mimeType = FileUtils.PHP_MIME_TYPE, service = HyperlinkProviderExt.class) public class HyperlinkProviderImpl implements HyperlinkProviderExt { - private String methodName = ""; // NOI18N + private String methodName; private String identifiableText; private String tooltipText = ""; // NOI18N private FileObject goToFile; private int goToOffset = 0; public static final int MIN_STRING_IDENTIIFER_LENGTH = 5; public static final String FILE_TITLE = "Blade Template File"; // NOI18N - - String[] viewMethods = new String[]{"view", "render", "make"}; // NOI18N - Set viewMethodSet = new HashSet<>(Arrays.asList(viewMethods)); + + private final String[] viewMethods = new String[]{"view", "render", "make"}; // NOI18N + private final Set viewMethodSet = new HashSet<>(Arrays.asList(viewMethods)); public enum DeclarationType { VIEW_PATH; @@ -96,7 +96,7 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { BaseDocument baseDoc = (BaseDocument) doc; int lineStart = LineDocumentUtils.getLineStart(baseDoc, offset); - TokenSequence tokensq = PHPLexerUtils.getTokenSequence(doc, offset); + TokenSequence tokensq = BladeLexerUtils.getLockedPhpTokenSequence(doc, offset); if (tokensq == null) { return null; @@ -112,7 +112,6 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { String focusedText = currentToken.text().toString(); //2 char config are not that relevant - //2 qoute char an 3 char minimum length text if (focusedText.length() < MIN_STRING_IDENTIIFER_LENGTH || !EditorStringUtils.isQuotedString(focusedText)) { return null; } @@ -131,8 +130,9 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { if (prevTokenId != null && id.equals(PHPTokenId.PHP_STRING)) { methodName = text; //tooltip text + if (viewMethodSet.contains(methodName)) { - FileObject currentFile = EditorUtils.getFileObject(doc); + FileObject currentFile = FileSystemUtils.getFileObjectFromDoc(doc); if (currentFile == null) { return null; @@ -142,8 +142,7 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { for (FileObject includedFile : includedFiles) { goToFile = includedFile; - tooltipText = FILE_TITLE - + " : " + viewPath // NOI18N + tooltipText = FILE_TITLE + " File : " + viewPath // NOI18N + "

      " + identifiableText + ""; // NOI18N goToOffset = 0; break; @@ -151,6 +150,7 @@ public int[] getHyperlinkSpan(Document doc, int offset, HyperlinkType type) { return new int[]{startOffset, startOffset + currentToken.length()}; } + } if (id.equals(PHPTokenId.PHP_TOKEN) && text.equals("(")) { // NOI18N @@ -171,6 +171,11 @@ public void performClickAction(Document doc, int offset, HyperlinkType type) { } } } + + @Override + public String getTooltipText(Document doc, int offset, HyperlinkType type) { + return "" + tooltipText + ""; // NOI18N + } private void openDocument(FileObject f, int offset) { try { @@ -180,26 +185,23 @@ private void openDocument(FileObject f, int offset) { } catch (IOException ex) { Exceptions.printStackTrace(ex); } - } + /** + * compatible relation with laravel framework plugin + * blade editor is not a Php Extension, so that's the reason for the implementation of HyperlinkProvider. + * + * @param doc + * @return + */ private boolean nonLaravelDeclFinderEnabled(Document doc) { - Project projectOwner = EditorUtils.getProjectOwner(doc); + Project projectOwner = FileSystemUtils.getProjectOwner(doc); if (projectOwner == null) { return false; } BladeProjectProperties bladeProperties = BladeProjectProperties.getInstance(projectOwner); - if (bladeProperties == null){ - return false; - } - return bladeProperties.getNonLaravelDeclFinderFlag(); } - @Override - public String getTooltipText(Document doc, int offset, HyperlinkType type) { - return "" + tooltipText + ""; // NOI18N - } - } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/braces/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/braces/BladeBracesMatcher.java index d21b77a2af9e..f167b162609a 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/braces/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/braces/BladeBracesMatcher.java @@ -296,7 +296,7 @@ private int[] outputRange(Token token) { return null; } - @MimeRegistration(service = BracesMatcherFactory.class, mimeType = BladeLanguage.MIME_TYPE, position = 110) + @MimeRegistration(service = BracesMatcherFactory.class, mimeType = BladeLanguage.MIME_TYPE, position = 0) public static final class Factory implements BracesMatcherFactory { @Override diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexer.java index 5b837df496a1..55f9a4574459 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeLexer.java @@ -41,62 +41,46 @@ public Object state() { @Override protected Token mapToken(org.antlr.v4.runtime.Token antlrToken) { - //debug text - //String text = antlrToken.getText(); - int type = antlrToken.getType(); - //System.out.println(text + " " + type); - switch (type) { - case BladeAntlrColoringLexer.BLADE_PAREN: - return token(BLADE_PAREN); - case BladeAntlrColoringLexer.BLADE_COMMENT_START: - return token(BLADE_COMMENT_START); - case BladeAntlrColoringLexer.BLADE_COMMENT: - return token(BLADE_COMMENT); - case BladeAntlrColoringLexer.BLADE_COMMENT_END: - return token(BLADE_COMMENT_END); - case BladeAntlrColoringLexer.HTML_TAG: - case BladeAntlrColoringLexer.HTML: - return token(HTML); - case BladeAntlrColoringLexer.PHP_INLINE: - return token(PHP_INLINE); - case BladeAntlrColoringLexer.PHP_EXPRESSION: - //System.out.println(antlrToken.getText()); - return token(PHP_BLADE_EXPRESSION); - case BladeAntlrColoringLexer.BLADE_PHP_INLINE: - return token(PHP_BLADE_INLINE_CODE); - case BladeAntlrColoringLexer.DIRECTIVE: - case BladeAntlrColoringLexer.D_PHP: - case BladeAntlrColoringLexer.D_ENDPHP: - case BladeAntlrColoringLexer.D_CUSTOM: - return token(BLADE_DIRECTIVE); - case BladeAntlrColoringLexer.RAW_TAG: - case BladeAntlrColoringLexer.CONTENT_TAG: - return token(BLADE_ECHO_DELIMITOR); - case BladeAntlrColoringLexer.BLADE_PHP_ECHO_EXPR: - return token(PHP_BLADE_ECHO_EXPR); - case BladeAntlrColoringLexer.D_UNKNOWN: - case BladeAntlrColoringLexer.D_AT: - return token(BLADE_DIRECTIVE_UNKNOWN); - case BladeAntlrColoringLexer.ERROR: - return token(WS_D); - default: - return token(OTHER); - } + + return switch (antlrToken.getType()) { + case BladeAntlrColoringLexer.HTML_TAG, BladeAntlrColoringLexer.HTML -> groupToken(HTML, BladeAntlrColoringLexer.HTML); + case BladeAntlrColoringLexer.COMPONENT_ATTR -> groupToken(BLADE_COMPONENT_ATTRIBUTE, BladeAntlrColoringLexer.COMPONENT_ATTR); + case BladeAntlrColoringLexer.DIRECTIVE, BladeAntlrColoringLexer.D_PHP, BladeAntlrColoringLexer.D_ENDPHP -> token(BLADE_DIRECTIVE); + case BladeAntlrColoringLexer.D_CUSTOM -> token(BLADE_CUSTOM_DIRECTIVE); + case BladeAntlrColoringLexer.RAW_TAG, BladeAntlrColoringLexer.CONTENT_TAG -> token(BLADE_ECHO_DELIMITOR); + case BladeAntlrColoringLexer.BLADE_PHP_ECHO_EXPR -> token(PHP_BLADE_ECHO_EXPR); + case BladeAntlrColoringLexer.D_UNKNOWN, BladeAntlrColoringLexer.D_AT -> groupToken(BLADE_DIRECTIVE_UNKNOWN, BladeAntlrColoringLexer.D_UNKNOWN); + case BladeAntlrColoringLexer.BLADE_PAREN -> token(BLADE_PAREN); + case BladeAntlrColoringLexer.BLADE_COMMENT_START -> token(BLADE_COMMENT_START); + case BladeAntlrColoringLexer.BLADE_COMMENT -> groupToken(BLADE_COMMENT, BladeAntlrColoringLexer.BLADE_COMMENT); + case BladeAntlrColoringLexer.BLADE_COMMENT_END -> token(BLADE_COMMENT_END); + case BladeAntlrColoringLexer.PHP_INLINE -> token(PHP_INLINE); + case BladeAntlrColoringLexer.PHP_EXPRESSION -> groupToken(PHP_BLADE_EXPRESSION, BladeAntlrColoringLexer.PHP_EXPRESSION); + case BladeAntlrColoringLexer.BLADE_PHP_INLINE -> groupToken(PHP_BLADE_INLINE_CODE, BladeAntlrColoringLexer.BLADE_PHP_INLINE); + case BladeAntlrColoringLexer.ERROR -> token(WS_D); + default -> token(OTHER); + }; } private static class State extends AbstractAntlrLexerBridge.LexerState { - final int currentRuleType; + final int rParenBalance; + final int compAttrQuoteBalance; + final boolean insideComponentTag; public State(BladeAntlrColoringLexer lexer) { super(lexer); - this.currentRuleType = lexer.getCurrentRuleType(); + this.rParenBalance = lexer.rParenBalance; + this.compAttrQuoteBalance = lexer.compAttrQuoteBalance; + this.insideComponentTag = lexer.insideComponentTag; } @Override public void restore(BladeAntlrColoringLexer lexer) { super.restore(lexer); - lexer.setCurrentRuleType(currentRuleType); + lexer.rParenBalance = rParenBalance; + lexer.compAttrQuoteBalance = compAttrQuoteBalance; + lexer.insideComponentTag = insideComponentTag; } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java index cc86179377ef..12c9081e9c41 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java @@ -21,6 +21,7 @@ import java.util.Collection; import java.util.EnumSet; import java.util.WeakHashMap; +import org.netbeans.api.html.lexer.HTMLTokenId; import org.netbeans.api.lexer.InputAttributes; import org.netbeans.api.lexer.Language; import org.netbeans.api.lexer.LanguagePath; @@ -67,9 +68,6 @@ public String primaryCategory() { public static abstract class BladeLanguageHierarchy extends LanguageHierarchy { - private final WeakHashMap> tokenLangCache - = new WeakHashMap<>(); - @Override protected Collection createTokenIds() { return EnumSet.allOf(BladeTokenId.class); @@ -78,120 +76,101 @@ protected Collection createTokenIds() { @Override protected LanguageEmbedding embedding(Token token, LanguagePath languagePath, InputAttributes inputAttributes) { - boolean joinHtml = true; + switch (token.id()) { - case PHP_BLADE_INLINE_CODE, PHP_BLADE_EXPRESSION -> { + case PHP_BLADE_INLINE_CODE: + case PHP_BLADE_EXPRESSION: { Language phpLanguage = PHPTokenId.languageInPHP(); - if (phpLanguage == null || token.text() == null){ + if (phpLanguage == null || token.text() == null) { return null; } //php brace matcher freeze issue patch String tokenText = token.text().toString(); - int startOffset = 0; - int endOffset = 0; - if (!tokenText.startsWith("(") && !tokenText.startsWith("[")){ - return LanguageEmbedding.create(phpLanguage, startOffset, endOffset, false); - } - //php brace matcher freeze issue patch - if (tokenText.startsWith("((") && tokenText.endsWith("))")){ //NOI18N - startOffset = 2; - endOffset = 2; - } else if (tokenText.startsWith("[[") && tokenText.endsWith("]]")){ //NOI18N - startOffset = 2; - endOffset = 2; - } else if (tokenText.startsWith("([") && tokenText.endsWith("])")){ //NOI18N - startOffset = 2; - endOffset = 2; - } else if (tokenText.startsWith("[(") && tokenText.endsWith(")]")){ //NOI18N - startOffset = 2; - endOffset = 2; - } else if (tokenText.startsWith("([") || tokenText.startsWith("[(")){ //NOI18N - startOffset = 2; - } else if (tokenText.startsWith("(") && tokenText.endsWith(")")){ //NOI18N - startOffset = 1; - endOffset = 1; - } else if (tokenText.startsWith("[") && tokenText.endsWith("]")){ //NOI18N - startOffset = 1; - endOffset = 1; - } else if (tokenText.startsWith("(") || tokenText.startsWith("[")){ //NOI18N - startOffset = 1; - } - return LanguageEmbedding.create(phpLanguage, startOffset, endOffset, false); + OffsetPair offsetPair = computeEmebeddingOffsets(tokenText); + + return LanguageEmbedding.create(phpLanguage, offsetPair.start, offsetPair.end, false); } - case PHP_BLADE_ECHO_EXPR -> { + case PHP_BLADE_ECHO_EXPR: { Language phpLanguage = PHPTokenId.languageInPHP(); - if (phpLanguage == null || token.text() == null){ + if (phpLanguage == null || token.text() == null) { return null; } String tokenText = token.text().toString(); - int startOffset = 0; - int endOffset = 0; - - if (!tokenText.startsWith("(") && !tokenText.startsWith("[")){ - return LanguageEmbedding.create(phpLanguage, startOffset, endOffset, false); - } - + //php brace matcher freeze issue patch - if (tokenText.startsWith("((") && tokenText.endsWith("))")){ //NOI18N - startOffset = 2; - endOffset = 2; - } else if (tokenText.startsWith("[[") && tokenText.endsWith("]]")){ //NOI18N - startOffset = 2; - endOffset = 2; - } else if (tokenText.startsWith("([") && tokenText.endsWith("])")){ //NOI18N - startOffset = 2; - endOffset = 2; - } else if (tokenText.startsWith("[(") && tokenText.endsWith(")]")){ //NOI18N - startOffset = 2; - endOffset = 2; - } else if (tokenText.startsWith("([") || tokenText.startsWith("[(")){ //NOI18N - startOffset = 2; - } else if (tokenText.startsWith("(") && tokenText.endsWith(")")){ //NOI18N - startOffset = 1; - endOffset = 1; - } else if (tokenText.startsWith("[") && tokenText.endsWith("]")){ //NOI18N - startOffset = 1; - endOffset = 1; - } else if (tokenText.startsWith("(") || tokenText.startsWith("[")){ //NOI18N - startOffset = 1; - } - return LanguageEmbedding.create(phpLanguage, startOffset, endOffset, false); + OffsetPair offsetPair = computeEmebeddingOffsets(tokenText); + + return LanguageEmbedding.create(phpLanguage, offsetPair.start, offsetPair.end, false); } - case PHP_INLINE -> { + case PHP_INLINE: { Language phpLanguageCode = PHPTokenId.language(); return phpLanguageCode != null ? LanguageEmbedding.create(phpLanguageCode, 0, 0, false) : null; } - case HTML -> { - LanguageEmbedding lang; - - if (tokenLangCache.containsKey(token.id())) { - lang = tokenLangCache.get(token.id()); - } else { - Language htmlLanguage = null; - - @SuppressWarnings("unchecked") - Collection providers = (Collection) Lookup.getDefault().lookupAll(LanguageProvider.class); - for (LanguageProvider provider : providers) { - htmlLanguage = (Language) provider.findLanguage("text/html"); //NOI18N - if (htmlLanguage != null) { - break; - } - } - - lang = htmlLanguage != null ? LanguageEmbedding.create(htmlLanguage, 0, 0, joinHtml) : null; - tokenLangCache.put(token.id(), lang); - } - - return lang; + case HTML: { + return LanguageEmbedding.create(HTMLTokenId.language(), 0, 0, true); } - default -> { + default: { return null; } } } } + private static class OffsetPair { + + public final int start; + public final int end; + + public OffsetPair(int start, int end) { + this.start = start; + this.end = end; + } + } + + /** + * patch for avoiding php brace matcher freeze issue + * https://github.com/apache/netbeans/issues/7803 + * + * create a offset for the php embedding content to exclude wrapping brackets and parenthesis + * + * @param tokenText + * @return + */ + private static OffsetPair computeEmebeddingOffsets(String tokenText) { + int startOffset = 0; + int endOffset = 0; + + if (!tokenText.startsWith("(") && !tokenText.startsWith("[")) { //NOI18N + return new OffsetPair(startOffset, endOffset); + } + + if (tokenText.startsWith("((") && tokenText.endsWith("))")) { //NOI18N + startOffset = 2; + endOffset = 2; + } else if (tokenText.startsWith("[[") && tokenText.endsWith("]]")) { //NOI18N + startOffset = 2; + endOffset = 2; + } else if (tokenText.startsWith("([") && tokenText.endsWith("])")) { //NOI18N + startOffset = 2; + endOffset = 2; + } else if (tokenText.startsWith("[(") && tokenText.endsWith(")]")) { //NOI18N + startOffset = 2; + endOffset = 2; + } else if (tokenText.startsWith("([") || tokenText.startsWith("[(")) { //NOI18N + startOffset = 2; + } else if (tokenText.startsWith("(") && tokenText.endsWith(")")) { //NOI18N + startOffset = 1; + endOffset = 1; + } else if (tokenText.startsWith("[") && tokenText.endsWith("]")) { //NOI18N + startOffset = 1; + endOffset = 1; + } else if (tokenText.startsWith("(") || tokenText.startsWith("[")) { //NOI18N + startOffset = 1; + } + + return new OffsetPair(startOffset, endOffset); + } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/PHPLexerUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/PHPLexerUtils.java deleted file mode 100644 index f550155d71d4..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/PHPLexerUtils.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.editor.lexer; - -import javax.swing.text.Document; -import org.netbeans.api.lexer.TokenHierarchy; -import org.netbeans.api.lexer.TokenSequence; -import org.netbeans.editor.BaseDocument; -import org.netbeans.modules.php.editor.lexer.PHPTokenId; - -/** - * - * @author bogdan - */ -public final class PHPLexerUtils { - - private PHPLexerUtils() { - - } - - public static TokenSequence getTokenSequence(Document doc, int offset) { - BaseDocument baseDoc = (BaseDocument) doc; - TokenSequence tokenSequence = null; - baseDoc.readLock(); - try { - TokenHierarchy hierarchy = TokenHierarchy.get(baseDoc); - tokenSequence = hierarchy.tokenSequence(PHPTokenId.language()); - } finally { - baseDoc.readUnlock(); - } - if (tokenSequence != null) { - tokenSequence.move(offset); - tokenSequence.moveNext(); - } - return tokenSequence; - - } - -} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java index 3414812355a5..fd817a010bc0 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypedTextInterceptor.java @@ -41,14 +41,13 @@ */ public class BladeTypedTextInterceptor implements TypedTextInterceptor { - private static final Map CHAR_PAIR = new WeakHashMap<>(); + static final Map CHAR_PAIR = new WeakHashMap<>(); public static enum TagType { CONTENT, RAW, COMMENT } - /** * auto complete char pair */ @@ -77,43 +76,66 @@ public void insert(MutableContext context) throws BadLocationException { return; } - if (!isAutoTagCompletionEnabled()) { + if (!isAutoTagCompletionEnabled()){ return; } - - String typedText = context.getText(); - - TagType tagType = getTagType(typedText); - - if (tagType == null) { + + String typedText = context.getText(); + + Map TagParts = new WeakHashMap<>(); + TagParts.put("{", TagType.CONTENT); //NOI18N + TagParts.put("!", TagType.RAW); //NOI18N + TagParts.put("-", TagType.COMMENT); //NOI18N + + TagType tagType = TagParts.get(typedText); + + if (tagType == null){ return; } - + int offset = context.getOffset(); - - if (offset < 1) { - return; + + switch(tagType) { + case CONTENT -> { + if (offset < 1) { + return; + } + } + case RAW, COMMENT -> { + if (offset < 2) { + return; + } + } } Document document = context.getDocument(); - TokenHierarchy th = TokenHierarchy.get(document); + TokenHierarchy th = TokenHierarchy.get(document); TokenSequence ts = th.tokenSequence(); - ts.move(context.getOffset() - 1); + ts.move(offset - 1); ts.moveNext(); Token token = ts.token(); - - if (token == null || !(token.id() instanceof BladeTokenId)) { + + if (token == null || !(token.id() instanceof BladeTokenId)){ return; } - - BladeTokenId bladeToken = (BladeTokenId) token.id(); - - String tokenText = token.text().toString(); - - if (bladeToken.equals(HTML) - || tokenText.equals("{{") && ch == '-') { // NOI18N - completeFromHtmlFragments(tokenText, context, tagType); + + BladeTokenId bladeTokenId = (BladeTokenId) token.id(); + + String tokenText = token.text().toString().trim(); + + switch (bladeTokenId) { + case HTML -> { + int startOffset = Math.min(tokenText.length(), 3); + String snippet = document.getText(offset - startOffset, startOffset); + if (snippet.endsWith("{") && tagType.equals(TagType.CONTENT)){ //NOI18N + context.setText("{ }}", 1); //NOI18N + } else if (snippet.endsWith("{!") && tagType.equals(TagType.RAW )){ //NOI18N + context.setText("! !!}", 1); //NOI18N + } else if (snippet.endsWith("{{-") && tagType.equals(TagType.COMMENT)){ //NOI18N + context.setText("- --}}", 1); //NOI18N + } + } } } @@ -141,62 +163,17 @@ public void afterInsert(Context cntxt) throws BadLocationException { public void cancelled(Context cntxt) { } - - public boolean isAutoTagCompletionEnabled() { + + public boolean isAutoTagCompletionEnabled(){ return ModulePreferences.isAutoTagCompletionEnabled(); } - private TagType getTagType(String typedText) { - - return switch (typedText) { - case "{" -> // NOI18N - TagType.CONTENT; - case "!" -> // NOI18N - TagType.RAW; - case "-" -> // NOI18N - TagType.COMMENT; - default -> - null; - }; - } - - private void completeFromHtmlFragments(String tokenText, MutableContext context, TagType tagType) { - switch (tokenText) { - case "{" -> // NOI18N - completeContentTag(context, tagType); - case "{!" -> // NOI18N - completeRawContentTag(context, tagType); - case "{{" -> // NOI18N - completeCommenTag(context, tagType, "-- --}}"); - case "{{-" -> // NOI18N - completeCommenTag(context, tagType, "- --}}"); - } - } - - private void completeContentTag(MutableContext context, TagType tagType) { - if (tagType != TagType.CONTENT) { - return; - } - context.setText("{ }}", 1);// NOI18N - } - - private void completeRawContentTag(MutableContext context, TagType tagType) { - if (tagType != TagType.RAW) { - return; - } - context.setText("! !!}", 1);// NOI18N - } - - private void completeCommenTag(MutableContext context, TagType tagType, String completeText) { - if (tagType != TagType.COMMENT) { - return; - } - context.setText(completeText, 1);// NOI18N - } - - @MimeRegistrations({ - @MimeRegistration(mimeType = BladeLanguage.MIME_TYPE, service = TypedTextInterceptor.Factory.class, position=0), - @MimeRegistration(mimeType = "text/html", service = TypedTextInterceptor.Factory.class, position=102) + /** + * register for HTML also + */ + @MimeRegistrations(value = { + @MimeRegistration(mimeType = BladeLanguage.MIME_TYPE, service = TypedTextInterceptor.Factory.class), + @MimeRegistration(mimeType = "text/html", service = TypedTextInterceptor.Factory.class) }) public static class Factory implements TypedTextInterceptor.Factory { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/layer.xml b/php/php.blade/src/org/netbeans/modules/php/blade/resources/layer.xml index f775d62fc08c..4b031b7c61ac 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/resources/layer.xml +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/layer.xml @@ -47,7 +47,12 @@ - + + + + + + @@ -97,6 +102,9 @@ + + + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.java index e4d981210318..0c53f6d20184 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.java @@ -1,5 +1,23 @@ // Generated from BladePhpAntlrLexer.g4 by ANTLR 4.13.0 + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4.php; import org.antlr.v4.runtime.Lexer; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.java index e1ee5b6d97d8..e75ba9524dd0 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.java @@ -1,5 +1,23 @@ // Generated from BladePhpAntlrParser.g4 by ANTLR 4.13.0 + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4.php; import org.antlr.v4.runtime.atn.*; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserBaseListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserBaseListener.java index b90702f412bf..223ed8616b0f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserBaseListener.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserBaseListener.java @@ -1,5 +1,23 @@ // Generated from BladePhpAntlrParser.g4 by ANTLR 4.13.0 + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4.php; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserListener.java index 2bf230beed92..b2cf81523241 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserListener.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserListener.java @@ -1,5 +1,23 @@ // Generated from BladePhpAntlrParser.g4 by ANTLR 4.13.0 + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4.php; import org.antlr.v4.runtime.tree.ParseTreeListener; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 index fe3d90827d11..3e29f53ac7ce 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrColoringLexer.g4 @@ -53,36 +53,41 @@ tokens { BLADE_PAREN, PHP_EXPRESSION, BLADE_PHP_ECHO_EXPR, + BLADE_PHP_INLINE, RAW_TAG, CONTENT_TAG, HTML, - HTML_TAG, + HTML_TAG, + COMPONENT_ATTR, ERROR } -fragment DirectivesWithEndTag : 'for' ('each')? | 'if' | 'while' +fragment DirectivesWithEndTag : 'for' ('each' | 'else')? | 'if' | 'while' | 'section' | 'session' | 'once' | 'push' | 'PushOnce' - | 'switch' | 'unless' | 'can' ('any' | 'not')? - | 'auth' | 'guest' - | 'error' | 'production' | 'empty'; + | 'switch' | 'unless' | 'can' ('any' | 'not')? | 'env' + | 'auth' | 'guest' | 'error' | 'empty' | 'isset' + //11.x + | 'fragment'; fragment Include : '@include' ('If' | 'When' | 'First' | 'Unless')?; fragment ComponentTagIdentifier : [a-z_\u0080-\ufffe][a-z0-9.:\u0080-\ufffe-]*; -//?? -fragment SpecialChars : '°'; +//==================================================== +//TOKENS: PHP_INLINE : '' | '' | EOF); D_GENERIC_BLOCK_DIRECTIVES : ('@' DirectivesWithEndTag | '@sectionMissing' | '@hasSection') (' ')* {this._input.LA(1) == '('}? ->pushMode(INSIDE_PHP_EXPRESSION),type(DIRECTIVE); -D_GENERIC_INLINE_DIRECTIVES : ('@elseif' | Include | '@extends' | '@each' | '@yield' | '@props' | '@method' +D_SIMPLE_BLOCK_DIRECTIVES : '@' 'end'? ('empty' | 'production' | 'once') ->type(DIRECTIVE); + +D_GENERIC_INLINE_DIRECTIVES : ('@elseif' | Include | '@extends' | '@each' | '@yield' | '@props' | '@method' | '@elsecan' ('any' | 'not')? | '@class' | '@style' | '@aware' | '@break' | '@continue' | '@selected' | '@disabled' | '@readonly' | '@required' | '@when' | '@bool') (' ')* {this._input.LA(1) == '('}? ->pushMode(INSIDE_PHP_EXPRESSION),type(DIRECTIVE); -D_GENERIC_INLINE_MIXED_DIRECTIVES : ('@break' | '@continue')->type(DIRECTIVE); +D_GENERIC_INLINE_MIXED_DIRECTIVES : ('@break' | '@continue' | '@auth' | '@guest')->type(DIRECTIVE); D_GENERIC_END_TAGS : ('@stop' | '@show' | '@overwrite' | '@viteReactRefresh' | '@end' DirectivesWithEndTag)->type(DIRECTIVE); @@ -90,9 +95,9 @@ D_GENERIC_END_TAGS : ('@stop' | '@show' | '@overwrite' | '@viteReactRefresh' | ' D_VERBATIM : '@verbatim' ->pushMode(VERBATIM_MODE), type(DIRECTIVE); D_ENDVERBATIM : '@endverbatim'->type(DIRECTIVE); -D_MISC : ('@dd' | '@dump' | '@js' | '@json' | '@inject') (' ')* {this._input.LA(1) == '('}? ->pushMode(INSIDE_PHP_EXPRESSION),type(DIRECTIVE); +D_MISC : ('@dd' | '@dump' | '@js' | '@json' | '@inject' | '@when' | '@bool') (' ')* {this._input.LA(1) == '('}? ->pushMode(INSIDE_PHP_EXPRESSION),type(DIRECTIVE); -D_SIMPLE : ('@else' | '@csrf' | '@default' | '@append' | '@parent')->type(DIRECTIVE); +D_SIMPLE : ('@else' 'guest'? | '@csrf' | '@default' | '@append' | '@parent')->type(DIRECTIVE); //php emebeddings D_PHP_SHORT : '@php' (' ')? {this._input.LA(1) == '('}? ->type(D_PHP),pushMode(INSIDE_PHP_EXPRESSION); @@ -102,50 +107,47 @@ D_PHP : '@php'->pushMode(BLADE_INLINE_PHP); D_END_ARG : ('@end' NameString) (' ')* {this._input.LA(1) == '('}?->pushMode(INSIDE_PHP_EXPRESSION),type(DIRECTIVE); D_END : ('@end' NameString)->type(DIRECTIVE); + +D_ASSET_BUNDLER : '@vite' (' ')* {this._input.LA(1) == '('}? ->pushMode(INSIDE_PHP_EXPRESSION),type(DIRECTIVE); + //known plugins D_LIVEWIRE : ('@livewireStyles' | '@bukStyles' | '@livewireScripts' | '@bukScripts' | '@click' ('.away')? '=')->type(DIRECTIVE); -D_ASSET_BUNDLER : '@vite' (' ')* {this._input.LA(1) == '('}? ->pushMode(INSIDE_PHP_EXPRESSION),type(DIRECTIVE); + +D_SPATIE_ARG : ('@' ( ('unless' | 'has' ('any')? )? 'role') | 'haspermission') {this._input.LA(1) == '('}? ->pushMode(INSIDE_PHP_EXPRESSION),type(DIRECTIVE); + +D_SPATIE : ('@end' ('unless' | 'has' ('any')?)? 'role' | 'haspermission')->type(DIRECTIVE); D_CSS_AT_RULE : ('@supports' | '@container' | '@scope' | '@media') (' ')* {this._input.LA(1) == '('}? ->type(HTML); //we will decide that a custom directive has expression to avoid email matching D_CUSTOM : ('@' NameString (' ')* {this._input.LA(1) == '('}? ) ->pushMode(INSIDE_PHP_EXPRESSION); -D_UNKNOWN : '@' NameString; +D_UNKNOWN : '@' NameString->pushMode(ADIACENT_DIRECTIVE_TOKENS); -//hack to allow completion for directives -//it doesn't trigger completion +//hack to trigger completion handler which is stopped due to embedding context like HTML, PHP D_AT : '@' (' ' | '>' | [\n\r])?; //display CONTENT_TAG_OPEN : '{{' ->pushMode(INSIDE_REGULAR_ECHO),type(CONTENT_TAG); RAW_TAG_OPEN : '{!!' ->pushMode(INSIDE_RAW_ECHO),type(RAW_TAG); -CSS_COMMENT : ('/*' .*? '*/' | '//')->type(HTML); +JS_COMMENT : LineComment->type(HTML); +CSS_COMMENT : ('/*' | '*/')->type(HTML); -HTML_X : ('type(HTML),pushMode(INSIDE_HTML_COMPONENT_TAG); +HTML_X : ('type(HTML),pushMode(INSIDE_HTML_COMPONENT_TAG); CLOSE_TAG : ('' [\n\r ]*)+->type(HTML); -HTML : ((' ')+ | [\r\n]+ | ComponentTagIdentifier | SpecialChars | '"' {this._input.LA(1) != '@'}? | '\\\'' {this._input.LA(1) != '@'}? | '_' | '.' -| ',' | '=' | [()-;]+ | '[' | ']' )* '<' {this._input.LA(1) != 'x' && this._input.LA(1) != '?' && this._input.LA(2) != 'p'}? ->pushMode(INSIDE_HTML_TAG),more; - -HTML_MISC : ((' ')+ | [\r\n]+ | ('#' | '.')? ComponentTagIdentifier | SpecialChars | '"' {this._input.LA(1) != '@'}? -| ',' | '\\\'' | '_' | '.' | '=' | [()-;]+ | '[' | ']' )+->type(HTML); - HTML_WS : ((' ')+ | [\r\n]+)->type(HTML); INCOMPLETE_BLADE_TAG : ('{!' | '{{-') ->type(HTML); -OTHER : . ->type(HTML); - -mode INSIDE_HTML_TAG; - -OTHER_HTML_POP : . {this._input.LA(1) == '@' || this._input.LA(1) == '{' || (this._input.LA(1) == '<' && (this._input.LA(2) == 'x' || this._input.LA(2) == '?'))}? ->type(HTML_TAG), popMode; - -OTHER_HTML : . ->more; +GENERAL_IDENTIFIER : '$'? NameString->type(HTML); -HTML_EOF : EOF->type(HTML_TAG),popMode; +OTHER : . ->type(HTML); +//========================================================= +//========================================================= +//MODES // {{ }} mode INSIDE_REGULAR_ECHO; @@ -154,8 +156,9 @@ CONTENT_TAG_CLOSE : ('}}')->popMode,type(CONTENT_TAG); GREEDY_REGULAR_ECHO_EXPR : ~[ {}]+ {this.consumeEscapedEchoToken();}; ESCAPED_ECHO_EXPR : . [ ]* {this.consumeEscapedEchoToken();}; -EXIT_ECHO_EOF : EOF->type(ERROR),popMode; +EXIT_ECHO_EOF : EOF->type(HTML),popMode; +//========================================================= // {!! !!} mode INSIDE_RAW_ECHO; @@ -163,92 +166,76 @@ RAW_TAG_CLOSE : ('!!}')->popMode, type(RAW_TAG); RAW_ECHO_EXPR : ~[ !{}]+ {this.consumeNotEscapedEchoToken();}; RAW_ECHO_EXPR_MORE : . [ ]* {this.consumeNotEscapedEchoToken();}; -EXIT_RAW_ECHO_EOF : EOF->type(ERROR),popMode; +EXIT_RAW_ECHO_EOF : EOF->type(HTML),popMode; -// @directive ( ) +//========================================================= +// @directive (?) mode INSIDE_PHP_EXPRESSION; -OPEN_PAREN : '(' {this.consumeOpenParen();}; -CLOSE_PAREN : ')' {this.consumeCloseParen();}; +OPEN_PAREN : '(' {this.rParenBalance == 0}? {this.rParenBalance++;}->type(BLADE_PAREN); +OPEN_E_PAREN : '(' {this.rParenBalance++;}->type(PHP_EXPRESSION); +CLOSE_PAREN : ')' {this.rParenBalance <= 1}? {this.rParenBalance = 0;}->type(BLADE_PAREN),mode(DEFAULT_MODE); +CLOSE_E_PAREN : ')' {this.rParenBalance--;}->type(PHP_EXPRESSION); -PHP_EXPRESSION_COMMENT : ('/*' .*? '*/')->skip; +PHP_EXPRESSION_COMMENT : ('/*' .*? '*/')->type(PHP_EXPRESSION); -WS_EXPRESSION_MORE : [ ]+ {this.consumeExprToken();}; +PHP_EXPRESSION_GREEDY : ~[()]+ ->type(PHP_EXPRESSION); -PHP_EXPRESSION_MORE : . {this.consumeExprToken();}; +PHP_EXPRESSION_MORE : . ->type(PHP_EXPRESSION); EXIT_EOF : EOF->type(ERROR),mode(DEFAULT_MODE); +//========================================================= // @php mode BLADE_INLINE_PHP; D_ENDPHP : '@endphp'->popMode; -//hack to merge all php inputs into one token -BLADE_PHP_INLINE : . { - this._input.LA(1) == '@' && - this._input.LA(2) == 'e' && - this._input.LA(3) == 'n' && - this._input.LA(4) == 'd' && - this._input.LA(5) == 'p' && - this._input.LA(6) == 'h' && - this._input.LA(7) == 'p' - }?->channel(PHP_CODE) ; -BLADE_PHP_INLINE_MORE : . ->more; +BLADE_PHP_INLINE : ~[@]+; +BLADE_PHP_INLINE_MORE : . ->type(BLADE_PHP_INLINE); EXIT_INLINE_PHP_EOF : EOF->type(ERROR),popMode; +//========================================================= // @verbatim mode VERBATIM_MODE; D_ENDVERBATIM_IN_MODE : '@endverbatim'->type(DIRECTIVE), popMode; //hack to merge all php inputs into one token -VERBATIM_HTML : . { - this._input.LA(1) == '@' && - this._input.LA(2) == 'e' && - this._input.LA(3) == 'n' && - this._input.LA(4) == 'd' && - this._input.LA(5) == 'v' && - this._input.LA(6) == 'e' && - this._input.LA(7) == 'r' - }? ->type(HTML); -VERBATIM_HTML_MORE : . ->more; +VERBATIM_HTML : ~[@]+ ->type(HTML); +VERBATIM_HTML_MORE : . ->type(HTML); EXIT_VERBATIM_MOD_EOF : EOF->type(ERROR),popMode; +//========================================================= mode INSIDE_HTML_COMPONENT_TAG; -COMPONENT_ATTRIBUTE : (':' FullIdentifier '="') ->type(HTML),pushMode(COMPONENT_PHP_EXPRESSION); +COMPONENT_ATTRIBUTE : (':' FullIdentifier '="') {this.compAttrQuoteBalance = 1;} ->type(COMPONENT_ATTR),pushMode(COMPONENT_PHP_EXPRESSION); COMPONENT_CONTENT_TAG_OPEN : '{{' ->pushMode(INSIDE_REGULAR_ECHO),type(CONTENT_TAG); COMPONENT_RAW_TAG_OPEN : '{!!' ->pushMode(INSIDE_RAW_ECHO),type(RAW_TAG); -EXIT_HTML_COMPONENT : '>'->type(HTML), popMode; +EXIT_HTML_COMPONENT : '>' {this.insideComponentTag = false;}->type(HTML), popMode; HTML_COMPONENT_ANY : . ->type(HTML); EXIT_HTML_COMPONENT_EOF : EOF->type(ERROR),popMode; +//========================================================= mode COMPONENT_PHP_EXPRESSION; -EXIT_COMPONENT_PHP_EXPRESSION : '"'->type(HTML), popMode; -COMPONENT_PHP_EXPRESSION_LAST : . {this._input.LA(1) == '"'}? ->type(PHP_EXPRESSION); -COMPONENT_PHP_EXPRESSION : . ->more; -EXIT_COMPONENT_PHP_EXPRESSION_EOF : EOF->type(ERROR),popMode; - -//TODO numeric -DB_JSON_PAIR : '{' [\\']? FullIdentifier [\\']? ':'+ [\\']? FullIdentifier? [\\']? (',' ( [\\']? FullIdentifier [\\']? ':'+ [\\']? FullIdentifier [\\']? ))* ','? '}' ->more; - -PHP_INTERCALATED : '{' '$' FullIdentifier ('[' [\\'] FullIdentifier [\\'] ']')* '::' FullIdentifier '}'->more; +EXIT_COMPONENT_PHP_EXPRESSION : {this.compAttrQuoteBalance == 1}? '"' {this.compAttrQuoteBalance = 0;}->type(COMPONENT_ATTR), popMode; +COMPONENT_QUOTE_ATTR : '"' ->type(COMPONENT_ATTR); +COMPONENT_PHP_EXPRESSION_LAST : . ->type(PHP_EXPRESSION); -DB_POINT : ('{' '$' FullIdentifier ('[' [\\'] FullIdentifier? [\\'] ']')* (('::'+ FullIdentifier)? (':' FullIdentifier?)+ ) '}' | ':$')->type(ERROR); - -DB_QUOTE_MORE : '\\"'->more; +EXIT_COMPONENT_PHP_EXPRESSION_EOF : EOF->type(ERROR),popMode; -DB_QUOTE_EXIT : '"'->more, popMode; +//========================================================= +mode ADIACENT_DIRECTIVE_TOKENS; -DB_QUOTE_ANY : . ->more; +TOKEN_ADIACENT_DIRECTIVE : (' ' | '>' | [\n\r] | '"')->type(D_UNKNOWN),popMode; -DB_QUOTE_EOF : EOF->type(ERROR),popMode; \ No newline at end of file +TOKEN_ADIACENT_DIRECTIVE_OTHER : . ->type(HTML),popMode; +TOKEN_ADIACENT_DIRECTIVE_EOF : EOF->type(ERROR),popMode; \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 index 5ba3ac3c2c04..8a15bc526e97 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 @@ -221,6 +221,8 @@ BLADE_CONTENT_CLOSE_TAG : '}}' {this.consumeCloseTag(htmlCurlyParenBalance);} ; BLADE_RAW_OPEN_TAG : '{!!'; BLADE_RAW_CLOSE_TAG : '!!}'; +URI_PATH_PART : '/' '@' Identifier '/'->skip; + D_CSS_AT : CssAtWithArg->skip; D_CSS_AT2 : CssAtWithArg (' ')* {this._input.LA(1) == '('}?->skip; D_CUSTOM : '@' Identifier (' ')* {this._input.LA(1) == '('}?; @@ -409,6 +411,8 @@ FOREACH_AS : 'as'; FOREACH_DOUBLE_ARROW : '=>' {rparenBalance == 1 && sqparenBalance == 0 && curlyparenBalance == 0}?; +FOREACH_DENTIFIER : Identifier ->skip; + FOREACH_OTHER : . ->skip; EXIT_FOREACH_EOF : EOF->type(ERROR),mode(DEFAULT_MODE); @@ -441,4 +445,4 @@ PHP_INLINE_EXIT : '?>'->popMode; PHP_INLINE_OTHER : . ->skip; -PHP_INLINE_EOF : EOF->mode(DEFAULT_MODE); +PHP_INLINE_EOF : EOF->mode(DEFAULT_MODE); \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 index fdbbb0e423a0..cf52f79d4ab5 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeColoringCommonLexer.g4 @@ -67,11 +67,12 @@ D_ESCAPES | '@@' '@'? | '@{' '{'? | '@media' [ ]+ ('screen' [ ]+ 'and'?)? + | '@media' (' ')* {this._input.LA(1) == '('}? | ( '@charset' | '@import' | '@namespace' | '@document' | '@font-face' | '@page' | '@layer' | '@supports' | '@tailwind' | '@apply' | '@-webkit-keyframes' | '@keyframes' | '@counter-style' | '@font-feature-values' | '@property' - | '@scope' | '@starting-style' | '@supports' | '@view-transition' - | '@container' | '@color-profile' | '@styleset' | '@font-palette-values' | '@media' + | '@scope' | '@starting-style' | '@view-transition' | '@container' + | '@color-profile' | '@styleset' | '@font-palette-values' | '@media' ) [ ]* )->type(HTML); @@ -80,12 +81,7 @@ mode INSIDE_BLADE_COMMENT; BLADE_COMMENT_END : '--}}'->popMode; //hack to merge all php inputs into one token -BLADE_COMMENT_PEEK : . { - this._input.LA(1) == '-' && - this._input.LA(2) == '-' && - this._input.LA(3) == '}' && - this._input.LA(4) == '}' - }? ->type(BLADE_COMMENT); -BLADE_COMMENT_MORE : . ->more; +BLADE_COMMENT_GREEDY : ~[-]+ ->type(BLADE_COMMENT); +BLADE_COMMENT_MORE : . ->type(BLADE_COMMENT); BLADE_COMMENT_EOF : EOF->type(BLADE_COMMENT),popMode; \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 index 2187e993a73a..9a6c6664f909 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeCommonLexer.g4 @@ -18,18 +18,10 @@ */ lexer grammar BladeCommonLexer; -tokens { - HTML, - BLADE_COMMENT -} - -fragment NameString +fragment Identifier : [a-z_\u0080-\ufffe][a-z0-9_\u0080-\ufffe]*; - -fragment BladeLabel - : [a-z\u0080-\ufffe][a-z0-9_.\u0080-\ufffe]*; -fragment FullIdentifier +fragment HtmlIdentifier : [a-z_\u0080-\ufffe][a-z0-9_\u0080-\ufffe-]*; fragment ESC_DOUBLE_QUOTED_STRING @@ -41,51 +33,38 @@ fragment DOUBLE_QUOTED_STRING_FRAGMENT fragment SINGLE_QUOTED_STRING_FRAGMENT : '\'' (~('\'' | '\\') | '\\' . )* '\''; -fragment LineComment - : '//' ~ [\r\n]* - ; - -fragment PhpVariable - : '$' NameString; - -fragment PhpKeyword - : 'array' | 'class' | 'empty' | 'use'; +fragment STRING_LITERAL : DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT; fragment Digit : ('0'..'9'); +fragment CssAtWithArg : '@media' | '@supports' | '@container'; + BLADE_COMMENT_START : '{{--' ->pushMode(INSIDE_BLADE_COMMENT), skip; -EMAIL_SUBSTRING : ('@' FullIdentifier '.')->type(HTML); +EMAIL_SUBSTRING : ('@' Identifier '.')->skip; -VERSION_WITH_AT: '@' (Digit '.'?)+->type(HTML); +VERSION_WITH_AT: '@' (Digit '.'?)+->skip; //escapes D_ESCAPES : ( '{{{' | '@@' '@'? - | '@{' '{'? | '@media' [ ]+ ('screen' [ ]+ 'and'?)? + | '@media' (' ')* {this._input.LA(1) == '('}? | ( '@charset' | '@import' | '@namespace' | '@document' | '@font-face' | '@page' | '@layer' | '@supports' | '@tailwind' | '@apply' | '@-webkit-keyframes' | '@keyframes' | '@counter-style' | '@font-feature-values' | '@property' | '@scope' | '@starting-style' | '@supports' | '@view-transition' | '@container' | '@color-profile' | '@styleset' | '@font-palette-values' | '@media' ) [ ]* - )->type(HTML); + )->skip; mode INSIDE_BLADE_COMMENT; BLADE_COMMENT_END : '--}}'->popMode, skip; -//hack to merge all php inputs into one token -BLADE_COMMENT_PEEK : . { - this._input.LA(1) == '-' && - this._input.LA(2) == '-' && - this._input.LA(3) == '}' && - this._input.LA(4) == '}' - }? ->skip; BLADE_COMMENT_MORE : . ->skip; BLADE_COMMENT_EOF : EOF->popMode, skip; \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java index 58199cdbe91a..363e1cfc982d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/ColoringLexerAdaptor.java @@ -29,7 +29,9 @@ public abstract class ColoringLexerAdaptor extends Lexer { private int _currentRuleType = Token.INVALID_TYPE; - private int roundParenBalance = 0; + public int rParenBalance = 0; + public int compAttrQuoteBalance = 0; + public boolean insideComponentTag = false; public ColoringLexerAdaptor(CharStream input) { super(input); @@ -42,10 +44,6 @@ public int getCurrentRuleType() { public void setCurrentRuleType(int ruleType) { this._currentRuleType = ruleType; } - - public int getRoundParenBalance(){ - return this.roundParenBalance; - } @Override public Token emit() { @@ -54,55 +52,13 @@ public Token emit() { @Override public void reset() { - setCurrentRuleType(Token.INVALID_TYPE); + //setCurrentRuleType(Token.INVALID_TYPE); + rParenBalance = 0; + compAttrQuoteBalance = 0; + insideComponentTag = false; super.reset(); } - /** - * eager check to see if the character position in a line is at the start - * - * @return - */ - public boolean IsNewLineOrStart() { - return this._tokenStartCharPositionInLine <= 2; - } - - public boolean peekNextChar(char peekChar) { - return (char) this._input.LA(1) == peekChar; - } - - public boolean peekNextChars(char peekChar, int number) { - for (int i = 1; i < number; i++) { - if ((char) this._input.LA(i) != peekChar) { - return false; - } - } - return true; - } - - public void increaseRoundParenBalance() { - this.roundParenBalance++; - } - - - public void decreaseRoundParenBalance() { - this.roundParenBalance--; - } - - public void resetRoundParenBalance() { - this.roundParenBalance = 0; - } - - public boolean endsWith(char ch1, char ch2) { - return this._input.LA(1) == ch1 && this._input.LA(2) == ch2; - } - - public boolean endsWith(char ch1, char ch2, char ch3) { - return this._input.LA(1) == ch1 - && this._input.LA(2) == ch2 - && this._input.LA(3) == ch3; - } - //blade coloring lexer public void consumeEscapedEchoToken() { if (this._input.LA(1) == '}' && this._input.LA(2) == '}') { @@ -120,37 +76,5 @@ public void consumeNotEscapedEchoToken() { this.more(); } } - - public void consumeExprToken() { - if (this._input.LA(1) == ')' && this.getRoundParenBalance() <= 1) { - this.setType(BladeAntlrColoringLexer.PHP_EXPRESSION); - } else { - this.more(); - } - } - - public void consumeOpenParen() { - this.increaseRoundParenBalance(); - if (this.roundParenBalance == 1) { - this.setType(BladeAntlrColoringLexer.BLADE_PAREN); - } else { - this.more(); - } - } - - public void consumeCloseParen() { - this.decreaseRoundParenBalance(); - if (this.roundParenBalance <= 0) { - this.resetRoundParenBalance(); - this.setType(BladeAntlrColoringLexer.BLADE_PAREN); - this.mode(DEFAULT_MODE); - } else { - if (this._input.LA(1) == ')' && this.roundParenBalance == 1) { - this.setType(BladeAntlrColoringLexer.PHP_EXPRESSION); - } else { - this.more(); - } - } - } } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java index c934f9641396..6c8c96cdf73d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/ui/options/BladeOptionsPanelController.java @@ -33,7 +33,8 @@ ) public class BladeOptionsPanelController extends OptionsPanelController { - static final String ID = "Blade"; // NOI18N + public static final String ID = "Blade"; // NOI18N + public static final String CONTEXT_HELP_ID = "org.netbeans.modules.php.blade.editor.Options"; //NOI18N public static final String OPTIONS_SUBPATH = UiUtils.FRAMEWORKS_AND_TOOLS_SUB_PATH + "/" + ID; // NOI18N private BladeOptionsPanel panel; @@ -66,7 +67,7 @@ public boolean isChanged() { @Override public HelpCtx getHelpCtx() { - return new HelpCtx("org.netbeans.modules.php.blade.editor.Options"); //NOI18N + return new HelpCtx(CONTEXT_HELP_ID); //NOI18N } @Override @@ -90,8 +91,4 @@ private BladeOptionsPanel getPanel() { } return panel; } - - public static String getOptionsPath() { - return UiUtils.OPTIONS_PATH + "/" + OPTIONS_SUBPATH; // NOI18N - } } diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass index 5e37b1080811..769fda668f05 100644 --- a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/css_at_rules.pass @@ -1,65 +1,5 @@ -Token #0 HTML [\n] +Token #0 HTML [\n] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_directive.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_directive.pass index 99fb032c25e1..c913c061807b 100644 --- a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_directive.pass +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_directive.pass @@ -1,3 +1 @@ -Token #0 HTML [
      \n ] -Token #1 HTML [@@] -Token #2 HTML [escapedDirective\n
      \n] +Token #0 HTML [
      \n @@escapedDirective\n
      \n] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_tag.pass index 7f4a5b6cfc2c..30a35249205c 100644 --- a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_tag.pass +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/escaped_tag.pass @@ -1,6 +1 @@ -Token #0 HTML [

      Laravel

      \n \nHello, ] -Token #1 HTML [@{{] -Token #2 HTML [ name ] -Token #3 HTML [}] -Token #4 HTML [}] -Token #5 HTML [.\n] +Token #0 HTML [

      Laravel

      \n \nHello, @{{ name }}.\n] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/html_javascript_01.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/html_javascript_01.pass index 055e4f470e6a..2eb0f1cecc6a 100644 --- a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/html_javascript_01.pass +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/editor/lexer/BladeLexerTest/html_javascript_01.pass @@ -3,14 +3,6 @@ Token #1 BLADE_DIRECTIVE [@can] Token #2 BLADE_PAREN [(] Token #3 PHP_BLADE_EXPRESSION ['test'] Token #4 BLADE_PAREN [)] -Token #5 HTML [*/\nconsole.log(] -Token #6 HTML ['] -Token #7 HTML [test] -Token #8 HTML ['] -Token #9 HTML [);\n/*] -Token #10 BLADE_DIRECTIVE [@endcan] -Token #11 HTML [*/\nconsole.log(] -Token #12 HTML ['] -Token #13 HTML [test2] -Token #14 HTML ['] -Token #15 HTML [);\n\n] +Token #5 HTML [*/\nconsole.log('test');\n/*] +Token #6 BLADE_DIRECTIVE [@endcan] +Token #7 HTML [*/\nconsole.log('test2');\n\n] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/content_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/content_tag.pass index 332f302adeb9..7879af7ecdb0 100644 --- a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/content_tag.pass +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/content_tag.pass @@ -1,6 +1,9 @@ -Token #7 HTML [[@0,0:6='Hello, ',<7>,1:0]] -Token #6 CONTENT_TAG [[@1,7:8='{{',<6>,1:7]] -Token #4 BLADE_PHP_ECHO_EXPR [[@2,9:15=' $name ',<4>,1:9]] -Token #6 CONTENT_TAG [[@3,16:17='}}',<6>,1:16]] -Token #7 HTML [[@4,18:19='.\n',<7>,1:18]] -Token #-1 EOF [[@5,20:19='',<-1>,2:0]] +Token #8 HTML [[@0,0:4='Hello',<8>,1:0]] +Token #8 HTML [[@1,5:5=',',<8>,1:5]] +Token #8 HTML [[@2,6:6=' ',<8>,1:6]] +Token #7 CONTENT_TAG [[@3,7:8='{{',<7>,1:7]] +Token #4 BLADE_PHP_ECHO_EXPR [[@4,9:15=' $name ',<4>,1:9]] +Token #7 CONTENT_TAG [[@5,16:17='}}',<7>,1:16]] +Token #8 HTML [[@6,18:18='.',<8>,1:18]] +Token #8 HTML [[@7,19:19='\n',<8>,1:19]] +Token #-1 EOF [[@8,20:19='',<-1>,2:0]] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/escaped_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/escaped_tag.pass index 6d7baaa77fde..c22cc486ba41 100644 --- a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/escaped_tag.pass +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/escaped_tag.pass @@ -1,7 +1,17 @@ -Token #8 HTML_TAG [[@0,0:25='

      Laravel

      \n \nHello, ',<8>,1:0]] -Token #7 HTML [[@1,26:28='@{{',<7>,3:7]] -Token #7 HTML [[@2,29:34=' name ',<7>,3:10]] -Token #7 HTML [[@3,35:35='}',<7>,3:16]] -Token #7 HTML [[@4,36:36='}',<7>,3:17]] -Token #7 HTML [[@5,37:38='.\n',<7>,3:18]] -Token #-1 EOF [[@6,39:38='',<-1>,4:0]] +Token #8 HTML [[@0,0:0='<',<8>,1:0]] +Token #8 HTML [[@1,1:2='h1',<8>,1:1]] +Token #8 HTML [[@2,3:3='>',<8>,1:3]] +Token #8 HTML [[@3,4:10='Laravel',<8>,1:4]] +Token #8 HTML [[@4,11:18='\n \n',<8>,1:11]] +Token #8 HTML [[@5,19:23='Hello',<8>,3:0]] +Token #8 HTML [[@6,24:24=',',<8>,3:5]] +Token #8 HTML [[@7,25:25=' ',<8>,3:6]] +Token #8 HTML [[@8,26:28='@{{',<8>,3:7]] +Token #8 HTML [[@9,29:29=' ',<8>,3:10]] +Token #8 HTML [[@10,30:33='name',<8>,3:11]] +Token #8 HTML [[@11,34:34=' ',<8>,3:15]] +Token #8 HTML [[@12,35:35='}',<8>,3:16]] +Token #8 HTML [[@13,36:36='}',<8>,3:17]] +Token #8 HTML [[@14,37:37='.',<8>,3:18]] +Token #8 HTML [[@15,38:38='\n',<8>,3:19]] +Token #-1 EOF [[@16,39:38='',<-1>,4:0]] diff --git a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/raw_tag.pass b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/raw_tag.pass index f67a19437698..c90b47dcdb2d 100644 --- a/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/raw_tag.pass +++ b/php/php.blade/test/unit/data/goldenfiles/org/netbeans/modules/php/blade/syntax/antlr4/v10/AntlrColoringLexerTest/lexer/blade/raw_tag.pass @@ -1,6 +1,9 @@ -Token #7 HTML [[@0,0:6='Hello, ',<7>,1:0]] -Token #5 RAW_TAG [[@1,7:9='{!!',<5>,1:7]] -Token #4 BLADE_PHP_ECHO_EXPR [[@2,10:16=' $name ',<4>,1:10]] -Token #5 RAW_TAG [[@3,17:19='!!}',<5>,1:17]] -Token #7 HTML [[@4,20:21='.\n',<7>,1:20]] -Token #-1 EOF [[@5,22:21='',<-1>,2:0]] +Token #8 HTML [[@0,0:4='Hello',<8>,1:0]] +Token #8 HTML [[@1,5:5=',',<8>,1:5]] +Token #8 HTML [[@2,6:6=' ',<8>,1:6]] +Token #6 RAW_TAG [[@3,7:9='{!!',<6>,1:7]] +Token #4 BLADE_PHP_ECHO_EXPR [[@4,10:16=' $name ',<4>,1:10]] +Token #6 RAW_TAG [[@5,17:19='!!}',<6>,1:17]] +Token #8 HTML [[@6,20:20='.',<8>,1:20]] +Token #8 HTML [[@7,21:21='\n',<8>,1:21]] +Token #-1 EOF [[@8,22:21='',<-1>,2:0]] diff --git a/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_directive_bracket_error_01.blade.php.errors b/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_directive_bracket_error_01.blade.php.errors index 53553cdb60f2..e69de29bb2d1 100644 --- a/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_directive_bracket_error_01.blade.php.errors +++ b/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_directive_bracket_error_01.blade.php.errors @@ -1 +0,0 @@ -[[9,9]-extraneous input ')' expecting {PHP_VARIABLE, PHP_KEYWORD, BLADE_PARAM_EXTRA, BL_SQ_LPAREN, BL_PARAM_STRING, BL_PARAM_ASSIGN, BL_PARAM_COMMA, BL_SQ_RPAREN, '.', BL_NAME_STRING}] 9-9:extraneous input ')' expecting {PHP_VARIABLE, PHP_KEYWORD, BLADE_PARAM_EXTRA, BL_SQ_LPAREN, BL_PARAM_STRING, BL_PARAM_ASSIGN, BL_PARAM_COMMA, BL_SQ_RPAREN, '.', BL_NAME_STRING} diff --git a/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_section_error_01.blade.php.errors b/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_section_error_01.blade.php.errors index e0f95cb5ef61..17dc2a857e17 100644 --- a/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_section_error_01.blade.php.errors +++ b/php/php.blade/test/unit/data/testfiles/parser/unopend/unclosed_section_error_01.blade.php.errors @@ -1 +1 @@ -[[13,13]-mismatched input '' expecting {HTML, '@if', '@else', '@switch', '@case', '@default', '@empty', D_COND_BLOCK_START, '@foreach', '@for', '@forelse', '@while', '@break', D_LOOP_ACTION, '@include', '@includeIf', '@includeWhen', '@includeFirst', '@includeUnless', '@each', '@extends', '@js', '@json', '@section', '@hasSection', '@sectionMissing', '@endsection', '@yield', '@parent', '@show', '@overwrite', '@stop', '@append', '@once', '@stack', '@push', '@pushIf', '@prepend', '@props', '@fragment', '@csrf', '@method', '@error', '@production', '@env', D_AUTH_START, D_PERMISSION_START, D_PERMISSION_ELSE, '@class', '@style', D_HTML_ATTR_EXPR, '@aware', '@bool', '@when', '@session', D_DD, '@lang', '@use', '@inject', D_PHP, '@verbatim', D_LIVEWIRE, '@vite', '@viteReactRefresh', D_CUSTOM, D_UNKNOWN_ATTR_ENC, D_UNKNOWN, '{{', '{!!', PHP_INLINE_START, HTML_COMPONENT_PREFIX, HTML_TAG_START, HTML_IDENTIFIER, '='}] 13-13:mismatched input '' expecting {HTML, '@if', '@else', '@switch', '@case', '@default', '@empty', D_COND_BLOCK_START, '@foreach', '@for', '@forelse', '@while', '@break', D_LOOP_ACTION, '@include', '@includeIf', '@includeWhen', '@includeFirst', '@includeUnless', '@each', '@extends', '@js', '@json', '@section', '@hasSection', '@sectionMissing', '@endsection', '@yield', '@parent', '@show', '@overwrite', '@stop', '@append', '@once', '@stack', '@push', '@pushIf', '@prepend', '@props', '@fragment', '@csrf', '@method', '@error', '@production', '@env', D_AUTH_START, D_PERMISSION_START, D_PERMISSION_ELSE, '@class', '@style', D_HTML_ATTR_EXPR, '@aware', '@bool', '@when', '@session', D_DD, '@lang', '@use', '@inject', D_PHP, '@verbatim', D_LIVEWIRE, '@vite', '@viteReactRefresh', D_CUSTOM, D_UNKNOWN_ATTR_ENC, D_UNKNOWN, '{{', '{!!', PHP_INLINE_START, HTML_COMPONENT_PREFIX, HTML_TAG_START, HTML_IDENTIFIER, '='} +13-13:Inline @section requires second argument diff --git a/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors b/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors index 71bf68737896..a20b4a3f2c18 100644 --- a/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors +++ b/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors @@ -1 +1 @@ -[[15,15]-extraneous input '@endif' expecting {, HTML, '@if', '@else', '@switch', '@case', '@default', '@empty', D_COND_BLOCK_START, '@foreach', '@for', '@forelse', '@while', '@break', D_LOOP_ACTION, '@include', '@includeIf', '@includeWhen', '@includeFirst', '@includeUnless', '@each', '@extends', '@js', '@json', '@section', '@hasSection', '@sectionMissing', '@yield', '@once', '@stack', '@push', '@pushIf', '@prepend', '@props', '@fragment', '@csrf', '@method', '@error', '@production', '@env', D_AUTH_START, D_PERMISSION_START, D_PERMISSION_ELSE, '@class', '@style', D_HTML_ATTR_EXPR, '@aware', '@bool', '@when', '@session', D_DD, '@lang', '@use', '@inject', D_PHP, '@verbatim', D_LIVEWIRE, '@vite', '@viteReactRefresh', D_CUSTOM, D_UNKNOWN_ATTR_ENC, D_UNKNOWN, '{{', '{!!', PHP_INLINE_START, HTML_COMPONENT_PREFIX, HTML_TAG_START, HTML_IDENTIFIER, '='}] 15-15:extraneous input '@endif' expecting {, HTML, '@if', '@else', '@switch', '@case', '@default', '@empty', D_COND_BLOCK_START, '@foreach', '@for', '@forelse', '@while', '@break', D_LOOP_ACTION, '@include', '@includeIf', '@includeWhen', '@includeFirst', '@includeUnless', '@each', '@extends', '@js', '@json', '@section', '@hasSection', '@sectionMissing', '@yield', '@once', '@stack', '@push', '@pushIf', '@prepend', '@props', '@fragment', '@csrf', '@method', '@error', '@production', '@env', D_AUTH_START, D_PERMISSION_START, D_PERMISSION_ELSE, '@class', '@style', D_HTML_ATTR_EXPR, '@aware', '@bool', '@when', '@session', D_DD, '@lang', '@use', '@inject', D_PHP, '@verbatim', D_LIVEWIRE, '@vite', '@viteReactRefresh', D_CUSTOM, D_UNKNOWN_ATTR_ENC, D_UNKNOWN, '{{', '{!!', PHP_INLINE_START, HTML_COMPONENT_PREFIX, HTML_TAG_START, HTML_IDENTIFIER, '='} +15-15:extraneous input '@endif' expecting {, D_CUSTOM, D_DIRECTIVE, '}}', D_PHP, D_IF, '@else', D_UNLESS, D_ISSET, D_SWITCH, D_EXTENDS, D_INCLUDE, D_INCLUDE_IF, D_INCLUDE_WHEN, D_INCLUDE_UNLESS, D_INCLUDE_FIRST, D_EACH, D_YIELD, D_SECTION, D_HAS_SECTION, D_SECTION_MISSING, '@once', D_STACK, D_PUSH, D_PUSH_IF, D_PUSH_ONCE, D_PREPEND, D_FOREACH, D_FOR, D_FORELSE, D_WHILE, D_EMPTY, '@verbatim', D_SESSION, '@csrf', D_METHOD, D_ERROR, D_AUTH, D_GUEST, D_ENV, '@production', D_CAN, D_CANNOT, D_CANANY, D_FRAGMENT, D_SIMPLE_DIRECTIVE, D_VITE, '@viteReactRefresh', '@lang', D_INJECT, '@use', '{{', '{!!', '!!}', D_ENDCUSTOM, PHP_INLINE_START, HTML_COMPONENT_OPEN_TAG} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypinghooksTestBase.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypinghooksTestBase.java index 58de4fc48a5f..6327d8515697 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypinghooksTestBase.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/typinghooks/BladeTypinghooksTestBase.java @@ -19,17 +19,32 @@ package org.netbeans.modules.php.blade.editor.typinghooks; import org.netbeans.modules.php.blade.editor.BladeTestBase; +import static org.netbeans.modules.php.blade.editor.preferences.GeneralPreferencesUtils.ENABLE_AUTO_TAG_COMPLETION; +import org.netbeans.modules.php.blade.editor.preferences.ModulePreferences; public abstract class BladeTypinghooksTestBase extends BladeTestBase { - + private boolean autoTagCompletion = false; public BladeTypinghooksTestBase(String testName) { super(testName); } + + @Override + protected void setUp() throws Exception { + super.setUp(); + autoTagCompletion = ModulePreferences.getPreferences().getBoolean(ENABLE_AUTO_TAG_COMPLETION, false); + ModulePreferences.setPrefBoolean(ENABLE_AUTO_TAG_COMPLETION, true); + } @Override protected boolean runInEQ() { return true; } + @Override + protected void tearDown() throws Exception { + super.tearDown(); + ModulePreferences.setPrefBoolean(ENABLE_AUTO_TAG_COMPLETION, autoTagCompletion); + } + } diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.g4 b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.g4 deleted file mode 100644 index caad2db208d1..000000000000 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.g4 +++ /dev/null @@ -1,73 +0,0 @@ -lexer grammar BladePhpAntlrLexer; -import BladePhpCommonLexer; - -@header{ - package org.netbeans.modules.php.blade.syntax.antlr4.php; -} - -@lexer::members { - int rparenBalance = 0; - int sqparenBalance = 0; - int curlyparenBalance = 0; -} - -options { - superClass = LexerAdaptor; - caseInsensitive = true; -} - -LINE_COMMENT : LineComment->skip; - -ARRAY : 'array'; -AS : 'as'; -ECHO : 'echo'; -IF : 'if'; -ELSEIF : 'elseif' | 'else if'; -ELSE : 'else'; -NEW : 'new'; -CLASS : 'class'; -FUNCTION : 'function'; -LANG_CONSTRUCT : 'empty' | 'isset'; -MATCH : 'match'; -FOREACH : 'foreach'; - -COMMA : ',' ; - -LPAREN : '('; -RPAREN : ')'; - -LSQUAREBRACKET: '['; -RSQUAREBRACKET: ']'; - -LCURLYBRACE: '{'; -RCURLYBRACE: '}'; - -IDENTIFIER : Identifier; - -PHP_VARIABLE : PhpVariable; - -DOLLAR : '$'; - -NAMESPACE_SEPARATOR : '\\'; -DOUBLE_COLON : '::'; -ARROW : '=>'; -OBJECT_OPERATOR : '->'; - -SEMI_COLON : ';'; - -COMPARISON_OPERATOR : ('==' | '!=' | '>' | '<') '='?; - -LOGICAL_UNION_OPERATOR : '&&' | '||'; - -STRING_LITERAL : StringLiteral; - - -STYLE_COMMENT : '/*' .*? '*/' [\n\r]*->skip; - -WS : ((' ')+ | [\r\n]+)->skip; - -//testing purpose -PHP_DIRECTIVE : ('@php' | '@endphp')->skip; - -OTHER : . ->skip; - diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.java deleted file mode 100644 index e4d981210318..000000000000 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.java +++ /dev/null @@ -1,629 +0,0 @@ -// Generated from BladePhpAntlrLexer.g4 by ANTLR 4.13.0 - - package org.netbeans.modules.php.blade.syntax.antlr4.php; - -import org.antlr.v4.runtime.Lexer; -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.TokenStream; -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.atn.*; -import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.misc.*; - -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) -public class BladePhpAntlrLexer extends LexerAdaptor { - static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } - - protected static final DFA[] _decisionToDFA; - protected static final PredictionContextCache _sharedContextCache = - new PredictionContextCache(); - public static final int - HTML=1, BLADE_COMMENT=2, LINE_COMMENT=3, ARRAY=4, AS=5, ECHO=6, IF=7, - ELSEIF=8, ELSE=9, NEW=10, CLASS=11, FUNCTION=12, LANG_CONSTRUCT=13, MATCH=14, - FOREACH=15, COMMA=16, LPAREN=17, RPAREN=18, LSQUAREBRACKET=19, RSQUAREBRACKET=20, - LCURLYBRACE=21, RCURLYBRACE=22, IDENTIFIER=23, PHP_VARIABLE=24, DOLLAR=25, - NAMESPACE_SEPARATOR=26, DOUBLE_COLON=27, ARROW=28, OBJECT_OPERATOR=29, - SEMI_COLON=30, COMPARISON_OPERATOR=31, LOGICAL_UNION_OPERATOR=32, STRING_LITERAL=33, - STYLE_COMMENT=34, WS=35, PHP_DIRECTIVE=36, OTHER=37, BLADE_COMMENT_START=38, - EMAIL_SUBSTRING=39, VERSION_WITH_AT=40, BLADE_COMMENT_END=41, BLADE_COMMENT_PEEK=42, - BLADE_COMMENT_MORE=43, BLADE_COMMENT_EOF=44; - public static final int - INSIDE_BLADE_COMMENT=1; - public static String[] channelNames = { - "DEFAULT_TOKEN_CHANNEL", "HIDDEN" - }; - - public static String[] modeNames = { - "DEFAULT_MODE", "INSIDE_BLADE_COMMENT" - }; - - private static String[] makeRuleNames() { - return new String[] { - "LINE_COMMENT", "ARRAY", "AS", "ECHO", "IF", "ELSEIF", "ELSE", "NEW", - "CLASS", "FUNCTION", "LANG_CONSTRUCT", "MATCH", "FOREACH", "COMMA", "LPAREN", - "RPAREN", "LSQUAREBRACKET", "RSQUAREBRACKET", "LCURLYBRACE", "RCURLYBRACE", - "IDENTIFIER", "PHP_VARIABLE", "DOLLAR", "NAMESPACE_SEPARATOR", "DOUBLE_COLON", - "ARROW", "OBJECT_OPERATOR", "SEMI_COLON", "COMPARISON_OPERATOR", "LOGICAL_UNION_OPERATOR", - "STRING_LITERAL", "STYLE_COMMENT", "WS", "PHP_DIRECTIVE", "OTHER", "Identifier", - "HtmlIdentifier", "ESC_DOUBLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING_FRAGMENT", - "SINGLE_QUOTED_STRING_FRAGMENT", "StringLiteral", "LineComment", "PhpVariable", - "Digit", "BLADE_COMMENT_START", "EMAIL_SUBSTRING", "VERSION_WITH_AT", - "D_ESCAPES", "BLADE_COMMENT_END", "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", - "BLADE_COMMENT_EOF" - }; - } - public static final String[] ruleNames = makeRuleNames(); - - private static String[] makeLiteralNames() { - return new String[] { - null, null, null, null, "'array'", "'as'", "'echo'", "'if'", null, "'else'", - "'new'", "'class'", "'function'", null, "'match'", "'foreach'", "','", - "'('", "')'", "'['", "']'", "'{'", "'}'", null, null, "'$'", "'\\'", - "'::'", "'=>'", "'->'", "';'", null, null, null, null, null, null, null, - "'{{--'", null, null, "'--}}'" - }; - } - private static final String[] _LITERAL_NAMES = makeLiteralNames(); - private static String[] makeSymbolicNames() { - return new String[] { - null, "HTML", "BLADE_COMMENT", "LINE_COMMENT", "ARRAY", "AS", "ECHO", - "IF", "ELSEIF", "ELSE", "NEW", "CLASS", "FUNCTION", "LANG_CONSTRUCT", - "MATCH", "FOREACH", "COMMA", "LPAREN", "RPAREN", "LSQUAREBRACKET", "RSQUAREBRACKET", - "LCURLYBRACE", "RCURLYBRACE", "IDENTIFIER", "PHP_VARIABLE", "DOLLAR", - "NAMESPACE_SEPARATOR", "DOUBLE_COLON", "ARROW", "OBJECT_OPERATOR", "SEMI_COLON", - "COMPARISON_OPERATOR", "LOGICAL_UNION_OPERATOR", "STRING_LITERAL", "STYLE_COMMENT", - "WS", "PHP_DIRECTIVE", "OTHER", "BLADE_COMMENT_START", "EMAIL_SUBSTRING", - "VERSION_WITH_AT", "BLADE_COMMENT_END", "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", - "BLADE_COMMENT_EOF" - }; - } - private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); - public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); - - /** - * @deprecated Use {@link #VOCABULARY} instead. - */ - @Deprecated - public static final String[] tokenNames; - static { - tokenNames = new String[_SYMBOLIC_NAMES.length]; - for (int i = 0; i < tokenNames.length; i++) { - tokenNames[i] = VOCABULARY.getLiteralName(i); - if (tokenNames[i] == null) { - tokenNames[i] = VOCABULARY.getSymbolicName(i); - } - - if (tokenNames[i] == null) { - tokenNames[i] = ""; - } - } - } - - @Override - @Deprecated - public String[] getTokenNames() { - return tokenNames; - } - - @Override - - public Vocabulary getVocabulary() { - return VOCABULARY; - } - - - int rparenBalance = 0; - int sqparenBalance = 0; - int curlyparenBalance = 0; - - - public BladePhpAntlrLexer(CharStream input) { - super(input); - _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); - } - - @Override - public String getGrammarFileName() { return "BladePhpAntlrLexer.g4"; } - - @Override - public String[] getRuleNames() { return ruleNames; } - - @Override - public String getSerializedATN() { return _serializedATN; } - - @Override - public String[] getChannelNames() { return channelNames; } - - @Override - public String[] getModeNames() { return modeNames; } - - @Override - public ATN getATN() { return _ATN; } - - @Override - public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { - switch (ruleIndex) { - case 49: - return BLADE_COMMENT_PEEK_sempred((RuleContext)_localctx, predIndex); - } - return true; - } - private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 0: - return - this._input.LA(1) == '-' && - this._input.LA(2) == '-' && - this._input.LA(3) == '}' && - this._input.LA(4) == '}' - ; - } - return true; - } - - public static final String _serializedATN = - "\u0004\u0000,\u02c7\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000\u0007"+ - "\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007"+ - "\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007"+ - "\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n"+ - "\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002"+ - "\u000e\u0007\u000e\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002"+ - "\u0011\u0007\u0011\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002"+ - "\u0014\u0007\u0014\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002"+ - "\u0017\u0007\u0017\u0002\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002"+ - "\u001a\u0007\u001a\u0002\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002"+ - "\u001d\u0007\u001d\u0002\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002"+ - " \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002"+ - "%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002"+ - "*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002"+ - "/\u0007/\u00020\u00070\u00021\u00071\u00022\u00072\u00023\u00073\u0001"+ - "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001"+ - "\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ - "\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u008d\b\u0005\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001"+ - "\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b"+ - "\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ - "\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0003\n\u00b1\b\n\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001"+ - "\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001"+ - "\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001"+ - "\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ - "\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001c\u0001"+ - "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0003\u001c\u00e7\b\u001c\u0001"+ - "\u001c\u0003\u001c\u00ea\b\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001"+ - "\u001d\u0003\u001d\u00f0\b\u001d\u0001\u001e\u0001\u001e\u0001\u001f\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0005\u001f\u00f8\b\u001f\n\u001f\f\u001f"+ - "\u00fb\t\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0005\u001f"+ - "\u0101\b\u001f\n\u001f\f\u001f\u0104\t\u001f\u0001\u001f\u0001\u001f\u0001"+ - " \u0004 \u0109\b \u000b \f \u010a\u0001 \u0004 \u010e\b \u000b \f \u010f"+ - "\u0003 \u0112\b \u0001 \u0001 \u0001!\u0001!\u0001!\u0001!\u0001!\u0001"+ - "!\u0001!\u0001!\u0001!\u0001!\u0001!\u0003!\u0121\b!\u0001!\u0001!\u0001"+ - "\"\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0005#\u012b\b#\n#\f#\u012e\t"+ - "#\u0001$\u0001$\u0005$\u0132\b$\n$\f$\u0135\t$\u0001%\u0001%\u0001&\u0001"+ - "&\u0001&\u0005&\u013c\b&\n&\f&\u013f\t&\u0001&\u0001&\u0001\'\u0001\'"+ - "\u0001\'\u0001\'\u0005\'\u0147\b\'\n\'\f\'\u014a\t\'\u0001\'\u0001\'\u0001"+ - "(\u0001(\u0003(\u0150\b(\u0001)\u0001)\u0001)\u0001)\u0005)\u0156\b)\n"+ - ")\f)\u0159\t)\u0001*\u0001*\u0001*\u0001+\u0001+\u0001,\u0001,\u0001,"+ - "\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001.\u0001.\u0001.\u0003.\u0171\b.\u0004.\u0173\b.\u000b.\f"+ - ".\u0174\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0003/\u0180\b/\u0001/\u0001/\u0001/\u0001/\u0003/\u0186\b/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0004/\u0190\b/\u000b/\f/"+ - "\u0191\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0004/"+ - "\u019c\b/\u000b/\f/\u019d\u0001/\u0001/\u0001/\u0003/\u01a3\b/\u0003/"+ - "\u01a5\b/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0003/\u02a6\b/\u0001/\u0005"+ - "/\u02a9\b/\n/\f/\u02ac\t/\u0003/\u02ae\b/\u0001/\u0001/\u00010\u00010"+ - "\u00010\u00010\u00010\u00010\u00010\u00010\u00011\u00011\u00011\u0001"+ - "1\u00011\u00012\u00012\u00012\u00012\u00013\u00013\u00013\u00013\u0001"+ - "3\u0002\u00f9\u013d\u00004\u0002\u0003\u0004\u0004\u0006\u0005\b\u0006"+ - "\n\u0007\f\b\u000e\t\u0010\n\u0012\u000b\u0014\f\u0016\r\u0018\u000e\u001a"+ - "\u000f\u001c\u0010\u001e\u0011 \u0012\"\u0013$\u0014&\u0015(\u0016*\u0017"+ - ",\u0018.\u00190\u001a2\u001b4\u001c6\u001d8\u001e:\u001f< >!@\"B#D$F%"+ - "H\u0000J\u0000L\u0000N\u0000P\u0000R\u0000T\u0000V\u0000X\u0000Z&\\\'"+ - "^(`\u0000b)d*f+h,\u0002\u0000\u0001\u001e\u0002\u0000AAaa\u0002\u0000"+ - "RRrr\u0002\u0000YYyy\u0002\u0000SSss\u0002\u0000EEee\u0002\u0000CCcc\u0002"+ - "\u0000HHhh\u0002\u0000OOoo\u0002\u0000IIii\u0002\u0000FFff\u0002\u0000"+ - "LLll\u0002\u0000NNnn\u0002\u0000WWww\u0002\u0000UUuu\u0002\u0000TTtt\u0002"+ - "\u0000MMmm\u0002\u0000PPpp\u0002\u0000<<>>\u0002\u0000\n\n\r\r\u0002\u0000"+ - "DDdd\u0004\u0000AZ__az\u0080\u8000\ufffe\u0005\u000009AZ__az\u0080\u8000"+ - "\ufffe\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002\u0000\"\"\\\\\u0002"+ - "\u0000\'\'\\\\\u0001\u0000 \u0002\u0000GGgg\u0002\u0000BBbb\u0002\u0000"+ - "KKkk\u0002\u0000VVvv\u02f4\u0000\u0002\u0001\u0000\u0000\u0000\u0000\u0004"+ - "\u0001\u0000\u0000\u0000\u0000\u0006\u0001\u0000\u0000\u0000\u0000\b\u0001"+ - "\u0000\u0000\u0000\u0000\n\u0001\u0000\u0000\u0000\u0000\f\u0001\u0000"+ - "\u0000\u0000\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0010\u0001\u0000"+ - "\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000\u0000\u0014\u0001\u0000"+ - "\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000"+ - "\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000"+ - "\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000"+ - "\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000"+ - "\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*"+ - "\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000"+ - "\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000"+ - "\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008"+ - "\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000"+ - "\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000"+ - "\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F"+ - "\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000\\\u0001"+ - "\u0000\u0000\u0000\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001\u0000\u0000"+ - "\u0000\u0001b\u0001\u0000\u0000\u0000\u0001d\u0001\u0000\u0000\u0000\u0001"+ - "f\u0001\u0000\u0000\u0000\u0001h\u0001\u0000\u0000\u0000\u0002j\u0001"+ - "\u0000\u0000\u0000\u0004n\u0001\u0000\u0000\u0000\u0006t\u0001\u0000\u0000"+ - "\u0000\bw\u0001\u0000\u0000\u0000\n|\u0001\u0000\u0000\u0000\f\u008c\u0001"+ - "\u0000\u0000\u0000\u000e\u008e\u0001\u0000\u0000\u0000\u0010\u0093\u0001"+ - "\u0000\u0000\u0000\u0012\u0097\u0001\u0000\u0000\u0000\u0014\u009d\u0001"+ - "\u0000\u0000\u0000\u0016\u00b0\u0001\u0000\u0000\u0000\u0018\u00b2\u0001"+ - "\u0000\u0000\u0000\u001a\u00b8\u0001\u0000\u0000\u0000\u001c\u00c0\u0001"+ - "\u0000\u0000\u0000\u001e\u00c2\u0001\u0000\u0000\u0000 \u00c4\u0001\u0000"+ - "\u0000\u0000\"\u00c6\u0001\u0000\u0000\u0000$\u00c8\u0001\u0000\u0000"+ - "\u0000&\u00ca\u0001\u0000\u0000\u0000(\u00cc\u0001\u0000\u0000\u0000*"+ - "\u00ce\u0001\u0000\u0000\u0000,\u00d0\u0001\u0000\u0000\u0000.\u00d2\u0001"+ - "\u0000\u0000\u00000\u00d4\u0001\u0000\u0000\u00002\u00d6\u0001\u0000\u0000"+ - "\u00004\u00d9\u0001\u0000\u0000\u00006\u00dc\u0001\u0000\u0000\u00008"+ - "\u00df\u0001\u0000\u0000\u0000:\u00e6\u0001\u0000\u0000\u0000<\u00ef\u0001"+ - "\u0000\u0000\u0000>\u00f1\u0001\u0000\u0000\u0000@\u00f3\u0001\u0000\u0000"+ - "\u0000B\u0111\u0001\u0000\u0000\u0000D\u0120\u0001\u0000\u0000\u0000F"+ - "\u0124\u0001\u0000\u0000\u0000H\u0128\u0001\u0000\u0000\u0000J\u012f\u0001"+ - "\u0000\u0000\u0000L\u0136\u0001\u0000\u0000\u0000N\u0138\u0001\u0000\u0000"+ - "\u0000P\u0142\u0001\u0000\u0000\u0000R\u014f\u0001\u0000\u0000\u0000T"+ - "\u0151\u0001\u0000\u0000\u0000V\u015a\u0001\u0000\u0000\u0000X\u015d\u0001"+ - "\u0000\u0000\u0000Z\u015f\u0001\u0000\u0000\u0000\\\u0167\u0001\u0000"+ - "\u0000\u0000^\u016d\u0001\u0000\u0000\u0000`\u02ad\u0001\u0000\u0000\u0000"+ - "b\u02b1\u0001\u0000\u0000\u0000d\u02b9\u0001\u0000\u0000\u0000f\u02be"+ - "\u0001\u0000\u0000\u0000h\u02c2\u0001\u0000\u0000\u0000jk\u0003T)\u0000"+ - "kl\u0001\u0000\u0000\u0000lm\u0006\u0000\u0000\u0000m\u0003\u0001\u0000"+ - "\u0000\u0000no\u0007\u0000\u0000\u0000op\u0007\u0001\u0000\u0000pq\u0007"+ - "\u0001\u0000\u0000qr\u0007\u0000\u0000\u0000rs\u0007\u0002\u0000\u0000"+ - "s\u0005\u0001\u0000\u0000\u0000tu\u0007\u0000\u0000\u0000uv\u0007\u0003"+ - "\u0000\u0000v\u0007\u0001\u0000\u0000\u0000wx\u0007\u0004\u0000\u0000"+ - "xy\u0007\u0005\u0000\u0000yz\u0007\u0006\u0000\u0000z{\u0007\u0007\u0000"+ - "\u0000{\t\u0001\u0000\u0000\u0000|}\u0007\b\u0000\u0000}~\u0007\t\u0000"+ - "\u0000~\u000b\u0001\u0000\u0000\u0000\u007f\u0080\u0007\u0004\u0000\u0000"+ - "\u0080\u0081\u0007\n\u0000\u0000\u0081\u0082\u0007\u0003\u0000\u0000\u0082"+ - "\u0083\u0007\u0004\u0000\u0000\u0083\u0084\u0007\b\u0000\u0000\u0084\u008d"+ - "\u0007\t\u0000\u0000\u0085\u0086\u0007\u0004\u0000\u0000\u0086\u0087\u0007"+ - "\n\u0000\u0000\u0087\u0088\u0007\u0003\u0000\u0000\u0088\u0089\u0007\u0004"+ - "\u0000\u0000\u0089\u008a\u0005 \u0000\u0000\u008a\u008b\u0007\b\u0000"+ - "\u0000\u008b\u008d\u0007\t\u0000\u0000\u008c\u007f\u0001\u0000\u0000\u0000"+ - "\u008c\u0085\u0001\u0000\u0000\u0000\u008d\r\u0001\u0000\u0000\u0000\u008e"+ - "\u008f\u0007\u0004\u0000\u0000\u008f\u0090\u0007\n\u0000\u0000\u0090\u0091"+ - "\u0007\u0003\u0000\u0000\u0091\u0092\u0007\u0004\u0000\u0000\u0092\u000f"+ - "\u0001\u0000\u0000\u0000\u0093\u0094\u0007\u000b\u0000\u0000\u0094\u0095"+ - "\u0007\u0004\u0000\u0000\u0095\u0096\u0007\f\u0000\u0000\u0096\u0011\u0001"+ - "\u0000\u0000\u0000\u0097\u0098\u0007\u0005\u0000\u0000\u0098\u0099\u0007"+ - "\n\u0000\u0000\u0099\u009a\u0007\u0000\u0000\u0000\u009a\u009b\u0007\u0003"+ - "\u0000\u0000\u009b\u009c\u0007\u0003\u0000\u0000\u009c\u0013\u0001\u0000"+ - "\u0000\u0000\u009d\u009e\u0007\t\u0000\u0000\u009e\u009f\u0007\r\u0000"+ - "\u0000\u009f\u00a0\u0007\u000b\u0000\u0000\u00a0\u00a1\u0007\u0005\u0000"+ - "\u0000\u00a1\u00a2\u0007\u000e\u0000\u0000\u00a2\u00a3\u0007\b\u0000\u0000"+ - "\u00a3\u00a4\u0007\u0007\u0000\u0000\u00a4\u00a5\u0007\u000b\u0000\u0000"+ - "\u00a5\u0015\u0001\u0000\u0000\u0000\u00a6\u00a7\u0007\u0004\u0000\u0000"+ - "\u00a7\u00a8\u0007\u000f\u0000\u0000\u00a8\u00a9\u0007\u0010\u0000\u0000"+ - "\u00a9\u00aa\u0007\u000e\u0000\u0000\u00aa\u00b1\u0007\u0002\u0000\u0000"+ - "\u00ab\u00ac\u0007\b\u0000\u0000\u00ac\u00ad\u0007\u0003\u0000\u0000\u00ad"+ - "\u00ae\u0007\u0003\u0000\u0000\u00ae\u00af\u0007\u0004\u0000\u0000\u00af"+ - "\u00b1\u0007\u000e\u0000\u0000\u00b0\u00a6\u0001\u0000\u0000\u0000\u00b0"+ - "\u00ab\u0001\u0000\u0000\u0000\u00b1\u0017\u0001\u0000\u0000\u0000\u00b2"+ - "\u00b3\u0007\u000f\u0000\u0000\u00b3\u00b4\u0007\u0000\u0000\u0000\u00b4"+ - "\u00b5\u0007\u000e\u0000\u0000\u00b5\u00b6\u0007\u0005\u0000\u0000\u00b6"+ - "\u00b7\u0007\u0006\u0000\u0000\u00b7\u0019\u0001\u0000\u0000\u0000\u00b8"+ - "\u00b9\u0007\t\u0000\u0000\u00b9\u00ba\u0007\u0007\u0000\u0000\u00ba\u00bb"+ - "\u0007\u0001\u0000\u0000\u00bb\u00bc\u0007\u0004\u0000\u0000\u00bc\u00bd"+ - "\u0007\u0000\u0000\u0000\u00bd\u00be\u0007\u0005\u0000\u0000\u00be\u00bf"+ - "\u0007\u0006\u0000\u0000\u00bf\u001b\u0001\u0000\u0000\u0000\u00c0\u00c1"+ - "\u0005,\u0000\u0000\u00c1\u001d\u0001\u0000\u0000\u0000\u00c2\u00c3\u0005"+ - "(\u0000\u0000\u00c3\u001f\u0001\u0000\u0000\u0000\u00c4\u00c5\u0005)\u0000"+ - "\u0000\u00c5!\u0001\u0000\u0000\u0000\u00c6\u00c7\u0005[\u0000\u0000\u00c7"+ - "#\u0001\u0000\u0000\u0000\u00c8\u00c9\u0005]\u0000\u0000\u00c9%\u0001"+ - "\u0000\u0000\u0000\u00ca\u00cb\u0005{\u0000\u0000\u00cb\'\u0001\u0000"+ - "\u0000\u0000\u00cc\u00cd\u0005}\u0000\u0000\u00cd)\u0001\u0000\u0000\u0000"+ - "\u00ce\u00cf\u0003H#\u0000\u00cf+\u0001\u0000\u0000\u0000\u00d0\u00d1"+ - "\u0003V*\u0000\u00d1-\u0001\u0000\u0000\u0000\u00d2\u00d3\u0005$\u0000"+ - "\u0000\u00d3/\u0001\u0000\u0000\u0000\u00d4\u00d5\u0005\\\u0000\u0000"+ - "\u00d51\u0001\u0000\u0000\u0000\u00d6\u00d7\u0005:\u0000\u0000\u00d7\u00d8"+ - "\u0005:\u0000\u0000\u00d83\u0001\u0000\u0000\u0000\u00d9\u00da\u0005="+ - "\u0000\u0000\u00da\u00db\u0005>\u0000\u0000\u00db5\u0001\u0000\u0000\u0000"+ - "\u00dc\u00dd\u0005-\u0000\u0000\u00dd\u00de\u0005>\u0000\u0000\u00de7"+ - "\u0001\u0000\u0000\u0000\u00df\u00e0\u0005;\u0000\u0000\u00e09\u0001\u0000"+ - "\u0000\u0000\u00e1\u00e2\u0005=\u0000\u0000\u00e2\u00e7\u0005=\u0000\u0000"+ - "\u00e3\u00e4\u0005!\u0000\u0000\u00e4\u00e7\u0005=\u0000\u0000\u00e5\u00e7"+ - "\u0007\u0011\u0000\u0000\u00e6\u00e1\u0001\u0000\u0000\u0000\u00e6\u00e3"+ - "\u0001\u0000\u0000\u0000\u00e6\u00e5\u0001\u0000\u0000\u0000\u00e7\u00e9"+ - "\u0001\u0000\u0000\u0000\u00e8\u00ea\u0005=\u0000\u0000\u00e9\u00e8\u0001"+ - "\u0000\u0000\u0000\u00e9\u00ea\u0001\u0000\u0000\u0000\u00ea;\u0001\u0000"+ - "\u0000\u0000\u00eb\u00ec\u0005&\u0000\u0000\u00ec\u00f0\u0005&\u0000\u0000"+ - "\u00ed\u00ee\u0005|\u0000\u0000\u00ee\u00f0\u0005|\u0000\u0000\u00ef\u00eb"+ - "\u0001\u0000\u0000\u0000\u00ef\u00ed\u0001\u0000\u0000\u0000\u00f0=\u0001"+ - "\u0000\u0000\u0000\u00f1\u00f2\u0003R(\u0000\u00f2?\u0001\u0000\u0000"+ - "\u0000\u00f3\u00f4\u0005/\u0000\u0000\u00f4\u00f5\u0005*\u0000\u0000\u00f5"+ - "\u00f9\u0001\u0000\u0000\u0000\u00f6\u00f8\t\u0000\u0000\u0000\u00f7\u00f6"+ - "\u0001\u0000\u0000\u0000\u00f8\u00fb\u0001\u0000\u0000\u0000\u00f9\u00fa"+ - "\u0001\u0000\u0000\u0000\u00f9\u00f7\u0001\u0000\u0000\u0000\u00fa\u00fc"+ - "\u0001\u0000\u0000\u0000\u00fb\u00f9\u0001\u0000\u0000\u0000\u00fc\u00fd"+ - "\u0005*\u0000\u0000\u00fd\u00fe\u0005/\u0000\u0000\u00fe\u0102\u0001\u0000"+ - "\u0000\u0000\u00ff\u0101\u0007\u0012\u0000\u0000\u0100\u00ff\u0001\u0000"+ - "\u0000\u0000\u0101\u0104\u0001\u0000\u0000\u0000\u0102\u0100\u0001\u0000"+ - "\u0000\u0000\u0102\u0103\u0001\u0000\u0000\u0000\u0103\u0105\u0001\u0000"+ - "\u0000\u0000\u0104\u0102\u0001\u0000\u0000\u0000\u0105\u0106\u0006\u001f"+ - "\u0000\u0000\u0106A\u0001\u0000\u0000\u0000\u0107\u0109\u0005 \u0000\u0000"+ - "\u0108\u0107\u0001\u0000\u0000\u0000\u0109\u010a\u0001\u0000\u0000\u0000"+ - "\u010a\u0108\u0001\u0000\u0000\u0000\u010a\u010b\u0001\u0000\u0000\u0000"+ - "\u010b\u0112\u0001\u0000\u0000\u0000\u010c\u010e\u0007\u0012\u0000\u0000"+ - "\u010d\u010c\u0001\u0000\u0000\u0000\u010e\u010f\u0001\u0000\u0000\u0000"+ - "\u010f\u010d\u0001\u0000\u0000\u0000\u010f\u0110\u0001\u0000\u0000\u0000"+ - "\u0110\u0112\u0001\u0000\u0000\u0000\u0111\u0108\u0001\u0000\u0000\u0000"+ - "\u0111\u010d\u0001\u0000\u0000\u0000\u0112\u0113\u0001\u0000\u0000\u0000"+ - "\u0113\u0114\u0006 \u0000\u0000\u0114C\u0001\u0000\u0000\u0000\u0115\u0116"+ - "\u0005@\u0000\u0000\u0116\u0117\u0007\u0010\u0000\u0000\u0117\u0118\u0007"+ - "\u0006\u0000\u0000\u0118\u0121\u0007\u0010\u0000\u0000\u0119\u011a\u0005"+ - "@\u0000\u0000\u011a\u011b\u0007\u0004\u0000\u0000\u011b\u011c\u0007\u000b"+ - "\u0000\u0000\u011c\u011d\u0007\u0013\u0000\u0000\u011d\u011e\u0007\u0010"+ - "\u0000\u0000\u011e\u011f\u0007\u0006\u0000\u0000\u011f\u0121\u0007\u0010"+ - "\u0000\u0000\u0120\u0115\u0001\u0000\u0000\u0000\u0120\u0119\u0001\u0000"+ - "\u0000\u0000\u0121\u0122\u0001\u0000\u0000\u0000\u0122\u0123\u0006!\u0000"+ - "\u0000\u0123E\u0001\u0000\u0000\u0000\u0124\u0125\t\u0000\u0000\u0000"+ - "\u0125\u0126\u0001\u0000\u0000\u0000\u0126\u0127\u0006\"\u0000\u0000\u0127"+ - "G\u0001\u0000\u0000\u0000\u0128\u012c\u0007\u0014\u0000\u0000\u0129\u012b"+ - "\u0007\u0015\u0000\u0000\u012a\u0129\u0001\u0000\u0000\u0000\u012b\u012e"+ - "\u0001\u0000\u0000\u0000\u012c\u012a\u0001\u0000\u0000\u0000\u012c\u012d"+ - "\u0001\u0000\u0000\u0000\u012dI\u0001\u0000\u0000\u0000\u012e\u012c\u0001"+ - "\u0000\u0000\u0000\u012f\u0133\u0007\u0014\u0000\u0000\u0130\u0132\u0007"+ - "\u0016\u0000\u0000\u0131\u0130\u0001\u0000\u0000\u0000\u0132\u0135\u0001"+ - "\u0000\u0000\u0000\u0133\u0131\u0001\u0000\u0000\u0000\u0133\u0134\u0001"+ - "\u0000\u0000\u0000\u0134K\u0001\u0000\u0000\u0000\u0135\u0133\u0001\u0000"+ - "\u0000\u0000\u0136\u0137\u0007\u0017\u0000\u0000\u0137M\u0001\u0000\u0000"+ - "\u0000\u0138\u013d\u0005\"\u0000\u0000\u0139\u013c\u0003L%\u0000\u013a"+ - "\u013c\t\u0000\u0000\u0000\u013b\u0139\u0001\u0000\u0000\u0000\u013b\u013a"+ - "\u0001\u0000\u0000\u0000\u013c\u013f\u0001\u0000\u0000\u0000\u013d\u013e"+ - "\u0001\u0000\u0000\u0000\u013d\u013b\u0001\u0000\u0000\u0000\u013e\u0140"+ - "\u0001\u0000\u0000\u0000\u013f\u013d\u0001\u0000\u0000\u0000\u0140\u0141"+ - "\u0005\"\u0000\u0000\u0141O\u0001\u0000\u0000\u0000\u0142\u0148\u0005"+ - "\'\u0000\u0000\u0143\u0147\b\u0018\u0000\u0000\u0144\u0145\u0005\\\u0000"+ - "\u0000\u0145\u0147\t\u0000\u0000\u0000\u0146\u0143\u0001\u0000\u0000\u0000"+ - "\u0146\u0144\u0001\u0000\u0000\u0000\u0147\u014a\u0001\u0000\u0000\u0000"+ - "\u0148\u0146\u0001\u0000\u0000\u0000\u0148\u0149\u0001\u0000\u0000\u0000"+ - "\u0149\u014b\u0001\u0000\u0000\u0000\u014a\u0148\u0001\u0000\u0000\u0000"+ - "\u014b\u014c\u0005\'\u0000\u0000\u014cQ\u0001\u0000\u0000\u0000\u014d"+ - "\u0150\u0003N&\u0000\u014e\u0150\u0003P\'\u0000\u014f\u014d\u0001\u0000"+ - "\u0000\u0000\u014f\u014e\u0001\u0000\u0000\u0000\u0150S\u0001\u0000\u0000"+ - "\u0000\u0151\u0152\u0005/\u0000\u0000\u0152\u0153\u0005/\u0000\u0000\u0153"+ - "\u0157\u0001\u0000\u0000\u0000\u0154\u0156\b\u0012\u0000\u0000\u0155\u0154"+ - "\u0001\u0000\u0000\u0000\u0156\u0159\u0001\u0000\u0000\u0000\u0157\u0155"+ - "\u0001\u0000\u0000\u0000\u0157\u0158\u0001\u0000\u0000\u0000\u0158U\u0001"+ - "\u0000\u0000\u0000\u0159\u0157\u0001\u0000\u0000\u0000\u015a\u015b\u0005"+ - "$\u0000\u0000\u015b\u015c\u0003H#\u0000\u015cW\u0001\u0000\u0000\u0000"+ - "\u015d\u015e\u000209\u0000\u015eY\u0001\u0000\u0000\u0000\u015f\u0160"+ - "\u0005{\u0000\u0000\u0160\u0161\u0005{\u0000\u0000\u0161\u0162\u0005-"+ - "\u0000\u0000\u0162\u0163\u0005-\u0000\u0000\u0163\u0164\u0001\u0000\u0000"+ - "\u0000\u0164\u0165\u0006,\u0001\u0000\u0165\u0166\u0006,\u0000\u0000\u0166"+ - "[\u0001\u0000\u0000\u0000\u0167\u0168\u0005@\u0000\u0000\u0168\u0169\u0003"+ - "H#\u0000\u0169\u016a\u0005.\u0000\u0000\u016a\u016b\u0001\u0000\u0000"+ - "\u0000\u016b\u016c\u0006-\u0000\u0000\u016c]\u0001\u0000\u0000\u0000\u016d"+ - "\u0172\u0005@\u0000\u0000\u016e\u0170\u0003X+\u0000\u016f\u0171\u0005"+ - ".\u0000\u0000\u0170\u016f\u0001\u0000\u0000\u0000\u0170\u0171\u0001\u0000"+ - "\u0000\u0000\u0171\u0173\u0001\u0000\u0000\u0000\u0172\u016e\u0001\u0000"+ - "\u0000\u0000\u0173\u0174\u0001\u0000\u0000\u0000\u0174\u0172\u0001\u0000"+ - "\u0000\u0000\u0174\u0175\u0001\u0000\u0000\u0000\u0175\u0176\u0001\u0000"+ - "\u0000\u0000\u0176\u0177\u0006.\u0000\u0000\u0177_\u0001\u0000\u0000\u0000"+ - "\u0178\u0179\u0005{\u0000\u0000\u0179\u017a\u0005{\u0000\u0000\u017a\u02ae"+ - "\u0005{\u0000\u0000\u017b\u017c\u0005@\u0000\u0000\u017c\u017d\u0005@"+ - "\u0000\u0000\u017d\u017f\u0001\u0000\u0000\u0000\u017e\u0180\u0005@\u0000"+ - "\u0000\u017f\u017e\u0001\u0000\u0000\u0000\u017f\u0180\u0001\u0000\u0000"+ - "\u0000\u0180\u02ae\u0001\u0000\u0000\u0000\u0181\u0182\u0005@\u0000\u0000"+ - "\u0182\u0183\u0005{\u0000\u0000\u0183\u0185\u0001\u0000\u0000\u0000\u0184"+ - "\u0186\u0005{\u0000\u0000\u0185\u0184\u0001\u0000\u0000\u0000\u0185\u0186"+ - "\u0001\u0000\u0000\u0000\u0186\u02ae\u0001\u0000\u0000\u0000\u0187\u0188"+ - "\u0005@\u0000\u0000\u0188\u0189\u0007\u000f\u0000\u0000\u0189\u018a\u0007"+ - "\u0004\u0000\u0000\u018a\u018b\u0007\u0013\u0000\u0000\u018b\u018c\u0007"+ - "\b\u0000\u0000\u018c\u018d\u0007\u0000\u0000\u0000\u018d\u018f\u0001\u0000"+ - "\u0000\u0000\u018e\u0190\u0007\u0019\u0000\u0000\u018f\u018e\u0001\u0000"+ - "\u0000\u0000\u0190\u0191\u0001\u0000\u0000\u0000\u0191\u018f\u0001\u0000"+ - "\u0000\u0000\u0191\u0192\u0001\u0000\u0000\u0000\u0192\u01a4\u0001\u0000"+ - "\u0000\u0000\u0193\u0194\u0007\u0003\u0000\u0000\u0194\u0195\u0007\u0005"+ - "\u0000\u0000\u0195\u0196\u0007\u0001\u0000\u0000\u0196\u0197\u0007\u0004"+ - "\u0000\u0000\u0197\u0198\u0007\u0004\u0000\u0000\u0198\u0199\u0007\u000b"+ - "\u0000\u0000\u0199\u019b\u0001\u0000\u0000\u0000\u019a\u019c\u0007\u0019"+ - "\u0000\u0000\u019b\u019a\u0001\u0000\u0000\u0000\u019c\u019d\u0001\u0000"+ - "\u0000\u0000\u019d\u019b\u0001\u0000\u0000\u0000\u019d\u019e\u0001\u0000"+ - "\u0000\u0000\u019e\u01a2\u0001\u0000\u0000\u0000\u019f\u01a0\u0007\u0000"+ - "\u0000\u0000\u01a0\u01a1\u0007\u000b\u0000\u0000\u01a1\u01a3\u0007\u0013"+ - "\u0000\u0000\u01a2\u019f\u0001\u0000\u0000\u0000\u01a2\u01a3\u0001\u0000"+ - "\u0000\u0000\u01a3\u01a5\u0001\u0000\u0000\u0000\u01a4\u0193\u0001\u0000"+ - "\u0000\u0000\u01a4\u01a5\u0001\u0000\u0000\u0000\u01a5\u02ae\u0001\u0000"+ - "\u0000\u0000\u01a6\u01a7\u0005@\u0000\u0000\u01a7\u01a8\u0007\u0005\u0000"+ - "\u0000\u01a8\u01a9\u0007\u0006\u0000\u0000\u01a9\u01aa\u0007\u0000\u0000"+ - "\u0000\u01aa\u01ab\u0007\u0001\u0000\u0000\u01ab\u01ac\u0007\u0003\u0000"+ - "\u0000\u01ac\u01ad\u0007\u0004\u0000\u0000\u01ad\u02a6\u0007\u000e\u0000"+ - "\u0000\u01ae\u01af\u0005@\u0000\u0000\u01af\u01b0\u0007\b\u0000\u0000"+ - "\u01b0\u01b1\u0007\u000f\u0000\u0000\u01b1\u01b2\u0007\u0010\u0000\u0000"+ - "\u01b2\u01b3\u0007\u0007\u0000\u0000\u01b3\u01b4\u0007\u0001\u0000\u0000"+ - "\u01b4\u02a6\u0007\u000e\u0000\u0000\u01b5\u01b6\u0005@\u0000\u0000\u01b6"+ - "\u01b7\u0007\u000b\u0000\u0000\u01b7\u01b8\u0007\u0000\u0000\u0000\u01b8"+ - "\u01b9\u0007\u000f\u0000\u0000\u01b9\u01ba\u0007\u0004\u0000\u0000\u01ba"+ - "\u01bb\u0007\u0003\u0000\u0000\u01bb\u01bc\u0007\u0010\u0000\u0000\u01bc"+ - "\u01bd\u0007\u0000\u0000\u0000\u01bd\u01be\u0007\u0005\u0000\u0000\u01be"+ - "\u02a6\u0007\u0004\u0000\u0000\u01bf\u01c0\u0005@\u0000\u0000\u01c0\u01c1"+ - "\u0007\u0013\u0000\u0000\u01c1\u01c2\u0007\u0007\u0000\u0000\u01c2\u01c3"+ - "\u0007\u0005\u0000\u0000\u01c3\u01c4\u0007\r\u0000\u0000\u01c4\u01c5\u0007"+ - "\u000f\u0000\u0000\u01c5\u01c6\u0007\u0004\u0000\u0000\u01c6\u01c7\u0007"+ - "\u000b\u0000\u0000\u01c7\u02a6\u0007\u000e\u0000\u0000\u01c8\u01c9\u0005"+ - "@\u0000\u0000\u01c9\u01ca\u0007\t\u0000\u0000\u01ca\u01cb\u0007\u0007"+ - "\u0000\u0000\u01cb\u01cc\u0007\u000b\u0000\u0000\u01cc\u01cd\u0007\u000e"+ - "\u0000\u0000\u01cd\u01ce\u0005-\u0000\u0000\u01ce\u01cf\u0007\t\u0000"+ - "\u0000\u01cf\u01d0\u0007\u0000\u0000\u0000\u01d0\u01d1\u0007\u0005\u0000"+ - "\u0000\u01d1\u02a6\u0007\u0004\u0000\u0000\u01d2\u01d3\u0005@\u0000\u0000"+ - "\u01d3\u01d4\u0007\u0010\u0000\u0000\u01d4\u01d5\u0007\u0000\u0000\u0000"+ - "\u01d5\u01d6\u0007\u001a\u0000\u0000\u01d6\u02a6\u0007\u0004\u0000\u0000"+ - "\u01d7\u01d8\u0005@\u0000\u0000\u01d8\u01d9\u0007\n\u0000\u0000\u01d9"+ - "\u01da\u0007\u0000\u0000\u0000\u01da\u01db\u0007\u0002\u0000\u0000\u01db"+ - "\u01dc\u0007\u0004\u0000\u0000\u01dc\u02a6\u0007\u0001\u0000\u0000\u01dd"+ - "\u01de\u0005@\u0000\u0000\u01de\u01df\u0007\u0003\u0000\u0000\u01df\u01e0"+ - "\u0007\r\u0000\u0000\u01e0\u01e1\u0007\u0010\u0000\u0000\u01e1\u01e2\u0007"+ - "\u0010\u0000\u0000\u01e2\u01e3\u0007\u0007\u0000\u0000\u01e3\u01e4\u0007"+ - "\u0001\u0000\u0000\u01e4\u01e5\u0007\u000e\u0000\u0000\u01e5\u02a6\u0007"+ - "\u0003\u0000\u0000\u01e6\u01e7\u0005@\u0000\u0000\u01e7\u01e8\u0007\u000e"+ - "\u0000\u0000\u01e8\u01e9\u0007\u0000\u0000\u0000\u01e9\u01ea\u0007\b\u0000"+ - "\u0000\u01ea\u01eb\u0007\n\u0000\u0000\u01eb\u01ec\u0007\f\u0000\u0000"+ - "\u01ec\u01ed\u0007\b\u0000\u0000\u01ed\u01ee\u0007\u000b\u0000\u0000\u01ee"+ - "\u02a6\u0007\u0013\u0000\u0000\u01ef\u01f0\u0005@\u0000\u0000\u01f0\u01f1"+ - "\u0007\u0000\u0000\u0000\u01f1\u01f2\u0007\u0010\u0000\u0000\u01f2\u01f3"+ - "\u0007\u0010\u0000\u0000\u01f3\u01f4\u0007\n\u0000\u0000\u01f4\u02a6\u0007"+ - "\u0002\u0000\u0000\u01f5\u01f6\u0005@\u0000\u0000\u01f6\u01f7\u0005-\u0000"+ - "\u0000\u01f7\u01f8\u0007\f\u0000\u0000\u01f8\u01f9\u0007\u0004\u0000\u0000"+ - "\u01f9\u01fa\u0007\u001b\u0000\u0000\u01fa\u01fb\u0007\u001c\u0000\u0000"+ - "\u01fb\u01fc\u0007\b\u0000\u0000\u01fc\u01fd\u0007\u000e\u0000\u0000\u01fd"+ - "\u01fe\u0005-\u0000\u0000\u01fe\u01ff\u0007\u001c\u0000\u0000\u01ff\u0200"+ - "\u0007\u0004\u0000\u0000\u0200\u0201\u0007\u0002\u0000\u0000\u0201\u0202"+ - "\u0007\t\u0000\u0000\u0202\u0203\u0007\u0001\u0000\u0000\u0203\u0204\u0007"+ - "\u0000\u0000\u0000\u0204\u0205\u0007\u000f\u0000\u0000\u0205\u0206\u0007"+ - "\u0004\u0000\u0000\u0206\u02a6\u0007\u0003\u0000\u0000\u0207\u0208\u0005"+ - "@\u0000\u0000\u0208\u0209\u0007\u001c\u0000\u0000\u0209\u020a\u0007\u0004"+ - "\u0000\u0000\u020a\u020b\u0007\u0002\u0000\u0000\u020b\u020c\u0007\t\u0000"+ - "\u0000\u020c\u020d\u0007\u0001\u0000\u0000\u020d\u020e\u0007\u0000\u0000"+ - "\u0000\u020e\u020f\u0007\u000f\u0000\u0000\u020f\u0210\u0007\u0004\u0000"+ - "\u0000\u0210\u02a6\u0007\u0003\u0000\u0000\u0211\u0212\u0005@\u0000\u0000"+ - "\u0212\u0213\u0007\u0005\u0000\u0000\u0213\u0214\u0007\u0007\u0000\u0000"+ - "\u0214\u0215\u0007\r\u0000\u0000\u0215\u0216\u0007\u000b\u0000\u0000\u0216"+ - "\u0217\u0007\u000e\u0000\u0000\u0217\u0218\u0007\u0004\u0000\u0000\u0218"+ - "\u0219\u0007\u0001\u0000\u0000\u0219\u021a\u0005-\u0000\u0000\u021a\u021b"+ - "\u0007\u0003\u0000\u0000\u021b\u021c\u0007\u000e\u0000\u0000\u021c\u021d"+ - "\u0007\u0002\u0000\u0000\u021d\u021e\u0007\n\u0000\u0000\u021e\u02a6\u0007"+ - "\u0004\u0000\u0000\u021f\u0220\u0005@\u0000\u0000\u0220\u0221\u0007\t"+ - "\u0000\u0000\u0221\u0222\u0007\u0007\u0000\u0000\u0222\u0223\u0007\u000b"+ - "\u0000\u0000\u0223\u0224\u0007\u000e\u0000\u0000\u0224\u0225\u0005-\u0000"+ - "\u0000\u0225\u0226\u0007\t\u0000\u0000\u0226\u0227\u0007\u0004\u0000\u0000"+ - "\u0227\u0228\u0007\u0000\u0000\u0000\u0228\u0229\u0007\u000e\u0000\u0000"+ - "\u0229\u022a\u0007\r\u0000\u0000\u022a\u022b\u0007\u0001\u0000\u0000\u022b"+ - "\u022c\u0007\u0004\u0000\u0000\u022c\u022d\u0005-\u0000\u0000\u022d\u022e"+ - "\u0007\u001d\u0000\u0000\u022e\u022f\u0007\u0000\u0000\u0000\u022f\u0230"+ - "\u0007\n\u0000\u0000\u0230\u0231\u0007\r\u0000\u0000\u0231\u0232\u0007"+ - "\u0004\u0000\u0000\u0232\u02a6\u0007\u0003\u0000\u0000\u0233\u0234\u0005"+ - "@\u0000\u0000\u0234\u0235\u0007\u0010\u0000\u0000\u0235\u0236\u0007\u0001"+ - "\u0000\u0000\u0236\u0237\u0007\u0007\u0000\u0000\u0237\u0238\u0007\u0010"+ - "\u0000\u0000\u0238\u0239\u0007\u0004\u0000\u0000\u0239\u023a\u0007\u0001"+ - "\u0000\u0000\u023a\u023b\u0007\u000e\u0000\u0000\u023b\u02a6\u0007\u0002"+ - "\u0000\u0000\u023c\u023d\u0005@\u0000\u0000\u023d\u023e\u0007\u0003\u0000"+ - "\u0000\u023e\u023f\u0007\u0005\u0000\u0000\u023f\u0240\u0007\u0007\u0000"+ - "\u0000\u0240\u0241\u0007\u0010\u0000\u0000\u0241\u02a6\u0007\u0004\u0000"+ - "\u0000\u0242\u0243\u0005@\u0000\u0000\u0243\u0244\u0007\u0003\u0000\u0000"+ - "\u0244\u0245\u0007\u000e\u0000\u0000\u0245\u0246\u0007\u0000\u0000\u0000"+ - "\u0246\u0247\u0007\u0001\u0000\u0000\u0247\u0248\u0007\u000e\u0000\u0000"+ - "\u0248\u0249\u0007\b\u0000\u0000\u0249\u024a\u0007\u000b\u0000\u0000\u024a"+ - "\u024b\u0007\u001a\u0000\u0000\u024b\u024c\u0005-\u0000\u0000\u024c\u024d"+ - "\u0007\u0003\u0000\u0000\u024d\u024e\u0007\u000e\u0000\u0000\u024e\u024f"+ - "\u0007\u0002\u0000\u0000\u024f\u0250\u0007\n\u0000\u0000\u0250\u02a6\u0007"+ - "\u0004\u0000\u0000\u0251\u0252\u0005@\u0000\u0000\u0252\u0253\u0007\u0003"+ - "\u0000\u0000\u0253\u0254\u0007\r\u0000\u0000\u0254\u0255\u0007\u0010\u0000"+ - "\u0000\u0255\u0256\u0007\u0010\u0000\u0000\u0256\u0257\u0007\u0007\u0000"+ - "\u0000\u0257\u0258\u0007\u0001\u0000\u0000\u0258\u0259\u0007\u000e\u0000"+ - "\u0000\u0259\u02a6\u0007\u0003\u0000\u0000\u025a\u025b\u0005@\u0000\u0000"+ - "\u025b\u025c\u0007\u001d\u0000\u0000\u025c\u025d\u0007\b\u0000\u0000\u025d"+ - "\u025e\u0007\u0004\u0000\u0000\u025e\u025f\u0007\f\u0000\u0000\u025f\u0260"+ - "\u0005-\u0000\u0000\u0260\u0261\u0007\u000e\u0000\u0000\u0261\u0262\u0007"+ - "\u0001\u0000\u0000\u0262\u0263\u0007\u0000\u0000\u0000\u0263\u0264\u0007"+ - "\u000b\u0000\u0000\u0264\u0265\u0007\u0003\u0000\u0000\u0265\u0266\u0007"+ - "\b\u0000\u0000\u0266\u0267\u0007\u000e\u0000\u0000\u0267\u0268\u0007\b"+ - "\u0000\u0000\u0268\u0269\u0007\u0007\u0000\u0000\u0269\u02a6\u0007\u000b"+ - "\u0000\u0000\u026a\u026b\u0005@\u0000\u0000\u026b\u026c\u0007\u0005\u0000"+ - "\u0000\u026c\u026d\u0007\u0007\u0000\u0000\u026d\u026e\u0007\u000b\u0000"+ - "\u0000\u026e\u026f\u0007\u000e\u0000\u0000\u026f\u0270\u0007\u0000\u0000"+ - "\u0000\u0270\u0271\u0007\b\u0000\u0000\u0271\u0272\u0007\u000b\u0000\u0000"+ - "\u0272\u0273\u0007\u0004\u0000\u0000\u0273\u02a6\u0007\u0001\u0000\u0000"+ - "\u0274\u0275\u0005@\u0000\u0000\u0275\u0276\u0007\u0005\u0000\u0000\u0276"+ - "\u0277\u0007\u0007\u0000\u0000\u0277\u0278\u0007\n\u0000\u0000\u0278\u0279"+ - "\u0007\u0007\u0000\u0000\u0279\u027a\u0007\u0001\u0000\u0000\u027a\u027b"+ - "\u0005-\u0000\u0000\u027b\u027c\u0007\u0010\u0000\u0000\u027c\u027d\u0007"+ - "\u0001\u0000\u0000\u027d\u027e\u0007\u0007\u0000\u0000\u027e\u027f\u0007"+ - "\t\u0000\u0000\u027f\u0280\u0007\b\u0000\u0000\u0280\u0281\u0007\n\u0000"+ - "\u0000\u0281\u02a6\u0007\u0004\u0000\u0000\u0282\u0283\u0005@\u0000\u0000"+ - "\u0283\u0284\u0007\u0003\u0000\u0000\u0284\u0285\u0007\u000e\u0000\u0000"+ - "\u0285\u0286\u0007\u0002\u0000\u0000\u0286\u0287\u0007\n\u0000\u0000\u0287"+ - "\u0288\u0007\u0004\u0000\u0000\u0288\u0289\u0007\u0003\u0000\u0000\u0289"+ - "\u028a\u0007\u0004\u0000\u0000\u028a\u02a6\u0007\u000e\u0000\u0000\u028b"+ - "\u028c\u0005@\u0000\u0000\u028c\u028d\u0007\t\u0000\u0000\u028d\u028e"+ - "\u0007\u0007\u0000\u0000\u028e\u028f\u0007\u000b\u0000\u0000\u028f\u0290"+ - "\u0007\u000e\u0000\u0000\u0290\u0291\u0005-\u0000\u0000\u0291\u0292\u0007"+ - "\u0010\u0000\u0000\u0292\u0293\u0007\u0000\u0000\u0000\u0293\u0294\u0007"+ - "\n\u0000\u0000\u0294\u0295\u0007\u0004\u0000\u0000\u0295\u0296\u0007\u000e"+ - "\u0000\u0000\u0296\u0297\u0007\u000e\u0000\u0000\u0297\u0298\u0007\u0004"+ - "\u0000\u0000\u0298\u0299\u0005-\u0000\u0000\u0299\u029a\u0007\u001d\u0000"+ - "\u0000\u029a\u029b\u0007\u0000\u0000\u0000\u029b\u029c\u0007\n\u0000\u0000"+ - "\u029c\u029d\u0007\r\u0000\u0000\u029d\u029e\u0007\u0004\u0000\u0000\u029e"+ - "\u02a6\u0007\u0003\u0000\u0000\u029f\u02a0\u0005@\u0000\u0000\u02a0\u02a1"+ - "\u0007\u000f\u0000\u0000\u02a1\u02a2\u0007\u0004\u0000\u0000\u02a2\u02a3"+ - "\u0007\u0013\u0000\u0000\u02a3\u02a4\u0007\b\u0000\u0000\u02a4\u02a6\u0007"+ - "\u0000\u0000\u0000\u02a5\u01a6\u0001\u0000\u0000\u0000\u02a5\u01ae\u0001"+ - "\u0000\u0000\u0000\u02a5\u01b5\u0001\u0000\u0000\u0000\u02a5\u01bf\u0001"+ - "\u0000\u0000\u0000\u02a5\u01c8\u0001\u0000\u0000\u0000\u02a5\u01d2\u0001"+ - "\u0000\u0000\u0000\u02a5\u01d7\u0001\u0000\u0000\u0000\u02a5\u01dd\u0001"+ - "\u0000\u0000\u0000\u02a5\u01e6\u0001\u0000\u0000\u0000\u02a5\u01ef\u0001"+ - "\u0000\u0000\u0000\u02a5\u01f5\u0001\u0000\u0000\u0000\u02a5\u0207\u0001"+ - "\u0000\u0000\u0000\u02a5\u0211\u0001\u0000\u0000\u0000\u02a5\u021f\u0001"+ - "\u0000\u0000\u0000\u02a5\u0233\u0001\u0000\u0000\u0000\u02a5\u023c\u0001"+ - "\u0000\u0000\u0000\u02a5\u0242\u0001\u0000\u0000\u0000\u02a5\u0251\u0001"+ - "\u0000\u0000\u0000\u02a5\u025a\u0001\u0000\u0000\u0000\u02a5\u026a\u0001"+ - "\u0000\u0000\u0000\u02a5\u0274\u0001\u0000\u0000\u0000\u02a5\u0282\u0001"+ - "\u0000\u0000\u0000\u02a5\u028b\u0001\u0000\u0000\u0000\u02a5\u029f\u0001"+ - "\u0000\u0000\u0000\u02a6\u02aa\u0001\u0000\u0000\u0000\u02a7\u02a9\u0007"+ - "\u0019\u0000\u0000\u02a8\u02a7\u0001\u0000\u0000\u0000\u02a9\u02ac\u0001"+ - "\u0000\u0000\u0000\u02aa\u02a8\u0001\u0000\u0000\u0000\u02aa\u02ab\u0001"+ - "\u0000\u0000\u0000\u02ab\u02ae\u0001\u0000\u0000\u0000\u02ac\u02aa\u0001"+ - "\u0000\u0000\u0000\u02ad\u0178\u0001\u0000\u0000\u0000\u02ad\u017b\u0001"+ - "\u0000\u0000\u0000\u02ad\u0181\u0001\u0000\u0000\u0000\u02ad\u0187\u0001"+ - "\u0000\u0000\u0000\u02ad\u02a5\u0001\u0000\u0000\u0000\u02ae\u02af\u0001"+ - "\u0000\u0000\u0000\u02af\u02b0\u0006/\u0002\u0000\u02b0a\u0001\u0000\u0000"+ - "\u0000\u02b1\u02b2\u0005-\u0000\u0000\u02b2\u02b3\u0005-\u0000\u0000\u02b3"+ - "\u02b4\u0005}\u0000\u0000\u02b4\u02b5\u0005}\u0000\u0000\u02b5\u02b6\u0001"+ - "\u0000\u0000\u0000\u02b6\u02b7\u00060\u0003\u0000\u02b7\u02b8\u00060\u0000"+ - "\u0000\u02b8c\u0001\u0000\u0000\u0000\u02b9\u02ba\t\u0000\u0000\u0000"+ - "\u02ba\u02bb\u00041\u0000\u0000\u02bb\u02bc\u0001\u0000\u0000\u0000\u02bc"+ - "\u02bd\u00061\u0000\u0000\u02bde\u0001\u0000\u0000\u0000\u02be\u02bf\t"+ - "\u0000\u0000\u0000\u02bf\u02c0\u0001\u0000\u0000\u0000\u02c0\u02c1\u0006"+ - "2\u0000\u0000\u02c1g\u0001\u0000\u0000\u0000\u02c2\u02c3\u0005\u0000\u0000"+ - "\u0001\u02c3\u02c4\u0001\u0000\u0000\u0000\u02c4\u02c5\u00063\u0003\u0000"+ - "\u02c5\u02c6\u00063\u0000\u0000\u02c6i\u0001\u0000\u0000\u0000 \u0000"+ - "\u0001\u008c\u00b0\u00e6\u00e9\u00ef\u00f9\u0102\u010a\u010f\u0111\u0120"+ - "\u012c\u0133\u013b\u013d\u0146\u0148\u014f\u0157\u0170\u0174\u017f\u0185"+ - "\u0191\u019d\u01a2\u01a4\u02a5\u02aa\u02ad\u0004\u0006\u0000\u0000\u0005"+ - "\u0001\u0000\u0007\u0001\u0000\u0004\u0000\u0000"; - public static final ATN _ATN = - new ATNDeserializer().deserialize(_serializedATN.toCharArray()); - static { - _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; - for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { - _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); - } - } -} \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.g4 b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.g4 deleted file mode 100644 index 824c08d5b262..000000000000 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.g4 +++ /dev/null @@ -1,175 +0,0 @@ -parser grammar BladePhpAntlrParser; - -@header{ - package org.netbeans.modules.php.blade.syntax.antlr4.php; -} - -options { - superClass = ParserAdaptor; - tokenVocab = BladePhpAntlrLexer; - } - -expression : exprStatement* EOF; - -exprStatement : - //empty statement - ';' - | '{' exprStatement* '}' - | '(' exprStatement* ')' - | COMPARISON_OPERATOR exprStatement - | LOGICAL_UNION_OPERATOR functionalExpr+ - | 'foreach' '(' foreachArguments ')' - | functionalExpr - | ifStatement - | foreachDirectiveStatement - | output - | misc -; - -logicalStatement: - '(' functionalExpr* ')' - | functionalExpr (LOGICAL_UNION_OPERATOR functionalExpr)+ - | functionalExpr (COMPARISON_OPERATOR functionalExpr)+ - | functionalExpr -; - -ifStatement: - //long expr - 'if' '(' logicalStatement+ ')' '{' exprStatement* '}' - (ELSEIF '(' logicalStatement+ ')' '{' exprStatement* '}' )* - ('else' '{' exprStatement* '}')? - ; - -inputExpr: - varExpr - ; - -functionalExpr: - matchStatement - | classExpression (classMember)* - | functionExpr - | LANG_CONSTRUCT '(' functionalExpr ')' - | inputExpr - ; - -classExpression: - classInstanceStatement - | staticMethodAccess - | staticFieldAccess - | staticClassReference - | staticAccess - | aliasDirectAccess - | directMethodAccess - ; - -foreachDirectiveStatement: - {this.bladeParserContext.equals(ParserContext.FOREACH)}? foreachArguments - ; - -foreachArguments: - (array | main_array = PHP_VARIABLE) 'as' array_item=PHP_VARIABLE - | (array | main_array = PHP_VARIABLE) 'as' array_key=PHP_VARIABLE '=>' array_item=PHP_VARIABLE - | functionExpr 'as' functionExpr ('=>' functionExpr)? -; - -classInstanceStatement: - 'new' namespace? className=IDENTIFIER arguments? - ; - -matchStatement: - 'match' '(' functionalExpr ')' '{' - (functionalExpr+ (',' functionalExpr+)* '=>' functionalExpr+)* - (',' functionalExpr+ (',' functionalExpr+)* '=>' functionalExpr+)* - ','? - '}' -; -staticClassReference : - namespace? IDENTIFIER '::' CLASS -; - -staticMethodAccess : - namespace? className=IDENTIFIER '::' method=IDENTIFIER arguments -; - -staticFieldAccess : - namespace? className=IDENTIFIER '::' (const=IDENTIFIER | propertyAlias=PHP_VARIABLE | 'class') - | classAlias=PHP_VARIABLE '::' const=IDENTIFIER - | classAlias=PHP_VARIABLE '::' propertyAlias=PHP_VARIABLE -; - -staticAccess : - //should throw an error? - namespace? className=IDENTIFIER '::' -; - -aliasDirectAccess: - PHP_VARIABLE classMember - ; - -classMember: - directMethodAccess - | '->' IDENTIFIER -; - -directMethodAccess : - '->' IDENTIFIER arguments -; - -directAccess : - IDENTIFIER arguments '->' IDENTIFIER arguments -; - -functionExpr : - IDENTIFIER arguments -; - -arguments : - '(' argument (',' argument )* ')' - | '(' ')' - ; - -namespace : - '\\'? (IDENTIFIER '\\')+ - | '\\' -; - -argument: - functionalExpr - | IDENTIFIER - ; - -array: - PHP_VARIABLE array_key_item+ - | array_key_item -; - -array_key_item: - '[' array_key_item* ']' - | 'array' '(' array_key_item* ')' - | '[' (array_child '=>' array_key_item)+ ']' - | 'array' '(' (array_child '=>' array_key_item)+ ')' - | '[' array_child (',' array_child)* ','? ']' - | 'array' '(' array_child (',' array_child)* ','? ')' -; - -array_child: - functionalExpr '=>' array_key_item - | functionalExpr '=>' functionalExpr - | functionalExpr - ; - -varExpr: - array - | '$'? PHP_VARIABLE - | STRING_LITERAL -; - -misc: - 'new' PHP_VARIABLE arguments? - | 'new' namespace //incomplete namespcace - | namespace className=IDENTIFIER -; - -output: - 'echo' functionalExpr -; \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.java deleted file mode 100644 index e1ee5b6d97d8..000000000000 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.java +++ /dev/null @@ -1,3208 +0,0 @@ -// Generated from BladePhpAntlrParser.g4 by ANTLR 4.13.0 - - package org.netbeans.modules.php.blade.syntax.antlr4.php; - -import org.antlr.v4.runtime.atn.*; -import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.misc.*; -import org.antlr.v4.runtime.tree.*; -import java.util.List; -import java.util.Iterator; -import java.util.ArrayList; - -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) -public class BladePhpAntlrParser extends ParserAdaptor { - static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } - - protected static final DFA[] _decisionToDFA; - protected static final PredictionContextCache _sharedContextCache = - new PredictionContextCache(); - public static final int - HTML=1, BLADE_COMMENT=2, LINE_COMMENT=3, ARRAY=4, AS=5, ECHO=6, IF=7, - ELSEIF=8, ELSE=9, NEW=10, CLASS=11, FUNCTION=12, LANG_CONSTRUCT=13, MATCH=14, - FOREACH=15, COMMA=16, LPAREN=17, RPAREN=18, LSQUAREBRACKET=19, RSQUAREBRACKET=20, - LCURLYBRACE=21, RCURLYBRACE=22, IDENTIFIER=23, PHP_VARIABLE=24, DOLLAR=25, - NAMESPACE_SEPARATOR=26, DOUBLE_COLON=27, ARROW=28, OBJECT_OPERATOR=29, - SEMI_COLON=30, COMPARISON_OPERATOR=31, LOGICAL_UNION_OPERATOR=32, STRING_LITERAL=33, - STYLE_COMMENT=34, WS=35, PHP_DIRECTIVE=36, OTHER=37, BLADE_COMMENT_START=38, - EMAIL_SUBSTRING=39, VERSION_WITH_AT=40, BLADE_COMMENT_END=41, BLADE_COMMENT_PEEK=42, - BLADE_COMMENT_MORE=43, BLADE_COMMENT_EOF=44; - public static final int - RULE_expression = 0, RULE_exprStatement = 1, RULE_logicalStatement = 2, - RULE_ifStatement = 3, RULE_inputExpr = 4, RULE_functionalExpr = 5, RULE_classExpression = 6, - RULE_foreachDirectiveStatement = 7, RULE_foreachArguments = 8, RULE_classInstanceStatement = 9, - RULE_matchStatement = 10, RULE_staticClassReference = 11, RULE_staticMethodAccess = 12, - RULE_staticFieldAccess = 13, RULE_staticAccess = 14, RULE_aliasDirectAccess = 15, - RULE_classMember = 16, RULE_directMethodAccess = 17, RULE_directAccess = 18, - RULE_functionExpr = 19, RULE_arguments = 20, RULE_namespace = 21, RULE_argument = 22, - RULE_array = 23, RULE_array_key_item = 24, RULE_array_child = 25, RULE_varExpr = 26, - RULE_misc = 27, RULE_output = 28; - private static String[] makeRuleNames() { - return new String[] { - "expression", "exprStatement", "logicalStatement", "ifStatement", "inputExpr", - "functionalExpr", "classExpression", "foreachDirectiveStatement", "foreachArguments", - "classInstanceStatement", "matchStatement", "staticClassReference", "staticMethodAccess", - "staticFieldAccess", "staticAccess", "aliasDirectAccess", "classMember", - "directMethodAccess", "directAccess", "functionExpr", "arguments", "namespace", - "argument", "array", "array_key_item", "array_child", "varExpr", "misc", - "output" - }; - } - public static final String[] ruleNames = makeRuleNames(); - - private static String[] makeLiteralNames() { - return new String[] { - null, null, null, null, "'array'", "'as'", "'echo'", "'if'", null, "'else'", - "'new'", "'class'", "'function'", null, "'match'", "'foreach'", "','", - "'('", "')'", "'['", "']'", "'{'", "'}'", null, null, "'$'", "'\\'", - "'::'", "'=>'", "'->'", "';'", null, null, null, null, null, null, null, - "'{{--'", null, null, "'--}}'" - }; - } - private static final String[] _LITERAL_NAMES = makeLiteralNames(); - private static String[] makeSymbolicNames() { - return new String[] { - null, "HTML", "BLADE_COMMENT", "LINE_COMMENT", "ARRAY", "AS", "ECHO", - "IF", "ELSEIF", "ELSE", "NEW", "CLASS", "FUNCTION", "LANG_CONSTRUCT", - "MATCH", "FOREACH", "COMMA", "LPAREN", "RPAREN", "LSQUAREBRACKET", "RSQUAREBRACKET", - "LCURLYBRACE", "RCURLYBRACE", "IDENTIFIER", "PHP_VARIABLE", "DOLLAR", - "NAMESPACE_SEPARATOR", "DOUBLE_COLON", "ARROW", "OBJECT_OPERATOR", "SEMI_COLON", - "COMPARISON_OPERATOR", "LOGICAL_UNION_OPERATOR", "STRING_LITERAL", "STYLE_COMMENT", - "WS", "PHP_DIRECTIVE", "OTHER", "BLADE_COMMENT_START", "EMAIL_SUBSTRING", - "VERSION_WITH_AT", "BLADE_COMMENT_END", "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", - "BLADE_COMMENT_EOF" - }; - } - private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); - public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); - - /** - * @deprecated Use {@link #VOCABULARY} instead. - */ - @Deprecated - public static final String[] tokenNames; - static { - tokenNames = new String[_SYMBOLIC_NAMES.length]; - for (int i = 0; i < tokenNames.length; i++) { - tokenNames[i] = VOCABULARY.getLiteralName(i); - if (tokenNames[i] == null) { - tokenNames[i] = VOCABULARY.getSymbolicName(i); - } - - if (tokenNames[i] == null) { - tokenNames[i] = ""; - } - } - } - - @Override - @Deprecated - public String[] getTokenNames() { - return tokenNames; - } - - @Override - - public Vocabulary getVocabulary() { - return VOCABULARY; - } - - @Override - public String getGrammarFileName() { return "BladePhpAntlrParser.g4"; } - - @Override - public String[] getRuleNames() { return ruleNames; } - - @Override - public String getSerializedATN() { return _serializedATN; } - - @Override - public ATN getATN() { return _ATN; } - - public BladePhpAntlrParser(TokenStream input) { - super(input); - _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); - } - - @SuppressWarnings("CheckReturnValue") - public static class ExpressionContext extends ParserRuleContext { - public TerminalNode EOF() { return getToken(BladePhpAntlrParser.EOF, 0); } - public List exprStatement() { - return getRuleContexts(ExprStatementContext.class); - } - public ExprStatementContext exprStatement(int i) { - return getRuleContext(ExprStatementContext.class,i); - } - public ExpressionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_expression; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterExpression(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitExpression(this); - } - } - - public final ExpressionContext expression() throws RecognitionException { - ExpressionContext _localctx = new ExpressionContext(_ctx, getState()); - enterRule(_localctx, 0, RULE_expression); - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(61); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,0,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(58); - exprStatement(); - } - } - } - setState(63); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,0,_ctx); - } - setState(64); - match(EOF); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ExprStatementContext extends ParserRuleContext { - public TerminalNode SEMI_COLON() { return getToken(BladePhpAntlrParser.SEMI_COLON, 0); } - public TerminalNode LCURLYBRACE() { return getToken(BladePhpAntlrParser.LCURLYBRACE, 0); } - public TerminalNode RCURLYBRACE() { return getToken(BladePhpAntlrParser.RCURLYBRACE, 0); } - public List exprStatement() { - return getRuleContexts(ExprStatementContext.class); - } - public ExprStatementContext exprStatement(int i) { - return getRuleContext(ExprStatementContext.class,i); - } - public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } - public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } - public TerminalNode COMPARISON_OPERATOR() { return getToken(BladePhpAntlrParser.COMPARISON_OPERATOR, 0); } - public TerminalNode LOGICAL_UNION_OPERATOR() { return getToken(BladePhpAntlrParser.LOGICAL_UNION_OPERATOR, 0); } - public List functionalExpr() { - return getRuleContexts(FunctionalExprContext.class); - } - public FunctionalExprContext functionalExpr(int i) { - return getRuleContext(FunctionalExprContext.class,i); - } - public TerminalNode FOREACH() { return getToken(BladePhpAntlrParser.FOREACH, 0); } - public ForeachArgumentsContext foreachArguments() { - return getRuleContext(ForeachArgumentsContext.class,0); - } - public IfStatementContext ifStatement() { - return getRuleContext(IfStatementContext.class,0); - } - public ForeachDirectiveStatementContext foreachDirectiveStatement() { - return getRuleContext(ForeachDirectiveStatementContext.class,0); - } - public OutputContext output() { - return getRuleContext(OutputContext.class,0); - } - public MiscContext misc() { - return getRuleContext(MiscContext.class,0); - } - public ExprStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_exprStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterExprStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitExprStatement(this); - } - } - - public final ExprStatementContext exprStatement() throws RecognitionException { - ExprStatementContext _localctx = new ExprStatementContext(_ctx, getState()); - enterRule(_localctx, 2, RULE_exprStatement); - try { - int _alt; - setState(101); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(66); - match(SEMI_COLON); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(67); - match(LCURLYBRACE); - setState(71); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,1,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(68); - exprStatement(); - } - } - } - setState(73); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,1,_ctx); - } - setState(74); - match(RCURLYBRACE); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(75); - match(LPAREN); - setState(79); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,2,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(76); - exprStatement(); - } - } - } - setState(81); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,2,_ctx); - } - setState(82); - match(RPAREN); - } - break; - case 4: - enterOuterAlt(_localctx, 4); - { - setState(83); - match(COMPARISON_OPERATOR); - setState(84); - exprStatement(); - } - break; - case 5: - enterOuterAlt(_localctx, 5); - { - setState(85); - match(LOGICAL_UNION_OPERATOR); - setState(87); - _errHandler.sync(this); - _alt = 1; - do { - switch (_alt) { - case 1: - { - { - setState(86); - functionalExpr(); - } - } - break; - default: - throw new NoViableAltException(this); - } - setState(89); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,3,_ctx); - } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); - } - break; - case 6: - enterOuterAlt(_localctx, 6); - { - setState(91); - match(FOREACH); - setState(92); - match(LPAREN); - setState(93); - foreachArguments(); - setState(94); - match(RPAREN); - } - break; - case 7: - enterOuterAlt(_localctx, 7); - { - setState(96); - functionalExpr(); - } - break; - case 8: - enterOuterAlt(_localctx, 8); - { - setState(97); - ifStatement(); - } - break; - case 9: - enterOuterAlt(_localctx, 9); - { - setState(98); - foreachDirectiveStatement(); - } - break; - case 10: - enterOuterAlt(_localctx, 10); - { - setState(99); - output(); - } - break; - case 11: - enterOuterAlt(_localctx, 11); - { - setState(100); - misc(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class LogicalStatementContext extends ParserRuleContext { - public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } - public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } - public List functionalExpr() { - return getRuleContexts(FunctionalExprContext.class); - } - public FunctionalExprContext functionalExpr(int i) { - return getRuleContext(FunctionalExprContext.class,i); - } - public List LOGICAL_UNION_OPERATOR() { return getTokens(BladePhpAntlrParser.LOGICAL_UNION_OPERATOR); } - public TerminalNode LOGICAL_UNION_OPERATOR(int i) { - return getToken(BladePhpAntlrParser.LOGICAL_UNION_OPERATOR, i); - } - public List COMPARISON_OPERATOR() { return getTokens(BladePhpAntlrParser.COMPARISON_OPERATOR); } - public TerminalNode COMPARISON_OPERATOR(int i) { - return getToken(BladePhpAntlrParser.COMPARISON_OPERATOR, i); - } - public LogicalStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_logicalStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterLogicalStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitLogicalStatement(this); - } - } - - public final LogicalStatementContext logicalStatement() throws RecognitionException { - LogicalStatementContext _localctx = new LogicalStatementContext(_ctx, getState()); - enterRule(_localctx, 4, RULE_logicalStatement); - int _la; - try { - setState(126); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,8,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(103); - match(LPAREN); - setState(107); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0)) { - { - { - setState(104); - functionalExpr(); - } - } - setState(109); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(110); - match(RPAREN); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(111); - functionalExpr(); - setState(114); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(112); - match(LOGICAL_UNION_OPERATOR); - setState(113); - functionalExpr(); - } - } - setState(116); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( _la==LOGICAL_UNION_OPERATOR ); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(118); - functionalExpr(); - setState(121); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(119); - match(COMPARISON_OPERATOR); - setState(120); - functionalExpr(); - } - } - setState(123); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( _la==COMPARISON_OPERATOR ); - } - break; - case 4: - enterOuterAlt(_localctx, 4); - { - setState(125); - functionalExpr(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class IfStatementContext extends ParserRuleContext { - public TerminalNode IF() { return getToken(BladePhpAntlrParser.IF, 0); } - public List LPAREN() { return getTokens(BladePhpAntlrParser.LPAREN); } - public TerminalNode LPAREN(int i) { - return getToken(BladePhpAntlrParser.LPAREN, i); - } - public List RPAREN() { return getTokens(BladePhpAntlrParser.RPAREN); } - public TerminalNode RPAREN(int i) { - return getToken(BladePhpAntlrParser.RPAREN, i); - } - public List LCURLYBRACE() { return getTokens(BladePhpAntlrParser.LCURLYBRACE); } - public TerminalNode LCURLYBRACE(int i) { - return getToken(BladePhpAntlrParser.LCURLYBRACE, i); - } - public List RCURLYBRACE() { return getTokens(BladePhpAntlrParser.RCURLYBRACE); } - public TerminalNode RCURLYBRACE(int i) { - return getToken(BladePhpAntlrParser.RCURLYBRACE, i); - } - public List logicalStatement() { - return getRuleContexts(LogicalStatementContext.class); - } - public LogicalStatementContext logicalStatement(int i) { - return getRuleContext(LogicalStatementContext.class,i); - } - public List exprStatement() { - return getRuleContexts(ExprStatementContext.class); - } - public ExprStatementContext exprStatement(int i) { - return getRuleContext(ExprStatementContext.class,i); - } - public List ELSEIF() { return getTokens(BladePhpAntlrParser.ELSEIF); } - public TerminalNode ELSEIF(int i) { - return getToken(BladePhpAntlrParser.ELSEIF, i); - } - public TerminalNode ELSE() { return getToken(BladePhpAntlrParser.ELSE, 0); } - public IfStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_ifStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterIfStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitIfStatement(this); - } - } - - public final IfStatementContext ifStatement() throws RecognitionException { - IfStatementContext _localctx = new IfStatementContext(_ctx, getState()); - enterRule(_localctx, 6, RULE_ifStatement); - int _la; - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(128); - match(IF); - setState(129); - match(LPAREN); - setState(131); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(130); - logicalStatement(); - } - } - setState(133); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253315600L) != 0) ); - setState(135); - match(RPAREN); - setState(136); - match(LCURLYBRACE); - setState(140); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,10,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(137); - exprStatement(); - } - } - } - setState(142); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,10,_ctx); - } - setState(143); - match(RCURLYBRACE); - setState(163); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,13,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(144); - match(ELSEIF); - setState(145); - match(LPAREN); - setState(147); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(146); - logicalStatement(); - } - } - setState(149); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253315600L) != 0) ); - setState(151); - match(RPAREN); - setState(152); - match(LCURLYBRACE); - setState(156); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,12,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(153); - exprStatement(); - } - } - } - setState(158); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,12,_ctx); - } - setState(159); - match(RCURLYBRACE); - } - } - } - setState(165); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,13,_ctx); - } - setState(175); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { - case 1: - { - setState(166); - match(ELSE); - setState(167); - match(LCURLYBRACE); - setState(171); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,14,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(168); - exprStatement(); - } - } - } - setState(173); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,14,_ctx); - } - setState(174); - match(RCURLYBRACE); - } - break; - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class InputExprContext extends ParserRuleContext { - public VarExprContext varExpr() { - return getRuleContext(VarExprContext.class,0); - } - public InputExprContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_inputExpr; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterInputExpr(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitInputExpr(this); - } - } - - public final InputExprContext inputExpr() throws RecognitionException { - InputExprContext _localctx = new InputExprContext(_ctx, getState()); - enterRule(_localctx, 8, RULE_inputExpr); - try { - enterOuterAlt(_localctx, 1); - { - setState(177); - varExpr(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class FunctionalExprContext extends ParserRuleContext { - public MatchStatementContext matchStatement() { - return getRuleContext(MatchStatementContext.class,0); - } - public ClassExpressionContext classExpression() { - return getRuleContext(ClassExpressionContext.class,0); - } - public List classMember() { - return getRuleContexts(ClassMemberContext.class); - } - public ClassMemberContext classMember(int i) { - return getRuleContext(ClassMemberContext.class,i); - } - public FunctionExprContext functionExpr() { - return getRuleContext(FunctionExprContext.class,0); - } - public TerminalNode LANG_CONSTRUCT() { return getToken(BladePhpAntlrParser.LANG_CONSTRUCT, 0); } - public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } - public FunctionalExprContext functionalExpr() { - return getRuleContext(FunctionalExprContext.class,0); - } - public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } - public InputExprContext inputExpr() { - return getRuleContext(InputExprContext.class,0); - } - public FunctionalExprContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_functionalExpr; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterFunctionalExpr(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitFunctionalExpr(this); - } - } - - public final FunctionalExprContext functionalExpr() throws RecognitionException { - FunctionalExprContext _localctx = new FunctionalExprContext(_ctx, getState()); - enterRule(_localctx, 10, RULE_functionalExpr); - try { - int _alt; - setState(194); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,17,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(179); - matchStatement(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(180); - classExpression(); - setState(184); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,16,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(181); - classMember(); - } - } - } - setState(186); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,16,_ctx); - } - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(187); - functionExpr(); - } - break; - case 4: - enterOuterAlt(_localctx, 4); - { - setState(188); - match(LANG_CONSTRUCT); - setState(189); - match(LPAREN); - setState(190); - functionalExpr(); - setState(191); - match(RPAREN); - } - break; - case 5: - enterOuterAlt(_localctx, 5); - { - setState(193); - inputExpr(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ClassExpressionContext extends ParserRuleContext { - public ClassInstanceStatementContext classInstanceStatement() { - return getRuleContext(ClassInstanceStatementContext.class,0); - } - public StaticMethodAccessContext staticMethodAccess() { - return getRuleContext(StaticMethodAccessContext.class,0); - } - public StaticFieldAccessContext staticFieldAccess() { - return getRuleContext(StaticFieldAccessContext.class,0); - } - public StaticClassReferenceContext staticClassReference() { - return getRuleContext(StaticClassReferenceContext.class,0); - } - public StaticAccessContext staticAccess() { - return getRuleContext(StaticAccessContext.class,0); - } - public AliasDirectAccessContext aliasDirectAccess() { - return getRuleContext(AliasDirectAccessContext.class,0); - } - public DirectMethodAccessContext directMethodAccess() { - return getRuleContext(DirectMethodAccessContext.class,0); - } - public ClassExpressionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_classExpression; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterClassExpression(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitClassExpression(this); - } - } - - public final ClassExpressionContext classExpression() throws RecognitionException { - ClassExpressionContext _localctx = new ClassExpressionContext(_ctx, getState()); - enterRule(_localctx, 12, RULE_classExpression); - try { - setState(203); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(196); - classInstanceStatement(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(197); - staticMethodAccess(); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(198); - staticFieldAccess(); - } - break; - case 4: - enterOuterAlt(_localctx, 4); - { - setState(199); - staticClassReference(); - } - break; - case 5: - enterOuterAlt(_localctx, 5); - { - setState(200); - staticAccess(); - } - break; - case 6: - enterOuterAlt(_localctx, 6); - { - setState(201); - aliasDirectAccess(); - } - break; - case 7: - enterOuterAlt(_localctx, 7); - { - setState(202); - directMethodAccess(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ForeachDirectiveStatementContext extends ParserRuleContext { - public ForeachArgumentsContext foreachArguments() { - return getRuleContext(ForeachArgumentsContext.class,0); - } - public ForeachDirectiveStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_foreachDirectiveStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterForeachDirectiveStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitForeachDirectiveStatement(this); - } - } - - public final ForeachDirectiveStatementContext foreachDirectiveStatement() throws RecognitionException { - ForeachDirectiveStatementContext _localctx = new ForeachDirectiveStatementContext(_ctx, getState()); - enterRule(_localctx, 14, RULE_foreachDirectiveStatement); - try { - enterOuterAlt(_localctx, 1); - { - setState(205); - if (!(this.bladeParserContext.equals(ParserContext.FOREACH))) throw new FailedPredicateException(this, "this.bladeParserContext.equals(ParserContext.FOREACH)"); - setState(206); - foreachArguments(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ForeachArgumentsContext extends ParserRuleContext { - public Token main_array; - public Token array_item; - public Token array_key; - public TerminalNode AS() { return getToken(BladePhpAntlrParser.AS, 0); } - public List PHP_VARIABLE() { return getTokens(BladePhpAntlrParser.PHP_VARIABLE); } - public TerminalNode PHP_VARIABLE(int i) { - return getToken(BladePhpAntlrParser.PHP_VARIABLE, i); - } - public ArrayContext array() { - return getRuleContext(ArrayContext.class,0); - } - public TerminalNode ARROW() { return getToken(BladePhpAntlrParser.ARROW, 0); } - public List functionExpr() { - return getRuleContexts(FunctionExprContext.class); - } - public FunctionExprContext functionExpr(int i) { - return getRuleContext(FunctionExprContext.class,i); - } - public ForeachArgumentsContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_foreachArguments; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterForeachArguments(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitForeachArguments(this); - } - } - - public final ForeachArgumentsContext foreachArguments() throws RecognitionException { - ForeachArgumentsContext _localctx = new ForeachArgumentsContext(_ctx, getState()); - enterRule(_localctx, 16, RULE_foreachArguments); - try { - setState(229); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(210); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) { - case 1: - { - setState(208); - array(); - } - break; - case 2: - { - setState(209); - ((ForeachArgumentsContext)_localctx).main_array = match(PHP_VARIABLE); - } - break; - } - setState(212); - match(AS); - setState(213); - ((ForeachArgumentsContext)_localctx).array_item = match(PHP_VARIABLE); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(216); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) { - case 1: - { - setState(214); - array(); - } - break; - case 2: - { - setState(215); - ((ForeachArgumentsContext)_localctx).main_array = match(PHP_VARIABLE); - } - break; - } - setState(218); - match(AS); - setState(219); - ((ForeachArgumentsContext)_localctx).array_key = match(PHP_VARIABLE); - setState(220); - match(ARROW); - setState(221); - ((ForeachArgumentsContext)_localctx).array_item = match(PHP_VARIABLE); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(222); - functionExpr(); - setState(223); - match(AS); - setState(224); - functionExpr(); - setState(227); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,21,_ctx) ) { - case 1: - { - setState(225); - match(ARROW); - setState(226); - functionExpr(); - } - break; - } - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ClassInstanceStatementContext extends ParserRuleContext { - public Token className; - public TerminalNode NEW() { return getToken(BladePhpAntlrParser.NEW, 0); } - public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } - public NamespaceContext namespace() { - return getRuleContext(NamespaceContext.class,0); - } - public ArgumentsContext arguments() { - return getRuleContext(ArgumentsContext.class,0); - } - public ClassInstanceStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_classInstanceStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterClassInstanceStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitClassInstanceStatement(this); - } - } - - public final ClassInstanceStatementContext classInstanceStatement() throws RecognitionException { - ClassInstanceStatementContext _localctx = new ClassInstanceStatementContext(_ctx, getState()); - enterRule(_localctx, 18, RULE_classInstanceStatement); - try { - enterOuterAlt(_localctx, 1); - { - setState(231); - match(NEW); - setState(233); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,23,_ctx) ) { - case 1: - { - setState(232); - namespace(); - } - break; - } - setState(235); - ((ClassInstanceStatementContext)_localctx).className = match(IDENTIFIER); - setState(237); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) { - case 1: - { - setState(236); - arguments(); - } - break; - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class MatchStatementContext extends ParserRuleContext { - public TerminalNode MATCH() { return getToken(BladePhpAntlrParser.MATCH, 0); } - public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } - public List functionalExpr() { - return getRuleContexts(FunctionalExprContext.class); - } - public FunctionalExprContext functionalExpr(int i) { - return getRuleContext(FunctionalExprContext.class,i); - } - public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } - public TerminalNode LCURLYBRACE() { return getToken(BladePhpAntlrParser.LCURLYBRACE, 0); } - public TerminalNode RCURLYBRACE() { return getToken(BladePhpAntlrParser.RCURLYBRACE, 0); } - public List ARROW() { return getTokens(BladePhpAntlrParser.ARROW); } - public TerminalNode ARROW(int i) { - return getToken(BladePhpAntlrParser.ARROW, i); - } - public List COMMA() { return getTokens(BladePhpAntlrParser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(BladePhpAntlrParser.COMMA, i); - } - public MatchStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_matchStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterMatchStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitMatchStatement(this); - } - } - - public final MatchStatementContext matchStatement() throws RecognitionException { - MatchStatementContext _localctx = new MatchStatementContext(_ctx, getState()); - enterRule(_localctx, 20, RULE_matchStatement); - int _la; - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(239); - match(MATCH); - setState(240); - match(LPAREN); - setState(241); - functionalExpr(); - setState(242); - match(RPAREN); - setState(243); - match(LCURLYBRACE); - setState(268); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0)) { - { - { - setState(245); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(244); - functionalExpr(); - } - } - setState(247); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); - setState(257); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==COMMA) { - { - { - setState(249); - match(COMMA); - setState(251); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(250); - functionalExpr(); - } - } - setState(253); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); - } - } - setState(259); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(260); - match(ARROW); - setState(262); - _errHandler.sync(this); - _alt = 1; - do { - switch (_alt) { - case 1: - { - { - setState(261); - functionalExpr(); - } - } - break; - default: - throw new NoViableAltException(this); - } - setState(264); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,28,_ctx); - } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); - } - } - setState(270); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(296); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,34,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(271); - match(COMMA); - setState(273); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(272); - functionalExpr(); - } - } - setState(275); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); - setState(285); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==COMMA) { - { - { - setState(277); - match(COMMA); - setState(279); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(278); - functionalExpr(); - } - } - setState(281); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); - } - } - setState(287); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(288); - match(ARROW); - setState(290); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(289); - functionalExpr(); - } - } - setState(292); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); - } - } - } - setState(298); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,34,_ctx); - } - setState(300); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==COMMA) { - { - setState(299); - match(COMMA); - } - } - - setState(302); - match(RCURLYBRACE); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class StaticClassReferenceContext extends ParserRuleContext { - public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } - public TerminalNode DOUBLE_COLON() { return getToken(BladePhpAntlrParser.DOUBLE_COLON, 0); } - public TerminalNode CLASS() { return getToken(BladePhpAntlrParser.CLASS, 0); } - public NamespaceContext namespace() { - return getRuleContext(NamespaceContext.class,0); - } - public StaticClassReferenceContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_staticClassReference; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterStaticClassReference(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitStaticClassReference(this); - } - } - - public final StaticClassReferenceContext staticClassReference() throws RecognitionException { - StaticClassReferenceContext _localctx = new StaticClassReferenceContext(_ctx, getState()); - enterRule(_localctx, 22, RULE_staticClassReference); - try { - enterOuterAlt(_localctx, 1); - { - setState(305); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { - case 1: - { - setState(304); - namespace(); - } - break; - } - setState(307); - match(IDENTIFIER); - setState(308); - match(DOUBLE_COLON); - setState(309); - match(CLASS); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class StaticMethodAccessContext extends ParserRuleContext { - public Token className; - public Token method; - public TerminalNode DOUBLE_COLON() { return getToken(BladePhpAntlrParser.DOUBLE_COLON, 0); } - public ArgumentsContext arguments() { - return getRuleContext(ArgumentsContext.class,0); - } - public List IDENTIFIER() { return getTokens(BladePhpAntlrParser.IDENTIFIER); } - public TerminalNode IDENTIFIER(int i) { - return getToken(BladePhpAntlrParser.IDENTIFIER, i); - } - public NamespaceContext namespace() { - return getRuleContext(NamespaceContext.class,0); - } - public StaticMethodAccessContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_staticMethodAccess; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterStaticMethodAccess(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitStaticMethodAccess(this); - } - } - - public final StaticMethodAccessContext staticMethodAccess() throws RecognitionException { - StaticMethodAccessContext _localctx = new StaticMethodAccessContext(_ctx, getState()); - enterRule(_localctx, 24, RULE_staticMethodAccess); - try { - enterOuterAlt(_localctx, 1); - { - setState(312); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { - case 1: - { - setState(311); - namespace(); - } - break; - } - setState(314); - ((StaticMethodAccessContext)_localctx).className = match(IDENTIFIER); - setState(315); - match(DOUBLE_COLON); - setState(316); - ((StaticMethodAccessContext)_localctx).method = match(IDENTIFIER); - setState(317); - arguments(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class StaticFieldAccessContext extends ParserRuleContext { - public Token className; - public Token const_; - public Token propertyAlias; - public Token classAlias; - public TerminalNode DOUBLE_COLON() { return getToken(BladePhpAntlrParser.DOUBLE_COLON, 0); } - public List IDENTIFIER() { return getTokens(BladePhpAntlrParser.IDENTIFIER); } - public TerminalNode IDENTIFIER(int i) { - return getToken(BladePhpAntlrParser.IDENTIFIER, i); - } - public TerminalNode CLASS() { return getToken(BladePhpAntlrParser.CLASS, 0); } - public NamespaceContext namespace() { - return getRuleContext(NamespaceContext.class,0); - } - public List PHP_VARIABLE() { return getTokens(BladePhpAntlrParser.PHP_VARIABLE); } - public TerminalNode PHP_VARIABLE(int i) { - return getToken(BladePhpAntlrParser.PHP_VARIABLE, i); - } - public StaticFieldAccessContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_staticFieldAccess; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterStaticFieldAccess(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitStaticFieldAccess(this); - } - } - - public final StaticFieldAccessContext staticFieldAccess() throws RecognitionException { - StaticFieldAccessContext _localctx = new StaticFieldAccessContext(_ctx, getState()); - enterRule(_localctx, 26, RULE_staticFieldAccess); - try { - setState(335); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,40,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(320); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { - case 1: - { - setState(319); - namespace(); - } - break; - } - setState(322); - ((StaticFieldAccessContext)_localctx).className = match(IDENTIFIER); - setState(323); - match(DOUBLE_COLON); - setState(327); - _errHandler.sync(this); - switch (_input.LA(1)) { - case IDENTIFIER: - { - setState(324); - ((StaticFieldAccessContext)_localctx).const_ = match(IDENTIFIER); - } - break; - case PHP_VARIABLE: - { - setState(325); - ((StaticFieldAccessContext)_localctx).propertyAlias = match(PHP_VARIABLE); - } - break; - case CLASS: - { - setState(326); - match(CLASS); - } - break; - default: - throw new NoViableAltException(this); - } - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(329); - ((StaticFieldAccessContext)_localctx).classAlias = match(PHP_VARIABLE); - setState(330); - match(DOUBLE_COLON); - setState(331); - ((StaticFieldAccessContext)_localctx).const_ = match(IDENTIFIER); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(332); - ((StaticFieldAccessContext)_localctx).classAlias = match(PHP_VARIABLE); - setState(333); - match(DOUBLE_COLON); - setState(334); - ((StaticFieldAccessContext)_localctx).propertyAlias = match(PHP_VARIABLE); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class StaticAccessContext extends ParserRuleContext { - public Token className; - public TerminalNode DOUBLE_COLON() { return getToken(BladePhpAntlrParser.DOUBLE_COLON, 0); } - public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } - public NamespaceContext namespace() { - return getRuleContext(NamespaceContext.class,0); - } - public StaticAccessContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_staticAccess; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterStaticAccess(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitStaticAccess(this); - } - } - - public final StaticAccessContext staticAccess() throws RecognitionException { - StaticAccessContext _localctx = new StaticAccessContext(_ctx, getState()); - enterRule(_localctx, 28, RULE_staticAccess); - try { - enterOuterAlt(_localctx, 1); - { - setState(338); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { - case 1: - { - setState(337); - namespace(); - } - break; - } - setState(340); - ((StaticAccessContext)_localctx).className = match(IDENTIFIER); - setState(341); - match(DOUBLE_COLON); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class AliasDirectAccessContext extends ParserRuleContext { - public TerminalNode PHP_VARIABLE() { return getToken(BladePhpAntlrParser.PHP_VARIABLE, 0); } - public ClassMemberContext classMember() { - return getRuleContext(ClassMemberContext.class,0); - } - public AliasDirectAccessContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_aliasDirectAccess; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterAliasDirectAccess(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitAliasDirectAccess(this); - } - } - - public final AliasDirectAccessContext aliasDirectAccess() throws RecognitionException { - AliasDirectAccessContext _localctx = new AliasDirectAccessContext(_ctx, getState()); - enterRule(_localctx, 30, RULE_aliasDirectAccess); - try { - enterOuterAlt(_localctx, 1); - { - setState(343); - match(PHP_VARIABLE); - setState(344); - classMember(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ClassMemberContext extends ParserRuleContext { - public DirectMethodAccessContext directMethodAccess() { - return getRuleContext(DirectMethodAccessContext.class,0); - } - public TerminalNode OBJECT_OPERATOR() { return getToken(BladePhpAntlrParser.OBJECT_OPERATOR, 0); } - public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } - public ClassMemberContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_classMember; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterClassMember(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitClassMember(this); - } - } - - public final ClassMemberContext classMember() throws RecognitionException { - ClassMemberContext _localctx = new ClassMemberContext(_ctx, getState()); - enterRule(_localctx, 32, RULE_classMember); - try { - setState(349); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(346); - directMethodAccess(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(347); - match(OBJECT_OPERATOR); - setState(348); - match(IDENTIFIER); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class DirectMethodAccessContext extends ParserRuleContext { - public TerminalNode OBJECT_OPERATOR() { return getToken(BladePhpAntlrParser.OBJECT_OPERATOR, 0); } - public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } - public ArgumentsContext arguments() { - return getRuleContext(ArgumentsContext.class,0); - } - public DirectMethodAccessContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_directMethodAccess; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterDirectMethodAccess(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitDirectMethodAccess(this); - } - } - - public final DirectMethodAccessContext directMethodAccess() throws RecognitionException { - DirectMethodAccessContext _localctx = new DirectMethodAccessContext(_ctx, getState()); - enterRule(_localctx, 34, RULE_directMethodAccess); - try { - enterOuterAlt(_localctx, 1); - { - setState(351); - match(OBJECT_OPERATOR); - setState(352); - match(IDENTIFIER); - setState(353); - arguments(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class DirectAccessContext extends ParserRuleContext { - public List IDENTIFIER() { return getTokens(BladePhpAntlrParser.IDENTIFIER); } - public TerminalNode IDENTIFIER(int i) { - return getToken(BladePhpAntlrParser.IDENTIFIER, i); - } - public List arguments() { - return getRuleContexts(ArgumentsContext.class); - } - public ArgumentsContext arguments(int i) { - return getRuleContext(ArgumentsContext.class,i); - } - public TerminalNode OBJECT_OPERATOR() { return getToken(BladePhpAntlrParser.OBJECT_OPERATOR, 0); } - public DirectAccessContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_directAccess; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterDirectAccess(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitDirectAccess(this); - } - } - - public final DirectAccessContext directAccess() throws RecognitionException { - DirectAccessContext _localctx = new DirectAccessContext(_ctx, getState()); - enterRule(_localctx, 36, RULE_directAccess); - try { - enterOuterAlt(_localctx, 1); - { - setState(355); - match(IDENTIFIER); - setState(356); - arguments(); - setState(357); - match(OBJECT_OPERATOR); - setState(358); - match(IDENTIFIER); - setState(359); - arguments(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class FunctionExprContext extends ParserRuleContext { - public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } - public ArgumentsContext arguments() { - return getRuleContext(ArgumentsContext.class,0); - } - public FunctionExprContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_functionExpr; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterFunctionExpr(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitFunctionExpr(this); - } - } - - public final FunctionExprContext functionExpr() throws RecognitionException { - FunctionExprContext _localctx = new FunctionExprContext(_ctx, getState()); - enterRule(_localctx, 38, RULE_functionExpr); - try { - enterOuterAlt(_localctx, 1); - { - setState(361); - match(IDENTIFIER); - setState(362); - arguments(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ArgumentsContext extends ParserRuleContext { - public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } - public List argument() { - return getRuleContexts(ArgumentContext.class); - } - public ArgumentContext argument(int i) { - return getRuleContext(ArgumentContext.class,i); - } - public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } - public List COMMA() { return getTokens(BladePhpAntlrParser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(BladePhpAntlrParser.COMMA, i); - } - public ArgumentsContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_arguments; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterArguments(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitArguments(this); - } - } - - public final ArgumentsContext arguments() throws RecognitionException { - ArgumentsContext _localctx = new ArgumentsContext(_ctx, getState()); - enterRule(_localctx, 40, RULE_arguments); - int _la; - try { - setState(377); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(364); - match(LPAREN); - setState(365); - argument(); - setState(370); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==COMMA) { - { - { - setState(366); - match(COMMA); - setState(367); - argument(); - } - } - setState(372); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(373); - match(RPAREN); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(375); - match(LPAREN); - setState(376); - match(RPAREN); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class NamespaceContext extends ParserRuleContext { - public List NAMESPACE_SEPARATOR() { return getTokens(BladePhpAntlrParser.NAMESPACE_SEPARATOR); } - public TerminalNode NAMESPACE_SEPARATOR(int i) { - return getToken(BladePhpAntlrParser.NAMESPACE_SEPARATOR, i); - } - public List IDENTIFIER() { return getTokens(BladePhpAntlrParser.IDENTIFIER); } - public TerminalNode IDENTIFIER(int i) { - return getToken(BladePhpAntlrParser.IDENTIFIER, i); - } - public NamespaceContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_namespace; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterNamespace(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitNamespace(this); - } - } - - public final NamespaceContext namespace() throws RecognitionException { - NamespaceContext _localctx = new NamespaceContext(_ctx, getState()); - enterRule(_localctx, 42, RULE_namespace); - int _la; - try { - int _alt; - setState(389); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(380); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==NAMESPACE_SEPARATOR) { - { - setState(379); - match(NAMESPACE_SEPARATOR); - } - } - - setState(384); - _errHandler.sync(this); - _alt = 1; - do { - switch (_alt) { - case 1: - { - { - setState(382); - match(IDENTIFIER); - setState(383); - match(NAMESPACE_SEPARATOR); - } - } - break; - default: - throw new NoViableAltException(this); - } - setState(386); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,46,_ctx); - } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(388); - match(NAMESPACE_SEPARATOR); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ArgumentContext extends ParserRuleContext { - public FunctionalExprContext functionalExpr() { - return getRuleContext(FunctionalExprContext.class,0); - } - public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } - public ArgumentContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_argument; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterArgument(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitArgument(this); - } - } - - public final ArgumentContext argument() throws RecognitionException { - ArgumentContext _localctx = new ArgumentContext(_ctx, getState()); - enterRule(_localctx, 44, RULE_argument); - try { - setState(393); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(391); - functionalExpr(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(392); - match(IDENTIFIER); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ArrayContext extends ParserRuleContext { - public TerminalNode PHP_VARIABLE() { return getToken(BladePhpAntlrParser.PHP_VARIABLE, 0); } - public List array_key_item() { - return getRuleContexts(Array_key_itemContext.class); - } - public Array_key_itemContext array_key_item(int i) { - return getRuleContext(Array_key_itemContext.class,i); - } - public ArrayContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_array; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterArray(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitArray(this); - } - } - - public final ArrayContext array() throws RecognitionException { - ArrayContext _localctx = new ArrayContext(_ctx, getState()); - enterRule(_localctx, 46, RULE_array); - try { - int _alt; - setState(402); - _errHandler.sync(this); - switch (_input.LA(1)) { - case PHP_VARIABLE: - enterOuterAlt(_localctx, 1); - { - setState(395); - match(PHP_VARIABLE); - setState(397); - _errHandler.sync(this); - _alt = 1; - do { - switch (_alt) { - case 1: - { - { - setState(396); - array_key_item(); - } - } - break; - default: - throw new NoViableAltException(this); - } - setState(399); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,49,_ctx); - } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); - } - break; - case ARRAY: - case LSQUAREBRACKET: - enterOuterAlt(_localctx, 2); - { - setState(401); - array_key_item(); - } - break; - default: - throw new NoViableAltException(this); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Array_key_itemContext extends ParserRuleContext { - public TerminalNode LSQUAREBRACKET() { return getToken(BladePhpAntlrParser.LSQUAREBRACKET, 0); } - public TerminalNode RSQUAREBRACKET() { return getToken(BladePhpAntlrParser.RSQUAREBRACKET, 0); } - public List array_key_item() { - return getRuleContexts(Array_key_itemContext.class); - } - public Array_key_itemContext array_key_item(int i) { - return getRuleContext(Array_key_itemContext.class,i); - } - public TerminalNode ARRAY() { return getToken(BladePhpAntlrParser.ARRAY, 0); } - public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } - public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } - public List array_child() { - return getRuleContexts(Array_childContext.class); - } - public Array_childContext array_child(int i) { - return getRuleContext(Array_childContext.class,i); - } - public List ARROW() { return getTokens(BladePhpAntlrParser.ARROW); } - public TerminalNode ARROW(int i) { - return getToken(BladePhpAntlrParser.ARROW, i); - } - public List COMMA() { return getTokens(BladePhpAntlrParser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(BladePhpAntlrParser.COMMA, i); - } - public Array_key_itemContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_array_key_item; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterArray_key_item(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitArray_key_item(this); - } - } - - public final Array_key_itemContext array_key_item() throws RecognitionException { - Array_key_itemContext _localctx = new Array_key_itemContext(_ctx, getState()); - enterRule(_localctx, 48, RULE_array_key_item); - int _la; - try { - int _alt; - setState(473); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(404); - match(LSQUAREBRACKET); - setState(408); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==ARRAY || _la==LSQUAREBRACKET) { - { - { - setState(405); - array_key_item(); - } - } - setState(410); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(411); - match(RSQUAREBRACKET); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(412); - match(ARRAY); - setState(413); - match(LPAREN); - setState(417); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==ARRAY || _la==LSQUAREBRACKET) { - { - { - setState(414); - array_key_item(); - } - } - setState(419); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(420); - match(RPAREN); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(421); - match(LSQUAREBRACKET); - setState(426); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(422); - array_child(); - setState(423); - match(ARROW); - setState(424); - array_key_item(); - } - } - setState(428); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); - setState(430); - match(RSQUAREBRACKET); - } - break; - case 4: - enterOuterAlt(_localctx, 4); - { - setState(432); - match(ARRAY); - setState(433); - match(LPAREN); - setState(438); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(434); - array_child(); - setState(435); - match(ARROW); - setState(436); - array_key_item(); - } - } - setState(440); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); - setState(442); - match(RPAREN); - } - break; - case 5: - enterOuterAlt(_localctx, 5); - { - setState(444); - match(LSQUAREBRACKET); - setState(445); - array_child(); - setState(450); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,55,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(446); - match(COMMA); - setState(447); - array_child(); - } - } - } - setState(452); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,55,_ctx); - } - setState(454); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==COMMA) { - { - setState(453); - match(COMMA); - } - } - - setState(456); - match(RSQUAREBRACKET); - } - break; - case 6: - enterOuterAlt(_localctx, 6); - { - setState(458); - match(ARRAY); - setState(459); - match(LPAREN); - setState(460); - array_child(); - setState(465); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,57,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(461); - match(COMMA); - setState(462); - array_child(); - } - } - } - setState(467); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,57,_ctx); - } - setState(469); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==COMMA) { - { - setState(468); - match(COMMA); - } - } - - setState(471); - match(RPAREN); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Array_childContext extends ParserRuleContext { - public List functionalExpr() { - return getRuleContexts(FunctionalExprContext.class); - } - public FunctionalExprContext functionalExpr(int i) { - return getRuleContext(FunctionalExprContext.class,i); - } - public TerminalNode ARROW() { return getToken(BladePhpAntlrParser.ARROW, 0); } - public Array_key_itemContext array_key_item() { - return getRuleContext(Array_key_itemContext.class,0); - } - public Array_childContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_array_child; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterArray_child(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitArray_child(this); - } - } - - public final Array_childContext array_child() throws RecognitionException { - Array_childContext _localctx = new Array_childContext(_ctx, getState()); - enterRule(_localctx, 50, RULE_array_child); - try { - setState(484); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(475); - functionalExpr(); - setState(476); - match(ARROW); - setState(477); - array_key_item(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(479); - functionalExpr(); - setState(480); - match(ARROW); - setState(481); - functionalExpr(); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(483); - functionalExpr(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class VarExprContext extends ParserRuleContext { - public ArrayContext array() { - return getRuleContext(ArrayContext.class,0); - } - public TerminalNode PHP_VARIABLE() { return getToken(BladePhpAntlrParser.PHP_VARIABLE, 0); } - public TerminalNode DOLLAR() { return getToken(BladePhpAntlrParser.DOLLAR, 0); } - public TerminalNode STRING_LITERAL() { return getToken(BladePhpAntlrParser.STRING_LITERAL, 0); } - public VarExprContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_varExpr; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterVarExpr(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitVarExpr(this); - } - } - - public final VarExprContext varExpr() throws RecognitionException { - VarExprContext _localctx = new VarExprContext(_ctx, getState()); - enterRule(_localctx, 52, RULE_varExpr); - int _la; - try { - setState(492); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,62,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(486); - array(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(488); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==DOLLAR) { - { - setState(487); - match(DOLLAR); - } - } - - setState(490); - match(PHP_VARIABLE); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(491); - match(STRING_LITERAL); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class MiscContext extends ParserRuleContext { - public Token className; - public TerminalNode NEW() { return getToken(BladePhpAntlrParser.NEW, 0); } - public TerminalNode PHP_VARIABLE() { return getToken(BladePhpAntlrParser.PHP_VARIABLE, 0); } - public ArgumentsContext arguments() { - return getRuleContext(ArgumentsContext.class,0); - } - public NamespaceContext namespace() { - return getRuleContext(NamespaceContext.class,0); - } - public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } - public MiscContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_misc; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterMisc(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitMisc(this); - } - } - - public final MiscContext misc() throws RecognitionException { - MiscContext _localctx = new MiscContext(_ctx, getState()); - enterRule(_localctx, 54, RULE_misc); - try { - setState(504); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(494); - match(NEW); - setState(495); - match(PHP_VARIABLE); - setState(497); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { - case 1: - { - setState(496); - arguments(); - } - break; - } - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(499); - match(NEW); - setState(500); - namespace(); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(501); - namespace(); - setState(502); - ((MiscContext)_localctx).className = match(IDENTIFIER); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class OutputContext extends ParserRuleContext { - public TerminalNode ECHO() { return getToken(BladePhpAntlrParser.ECHO, 0); } - public FunctionalExprContext functionalExpr() { - return getRuleContext(FunctionalExprContext.class,0); - } - public OutputContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_output; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterOutput(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitOutput(this); - } - } - - public final OutputContext output() throws RecognitionException { - OutputContext _localctx = new OutputContext(_ctx, getState()); - enterRule(_localctx, 56, RULE_output); - try { - enterOuterAlt(_localctx, 1); - { - setState(506); - match(ECHO); - setState(507); - functionalExpr(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { - switch (ruleIndex) { - case 7: - return foreachDirectiveStatement_sempred((ForeachDirectiveStatementContext)_localctx, predIndex); - } - return true; - } - private boolean foreachDirectiveStatement_sempred(ForeachDirectiveStatementContext _localctx, int predIndex) { - switch (predIndex) { - case 0: - return this.bladeParserContext.equals(ParserContext.FOREACH); - } - return true; - } - - public static final String _serializedATN = - "\u0004\u0001,\u01fe\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ - "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ - "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ - "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ - "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"+ - "\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012"+ - "\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015"+ - "\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018"+ - "\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007\u001b"+ - "\u0002\u001c\u0007\u001c\u0001\u0000\u0005\u0000<\b\u0000\n\u0000\f\u0000"+ - "?\t\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0005\u0001F\b\u0001\n\u0001\f\u0001I\t\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0005\u0001N\b\u0001\n\u0001\f\u0001Q\t\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0001X\b\u0001"+ - "\u000b\u0001\f\u0001Y\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0003\u0001f\b\u0001\u0001\u0002\u0001\u0002\u0005\u0002j\b\u0002\n\u0002"+ - "\f\u0002m\t\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0004"+ - "\u0002s\b\u0002\u000b\u0002\f\u0002t\u0001\u0002\u0001\u0002\u0001\u0002"+ - "\u0004\u0002z\b\u0002\u000b\u0002\f\u0002{\u0001\u0002\u0003\u0002\u007f"+ - "\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0004\u0003\u0084\b\u0003"+ - "\u000b\u0003\f\u0003\u0085\u0001\u0003\u0001\u0003\u0001\u0003\u0005\u0003"+ - "\u008b\b\u0003\n\u0003\f\u0003\u008e\t\u0003\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0001\u0003\u0004\u0003\u0094\b\u0003\u000b\u0003\f\u0003\u0095"+ - "\u0001\u0003\u0001\u0003\u0001\u0003\u0005\u0003\u009b\b\u0003\n\u0003"+ - "\f\u0003\u009e\t\u0003\u0001\u0003\u0001\u0003\u0005\u0003\u00a2\b\u0003"+ - "\n\u0003\f\u0003\u00a5\t\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0005"+ - "\u0003\u00aa\b\u0003\n\u0003\f\u0003\u00ad\t\u0003\u0001\u0003\u0003\u0003"+ - "\u00b0\b\u0003\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005"+ - "\u0005\u0005\u00b7\b\u0005\n\u0005\f\u0005\u00ba\t\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003"+ - "\u0005\u00c3\b\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0003\u0006\u00cc\b\u0006\u0001\u0007\u0001"+ - "\u0007\u0001\u0007\u0001\b\u0001\b\u0003\b\u00d3\b\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0003\b\u00d9\b\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0003\b\u00e4\b\b\u0003\b\u00e6\b\b\u0001\t"+ - "\u0001\t\u0003\t\u00ea\b\t\u0001\t\u0001\t\u0003\t\u00ee\b\t\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0004\n\u00f6\b\n\u000b\n\f\n\u00f7"+ - "\u0001\n\u0001\n\u0004\n\u00fc\b\n\u000b\n\f\n\u00fd\u0005\n\u0100\b\n"+ - "\n\n\f\n\u0103\t\n\u0001\n\u0001\n\u0004\n\u0107\b\n\u000b\n\f\n\u0108"+ - "\u0005\n\u010b\b\n\n\n\f\n\u010e\t\n\u0001\n\u0001\n\u0004\n\u0112\b\n"+ - "\u000b\n\f\n\u0113\u0001\n\u0001\n\u0004\n\u0118\b\n\u000b\n\f\n\u0119"+ - "\u0005\n\u011c\b\n\n\n\f\n\u011f\t\n\u0001\n\u0001\n\u0004\n\u0123\b\n"+ - "\u000b\n\f\n\u0124\u0005\n\u0127\b\n\n\n\f\n\u012a\t\n\u0001\n\u0003\n"+ - "\u012d\b\n\u0001\n\u0001\n\u0001\u000b\u0003\u000b\u0132\b\u000b\u0001"+ - "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0003\f\u0139\b\f\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0003\r\u0141\b\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0003\r\u0148\b\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0003\r\u0150\b\r\u0001\u000e\u0003\u000e\u0153\b\u000e"+ - "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f"+ - "\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u015e\b\u0010\u0001\u0011"+ - "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012"+ - "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013"+ - "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0005\u0014\u0171\b\u0014"+ - "\n\u0014\f\u0014\u0174\t\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ - "\u0014\u0003\u0014\u017a\b\u0014\u0001\u0015\u0003\u0015\u017d\b\u0015"+ - "\u0001\u0015\u0001\u0015\u0004\u0015\u0181\b\u0015\u000b\u0015\f\u0015"+ - "\u0182\u0001\u0015\u0003\u0015\u0186\b\u0015\u0001\u0016\u0001\u0016\u0003"+ - "\u0016\u018a\b\u0016\u0001\u0017\u0001\u0017\u0004\u0017\u018e\b\u0017"+ - "\u000b\u0017\f\u0017\u018f\u0001\u0017\u0003\u0017\u0193\b\u0017\u0001"+ - "\u0018\u0001\u0018\u0005\u0018\u0197\b\u0018\n\u0018\f\u0018\u019a\t\u0018"+ - "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0005\u0018\u01a0\b\u0018"+ - "\n\u0018\f\u0018\u01a3\t\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0004\u0018\u01ab\b\u0018\u000b\u0018\f"+ - "\u0018\u01ac\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ - "\u0001\u0018\u0001\u0018\u0001\u0018\u0004\u0018\u01b7\b\u0018\u000b\u0018"+ - "\f\u0018\u01b8\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ - "\u0001\u0018\u0005\u0018\u01c1\b\u0018\n\u0018\f\u0018\u01c4\t\u0018\u0001"+ - "\u0018\u0003\u0018\u01c7\b\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0005\u0018\u01d0\b\u0018\n"+ - "\u0018\f\u0018\u01d3\t\u0018\u0001\u0018\u0003\u0018\u01d6\b\u0018\u0001"+ - "\u0018\u0001\u0018\u0003\u0018\u01da\b\u0018\u0001\u0019\u0001\u0019\u0001"+ - "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ - "\u0019\u0003\u0019\u01e5\b\u0019\u0001\u001a\u0001\u001a\u0003\u001a\u01e9"+ - "\b\u001a\u0001\u001a\u0001\u001a\u0003\u001a\u01ed\b\u001a\u0001\u001b"+ - "\u0001\u001b\u0001\u001b\u0003\u001b\u01f2\b\u001b\u0001\u001b\u0001\u001b"+ - "\u0001\u001b\u0001\u001b\u0001\u001b\u0003\u001b\u01f9\b\u001b\u0001\u001c"+ - "\u0001\u001c\u0001\u001c\u0001\u001c\u0000\u0000\u001d\u0000\u0002\u0004"+ - "\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \""+ - "$&(*,.02468\u0000\u0000\u023e\u0000=\u0001\u0000\u0000\u0000\u0002e\u0001"+ - "\u0000\u0000\u0000\u0004~\u0001\u0000\u0000\u0000\u0006\u0080\u0001\u0000"+ - "\u0000\u0000\b\u00b1\u0001\u0000\u0000\u0000\n\u00c2\u0001\u0000\u0000"+ - "\u0000\f\u00cb\u0001\u0000\u0000\u0000\u000e\u00cd\u0001\u0000\u0000\u0000"+ - "\u0010\u00e5\u0001\u0000\u0000\u0000\u0012\u00e7\u0001\u0000\u0000\u0000"+ - "\u0014\u00ef\u0001\u0000\u0000\u0000\u0016\u0131\u0001\u0000\u0000\u0000"+ - "\u0018\u0138\u0001\u0000\u0000\u0000\u001a\u014f\u0001\u0000\u0000\u0000"+ - "\u001c\u0152\u0001\u0000\u0000\u0000\u001e\u0157\u0001\u0000\u0000\u0000"+ - " \u015d\u0001\u0000\u0000\u0000\"\u015f\u0001\u0000\u0000\u0000$\u0163"+ - "\u0001\u0000\u0000\u0000&\u0169\u0001\u0000\u0000\u0000(\u0179\u0001\u0000"+ - "\u0000\u0000*\u0185\u0001\u0000\u0000\u0000,\u0189\u0001\u0000\u0000\u0000"+ - ".\u0192\u0001\u0000\u0000\u00000\u01d9\u0001\u0000\u0000\u00002\u01e4"+ - "\u0001\u0000\u0000\u00004\u01ec\u0001\u0000\u0000\u00006\u01f8\u0001\u0000"+ - "\u0000\u00008\u01fa\u0001\u0000\u0000\u0000:<\u0003\u0002\u0001\u0000"+ - ";:\u0001\u0000\u0000\u0000\u0001\u0000\u0000\u0000>@\u0001\u0000\u0000\u0000?=\u0001\u0000"+ - "\u0000\u0000@A\u0005\u0000\u0000\u0001A\u0001\u0001\u0000\u0000\u0000"+ - "Bf\u0005\u001e\u0000\u0000CG\u0005\u0015\u0000\u0000DF\u0003\u0002\u0001"+ - "\u0000ED\u0001\u0000\u0000\u0000FI\u0001\u0000\u0000\u0000GE\u0001\u0000"+ - "\u0000\u0000GH\u0001\u0000\u0000\u0000HJ\u0001\u0000\u0000\u0000IG\u0001"+ - "\u0000\u0000\u0000Jf\u0005\u0016\u0000\u0000KO\u0005\u0011\u0000\u0000"+ - "LN\u0003\u0002\u0001\u0000ML\u0001\u0000\u0000\u0000NQ\u0001\u0000\u0000"+ - "\u0000OM\u0001\u0000\u0000\u0000OP\u0001\u0000\u0000\u0000PR\u0001\u0000"+ - "\u0000\u0000QO\u0001\u0000\u0000\u0000Rf\u0005\u0012\u0000\u0000ST\u0005"+ - "\u001f\u0000\u0000Tf\u0003\u0002\u0001\u0000UW\u0005 \u0000\u0000VX\u0003"+ - "\n\u0005\u0000WV\u0001\u0000\u0000\u0000XY\u0001\u0000\u0000\u0000YW\u0001"+ - "\u0000\u0000\u0000YZ\u0001\u0000\u0000\u0000Zf\u0001\u0000\u0000\u0000"+ - "[\\\u0005\u000f\u0000\u0000\\]\u0005\u0011\u0000\u0000]^\u0003\u0010\b"+ - "\u0000^_\u0005\u0012\u0000\u0000_f\u0001\u0000\u0000\u0000`f\u0003\n\u0005"+ - "\u0000af\u0003\u0006\u0003\u0000bf\u0003\u000e\u0007\u0000cf\u00038\u001c"+ - "\u0000df\u00036\u001b\u0000eB\u0001\u0000\u0000\u0000eC\u0001\u0000\u0000"+ - "\u0000eK\u0001\u0000\u0000\u0000eS\u0001\u0000\u0000\u0000eU\u0001\u0000"+ - "\u0000\u0000e[\u0001\u0000\u0000\u0000e`\u0001\u0000\u0000\u0000ea\u0001"+ - "\u0000\u0000\u0000eb\u0001\u0000\u0000\u0000ec\u0001\u0000\u0000\u0000"+ - "ed\u0001\u0000\u0000\u0000f\u0003\u0001\u0000\u0000\u0000gk\u0005\u0011"+ - "\u0000\u0000hj\u0003\n\u0005\u0000ih\u0001\u0000\u0000\u0000jm\u0001\u0000"+ - "\u0000\u0000ki\u0001\u0000\u0000\u0000kl\u0001\u0000\u0000\u0000ln\u0001"+ - "\u0000\u0000\u0000mk\u0001\u0000\u0000\u0000n\u007f\u0005\u0012\u0000"+ - "\u0000or\u0003\n\u0005\u0000pq\u0005 \u0000\u0000qs\u0003\n\u0005\u0000"+ - "rp\u0001\u0000\u0000\u0000st\u0001\u0000\u0000\u0000tr\u0001\u0000\u0000"+ - "\u0000tu\u0001\u0000\u0000\u0000u\u007f\u0001\u0000\u0000\u0000vy\u0003"+ - "\n\u0005\u0000wx\u0005\u001f\u0000\u0000xz\u0003\n\u0005\u0000yw\u0001"+ - "\u0000\u0000\u0000z{\u0001\u0000\u0000\u0000{y\u0001\u0000\u0000\u0000"+ - "{|\u0001\u0000\u0000\u0000|\u007f\u0001\u0000\u0000\u0000}\u007f\u0003"+ - "\n\u0005\u0000~g\u0001\u0000\u0000\u0000~o\u0001\u0000\u0000\u0000~v\u0001"+ - "\u0000\u0000\u0000~}\u0001\u0000\u0000\u0000\u007f\u0005\u0001\u0000\u0000"+ - "\u0000\u0080\u0081\u0005\u0007\u0000\u0000\u0081\u0083\u0005\u0011\u0000"+ - "\u0000\u0082\u0084\u0003\u0004\u0002\u0000\u0083\u0082\u0001\u0000\u0000"+ - "\u0000\u0084\u0085\u0001\u0000\u0000\u0000\u0085\u0083\u0001\u0000\u0000"+ - "\u0000\u0085\u0086\u0001\u0000\u0000\u0000\u0086\u0087\u0001\u0000\u0000"+ - "\u0000\u0087\u0088\u0005\u0012\u0000\u0000\u0088\u008c\u0005\u0015\u0000"+ - "\u0000\u0089\u008b\u0003\u0002\u0001\u0000\u008a\u0089\u0001\u0000\u0000"+ - "\u0000\u008b\u008e\u0001\u0000\u0000\u0000\u008c\u008a\u0001\u0000\u0000"+ - "\u0000\u008c\u008d\u0001\u0000\u0000\u0000\u008d\u008f\u0001\u0000\u0000"+ - "\u0000\u008e\u008c\u0001\u0000\u0000\u0000\u008f\u00a3\u0005\u0016\u0000"+ - "\u0000\u0090\u0091\u0005\b\u0000\u0000\u0091\u0093\u0005\u0011\u0000\u0000"+ - "\u0092\u0094\u0003\u0004\u0002\u0000\u0093\u0092\u0001\u0000\u0000\u0000"+ - "\u0094\u0095\u0001\u0000\u0000\u0000\u0095\u0093\u0001\u0000\u0000\u0000"+ - "\u0095\u0096\u0001\u0000\u0000\u0000\u0096\u0097\u0001\u0000\u0000\u0000"+ - "\u0097\u0098\u0005\u0012\u0000\u0000\u0098\u009c\u0005\u0015\u0000\u0000"+ - "\u0099\u009b\u0003\u0002\u0001\u0000\u009a\u0099\u0001\u0000\u0000\u0000"+ - "\u009b\u009e\u0001\u0000\u0000\u0000\u009c\u009a\u0001\u0000\u0000\u0000"+ - "\u009c\u009d\u0001\u0000\u0000\u0000\u009d\u009f\u0001\u0000\u0000\u0000"+ - "\u009e\u009c\u0001\u0000\u0000\u0000\u009f\u00a0\u0005\u0016\u0000\u0000"+ - "\u00a0\u00a2\u0001\u0000\u0000\u0000\u00a1\u0090\u0001\u0000\u0000\u0000"+ - "\u00a2\u00a5\u0001\u0000\u0000\u0000\u00a3\u00a1\u0001\u0000\u0000\u0000"+ - "\u00a3\u00a4\u0001\u0000\u0000\u0000\u00a4\u00af\u0001\u0000\u0000\u0000"+ - "\u00a5\u00a3\u0001\u0000\u0000\u0000\u00a6\u00a7\u0005\t\u0000\u0000\u00a7"+ - "\u00ab\u0005\u0015\u0000\u0000\u00a8\u00aa\u0003\u0002\u0001\u0000\u00a9"+ - "\u00a8\u0001\u0000\u0000\u0000\u00aa\u00ad\u0001\u0000\u0000\u0000\u00ab"+ - "\u00a9\u0001\u0000\u0000\u0000\u00ab\u00ac\u0001\u0000\u0000\u0000\u00ac"+ - "\u00ae\u0001\u0000\u0000\u0000\u00ad\u00ab\u0001\u0000\u0000\u0000\u00ae"+ - "\u00b0\u0005\u0016\u0000\u0000\u00af\u00a6\u0001\u0000\u0000\u0000\u00af"+ - "\u00b0\u0001\u0000\u0000\u0000\u00b0\u0007\u0001\u0000\u0000\u0000\u00b1"+ - "\u00b2\u00034\u001a\u0000\u00b2\t\u0001\u0000\u0000\u0000\u00b3\u00c3"+ - "\u0003\u0014\n\u0000\u00b4\u00b8\u0003\f\u0006\u0000\u00b5\u00b7\u0003"+ - " \u0010\u0000\u00b6\u00b5\u0001\u0000\u0000\u0000\u00b7\u00ba\u0001\u0000"+ - "\u0000\u0000\u00b8\u00b6\u0001\u0000\u0000\u0000\u00b8\u00b9\u0001\u0000"+ - "\u0000\u0000\u00b9\u00c3\u0001\u0000\u0000\u0000\u00ba\u00b8\u0001\u0000"+ - "\u0000\u0000\u00bb\u00c3\u0003&\u0013\u0000\u00bc\u00bd\u0005\r\u0000"+ - "\u0000\u00bd\u00be\u0005\u0011\u0000\u0000\u00be\u00bf\u0003\n\u0005\u0000"+ - "\u00bf\u00c0\u0005\u0012\u0000\u0000\u00c0\u00c3\u0001\u0000\u0000\u0000"+ - "\u00c1\u00c3\u0003\b\u0004\u0000\u00c2\u00b3\u0001\u0000\u0000\u0000\u00c2"+ - "\u00b4\u0001\u0000\u0000\u0000\u00c2\u00bb\u0001\u0000\u0000\u0000\u00c2"+ - "\u00bc\u0001\u0000\u0000\u0000\u00c2\u00c1\u0001\u0000\u0000\u0000\u00c3"+ - "\u000b\u0001\u0000\u0000\u0000\u00c4\u00cc\u0003\u0012\t\u0000\u00c5\u00cc"+ - "\u0003\u0018\f\u0000\u00c6\u00cc\u0003\u001a\r\u0000\u00c7\u00cc\u0003"+ - "\u0016\u000b\u0000\u00c8\u00cc\u0003\u001c\u000e\u0000\u00c9\u00cc\u0003"+ - "\u001e\u000f\u0000\u00ca\u00cc\u0003\"\u0011\u0000\u00cb\u00c4\u0001\u0000"+ - "\u0000\u0000\u00cb\u00c5\u0001\u0000\u0000\u0000\u00cb\u00c6\u0001\u0000"+ - "\u0000\u0000\u00cb\u00c7\u0001\u0000\u0000\u0000\u00cb\u00c8\u0001\u0000"+ - "\u0000\u0000\u00cb\u00c9\u0001\u0000\u0000\u0000\u00cb\u00ca\u0001\u0000"+ - "\u0000\u0000\u00cc\r\u0001\u0000\u0000\u0000\u00cd\u00ce\u0004\u0007\u0000"+ - "\u0000\u00ce\u00cf\u0003\u0010\b\u0000\u00cf\u000f\u0001\u0000\u0000\u0000"+ - "\u00d0\u00d3\u0003.\u0017\u0000\u00d1\u00d3\u0005\u0018\u0000\u0000\u00d2"+ - "\u00d0\u0001\u0000\u0000\u0000\u00d2\u00d1\u0001\u0000\u0000\u0000\u00d3"+ - "\u00d4\u0001\u0000\u0000\u0000\u00d4\u00d5\u0005\u0005\u0000\u0000\u00d5"+ - "\u00e6\u0005\u0018\u0000\u0000\u00d6\u00d9\u0003.\u0017\u0000\u00d7\u00d9"+ - "\u0005\u0018\u0000\u0000\u00d8\u00d6\u0001\u0000\u0000\u0000\u00d8\u00d7"+ - "\u0001\u0000\u0000\u0000\u00d9\u00da\u0001\u0000\u0000\u0000\u00da\u00db"+ - "\u0005\u0005\u0000\u0000\u00db\u00dc\u0005\u0018\u0000\u0000\u00dc\u00dd"+ - "\u0005\u001c\u0000\u0000\u00dd\u00e6\u0005\u0018\u0000\u0000\u00de\u00df"+ - "\u0003&\u0013\u0000\u00df\u00e0\u0005\u0005\u0000\u0000\u00e0\u00e3\u0003"+ - "&\u0013\u0000\u00e1\u00e2\u0005\u001c\u0000\u0000\u00e2\u00e4\u0003&\u0013"+ - "\u0000\u00e3\u00e1\u0001\u0000\u0000\u0000\u00e3\u00e4\u0001\u0000\u0000"+ - "\u0000\u00e4\u00e6\u0001\u0000\u0000\u0000\u00e5\u00d2\u0001\u0000\u0000"+ - "\u0000\u00e5\u00d8\u0001\u0000\u0000\u0000\u00e5\u00de\u0001\u0000\u0000"+ - "\u0000\u00e6\u0011\u0001\u0000\u0000\u0000\u00e7\u00e9\u0005\n\u0000\u0000"+ - "\u00e8\u00ea\u0003*\u0015\u0000\u00e9\u00e8\u0001\u0000\u0000\u0000\u00e9"+ - "\u00ea\u0001\u0000\u0000\u0000\u00ea\u00eb\u0001\u0000\u0000\u0000\u00eb"+ - "\u00ed\u0005\u0017\u0000\u0000\u00ec\u00ee\u0003(\u0014\u0000\u00ed\u00ec"+ - "\u0001\u0000\u0000\u0000\u00ed\u00ee\u0001\u0000\u0000\u0000\u00ee\u0013"+ - "\u0001\u0000\u0000\u0000\u00ef\u00f0\u0005\u000e\u0000\u0000\u00f0\u00f1"+ - "\u0005\u0011\u0000\u0000\u00f1\u00f2\u0003\n\u0005\u0000\u00f2\u00f3\u0005"+ - "\u0012\u0000\u0000\u00f3\u010c\u0005\u0015\u0000\u0000\u00f4\u00f6\u0003"+ - "\n\u0005\u0000\u00f5\u00f4\u0001\u0000\u0000\u0000\u00f6\u00f7\u0001\u0000"+ - "\u0000\u0000\u00f7\u00f5\u0001\u0000\u0000\u0000\u00f7\u00f8\u0001\u0000"+ - "\u0000\u0000\u00f8\u0101\u0001\u0000\u0000\u0000\u00f9\u00fb\u0005\u0010"+ - "\u0000\u0000\u00fa\u00fc\u0003\n\u0005\u0000\u00fb\u00fa\u0001\u0000\u0000"+ - "\u0000\u00fc\u00fd\u0001\u0000\u0000\u0000\u00fd\u00fb\u0001\u0000\u0000"+ - "\u0000\u00fd\u00fe\u0001\u0000\u0000\u0000\u00fe\u0100\u0001\u0000\u0000"+ - "\u0000\u00ff\u00f9\u0001\u0000\u0000\u0000\u0100\u0103\u0001\u0000\u0000"+ - "\u0000\u0101\u00ff\u0001\u0000\u0000\u0000\u0101\u0102\u0001\u0000\u0000"+ - "\u0000\u0102\u0104\u0001\u0000\u0000\u0000\u0103\u0101\u0001\u0000\u0000"+ - "\u0000\u0104\u0106\u0005\u001c\u0000\u0000\u0105\u0107\u0003\n\u0005\u0000"+ - "\u0106\u0105\u0001\u0000\u0000\u0000\u0107\u0108\u0001\u0000\u0000\u0000"+ - "\u0108\u0106\u0001\u0000\u0000\u0000\u0108\u0109\u0001\u0000\u0000\u0000"+ - "\u0109\u010b\u0001\u0000\u0000\u0000\u010a\u00f5\u0001\u0000\u0000\u0000"+ - "\u010b\u010e\u0001\u0000\u0000\u0000\u010c\u010a\u0001\u0000\u0000\u0000"+ - "\u010c\u010d\u0001\u0000\u0000\u0000\u010d\u0128\u0001\u0000\u0000\u0000"+ - "\u010e\u010c\u0001\u0000\u0000\u0000\u010f\u0111\u0005\u0010\u0000\u0000"+ - "\u0110\u0112\u0003\n\u0005\u0000\u0111\u0110\u0001\u0000\u0000\u0000\u0112"+ - "\u0113\u0001\u0000\u0000\u0000\u0113\u0111\u0001\u0000\u0000\u0000\u0113"+ - "\u0114\u0001\u0000\u0000\u0000\u0114\u011d\u0001\u0000\u0000\u0000\u0115"+ - "\u0117\u0005\u0010\u0000\u0000\u0116\u0118\u0003\n\u0005\u0000\u0117\u0116"+ - "\u0001\u0000\u0000\u0000\u0118\u0119\u0001\u0000\u0000\u0000\u0119\u0117"+ - "\u0001\u0000\u0000\u0000\u0119\u011a\u0001\u0000\u0000\u0000\u011a\u011c"+ - "\u0001\u0000\u0000\u0000\u011b\u0115\u0001\u0000\u0000\u0000\u011c\u011f"+ - "\u0001\u0000\u0000\u0000\u011d\u011b\u0001\u0000\u0000\u0000\u011d\u011e"+ - "\u0001\u0000\u0000\u0000\u011e\u0120\u0001\u0000\u0000\u0000\u011f\u011d"+ - "\u0001\u0000\u0000\u0000\u0120\u0122\u0005\u001c\u0000\u0000\u0121\u0123"+ - "\u0003\n\u0005\u0000\u0122\u0121\u0001\u0000\u0000\u0000\u0123\u0124\u0001"+ - "\u0000\u0000\u0000\u0124\u0122\u0001\u0000\u0000\u0000\u0124\u0125\u0001"+ - "\u0000\u0000\u0000\u0125\u0127\u0001\u0000\u0000\u0000\u0126\u010f\u0001"+ - "\u0000\u0000\u0000\u0127\u012a\u0001\u0000\u0000\u0000\u0128\u0126\u0001"+ - "\u0000\u0000\u0000\u0128\u0129\u0001\u0000\u0000\u0000\u0129\u012c\u0001"+ - "\u0000\u0000\u0000\u012a\u0128\u0001\u0000\u0000\u0000\u012b\u012d\u0005"+ - "\u0010\u0000\u0000\u012c\u012b\u0001\u0000\u0000\u0000\u012c\u012d\u0001"+ - "\u0000\u0000\u0000\u012d\u012e\u0001\u0000\u0000\u0000\u012e\u012f\u0005"+ - "\u0016\u0000\u0000\u012f\u0015\u0001\u0000\u0000\u0000\u0130\u0132\u0003"+ - "*\u0015\u0000\u0131\u0130\u0001\u0000\u0000\u0000\u0131\u0132\u0001\u0000"+ - "\u0000\u0000\u0132\u0133\u0001\u0000\u0000\u0000\u0133\u0134\u0005\u0017"+ - "\u0000\u0000\u0134\u0135\u0005\u001b\u0000\u0000\u0135\u0136\u0005\u000b"+ - "\u0000\u0000\u0136\u0017\u0001\u0000\u0000\u0000\u0137\u0139\u0003*\u0015"+ - "\u0000\u0138\u0137\u0001\u0000\u0000\u0000\u0138\u0139\u0001\u0000\u0000"+ - "\u0000\u0139\u013a\u0001\u0000\u0000\u0000\u013a\u013b\u0005\u0017\u0000"+ - "\u0000\u013b\u013c\u0005\u001b\u0000\u0000\u013c\u013d\u0005\u0017\u0000"+ - "\u0000\u013d\u013e\u0003(\u0014\u0000\u013e\u0019\u0001\u0000\u0000\u0000"+ - "\u013f\u0141\u0003*\u0015\u0000\u0140\u013f\u0001\u0000\u0000\u0000\u0140"+ - "\u0141\u0001\u0000\u0000\u0000\u0141\u0142\u0001\u0000\u0000\u0000\u0142"+ - "\u0143\u0005\u0017\u0000\u0000\u0143\u0147\u0005\u001b\u0000\u0000\u0144"+ - "\u0148\u0005\u0017\u0000\u0000\u0145\u0148\u0005\u0018\u0000\u0000\u0146"+ - "\u0148\u0005\u000b\u0000\u0000\u0147\u0144\u0001\u0000\u0000\u0000\u0147"+ - "\u0145\u0001\u0000\u0000\u0000\u0147\u0146\u0001\u0000\u0000\u0000\u0148"+ - "\u0150\u0001\u0000\u0000\u0000\u0149\u014a\u0005\u0018\u0000\u0000\u014a"+ - "\u014b\u0005\u001b\u0000\u0000\u014b\u0150\u0005\u0017\u0000\u0000\u014c"+ - "\u014d\u0005\u0018\u0000\u0000\u014d\u014e\u0005\u001b\u0000\u0000\u014e"+ - "\u0150\u0005\u0018\u0000\u0000\u014f\u0140\u0001\u0000\u0000\u0000\u014f"+ - "\u0149\u0001\u0000\u0000\u0000\u014f\u014c\u0001\u0000\u0000\u0000\u0150"+ - "\u001b\u0001\u0000\u0000\u0000\u0151\u0153\u0003*\u0015\u0000\u0152\u0151"+ - "\u0001\u0000\u0000\u0000\u0152\u0153\u0001\u0000\u0000\u0000\u0153\u0154"+ - "\u0001\u0000\u0000\u0000\u0154\u0155\u0005\u0017\u0000\u0000\u0155\u0156"+ - "\u0005\u001b\u0000\u0000\u0156\u001d\u0001\u0000\u0000\u0000\u0157\u0158"+ - "\u0005\u0018\u0000\u0000\u0158\u0159\u0003 \u0010\u0000\u0159\u001f\u0001"+ - "\u0000\u0000\u0000\u015a\u015e\u0003\"\u0011\u0000\u015b\u015c\u0005\u001d"+ - "\u0000\u0000\u015c\u015e\u0005\u0017\u0000\u0000\u015d\u015a\u0001\u0000"+ - "\u0000\u0000\u015d\u015b\u0001\u0000\u0000\u0000\u015e!\u0001\u0000\u0000"+ - "\u0000\u015f\u0160\u0005\u001d\u0000\u0000\u0160\u0161\u0005\u0017\u0000"+ - "\u0000\u0161\u0162\u0003(\u0014\u0000\u0162#\u0001\u0000\u0000\u0000\u0163"+ - "\u0164\u0005\u0017\u0000\u0000\u0164\u0165\u0003(\u0014\u0000\u0165\u0166"+ - "\u0005\u001d\u0000\u0000\u0166\u0167\u0005\u0017\u0000\u0000\u0167\u0168"+ - "\u0003(\u0014\u0000\u0168%\u0001\u0000\u0000\u0000\u0169\u016a\u0005\u0017"+ - "\u0000\u0000\u016a\u016b\u0003(\u0014\u0000\u016b\'\u0001\u0000\u0000"+ - "\u0000\u016c\u016d\u0005\u0011\u0000\u0000\u016d\u0172\u0003,\u0016\u0000"+ - "\u016e\u016f\u0005\u0010\u0000\u0000\u016f\u0171\u0003,\u0016\u0000\u0170"+ - "\u016e\u0001\u0000\u0000\u0000\u0171\u0174\u0001\u0000\u0000\u0000\u0172"+ - "\u0170\u0001\u0000\u0000\u0000\u0172\u0173\u0001\u0000\u0000\u0000\u0173"+ - "\u0175\u0001\u0000\u0000\u0000\u0174\u0172\u0001\u0000\u0000\u0000\u0175"+ - "\u0176\u0005\u0012\u0000\u0000\u0176\u017a\u0001\u0000\u0000\u0000\u0177"+ - "\u0178\u0005\u0011\u0000\u0000\u0178\u017a\u0005\u0012\u0000\u0000\u0179"+ - "\u016c\u0001\u0000\u0000\u0000\u0179\u0177\u0001\u0000\u0000\u0000\u017a"+ - ")\u0001\u0000\u0000\u0000\u017b\u017d\u0005\u001a\u0000\u0000\u017c\u017b"+ - "\u0001\u0000\u0000\u0000\u017c\u017d\u0001\u0000\u0000\u0000\u017d\u0180"+ - "\u0001\u0000\u0000\u0000\u017e\u017f\u0005\u0017\u0000\u0000\u017f\u0181"+ - "\u0005\u001a\u0000\u0000\u0180\u017e\u0001\u0000\u0000\u0000\u0181\u0182"+ - "\u0001\u0000\u0000\u0000\u0182\u0180\u0001\u0000\u0000\u0000\u0182\u0183"+ - "\u0001\u0000\u0000\u0000\u0183\u0186\u0001\u0000\u0000\u0000\u0184\u0186"+ - "\u0005\u001a\u0000\u0000\u0185\u017c\u0001\u0000\u0000\u0000\u0185\u0184"+ - "\u0001\u0000\u0000\u0000\u0186+\u0001\u0000\u0000\u0000\u0187\u018a\u0003"+ - "\n\u0005\u0000\u0188\u018a\u0005\u0017\u0000\u0000\u0189\u0187\u0001\u0000"+ - "\u0000\u0000\u0189\u0188\u0001\u0000\u0000\u0000\u018a-\u0001\u0000\u0000"+ - "\u0000\u018b\u018d\u0005\u0018\u0000\u0000\u018c\u018e\u00030\u0018\u0000"+ - "\u018d\u018c\u0001\u0000\u0000\u0000\u018e\u018f\u0001\u0000\u0000\u0000"+ - "\u018f\u018d\u0001\u0000\u0000\u0000\u018f\u0190\u0001\u0000\u0000\u0000"+ - "\u0190\u0193\u0001\u0000\u0000\u0000\u0191\u0193\u00030\u0018\u0000\u0192"+ - "\u018b\u0001\u0000\u0000\u0000\u0192\u0191\u0001\u0000\u0000\u0000\u0193"+ - "/\u0001\u0000\u0000\u0000\u0194\u0198\u0005\u0013\u0000\u0000\u0195\u0197"+ - "\u00030\u0018\u0000\u0196\u0195\u0001\u0000\u0000\u0000\u0197\u019a\u0001"+ - "\u0000\u0000\u0000\u0198\u0196\u0001\u0000\u0000\u0000\u0198\u0199\u0001"+ - "\u0000\u0000\u0000\u0199\u019b\u0001\u0000\u0000\u0000\u019a\u0198\u0001"+ - "\u0000\u0000\u0000\u019b\u01da\u0005\u0014\u0000\u0000\u019c\u019d\u0005"+ - "\u0004\u0000\u0000\u019d\u01a1\u0005\u0011\u0000\u0000\u019e\u01a0\u0003"+ - "0\u0018\u0000\u019f\u019e\u0001\u0000\u0000\u0000\u01a0\u01a3\u0001\u0000"+ - "\u0000\u0000\u01a1\u019f\u0001\u0000\u0000\u0000\u01a1\u01a2\u0001\u0000"+ - "\u0000\u0000\u01a2\u01a4\u0001\u0000\u0000\u0000\u01a3\u01a1\u0001\u0000"+ - "\u0000\u0000\u01a4\u01da\u0005\u0012\u0000\u0000\u01a5\u01aa\u0005\u0013"+ - "\u0000\u0000\u01a6\u01a7\u00032\u0019\u0000\u01a7\u01a8\u0005\u001c\u0000"+ - "\u0000\u01a8\u01a9\u00030\u0018\u0000\u01a9\u01ab\u0001\u0000\u0000\u0000"+ - "\u01aa\u01a6\u0001\u0000\u0000\u0000\u01ab\u01ac\u0001\u0000\u0000\u0000"+ - "\u01ac\u01aa\u0001\u0000\u0000\u0000\u01ac\u01ad\u0001\u0000\u0000\u0000"+ - "\u01ad\u01ae\u0001\u0000\u0000\u0000\u01ae\u01af\u0005\u0014\u0000\u0000"+ - "\u01af\u01da\u0001\u0000\u0000\u0000\u01b0\u01b1\u0005\u0004\u0000\u0000"+ - "\u01b1\u01b6\u0005\u0011\u0000\u0000\u01b2\u01b3\u00032\u0019\u0000\u01b3"+ - "\u01b4\u0005\u001c\u0000\u0000\u01b4\u01b5\u00030\u0018\u0000\u01b5\u01b7"+ - "\u0001\u0000\u0000\u0000\u01b6\u01b2\u0001\u0000\u0000\u0000\u01b7\u01b8"+ - "\u0001\u0000\u0000\u0000\u01b8\u01b6\u0001\u0000\u0000\u0000\u01b8\u01b9"+ - "\u0001\u0000\u0000\u0000\u01b9\u01ba\u0001\u0000\u0000\u0000\u01ba\u01bb"+ - "\u0005\u0012\u0000\u0000\u01bb\u01da\u0001\u0000\u0000\u0000\u01bc\u01bd"+ - "\u0005\u0013\u0000\u0000\u01bd\u01c2\u00032\u0019\u0000\u01be\u01bf\u0005"+ - "\u0010\u0000\u0000\u01bf\u01c1\u00032\u0019\u0000\u01c0\u01be\u0001\u0000"+ - "\u0000\u0000\u01c1\u01c4\u0001\u0000\u0000\u0000\u01c2\u01c0\u0001\u0000"+ - "\u0000\u0000\u01c2\u01c3\u0001\u0000\u0000\u0000\u01c3\u01c6\u0001\u0000"+ - "\u0000\u0000\u01c4\u01c2\u0001\u0000\u0000\u0000\u01c5\u01c7\u0005\u0010"+ - "\u0000\u0000\u01c6\u01c5\u0001\u0000\u0000\u0000\u01c6\u01c7\u0001\u0000"+ - "\u0000\u0000\u01c7\u01c8\u0001\u0000\u0000\u0000\u01c8\u01c9\u0005\u0014"+ - "\u0000\u0000\u01c9\u01da\u0001\u0000\u0000\u0000\u01ca\u01cb\u0005\u0004"+ - "\u0000\u0000\u01cb\u01cc\u0005\u0011\u0000\u0000\u01cc\u01d1\u00032\u0019"+ - "\u0000\u01cd\u01ce\u0005\u0010\u0000\u0000\u01ce\u01d0\u00032\u0019\u0000"+ - "\u01cf\u01cd\u0001\u0000\u0000\u0000\u01d0\u01d3\u0001\u0000\u0000\u0000"+ - "\u01d1\u01cf\u0001\u0000\u0000\u0000\u01d1\u01d2\u0001\u0000\u0000\u0000"+ - "\u01d2\u01d5\u0001\u0000\u0000\u0000\u01d3\u01d1\u0001\u0000\u0000\u0000"+ - "\u01d4\u01d6\u0005\u0010\u0000\u0000\u01d5\u01d4\u0001\u0000\u0000\u0000"+ - "\u01d5\u01d6\u0001\u0000\u0000\u0000\u01d6\u01d7\u0001\u0000\u0000\u0000"+ - "\u01d7\u01d8\u0005\u0012\u0000\u0000\u01d8\u01da\u0001\u0000\u0000\u0000"+ - "\u01d9\u0194\u0001\u0000\u0000\u0000\u01d9\u019c\u0001\u0000\u0000\u0000"+ - "\u01d9\u01a5\u0001\u0000\u0000\u0000\u01d9\u01b0\u0001\u0000\u0000\u0000"+ - "\u01d9\u01bc\u0001\u0000\u0000\u0000\u01d9\u01ca\u0001\u0000\u0000\u0000"+ - "\u01da1\u0001\u0000\u0000\u0000\u01db\u01dc\u0003\n\u0005\u0000\u01dc"+ - "\u01dd\u0005\u001c\u0000\u0000\u01dd\u01de\u00030\u0018\u0000\u01de\u01e5"+ - "\u0001\u0000\u0000\u0000\u01df\u01e0\u0003\n\u0005\u0000\u01e0\u01e1\u0005"+ - "\u001c\u0000\u0000\u01e1\u01e2\u0003\n\u0005\u0000\u01e2\u01e5\u0001\u0000"+ - "\u0000\u0000\u01e3\u01e5\u0003\n\u0005\u0000\u01e4\u01db\u0001\u0000\u0000"+ - "\u0000\u01e4\u01df\u0001\u0000\u0000\u0000\u01e4\u01e3\u0001\u0000\u0000"+ - "\u0000\u01e53\u0001\u0000\u0000\u0000\u01e6\u01ed\u0003.\u0017\u0000\u01e7"+ - "\u01e9\u0005\u0019\u0000\u0000\u01e8\u01e7\u0001\u0000\u0000\u0000\u01e8"+ - "\u01e9\u0001\u0000\u0000\u0000\u01e9\u01ea\u0001\u0000\u0000\u0000\u01ea"+ - "\u01ed\u0005\u0018\u0000\u0000\u01eb\u01ed\u0005!\u0000\u0000\u01ec\u01e6"+ - "\u0001\u0000\u0000\u0000\u01ec\u01e8\u0001\u0000\u0000\u0000\u01ec\u01eb"+ - "\u0001\u0000\u0000\u0000\u01ed5\u0001\u0000\u0000\u0000\u01ee\u01ef\u0005"+ - "\n\u0000\u0000\u01ef\u01f1\u0005\u0018\u0000\u0000\u01f0\u01f2\u0003("+ - "\u0014\u0000\u01f1\u01f0\u0001\u0000\u0000\u0000\u01f1\u01f2\u0001\u0000"+ - "\u0000\u0000\u01f2\u01f9\u0001\u0000\u0000\u0000\u01f3\u01f4\u0005\n\u0000"+ - "\u0000\u01f4\u01f9\u0003*\u0015\u0000\u01f5\u01f6\u0003*\u0015\u0000\u01f6"+ - "\u01f7\u0005\u0017\u0000\u0000\u01f7\u01f9\u0001\u0000\u0000\u0000\u01f8"+ - "\u01ee\u0001\u0000\u0000\u0000\u01f8\u01f3\u0001\u0000\u0000\u0000\u01f8"+ - "\u01f5\u0001\u0000\u0000\u0000\u01f97\u0001\u0000\u0000\u0000\u01fa\u01fb"+ - "\u0005\u0006\u0000\u0000\u01fb\u01fc\u0003\n\u0005\u0000\u01fc9\u0001"+ - "\u0000\u0000\u0000A=GOYekt{~\u0085\u008c\u0095\u009c\u00a3\u00ab\u00af"+ - "\u00b8\u00c2\u00cb\u00d2\u00d8\u00e3\u00e5\u00e9\u00ed\u00f7\u00fd\u0101"+ - "\u0108\u010c\u0113\u0119\u011d\u0124\u0128\u012c\u0131\u0138\u0140\u0147"+ - "\u014f\u0152\u015d\u0172\u0179\u017c\u0182\u0185\u0189\u018f\u0192\u0198"+ - "\u01a1\u01ac\u01b8\u01c2\u01c6\u01d1\u01d5\u01d9\u01e4\u01e8\u01ec\u01f1"+ - "\u01f8"; - public static final ATN _ATN = - new ATNDeserializer().deserialize(_serializedATN.toCharArray()); - static { - _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; - for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { - _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); - } - } -} \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserBaseListener.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserBaseListener.java deleted file mode 100644 index b90702f412bf..000000000000 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserBaseListener.java +++ /dev/null @@ -1,390 +0,0 @@ -// Generated from BladePhpAntlrParser.g4 by ANTLR 4.13.0 - - package org.netbeans.modules.php.blade.syntax.antlr4.php; - - -import org.antlr.v4.runtime.ParserRuleContext; -import org.antlr.v4.runtime.tree.ErrorNode; -import org.antlr.v4.runtime.tree.TerminalNode; - -/** - * This class provides an empty implementation of {@link BladePhpAntlrParserListener}, - * which can be extended to create a listener which only needs to handle a subset - * of the available methods. - */ -@SuppressWarnings("CheckReturnValue") -public class BladePhpAntlrParserBaseListener implements BladePhpAntlrParserListener { - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterExpression(BladePhpAntlrParser.ExpressionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitExpression(BladePhpAntlrParser.ExpressionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterExprStatement(BladePhpAntlrParser.ExprStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitExprStatement(BladePhpAntlrParser.ExprStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterLogicalStatement(BladePhpAntlrParser.LogicalStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitLogicalStatement(BladePhpAntlrParser.LogicalStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterIfStatement(BladePhpAntlrParser.IfStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitIfStatement(BladePhpAntlrParser.IfStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterInputExpr(BladePhpAntlrParser.InputExprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitInputExpr(BladePhpAntlrParser.InputExprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterFunctionalExpr(BladePhpAntlrParser.FunctionalExprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitFunctionalExpr(BladePhpAntlrParser.FunctionalExprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterClassExpression(BladePhpAntlrParser.ClassExpressionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitClassExpression(BladePhpAntlrParser.ClassExpressionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterForeachDirectiveStatement(BladePhpAntlrParser.ForeachDirectiveStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitForeachDirectiveStatement(BladePhpAntlrParser.ForeachDirectiveStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterForeachArguments(BladePhpAntlrParser.ForeachArgumentsContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitForeachArguments(BladePhpAntlrParser.ForeachArgumentsContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterClassInstanceStatement(BladePhpAntlrParser.ClassInstanceStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitClassInstanceStatement(BladePhpAntlrParser.ClassInstanceStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterMatchStatement(BladePhpAntlrParser.MatchStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitMatchStatement(BladePhpAntlrParser.MatchStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterStaticClassReference(BladePhpAntlrParser.StaticClassReferenceContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitStaticClassReference(BladePhpAntlrParser.StaticClassReferenceContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterStaticMethodAccess(BladePhpAntlrParser.StaticMethodAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitStaticMethodAccess(BladePhpAntlrParser.StaticMethodAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterStaticFieldAccess(BladePhpAntlrParser.StaticFieldAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitStaticFieldAccess(BladePhpAntlrParser.StaticFieldAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterStaticAccess(BladePhpAntlrParser.StaticAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitStaticAccess(BladePhpAntlrParser.StaticAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterAliasDirectAccess(BladePhpAntlrParser.AliasDirectAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitAliasDirectAccess(BladePhpAntlrParser.AliasDirectAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterClassMember(BladePhpAntlrParser.ClassMemberContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitClassMember(BladePhpAntlrParser.ClassMemberContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterDirectMethodAccess(BladePhpAntlrParser.DirectMethodAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitDirectMethodAccess(BladePhpAntlrParser.DirectMethodAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterDirectAccess(BladePhpAntlrParser.DirectAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitDirectAccess(BladePhpAntlrParser.DirectAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterFunctionExpr(BladePhpAntlrParser.FunctionExprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitFunctionExpr(BladePhpAntlrParser.FunctionExprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterArguments(BladePhpAntlrParser.ArgumentsContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitArguments(BladePhpAntlrParser.ArgumentsContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterNamespace(BladePhpAntlrParser.NamespaceContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitNamespace(BladePhpAntlrParser.NamespaceContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterArgument(BladePhpAntlrParser.ArgumentContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitArgument(BladePhpAntlrParser.ArgumentContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterArray(BladePhpAntlrParser.ArrayContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitArray(BladePhpAntlrParser.ArrayContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterArray_key_item(BladePhpAntlrParser.Array_key_itemContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitArray_key_item(BladePhpAntlrParser.Array_key_itemContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterArray_child(BladePhpAntlrParser.Array_childContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitArray_child(BladePhpAntlrParser.Array_childContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterVarExpr(BladePhpAntlrParser.VarExprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitVarExpr(BladePhpAntlrParser.VarExprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterMisc(BladePhpAntlrParser.MiscContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitMisc(BladePhpAntlrParser.MiscContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterOutput(BladePhpAntlrParser.OutputContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitOutput(BladePhpAntlrParser.OutputContext ctx) { } - - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterEveryRule(ParserRuleContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitEveryRule(ParserRuleContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void visitTerminal(TerminalNode node) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void visitErrorNode(ErrorNode node) { } -} \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserListener.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserListener.java deleted file mode 100644 index 2bf230beed92..000000000000 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserListener.java +++ /dev/null @@ -1,302 +0,0 @@ -// Generated from BladePhpAntlrParser.g4 by ANTLR 4.13.0 - - package org.netbeans.modules.php.blade.syntax.antlr4.php; - -import org.antlr.v4.runtime.tree.ParseTreeListener; - -/** - * This interface defines a complete listener for a parse tree produced by - * {@link BladePhpAntlrParser}. - */ -public interface BladePhpAntlrParserListener extends ParseTreeListener { - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#expression}. - * @param ctx the parse tree - */ - void enterExpression(BladePhpAntlrParser.ExpressionContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#expression}. - * @param ctx the parse tree - */ - void exitExpression(BladePhpAntlrParser.ExpressionContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#exprStatement}. - * @param ctx the parse tree - */ - void enterExprStatement(BladePhpAntlrParser.ExprStatementContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#exprStatement}. - * @param ctx the parse tree - */ - void exitExprStatement(BladePhpAntlrParser.ExprStatementContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#logicalStatement}. - * @param ctx the parse tree - */ - void enterLogicalStatement(BladePhpAntlrParser.LogicalStatementContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#logicalStatement}. - * @param ctx the parse tree - */ - void exitLogicalStatement(BladePhpAntlrParser.LogicalStatementContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#ifStatement}. - * @param ctx the parse tree - */ - void enterIfStatement(BladePhpAntlrParser.IfStatementContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#ifStatement}. - * @param ctx the parse tree - */ - void exitIfStatement(BladePhpAntlrParser.IfStatementContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#inputExpr}. - * @param ctx the parse tree - */ - void enterInputExpr(BladePhpAntlrParser.InputExprContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#inputExpr}. - * @param ctx the parse tree - */ - void exitInputExpr(BladePhpAntlrParser.InputExprContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#functionalExpr}. - * @param ctx the parse tree - */ - void enterFunctionalExpr(BladePhpAntlrParser.FunctionalExprContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#functionalExpr}. - * @param ctx the parse tree - */ - void exitFunctionalExpr(BladePhpAntlrParser.FunctionalExprContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#classExpression}. - * @param ctx the parse tree - */ - void enterClassExpression(BladePhpAntlrParser.ClassExpressionContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#classExpression}. - * @param ctx the parse tree - */ - void exitClassExpression(BladePhpAntlrParser.ClassExpressionContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#foreachDirectiveStatement}. - * @param ctx the parse tree - */ - void enterForeachDirectiveStatement(BladePhpAntlrParser.ForeachDirectiveStatementContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#foreachDirectiveStatement}. - * @param ctx the parse tree - */ - void exitForeachDirectiveStatement(BladePhpAntlrParser.ForeachDirectiveStatementContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#foreachArguments}. - * @param ctx the parse tree - */ - void enterForeachArguments(BladePhpAntlrParser.ForeachArgumentsContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#foreachArguments}. - * @param ctx the parse tree - */ - void exitForeachArguments(BladePhpAntlrParser.ForeachArgumentsContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#classInstanceStatement}. - * @param ctx the parse tree - */ - void enterClassInstanceStatement(BladePhpAntlrParser.ClassInstanceStatementContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#classInstanceStatement}. - * @param ctx the parse tree - */ - void exitClassInstanceStatement(BladePhpAntlrParser.ClassInstanceStatementContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#matchStatement}. - * @param ctx the parse tree - */ - void enterMatchStatement(BladePhpAntlrParser.MatchStatementContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#matchStatement}. - * @param ctx the parse tree - */ - void exitMatchStatement(BladePhpAntlrParser.MatchStatementContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#staticClassReference}. - * @param ctx the parse tree - */ - void enterStaticClassReference(BladePhpAntlrParser.StaticClassReferenceContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#staticClassReference}. - * @param ctx the parse tree - */ - void exitStaticClassReference(BladePhpAntlrParser.StaticClassReferenceContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#staticMethodAccess}. - * @param ctx the parse tree - */ - void enterStaticMethodAccess(BladePhpAntlrParser.StaticMethodAccessContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#staticMethodAccess}. - * @param ctx the parse tree - */ - void exitStaticMethodAccess(BladePhpAntlrParser.StaticMethodAccessContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#staticFieldAccess}. - * @param ctx the parse tree - */ - void enterStaticFieldAccess(BladePhpAntlrParser.StaticFieldAccessContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#staticFieldAccess}. - * @param ctx the parse tree - */ - void exitStaticFieldAccess(BladePhpAntlrParser.StaticFieldAccessContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#staticAccess}. - * @param ctx the parse tree - */ - void enterStaticAccess(BladePhpAntlrParser.StaticAccessContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#staticAccess}. - * @param ctx the parse tree - */ - void exitStaticAccess(BladePhpAntlrParser.StaticAccessContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#aliasDirectAccess}. - * @param ctx the parse tree - */ - void enterAliasDirectAccess(BladePhpAntlrParser.AliasDirectAccessContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#aliasDirectAccess}. - * @param ctx the parse tree - */ - void exitAliasDirectAccess(BladePhpAntlrParser.AliasDirectAccessContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#classMember}. - * @param ctx the parse tree - */ - void enterClassMember(BladePhpAntlrParser.ClassMemberContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#classMember}. - * @param ctx the parse tree - */ - void exitClassMember(BladePhpAntlrParser.ClassMemberContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#directMethodAccess}. - * @param ctx the parse tree - */ - void enterDirectMethodAccess(BladePhpAntlrParser.DirectMethodAccessContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#directMethodAccess}. - * @param ctx the parse tree - */ - void exitDirectMethodAccess(BladePhpAntlrParser.DirectMethodAccessContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#directAccess}. - * @param ctx the parse tree - */ - void enterDirectAccess(BladePhpAntlrParser.DirectAccessContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#directAccess}. - * @param ctx the parse tree - */ - void exitDirectAccess(BladePhpAntlrParser.DirectAccessContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#functionExpr}. - * @param ctx the parse tree - */ - void enterFunctionExpr(BladePhpAntlrParser.FunctionExprContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#functionExpr}. - * @param ctx the parse tree - */ - void exitFunctionExpr(BladePhpAntlrParser.FunctionExprContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#arguments}. - * @param ctx the parse tree - */ - void enterArguments(BladePhpAntlrParser.ArgumentsContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#arguments}. - * @param ctx the parse tree - */ - void exitArguments(BladePhpAntlrParser.ArgumentsContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#namespace}. - * @param ctx the parse tree - */ - void enterNamespace(BladePhpAntlrParser.NamespaceContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#namespace}. - * @param ctx the parse tree - */ - void exitNamespace(BladePhpAntlrParser.NamespaceContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#argument}. - * @param ctx the parse tree - */ - void enterArgument(BladePhpAntlrParser.ArgumentContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#argument}. - * @param ctx the parse tree - */ - void exitArgument(BladePhpAntlrParser.ArgumentContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#array}. - * @param ctx the parse tree - */ - void enterArray(BladePhpAntlrParser.ArrayContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#array}. - * @param ctx the parse tree - */ - void exitArray(BladePhpAntlrParser.ArrayContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#array_key_item}. - * @param ctx the parse tree - */ - void enterArray_key_item(BladePhpAntlrParser.Array_key_itemContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#array_key_item}. - * @param ctx the parse tree - */ - void exitArray_key_item(BladePhpAntlrParser.Array_key_itemContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#array_child}. - * @param ctx the parse tree - */ - void enterArray_child(BladePhpAntlrParser.Array_childContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#array_child}. - * @param ctx the parse tree - */ - void exitArray_child(BladePhpAntlrParser.Array_childContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#varExpr}. - * @param ctx the parse tree - */ - void enterVarExpr(BladePhpAntlrParser.VarExprContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#varExpr}. - * @param ctx the parse tree - */ - void exitVarExpr(BladePhpAntlrParser.VarExprContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#misc}. - * @param ctx the parse tree - */ - void enterMisc(BladePhpAntlrParser.MiscContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#misc}. - * @param ctx the parse tree - */ - void exitMisc(BladePhpAntlrParser.MiscContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#output}. - * @param ctx the parse tree - */ - void enterOutput(BladePhpAntlrParser.OutputContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#output}. - * @param ctx the parse tree - */ - void exitOutput(BladePhpAntlrParser.OutputContext ctx); -} \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrUtils.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrUtils.java deleted file mode 100644 index f17cfb6d5b32..000000000000 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrUtils.java +++ /dev/null @@ -1,57 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) - */ -package org.netbeans.modules.php.blade.syntax.antlr4.php; - -import org.netbeans.modules.php.blade.syntax.antlr4.v10.*; -import java.util.List; -import java.util.Set; -import javax.swing.text.BadLocationException; -import javax.swing.text.Document; -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.CharStreams; -import org.antlr.v4.runtime.CommonTokenStream; -import org.antlr.v4.runtime.Token; -import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser.*; -import org.netbeans.spi.lexer.antlr4.AntlrTokenSequence; - -/** - * - * @author bogdan - */ -public class BladePhpAntlrUtils { - - public static AntlrTokenSequence lexerStringScan(String text) { - CharStream cs = CharStreams.fromString(text); - BladePhpAntlrLexer lexer = new BladePhpAntlrLexer(cs); - AntlrTokenSequence tokens = new AntlrTokenSequence(lexer); - return tokens; - } - - public static Token getToken(String text, int offset) { - AntlrTokenSequence tokens = lexerStringScan(text); - if (offset > text.length()){ - return null; - } - - if (tokens.isEmpty()){ - return null; - } - - boolean hasPrev = tokens.hasPrevious(); - - while(tokens.hasNext()){ - Token test = tokens.next().get(); - String testText = test.getText(); - int x = 1; - } - - tokens.seekTo(offset); - - if (!tokens.hasNext()){ - return null; - } - Token token = tokens.next().get(); - return token; - } -} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpCommonLexer.g4 b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpCommonLexer.g4 deleted file mode 100644 index f8c69ab6cb36..000000000000 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpCommonLexer.g4 +++ /dev/null @@ -1,70 +0,0 @@ -lexer grammar BladePhpCommonLexer; - -tokens { - HTML, - BLADE_COMMENT -} - -fragment Identifier - : [a-z_\u0080-\ufffe][a-z0-9_\u0080-\ufffe]*; - -fragment HtmlIdentifier - : [a-z_\u0080-\ufffe][a-z0-9_\u0080-\ufffe-]*; - -fragment ESC_DOUBLE_QUOTED_STRING - : [\\"]; - -fragment DOUBLE_QUOTED_STRING_FRAGMENT - : '"' (ESC_DOUBLE_QUOTED_STRING | . )*? '"'; - -fragment SINGLE_QUOTED_STRING_FRAGMENT - : '\'' (~('\'' | '\\') | '\\' . )* '\''; - -fragment StringLiteral : DOUBLE_QUOTED_STRING_FRAGMENT | SINGLE_QUOTED_STRING_FRAGMENT; - -fragment LineComment - : '//' ~ [\r\n]* - ; - -fragment PhpVariable - : '$' Identifier; - - -fragment Digit - : ('0'..'9'); - -BLADE_COMMENT_START : '{{--' ->pushMode(INSIDE_BLADE_COMMENT), skip; - -EMAIL_SUBSTRING : ('@' Identifier '.')->skip; - -VERSION_WITH_AT: '@' (Digit '.'?)+->skip; - -//escapes -D_ESCAPES - : ( - '{{{' - | '@@' '@'? - | '@{' '{'? - | '@media' [ ]+ ('screen' [ ]+ 'and'?)? - | ( '@charset' | '@import' | '@namespace' | '@document' | '@font-face' - | '@page' | '@layer' | '@supports' | '@tailwind' | '@apply' | '@-webkit-keyframes' - | '@keyframes' | '@counter-style' | '@font-feature-values' | '@property' - | '@scope' | '@starting-style' | '@supports' | '@view-transition' - | '@container' | '@color-profile' | '@styleset' | '@font-palette-values' | '@media' - ) [ ]* - )->type(HTML); - -mode INSIDE_BLADE_COMMENT; - -BLADE_COMMENT_END : '--}}'->popMode, skip; - -//hack to merge all php inputs into one token -BLADE_COMMENT_PEEK : . { - this._input.LA(1) == '-' && - this._input.LA(2) == '-' && - this._input.LA(3) == '}' && - this._input.LA(4) == '}' - }? ->skip; -BLADE_COMMENT_MORE : . ->skip; - -BLADE_COMMENT_EOF : EOF->popMode, skip; \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpSnippetParser.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpSnippetParser.java deleted file mode 100644 index 13d7fd79da19..000000000000 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpSnippetParser.java +++ /dev/null @@ -1,346 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.syntax.antlr4.php; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import org.antlr.v4.runtime.ANTLRErrorListener; -import org.antlr.v4.runtime.BaseErrorListener; -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.CharStreams; -import org.antlr.v4.runtime.CommonTokenStream; -import org.antlr.v4.runtime.DefaultErrorStrategy; -import org.antlr.v4.runtime.FailedPredicateException; -import org.antlr.v4.runtime.Parser; -import org.antlr.v4.runtime.RecognitionException; -import org.antlr.v4.runtime.Recognizer; -import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.tree.ParseTreeListener; -import org.netbeans.modules.csl.api.OffsetRange; -import org.netbeans.modules.csl.api.Severity; -import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils.FieldAccessType; -import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.BladeError; -import org.openide.filesystems.FileObject; - -/** - * - * @author bogdan - */ -public class BladePhpSnippetParser { - - private final String snippet; - private final FileObject originFile; - private final int snippetOffset; - private final List errors = new ArrayList<>(); - private final Map identifierReference = new TreeMap<>(); - private final Map fieldAccessReference = new TreeMap<>(); - - public enum PhpReferenceType { - PHP_NAMESPACE, - PHP_CLASS, - PHP_FUNCTION, - PHP_METHOD, - PHP_CLASS_CONSTANT - } - - public BladePhpSnippetParser(String snippet, FileObject originFile, int snippetOffset) { - this.snippet = snippet; - this.originFile = originFile; - this.snippetOffset = snippetOffset; - } - - public void parse() { - CharStream cs = CharStreams.fromString(snippet); - BladePhpAntlrLexer lexer = new BladePhpAntlrLexer(cs); - CommonTokenStream tokens = new CommonTokenStream(lexer); - BladePhpAntlrParser parser = new BladePhpAntlrParser(tokens); - parser.removeErrorListeners(); - parser.setErrorHandler(new RustANTLRErrorStrategy()); - parser.addErrorListener(createErrorListener()); - //parser.setBuildParseTree(false); - parser.addParseListener(createIdentifiablePhpElementReferences()); - parser.expression(); - } - - private ParseTreeListener createIdentifiablePhpElementReferences() { - return new BladePhpAntlrParserBaseListener() { - @Override - public void exitFunctionExpr(BladePhpAntlrParser.FunctionExprContext ctx) { - if (ctx.IDENTIFIER() != null) { - Token token = ctx.IDENTIFIER().getSymbol(); - String functionName = ctx.IDENTIFIER().getText(); - OffsetRange range = new OffsetRange(token.getStartIndex(), token.getStopIndex() + 1); - PhpReference reference = new PhpReference(PhpReferenceType.PHP_FUNCTION, functionName); - identifierReference.put(range, reference); - } - } - - @Override - public void exitStaticFieldAccess(BladePhpAntlrParser.StaticFieldAccessContext ctx) { - String namespace = null; - Token classToken = ctx.className; - - if (classToken == null) { - return; - } - - if (ctx.namespace() != null) { - namespace = ctx.namespace().getText(); - namespace = namespace.substring(0, namespace.length() - 1); - OffsetRange namespaceRange = new OffsetRange(ctx.namespace().getStart().getStartIndex(), - ctx.namespace().getStop().getStopIndex()); - PhpReference reference = new PhpReference(PhpReferenceType.PHP_NAMESPACE, namespace, null); - identifierReference.put(namespaceRange, reference); - } - - OffsetRange range = new OffsetRange(classToken.getStartIndex(), classToken.getStopIndex() + 1); - PhpReference reference = new PhpReference(PhpReferenceType.PHP_CLASS, classToken.getText(), namespace); - identifierReference.put(range, reference); - - if (ctx.const_ != null) { - PhpReference methodReference = new PhpReference(PhpReferenceType.PHP_CLASS_CONSTANT, ctx.const_.getText(), namespace, reference); - OffsetRange accessRange = new OffsetRange(ctx.const_.getStartIndex(), ctx.const_.getStopIndex() + 1); - identifierReference.put(accessRange, methodReference); - FieldAcces fieldAccess = new FieldAcces(FieldAccessType.STATIC, methodReference, reference); - fieldAccessReference.put(accessRange, fieldAccess); - } - } - - @Override - public void exitStaticMethodAccess(BladePhpAntlrParser.StaticMethodAccessContext ctx) { - String namespace = null; - Token classToken = ctx.className; - - if (classToken == null) { - return; - } - if (ctx.namespace() != null) { - namespace = ctx.namespace().getText(); - //trim the extra \\ - namespace = namespace.substring(0, namespace.length() - 1); - OffsetRange namespaceRange = new OffsetRange(ctx.namespace().getStart().getStartIndex(), - ctx.namespace().getStop().getStopIndex()); - PhpReference reference = new PhpReference(PhpReferenceType.PHP_NAMESPACE, namespace, null); - identifierReference.put(namespaceRange, reference); - } - - OffsetRange range = new OffsetRange(classToken.getStartIndex(), classToken.getStopIndex() + 1); - - PhpReference reference = new PhpReference(PhpReferenceType.PHP_CLASS, classToken.getText(), namespace); - identifierReference.put(range, reference); - - if (ctx.method != null) { - PhpReference methodReference = new PhpReference(PhpReferenceType.PHP_METHOD, - ctx.method.getText(), namespace, reference); - OffsetRange accessRange = new OffsetRange(ctx.method.getStartIndex(), ctx.method.getStopIndex() + 1); - identifierReference.put(accessRange, methodReference); - FieldAcces fieldAccess = new FieldAcces(FieldAccessType.STATIC, methodReference, reference); - fieldAccessReference.put(accessRange, fieldAccess); - } - } - - @Override - public void exitStaticAccess(BladePhpAntlrParser.StaticAccessContext ctx) { - String namespace = null; - Token classToken = ctx.className; - if (classToken == null) { - return; - } - if (ctx.namespace() != null) { - namespace = ctx.namespace().getText(); - namespace = namespace.substring(0, namespace.length() - 1); - OffsetRange namespaceRange = new OffsetRange(ctx.namespace().getStart().getStartIndex(), - ctx.namespace().getStop().getStopIndex()); - PhpReference reference = new PhpReference(PhpReferenceType.PHP_NAMESPACE, namespace, null); - identifierReference.put(namespaceRange, reference); - } - - OffsetRange range = new OffsetRange(classToken.getStartIndex(), classToken.getStopIndex() + 1); - PhpReference reference = new PhpReference(PhpReferenceType.PHP_CLASS, classToken.getText(), namespace); - identifierReference.put(range, reference); - - if (ctx.DOUBLE_COLON() != null && ctx.DOUBLE_COLON().getSymbol() != null) { - //generic access -// Token dbColon = ctx.DOUBLE_COLON().getSymbol(); -// PhpReference methodReference = new PhpReference(PhpReferenceType.PHP_CLASS_CONSTANT, "", namespace); -// OffsetRange accessRange = new OffsetRange(dbColon.getStopIndex(), dbColon.getStopIndex() + 1); -// identifierReference.put(accessRange, methodReference); -// FieldAcces fieldAccess = new FieldAcces(FieldAccessType.STATIC, methodReference, reference); -// fieldAccessReference.put(accessRange, fieldAccess); - } - } - - @Override - public void exitClassInstanceStatement(BladePhpAntlrParser.ClassInstanceStatementContext ctx) { - String namespace = null; - if (ctx.namespace() != null) { - namespace = ctx.namespace().getText(); - //trim the extra \\ - namespace = namespace.substring(0, namespace.length() - 1); - OffsetRange namespaceRange = new OffsetRange(ctx.namespace().getStart().getStartIndex(), - ctx.namespace().getStop().getStopIndex()); - PhpReference reference = new PhpReference(PhpReferenceType.PHP_NAMESPACE, namespace, null); - identifierReference.put(namespaceRange, reference); - } - - Token classToken = ctx.className; - if (classToken != null && classToken.getStartIndex() > 0) { - OffsetRange range = new OffsetRange(classToken.getStartIndex(), classToken.getStopIndex() + 1); - PhpReference reference = new PhpReference(PhpReferenceType.PHP_CLASS, classToken.getText(), namespace); - identifierReference.put(range, reference); - } - } - - @Override - public void exitMisc(BladePhpAntlrParser.MiscContext ctx) { - String namespace = null; - if (ctx.namespace() != null) { - namespace = ctx.namespace().getText(); - //trim the extra \\ - namespace = namespace.substring(0, namespace.length() - 1); - OffsetRange namespaceRange = new OffsetRange(ctx.namespace().getStart().getStartIndex(), - ctx.namespace().getStop().getStopIndex()); - PhpReference reference = new PhpReference(PhpReferenceType.PHP_NAMESPACE, namespace, null); - identifierReference.put(namespaceRange, reference); - } - - Token classToken = ctx.className; - if (classToken != null && classToken.getStartIndex() > 0) { - OffsetRange range = new OffsetRange(classToken.getStartIndex(), classToken.getStopIndex() + 1); - PhpReference reference = new PhpReference(PhpReferenceType.PHP_CLASS, classToken.getText(), namespace); - identifierReference.put(range, reference); - } - } - }; - } - - public PhpReference findIdentifierReference(int offset) { - for (Map.Entry entry : identifierReference.entrySet()) { - OffsetRange range = entry.getKey(); - - if (offset < range.getStart()) { - //excedeed the offset range - break; - } - - if (range.containsInclusive(offset)) { - return entry.getValue(); - } - } - - return null; - } - - public FieldAcces findFieldAccessReference(int offset) { - for (Map.Entry entry : fieldAccessReference.entrySet()) { - OffsetRange range = entry.getKey(); - - if (offset < range.getStart()) { - //excedeed the offset range - break; - } - - if (range.containsInclusive(offset)) { - return entry.getValue(); - } - } - - return null; - } - - private final class RustANTLRErrorStrategy extends DefaultErrorStrategy { - - @Override - protected void reportFailedPredicate(Parser recognizer, FailedPredicateException e) { - - } - - @Override - public void reportError(Parser recognizer, RecognitionException e) { - if (e.getMessage() == null) { - return; - } - super.reportError(recognizer, e); - } - } - - private ANTLRErrorListener createErrorListener() { - return new BaseErrorListener() { - @Override - public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { - int errorPosition = snippetOffset; - if (offendingSymbol instanceof Token) { - Token offendingToken = (Token) offendingSymbol; - errorPosition += offendingToken.getStartIndex(); - } - errors.add(new BladeError(null, "PHP error: " + msg, null, originFile, errorPosition, errorPosition, Severity.ERROR)); - } - - }; - } - - public List getDiagnostics() { - return errors; - } - - public static class PhpReference { - - public final PhpReferenceType type; - public final String identifier; - public final PhpReference ownerClass; - public final String namespace; - - public PhpReference(PhpReferenceType type, String name) { - this.type = type; - this.identifier = name; - this.namespace = null; - this.ownerClass = null; - } - - public PhpReference(PhpReferenceType type, String name, String namespace) { - this.type = type; - this.identifier = name; - this.namespace = namespace; - this.ownerClass = null; - } - - public PhpReference(PhpReferenceType type, String name, String namespace, PhpReference ownerClass) { - this.type = type; - this.identifier = name; - this.namespace = namespace; - this.ownerClass = ownerClass; - } - } - - public static class FieldAcces { - - public final FieldAccessType type; - public final PhpReference field; - public final PhpReference owner; - - public FieldAcces(FieldAccessType type, PhpReference field, PhpReference owner) { - this.type = type; - this.field = field; - this.owner = owner; - } - - } -} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/LexerAdaptor.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/LexerAdaptor.java deleted file mode 100644 index 3271d211556d..000000000000 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/LexerAdaptor.java +++ /dev/null @@ -1,53 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) - */ -package org.netbeans.modules.php.blade.syntax.antlr4.php; - -import org.netbeans.modules.php.blade.syntax.antlr4.v10.*; -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.Lexer; -import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.atn.ATN; -import org.antlr.v4.runtime.misc.Interval; - -/** - * - * @author bogdan - */ -public abstract class LexerAdaptor extends Lexer { - - private int _currentRuleType = Token.INVALID_TYPE; - public int exitIfModePosition = 0; - public boolean compomentTagOpen = false; - - public LexerAdaptor(CharStream input) { - super(input); - } - - public int getCurrentRuleType() { - return _currentRuleType; - } - - public void setCurrentRuleType(int ruleType) { - this._currentRuleType = ruleType; - } - - @Override - public Token emit() { - return super.emit(); - } - - @Override - public void reset() { - setCurrentRuleType(Token.INVALID_TYPE); - super.reset(); - } - - public void startExprLookup(){ - if (this._input.LA(1) == '('){ - this.mode(BladeAntlrLexer.INSIDE_PHP_EXPRESSION); - } else { - this.skip(); - } - } -} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/ParserAdaptor.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/ParserAdaptor.java deleted file mode 100644 index c2fe4af5844e..000000000000 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/syntax/antlr4/php/ParserAdaptor.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.syntax.antlr4.php; - -import org.antlr.v4.runtime.Parser; -import org.antlr.v4.runtime.TokenStream; - -/** - * - * @author bogdan - */ -public abstract class ParserAdaptor extends Parser { - public static enum ParserContext { - FOREACH, - OUTPUT, - STANDARD - } - - protected ParserContext bladeParserContext = ParserContext.STANDARD; - - public ParserAdaptor(TokenStream input) { - super(input); - } - - public void setBladeParserContext(ParserContext context){ - this.bladeParserContext = context; - } - -} From 28cb6df3f37072e685a206d2e54773e54ae7c070 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Sun, 23 Feb 2025 20:47:04 +0200 Subject: [PATCH 37/43] remove antlr generated lexer & parser for html & php code --- .gitignore | 2 + .../html_components/BladeHtmlAntlrLexer.g4 | 36 + .../html_components/BladeHtmlAntlrLexer.java | 303 -- .../html_components/BladeHtmlAntlrParser.g4 | 44 +- .../html_components/BladeHtmlAntlrParser.java | 225 -- .../BladeHtmlAntlrParserBaseListener.java | 74 - .../BladeHtmlAntlrParserListener.java | 40 - .../antlr4/html_components/LexerAdaptor.java | 23 +- .../syntax/antlr4/php/BladePhpAntlrLexer.java | 647 ---- .../antlr4/php/BladePhpAntlrParser.java | 3226 ----------------- .../php/BladePhpAntlrParserBaseListener.java | 408 --- .../php/BladePhpAntlrParserListener.java | 320 -- .../syntax/antlr4/php/BladePhpAntlrUtils.java | 28 +- .../blade/syntax/antlr4/php/LexerAdaptor.java | 53 - .../multiple_block_directives.blade.php | 9 + 15 files changed, 118 insertions(+), 5320 deletions(-) delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrLexer.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParser.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParserBaseListener.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParserListener.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserBaseListener.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserListener.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/LexerAdaptor.java create mode 100644 php/php.blade/test/unit/data/testfiles/navigator/multiple_block_directives.blade.php diff --git a/.gitignore b/.gitignore index 7cbeab916600..f95dc9941f23 100644 --- a/.gitignore +++ b/.gitignore @@ -121,6 +121,8 @@ derby.log php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlr*.java php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/formatter/BladeAntlr*.java +php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/Blade*.java +php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/Blade*.java # idea .idea diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrLexer.g4 index df8fb3423e71..f89e3589ac97 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrLexer.g4 @@ -1,6 +1,42 @@ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ lexer grammar BladeHtmlAntlrLexer; @header{ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4.html_components; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrLexer.java deleted file mode 100644 index 524449a8fe8e..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrLexer.java +++ /dev/null @@ -1,303 +0,0 @@ -// Generated from BladeHtmlAntlrLexer.g4 by ANTLR 4.13.0 - - package org.netbeans.modules.php.blade.syntax.antlr4.html_components; - -import org.antlr.v4.runtime.Lexer; -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.TokenStream; -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.atn.*; -import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.misc.*; - -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) -public class BladeHtmlAntlrLexer extends LexerAdaptor { - static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } - - protected static final DFA[] _decisionToDFA; - protected static final PredictionContextCache _sharedContextCache = - new PredictionContextCache(); - public static final int - HTML_COMPONENT_OPEN_TAG=1, COMPONENT_ATTRIBUTE=2, GT=3, BLADE_COMMENT_START=4, - BLADE_TAG_ESCAPE=5, CONTENT_TAG_OPEN=6, CONTENT_TAG_CLOSE=7, RAW_TAG_OPEN=8, - RAW_TAG_CLOSE=9, WS=10, TAG_PART=11, OTHER=12, BLADE_COMMENT_END=13, BLADE_COMMENT_MORE=14, - BLADE_COMMENT_EOF=15; - public static final int - INSIDE_BLADE_COMMENT=1; - public static String[] channelNames = { - "DEFAULT_TOKEN_CHANNEL", "HIDDEN" - }; - - public static String[] modeNames = { - "DEFAULT_MODE", "INSIDE_BLADE_COMMENT" - }; - - private static String[] makeRuleNames() { - return new String[] { - "Identifier", "HTML_COMPONENT_OPEN_TAG", "COMPONENT_ATTRIBUTE", "GT", - "BLADE_COMMENT_START", "BLADE_TAG_ESCAPE", "CONTENT_TAG_OPEN", "CONTENT_TAG_CLOSE", - "RAW_TAG_OPEN", "RAW_TAG_CLOSE", "WS", "TAG_PART", "OTHER", "BLADE_COMMENT_END", - "BLADE_COMMENT_MORE", "BLADE_COMMENT_EOF" - }; - } - public static final String[] ruleNames = makeRuleNames(); - - private static String[] makeLiteralNames() { - return new String[] { - null, null, null, "'>'", "'{{--'", null, null, null, "'{!!'", "'!!}'", - null, null, null, "'--}}'" - }; - } - private static final String[] _LITERAL_NAMES = makeLiteralNames(); - private static String[] makeSymbolicNames() { - return new String[] { - null, "HTML_COMPONENT_OPEN_TAG", "COMPONENT_ATTRIBUTE", "GT", "BLADE_COMMENT_START", - "BLADE_TAG_ESCAPE", "CONTENT_TAG_OPEN", "CONTENT_TAG_CLOSE", "RAW_TAG_OPEN", - "RAW_TAG_CLOSE", "WS", "TAG_PART", "OTHER", "BLADE_COMMENT_END", "BLADE_COMMENT_MORE", - "BLADE_COMMENT_EOF" - }; - } - private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); - public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); - - /** - * @deprecated Use {@link #VOCABULARY} instead. - */ - @Deprecated - public static final String[] tokenNames; - static { - tokenNames = new String[_SYMBOLIC_NAMES.length]; - for (int i = 0; i < tokenNames.length; i++) { - tokenNames[i] = VOCABULARY.getLiteralName(i); - if (tokenNames[i] == null) { - tokenNames[i] = VOCABULARY.getSymbolicName(i); - } - - if (tokenNames[i] == null) { - tokenNames[i] = ""; - } - } - } - - @Override - @Deprecated - public String[] getTokenNames() { - return tokenNames; - } - - @Override - - public Vocabulary getVocabulary() { - return VOCABULARY; - } - - - boolean tagOpened = false; - boolean insideTag = false; - int contentTagBalance = 0; - int rawTagBalance = 0; - - - public BladeHtmlAntlrLexer(CharStream input) { - super(input); - _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); - } - - @Override - public String getGrammarFileName() { return "BladeHtmlAntlrLexer.g4"; } - - @Override - public String[] getRuleNames() { return ruleNames; } - - @Override - public String getSerializedATN() { return _serializedATN; } - - @Override - public String[] getChannelNames() { return channelNames; } - - @Override - public String[] getModeNames() { return modeNames; } - - @Override - public ATN getATN() { return _ATN; } - - @Override - public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { - switch (ruleIndex) { - case 1: - HTML_COMPONENT_OPEN_TAG_action((RuleContext)_localctx, actionIndex); - break; - case 3: - GT_action((RuleContext)_localctx, actionIndex); - break; - case 6: - CONTENT_TAG_OPEN_action((RuleContext)_localctx, actionIndex); - break; - case 7: - CONTENT_TAG_CLOSE_action((RuleContext)_localctx, actionIndex); - break; - case 8: - RAW_TAG_OPEN_action((RuleContext)_localctx, actionIndex); - break; - case 9: - RAW_TAG_CLOSE_action((RuleContext)_localctx, actionIndex); - break; - } - } - private void HTML_COMPONENT_OPEN_TAG_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 0: - tagOpened = true;insideTag = true; - break; - } - } - private void GT_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 1: - insideTag = false; - break; - } - } - private void CONTENT_TAG_OPEN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 2: - contentTagBalance++; - break; - } - } - private void CONTENT_TAG_CLOSE_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 3: - contentTagBalance--; - break; - } - } - private void RAW_TAG_OPEN_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 4: - rawTagBalance++; - break; - } - } - private void RAW_TAG_CLOSE_action(RuleContext _localctx, int actionIndex) { - switch (actionIndex) { - case 5: - rawTagBalance--; - break; - } - } - @Override - public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { - switch (ruleIndex) { - case 2: - return COMPONENT_ATTRIBUTE_sempred((RuleContext)_localctx, predIndex); - } - return true; - } - private boolean COMPONENT_ATTRIBUTE_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 0: - return insideTag == true && contentTagBalance == 0 && rawTagBalance == 0; - } - return true; - } - - public static final String _serializedATN = - "\u0004\u0000\u000f\u0093\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+ - "\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003"+ - "\u0007\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006"+ - "\u0007\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002"+ - "\n\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002"+ - "\u000e\u0007\u000e\u0002\u000f\u0007\u000f\u0001\u0000\u0001\u0000\u0005"+ - "\u0000%\b\u0000\n\u0000\f\u0000(\t\u0000\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003"+ - "\u00012\b\u0001\u0001\u0001\u0003\u00015\b\u0001\u0003\u00017\b\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ - "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004"+ - "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0005"+ - "\u0001\u0005\u0004\u0005L\b\u0005\u000b\u0005\f\u0005M\u0001\u0005\u0001"+ - "\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ - "\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b"+ - "\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0004"+ - "\nm\b\n\u000b\n\f\nn\u0001\n\u0004\nr\b\n\u000b\n\f\ns\u0003\nv\b\n\u0001"+ - "\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b}\b\u000b\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0000\u0000\u0010"+ - "\u0002\u0000\u0004\u0001\u0006\u0002\b\u0003\n\u0004\f\u0005\u000e\u0006"+ - "\u0010\u0007\u0012\b\u0014\t\u0016\n\u0018\u000b\u001a\f\u001c\r\u001e"+ - "\u000e \u000f\u0002\u0000\u0001\u0004\u0003\u0000AZaz\u0080\u8000\ufffe"+ - "\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002\u0000XXxx\u0002\u0000\n"+ - "\n\r\r\u0099\u0000\u0004\u0001\u0000\u0000\u0000\u0000\u0006\u0001\u0000"+ - "\u0000\u0000\u0000\b\u0001\u0000\u0000\u0000\u0000\n\u0001\u0000\u0000"+ - "\u0000\u0000\f\u0001\u0000\u0000\u0000\u0000\u000e\u0001\u0000\u0000\u0000"+ - "\u0000\u0010\u0001\u0000\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000"+ - "\u0000\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000"+ - "\u0000\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000"+ - "\u0001\u001c\u0001\u0000\u0000\u0000\u0001\u001e\u0001\u0000\u0000\u0000"+ - "\u0001 \u0001\u0000\u0000\u0000\u0002\"\u0001\u0000\u0000\u0000\u0004"+ - ")\u0001\u0000\u0000\u0000\u0006:\u0001\u0000\u0000\u0000\b>\u0001\u0000"+ - "\u0000\u0000\nA\u0001\u0000\u0000\u0000\fI\u0001\u0000\u0000\u0000\u000e"+ - "Q\u0001\u0000\u0000\u0000\u0010X\u0001\u0000\u0000\u0000\u0012_\u0001"+ - "\u0000\u0000\u0000\u0014e\u0001\u0000\u0000\u0000\u0016u\u0001\u0000\u0000"+ - "\u0000\u0018|\u0001\u0000\u0000\u0000\u001a~\u0001\u0000\u0000\u0000\u001c"+ - "\u0082\u0001\u0000\u0000\u0000\u001e\u008a\u0001\u0000\u0000\u0000 \u008e"+ - "\u0001\u0000\u0000\u0000\"&\u0007\u0000\u0000\u0000#%\u0007\u0001\u0000"+ - "\u0000$#\u0001\u0000\u0000\u0000%(\u0001\u0000\u0000\u0000&$\u0001\u0000"+ - "\u0000\u0000&\'\u0001\u0000\u0000\u0000\'\u0003\u0001\u0000\u0000\u0000"+ - "(&\u0001\u0000\u0000\u0000)*\u0005<\u0000\u0000*+\u0007\u0002\u0000\u0000"+ - "+,\u0005-\u0000\u0000,6\u0001\u0000\u0000\u0000-4\u0003\u0002\u0000\u0000"+ - "./\u0005:\u0000\u0000/2\u0005:\u0000\u000002\u0005.\u0000\u00001.\u0001"+ - "\u0000\u0000\u000010\u0001\u0000\u0000\u000023\u0001\u0000\u0000\u0000"+ - "35\u0003\u0002\u0000\u000041\u0001\u0000\u0000\u000045\u0001\u0000\u0000"+ - "\u000057\u0001\u0000\u0000\u00006-\u0001\u0000\u0000\u000067\u0001\u0000"+ - "\u0000\u000078\u0001\u0000\u0000\u000089\u0006\u0001\u0000\u00009\u0005"+ - "\u0001\u0000\u0000\u0000:;\u0004\u0002\u0000\u0000;<\u0005:\u0000\u0000"+ - "<=\u0003\u0002\u0000\u0000=\u0007\u0001\u0000\u0000\u0000>?\u0005>\u0000"+ - "\u0000?@\u0006\u0003\u0001\u0000@\t\u0001\u0000\u0000\u0000AB\u0005{\u0000"+ - "\u0000BC\u0005{\u0000\u0000CD\u0005-\u0000\u0000DE\u0005-\u0000\u0000"+ - "EF\u0001\u0000\u0000\u0000FG\u0006\u0004\u0002\u0000GH\u0006\u0004\u0003"+ - "\u0000H\u000b\u0001\u0000\u0000\u0000IK\u0005@\u0000\u0000JL\u0005{\u0000"+ - "\u0000KJ\u0001\u0000\u0000\u0000LM\u0001\u0000\u0000\u0000MK\u0001\u0000"+ - "\u0000\u0000MN\u0001\u0000\u0000\u0000NO\u0001\u0000\u0000\u0000OP\u0006"+ - "\u0005\u0003\u0000P\r\u0001\u0000\u0000\u0000QR\u0005{\u0000\u0000RS\u0005"+ - "{\u0000\u0000ST\u0001\u0000\u0000\u0000TU\u0006\u0006\u0004\u0000UV\u0001"+ - "\u0000\u0000\u0000VW\u0006\u0006\u0003\u0000W\u000f\u0001\u0000\u0000"+ - "\u0000XY\u0005}\u0000\u0000YZ\u0005}\u0000\u0000Z[\u0001\u0000\u0000\u0000"+ - "[\\\u0006\u0007\u0005\u0000\\]\u0001\u0000\u0000\u0000]^\u0006\u0007\u0003"+ - "\u0000^\u0011\u0001\u0000\u0000\u0000_`\u0005{\u0000\u0000`a\u0005!\u0000"+ - "\u0000ab\u0005!\u0000\u0000bc\u0001\u0000\u0000\u0000cd\u0006\b\u0006"+ - "\u0000d\u0013\u0001\u0000\u0000\u0000ef\u0005!\u0000\u0000fg\u0005!\u0000"+ - "\u0000gh\u0005}\u0000\u0000hi\u0001\u0000\u0000\u0000ij\u0006\t\u0007"+ - "\u0000j\u0015\u0001\u0000\u0000\u0000km\u0005 \u0000\u0000lk\u0001\u0000"+ - "\u0000\u0000mn\u0001\u0000\u0000\u0000nl\u0001\u0000\u0000\u0000no\u0001"+ - "\u0000\u0000\u0000ov\u0001\u0000\u0000\u0000pr\u0007\u0003\u0000\u0000"+ - "qp\u0001\u0000\u0000\u0000rs\u0001\u0000\u0000\u0000sq\u0001\u0000\u0000"+ - "\u0000st\u0001\u0000\u0000\u0000tv\u0001\u0000\u0000\u0000ul\u0001\u0000"+ - "\u0000\u0000uq\u0001\u0000\u0000\u0000vw\u0001\u0000\u0000\u0000wx\u0006"+ - "\n\u0003\u0000x\u0017\u0001\u0000\u0000\u0000y}\u0005!\u0000\u0000z{\u0005"+ - "!\u0000\u0000{}\u0005!\u0000\u0000|y\u0001\u0000\u0000\u0000|z\u0001\u0000"+ - "\u0000\u0000}\u0019\u0001\u0000\u0000\u0000~\u007f\t\u0000\u0000\u0000"+ - "\u007f\u0080\u0001\u0000\u0000\u0000\u0080\u0081\u0006\f\u0003\u0000\u0081"+ - "\u001b\u0001\u0000\u0000\u0000\u0082\u0083\u0005-\u0000\u0000\u0083\u0084"+ - "\u0005-\u0000\u0000\u0084\u0085\u0005}\u0000\u0000\u0085\u0086\u0005}"+ - "\u0000\u0000\u0086\u0087\u0001\u0000\u0000\u0000\u0087\u0088\u0006\r\b"+ - "\u0000\u0088\u0089\u0006\r\u0003\u0000\u0089\u001d\u0001\u0000\u0000\u0000"+ - "\u008a\u008b\t\u0000\u0000\u0000\u008b\u008c\u0001\u0000\u0000\u0000\u008c"+ - "\u008d\u0006\u000e\u0003\u0000\u008d\u001f\u0001\u0000\u0000\u0000\u008e"+ - "\u008f\u0005\u0000\u0000\u0001\u008f\u0090\u0001\u0000\u0000\u0000\u0090"+ - "\u0091\u0006\u000f\b\u0000\u0091\u0092\u0006\u000f\u0003\u0000\u0092!"+ - "\u0001\u0000\u0000\u0000\u000b\u0000\u0001&146Mnsu|\t\u0001\u0001\u0000"+ - "\u0001\u0003\u0001\u0005\u0001\u0000\u0006\u0000\u0000\u0001\u0006\u0002"+ - "\u0001\u0007\u0003\u0001\b\u0004\u0001\t\u0005\u0004\u0000\u0000"; - public static final ATN _ATN = - new ATNDeserializer().deserialize(_serializedATN.toCharArray()); - static { - _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; - for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { - _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); - } - } -} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParser.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParser.g4 index 504f3dd1ce01..2c26a00c6ce1 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParser.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParser.g4 @@ -1,14 +1,42 @@ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ parser grammar BladeHtmlAntlrParser; @header{ - /** - * Parser generated for netbeans blade editor - * Some elements have been simplified to optimize parser speed - * For example - * - switch statement have a loos validation - * - generic block statement "@isset" | "@unless" are grouped togehter - * - the start match and end match will be checked in the parser - */ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.netbeans.modules.php.blade.syntax.antlr4.html_components; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParser.java deleted file mode 100644 index 378db25e860d..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParser.java +++ /dev/null @@ -1,225 +0,0 @@ -// Generated from BladeHtmlAntlrParser.g4 by ANTLR 4.13.0 - - /** - * Parser generated for netbeans blade editor - * Some elements have been simplified to optimize parser speed - * For example - * - switch statement have a loos validation - * - generic block statement "@isset" | "@unless" are grouped togehter - * - the start match and end match will be checked in the parser - */ - package org.netbeans.modules.php.blade.syntax.antlr4.html_components; - -import org.antlr.v4.runtime.atn.*; -import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.misc.*; -import org.antlr.v4.runtime.tree.*; -import java.util.List; -import java.util.Iterator; -import java.util.ArrayList; - -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) -public class BladeHtmlAntlrParser extends Parser { - static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } - - protected static final DFA[] _decisionToDFA; - protected static final PredictionContextCache _sharedContextCache = - new PredictionContextCache(); - public static final int - HTML_COMPONENT_OPEN_TAG=1, COMPONENT_ATTRIBUTE=2, GT=3, BLADE_COMMENT_START=4, - BLADE_TAG_ESCAPE=5, CONTENT_TAG_OPEN=6, CONTENT_TAG_CLOSE=7, RAW_TAG_OPEN=8, - RAW_TAG_CLOSE=9, WS=10, TAG_PART=11, OTHER=12, BLADE_COMMENT_END=13, BLADE_COMMENT_MORE=14, - BLADE_COMMENT_EOF=15; - public static final int - RULE_root = 0, RULE_element = 1; - private static String[] makeRuleNames() { - return new String[] { - "root", "element" - }; - } - public static final String[] ruleNames = makeRuleNames(); - - private static String[] makeLiteralNames() { - return new String[] { - null, null, null, "'>'", "'{{--'", null, null, null, "'{!!'", "'!!}'", - null, null, null, "'--}}'" - }; - } - private static final String[] _LITERAL_NAMES = makeLiteralNames(); - private static String[] makeSymbolicNames() { - return new String[] { - null, "HTML_COMPONENT_OPEN_TAG", "COMPONENT_ATTRIBUTE", "GT", "BLADE_COMMENT_START", - "BLADE_TAG_ESCAPE", "CONTENT_TAG_OPEN", "CONTENT_TAG_CLOSE", "RAW_TAG_OPEN", - "RAW_TAG_CLOSE", "WS", "TAG_PART", "OTHER", "BLADE_COMMENT_END", "BLADE_COMMENT_MORE", - "BLADE_COMMENT_EOF" - }; - } - private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); - public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); - - /** - * @deprecated Use {@link #VOCABULARY} instead. - */ - @Deprecated - public static final String[] tokenNames; - static { - tokenNames = new String[_SYMBOLIC_NAMES.length]; - for (int i = 0; i < tokenNames.length; i++) { - tokenNames[i] = VOCABULARY.getLiteralName(i); - if (tokenNames[i] == null) { - tokenNames[i] = VOCABULARY.getSymbolicName(i); - } - - if (tokenNames[i] == null) { - tokenNames[i] = ""; - } - } - } - - @Override - @Deprecated - public String[] getTokenNames() { - return tokenNames; - } - - @Override - - public Vocabulary getVocabulary() { - return VOCABULARY; - } - - @Override - public String getGrammarFileName() { return "BladeHtmlAntlrParser.g4"; } - - @Override - public String[] getRuleNames() { return ruleNames; } - - @Override - public String getSerializedATN() { return _serializedATN; } - - @Override - public ATN getATN() { return _ATN; } - - public BladeHtmlAntlrParser(TokenStream input) { - super(input); - _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); - } - - @SuppressWarnings("CheckReturnValue") - public static class RootContext extends ParserRuleContext { - public TerminalNode EOF() { return getToken(BladeHtmlAntlrParser.EOF, 0); } - public List element() { - return getRuleContexts(ElementContext.class); - } - public ElementContext element(int i) { - return getRuleContext(ElementContext.class,i); - } - public RootContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_root; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeHtmlAntlrParserListener ) ((BladeHtmlAntlrParserListener)listener).enterRoot(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeHtmlAntlrParserListener ) ((BladeHtmlAntlrParserListener)listener).exitRoot(this); - } - } - - public final RootContext root() throws RecognitionException { - RootContext _localctx = new RootContext(_ctx, getState()); - enterRule(_localctx, 0, RULE_root); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(7); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==HTML_COMPONENT_OPEN_TAG) { - { - { - setState(4); - element(); - } - } - setState(9); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(10); - match(EOF); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ElementContext extends ParserRuleContext { - public TerminalNode HTML_COMPONENT_OPEN_TAG() { return getToken(BladeHtmlAntlrParser.HTML_COMPONENT_OPEN_TAG, 0); } - public ElementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_element; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladeHtmlAntlrParserListener ) ((BladeHtmlAntlrParserListener)listener).enterElement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladeHtmlAntlrParserListener ) ((BladeHtmlAntlrParserListener)listener).exitElement(this); - } - } - - public final ElementContext element() throws RecognitionException { - ElementContext _localctx = new ElementContext(_ctx, getState()); - enterRule(_localctx, 2, RULE_element); - try { - enterOuterAlt(_localctx, 1); - { - setState(12); - match(HTML_COMPONENT_OPEN_TAG); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static final String _serializedATN = - "\u0004\u0001\u000f\u000f\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ - "\u0001\u0000\u0005\u0000\u0006\b\u0000\n\u0000\f\u0000\t\t\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0000\u0000\u0002"+ - "\u0000\u0002\u0000\u0000\r\u0000\u0007\u0001\u0000\u0000\u0000\u0002\f"+ - "\u0001\u0000\u0000\u0000\u0004\u0006\u0003\u0002\u0001\u0000\u0005\u0004"+ - "\u0001\u0000\u0000\u0000\u0006\t\u0001\u0000\u0000\u0000\u0007\u0005\u0001"+ - "\u0000\u0000\u0000\u0007\b\u0001\u0000\u0000\u0000\b\n\u0001\u0000\u0000"+ - "\u0000\t\u0007\u0001\u0000\u0000\u0000\n\u000b\u0005\u0000\u0000\u0001"+ - "\u000b\u0001\u0001\u0000\u0000\u0000\f\r\u0005\u0001\u0000\u0000\r\u0003"+ - "\u0001\u0000\u0000\u0000\u0001\u0007"; - public static final ATN _ATN = - new ATNDeserializer().deserialize(_serializedATN.toCharArray()); - static { - _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; - for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { - _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); - } - } -} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParserBaseListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParserBaseListener.java deleted file mode 100644 index c2acd3a7a176..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParserBaseListener.java +++ /dev/null @@ -1,74 +0,0 @@ -// Generated from BladeHtmlAntlrParser.g4 by ANTLR 4.13.0 - - /** - * Parser generated for netbeans blade editor - * Some elements have been simplified to optimize parser speed - * For example - * - switch statement have a loos validation - * - generic block statement "@isset" | "@unless" are grouped togehter - * - the start match and end match will be checked in the parser - */ - package org.netbeans.modules.php.blade.syntax.antlr4.html_components; - - -import org.antlr.v4.runtime.ParserRuleContext; -import org.antlr.v4.runtime.tree.ErrorNode; -import org.antlr.v4.runtime.tree.TerminalNode; - -/** - * This class provides an empty implementation of {@link BladeHtmlAntlrParserListener}, - * which can be extended to create a listener which only needs to handle a subset - * of the available methods. - */ -@SuppressWarnings("CheckReturnValue") -public class BladeHtmlAntlrParserBaseListener implements BladeHtmlAntlrParserListener { - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterRoot(BladeHtmlAntlrParser.RootContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitRoot(BladeHtmlAntlrParser.RootContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterElement(BladeHtmlAntlrParser.ElementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitElement(BladeHtmlAntlrParser.ElementContext ctx) { } - - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterEveryRule(ParserRuleContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitEveryRule(ParserRuleContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void visitTerminal(TerminalNode node) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void visitErrorNode(ErrorNode node) { } -} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParserListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParserListener.java deleted file mode 100644 index 513add1ee9de..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrParserListener.java +++ /dev/null @@ -1,40 +0,0 @@ -// Generated from BladeHtmlAntlrParser.g4 by ANTLR 4.13.0 - - /** - * Parser generated for netbeans blade editor - * Some elements have been simplified to optimize parser speed - * For example - * - switch statement have a loos validation - * - generic block statement "@isset" | "@unless" are grouped togehter - * - the start match and end match will be checked in the parser - */ - package org.netbeans.modules.php.blade.syntax.antlr4.html_components; - -import org.antlr.v4.runtime.tree.ParseTreeListener; - -/** - * This interface defines a complete listener for a parse tree produced by - * {@link BladeHtmlAntlrParser}. - */ -public interface BladeHtmlAntlrParserListener extends ParseTreeListener { - /** - * Enter a parse tree produced by {@link BladeHtmlAntlrParser#root}. - * @param ctx the parse tree - */ - void enterRoot(BladeHtmlAntlrParser.RootContext ctx); - /** - * Exit a parse tree produced by {@link BladeHtmlAntlrParser#root}. - * @param ctx the parse tree - */ - void exitRoot(BladeHtmlAntlrParser.RootContext ctx); - /** - * Enter a parse tree produced by {@link BladeHtmlAntlrParser#element}. - * @param ctx the parse tree - */ - void enterElement(BladeHtmlAntlrParser.ElementContext ctx); - /** - * Exit a parse tree produced by {@link BladeHtmlAntlrParser#element}. - * @param ctx the parse tree - */ - void exitElement(BladeHtmlAntlrParser.ElementContext ctx); -} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/LexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/LexerAdaptor.java index 61620489f937..b428a1374f28 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/LexerAdaptor.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/LexerAdaptor.java @@ -1,15 +1,26 @@ -/* -Licensed to the Apache Software Foundation (ASF) + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ package org.netbeans.modules.php.blade.syntax.antlr4.html_components; -import org.netbeans.modules.php.blade.syntax.antlr4.php.*; -import org.netbeans.modules.php.blade.syntax.antlr4.v10.*; import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.atn.ATN; -import org.antlr.v4.runtime.misc.Interval; /** * diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.java deleted file mode 100644 index 0c53f6d20184..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.java +++ /dev/null @@ -1,647 +0,0 @@ -// Generated from BladePhpAntlrLexer.g4 by ANTLR 4.13.0 - - /* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - package org.netbeans.modules.php.blade.syntax.antlr4.php; - -import org.antlr.v4.runtime.Lexer; -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.TokenStream; -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.atn.*; -import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.misc.*; - -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) -public class BladePhpAntlrLexer extends LexerAdaptor { - static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } - - protected static final DFA[] _decisionToDFA; - protected static final PredictionContextCache _sharedContextCache = - new PredictionContextCache(); - public static final int - HTML=1, BLADE_COMMENT=2, LINE_COMMENT=3, ARRAY=4, AS=5, ECHO=6, IF=7, - ELSEIF=8, ELSE=9, NEW=10, CLASS=11, FUNCTION=12, LANG_CONSTRUCT=13, MATCH=14, - FOREACH=15, COMMA=16, LPAREN=17, RPAREN=18, LSQUAREBRACKET=19, RSQUAREBRACKET=20, - LCURLYBRACE=21, RCURLYBRACE=22, IDENTIFIER=23, PHP_VARIABLE=24, DOLLAR=25, - NAMESPACE_SEPARATOR=26, DOUBLE_COLON=27, ARROW=28, OBJECT_OPERATOR=29, - SEMI_COLON=30, COMPARISON_OPERATOR=31, LOGICAL_UNION_OPERATOR=32, STRING_LITERAL=33, - STYLE_COMMENT=34, WS=35, PHP_DIRECTIVE=36, OTHER=37, BLADE_COMMENT_START=38, - EMAIL_SUBSTRING=39, VERSION_WITH_AT=40, BLADE_COMMENT_END=41, BLADE_COMMENT_PEEK=42, - BLADE_COMMENT_MORE=43, BLADE_COMMENT_EOF=44; - public static final int - INSIDE_BLADE_COMMENT=1; - public static String[] channelNames = { - "DEFAULT_TOKEN_CHANNEL", "HIDDEN" - }; - - public static String[] modeNames = { - "DEFAULT_MODE", "INSIDE_BLADE_COMMENT" - }; - - private static String[] makeRuleNames() { - return new String[] { - "LINE_COMMENT", "ARRAY", "AS", "ECHO", "IF", "ELSEIF", "ELSE", "NEW", - "CLASS", "FUNCTION", "LANG_CONSTRUCT", "MATCH", "FOREACH", "COMMA", "LPAREN", - "RPAREN", "LSQUAREBRACKET", "RSQUAREBRACKET", "LCURLYBRACE", "RCURLYBRACE", - "IDENTIFIER", "PHP_VARIABLE", "DOLLAR", "NAMESPACE_SEPARATOR", "DOUBLE_COLON", - "ARROW", "OBJECT_OPERATOR", "SEMI_COLON", "COMPARISON_OPERATOR", "LOGICAL_UNION_OPERATOR", - "STRING_LITERAL", "STYLE_COMMENT", "WS", "PHP_DIRECTIVE", "OTHER", "Identifier", - "HtmlIdentifier", "ESC_DOUBLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING_FRAGMENT", - "SINGLE_QUOTED_STRING_FRAGMENT", "StringLiteral", "LineComment", "PhpVariable", - "Digit", "BLADE_COMMENT_START", "EMAIL_SUBSTRING", "VERSION_WITH_AT", - "D_ESCAPES", "BLADE_COMMENT_END", "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", - "BLADE_COMMENT_EOF" - }; - } - public static final String[] ruleNames = makeRuleNames(); - - private static String[] makeLiteralNames() { - return new String[] { - null, null, null, null, "'array'", "'as'", "'echo'", "'if'", null, "'else'", - "'new'", "'class'", "'function'", null, "'match'", "'foreach'", "','", - "'('", "')'", "'['", "']'", "'{'", "'}'", null, null, "'$'", "'\\'", - "'::'", "'=>'", "'->'", "';'", null, null, null, null, null, null, null, - "'{{--'", null, null, "'--}}'" - }; - } - private static final String[] _LITERAL_NAMES = makeLiteralNames(); - private static String[] makeSymbolicNames() { - return new String[] { - null, "HTML", "BLADE_COMMENT", "LINE_COMMENT", "ARRAY", "AS", "ECHO", - "IF", "ELSEIF", "ELSE", "NEW", "CLASS", "FUNCTION", "LANG_CONSTRUCT", - "MATCH", "FOREACH", "COMMA", "LPAREN", "RPAREN", "LSQUAREBRACKET", "RSQUAREBRACKET", - "LCURLYBRACE", "RCURLYBRACE", "IDENTIFIER", "PHP_VARIABLE", "DOLLAR", - "NAMESPACE_SEPARATOR", "DOUBLE_COLON", "ARROW", "OBJECT_OPERATOR", "SEMI_COLON", - "COMPARISON_OPERATOR", "LOGICAL_UNION_OPERATOR", "STRING_LITERAL", "STYLE_COMMENT", - "WS", "PHP_DIRECTIVE", "OTHER", "BLADE_COMMENT_START", "EMAIL_SUBSTRING", - "VERSION_WITH_AT", "BLADE_COMMENT_END", "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", - "BLADE_COMMENT_EOF" - }; - } - private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); - public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); - - /** - * @deprecated Use {@link #VOCABULARY} instead. - */ - @Deprecated - public static final String[] tokenNames; - static { - tokenNames = new String[_SYMBOLIC_NAMES.length]; - for (int i = 0; i < tokenNames.length; i++) { - tokenNames[i] = VOCABULARY.getLiteralName(i); - if (tokenNames[i] == null) { - tokenNames[i] = VOCABULARY.getSymbolicName(i); - } - - if (tokenNames[i] == null) { - tokenNames[i] = ""; - } - } - } - - @Override - @Deprecated - public String[] getTokenNames() { - return tokenNames; - } - - @Override - - public Vocabulary getVocabulary() { - return VOCABULARY; - } - - - int rparenBalance = 0; - int sqparenBalance = 0; - int curlyparenBalance = 0; - - - public BladePhpAntlrLexer(CharStream input) { - super(input); - _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); - } - - @Override - public String getGrammarFileName() { return "BladePhpAntlrLexer.g4"; } - - @Override - public String[] getRuleNames() { return ruleNames; } - - @Override - public String getSerializedATN() { return _serializedATN; } - - @Override - public String[] getChannelNames() { return channelNames; } - - @Override - public String[] getModeNames() { return modeNames; } - - @Override - public ATN getATN() { return _ATN; } - - @Override - public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { - switch (ruleIndex) { - case 49: - return BLADE_COMMENT_PEEK_sempred((RuleContext)_localctx, predIndex); - } - return true; - } - private boolean BLADE_COMMENT_PEEK_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 0: - return - this._input.LA(1) == '-' && - this._input.LA(2) == '-' && - this._input.LA(3) == '}' && - this._input.LA(4) == '}' - ; - } - return true; - } - - public static final String _serializedATN = - "\u0004\u0000,\u02c7\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000\u0007"+ - "\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007"+ - "\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007"+ - "\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n"+ - "\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002"+ - "\u000e\u0007\u000e\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002"+ - "\u0011\u0007\u0011\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002"+ - "\u0014\u0007\u0014\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002"+ - "\u0017\u0007\u0017\u0002\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002"+ - "\u001a\u0007\u001a\u0002\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002"+ - "\u001d\u0007\u001d\u0002\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002"+ - " \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002"+ - "%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002"+ - "*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002"+ - "/\u0007/\u00020\u00070\u00021\u00071\u00022\u00072\u00023\u00073\u0001"+ - "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001"+ - "\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ - "\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u008d\b\u0005\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001"+ - "\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b"+ - "\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ - "\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0003\n\u00b1\b\n\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001"+ - "\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001"+ - "\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001"+ - "\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ - "\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001c\u0001"+ - "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0003\u001c\u00e7\b\u001c\u0001"+ - "\u001c\u0003\u001c\u00ea\b\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001"+ - "\u001d\u0003\u001d\u00f0\b\u001d\u0001\u001e\u0001\u001e\u0001\u001f\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0005\u001f\u00f8\b\u001f\n\u001f\f\u001f"+ - "\u00fb\t\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0005\u001f"+ - "\u0101\b\u001f\n\u001f\f\u001f\u0104\t\u001f\u0001\u001f\u0001\u001f\u0001"+ - " \u0004 \u0109\b \u000b \f \u010a\u0001 \u0004 \u010e\b \u000b \f \u010f"+ - "\u0003 \u0112\b \u0001 \u0001 \u0001!\u0001!\u0001!\u0001!\u0001!\u0001"+ - "!\u0001!\u0001!\u0001!\u0001!\u0001!\u0003!\u0121\b!\u0001!\u0001!\u0001"+ - "\"\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0005#\u012b\b#\n#\f#\u012e\t"+ - "#\u0001$\u0001$\u0005$\u0132\b$\n$\f$\u0135\t$\u0001%\u0001%\u0001&\u0001"+ - "&\u0001&\u0005&\u013c\b&\n&\f&\u013f\t&\u0001&\u0001&\u0001\'\u0001\'"+ - "\u0001\'\u0001\'\u0005\'\u0147\b\'\n\'\f\'\u014a\t\'\u0001\'\u0001\'\u0001"+ - "(\u0001(\u0003(\u0150\b(\u0001)\u0001)\u0001)\u0001)\u0005)\u0156\b)\n"+ - ")\f)\u0159\t)\u0001*\u0001*\u0001*\u0001+\u0001+\u0001,\u0001,\u0001,"+ - "\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001.\u0001.\u0001.\u0003.\u0171\b.\u0004.\u0173\b.\u000b.\f"+ - ".\u0174\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0003/\u0180\b/\u0001/\u0001/\u0001/\u0001/\u0003/\u0186\b/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0004/\u0190\b/\u000b/\f/"+ - "\u0191\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0004/"+ - "\u019c\b/\u000b/\f/\u019d\u0001/\u0001/\u0001/\u0003/\u01a3\b/\u0003/"+ - "\u01a5\b/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0003/\u02a6\b/\u0001/\u0005"+ - "/\u02a9\b/\n/\f/\u02ac\t/\u0003/\u02ae\b/\u0001/\u0001/\u00010\u00010"+ - "\u00010\u00010\u00010\u00010\u00010\u00010\u00011\u00011\u00011\u0001"+ - "1\u00011\u00012\u00012\u00012\u00012\u00013\u00013\u00013\u00013\u0001"+ - "3\u0002\u00f9\u013d\u00004\u0002\u0003\u0004\u0004\u0006\u0005\b\u0006"+ - "\n\u0007\f\b\u000e\t\u0010\n\u0012\u000b\u0014\f\u0016\r\u0018\u000e\u001a"+ - "\u000f\u001c\u0010\u001e\u0011 \u0012\"\u0013$\u0014&\u0015(\u0016*\u0017"+ - ",\u0018.\u00190\u001a2\u001b4\u001c6\u001d8\u001e:\u001f< >!@\"B#D$F%"+ - "H\u0000J\u0000L\u0000N\u0000P\u0000R\u0000T\u0000V\u0000X\u0000Z&\\\'"+ - "^(`\u0000b)d*f+h,\u0002\u0000\u0001\u001e\u0002\u0000AAaa\u0002\u0000"+ - "RRrr\u0002\u0000YYyy\u0002\u0000SSss\u0002\u0000EEee\u0002\u0000CCcc\u0002"+ - "\u0000HHhh\u0002\u0000OOoo\u0002\u0000IIii\u0002\u0000FFff\u0002\u0000"+ - "LLll\u0002\u0000NNnn\u0002\u0000WWww\u0002\u0000UUuu\u0002\u0000TTtt\u0002"+ - "\u0000MMmm\u0002\u0000PPpp\u0002\u0000<<>>\u0002\u0000\n\n\r\r\u0002\u0000"+ - "DDdd\u0004\u0000AZ__az\u0080\u8000\ufffe\u0005\u000009AZ__az\u0080\u8000"+ - "\ufffe\u0006\u0000--09AZ__az\u0080\u8000\ufffe\u0002\u0000\"\"\\\\\u0002"+ - "\u0000\'\'\\\\\u0001\u0000 \u0002\u0000GGgg\u0002\u0000BBbb\u0002\u0000"+ - "KKkk\u0002\u0000VVvv\u02f4\u0000\u0002\u0001\u0000\u0000\u0000\u0000\u0004"+ - "\u0001\u0000\u0000\u0000\u0000\u0006\u0001\u0000\u0000\u0000\u0000\b\u0001"+ - "\u0000\u0000\u0000\u0000\n\u0001\u0000\u0000\u0000\u0000\f\u0001\u0000"+ - "\u0000\u0000\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0010\u0001\u0000"+ - "\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000\u0000\u0014\u0001\u0000"+ - "\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000"+ - "\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000"+ - "\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000"+ - "\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000"+ - "\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*"+ - "\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000"+ - "\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000"+ - "\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008"+ - "\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000"+ - "\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000"+ - "\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F"+ - "\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000\\\u0001"+ - "\u0000\u0000\u0000\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001\u0000\u0000"+ - "\u0000\u0001b\u0001\u0000\u0000\u0000\u0001d\u0001\u0000\u0000\u0000\u0001"+ - "f\u0001\u0000\u0000\u0000\u0001h\u0001\u0000\u0000\u0000\u0002j\u0001"+ - "\u0000\u0000\u0000\u0004n\u0001\u0000\u0000\u0000\u0006t\u0001\u0000\u0000"+ - "\u0000\bw\u0001\u0000\u0000\u0000\n|\u0001\u0000\u0000\u0000\f\u008c\u0001"+ - "\u0000\u0000\u0000\u000e\u008e\u0001\u0000\u0000\u0000\u0010\u0093\u0001"+ - "\u0000\u0000\u0000\u0012\u0097\u0001\u0000\u0000\u0000\u0014\u009d\u0001"+ - "\u0000\u0000\u0000\u0016\u00b0\u0001\u0000\u0000\u0000\u0018\u00b2\u0001"+ - "\u0000\u0000\u0000\u001a\u00b8\u0001\u0000\u0000\u0000\u001c\u00c0\u0001"+ - "\u0000\u0000\u0000\u001e\u00c2\u0001\u0000\u0000\u0000 \u00c4\u0001\u0000"+ - "\u0000\u0000\"\u00c6\u0001\u0000\u0000\u0000$\u00c8\u0001\u0000\u0000"+ - "\u0000&\u00ca\u0001\u0000\u0000\u0000(\u00cc\u0001\u0000\u0000\u0000*"+ - "\u00ce\u0001\u0000\u0000\u0000,\u00d0\u0001\u0000\u0000\u0000.\u00d2\u0001"+ - "\u0000\u0000\u00000\u00d4\u0001\u0000\u0000\u00002\u00d6\u0001\u0000\u0000"+ - "\u00004\u00d9\u0001\u0000\u0000\u00006\u00dc\u0001\u0000\u0000\u00008"+ - "\u00df\u0001\u0000\u0000\u0000:\u00e6\u0001\u0000\u0000\u0000<\u00ef\u0001"+ - "\u0000\u0000\u0000>\u00f1\u0001\u0000\u0000\u0000@\u00f3\u0001\u0000\u0000"+ - "\u0000B\u0111\u0001\u0000\u0000\u0000D\u0120\u0001\u0000\u0000\u0000F"+ - "\u0124\u0001\u0000\u0000\u0000H\u0128\u0001\u0000\u0000\u0000J\u012f\u0001"+ - "\u0000\u0000\u0000L\u0136\u0001\u0000\u0000\u0000N\u0138\u0001\u0000\u0000"+ - "\u0000P\u0142\u0001\u0000\u0000\u0000R\u014f\u0001\u0000\u0000\u0000T"+ - "\u0151\u0001\u0000\u0000\u0000V\u015a\u0001\u0000\u0000\u0000X\u015d\u0001"+ - "\u0000\u0000\u0000Z\u015f\u0001\u0000\u0000\u0000\\\u0167\u0001\u0000"+ - "\u0000\u0000^\u016d\u0001\u0000\u0000\u0000`\u02ad\u0001\u0000\u0000\u0000"+ - "b\u02b1\u0001\u0000\u0000\u0000d\u02b9\u0001\u0000\u0000\u0000f\u02be"+ - "\u0001\u0000\u0000\u0000h\u02c2\u0001\u0000\u0000\u0000jk\u0003T)\u0000"+ - "kl\u0001\u0000\u0000\u0000lm\u0006\u0000\u0000\u0000m\u0003\u0001\u0000"+ - "\u0000\u0000no\u0007\u0000\u0000\u0000op\u0007\u0001\u0000\u0000pq\u0007"+ - "\u0001\u0000\u0000qr\u0007\u0000\u0000\u0000rs\u0007\u0002\u0000\u0000"+ - "s\u0005\u0001\u0000\u0000\u0000tu\u0007\u0000\u0000\u0000uv\u0007\u0003"+ - "\u0000\u0000v\u0007\u0001\u0000\u0000\u0000wx\u0007\u0004\u0000\u0000"+ - "xy\u0007\u0005\u0000\u0000yz\u0007\u0006\u0000\u0000z{\u0007\u0007\u0000"+ - "\u0000{\t\u0001\u0000\u0000\u0000|}\u0007\b\u0000\u0000}~\u0007\t\u0000"+ - "\u0000~\u000b\u0001\u0000\u0000\u0000\u007f\u0080\u0007\u0004\u0000\u0000"+ - "\u0080\u0081\u0007\n\u0000\u0000\u0081\u0082\u0007\u0003\u0000\u0000\u0082"+ - "\u0083\u0007\u0004\u0000\u0000\u0083\u0084\u0007\b\u0000\u0000\u0084\u008d"+ - "\u0007\t\u0000\u0000\u0085\u0086\u0007\u0004\u0000\u0000\u0086\u0087\u0007"+ - "\n\u0000\u0000\u0087\u0088\u0007\u0003\u0000\u0000\u0088\u0089\u0007\u0004"+ - "\u0000\u0000\u0089\u008a\u0005 \u0000\u0000\u008a\u008b\u0007\b\u0000"+ - "\u0000\u008b\u008d\u0007\t\u0000\u0000\u008c\u007f\u0001\u0000\u0000\u0000"+ - "\u008c\u0085\u0001\u0000\u0000\u0000\u008d\r\u0001\u0000\u0000\u0000\u008e"+ - "\u008f\u0007\u0004\u0000\u0000\u008f\u0090\u0007\n\u0000\u0000\u0090\u0091"+ - "\u0007\u0003\u0000\u0000\u0091\u0092\u0007\u0004\u0000\u0000\u0092\u000f"+ - "\u0001\u0000\u0000\u0000\u0093\u0094\u0007\u000b\u0000\u0000\u0094\u0095"+ - "\u0007\u0004\u0000\u0000\u0095\u0096\u0007\f\u0000\u0000\u0096\u0011\u0001"+ - "\u0000\u0000\u0000\u0097\u0098\u0007\u0005\u0000\u0000\u0098\u0099\u0007"+ - "\n\u0000\u0000\u0099\u009a\u0007\u0000\u0000\u0000\u009a\u009b\u0007\u0003"+ - "\u0000\u0000\u009b\u009c\u0007\u0003\u0000\u0000\u009c\u0013\u0001\u0000"+ - "\u0000\u0000\u009d\u009e\u0007\t\u0000\u0000\u009e\u009f\u0007\r\u0000"+ - "\u0000\u009f\u00a0\u0007\u000b\u0000\u0000\u00a0\u00a1\u0007\u0005\u0000"+ - "\u0000\u00a1\u00a2\u0007\u000e\u0000\u0000\u00a2\u00a3\u0007\b\u0000\u0000"+ - "\u00a3\u00a4\u0007\u0007\u0000\u0000\u00a4\u00a5\u0007\u000b\u0000\u0000"+ - "\u00a5\u0015\u0001\u0000\u0000\u0000\u00a6\u00a7\u0007\u0004\u0000\u0000"+ - "\u00a7\u00a8\u0007\u000f\u0000\u0000\u00a8\u00a9\u0007\u0010\u0000\u0000"+ - "\u00a9\u00aa\u0007\u000e\u0000\u0000\u00aa\u00b1\u0007\u0002\u0000\u0000"+ - "\u00ab\u00ac\u0007\b\u0000\u0000\u00ac\u00ad\u0007\u0003\u0000\u0000\u00ad"+ - "\u00ae\u0007\u0003\u0000\u0000\u00ae\u00af\u0007\u0004\u0000\u0000\u00af"+ - "\u00b1\u0007\u000e\u0000\u0000\u00b0\u00a6\u0001\u0000\u0000\u0000\u00b0"+ - "\u00ab\u0001\u0000\u0000\u0000\u00b1\u0017\u0001\u0000\u0000\u0000\u00b2"+ - "\u00b3\u0007\u000f\u0000\u0000\u00b3\u00b4\u0007\u0000\u0000\u0000\u00b4"+ - "\u00b5\u0007\u000e\u0000\u0000\u00b5\u00b6\u0007\u0005\u0000\u0000\u00b6"+ - "\u00b7\u0007\u0006\u0000\u0000\u00b7\u0019\u0001\u0000\u0000\u0000\u00b8"+ - "\u00b9\u0007\t\u0000\u0000\u00b9\u00ba\u0007\u0007\u0000\u0000\u00ba\u00bb"+ - "\u0007\u0001\u0000\u0000\u00bb\u00bc\u0007\u0004\u0000\u0000\u00bc\u00bd"+ - "\u0007\u0000\u0000\u0000\u00bd\u00be\u0007\u0005\u0000\u0000\u00be\u00bf"+ - "\u0007\u0006\u0000\u0000\u00bf\u001b\u0001\u0000\u0000\u0000\u00c0\u00c1"+ - "\u0005,\u0000\u0000\u00c1\u001d\u0001\u0000\u0000\u0000\u00c2\u00c3\u0005"+ - "(\u0000\u0000\u00c3\u001f\u0001\u0000\u0000\u0000\u00c4\u00c5\u0005)\u0000"+ - "\u0000\u00c5!\u0001\u0000\u0000\u0000\u00c6\u00c7\u0005[\u0000\u0000\u00c7"+ - "#\u0001\u0000\u0000\u0000\u00c8\u00c9\u0005]\u0000\u0000\u00c9%\u0001"+ - "\u0000\u0000\u0000\u00ca\u00cb\u0005{\u0000\u0000\u00cb\'\u0001\u0000"+ - "\u0000\u0000\u00cc\u00cd\u0005}\u0000\u0000\u00cd)\u0001\u0000\u0000\u0000"+ - "\u00ce\u00cf\u0003H#\u0000\u00cf+\u0001\u0000\u0000\u0000\u00d0\u00d1"+ - "\u0003V*\u0000\u00d1-\u0001\u0000\u0000\u0000\u00d2\u00d3\u0005$\u0000"+ - "\u0000\u00d3/\u0001\u0000\u0000\u0000\u00d4\u00d5\u0005\\\u0000\u0000"+ - "\u00d51\u0001\u0000\u0000\u0000\u00d6\u00d7\u0005:\u0000\u0000\u00d7\u00d8"+ - "\u0005:\u0000\u0000\u00d83\u0001\u0000\u0000\u0000\u00d9\u00da\u0005="+ - "\u0000\u0000\u00da\u00db\u0005>\u0000\u0000\u00db5\u0001\u0000\u0000\u0000"+ - "\u00dc\u00dd\u0005-\u0000\u0000\u00dd\u00de\u0005>\u0000\u0000\u00de7"+ - "\u0001\u0000\u0000\u0000\u00df\u00e0\u0005;\u0000\u0000\u00e09\u0001\u0000"+ - "\u0000\u0000\u00e1\u00e2\u0005=\u0000\u0000\u00e2\u00e7\u0005=\u0000\u0000"+ - "\u00e3\u00e4\u0005!\u0000\u0000\u00e4\u00e7\u0005=\u0000\u0000\u00e5\u00e7"+ - "\u0007\u0011\u0000\u0000\u00e6\u00e1\u0001\u0000\u0000\u0000\u00e6\u00e3"+ - "\u0001\u0000\u0000\u0000\u00e6\u00e5\u0001\u0000\u0000\u0000\u00e7\u00e9"+ - "\u0001\u0000\u0000\u0000\u00e8\u00ea\u0005=\u0000\u0000\u00e9\u00e8\u0001"+ - "\u0000\u0000\u0000\u00e9\u00ea\u0001\u0000\u0000\u0000\u00ea;\u0001\u0000"+ - "\u0000\u0000\u00eb\u00ec\u0005&\u0000\u0000\u00ec\u00f0\u0005&\u0000\u0000"+ - "\u00ed\u00ee\u0005|\u0000\u0000\u00ee\u00f0\u0005|\u0000\u0000\u00ef\u00eb"+ - "\u0001\u0000\u0000\u0000\u00ef\u00ed\u0001\u0000\u0000\u0000\u00f0=\u0001"+ - "\u0000\u0000\u0000\u00f1\u00f2\u0003R(\u0000\u00f2?\u0001\u0000\u0000"+ - "\u0000\u00f3\u00f4\u0005/\u0000\u0000\u00f4\u00f5\u0005*\u0000\u0000\u00f5"+ - "\u00f9\u0001\u0000\u0000\u0000\u00f6\u00f8\t\u0000\u0000\u0000\u00f7\u00f6"+ - "\u0001\u0000\u0000\u0000\u00f8\u00fb\u0001\u0000\u0000\u0000\u00f9\u00fa"+ - "\u0001\u0000\u0000\u0000\u00f9\u00f7\u0001\u0000\u0000\u0000\u00fa\u00fc"+ - "\u0001\u0000\u0000\u0000\u00fb\u00f9\u0001\u0000\u0000\u0000\u00fc\u00fd"+ - "\u0005*\u0000\u0000\u00fd\u00fe\u0005/\u0000\u0000\u00fe\u0102\u0001\u0000"+ - "\u0000\u0000\u00ff\u0101\u0007\u0012\u0000\u0000\u0100\u00ff\u0001\u0000"+ - "\u0000\u0000\u0101\u0104\u0001\u0000\u0000\u0000\u0102\u0100\u0001\u0000"+ - "\u0000\u0000\u0102\u0103\u0001\u0000\u0000\u0000\u0103\u0105\u0001\u0000"+ - "\u0000\u0000\u0104\u0102\u0001\u0000\u0000\u0000\u0105\u0106\u0006\u001f"+ - "\u0000\u0000\u0106A\u0001\u0000\u0000\u0000\u0107\u0109\u0005 \u0000\u0000"+ - "\u0108\u0107\u0001\u0000\u0000\u0000\u0109\u010a\u0001\u0000\u0000\u0000"+ - "\u010a\u0108\u0001\u0000\u0000\u0000\u010a\u010b\u0001\u0000\u0000\u0000"+ - "\u010b\u0112\u0001\u0000\u0000\u0000\u010c\u010e\u0007\u0012\u0000\u0000"+ - "\u010d\u010c\u0001\u0000\u0000\u0000\u010e\u010f\u0001\u0000\u0000\u0000"+ - "\u010f\u010d\u0001\u0000\u0000\u0000\u010f\u0110\u0001\u0000\u0000\u0000"+ - "\u0110\u0112\u0001\u0000\u0000\u0000\u0111\u0108\u0001\u0000\u0000\u0000"+ - "\u0111\u010d\u0001\u0000\u0000\u0000\u0112\u0113\u0001\u0000\u0000\u0000"+ - "\u0113\u0114\u0006 \u0000\u0000\u0114C\u0001\u0000\u0000\u0000\u0115\u0116"+ - "\u0005@\u0000\u0000\u0116\u0117\u0007\u0010\u0000\u0000\u0117\u0118\u0007"+ - "\u0006\u0000\u0000\u0118\u0121\u0007\u0010\u0000\u0000\u0119\u011a\u0005"+ - "@\u0000\u0000\u011a\u011b\u0007\u0004\u0000\u0000\u011b\u011c\u0007\u000b"+ - "\u0000\u0000\u011c\u011d\u0007\u0013\u0000\u0000\u011d\u011e\u0007\u0010"+ - "\u0000\u0000\u011e\u011f\u0007\u0006\u0000\u0000\u011f\u0121\u0007\u0010"+ - "\u0000\u0000\u0120\u0115\u0001\u0000\u0000\u0000\u0120\u0119\u0001\u0000"+ - "\u0000\u0000\u0121\u0122\u0001\u0000\u0000\u0000\u0122\u0123\u0006!\u0000"+ - "\u0000\u0123E\u0001\u0000\u0000\u0000\u0124\u0125\t\u0000\u0000\u0000"+ - "\u0125\u0126\u0001\u0000\u0000\u0000\u0126\u0127\u0006\"\u0000\u0000\u0127"+ - "G\u0001\u0000\u0000\u0000\u0128\u012c\u0007\u0014\u0000\u0000\u0129\u012b"+ - "\u0007\u0015\u0000\u0000\u012a\u0129\u0001\u0000\u0000\u0000\u012b\u012e"+ - "\u0001\u0000\u0000\u0000\u012c\u012a\u0001\u0000\u0000\u0000\u012c\u012d"+ - "\u0001\u0000\u0000\u0000\u012dI\u0001\u0000\u0000\u0000\u012e\u012c\u0001"+ - "\u0000\u0000\u0000\u012f\u0133\u0007\u0014\u0000\u0000\u0130\u0132\u0007"+ - "\u0016\u0000\u0000\u0131\u0130\u0001\u0000\u0000\u0000\u0132\u0135\u0001"+ - "\u0000\u0000\u0000\u0133\u0131\u0001\u0000\u0000\u0000\u0133\u0134\u0001"+ - "\u0000\u0000\u0000\u0134K\u0001\u0000\u0000\u0000\u0135\u0133\u0001\u0000"+ - "\u0000\u0000\u0136\u0137\u0007\u0017\u0000\u0000\u0137M\u0001\u0000\u0000"+ - "\u0000\u0138\u013d\u0005\"\u0000\u0000\u0139\u013c\u0003L%\u0000\u013a"+ - "\u013c\t\u0000\u0000\u0000\u013b\u0139\u0001\u0000\u0000\u0000\u013b\u013a"+ - "\u0001\u0000\u0000\u0000\u013c\u013f\u0001\u0000\u0000\u0000\u013d\u013e"+ - "\u0001\u0000\u0000\u0000\u013d\u013b\u0001\u0000\u0000\u0000\u013e\u0140"+ - "\u0001\u0000\u0000\u0000\u013f\u013d\u0001\u0000\u0000\u0000\u0140\u0141"+ - "\u0005\"\u0000\u0000\u0141O\u0001\u0000\u0000\u0000\u0142\u0148\u0005"+ - "\'\u0000\u0000\u0143\u0147\b\u0018\u0000\u0000\u0144\u0145\u0005\\\u0000"+ - "\u0000\u0145\u0147\t\u0000\u0000\u0000\u0146\u0143\u0001\u0000\u0000\u0000"+ - "\u0146\u0144\u0001\u0000\u0000\u0000\u0147\u014a\u0001\u0000\u0000\u0000"+ - "\u0148\u0146\u0001\u0000\u0000\u0000\u0148\u0149\u0001\u0000\u0000\u0000"+ - "\u0149\u014b\u0001\u0000\u0000\u0000\u014a\u0148\u0001\u0000\u0000\u0000"+ - "\u014b\u014c\u0005\'\u0000\u0000\u014cQ\u0001\u0000\u0000\u0000\u014d"+ - "\u0150\u0003N&\u0000\u014e\u0150\u0003P\'\u0000\u014f\u014d\u0001\u0000"+ - "\u0000\u0000\u014f\u014e\u0001\u0000\u0000\u0000\u0150S\u0001\u0000\u0000"+ - "\u0000\u0151\u0152\u0005/\u0000\u0000\u0152\u0153\u0005/\u0000\u0000\u0153"+ - "\u0157\u0001\u0000\u0000\u0000\u0154\u0156\b\u0012\u0000\u0000\u0155\u0154"+ - "\u0001\u0000\u0000\u0000\u0156\u0159\u0001\u0000\u0000\u0000\u0157\u0155"+ - "\u0001\u0000\u0000\u0000\u0157\u0158\u0001\u0000\u0000\u0000\u0158U\u0001"+ - "\u0000\u0000\u0000\u0159\u0157\u0001\u0000\u0000\u0000\u015a\u015b\u0005"+ - "$\u0000\u0000\u015b\u015c\u0003H#\u0000\u015cW\u0001\u0000\u0000\u0000"+ - "\u015d\u015e\u000209\u0000\u015eY\u0001\u0000\u0000\u0000\u015f\u0160"+ - "\u0005{\u0000\u0000\u0160\u0161\u0005{\u0000\u0000\u0161\u0162\u0005-"+ - "\u0000\u0000\u0162\u0163\u0005-\u0000\u0000\u0163\u0164\u0001\u0000\u0000"+ - "\u0000\u0164\u0165\u0006,\u0001\u0000\u0165\u0166\u0006,\u0000\u0000\u0166"+ - "[\u0001\u0000\u0000\u0000\u0167\u0168\u0005@\u0000\u0000\u0168\u0169\u0003"+ - "H#\u0000\u0169\u016a\u0005.\u0000\u0000\u016a\u016b\u0001\u0000\u0000"+ - "\u0000\u016b\u016c\u0006-\u0000\u0000\u016c]\u0001\u0000\u0000\u0000\u016d"+ - "\u0172\u0005@\u0000\u0000\u016e\u0170\u0003X+\u0000\u016f\u0171\u0005"+ - ".\u0000\u0000\u0170\u016f\u0001\u0000\u0000\u0000\u0170\u0171\u0001\u0000"+ - "\u0000\u0000\u0171\u0173\u0001\u0000\u0000\u0000\u0172\u016e\u0001\u0000"+ - "\u0000\u0000\u0173\u0174\u0001\u0000\u0000\u0000\u0174\u0172\u0001\u0000"+ - "\u0000\u0000\u0174\u0175\u0001\u0000\u0000\u0000\u0175\u0176\u0001\u0000"+ - "\u0000\u0000\u0176\u0177\u0006.\u0000\u0000\u0177_\u0001\u0000\u0000\u0000"+ - "\u0178\u0179\u0005{\u0000\u0000\u0179\u017a\u0005{\u0000\u0000\u017a\u02ae"+ - "\u0005{\u0000\u0000\u017b\u017c\u0005@\u0000\u0000\u017c\u017d\u0005@"+ - "\u0000\u0000\u017d\u017f\u0001\u0000\u0000\u0000\u017e\u0180\u0005@\u0000"+ - "\u0000\u017f\u017e\u0001\u0000\u0000\u0000\u017f\u0180\u0001\u0000\u0000"+ - "\u0000\u0180\u02ae\u0001\u0000\u0000\u0000\u0181\u0182\u0005@\u0000\u0000"+ - "\u0182\u0183\u0005{\u0000\u0000\u0183\u0185\u0001\u0000\u0000\u0000\u0184"+ - "\u0186\u0005{\u0000\u0000\u0185\u0184\u0001\u0000\u0000\u0000\u0185\u0186"+ - "\u0001\u0000\u0000\u0000\u0186\u02ae\u0001\u0000\u0000\u0000\u0187\u0188"+ - "\u0005@\u0000\u0000\u0188\u0189\u0007\u000f\u0000\u0000\u0189\u018a\u0007"+ - "\u0004\u0000\u0000\u018a\u018b\u0007\u0013\u0000\u0000\u018b\u018c\u0007"+ - "\b\u0000\u0000\u018c\u018d\u0007\u0000\u0000\u0000\u018d\u018f\u0001\u0000"+ - "\u0000\u0000\u018e\u0190\u0007\u0019\u0000\u0000\u018f\u018e\u0001\u0000"+ - "\u0000\u0000\u0190\u0191\u0001\u0000\u0000\u0000\u0191\u018f\u0001\u0000"+ - "\u0000\u0000\u0191\u0192\u0001\u0000\u0000\u0000\u0192\u01a4\u0001\u0000"+ - "\u0000\u0000\u0193\u0194\u0007\u0003\u0000\u0000\u0194\u0195\u0007\u0005"+ - "\u0000\u0000\u0195\u0196\u0007\u0001\u0000\u0000\u0196\u0197\u0007\u0004"+ - "\u0000\u0000\u0197\u0198\u0007\u0004\u0000\u0000\u0198\u0199\u0007\u000b"+ - "\u0000\u0000\u0199\u019b\u0001\u0000\u0000\u0000\u019a\u019c\u0007\u0019"+ - "\u0000\u0000\u019b\u019a\u0001\u0000\u0000\u0000\u019c\u019d\u0001\u0000"+ - "\u0000\u0000\u019d\u019b\u0001\u0000\u0000\u0000\u019d\u019e\u0001\u0000"+ - "\u0000\u0000\u019e\u01a2\u0001\u0000\u0000\u0000\u019f\u01a0\u0007\u0000"+ - "\u0000\u0000\u01a0\u01a1\u0007\u000b\u0000\u0000\u01a1\u01a3\u0007\u0013"+ - "\u0000\u0000\u01a2\u019f\u0001\u0000\u0000\u0000\u01a2\u01a3\u0001\u0000"+ - "\u0000\u0000\u01a3\u01a5\u0001\u0000\u0000\u0000\u01a4\u0193\u0001\u0000"+ - "\u0000\u0000\u01a4\u01a5\u0001\u0000\u0000\u0000\u01a5\u02ae\u0001\u0000"+ - "\u0000\u0000\u01a6\u01a7\u0005@\u0000\u0000\u01a7\u01a8\u0007\u0005\u0000"+ - "\u0000\u01a8\u01a9\u0007\u0006\u0000\u0000\u01a9\u01aa\u0007\u0000\u0000"+ - "\u0000\u01aa\u01ab\u0007\u0001\u0000\u0000\u01ab\u01ac\u0007\u0003\u0000"+ - "\u0000\u01ac\u01ad\u0007\u0004\u0000\u0000\u01ad\u02a6\u0007\u000e\u0000"+ - "\u0000\u01ae\u01af\u0005@\u0000\u0000\u01af\u01b0\u0007\b\u0000\u0000"+ - "\u01b0\u01b1\u0007\u000f\u0000\u0000\u01b1\u01b2\u0007\u0010\u0000\u0000"+ - "\u01b2\u01b3\u0007\u0007\u0000\u0000\u01b3\u01b4\u0007\u0001\u0000\u0000"+ - "\u01b4\u02a6\u0007\u000e\u0000\u0000\u01b5\u01b6\u0005@\u0000\u0000\u01b6"+ - "\u01b7\u0007\u000b\u0000\u0000\u01b7\u01b8\u0007\u0000\u0000\u0000\u01b8"+ - "\u01b9\u0007\u000f\u0000\u0000\u01b9\u01ba\u0007\u0004\u0000\u0000\u01ba"+ - "\u01bb\u0007\u0003\u0000\u0000\u01bb\u01bc\u0007\u0010\u0000\u0000\u01bc"+ - "\u01bd\u0007\u0000\u0000\u0000\u01bd\u01be\u0007\u0005\u0000\u0000\u01be"+ - "\u02a6\u0007\u0004\u0000\u0000\u01bf\u01c0\u0005@\u0000\u0000\u01c0\u01c1"+ - "\u0007\u0013\u0000\u0000\u01c1\u01c2\u0007\u0007\u0000\u0000\u01c2\u01c3"+ - "\u0007\u0005\u0000\u0000\u01c3\u01c4\u0007\r\u0000\u0000\u01c4\u01c5\u0007"+ - "\u000f\u0000\u0000\u01c5\u01c6\u0007\u0004\u0000\u0000\u01c6\u01c7\u0007"+ - "\u000b\u0000\u0000\u01c7\u02a6\u0007\u000e\u0000\u0000\u01c8\u01c9\u0005"+ - "@\u0000\u0000\u01c9\u01ca\u0007\t\u0000\u0000\u01ca\u01cb\u0007\u0007"+ - "\u0000\u0000\u01cb\u01cc\u0007\u000b\u0000\u0000\u01cc\u01cd\u0007\u000e"+ - "\u0000\u0000\u01cd\u01ce\u0005-\u0000\u0000\u01ce\u01cf\u0007\t\u0000"+ - "\u0000\u01cf\u01d0\u0007\u0000\u0000\u0000\u01d0\u01d1\u0007\u0005\u0000"+ - "\u0000\u01d1\u02a6\u0007\u0004\u0000\u0000\u01d2\u01d3\u0005@\u0000\u0000"+ - "\u01d3\u01d4\u0007\u0010\u0000\u0000\u01d4\u01d5\u0007\u0000\u0000\u0000"+ - "\u01d5\u01d6\u0007\u001a\u0000\u0000\u01d6\u02a6\u0007\u0004\u0000\u0000"+ - "\u01d7\u01d8\u0005@\u0000\u0000\u01d8\u01d9\u0007\n\u0000\u0000\u01d9"+ - "\u01da\u0007\u0000\u0000\u0000\u01da\u01db\u0007\u0002\u0000\u0000\u01db"+ - "\u01dc\u0007\u0004\u0000\u0000\u01dc\u02a6\u0007\u0001\u0000\u0000\u01dd"+ - "\u01de\u0005@\u0000\u0000\u01de\u01df\u0007\u0003\u0000\u0000\u01df\u01e0"+ - "\u0007\r\u0000\u0000\u01e0\u01e1\u0007\u0010\u0000\u0000\u01e1\u01e2\u0007"+ - "\u0010\u0000\u0000\u01e2\u01e3\u0007\u0007\u0000\u0000\u01e3\u01e4\u0007"+ - "\u0001\u0000\u0000\u01e4\u01e5\u0007\u000e\u0000\u0000\u01e5\u02a6\u0007"+ - "\u0003\u0000\u0000\u01e6\u01e7\u0005@\u0000\u0000\u01e7\u01e8\u0007\u000e"+ - "\u0000\u0000\u01e8\u01e9\u0007\u0000\u0000\u0000\u01e9\u01ea\u0007\b\u0000"+ - "\u0000\u01ea\u01eb\u0007\n\u0000\u0000\u01eb\u01ec\u0007\f\u0000\u0000"+ - "\u01ec\u01ed\u0007\b\u0000\u0000\u01ed\u01ee\u0007\u000b\u0000\u0000\u01ee"+ - "\u02a6\u0007\u0013\u0000\u0000\u01ef\u01f0\u0005@\u0000\u0000\u01f0\u01f1"+ - "\u0007\u0000\u0000\u0000\u01f1\u01f2\u0007\u0010\u0000\u0000\u01f2\u01f3"+ - "\u0007\u0010\u0000\u0000\u01f3\u01f4\u0007\n\u0000\u0000\u01f4\u02a6\u0007"+ - "\u0002\u0000\u0000\u01f5\u01f6\u0005@\u0000\u0000\u01f6\u01f7\u0005-\u0000"+ - "\u0000\u01f7\u01f8\u0007\f\u0000\u0000\u01f8\u01f9\u0007\u0004\u0000\u0000"+ - "\u01f9\u01fa\u0007\u001b\u0000\u0000\u01fa\u01fb\u0007\u001c\u0000\u0000"+ - "\u01fb\u01fc\u0007\b\u0000\u0000\u01fc\u01fd\u0007\u000e\u0000\u0000\u01fd"+ - "\u01fe\u0005-\u0000\u0000\u01fe\u01ff\u0007\u001c\u0000\u0000\u01ff\u0200"+ - "\u0007\u0004\u0000\u0000\u0200\u0201\u0007\u0002\u0000\u0000\u0201\u0202"+ - "\u0007\t\u0000\u0000\u0202\u0203\u0007\u0001\u0000\u0000\u0203\u0204\u0007"+ - "\u0000\u0000\u0000\u0204\u0205\u0007\u000f\u0000\u0000\u0205\u0206\u0007"+ - "\u0004\u0000\u0000\u0206\u02a6\u0007\u0003\u0000\u0000\u0207\u0208\u0005"+ - "@\u0000\u0000\u0208\u0209\u0007\u001c\u0000\u0000\u0209\u020a\u0007\u0004"+ - "\u0000\u0000\u020a\u020b\u0007\u0002\u0000\u0000\u020b\u020c\u0007\t\u0000"+ - "\u0000\u020c\u020d\u0007\u0001\u0000\u0000\u020d\u020e\u0007\u0000\u0000"+ - "\u0000\u020e\u020f\u0007\u000f\u0000\u0000\u020f\u0210\u0007\u0004\u0000"+ - "\u0000\u0210\u02a6\u0007\u0003\u0000\u0000\u0211\u0212\u0005@\u0000\u0000"+ - "\u0212\u0213\u0007\u0005\u0000\u0000\u0213\u0214\u0007\u0007\u0000\u0000"+ - "\u0214\u0215\u0007\r\u0000\u0000\u0215\u0216\u0007\u000b\u0000\u0000\u0216"+ - "\u0217\u0007\u000e\u0000\u0000\u0217\u0218\u0007\u0004\u0000\u0000\u0218"+ - "\u0219\u0007\u0001\u0000\u0000\u0219\u021a\u0005-\u0000\u0000\u021a\u021b"+ - "\u0007\u0003\u0000\u0000\u021b\u021c\u0007\u000e\u0000\u0000\u021c\u021d"+ - "\u0007\u0002\u0000\u0000\u021d\u021e\u0007\n\u0000\u0000\u021e\u02a6\u0007"+ - "\u0004\u0000\u0000\u021f\u0220\u0005@\u0000\u0000\u0220\u0221\u0007\t"+ - "\u0000\u0000\u0221\u0222\u0007\u0007\u0000\u0000\u0222\u0223\u0007\u000b"+ - "\u0000\u0000\u0223\u0224\u0007\u000e\u0000\u0000\u0224\u0225\u0005-\u0000"+ - "\u0000\u0225\u0226\u0007\t\u0000\u0000\u0226\u0227\u0007\u0004\u0000\u0000"+ - "\u0227\u0228\u0007\u0000\u0000\u0000\u0228\u0229\u0007\u000e\u0000\u0000"+ - "\u0229\u022a\u0007\r\u0000\u0000\u022a\u022b\u0007\u0001\u0000\u0000\u022b"+ - "\u022c\u0007\u0004\u0000\u0000\u022c\u022d\u0005-\u0000\u0000\u022d\u022e"+ - "\u0007\u001d\u0000\u0000\u022e\u022f\u0007\u0000\u0000\u0000\u022f\u0230"+ - "\u0007\n\u0000\u0000\u0230\u0231\u0007\r\u0000\u0000\u0231\u0232\u0007"+ - "\u0004\u0000\u0000\u0232\u02a6\u0007\u0003\u0000\u0000\u0233\u0234\u0005"+ - "@\u0000\u0000\u0234\u0235\u0007\u0010\u0000\u0000\u0235\u0236\u0007\u0001"+ - "\u0000\u0000\u0236\u0237\u0007\u0007\u0000\u0000\u0237\u0238\u0007\u0010"+ - "\u0000\u0000\u0238\u0239\u0007\u0004\u0000\u0000\u0239\u023a\u0007\u0001"+ - "\u0000\u0000\u023a\u023b\u0007\u000e\u0000\u0000\u023b\u02a6\u0007\u0002"+ - "\u0000\u0000\u023c\u023d\u0005@\u0000\u0000\u023d\u023e\u0007\u0003\u0000"+ - "\u0000\u023e\u023f\u0007\u0005\u0000\u0000\u023f\u0240\u0007\u0007\u0000"+ - "\u0000\u0240\u0241\u0007\u0010\u0000\u0000\u0241\u02a6\u0007\u0004\u0000"+ - "\u0000\u0242\u0243\u0005@\u0000\u0000\u0243\u0244\u0007\u0003\u0000\u0000"+ - "\u0244\u0245\u0007\u000e\u0000\u0000\u0245\u0246\u0007\u0000\u0000\u0000"+ - "\u0246\u0247\u0007\u0001\u0000\u0000\u0247\u0248\u0007\u000e\u0000\u0000"+ - "\u0248\u0249\u0007\b\u0000\u0000\u0249\u024a\u0007\u000b\u0000\u0000\u024a"+ - "\u024b\u0007\u001a\u0000\u0000\u024b\u024c\u0005-\u0000\u0000\u024c\u024d"+ - "\u0007\u0003\u0000\u0000\u024d\u024e\u0007\u000e\u0000\u0000\u024e\u024f"+ - "\u0007\u0002\u0000\u0000\u024f\u0250\u0007\n\u0000\u0000\u0250\u02a6\u0007"+ - "\u0004\u0000\u0000\u0251\u0252\u0005@\u0000\u0000\u0252\u0253\u0007\u0003"+ - "\u0000\u0000\u0253\u0254\u0007\r\u0000\u0000\u0254\u0255\u0007\u0010\u0000"+ - "\u0000\u0255\u0256\u0007\u0010\u0000\u0000\u0256\u0257\u0007\u0007\u0000"+ - "\u0000\u0257\u0258\u0007\u0001\u0000\u0000\u0258\u0259\u0007\u000e\u0000"+ - "\u0000\u0259\u02a6\u0007\u0003\u0000\u0000\u025a\u025b\u0005@\u0000\u0000"+ - "\u025b\u025c\u0007\u001d\u0000\u0000\u025c\u025d\u0007\b\u0000\u0000\u025d"+ - "\u025e\u0007\u0004\u0000\u0000\u025e\u025f\u0007\f\u0000\u0000\u025f\u0260"+ - "\u0005-\u0000\u0000\u0260\u0261\u0007\u000e\u0000\u0000\u0261\u0262\u0007"+ - "\u0001\u0000\u0000\u0262\u0263\u0007\u0000\u0000\u0000\u0263\u0264\u0007"+ - "\u000b\u0000\u0000\u0264\u0265\u0007\u0003\u0000\u0000\u0265\u0266\u0007"+ - "\b\u0000\u0000\u0266\u0267\u0007\u000e\u0000\u0000\u0267\u0268\u0007\b"+ - "\u0000\u0000\u0268\u0269\u0007\u0007\u0000\u0000\u0269\u02a6\u0007\u000b"+ - "\u0000\u0000\u026a\u026b\u0005@\u0000\u0000\u026b\u026c\u0007\u0005\u0000"+ - "\u0000\u026c\u026d\u0007\u0007\u0000\u0000\u026d\u026e\u0007\u000b\u0000"+ - "\u0000\u026e\u026f\u0007\u000e\u0000\u0000\u026f\u0270\u0007\u0000\u0000"+ - "\u0000\u0270\u0271\u0007\b\u0000\u0000\u0271\u0272\u0007\u000b\u0000\u0000"+ - "\u0272\u0273\u0007\u0004\u0000\u0000\u0273\u02a6\u0007\u0001\u0000\u0000"+ - "\u0274\u0275\u0005@\u0000\u0000\u0275\u0276\u0007\u0005\u0000\u0000\u0276"+ - "\u0277\u0007\u0007\u0000\u0000\u0277\u0278\u0007\n\u0000\u0000\u0278\u0279"+ - "\u0007\u0007\u0000\u0000\u0279\u027a\u0007\u0001\u0000\u0000\u027a\u027b"+ - "\u0005-\u0000\u0000\u027b\u027c\u0007\u0010\u0000\u0000\u027c\u027d\u0007"+ - "\u0001\u0000\u0000\u027d\u027e\u0007\u0007\u0000\u0000\u027e\u027f\u0007"+ - "\t\u0000\u0000\u027f\u0280\u0007\b\u0000\u0000\u0280\u0281\u0007\n\u0000"+ - "\u0000\u0281\u02a6\u0007\u0004\u0000\u0000\u0282\u0283\u0005@\u0000\u0000"+ - "\u0283\u0284\u0007\u0003\u0000\u0000\u0284\u0285\u0007\u000e\u0000\u0000"+ - "\u0285\u0286\u0007\u0002\u0000\u0000\u0286\u0287\u0007\n\u0000\u0000\u0287"+ - "\u0288\u0007\u0004\u0000\u0000\u0288\u0289\u0007\u0003\u0000\u0000\u0289"+ - "\u028a\u0007\u0004\u0000\u0000\u028a\u02a6\u0007\u000e\u0000\u0000\u028b"+ - "\u028c\u0005@\u0000\u0000\u028c\u028d\u0007\t\u0000\u0000\u028d\u028e"+ - "\u0007\u0007\u0000\u0000\u028e\u028f\u0007\u000b\u0000\u0000\u028f\u0290"+ - "\u0007\u000e\u0000\u0000\u0290\u0291\u0005-\u0000\u0000\u0291\u0292\u0007"+ - "\u0010\u0000\u0000\u0292\u0293\u0007\u0000\u0000\u0000\u0293\u0294\u0007"+ - "\n\u0000\u0000\u0294\u0295\u0007\u0004\u0000\u0000\u0295\u0296\u0007\u000e"+ - "\u0000\u0000\u0296\u0297\u0007\u000e\u0000\u0000\u0297\u0298\u0007\u0004"+ - "\u0000\u0000\u0298\u0299\u0005-\u0000\u0000\u0299\u029a\u0007\u001d\u0000"+ - "\u0000\u029a\u029b\u0007\u0000\u0000\u0000\u029b\u029c\u0007\n\u0000\u0000"+ - "\u029c\u029d\u0007\r\u0000\u0000\u029d\u029e\u0007\u0004\u0000\u0000\u029e"+ - "\u02a6\u0007\u0003\u0000\u0000\u029f\u02a0\u0005@\u0000\u0000\u02a0\u02a1"+ - "\u0007\u000f\u0000\u0000\u02a1\u02a2\u0007\u0004\u0000\u0000\u02a2\u02a3"+ - "\u0007\u0013\u0000\u0000\u02a3\u02a4\u0007\b\u0000\u0000\u02a4\u02a6\u0007"+ - "\u0000\u0000\u0000\u02a5\u01a6\u0001\u0000\u0000\u0000\u02a5\u01ae\u0001"+ - "\u0000\u0000\u0000\u02a5\u01b5\u0001\u0000\u0000\u0000\u02a5\u01bf\u0001"+ - "\u0000\u0000\u0000\u02a5\u01c8\u0001\u0000\u0000\u0000\u02a5\u01d2\u0001"+ - "\u0000\u0000\u0000\u02a5\u01d7\u0001\u0000\u0000\u0000\u02a5\u01dd\u0001"+ - "\u0000\u0000\u0000\u02a5\u01e6\u0001\u0000\u0000\u0000\u02a5\u01ef\u0001"+ - "\u0000\u0000\u0000\u02a5\u01f5\u0001\u0000\u0000\u0000\u02a5\u0207\u0001"+ - "\u0000\u0000\u0000\u02a5\u0211\u0001\u0000\u0000\u0000\u02a5\u021f\u0001"+ - "\u0000\u0000\u0000\u02a5\u0233\u0001\u0000\u0000\u0000\u02a5\u023c\u0001"+ - "\u0000\u0000\u0000\u02a5\u0242\u0001\u0000\u0000\u0000\u02a5\u0251\u0001"+ - "\u0000\u0000\u0000\u02a5\u025a\u0001\u0000\u0000\u0000\u02a5\u026a\u0001"+ - "\u0000\u0000\u0000\u02a5\u0274\u0001\u0000\u0000\u0000\u02a5\u0282\u0001"+ - "\u0000\u0000\u0000\u02a5\u028b\u0001\u0000\u0000\u0000\u02a5\u029f\u0001"+ - "\u0000\u0000\u0000\u02a6\u02aa\u0001\u0000\u0000\u0000\u02a7\u02a9\u0007"+ - "\u0019\u0000\u0000\u02a8\u02a7\u0001\u0000\u0000\u0000\u02a9\u02ac\u0001"+ - "\u0000\u0000\u0000\u02aa\u02a8\u0001\u0000\u0000\u0000\u02aa\u02ab\u0001"+ - "\u0000\u0000\u0000\u02ab\u02ae\u0001\u0000\u0000\u0000\u02ac\u02aa\u0001"+ - "\u0000\u0000\u0000\u02ad\u0178\u0001\u0000\u0000\u0000\u02ad\u017b\u0001"+ - "\u0000\u0000\u0000\u02ad\u0181\u0001\u0000\u0000\u0000\u02ad\u0187\u0001"+ - "\u0000\u0000\u0000\u02ad\u02a5\u0001\u0000\u0000\u0000\u02ae\u02af\u0001"+ - "\u0000\u0000\u0000\u02af\u02b0\u0006/\u0002\u0000\u02b0a\u0001\u0000\u0000"+ - "\u0000\u02b1\u02b2\u0005-\u0000\u0000\u02b2\u02b3\u0005-\u0000\u0000\u02b3"+ - "\u02b4\u0005}\u0000\u0000\u02b4\u02b5\u0005}\u0000\u0000\u02b5\u02b6\u0001"+ - "\u0000\u0000\u0000\u02b6\u02b7\u00060\u0003\u0000\u02b7\u02b8\u00060\u0000"+ - "\u0000\u02b8c\u0001\u0000\u0000\u0000\u02b9\u02ba\t\u0000\u0000\u0000"+ - "\u02ba\u02bb\u00041\u0000\u0000\u02bb\u02bc\u0001\u0000\u0000\u0000\u02bc"+ - "\u02bd\u00061\u0000\u0000\u02bde\u0001\u0000\u0000\u0000\u02be\u02bf\t"+ - "\u0000\u0000\u0000\u02bf\u02c0\u0001\u0000\u0000\u0000\u02c0\u02c1\u0006"+ - "2\u0000\u0000\u02c1g\u0001\u0000\u0000\u0000\u02c2\u02c3\u0005\u0000\u0000"+ - "\u0001\u02c3\u02c4\u0001\u0000\u0000\u0000\u02c4\u02c5\u00063\u0003\u0000"+ - "\u02c5\u02c6\u00063\u0000\u0000\u02c6i\u0001\u0000\u0000\u0000 \u0000"+ - "\u0001\u008c\u00b0\u00e6\u00e9\u00ef\u00f9\u0102\u010a\u010f\u0111\u0120"+ - "\u012c\u0133\u013b\u013d\u0146\u0148\u014f\u0157\u0170\u0174\u017f\u0185"+ - "\u0191\u019d\u01a2\u01a4\u02a5\u02aa\u02ad\u0004\u0006\u0000\u0000\u0005"+ - "\u0001\u0000\u0007\u0001\u0000\u0004\u0000\u0000"; - public static final ATN _ATN = - new ATNDeserializer().deserialize(_serializedATN.toCharArray()); - static { - _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; - for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { - _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); - } - } -} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.java deleted file mode 100644 index e75ba9524dd0..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParser.java +++ /dev/null @@ -1,3226 +0,0 @@ -// Generated from BladePhpAntlrParser.g4 by ANTLR 4.13.0 - - /* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - package org.netbeans.modules.php.blade.syntax.antlr4.php; - -import org.antlr.v4.runtime.atn.*; -import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.misc.*; -import org.antlr.v4.runtime.tree.*; -import java.util.List; -import java.util.Iterator; -import java.util.ArrayList; - -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) -public class BladePhpAntlrParser extends ParserAdaptor { - static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } - - protected static final DFA[] _decisionToDFA; - protected static final PredictionContextCache _sharedContextCache = - new PredictionContextCache(); - public static final int - HTML=1, BLADE_COMMENT=2, LINE_COMMENT=3, ARRAY=4, AS=5, ECHO=6, IF=7, - ELSEIF=8, ELSE=9, NEW=10, CLASS=11, FUNCTION=12, LANG_CONSTRUCT=13, MATCH=14, - FOREACH=15, COMMA=16, LPAREN=17, RPAREN=18, LSQUAREBRACKET=19, RSQUAREBRACKET=20, - LCURLYBRACE=21, RCURLYBRACE=22, IDENTIFIER=23, PHP_VARIABLE=24, DOLLAR=25, - NAMESPACE_SEPARATOR=26, DOUBLE_COLON=27, ARROW=28, OBJECT_OPERATOR=29, - SEMI_COLON=30, COMPARISON_OPERATOR=31, LOGICAL_UNION_OPERATOR=32, STRING_LITERAL=33, - STYLE_COMMENT=34, WS=35, PHP_DIRECTIVE=36, OTHER=37, BLADE_COMMENT_START=38, - EMAIL_SUBSTRING=39, VERSION_WITH_AT=40, BLADE_COMMENT_END=41, BLADE_COMMENT_PEEK=42, - BLADE_COMMENT_MORE=43, BLADE_COMMENT_EOF=44; - public static final int - RULE_expression = 0, RULE_exprStatement = 1, RULE_logicalStatement = 2, - RULE_ifStatement = 3, RULE_inputExpr = 4, RULE_functionalExpr = 5, RULE_classExpression = 6, - RULE_foreachDirectiveStatement = 7, RULE_foreachArguments = 8, RULE_classInstanceStatement = 9, - RULE_matchStatement = 10, RULE_staticClassReference = 11, RULE_staticMethodAccess = 12, - RULE_staticFieldAccess = 13, RULE_staticAccess = 14, RULE_aliasDirectAccess = 15, - RULE_classMember = 16, RULE_directMethodAccess = 17, RULE_directAccess = 18, - RULE_functionExpr = 19, RULE_arguments = 20, RULE_namespace = 21, RULE_argument = 22, - RULE_array = 23, RULE_array_key_item = 24, RULE_array_child = 25, RULE_varExpr = 26, - RULE_misc = 27, RULE_output = 28; - private static String[] makeRuleNames() { - return new String[] { - "expression", "exprStatement", "logicalStatement", "ifStatement", "inputExpr", - "functionalExpr", "classExpression", "foreachDirectiveStatement", "foreachArguments", - "classInstanceStatement", "matchStatement", "staticClassReference", "staticMethodAccess", - "staticFieldAccess", "staticAccess", "aliasDirectAccess", "classMember", - "directMethodAccess", "directAccess", "functionExpr", "arguments", "namespace", - "argument", "array", "array_key_item", "array_child", "varExpr", "misc", - "output" - }; - } - public static final String[] ruleNames = makeRuleNames(); - - private static String[] makeLiteralNames() { - return new String[] { - null, null, null, null, "'array'", "'as'", "'echo'", "'if'", null, "'else'", - "'new'", "'class'", "'function'", null, "'match'", "'foreach'", "','", - "'('", "')'", "'['", "']'", "'{'", "'}'", null, null, "'$'", "'\\'", - "'::'", "'=>'", "'->'", "';'", null, null, null, null, null, null, null, - "'{{--'", null, null, "'--}}'" - }; - } - private static final String[] _LITERAL_NAMES = makeLiteralNames(); - private static String[] makeSymbolicNames() { - return new String[] { - null, "HTML", "BLADE_COMMENT", "LINE_COMMENT", "ARRAY", "AS", "ECHO", - "IF", "ELSEIF", "ELSE", "NEW", "CLASS", "FUNCTION", "LANG_CONSTRUCT", - "MATCH", "FOREACH", "COMMA", "LPAREN", "RPAREN", "LSQUAREBRACKET", "RSQUAREBRACKET", - "LCURLYBRACE", "RCURLYBRACE", "IDENTIFIER", "PHP_VARIABLE", "DOLLAR", - "NAMESPACE_SEPARATOR", "DOUBLE_COLON", "ARROW", "OBJECT_OPERATOR", "SEMI_COLON", - "COMPARISON_OPERATOR", "LOGICAL_UNION_OPERATOR", "STRING_LITERAL", "STYLE_COMMENT", - "WS", "PHP_DIRECTIVE", "OTHER", "BLADE_COMMENT_START", "EMAIL_SUBSTRING", - "VERSION_WITH_AT", "BLADE_COMMENT_END", "BLADE_COMMENT_PEEK", "BLADE_COMMENT_MORE", - "BLADE_COMMENT_EOF" - }; - } - private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); - public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); - - /** - * @deprecated Use {@link #VOCABULARY} instead. - */ - @Deprecated - public static final String[] tokenNames; - static { - tokenNames = new String[_SYMBOLIC_NAMES.length]; - for (int i = 0; i < tokenNames.length; i++) { - tokenNames[i] = VOCABULARY.getLiteralName(i); - if (tokenNames[i] == null) { - tokenNames[i] = VOCABULARY.getSymbolicName(i); - } - - if (tokenNames[i] == null) { - tokenNames[i] = ""; - } - } - } - - @Override - @Deprecated - public String[] getTokenNames() { - return tokenNames; - } - - @Override - - public Vocabulary getVocabulary() { - return VOCABULARY; - } - - @Override - public String getGrammarFileName() { return "BladePhpAntlrParser.g4"; } - - @Override - public String[] getRuleNames() { return ruleNames; } - - @Override - public String getSerializedATN() { return _serializedATN; } - - @Override - public ATN getATN() { return _ATN; } - - public BladePhpAntlrParser(TokenStream input) { - super(input); - _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); - } - - @SuppressWarnings("CheckReturnValue") - public static class ExpressionContext extends ParserRuleContext { - public TerminalNode EOF() { return getToken(BladePhpAntlrParser.EOF, 0); } - public List exprStatement() { - return getRuleContexts(ExprStatementContext.class); - } - public ExprStatementContext exprStatement(int i) { - return getRuleContext(ExprStatementContext.class,i); - } - public ExpressionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_expression; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterExpression(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitExpression(this); - } - } - - public final ExpressionContext expression() throws RecognitionException { - ExpressionContext _localctx = new ExpressionContext(_ctx, getState()); - enterRule(_localctx, 0, RULE_expression); - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(61); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,0,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(58); - exprStatement(); - } - } - } - setState(63); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,0,_ctx); - } - setState(64); - match(EOF); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ExprStatementContext extends ParserRuleContext { - public TerminalNode SEMI_COLON() { return getToken(BladePhpAntlrParser.SEMI_COLON, 0); } - public TerminalNode LCURLYBRACE() { return getToken(BladePhpAntlrParser.LCURLYBRACE, 0); } - public TerminalNode RCURLYBRACE() { return getToken(BladePhpAntlrParser.RCURLYBRACE, 0); } - public List exprStatement() { - return getRuleContexts(ExprStatementContext.class); - } - public ExprStatementContext exprStatement(int i) { - return getRuleContext(ExprStatementContext.class,i); - } - public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } - public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } - public TerminalNode COMPARISON_OPERATOR() { return getToken(BladePhpAntlrParser.COMPARISON_OPERATOR, 0); } - public TerminalNode LOGICAL_UNION_OPERATOR() { return getToken(BladePhpAntlrParser.LOGICAL_UNION_OPERATOR, 0); } - public List functionalExpr() { - return getRuleContexts(FunctionalExprContext.class); - } - public FunctionalExprContext functionalExpr(int i) { - return getRuleContext(FunctionalExprContext.class,i); - } - public TerminalNode FOREACH() { return getToken(BladePhpAntlrParser.FOREACH, 0); } - public ForeachArgumentsContext foreachArguments() { - return getRuleContext(ForeachArgumentsContext.class,0); - } - public IfStatementContext ifStatement() { - return getRuleContext(IfStatementContext.class,0); - } - public ForeachDirectiveStatementContext foreachDirectiveStatement() { - return getRuleContext(ForeachDirectiveStatementContext.class,0); - } - public OutputContext output() { - return getRuleContext(OutputContext.class,0); - } - public MiscContext misc() { - return getRuleContext(MiscContext.class,0); - } - public ExprStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_exprStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterExprStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitExprStatement(this); - } - } - - public final ExprStatementContext exprStatement() throws RecognitionException { - ExprStatementContext _localctx = new ExprStatementContext(_ctx, getState()); - enterRule(_localctx, 2, RULE_exprStatement); - try { - int _alt; - setState(101); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(66); - match(SEMI_COLON); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(67); - match(LCURLYBRACE); - setState(71); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,1,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(68); - exprStatement(); - } - } - } - setState(73); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,1,_ctx); - } - setState(74); - match(RCURLYBRACE); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(75); - match(LPAREN); - setState(79); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,2,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(76); - exprStatement(); - } - } - } - setState(81); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,2,_ctx); - } - setState(82); - match(RPAREN); - } - break; - case 4: - enterOuterAlt(_localctx, 4); - { - setState(83); - match(COMPARISON_OPERATOR); - setState(84); - exprStatement(); - } - break; - case 5: - enterOuterAlt(_localctx, 5); - { - setState(85); - match(LOGICAL_UNION_OPERATOR); - setState(87); - _errHandler.sync(this); - _alt = 1; - do { - switch (_alt) { - case 1: - { - { - setState(86); - functionalExpr(); - } - } - break; - default: - throw new NoViableAltException(this); - } - setState(89); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,3,_ctx); - } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); - } - break; - case 6: - enterOuterAlt(_localctx, 6); - { - setState(91); - match(FOREACH); - setState(92); - match(LPAREN); - setState(93); - foreachArguments(); - setState(94); - match(RPAREN); - } - break; - case 7: - enterOuterAlt(_localctx, 7); - { - setState(96); - functionalExpr(); - } - break; - case 8: - enterOuterAlt(_localctx, 8); - { - setState(97); - ifStatement(); - } - break; - case 9: - enterOuterAlt(_localctx, 9); - { - setState(98); - foreachDirectiveStatement(); - } - break; - case 10: - enterOuterAlt(_localctx, 10); - { - setState(99); - output(); - } - break; - case 11: - enterOuterAlt(_localctx, 11); - { - setState(100); - misc(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class LogicalStatementContext extends ParserRuleContext { - public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } - public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } - public List functionalExpr() { - return getRuleContexts(FunctionalExprContext.class); - } - public FunctionalExprContext functionalExpr(int i) { - return getRuleContext(FunctionalExprContext.class,i); - } - public List LOGICAL_UNION_OPERATOR() { return getTokens(BladePhpAntlrParser.LOGICAL_UNION_OPERATOR); } - public TerminalNode LOGICAL_UNION_OPERATOR(int i) { - return getToken(BladePhpAntlrParser.LOGICAL_UNION_OPERATOR, i); - } - public List COMPARISON_OPERATOR() { return getTokens(BladePhpAntlrParser.COMPARISON_OPERATOR); } - public TerminalNode COMPARISON_OPERATOR(int i) { - return getToken(BladePhpAntlrParser.COMPARISON_OPERATOR, i); - } - public LogicalStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_logicalStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterLogicalStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitLogicalStatement(this); - } - } - - public final LogicalStatementContext logicalStatement() throws RecognitionException { - LogicalStatementContext _localctx = new LogicalStatementContext(_ctx, getState()); - enterRule(_localctx, 4, RULE_logicalStatement); - int _la; - try { - setState(126); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,8,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(103); - match(LPAREN); - setState(107); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0)) { - { - { - setState(104); - functionalExpr(); - } - } - setState(109); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(110); - match(RPAREN); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(111); - functionalExpr(); - setState(114); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(112); - match(LOGICAL_UNION_OPERATOR); - setState(113); - functionalExpr(); - } - } - setState(116); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( _la==LOGICAL_UNION_OPERATOR ); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(118); - functionalExpr(); - setState(121); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(119); - match(COMPARISON_OPERATOR); - setState(120); - functionalExpr(); - } - } - setState(123); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( _la==COMPARISON_OPERATOR ); - } - break; - case 4: - enterOuterAlt(_localctx, 4); - { - setState(125); - functionalExpr(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class IfStatementContext extends ParserRuleContext { - public TerminalNode IF() { return getToken(BladePhpAntlrParser.IF, 0); } - public List LPAREN() { return getTokens(BladePhpAntlrParser.LPAREN); } - public TerminalNode LPAREN(int i) { - return getToken(BladePhpAntlrParser.LPAREN, i); - } - public List RPAREN() { return getTokens(BladePhpAntlrParser.RPAREN); } - public TerminalNode RPAREN(int i) { - return getToken(BladePhpAntlrParser.RPAREN, i); - } - public List LCURLYBRACE() { return getTokens(BladePhpAntlrParser.LCURLYBRACE); } - public TerminalNode LCURLYBRACE(int i) { - return getToken(BladePhpAntlrParser.LCURLYBRACE, i); - } - public List RCURLYBRACE() { return getTokens(BladePhpAntlrParser.RCURLYBRACE); } - public TerminalNode RCURLYBRACE(int i) { - return getToken(BladePhpAntlrParser.RCURLYBRACE, i); - } - public List logicalStatement() { - return getRuleContexts(LogicalStatementContext.class); - } - public LogicalStatementContext logicalStatement(int i) { - return getRuleContext(LogicalStatementContext.class,i); - } - public List exprStatement() { - return getRuleContexts(ExprStatementContext.class); - } - public ExprStatementContext exprStatement(int i) { - return getRuleContext(ExprStatementContext.class,i); - } - public List ELSEIF() { return getTokens(BladePhpAntlrParser.ELSEIF); } - public TerminalNode ELSEIF(int i) { - return getToken(BladePhpAntlrParser.ELSEIF, i); - } - public TerminalNode ELSE() { return getToken(BladePhpAntlrParser.ELSE, 0); } - public IfStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_ifStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterIfStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitIfStatement(this); - } - } - - public final IfStatementContext ifStatement() throws RecognitionException { - IfStatementContext _localctx = new IfStatementContext(_ctx, getState()); - enterRule(_localctx, 6, RULE_ifStatement); - int _la; - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(128); - match(IF); - setState(129); - match(LPAREN); - setState(131); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(130); - logicalStatement(); - } - } - setState(133); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253315600L) != 0) ); - setState(135); - match(RPAREN); - setState(136); - match(LCURLYBRACE); - setState(140); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,10,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(137); - exprStatement(); - } - } - } - setState(142); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,10,_ctx); - } - setState(143); - match(RCURLYBRACE); - setState(163); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,13,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(144); - match(ELSEIF); - setState(145); - match(LPAREN); - setState(147); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(146); - logicalStatement(); - } - } - setState(149); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253315600L) != 0) ); - setState(151); - match(RPAREN); - setState(152); - match(LCURLYBRACE); - setState(156); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,12,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(153); - exprStatement(); - } - } - } - setState(158); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,12,_ctx); - } - setState(159); - match(RCURLYBRACE); - } - } - } - setState(165); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,13,_ctx); - } - setState(175); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { - case 1: - { - setState(166); - match(ELSE); - setState(167); - match(LCURLYBRACE); - setState(171); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,14,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(168); - exprStatement(); - } - } - } - setState(173); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,14,_ctx); - } - setState(174); - match(RCURLYBRACE); - } - break; - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class InputExprContext extends ParserRuleContext { - public VarExprContext varExpr() { - return getRuleContext(VarExprContext.class,0); - } - public InputExprContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_inputExpr; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterInputExpr(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitInputExpr(this); - } - } - - public final InputExprContext inputExpr() throws RecognitionException { - InputExprContext _localctx = new InputExprContext(_ctx, getState()); - enterRule(_localctx, 8, RULE_inputExpr); - try { - enterOuterAlt(_localctx, 1); - { - setState(177); - varExpr(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class FunctionalExprContext extends ParserRuleContext { - public MatchStatementContext matchStatement() { - return getRuleContext(MatchStatementContext.class,0); - } - public ClassExpressionContext classExpression() { - return getRuleContext(ClassExpressionContext.class,0); - } - public List classMember() { - return getRuleContexts(ClassMemberContext.class); - } - public ClassMemberContext classMember(int i) { - return getRuleContext(ClassMemberContext.class,i); - } - public FunctionExprContext functionExpr() { - return getRuleContext(FunctionExprContext.class,0); - } - public TerminalNode LANG_CONSTRUCT() { return getToken(BladePhpAntlrParser.LANG_CONSTRUCT, 0); } - public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } - public FunctionalExprContext functionalExpr() { - return getRuleContext(FunctionalExprContext.class,0); - } - public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } - public InputExprContext inputExpr() { - return getRuleContext(InputExprContext.class,0); - } - public FunctionalExprContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_functionalExpr; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterFunctionalExpr(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitFunctionalExpr(this); - } - } - - public final FunctionalExprContext functionalExpr() throws RecognitionException { - FunctionalExprContext _localctx = new FunctionalExprContext(_ctx, getState()); - enterRule(_localctx, 10, RULE_functionalExpr); - try { - int _alt; - setState(194); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,17,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(179); - matchStatement(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(180); - classExpression(); - setState(184); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,16,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(181); - classMember(); - } - } - } - setState(186); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,16,_ctx); - } - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(187); - functionExpr(); - } - break; - case 4: - enterOuterAlt(_localctx, 4); - { - setState(188); - match(LANG_CONSTRUCT); - setState(189); - match(LPAREN); - setState(190); - functionalExpr(); - setState(191); - match(RPAREN); - } - break; - case 5: - enterOuterAlt(_localctx, 5); - { - setState(193); - inputExpr(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ClassExpressionContext extends ParserRuleContext { - public ClassInstanceStatementContext classInstanceStatement() { - return getRuleContext(ClassInstanceStatementContext.class,0); - } - public StaticMethodAccessContext staticMethodAccess() { - return getRuleContext(StaticMethodAccessContext.class,0); - } - public StaticFieldAccessContext staticFieldAccess() { - return getRuleContext(StaticFieldAccessContext.class,0); - } - public StaticClassReferenceContext staticClassReference() { - return getRuleContext(StaticClassReferenceContext.class,0); - } - public StaticAccessContext staticAccess() { - return getRuleContext(StaticAccessContext.class,0); - } - public AliasDirectAccessContext aliasDirectAccess() { - return getRuleContext(AliasDirectAccessContext.class,0); - } - public DirectMethodAccessContext directMethodAccess() { - return getRuleContext(DirectMethodAccessContext.class,0); - } - public ClassExpressionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_classExpression; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterClassExpression(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitClassExpression(this); - } - } - - public final ClassExpressionContext classExpression() throws RecognitionException { - ClassExpressionContext _localctx = new ClassExpressionContext(_ctx, getState()); - enterRule(_localctx, 12, RULE_classExpression); - try { - setState(203); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(196); - classInstanceStatement(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(197); - staticMethodAccess(); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(198); - staticFieldAccess(); - } - break; - case 4: - enterOuterAlt(_localctx, 4); - { - setState(199); - staticClassReference(); - } - break; - case 5: - enterOuterAlt(_localctx, 5); - { - setState(200); - staticAccess(); - } - break; - case 6: - enterOuterAlt(_localctx, 6); - { - setState(201); - aliasDirectAccess(); - } - break; - case 7: - enterOuterAlt(_localctx, 7); - { - setState(202); - directMethodAccess(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ForeachDirectiveStatementContext extends ParserRuleContext { - public ForeachArgumentsContext foreachArguments() { - return getRuleContext(ForeachArgumentsContext.class,0); - } - public ForeachDirectiveStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_foreachDirectiveStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterForeachDirectiveStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitForeachDirectiveStatement(this); - } - } - - public final ForeachDirectiveStatementContext foreachDirectiveStatement() throws RecognitionException { - ForeachDirectiveStatementContext _localctx = new ForeachDirectiveStatementContext(_ctx, getState()); - enterRule(_localctx, 14, RULE_foreachDirectiveStatement); - try { - enterOuterAlt(_localctx, 1); - { - setState(205); - if (!(this.bladeParserContext.equals(ParserContext.FOREACH))) throw new FailedPredicateException(this, "this.bladeParserContext.equals(ParserContext.FOREACH)"); - setState(206); - foreachArguments(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ForeachArgumentsContext extends ParserRuleContext { - public Token main_array; - public Token array_item; - public Token array_key; - public TerminalNode AS() { return getToken(BladePhpAntlrParser.AS, 0); } - public List PHP_VARIABLE() { return getTokens(BladePhpAntlrParser.PHP_VARIABLE); } - public TerminalNode PHP_VARIABLE(int i) { - return getToken(BladePhpAntlrParser.PHP_VARIABLE, i); - } - public ArrayContext array() { - return getRuleContext(ArrayContext.class,0); - } - public TerminalNode ARROW() { return getToken(BladePhpAntlrParser.ARROW, 0); } - public List functionExpr() { - return getRuleContexts(FunctionExprContext.class); - } - public FunctionExprContext functionExpr(int i) { - return getRuleContext(FunctionExprContext.class,i); - } - public ForeachArgumentsContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_foreachArguments; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterForeachArguments(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitForeachArguments(this); - } - } - - public final ForeachArgumentsContext foreachArguments() throws RecognitionException { - ForeachArgumentsContext _localctx = new ForeachArgumentsContext(_ctx, getState()); - enterRule(_localctx, 16, RULE_foreachArguments); - try { - setState(229); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(210); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) { - case 1: - { - setState(208); - array(); - } - break; - case 2: - { - setState(209); - ((ForeachArgumentsContext)_localctx).main_array = match(PHP_VARIABLE); - } - break; - } - setState(212); - match(AS); - setState(213); - ((ForeachArgumentsContext)_localctx).array_item = match(PHP_VARIABLE); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(216); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) { - case 1: - { - setState(214); - array(); - } - break; - case 2: - { - setState(215); - ((ForeachArgumentsContext)_localctx).main_array = match(PHP_VARIABLE); - } - break; - } - setState(218); - match(AS); - setState(219); - ((ForeachArgumentsContext)_localctx).array_key = match(PHP_VARIABLE); - setState(220); - match(ARROW); - setState(221); - ((ForeachArgumentsContext)_localctx).array_item = match(PHP_VARIABLE); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(222); - functionExpr(); - setState(223); - match(AS); - setState(224); - functionExpr(); - setState(227); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,21,_ctx) ) { - case 1: - { - setState(225); - match(ARROW); - setState(226); - functionExpr(); - } - break; - } - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ClassInstanceStatementContext extends ParserRuleContext { - public Token className; - public TerminalNode NEW() { return getToken(BladePhpAntlrParser.NEW, 0); } - public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } - public NamespaceContext namespace() { - return getRuleContext(NamespaceContext.class,0); - } - public ArgumentsContext arguments() { - return getRuleContext(ArgumentsContext.class,0); - } - public ClassInstanceStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_classInstanceStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterClassInstanceStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitClassInstanceStatement(this); - } - } - - public final ClassInstanceStatementContext classInstanceStatement() throws RecognitionException { - ClassInstanceStatementContext _localctx = new ClassInstanceStatementContext(_ctx, getState()); - enterRule(_localctx, 18, RULE_classInstanceStatement); - try { - enterOuterAlt(_localctx, 1); - { - setState(231); - match(NEW); - setState(233); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,23,_ctx) ) { - case 1: - { - setState(232); - namespace(); - } - break; - } - setState(235); - ((ClassInstanceStatementContext)_localctx).className = match(IDENTIFIER); - setState(237); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) { - case 1: - { - setState(236); - arguments(); - } - break; - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class MatchStatementContext extends ParserRuleContext { - public TerminalNode MATCH() { return getToken(BladePhpAntlrParser.MATCH, 0); } - public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } - public List functionalExpr() { - return getRuleContexts(FunctionalExprContext.class); - } - public FunctionalExprContext functionalExpr(int i) { - return getRuleContext(FunctionalExprContext.class,i); - } - public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } - public TerminalNode LCURLYBRACE() { return getToken(BladePhpAntlrParser.LCURLYBRACE, 0); } - public TerminalNode RCURLYBRACE() { return getToken(BladePhpAntlrParser.RCURLYBRACE, 0); } - public List ARROW() { return getTokens(BladePhpAntlrParser.ARROW); } - public TerminalNode ARROW(int i) { - return getToken(BladePhpAntlrParser.ARROW, i); - } - public List COMMA() { return getTokens(BladePhpAntlrParser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(BladePhpAntlrParser.COMMA, i); - } - public MatchStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_matchStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterMatchStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitMatchStatement(this); - } - } - - public final MatchStatementContext matchStatement() throws RecognitionException { - MatchStatementContext _localctx = new MatchStatementContext(_ctx, getState()); - enterRule(_localctx, 20, RULE_matchStatement); - int _la; - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(239); - match(MATCH); - setState(240); - match(LPAREN); - setState(241); - functionalExpr(); - setState(242); - match(RPAREN); - setState(243); - match(LCURLYBRACE); - setState(268); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0)) { - { - { - setState(245); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(244); - functionalExpr(); - } - } - setState(247); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); - setState(257); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==COMMA) { - { - { - setState(249); - match(COMMA); - setState(251); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(250); - functionalExpr(); - } - } - setState(253); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); - } - } - setState(259); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(260); - match(ARROW); - setState(262); - _errHandler.sync(this); - _alt = 1; - do { - switch (_alt) { - case 1: - { - { - setState(261); - functionalExpr(); - } - } - break; - default: - throw new NoViableAltException(this); - } - setState(264); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,28,_ctx); - } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); - } - } - setState(270); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(296); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,34,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(271); - match(COMMA); - setState(273); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(272); - functionalExpr(); - } - } - setState(275); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); - setState(285); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==COMMA) { - { - { - setState(277); - match(COMMA); - setState(279); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(278); - functionalExpr(); - } - } - setState(281); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); - } - } - setState(287); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(288); - match(ARROW); - setState(290); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(289); - functionalExpr(); - } - } - setState(292); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); - } - } - } - setState(298); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,34,_ctx); - } - setState(300); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==COMMA) { - { - setState(299); - match(COMMA); - } - } - - setState(302); - match(RCURLYBRACE); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class StaticClassReferenceContext extends ParserRuleContext { - public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } - public TerminalNode DOUBLE_COLON() { return getToken(BladePhpAntlrParser.DOUBLE_COLON, 0); } - public TerminalNode CLASS() { return getToken(BladePhpAntlrParser.CLASS, 0); } - public NamespaceContext namespace() { - return getRuleContext(NamespaceContext.class,0); - } - public StaticClassReferenceContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_staticClassReference; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterStaticClassReference(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitStaticClassReference(this); - } - } - - public final StaticClassReferenceContext staticClassReference() throws RecognitionException { - StaticClassReferenceContext _localctx = new StaticClassReferenceContext(_ctx, getState()); - enterRule(_localctx, 22, RULE_staticClassReference); - try { - enterOuterAlt(_localctx, 1); - { - setState(305); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { - case 1: - { - setState(304); - namespace(); - } - break; - } - setState(307); - match(IDENTIFIER); - setState(308); - match(DOUBLE_COLON); - setState(309); - match(CLASS); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class StaticMethodAccessContext extends ParserRuleContext { - public Token className; - public Token method; - public TerminalNode DOUBLE_COLON() { return getToken(BladePhpAntlrParser.DOUBLE_COLON, 0); } - public ArgumentsContext arguments() { - return getRuleContext(ArgumentsContext.class,0); - } - public List IDENTIFIER() { return getTokens(BladePhpAntlrParser.IDENTIFIER); } - public TerminalNode IDENTIFIER(int i) { - return getToken(BladePhpAntlrParser.IDENTIFIER, i); - } - public NamespaceContext namespace() { - return getRuleContext(NamespaceContext.class,0); - } - public StaticMethodAccessContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_staticMethodAccess; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterStaticMethodAccess(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitStaticMethodAccess(this); - } - } - - public final StaticMethodAccessContext staticMethodAccess() throws RecognitionException { - StaticMethodAccessContext _localctx = new StaticMethodAccessContext(_ctx, getState()); - enterRule(_localctx, 24, RULE_staticMethodAccess); - try { - enterOuterAlt(_localctx, 1); - { - setState(312); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { - case 1: - { - setState(311); - namespace(); - } - break; - } - setState(314); - ((StaticMethodAccessContext)_localctx).className = match(IDENTIFIER); - setState(315); - match(DOUBLE_COLON); - setState(316); - ((StaticMethodAccessContext)_localctx).method = match(IDENTIFIER); - setState(317); - arguments(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class StaticFieldAccessContext extends ParserRuleContext { - public Token className; - public Token const_; - public Token propertyAlias; - public Token classAlias; - public TerminalNode DOUBLE_COLON() { return getToken(BladePhpAntlrParser.DOUBLE_COLON, 0); } - public List IDENTIFIER() { return getTokens(BladePhpAntlrParser.IDENTIFIER); } - public TerminalNode IDENTIFIER(int i) { - return getToken(BladePhpAntlrParser.IDENTIFIER, i); - } - public TerminalNode CLASS() { return getToken(BladePhpAntlrParser.CLASS, 0); } - public NamespaceContext namespace() { - return getRuleContext(NamespaceContext.class,0); - } - public List PHP_VARIABLE() { return getTokens(BladePhpAntlrParser.PHP_VARIABLE); } - public TerminalNode PHP_VARIABLE(int i) { - return getToken(BladePhpAntlrParser.PHP_VARIABLE, i); - } - public StaticFieldAccessContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_staticFieldAccess; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterStaticFieldAccess(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitStaticFieldAccess(this); - } - } - - public final StaticFieldAccessContext staticFieldAccess() throws RecognitionException { - StaticFieldAccessContext _localctx = new StaticFieldAccessContext(_ctx, getState()); - enterRule(_localctx, 26, RULE_staticFieldAccess); - try { - setState(335); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,40,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(320); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { - case 1: - { - setState(319); - namespace(); - } - break; - } - setState(322); - ((StaticFieldAccessContext)_localctx).className = match(IDENTIFIER); - setState(323); - match(DOUBLE_COLON); - setState(327); - _errHandler.sync(this); - switch (_input.LA(1)) { - case IDENTIFIER: - { - setState(324); - ((StaticFieldAccessContext)_localctx).const_ = match(IDENTIFIER); - } - break; - case PHP_VARIABLE: - { - setState(325); - ((StaticFieldAccessContext)_localctx).propertyAlias = match(PHP_VARIABLE); - } - break; - case CLASS: - { - setState(326); - match(CLASS); - } - break; - default: - throw new NoViableAltException(this); - } - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(329); - ((StaticFieldAccessContext)_localctx).classAlias = match(PHP_VARIABLE); - setState(330); - match(DOUBLE_COLON); - setState(331); - ((StaticFieldAccessContext)_localctx).const_ = match(IDENTIFIER); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(332); - ((StaticFieldAccessContext)_localctx).classAlias = match(PHP_VARIABLE); - setState(333); - match(DOUBLE_COLON); - setState(334); - ((StaticFieldAccessContext)_localctx).propertyAlias = match(PHP_VARIABLE); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class StaticAccessContext extends ParserRuleContext { - public Token className; - public TerminalNode DOUBLE_COLON() { return getToken(BladePhpAntlrParser.DOUBLE_COLON, 0); } - public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } - public NamespaceContext namespace() { - return getRuleContext(NamespaceContext.class,0); - } - public StaticAccessContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_staticAccess; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterStaticAccess(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitStaticAccess(this); - } - } - - public final StaticAccessContext staticAccess() throws RecognitionException { - StaticAccessContext _localctx = new StaticAccessContext(_ctx, getState()); - enterRule(_localctx, 28, RULE_staticAccess); - try { - enterOuterAlt(_localctx, 1); - { - setState(338); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { - case 1: - { - setState(337); - namespace(); - } - break; - } - setState(340); - ((StaticAccessContext)_localctx).className = match(IDENTIFIER); - setState(341); - match(DOUBLE_COLON); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class AliasDirectAccessContext extends ParserRuleContext { - public TerminalNode PHP_VARIABLE() { return getToken(BladePhpAntlrParser.PHP_VARIABLE, 0); } - public ClassMemberContext classMember() { - return getRuleContext(ClassMemberContext.class,0); - } - public AliasDirectAccessContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_aliasDirectAccess; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterAliasDirectAccess(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitAliasDirectAccess(this); - } - } - - public final AliasDirectAccessContext aliasDirectAccess() throws RecognitionException { - AliasDirectAccessContext _localctx = new AliasDirectAccessContext(_ctx, getState()); - enterRule(_localctx, 30, RULE_aliasDirectAccess); - try { - enterOuterAlt(_localctx, 1); - { - setState(343); - match(PHP_VARIABLE); - setState(344); - classMember(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ClassMemberContext extends ParserRuleContext { - public DirectMethodAccessContext directMethodAccess() { - return getRuleContext(DirectMethodAccessContext.class,0); - } - public TerminalNode OBJECT_OPERATOR() { return getToken(BladePhpAntlrParser.OBJECT_OPERATOR, 0); } - public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } - public ClassMemberContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_classMember; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterClassMember(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitClassMember(this); - } - } - - public final ClassMemberContext classMember() throws RecognitionException { - ClassMemberContext _localctx = new ClassMemberContext(_ctx, getState()); - enterRule(_localctx, 32, RULE_classMember); - try { - setState(349); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(346); - directMethodAccess(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(347); - match(OBJECT_OPERATOR); - setState(348); - match(IDENTIFIER); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class DirectMethodAccessContext extends ParserRuleContext { - public TerminalNode OBJECT_OPERATOR() { return getToken(BladePhpAntlrParser.OBJECT_OPERATOR, 0); } - public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } - public ArgumentsContext arguments() { - return getRuleContext(ArgumentsContext.class,0); - } - public DirectMethodAccessContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_directMethodAccess; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterDirectMethodAccess(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitDirectMethodAccess(this); - } - } - - public final DirectMethodAccessContext directMethodAccess() throws RecognitionException { - DirectMethodAccessContext _localctx = new DirectMethodAccessContext(_ctx, getState()); - enterRule(_localctx, 34, RULE_directMethodAccess); - try { - enterOuterAlt(_localctx, 1); - { - setState(351); - match(OBJECT_OPERATOR); - setState(352); - match(IDENTIFIER); - setState(353); - arguments(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class DirectAccessContext extends ParserRuleContext { - public List IDENTIFIER() { return getTokens(BladePhpAntlrParser.IDENTIFIER); } - public TerminalNode IDENTIFIER(int i) { - return getToken(BladePhpAntlrParser.IDENTIFIER, i); - } - public List arguments() { - return getRuleContexts(ArgumentsContext.class); - } - public ArgumentsContext arguments(int i) { - return getRuleContext(ArgumentsContext.class,i); - } - public TerminalNode OBJECT_OPERATOR() { return getToken(BladePhpAntlrParser.OBJECT_OPERATOR, 0); } - public DirectAccessContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_directAccess; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterDirectAccess(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitDirectAccess(this); - } - } - - public final DirectAccessContext directAccess() throws RecognitionException { - DirectAccessContext _localctx = new DirectAccessContext(_ctx, getState()); - enterRule(_localctx, 36, RULE_directAccess); - try { - enterOuterAlt(_localctx, 1); - { - setState(355); - match(IDENTIFIER); - setState(356); - arguments(); - setState(357); - match(OBJECT_OPERATOR); - setState(358); - match(IDENTIFIER); - setState(359); - arguments(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class FunctionExprContext extends ParserRuleContext { - public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } - public ArgumentsContext arguments() { - return getRuleContext(ArgumentsContext.class,0); - } - public FunctionExprContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_functionExpr; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterFunctionExpr(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitFunctionExpr(this); - } - } - - public final FunctionExprContext functionExpr() throws RecognitionException { - FunctionExprContext _localctx = new FunctionExprContext(_ctx, getState()); - enterRule(_localctx, 38, RULE_functionExpr); - try { - enterOuterAlt(_localctx, 1); - { - setState(361); - match(IDENTIFIER); - setState(362); - arguments(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ArgumentsContext extends ParserRuleContext { - public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } - public List argument() { - return getRuleContexts(ArgumentContext.class); - } - public ArgumentContext argument(int i) { - return getRuleContext(ArgumentContext.class,i); - } - public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } - public List COMMA() { return getTokens(BladePhpAntlrParser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(BladePhpAntlrParser.COMMA, i); - } - public ArgumentsContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_arguments; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterArguments(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitArguments(this); - } - } - - public final ArgumentsContext arguments() throws RecognitionException { - ArgumentsContext _localctx = new ArgumentsContext(_ctx, getState()); - enterRule(_localctx, 40, RULE_arguments); - int _la; - try { - setState(377); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(364); - match(LPAREN); - setState(365); - argument(); - setState(370); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==COMMA) { - { - { - setState(366); - match(COMMA); - setState(367); - argument(); - } - } - setState(372); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(373); - match(RPAREN); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(375); - match(LPAREN); - setState(376); - match(RPAREN); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class NamespaceContext extends ParserRuleContext { - public List NAMESPACE_SEPARATOR() { return getTokens(BladePhpAntlrParser.NAMESPACE_SEPARATOR); } - public TerminalNode NAMESPACE_SEPARATOR(int i) { - return getToken(BladePhpAntlrParser.NAMESPACE_SEPARATOR, i); - } - public List IDENTIFIER() { return getTokens(BladePhpAntlrParser.IDENTIFIER); } - public TerminalNode IDENTIFIER(int i) { - return getToken(BladePhpAntlrParser.IDENTIFIER, i); - } - public NamespaceContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_namespace; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterNamespace(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitNamespace(this); - } - } - - public final NamespaceContext namespace() throws RecognitionException { - NamespaceContext _localctx = new NamespaceContext(_ctx, getState()); - enterRule(_localctx, 42, RULE_namespace); - int _la; - try { - int _alt; - setState(389); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(380); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==NAMESPACE_SEPARATOR) { - { - setState(379); - match(NAMESPACE_SEPARATOR); - } - } - - setState(384); - _errHandler.sync(this); - _alt = 1; - do { - switch (_alt) { - case 1: - { - { - setState(382); - match(IDENTIFIER); - setState(383); - match(NAMESPACE_SEPARATOR); - } - } - break; - default: - throw new NoViableAltException(this); - } - setState(386); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,46,_ctx); - } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(388); - match(NAMESPACE_SEPARATOR); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ArgumentContext extends ParserRuleContext { - public FunctionalExprContext functionalExpr() { - return getRuleContext(FunctionalExprContext.class,0); - } - public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } - public ArgumentContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_argument; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterArgument(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitArgument(this); - } - } - - public final ArgumentContext argument() throws RecognitionException { - ArgumentContext _localctx = new ArgumentContext(_ctx, getState()); - enterRule(_localctx, 44, RULE_argument); - try { - setState(393); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(391); - functionalExpr(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(392); - match(IDENTIFIER); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class ArrayContext extends ParserRuleContext { - public TerminalNode PHP_VARIABLE() { return getToken(BladePhpAntlrParser.PHP_VARIABLE, 0); } - public List array_key_item() { - return getRuleContexts(Array_key_itemContext.class); - } - public Array_key_itemContext array_key_item(int i) { - return getRuleContext(Array_key_itemContext.class,i); - } - public ArrayContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_array; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterArray(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitArray(this); - } - } - - public final ArrayContext array() throws RecognitionException { - ArrayContext _localctx = new ArrayContext(_ctx, getState()); - enterRule(_localctx, 46, RULE_array); - try { - int _alt; - setState(402); - _errHandler.sync(this); - switch (_input.LA(1)) { - case PHP_VARIABLE: - enterOuterAlt(_localctx, 1); - { - setState(395); - match(PHP_VARIABLE); - setState(397); - _errHandler.sync(this); - _alt = 1; - do { - switch (_alt) { - case 1: - { - { - setState(396); - array_key_item(); - } - } - break; - default: - throw new NoViableAltException(this); - } - setState(399); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,49,_ctx); - } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); - } - break; - case ARRAY: - case LSQUAREBRACKET: - enterOuterAlt(_localctx, 2); - { - setState(401); - array_key_item(); - } - break; - default: - throw new NoViableAltException(this); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Array_key_itemContext extends ParserRuleContext { - public TerminalNode LSQUAREBRACKET() { return getToken(BladePhpAntlrParser.LSQUAREBRACKET, 0); } - public TerminalNode RSQUAREBRACKET() { return getToken(BladePhpAntlrParser.RSQUAREBRACKET, 0); } - public List array_key_item() { - return getRuleContexts(Array_key_itemContext.class); - } - public Array_key_itemContext array_key_item(int i) { - return getRuleContext(Array_key_itemContext.class,i); - } - public TerminalNode ARRAY() { return getToken(BladePhpAntlrParser.ARRAY, 0); } - public TerminalNode LPAREN() { return getToken(BladePhpAntlrParser.LPAREN, 0); } - public TerminalNode RPAREN() { return getToken(BladePhpAntlrParser.RPAREN, 0); } - public List array_child() { - return getRuleContexts(Array_childContext.class); - } - public Array_childContext array_child(int i) { - return getRuleContext(Array_childContext.class,i); - } - public List ARROW() { return getTokens(BladePhpAntlrParser.ARROW); } - public TerminalNode ARROW(int i) { - return getToken(BladePhpAntlrParser.ARROW, i); - } - public List COMMA() { return getTokens(BladePhpAntlrParser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(BladePhpAntlrParser.COMMA, i); - } - public Array_key_itemContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_array_key_item; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterArray_key_item(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitArray_key_item(this); - } - } - - public final Array_key_itemContext array_key_item() throws RecognitionException { - Array_key_itemContext _localctx = new Array_key_itemContext(_ctx, getState()); - enterRule(_localctx, 48, RULE_array_key_item); - int _la; - try { - int _alt; - setState(473); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(404); - match(LSQUAREBRACKET); - setState(408); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==ARRAY || _la==LSQUAREBRACKET) { - { - { - setState(405); - array_key_item(); - } - } - setState(410); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(411); - match(RSQUAREBRACKET); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(412); - match(ARRAY); - setState(413); - match(LPAREN); - setState(417); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==ARRAY || _la==LSQUAREBRACKET) { - { - { - setState(414); - array_key_item(); - } - } - setState(419); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(420); - match(RPAREN); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(421); - match(LSQUAREBRACKET); - setState(426); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(422); - array_child(); - setState(423); - match(ARROW); - setState(424); - array_key_item(); - } - } - setState(428); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); - setState(430); - match(RSQUAREBRACKET); - } - break; - case 4: - enterOuterAlt(_localctx, 4); - { - setState(432); - match(ARRAY); - setState(433); - match(LPAREN); - setState(438); - _errHandler.sync(this); - _la = _input.LA(1); - do { - { - { - setState(434); - array_child(); - setState(435); - match(ARROW); - setState(436); - array_key_item(); - } - } - setState(440); - _errHandler.sync(this); - _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 9253184528L) != 0) ); - setState(442); - match(RPAREN); - } - break; - case 5: - enterOuterAlt(_localctx, 5); - { - setState(444); - match(LSQUAREBRACKET); - setState(445); - array_child(); - setState(450); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,55,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(446); - match(COMMA); - setState(447); - array_child(); - } - } - } - setState(452); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,55,_ctx); - } - setState(454); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==COMMA) { - { - setState(453); - match(COMMA); - } - } - - setState(456); - match(RSQUAREBRACKET); - } - break; - case 6: - enterOuterAlt(_localctx, 6); - { - setState(458); - match(ARRAY); - setState(459); - match(LPAREN); - setState(460); - array_child(); - setState(465); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,57,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(461); - match(COMMA); - setState(462); - array_child(); - } - } - } - setState(467); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,57,_ctx); - } - setState(469); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==COMMA) { - { - setState(468); - match(COMMA); - } - } - - setState(471); - match(RPAREN); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class Array_childContext extends ParserRuleContext { - public List functionalExpr() { - return getRuleContexts(FunctionalExprContext.class); - } - public FunctionalExprContext functionalExpr(int i) { - return getRuleContext(FunctionalExprContext.class,i); - } - public TerminalNode ARROW() { return getToken(BladePhpAntlrParser.ARROW, 0); } - public Array_key_itemContext array_key_item() { - return getRuleContext(Array_key_itemContext.class,0); - } - public Array_childContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_array_child; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterArray_child(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitArray_child(this); - } - } - - public final Array_childContext array_child() throws RecognitionException { - Array_childContext _localctx = new Array_childContext(_ctx, getState()); - enterRule(_localctx, 50, RULE_array_child); - try { - setState(484); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(475); - functionalExpr(); - setState(476); - match(ARROW); - setState(477); - array_key_item(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(479); - functionalExpr(); - setState(480); - match(ARROW); - setState(481); - functionalExpr(); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(483); - functionalExpr(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class VarExprContext extends ParserRuleContext { - public ArrayContext array() { - return getRuleContext(ArrayContext.class,0); - } - public TerminalNode PHP_VARIABLE() { return getToken(BladePhpAntlrParser.PHP_VARIABLE, 0); } - public TerminalNode DOLLAR() { return getToken(BladePhpAntlrParser.DOLLAR, 0); } - public TerminalNode STRING_LITERAL() { return getToken(BladePhpAntlrParser.STRING_LITERAL, 0); } - public VarExprContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_varExpr; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterVarExpr(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitVarExpr(this); - } - } - - public final VarExprContext varExpr() throws RecognitionException { - VarExprContext _localctx = new VarExprContext(_ctx, getState()); - enterRule(_localctx, 52, RULE_varExpr); - int _la; - try { - setState(492); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,62,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(486); - array(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(488); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==DOLLAR) { - { - setState(487); - match(DOLLAR); - } - } - - setState(490); - match(PHP_VARIABLE); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(491); - match(STRING_LITERAL); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class MiscContext extends ParserRuleContext { - public Token className; - public TerminalNode NEW() { return getToken(BladePhpAntlrParser.NEW, 0); } - public TerminalNode PHP_VARIABLE() { return getToken(BladePhpAntlrParser.PHP_VARIABLE, 0); } - public ArgumentsContext arguments() { - return getRuleContext(ArgumentsContext.class,0); - } - public NamespaceContext namespace() { - return getRuleContext(NamespaceContext.class,0); - } - public TerminalNode IDENTIFIER() { return getToken(BladePhpAntlrParser.IDENTIFIER, 0); } - public MiscContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_misc; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterMisc(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitMisc(this); - } - } - - public final MiscContext misc() throws RecognitionException { - MiscContext _localctx = new MiscContext(_ctx, getState()); - enterRule(_localctx, 54, RULE_misc); - try { - setState(504); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(494); - match(NEW); - setState(495); - match(PHP_VARIABLE); - setState(497); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { - case 1: - { - setState(496); - arguments(); - } - break; - } - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(499); - match(NEW); - setState(500); - namespace(); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(501); - namespace(); - setState(502); - ((MiscContext)_localctx).className = match(IDENTIFIER); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class OutputContext extends ParserRuleContext { - public TerminalNode ECHO() { return getToken(BladePhpAntlrParser.ECHO, 0); } - public FunctionalExprContext functionalExpr() { - return getRuleContext(FunctionalExprContext.class,0); - } - public OutputContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_output; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).enterOutput(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BladePhpAntlrParserListener ) ((BladePhpAntlrParserListener)listener).exitOutput(this); - } - } - - public final OutputContext output() throws RecognitionException { - OutputContext _localctx = new OutputContext(_ctx, getState()); - enterRule(_localctx, 56, RULE_output); - try { - enterOuterAlt(_localctx, 1); - { - setState(506); - match(ECHO); - setState(507); - functionalExpr(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { - switch (ruleIndex) { - case 7: - return foreachDirectiveStatement_sempred((ForeachDirectiveStatementContext)_localctx, predIndex); - } - return true; - } - private boolean foreachDirectiveStatement_sempred(ForeachDirectiveStatementContext _localctx, int predIndex) { - switch (predIndex) { - case 0: - return this.bladeParserContext.equals(ParserContext.FOREACH); - } - return true; - } - - public static final String _serializedATN = - "\u0004\u0001,\u01fe\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ - "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ - "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ - "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ - "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"+ - "\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012"+ - "\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015"+ - "\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018"+ - "\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007\u001b"+ - "\u0002\u001c\u0007\u001c\u0001\u0000\u0005\u0000<\b\u0000\n\u0000\f\u0000"+ - "?\t\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0005\u0001F\b\u0001\n\u0001\f\u0001I\t\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0005\u0001N\b\u0001\n\u0001\f\u0001Q\t\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0001X\b\u0001"+ - "\u000b\u0001\f\u0001Y\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0003\u0001f\b\u0001\u0001\u0002\u0001\u0002\u0005\u0002j\b\u0002\n\u0002"+ - "\f\u0002m\t\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0004"+ - "\u0002s\b\u0002\u000b\u0002\f\u0002t\u0001\u0002\u0001\u0002\u0001\u0002"+ - "\u0004\u0002z\b\u0002\u000b\u0002\f\u0002{\u0001\u0002\u0003\u0002\u007f"+ - "\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0004\u0003\u0084\b\u0003"+ - "\u000b\u0003\f\u0003\u0085\u0001\u0003\u0001\u0003\u0001\u0003\u0005\u0003"+ - "\u008b\b\u0003\n\u0003\f\u0003\u008e\t\u0003\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0001\u0003\u0004\u0003\u0094\b\u0003\u000b\u0003\f\u0003\u0095"+ - "\u0001\u0003\u0001\u0003\u0001\u0003\u0005\u0003\u009b\b\u0003\n\u0003"+ - "\f\u0003\u009e\t\u0003\u0001\u0003\u0001\u0003\u0005\u0003\u00a2\b\u0003"+ - "\n\u0003\f\u0003\u00a5\t\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0005"+ - "\u0003\u00aa\b\u0003\n\u0003\f\u0003\u00ad\t\u0003\u0001\u0003\u0003\u0003"+ - "\u00b0\b\u0003\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005"+ - "\u0005\u0005\u00b7\b\u0005\n\u0005\f\u0005\u00ba\t\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003"+ - "\u0005\u00c3\b\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0003\u0006\u00cc\b\u0006\u0001\u0007\u0001"+ - "\u0007\u0001\u0007\u0001\b\u0001\b\u0003\b\u00d3\b\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0003\b\u00d9\b\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0003\b\u00e4\b\b\u0003\b\u00e6\b\b\u0001\t"+ - "\u0001\t\u0003\t\u00ea\b\t\u0001\t\u0001\t\u0003\t\u00ee\b\t\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0004\n\u00f6\b\n\u000b\n\f\n\u00f7"+ - "\u0001\n\u0001\n\u0004\n\u00fc\b\n\u000b\n\f\n\u00fd\u0005\n\u0100\b\n"+ - "\n\n\f\n\u0103\t\n\u0001\n\u0001\n\u0004\n\u0107\b\n\u000b\n\f\n\u0108"+ - "\u0005\n\u010b\b\n\n\n\f\n\u010e\t\n\u0001\n\u0001\n\u0004\n\u0112\b\n"+ - "\u000b\n\f\n\u0113\u0001\n\u0001\n\u0004\n\u0118\b\n\u000b\n\f\n\u0119"+ - "\u0005\n\u011c\b\n\n\n\f\n\u011f\t\n\u0001\n\u0001\n\u0004\n\u0123\b\n"+ - "\u000b\n\f\n\u0124\u0005\n\u0127\b\n\n\n\f\n\u012a\t\n\u0001\n\u0003\n"+ - "\u012d\b\n\u0001\n\u0001\n\u0001\u000b\u0003\u000b\u0132\b\u000b\u0001"+ - "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0003\f\u0139\b\f\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0003\r\u0141\b\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0003\r\u0148\b\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0003\r\u0150\b\r\u0001\u000e\u0003\u000e\u0153\b\u000e"+ - "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f"+ - "\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u015e\b\u0010\u0001\u0011"+ - "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012"+ - "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013"+ - "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0005\u0014\u0171\b\u0014"+ - "\n\u0014\f\u0014\u0174\t\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ - "\u0014\u0003\u0014\u017a\b\u0014\u0001\u0015\u0003\u0015\u017d\b\u0015"+ - "\u0001\u0015\u0001\u0015\u0004\u0015\u0181\b\u0015\u000b\u0015\f\u0015"+ - "\u0182\u0001\u0015\u0003\u0015\u0186\b\u0015\u0001\u0016\u0001\u0016\u0003"+ - "\u0016\u018a\b\u0016\u0001\u0017\u0001\u0017\u0004\u0017\u018e\b\u0017"+ - "\u000b\u0017\f\u0017\u018f\u0001\u0017\u0003\u0017\u0193\b\u0017\u0001"+ - "\u0018\u0001\u0018\u0005\u0018\u0197\b\u0018\n\u0018\f\u0018\u019a\t\u0018"+ - "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0005\u0018\u01a0\b\u0018"+ - "\n\u0018\f\u0018\u01a3\t\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0004\u0018\u01ab\b\u0018\u000b\u0018\f"+ - "\u0018\u01ac\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ - "\u0001\u0018\u0001\u0018\u0001\u0018\u0004\u0018\u01b7\b\u0018\u000b\u0018"+ - "\f\u0018\u01b8\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ - "\u0001\u0018\u0005\u0018\u01c1\b\u0018\n\u0018\f\u0018\u01c4\t\u0018\u0001"+ - "\u0018\u0003\u0018\u01c7\b\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0005\u0018\u01d0\b\u0018\n"+ - "\u0018\f\u0018\u01d3\t\u0018\u0001\u0018\u0003\u0018\u01d6\b\u0018\u0001"+ - "\u0018\u0001\u0018\u0003\u0018\u01da\b\u0018\u0001\u0019\u0001\u0019\u0001"+ - "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ - "\u0019\u0003\u0019\u01e5\b\u0019\u0001\u001a\u0001\u001a\u0003\u001a\u01e9"+ - "\b\u001a\u0001\u001a\u0001\u001a\u0003\u001a\u01ed\b\u001a\u0001\u001b"+ - "\u0001\u001b\u0001\u001b\u0003\u001b\u01f2\b\u001b\u0001\u001b\u0001\u001b"+ - "\u0001\u001b\u0001\u001b\u0001\u001b\u0003\u001b\u01f9\b\u001b\u0001\u001c"+ - "\u0001\u001c\u0001\u001c\u0001\u001c\u0000\u0000\u001d\u0000\u0002\u0004"+ - "\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \""+ - "$&(*,.02468\u0000\u0000\u023e\u0000=\u0001\u0000\u0000\u0000\u0002e\u0001"+ - "\u0000\u0000\u0000\u0004~\u0001\u0000\u0000\u0000\u0006\u0080\u0001\u0000"+ - "\u0000\u0000\b\u00b1\u0001\u0000\u0000\u0000\n\u00c2\u0001\u0000\u0000"+ - "\u0000\f\u00cb\u0001\u0000\u0000\u0000\u000e\u00cd\u0001\u0000\u0000\u0000"+ - "\u0010\u00e5\u0001\u0000\u0000\u0000\u0012\u00e7\u0001\u0000\u0000\u0000"+ - "\u0014\u00ef\u0001\u0000\u0000\u0000\u0016\u0131\u0001\u0000\u0000\u0000"+ - "\u0018\u0138\u0001\u0000\u0000\u0000\u001a\u014f\u0001\u0000\u0000\u0000"+ - "\u001c\u0152\u0001\u0000\u0000\u0000\u001e\u0157\u0001\u0000\u0000\u0000"+ - " \u015d\u0001\u0000\u0000\u0000\"\u015f\u0001\u0000\u0000\u0000$\u0163"+ - "\u0001\u0000\u0000\u0000&\u0169\u0001\u0000\u0000\u0000(\u0179\u0001\u0000"+ - "\u0000\u0000*\u0185\u0001\u0000\u0000\u0000,\u0189\u0001\u0000\u0000\u0000"+ - ".\u0192\u0001\u0000\u0000\u00000\u01d9\u0001\u0000\u0000\u00002\u01e4"+ - "\u0001\u0000\u0000\u00004\u01ec\u0001\u0000\u0000\u00006\u01f8\u0001\u0000"+ - "\u0000\u00008\u01fa\u0001\u0000\u0000\u0000:<\u0003\u0002\u0001\u0000"+ - ";:\u0001\u0000\u0000\u0000\u0001\u0000\u0000\u0000>@\u0001\u0000\u0000\u0000?=\u0001\u0000"+ - "\u0000\u0000@A\u0005\u0000\u0000\u0001A\u0001\u0001\u0000\u0000\u0000"+ - "Bf\u0005\u001e\u0000\u0000CG\u0005\u0015\u0000\u0000DF\u0003\u0002\u0001"+ - "\u0000ED\u0001\u0000\u0000\u0000FI\u0001\u0000\u0000\u0000GE\u0001\u0000"+ - "\u0000\u0000GH\u0001\u0000\u0000\u0000HJ\u0001\u0000\u0000\u0000IG\u0001"+ - "\u0000\u0000\u0000Jf\u0005\u0016\u0000\u0000KO\u0005\u0011\u0000\u0000"+ - "LN\u0003\u0002\u0001\u0000ML\u0001\u0000\u0000\u0000NQ\u0001\u0000\u0000"+ - "\u0000OM\u0001\u0000\u0000\u0000OP\u0001\u0000\u0000\u0000PR\u0001\u0000"+ - "\u0000\u0000QO\u0001\u0000\u0000\u0000Rf\u0005\u0012\u0000\u0000ST\u0005"+ - "\u001f\u0000\u0000Tf\u0003\u0002\u0001\u0000UW\u0005 \u0000\u0000VX\u0003"+ - "\n\u0005\u0000WV\u0001\u0000\u0000\u0000XY\u0001\u0000\u0000\u0000YW\u0001"+ - "\u0000\u0000\u0000YZ\u0001\u0000\u0000\u0000Zf\u0001\u0000\u0000\u0000"+ - "[\\\u0005\u000f\u0000\u0000\\]\u0005\u0011\u0000\u0000]^\u0003\u0010\b"+ - "\u0000^_\u0005\u0012\u0000\u0000_f\u0001\u0000\u0000\u0000`f\u0003\n\u0005"+ - "\u0000af\u0003\u0006\u0003\u0000bf\u0003\u000e\u0007\u0000cf\u00038\u001c"+ - "\u0000df\u00036\u001b\u0000eB\u0001\u0000\u0000\u0000eC\u0001\u0000\u0000"+ - "\u0000eK\u0001\u0000\u0000\u0000eS\u0001\u0000\u0000\u0000eU\u0001\u0000"+ - "\u0000\u0000e[\u0001\u0000\u0000\u0000e`\u0001\u0000\u0000\u0000ea\u0001"+ - "\u0000\u0000\u0000eb\u0001\u0000\u0000\u0000ec\u0001\u0000\u0000\u0000"+ - "ed\u0001\u0000\u0000\u0000f\u0003\u0001\u0000\u0000\u0000gk\u0005\u0011"+ - "\u0000\u0000hj\u0003\n\u0005\u0000ih\u0001\u0000\u0000\u0000jm\u0001\u0000"+ - "\u0000\u0000ki\u0001\u0000\u0000\u0000kl\u0001\u0000\u0000\u0000ln\u0001"+ - "\u0000\u0000\u0000mk\u0001\u0000\u0000\u0000n\u007f\u0005\u0012\u0000"+ - "\u0000or\u0003\n\u0005\u0000pq\u0005 \u0000\u0000qs\u0003\n\u0005\u0000"+ - "rp\u0001\u0000\u0000\u0000st\u0001\u0000\u0000\u0000tr\u0001\u0000\u0000"+ - "\u0000tu\u0001\u0000\u0000\u0000u\u007f\u0001\u0000\u0000\u0000vy\u0003"+ - "\n\u0005\u0000wx\u0005\u001f\u0000\u0000xz\u0003\n\u0005\u0000yw\u0001"+ - "\u0000\u0000\u0000z{\u0001\u0000\u0000\u0000{y\u0001\u0000\u0000\u0000"+ - "{|\u0001\u0000\u0000\u0000|\u007f\u0001\u0000\u0000\u0000}\u007f\u0003"+ - "\n\u0005\u0000~g\u0001\u0000\u0000\u0000~o\u0001\u0000\u0000\u0000~v\u0001"+ - "\u0000\u0000\u0000~}\u0001\u0000\u0000\u0000\u007f\u0005\u0001\u0000\u0000"+ - "\u0000\u0080\u0081\u0005\u0007\u0000\u0000\u0081\u0083\u0005\u0011\u0000"+ - "\u0000\u0082\u0084\u0003\u0004\u0002\u0000\u0083\u0082\u0001\u0000\u0000"+ - "\u0000\u0084\u0085\u0001\u0000\u0000\u0000\u0085\u0083\u0001\u0000\u0000"+ - "\u0000\u0085\u0086\u0001\u0000\u0000\u0000\u0086\u0087\u0001\u0000\u0000"+ - "\u0000\u0087\u0088\u0005\u0012\u0000\u0000\u0088\u008c\u0005\u0015\u0000"+ - "\u0000\u0089\u008b\u0003\u0002\u0001\u0000\u008a\u0089\u0001\u0000\u0000"+ - "\u0000\u008b\u008e\u0001\u0000\u0000\u0000\u008c\u008a\u0001\u0000\u0000"+ - "\u0000\u008c\u008d\u0001\u0000\u0000\u0000\u008d\u008f\u0001\u0000\u0000"+ - "\u0000\u008e\u008c\u0001\u0000\u0000\u0000\u008f\u00a3\u0005\u0016\u0000"+ - "\u0000\u0090\u0091\u0005\b\u0000\u0000\u0091\u0093\u0005\u0011\u0000\u0000"+ - "\u0092\u0094\u0003\u0004\u0002\u0000\u0093\u0092\u0001\u0000\u0000\u0000"+ - "\u0094\u0095\u0001\u0000\u0000\u0000\u0095\u0093\u0001\u0000\u0000\u0000"+ - "\u0095\u0096\u0001\u0000\u0000\u0000\u0096\u0097\u0001\u0000\u0000\u0000"+ - "\u0097\u0098\u0005\u0012\u0000\u0000\u0098\u009c\u0005\u0015\u0000\u0000"+ - "\u0099\u009b\u0003\u0002\u0001\u0000\u009a\u0099\u0001\u0000\u0000\u0000"+ - "\u009b\u009e\u0001\u0000\u0000\u0000\u009c\u009a\u0001\u0000\u0000\u0000"+ - "\u009c\u009d\u0001\u0000\u0000\u0000\u009d\u009f\u0001\u0000\u0000\u0000"+ - "\u009e\u009c\u0001\u0000\u0000\u0000\u009f\u00a0\u0005\u0016\u0000\u0000"+ - "\u00a0\u00a2\u0001\u0000\u0000\u0000\u00a1\u0090\u0001\u0000\u0000\u0000"+ - "\u00a2\u00a5\u0001\u0000\u0000\u0000\u00a3\u00a1\u0001\u0000\u0000\u0000"+ - "\u00a3\u00a4\u0001\u0000\u0000\u0000\u00a4\u00af\u0001\u0000\u0000\u0000"+ - "\u00a5\u00a3\u0001\u0000\u0000\u0000\u00a6\u00a7\u0005\t\u0000\u0000\u00a7"+ - "\u00ab\u0005\u0015\u0000\u0000\u00a8\u00aa\u0003\u0002\u0001\u0000\u00a9"+ - "\u00a8\u0001\u0000\u0000\u0000\u00aa\u00ad\u0001\u0000\u0000\u0000\u00ab"+ - "\u00a9\u0001\u0000\u0000\u0000\u00ab\u00ac\u0001\u0000\u0000\u0000\u00ac"+ - "\u00ae\u0001\u0000\u0000\u0000\u00ad\u00ab\u0001\u0000\u0000\u0000\u00ae"+ - "\u00b0\u0005\u0016\u0000\u0000\u00af\u00a6\u0001\u0000\u0000\u0000\u00af"+ - "\u00b0\u0001\u0000\u0000\u0000\u00b0\u0007\u0001\u0000\u0000\u0000\u00b1"+ - "\u00b2\u00034\u001a\u0000\u00b2\t\u0001\u0000\u0000\u0000\u00b3\u00c3"+ - "\u0003\u0014\n\u0000\u00b4\u00b8\u0003\f\u0006\u0000\u00b5\u00b7\u0003"+ - " \u0010\u0000\u00b6\u00b5\u0001\u0000\u0000\u0000\u00b7\u00ba\u0001\u0000"+ - "\u0000\u0000\u00b8\u00b6\u0001\u0000\u0000\u0000\u00b8\u00b9\u0001\u0000"+ - "\u0000\u0000\u00b9\u00c3\u0001\u0000\u0000\u0000\u00ba\u00b8\u0001\u0000"+ - "\u0000\u0000\u00bb\u00c3\u0003&\u0013\u0000\u00bc\u00bd\u0005\r\u0000"+ - "\u0000\u00bd\u00be\u0005\u0011\u0000\u0000\u00be\u00bf\u0003\n\u0005\u0000"+ - "\u00bf\u00c0\u0005\u0012\u0000\u0000\u00c0\u00c3\u0001\u0000\u0000\u0000"+ - "\u00c1\u00c3\u0003\b\u0004\u0000\u00c2\u00b3\u0001\u0000\u0000\u0000\u00c2"+ - "\u00b4\u0001\u0000\u0000\u0000\u00c2\u00bb\u0001\u0000\u0000\u0000\u00c2"+ - "\u00bc\u0001\u0000\u0000\u0000\u00c2\u00c1\u0001\u0000\u0000\u0000\u00c3"+ - "\u000b\u0001\u0000\u0000\u0000\u00c4\u00cc\u0003\u0012\t\u0000\u00c5\u00cc"+ - "\u0003\u0018\f\u0000\u00c6\u00cc\u0003\u001a\r\u0000\u00c7\u00cc\u0003"+ - "\u0016\u000b\u0000\u00c8\u00cc\u0003\u001c\u000e\u0000\u00c9\u00cc\u0003"+ - "\u001e\u000f\u0000\u00ca\u00cc\u0003\"\u0011\u0000\u00cb\u00c4\u0001\u0000"+ - "\u0000\u0000\u00cb\u00c5\u0001\u0000\u0000\u0000\u00cb\u00c6\u0001\u0000"+ - "\u0000\u0000\u00cb\u00c7\u0001\u0000\u0000\u0000\u00cb\u00c8\u0001\u0000"+ - "\u0000\u0000\u00cb\u00c9\u0001\u0000\u0000\u0000\u00cb\u00ca\u0001\u0000"+ - "\u0000\u0000\u00cc\r\u0001\u0000\u0000\u0000\u00cd\u00ce\u0004\u0007\u0000"+ - "\u0000\u00ce\u00cf\u0003\u0010\b\u0000\u00cf\u000f\u0001\u0000\u0000\u0000"+ - "\u00d0\u00d3\u0003.\u0017\u0000\u00d1\u00d3\u0005\u0018\u0000\u0000\u00d2"+ - "\u00d0\u0001\u0000\u0000\u0000\u00d2\u00d1\u0001\u0000\u0000\u0000\u00d3"+ - "\u00d4\u0001\u0000\u0000\u0000\u00d4\u00d5\u0005\u0005\u0000\u0000\u00d5"+ - "\u00e6\u0005\u0018\u0000\u0000\u00d6\u00d9\u0003.\u0017\u0000\u00d7\u00d9"+ - "\u0005\u0018\u0000\u0000\u00d8\u00d6\u0001\u0000\u0000\u0000\u00d8\u00d7"+ - "\u0001\u0000\u0000\u0000\u00d9\u00da\u0001\u0000\u0000\u0000\u00da\u00db"+ - "\u0005\u0005\u0000\u0000\u00db\u00dc\u0005\u0018\u0000\u0000\u00dc\u00dd"+ - "\u0005\u001c\u0000\u0000\u00dd\u00e6\u0005\u0018\u0000\u0000\u00de\u00df"+ - "\u0003&\u0013\u0000\u00df\u00e0\u0005\u0005\u0000\u0000\u00e0\u00e3\u0003"+ - "&\u0013\u0000\u00e1\u00e2\u0005\u001c\u0000\u0000\u00e2\u00e4\u0003&\u0013"+ - "\u0000\u00e3\u00e1\u0001\u0000\u0000\u0000\u00e3\u00e4\u0001\u0000\u0000"+ - "\u0000\u00e4\u00e6\u0001\u0000\u0000\u0000\u00e5\u00d2\u0001\u0000\u0000"+ - "\u0000\u00e5\u00d8\u0001\u0000\u0000\u0000\u00e5\u00de\u0001\u0000\u0000"+ - "\u0000\u00e6\u0011\u0001\u0000\u0000\u0000\u00e7\u00e9\u0005\n\u0000\u0000"+ - "\u00e8\u00ea\u0003*\u0015\u0000\u00e9\u00e8\u0001\u0000\u0000\u0000\u00e9"+ - "\u00ea\u0001\u0000\u0000\u0000\u00ea\u00eb\u0001\u0000\u0000\u0000\u00eb"+ - "\u00ed\u0005\u0017\u0000\u0000\u00ec\u00ee\u0003(\u0014\u0000\u00ed\u00ec"+ - "\u0001\u0000\u0000\u0000\u00ed\u00ee\u0001\u0000\u0000\u0000\u00ee\u0013"+ - "\u0001\u0000\u0000\u0000\u00ef\u00f0\u0005\u000e\u0000\u0000\u00f0\u00f1"+ - "\u0005\u0011\u0000\u0000\u00f1\u00f2\u0003\n\u0005\u0000\u00f2\u00f3\u0005"+ - "\u0012\u0000\u0000\u00f3\u010c\u0005\u0015\u0000\u0000\u00f4\u00f6\u0003"+ - "\n\u0005\u0000\u00f5\u00f4\u0001\u0000\u0000\u0000\u00f6\u00f7\u0001\u0000"+ - "\u0000\u0000\u00f7\u00f5\u0001\u0000\u0000\u0000\u00f7\u00f8\u0001\u0000"+ - "\u0000\u0000\u00f8\u0101\u0001\u0000\u0000\u0000\u00f9\u00fb\u0005\u0010"+ - "\u0000\u0000\u00fa\u00fc\u0003\n\u0005\u0000\u00fb\u00fa\u0001\u0000\u0000"+ - "\u0000\u00fc\u00fd\u0001\u0000\u0000\u0000\u00fd\u00fb\u0001\u0000\u0000"+ - "\u0000\u00fd\u00fe\u0001\u0000\u0000\u0000\u00fe\u0100\u0001\u0000\u0000"+ - "\u0000\u00ff\u00f9\u0001\u0000\u0000\u0000\u0100\u0103\u0001\u0000\u0000"+ - "\u0000\u0101\u00ff\u0001\u0000\u0000\u0000\u0101\u0102\u0001\u0000\u0000"+ - "\u0000\u0102\u0104\u0001\u0000\u0000\u0000\u0103\u0101\u0001\u0000\u0000"+ - "\u0000\u0104\u0106\u0005\u001c\u0000\u0000\u0105\u0107\u0003\n\u0005\u0000"+ - "\u0106\u0105\u0001\u0000\u0000\u0000\u0107\u0108\u0001\u0000\u0000\u0000"+ - "\u0108\u0106\u0001\u0000\u0000\u0000\u0108\u0109\u0001\u0000\u0000\u0000"+ - "\u0109\u010b\u0001\u0000\u0000\u0000\u010a\u00f5\u0001\u0000\u0000\u0000"+ - "\u010b\u010e\u0001\u0000\u0000\u0000\u010c\u010a\u0001\u0000\u0000\u0000"+ - "\u010c\u010d\u0001\u0000\u0000\u0000\u010d\u0128\u0001\u0000\u0000\u0000"+ - "\u010e\u010c\u0001\u0000\u0000\u0000\u010f\u0111\u0005\u0010\u0000\u0000"+ - "\u0110\u0112\u0003\n\u0005\u0000\u0111\u0110\u0001\u0000\u0000\u0000\u0112"+ - "\u0113\u0001\u0000\u0000\u0000\u0113\u0111\u0001\u0000\u0000\u0000\u0113"+ - "\u0114\u0001\u0000\u0000\u0000\u0114\u011d\u0001\u0000\u0000\u0000\u0115"+ - "\u0117\u0005\u0010\u0000\u0000\u0116\u0118\u0003\n\u0005\u0000\u0117\u0116"+ - "\u0001\u0000\u0000\u0000\u0118\u0119\u0001\u0000\u0000\u0000\u0119\u0117"+ - "\u0001\u0000\u0000\u0000\u0119\u011a\u0001\u0000\u0000\u0000\u011a\u011c"+ - "\u0001\u0000\u0000\u0000\u011b\u0115\u0001\u0000\u0000\u0000\u011c\u011f"+ - "\u0001\u0000\u0000\u0000\u011d\u011b\u0001\u0000\u0000\u0000\u011d\u011e"+ - "\u0001\u0000\u0000\u0000\u011e\u0120\u0001\u0000\u0000\u0000\u011f\u011d"+ - "\u0001\u0000\u0000\u0000\u0120\u0122\u0005\u001c\u0000\u0000\u0121\u0123"+ - "\u0003\n\u0005\u0000\u0122\u0121\u0001\u0000\u0000\u0000\u0123\u0124\u0001"+ - "\u0000\u0000\u0000\u0124\u0122\u0001\u0000\u0000\u0000\u0124\u0125\u0001"+ - "\u0000\u0000\u0000\u0125\u0127\u0001\u0000\u0000\u0000\u0126\u010f\u0001"+ - "\u0000\u0000\u0000\u0127\u012a\u0001\u0000\u0000\u0000\u0128\u0126\u0001"+ - "\u0000\u0000\u0000\u0128\u0129\u0001\u0000\u0000\u0000\u0129\u012c\u0001"+ - "\u0000\u0000\u0000\u012a\u0128\u0001\u0000\u0000\u0000\u012b\u012d\u0005"+ - "\u0010\u0000\u0000\u012c\u012b\u0001\u0000\u0000\u0000\u012c\u012d\u0001"+ - "\u0000\u0000\u0000\u012d\u012e\u0001\u0000\u0000\u0000\u012e\u012f\u0005"+ - "\u0016\u0000\u0000\u012f\u0015\u0001\u0000\u0000\u0000\u0130\u0132\u0003"+ - "*\u0015\u0000\u0131\u0130\u0001\u0000\u0000\u0000\u0131\u0132\u0001\u0000"+ - "\u0000\u0000\u0132\u0133\u0001\u0000\u0000\u0000\u0133\u0134\u0005\u0017"+ - "\u0000\u0000\u0134\u0135\u0005\u001b\u0000\u0000\u0135\u0136\u0005\u000b"+ - "\u0000\u0000\u0136\u0017\u0001\u0000\u0000\u0000\u0137\u0139\u0003*\u0015"+ - "\u0000\u0138\u0137\u0001\u0000\u0000\u0000\u0138\u0139\u0001\u0000\u0000"+ - "\u0000\u0139\u013a\u0001\u0000\u0000\u0000\u013a\u013b\u0005\u0017\u0000"+ - "\u0000\u013b\u013c\u0005\u001b\u0000\u0000\u013c\u013d\u0005\u0017\u0000"+ - "\u0000\u013d\u013e\u0003(\u0014\u0000\u013e\u0019\u0001\u0000\u0000\u0000"+ - "\u013f\u0141\u0003*\u0015\u0000\u0140\u013f\u0001\u0000\u0000\u0000\u0140"+ - "\u0141\u0001\u0000\u0000\u0000\u0141\u0142\u0001\u0000\u0000\u0000\u0142"+ - "\u0143\u0005\u0017\u0000\u0000\u0143\u0147\u0005\u001b\u0000\u0000\u0144"+ - "\u0148\u0005\u0017\u0000\u0000\u0145\u0148\u0005\u0018\u0000\u0000\u0146"+ - "\u0148\u0005\u000b\u0000\u0000\u0147\u0144\u0001\u0000\u0000\u0000\u0147"+ - "\u0145\u0001\u0000\u0000\u0000\u0147\u0146\u0001\u0000\u0000\u0000\u0148"+ - "\u0150\u0001\u0000\u0000\u0000\u0149\u014a\u0005\u0018\u0000\u0000\u014a"+ - "\u014b\u0005\u001b\u0000\u0000\u014b\u0150\u0005\u0017\u0000\u0000\u014c"+ - "\u014d\u0005\u0018\u0000\u0000\u014d\u014e\u0005\u001b\u0000\u0000\u014e"+ - "\u0150\u0005\u0018\u0000\u0000\u014f\u0140\u0001\u0000\u0000\u0000\u014f"+ - "\u0149\u0001\u0000\u0000\u0000\u014f\u014c\u0001\u0000\u0000\u0000\u0150"+ - "\u001b\u0001\u0000\u0000\u0000\u0151\u0153\u0003*\u0015\u0000\u0152\u0151"+ - "\u0001\u0000\u0000\u0000\u0152\u0153\u0001\u0000\u0000\u0000\u0153\u0154"+ - "\u0001\u0000\u0000\u0000\u0154\u0155\u0005\u0017\u0000\u0000\u0155\u0156"+ - "\u0005\u001b\u0000\u0000\u0156\u001d\u0001\u0000\u0000\u0000\u0157\u0158"+ - "\u0005\u0018\u0000\u0000\u0158\u0159\u0003 \u0010\u0000\u0159\u001f\u0001"+ - "\u0000\u0000\u0000\u015a\u015e\u0003\"\u0011\u0000\u015b\u015c\u0005\u001d"+ - "\u0000\u0000\u015c\u015e\u0005\u0017\u0000\u0000\u015d\u015a\u0001\u0000"+ - "\u0000\u0000\u015d\u015b\u0001\u0000\u0000\u0000\u015e!\u0001\u0000\u0000"+ - "\u0000\u015f\u0160\u0005\u001d\u0000\u0000\u0160\u0161\u0005\u0017\u0000"+ - "\u0000\u0161\u0162\u0003(\u0014\u0000\u0162#\u0001\u0000\u0000\u0000\u0163"+ - "\u0164\u0005\u0017\u0000\u0000\u0164\u0165\u0003(\u0014\u0000\u0165\u0166"+ - "\u0005\u001d\u0000\u0000\u0166\u0167\u0005\u0017\u0000\u0000\u0167\u0168"+ - "\u0003(\u0014\u0000\u0168%\u0001\u0000\u0000\u0000\u0169\u016a\u0005\u0017"+ - "\u0000\u0000\u016a\u016b\u0003(\u0014\u0000\u016b\'\u0001\u0000\u0000"+ - "\u0000\u016c\u016d\u0005\u0011\u0000\u0000\u016d\u0172\u0003,\u0016\u0000"+ - "\u016e\u016f\u0005\u0010\u0000\u0000\u016f\u0171\u0003,\u0016\u0000\u0170"+ - "\u016e\u0001\u0000\u0000\u0000\u0171\u0174\u0001\u0000\u0000\u0000\u0172"+ - "\u0170\u0001\u0000\u0000\u0000\u0172\u0173\u0001\u0000\u0000\u0000\u0173"+ - "\u0175\u0001\u0000\u0000\u0000\u0174\u0172\u0001\u0000\u0000\u0000\u0175"+ - "\u0176\u0005\u0012\u0000\u0000\u0176\u017a\u0001\u0000\u0000\u0000\u0177"+ - "\u0178\u0005\u0011\u0000\u0000\u0178\u017a\u0005\u0012\u0000\u0000\u0179"+ - "\u016c\u0001\u0000\u0000\u0000\u0179\u0177\u0001\u0000\u0000\u0000\u017a"+ - ")\u0001\u0000\u0000\u0000\u017b\u017d\u0005\u001a\u0000\u0000\u017c\u017b"+ - "\u0001\u0000\u0000\u0000\u017c\u017d\u0001\u0000\u0000\u0000\u017d\u0180"+ - "\u0001\u0000\u0000\u0000\u017e\u017f\u0005\u0017\u0000\u0000\u017f\u0181"+ - "\u0005\u001a\u0000\u0000\u0180\u017e\u0001\u0000\u0000\u0000\u0181\u0182"+ - "\u0001\u0000\u0000\u0000\u0182\u0180\u0001\u0000\u0000\u0000\u0182\u0183"+ - "\u0001\u0000\u0000\u0000\u0183\u0186\u0001\u0000\u0000\u0000\u0184\u0186"+ - "\u0005\u001a\u0000\u0000\u0185\u017c\u0001\u0000\u0000\u0000\u0185\u0184"+ - "\u0001\u0000\u0000\u0000\u0186+\u0001\u0000\u0000\u0000\u0187\u018a\u0003"+ - "\n\u0005\u0000\u0188\u018a\u0005\u0017\u0000\u0000\u0189\u0187\u0001\u0000"+ - "\u0000\u0000\u0189\u0188\u0001\u0000\u0000\u0000\u018a-\u0001\u0000\u0000"+ - "\u0000\u018b\u018d\u0005\u0018\u0000\u0000\u018c\u018e\u00030\u0018\u0000"+ - "\u018d\u018c\u0001\u0000\u0000\u0000\u018e\u018f\u0001\u0000\u0000\u0000"+ - "\u018f\u018d\u0001\u0000\u0000\u0000\u018f\u0190\u0001\u0000\u0000\u0000"+ - "\u0190\u0193\u0001\u0000\u0000\u0000\u0191\u0193\u00030\u0018\u0000\u0192"+ - "\u018b\u0001\u0000\u0000\u0000\u0192\u0191\u0001\u0000\u0000\u0000\u0193"+ - "/\u0001\u0000\u0000\u0000\u0194\u0198\u0005\u0013\u0000\u0000\u0195\u0197"+ - "\u00030\u0018\u0000\u0196\u0195\u0001\u0000\u0000\u0000\u0197\u019a\u0001"+ - "\u0000\u0000\u0000\u0198\u0196\u0001\u0000\u0000\u0000\u0198\u0199\u0001"+ - "\u0000\u0000\u0000\u0199\u019b\u0001\u0000\u0000\u0000\u019a\u0198\u0001"+ - "\u0000\u0000\u0000\u019b\u01da\u0005\u0014\u0000\u0000\u019c\u019d\u0005"+ - "\u0004\u0000\u0000\u019d\u01a1\u0005\u0011\u0000\u0000\u019e\u01a0\u0003"+ - "0\u0018\u0000\u019f\u019e\u0001\u0000\u0000\u0000\u01a0\u01a3\u0001\u0000"+ - "\u0000\u0000\u01a1\u019f\u0001\u0000\u0000\u0000\u01a1\u01a2\u0001\u0000"+ - "\u0000\u0000\u01a2\u01a4\u0001\u0000\u0000\u0000\u01a3\u01a1\u0001\u0000"+ - "\u0000\u0000\u01a4\u01da\u0005\u0012\u0000\u0000\u01a5\u01aa\u0005\u0013"+ - "\u0000\u0000\u01a6\u01a7\u00032\u0019\u0000\u01a7\u01a8\u0005\u001c\u0000"+ - "\u0000\u01a8\u01a9\u00030\u0018\u0000\u01a9\u01ab\u0001\u0000\u0000\u0000"+ - "\u01aa\u01a6\u0001\u0000\u0000\u0000\u01ab\u01ac\u0001\u0000\u0000\u0000"+ - "\u01ac\u01aa\u0001\u0000\u0000\u0000\u01ac\u01ad\u0001\u0000\u0000\u0000"+ - "\u01ad\u01ae\u0001\u0000\u0000\u0000\u01ae\u01af\u0005\u0014\u0000\u0000"+ - "\u01af\u01da\u0001\u0000\u0000\u0000\u01b0\u01b1\u0005\u0004\u0000\u0000"+ - "\u01b1\u01b6\u0005\u0011\u0000\u0000\u01b2\u01b3\u00032\u0019\u0000\u01b3"+ - "\u01b4\u0005\u001c\u0000\u0000\u01b4\u01b5\u00030\u0018\u0000\u01b5\u01b7"+ - "\u0001\u0000\u0000\u0000\u01b6\u01b2\u0001\u0000\u0000\u0000\u01b7\u01b8"+ - "\u0001\u0000\u0000\u0000\u01b8\u01b6\u0001\u0000\u0000\u0000\u01b8\u01b9"+ - "\u0001\u0000\u0000\u0000\u01b9\u01ba\u0001\u0000\u0000\u0000\u01ba\u01bb"+ - "\u0005\u0012\u0000\u0000\u01bb\u01da\u0001\u0000\u0000\u0000\u01bc\u01bd"+ - "\u0005\u0013\u0000\u0000\u01bd\u01c2\u00032\u0019\u0000\u01be\u01bf\u0005"+ - "\u0010\u0000\u0000\u01bf\u01c1\u00032\u0019\u0000\u01c0\u01be\u0001\u0000"+ - "\u0000\u0000\u01c1\u01c4\u0001\u0000\u0000\u0000\u01c2\u01c0\u0001\u0000"+ - "\u0000\u0000\u01c2\u01c3\u0001\u0000\u0000\u0000\u01c3\u01c6\u0001\u0000"+ - "\u0000\u0000\u01c4\u01c2\u0001\u0000\u0000\u0000\u01c5\u01c7\u0005\u0010"+ - "\u0000\u0000\u01c6\u01c5\u0001\u0000\u0000\u0000\u01c6\u01c7\u0001\u0000"+ - "\u0000\u0000\u01c7\u01c8\u0001\u0000\u0000\u0000\u01c8\u01c9\u0005\u0014"+ - "\u0000\u0000\u01c9\u01da\u0001\u0000\u0000\u0000\u01ca\u01cb\u0005\u0004"+ - "\u0000\u0000\u01cb\u01cc\u0005\u0011\u0000\u0000\u01cc\u01d1\u00032\u0019"+ - "\u0000\u01cd\u01ce\u0005\u0010\u0000\u0000\u01ce\u01d0\u00032\u0019\u0000"+ - "\u01cf\u01cd\u0001\u0000\u0000\u0000\u01d0\u01d3\u0001\u0000\u0000\u0000"+ - "\u01d1\u01cf\u0001\u0000\u0000\u0000\u01d1\u01d2\u0001\u0000\u0000\u0000"+ - "\u01d2\u01d5\u0001\u0000\u0000\u0000\u01d3\u01d1\u0001\u0000\u0000\u0000"+ - "\u01d4\u01d6\u0005\u0010\u0000\u0000\u01d5\u01d4\u0001\u0000\u0000\u0000"+ - "\u01d5\u01d6\u0001\u0000\u0000\u0000\u01d6\u01d7\u0001\u0000\u0000\u0000"+ - "\u01d7\u01d8\u0005\u0012\u0000\u0000\u01d8\u01da\u0001\u0000\u0000\u0000"+ - "\u01d9\u0194\u0001\u0000\u0000\u0000\u01d9\u019c\u0001\u0000\u0000\u0000"+ - "\u01d9\u01a5\u0001\u0000\u0000\u0000\u01d9\u01b0\u0001\u0000\u0000\u0000"+ - "\u01d9\u01bc\u0001\u0000\u0000\u0000\u01d9\u01ca\u0001\u0000\u0000\u0000"+ - "\u01da1\u0001\u0000\u0000\u0000\u01db\u01dc\u0003\n\u0005\u0000\u01dc"+ - "\u01dd\u0005\u001c\u0000\u0000\u01dd\u01de\u00030\u0018\u0000\u01de\u01e5"+ - "\u0001\u0000\u0000\u0000\u01df\u01e0\u0003\n\u0005\u0000\u01e0\u01e1\u0005"+ - "\u001c\u0000\u0000\u01e1\u01e2\u0003\n\u0005\u0000\u01e2\u01e5\u0001\u0000"+ - "\u0000\u0000\u01e3\u01e5\u0003\n\u0005\u0000\u01e4\u01db\u0001\u0000\u0000"+ - "\u0000\u01e4\u01df\u0001\u0000\u0000\u0000\u01e4\u01e3\u0001\u0000\u0000"+ - "\u0000\u01e53\u0001\u0000\u0000\u0000\u01e6\u01ed\u0003.\u0017\u0000\u01e7"+ - "\u01e9\u0005\u0019\u0000\u0000\u01e8\u01e7\u0001\u0000\u0000\u0000\u01e8"+ - "\u01e9\u0001\u0000\u0000\u0000\u01e9\u01ea\u0001\u0000\u0000\u0000\u01ea"+ - "\u01ed\u0005\u0018\u0000\u0000\u01eb\u01ed\u0005!\u0000\u0000\u01ec\u01e6"+ - "\u0001\u0000\u0000\u0000\u01ec\u01e8\u0001\u0000\u0000\u0000\u01ec\u01eb"+ - "\u0001\u0000\u0000\u0000\u01ed5\u0001\u0000\u0000\u0000\u01ee\u01ef\u0005"+ - "\n\u0000\u0000\u01ef\u01f1\u0005\u0018\u0000\u0000\u01f0\u01f2\u0003("+ - "\u0014\u0000\u01f1\u01f0\u0001\u0000\u0000\u0000\u01f1\u01f2\u0001\u0000"+ - "\u0000\u0000\u01f2\u01f9\u0001\u0000\u0000\u0000\u01f3\u01f4\u0005\n\u0000"+ - "\u0000\u01f4\u01f9\u0003*\u0015\u0000\u01f5\u01f6\u0003*\u0015\u0000\u01f6"+ - "\u01f7\u0005\u0017\u0000\u0000\u01f7\u01f9\u0001\u0000\u0000\u0000\u01f8"+ - "\u01ee\u0001\u0000\u0000\u0000\u01f8\u01f3\u0001\u0000\u0000\u0000\u01f8"+ - "\u01f5\u0001\u0000\u0000\u0000\u01f97\u0001\u0000\u0000\u0000\u01fa\u01fb"+ - "\u0005\u0006\u0000\u0000\u01fb\u01fc\u0003\n\u0005\u0000\u01fc9\u0001"+ - "\u0000\u0000\u0000A=GOYekt{~\u0085\u008c\u0095\u009c\u00a3\u00ab\u00af"+ - "\u00b8\u00c2\u00cb\u00d2\u00d8\u00e3\u00e5\u00e9\u00ed\u00f7\u00fd\u0101"+ - "\u0108\u010c\u0113\u0119\u011d\u0124\u0128\u012c\u0131\u0138\u0140\u0147"+ - "\u014f\u0152\u015d\u0172\u0179\u017c\u0182\u0185\u0189\u018f\u0192\u0198"+ - "\u01a1\u01ac\u01b8\u01c2\u01c6\u01d1\u01d5\u01d9\u01e4\u01e8\u01ec\u01f1"+ - "\u01f8"; - public static final ATN _ATN = - new ATNDeserializer().deserialize(_serializedATN.toCharArray()); - static { - _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; - for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { - _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); - } - } -} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserBaseListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserBaseListener.java deleted file mode 100644 index 223ed8616b0f..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserBaseListener.java +++ /dev/null @@ -1,408 +0,0 @@ -// Generated from BladePhpAntlrParser.g4 by ANTLR 4.13.0 - - /* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - package org.netbeans.modules.php.blade.syntax.antlr4.php; - - -import org.antlr.v4.runtime.ParserRuleContext; -import org.antlr.v4.runtime.tree.ErrorNode; -import org.antlr.v4.runtime.tree.TerminalNode; - -/** - * This class provides an empty implementation of {@link BladePhpAntlrParserListener}, - * which can be extended to create a listener which only needs to handle a subset - * of the available methods. - */ -@SuppressWarnings("CheckReturnValue") -public class BladePhpAntlrParserBaseListener implements BladePhpAntlrParserListener { - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterExpression(BladePhpAntlrParser.ExpressionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitExpression(BladePhpAntlrParser.ExpressionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterExprStatement(BladePhpAntlrParser.ExprStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitExprStatement(BladePhpAntlrParser.ExprStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterLogicalStatement(BladePhpAntlrParser.LogicalStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitLogicalStatement(BladePhpAntlrParser.LogicalStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterIfStatement(BladePhpAntlrParser.IfStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitIfStatement(BladePhpAntlrParser.IfStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterInputExpr(BladePhpAntlrParser.InputExprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitInputExpr(BladePhpAntlrParser.InputExprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterFunctionalExpr(BladePhpAntlrParser.FunctionalExprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitFunctionalExpr(BladePhpAntlrParser.FunctionalExprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterClassExpression(BladePhpAntlrParser.ClassExpressionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitClassExpression(BladePhpAntlrParser.ClassExpressionContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterForeachDirectiveStatement(BladePhpAntlrParser.ForeachDirectiveStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitForeachDirectiveStatement(BladePhpAntlrParser.ForeachDirectiveStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterForeachArguments(BladePhpAntlrParser.ForeachArgumentsContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitForeachArguments(BladePhpAntlrParser.ForeachArgumentsContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterClassInstanceStatement(BladePhpAntlrParser.ClassInstanceStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitClassInstanceStatement(BladePhpAntlrParser.ClassInstanceStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterMatchStatement(BladePhpAntlrParser.MatchStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitMatchStatement(BladePhpAntlrParser.MatchStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterStaticClassReference(BladePhpAntlrParser.StaticClassReferenceContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitStaticClassReference(BladePhpAntlrParser.StaticClassReferenceContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterStaticMethodAccess(BladePhpAntlrParser.StaticMethodAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitStaticMethodAccess(BladePhpAntlrParser.StaticMethodAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterStaticFieldAccess(BladePhpAntlrParser.StaticFieldAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitStaticFieldAccess(BladePhpAntlrParser.StaticFieldAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterStaticAccess(BladePhpAntlrParser.StaticAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitStaticAccess(BladePhpAntlrParser.StaticAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterAliasDirectAccess(BladePhpAntlrParser.AliasDirectAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitAliasDirectAccess(BladePhpAntlrParser.AliasDirectAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterClassMember(BladePhpAntlrParser.ClassMemberContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitClassMember(BladePhpAntlrParser.ClassMemberContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterDirectMethodAccess(BladePhpAntlrParser.DirectMethodAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitDirectMethodAccess(BladePhpAntlrParser.DirectMethodAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterDirectAccess(BladePhpAntlrParser.DirectAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitDirectAccess(BladePhpAntlrParser.DirectAccessContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterFunctionExpr(BladePhpAntlrParser.FunctionExprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitFunctionExpr(BladePhpAntlrParser.FunctionExprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterArguments(BladePhpAntlrParser.ArgumentsContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitArguments(BladePhpAntlrParser.ArgumentsContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterNamespace(BladePhpAntlrParser.NamespaceContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitNamespace(BladePhpAntlrParser.NamespaceContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterArgument(BladePhpAntlrParser.ArgumentContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitArgument(BladePhpAntlrParser.ArgumentContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterArray(BladePhpAntlrParser.ArrayContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitArray(BladePhpAntlrParser.ArrayContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterArray_key_item(BladePhpAntlrParser.Array_key_itemContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitArray_key_item(BladePhpAntlrParser.Array_key_itemContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterArray_child(BladePhpAntlrParser.Array_childContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitArray_child(BladePhpAntlrParser.Array_childContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterVarExpr(BladePhpAntlrParser.VarExprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitVarExpr(BladePhpAntlrParser.VarExprContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterMisc(BladePhpAntlrParser.MiscContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitMisc(BladePhpAntlrParser.MiscContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterOutput(BladePhpAntlrParser.OutputContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitOutput(BladePhpAntlrParser.OutputContext ctx) { } - - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void enterEveryRule(ParserRuleContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void exitEveryRule(ParserRuleContext ctx) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void visitTerminal(TerminalNode node) { } - /** - * {@inheritDoc} - * - *

      The default implementation does nothing.

      - */ - @Override public void visitErrorNode(ErrorNode node) { } -} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserListener.java deleted file mode 100644 index b2cf81523241..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrParserListener.java +++ /dev/null @@ -1,320 +0,0 @@ -// Generated from BladePhpAntlrParser.g4 by ANTLR 4.13.0 - - /* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - package org.netbeans.modules.php.blade.syntax.antlr4.php; - -import org.antlr.v4.runtime.tree.ParseTreeListener; - -/** - * This interface defines a complete listener for a parse tree produced by - * {@link BladePhpAntlrParser}. - */ -public interface BladePhpAntlrParserListener extends ParseTreeListener { - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#expression}. - * @param ctx the parse tree - */ - void enterExpression(BladePhpAntlrParser.ExpressionContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#expression}. - * @param ctx the parse tree - */ - void exitExpression(BladePhpAntlrParser.ExpressionContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#exprStatement}. - * @param ctx the parse tree - */ - void enterExprStatement(BladePhpAntlrParser.ExprStatementContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#exprStatement}. - * @param ctx the parse tree - */ - void exitExprStatement(BladePhpAntlrParser.ExprStatementContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#logicalStatement}. - * @param ctx the parse tree - */ - void enterLogicalStatement(BladePhpAntlrParser.LogicalStatementContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#logicalStatement}. - * @param ctx the parse tree - */ - void exitLogicalStatement(BladePhpAntlrParser.LogicalStatementContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#ifStatement}. - * @param ctx the parse tree - */ - void enterIfStatement(BladePhpAntlrParser.IfStatementContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#ifStatement}. - * @param ctx the parse tree - */ - void exitIfStatement(BladePhpAntlrParser.IfStatementContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#inputExpr}. - * @param ctx the parse tree - */ - void enterInputExpr(BladePhpAntlrParser.InputExprContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#inputExpr}. - * @param ctx the parse tree - */ - void exitInputExpr(BladePhpAntlrParser.InputExprContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#functionalExpr}. - * @param ctx the parse tree - */ - void enterFunctionalExpr(BladePhpAntlrParser.FunctionalExprContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#functionalExpr}. - * @param ctx the parse tree - */ - void exitFunctionalExpr(BladePhpAntlrParser.FunctionalExprContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#classExpression}. - * @param ctx the parse tree - */ - void enterClassExpression(BladePhpAntlrParser.ClassExpressionContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#classExpression}. - * @param ctx the parse tree - */ - void exitClassExpression(BladePhpAntlrParser.ClassExpressionContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#foreachDirectiveStatement}. - * @param ctx the parse tree - */ - void enterForeachDirectiveStatement(BladePhpAntlrParser.ForeachDirectiveStatementContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#foreachDirectiveStatement}. - * @param ctx the parse tree - */ - void exitForeachDirectiveStatement(BladePhpAntlrParser.ForeachDirectiveStatementContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#foreachArguments}. - * @param ctx the parse tree - */ - void enterForeachArguments(BladePhpAntlrParser.ForeachArgumentsContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#foreachArguments}. - * @param ctx the parse tree - */ - void exitForeachArguments(BladePhpAntlrParser.ForeachArgumentsContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#classInstanceStatement}. - * @param ctx the parse tree - */ - void enterClassInstanceStatement(BladePhpAntlrParser.ClassInstanceStatementContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#classInstanceStatement}. - * @param ctx the parse tree - */ - void exitClassInstanceStatement(BladePhpAntlrParser.ClassInstanceStatementContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#matchStatement}. - * @param ctx the parse tree - */ - void enterMatchStatement(BladePhpAntlrParser.MatchStatementContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#matchStatement}. - * @param ctx the parse tree - */ - void exitMatchStatement(BladePhpAntlrParser.MatchStatementContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#staticClassReference}. - * @param ctx the parse tree - */ - void enterStaticClassReference(BladePhpAntlrParser.StaticClassReferenceContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#staticClassReference}. - * @param ctx the parse tree - */ - void exitStaticClassReference(BladePhpAntlrParser.StaticClassReferenceContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#staticMethodAccess}. - * @param ctx the parse tree - */ - void enterStaticMethodAccess(BladePhpAntlrParser.StaticMethodAccessContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#staticMethodAccess}. - * @param ctx the parse tree - */ - void exitStaticMethodAccess(BladePhpAntlrParser.StaticMethodAccessContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#staticFieldAccess}. - * @param ctx the parse tree - */ - void enterStaticFieldAccess(BladePhpAntlrParser.StaticFieldAccessContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#staticFieldAccess}. - * @param ctx the parse tree - */ - void exitStaticFieldAccess(BladePhpAntlrParser.StaticFieldAccessContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#staticAccess}. - * @param ctx the parse tree - */ - void enterStaticAccess(BladePhpAntlrParser.StaticAccessContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#staticAccess}. - * @param ctx the parse tree - */ - void exitStaticAccess(BladePhpAntlrParser.StaticAccessContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#aliasDirectAccess}. - * @param ctx the parse tree - */ - void enterAliasDirectAccess(BladePhpAntlrParser.AliasDirectAccessContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#aliasDirectAccess}. - * @param ctx the parse tree - */ - void exitAliasDirectAccess(BladePhpAntlrParser.AliasDirectAccessContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#classMember}. - * @param ctx the parse tree - */ - void enterClassMember(BladePhpAntlrParser.ClassMemberContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#classMember}. - * @param ctx the parse tree - */ - void exitClassMember(BladePhpAntlrParser.ClassMemberContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#directMethodAccess}. - * @param ctx the parse tree - */ - void enterDirectMethodAccess(BladePhpAntlrParser.DirectMethodAccessContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#directMethodAccess}. - * @param ctx the parse tree - */ - void exitDirectMethodAccess(BladePhpAntlrParser.DirectMethodAccessContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#directAccess}. - * @param ctx the parse tree - */ - void enterDirectAccess(BladePhpAntlrParser.DirectAccessContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#directAccess}. - * @param ctx the parse tree - */ - void exitDirectAccess(BladePhpAntlrParser.DirectAccessContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#functionExpr}. - * @param ctx the parse tree - */ - void enterFunctionExpr(BladePhpAntlrParser.FunctionExprContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#functionExpr}. - * @param ctx the parse tree - */ - void exitFunctionExpr(BladePhpAntlrParser.FunctionExprContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#arguments}. - * @param ctx the parse tree - */ - void enterArguments(BladePhpAntlrParser.ArgumentsContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#arguments}. - * @param ctx the parse tree - */ - void exitArguments(BladePhpAntlrParser.ArgumentsContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#namespace}. - * @param ctx the parse tree - */ - void enterNamespace(BladePhpAntlrParser.NamespaceContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#namespace}. - * @param ctx the parse tree - */ - void exitNamespace(BladePhpAntlrParser.NamespaceContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#argument}. - * @param ctx the parse tree - */ - void enterArgument(BladePhpAntlrParser.ArgumentContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#argument}. - * @param ctx the parse tree - */ - void exitArgument(BladePhpAntlrParser.ArgumentContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#array}. - * @param ctx the parse tree - */ - void enterArray(BladePhpAntlrParser.ArrayContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#array}. - * @param ctx the parse tree - */ - void exitArray(BladePhpAntlrParser.ArrayContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#array_key_item}. - * @param ctx the parse tree - */ - void enterArray_key_item(BladePhpAntlrParser.Array_key_itemContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#array_key_item}. - * @param ctx the parse tree - */ - void exitArray_key_item(BladePhpAntlrParser.Array_key_itemContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#array_child}. - * @param ctx the parse tree - */ - void enterArray_child(BladePhpAntlrParser.Array_childContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#array_child}. - * @param ctx the parse tree - */ - void exitArray_child(BladePhpAntlrParser.Array_childContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#varExpr}. - * @param ctx the parse tree - */ - void enterVarExpr(BladePhpAntlrParser.VarExprContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#varExpr}. - * @param ctx the parse tree - */ - void exitVarExpr(BladePhpAntlrParser.VarExprContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#misc}. - * @param ctx the parse tree - */ - void enterMisc(BladePhpAntlrParser.MiscContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#misc}. - * @param ctx the parse tree - */ - void exitMisc(BladePhpAntlrParser.MiscContext ctx); - /** - * Enter a parse tree produced by {@link BladePhpAntlrParser#output}. - * @param ctx the parse tree - */ - void enterOutput(BladePhpAntlrParser.OutputContext ctx); - /** - * Exit a parse tree produced by {@link BladePhpAntlrParser#output}. - * @param ctx the parse tree - */ - void exitOutput(BladePhpAntlrParser.OutputContext ctx); -} \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrUtils.java index f17cfb6d5b32..6464a11c7331 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrUtils.java @@ -1,5 +1,20 @@ -/* -Licensed to the Apache Software Foundation (ASF) + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ package org.netbeans.modules.php.blade.syntax.antlr4.php; @@ -38,19 +53,12 @@ public static Token getToken(String text, int offset) { return null; } - boolean hasPrev = tokens.hasPrevious(); - - while(tokens.hasNext()){ - Token test = tokens.next().get(); - String testText = test.getText(); - int x = 1; - } - tokens.seekTo(offset); if (!tokens.hasNext()){ return null; } + Token token = tokens.next().get(); return token; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/LexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/LexerAdaptor.java deleted file mode 100644 index 3271d211556d..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/LexerAdaptor.java +++ /dev/null @@ -1,53 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) - */ -package org.netbeans.modules.php.blade.syntax.antlr4.php; - -import org.netbeans.modules.php.blade.syntax.antlr4.v10.*; -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.Lexer; -import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.atn.ATN; -import org.antlr.v4.runtime.misc.Interval; - -/** - * - * @author bogdan - */ -public abstract class LexerAdaptor extends Lexer { - - private int _currentRuleType = Token.INVALID_TYPE; - public int exitIfModePosition = 0; - public boolean compomentTagOpen = false; - - public LexerAdaptor(CharStream input) { - super(input); - } - - public int getCurrentRuleType() { - return _currentRuleType; - } - - public void setCurrentRuleType(int ruleType) { - this._currentRuleType = ruleType; - } - - @Override - public Token emit() { - return super.emit(); - } - - @Override - public void reset() { - setCurrentRuleType(Token.INVALID_TYPE); - super.reset(); - } - - public void startExprLookup(){ - if (this._input.LA(1) == '('){ - this.mode(BladeAntlrLexer.INSIDE_PHP_EXPRESSION); - } else { - this.skip(); - } - } -} diff --git a/php/php.blade/test/unit/data/testfiles/navigator/multiple_block_directives.blade.php b/php/php.blade/test/unit/data/testfiles/navigator/multiple_block_directives.blade.php new file mode 100644 index 000000000000..1a0b2b7fdd11 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/navigator/multiple_block_directives.blade.php @@ -0,0 +1,9 @@ +@if($x) + @section($arg) + @include('path1') + @endsection +@endif + +@if($y) + @include('path2') +@endif From 4a08988e3bf8aec53357c63c0b770b27caef60a5 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Mon, 24 Feb 2025 07:24:39 +0200 Subject: [PATCH 38/43] add license to new files, include missing compile antlr classes, include work in progress components editor config --- php/php.blade/build.xml | 21 ++- .../editor/ui/customizer/BladeComponents.form | 127 +++++++++++++ .../editor/ui/customizer/BladeComponents.java | 176 ++++++++++++++++++ .../BladeComponentsCustomizerProvider.java | 65 +++++++ .../BladeSettingsCustomizerProvider.java | 14 +- .../editor/ui/customizer/Bundle.properties | 12 ++ .../editor/ui/customizer/UIOptionsUtils.java | 2 +- .../blade/project/BladeProjectProperties.java | 13 +- .../html_components/BladeHtmlAntlrLexer.g4 | 1 - .../html_components/BladeHtmlAntlrUtils.java | 17 +- .../antlr4/html_components/LexerAdaptor.java | 57 ------ .../syntax/antlr4/php/BladePhpAntlrLexer.g4 | 1 - 12 files changed, 429 insertions(+), 77 deletions(-) create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeComponents.form create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeComponents.java create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeComponentsCustomizerProvider.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/LexerAdaptor.java diff --git a/php/php.blade/build.xml b/php/php.blade/build.xml index 0662dbc74675..5da45c67b027 100644 --- a/php/php.blade/build.xml +++ b/php/php.blade/build.xml @@ -45,6 +45,8 @@
      + + @@ -54,6 +56,8 @@
      + + @@ -63,12 +67,19 @@
      - - - - - + + + + + + + + + + + +
      diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeComponents.form b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeComponents.form new file mode 100644 index 000000000000..9c26a62b4a4d --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeComponents.form @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeComponents.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeComponents.java new file mode 100644 index 000000000000..4c78fb080315 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeComponents.java @@ -0,0 +1,176 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.ui.customizer; + +import java.awt.EventQueue; +import java.io.File; +import org.netbeans.api.project.Project; +import org.netbeans.modules.php.blade.project.BladeProjectProperties; +import org.netbeans.modules.php.blade.project.ComponentsSupport; +import org.openide.filesystems.FileChooserBuilder; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; + +/** + * + * @author bhaidu + */ +public class BladeComponents extends javax.swing.JPanel { + + private final Project project; + private final BladeProjectProperties bladeProperties; + private File bladeComponentFolder; + + /** + * Creates new form CustomizerIncludePath + * + * @param project + */ + public BladeComponents(Project project) { + this.project = project; + bladeProperties = BladeProjectProperties.getInstance(project); + initComponents(); + init(); + } + + private void init() { + //the model reference is enough + customBladeComponentClassFolderList.setModel(bladeProperties.getModelForBladeComponentsClassFolderList()); + } + + public void storeData() { + bladeProperties.storeBladeComponentsFolder(); + ComponentsSupport componentSupport = ComponentsSupport.getInstance(project); + + if (bladeComponentFolder != null) { + FileObject root = FileUtil.toFileObject(bladeComponentFolder); + componentSupport.scanBladeComponentsClassFolder(root); + } + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + includePathLabel = new javax.swing.JLabel(); + compilerPathFileButton = new javax.swing.JButton(); + jScrollPane1 = new javax.swing.JScrollPane(); + customBladeComponentClassFolderList = new javax.swing.JList<>(); + removePathButton = new javax.swing.JButton(); + jLabel1 = new javax.swing.JLabel(); + + includePathLabel.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(includePathLabel, org.openide.util.NbBundle.getMessage(BladeComponents.class, "BladeComponents.includePathLabel.text_1")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(compilerPathFileButton, org.openide.util.NbBundle.getMessage(BladeComponents.class, "BladeComponents.compilerPathFileButton.text_1")); // NOI18N + compilerPathFileButton.setToolTipText(org.openide.util.NbBundle.getMessage(BladeComponents.class, "BladeComponents.compilerPathFileButton.toolTipText_1")); // NOI18N + compilerPathFileButton.setActionCommand(org.openide.util.NbBundle.getMessage(BladeComponents.class, "BladeComponents.compilerPathFileButton.actionCommand_1")); // NOI18N + compilerPathFileButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + compilerPathFileButtonActionPerformed(evt); + } + }); + + jScrollPane1.setViewportView(customBladeComponentClassFolderList); + + org.openide.awt.Mnemonics.setLocalizedText(removePathButton, org.openide.util.NbBundle.getMessage(BladeComponents.class, "BladeComponents.removePathButton.text_1")); // NOI18N + removePathButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + removePathButtonActionPerformed(evt); + } + }); + + jLabel1.setForeground(new java.awt.Color(102, 102, 102)); + org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(BladeComponents.class, "BladeComponents.jLabel1.text")); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 474, Short.MAX_VALUE) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(compilerPathFileButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(removePathButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addGroup(layout.createSequentialGroup() + .addComponent(includePathLabel) + .addGap(0, 0, Short.MAX_VALUE))) + .addContainerGap()) + .addGroup(layout.createSequentialGroup() + .addGap(23, 23, 23) + .addComponent(jLabel1) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(20, 20, 20) + .addComponent(includePathLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel1) + .addGap(33, 33, 33) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 143, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(layout.createSequentialGroup() + .addComponent(compilerPathFileButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(removePathButton))) + .addGap(0, 68, Short.MAX_VALUE)) + ); + }// //GEN-END:initComponents + + private void compilerPathFileButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_compilerPathFileButtonActionPerformed + assert EventQueue.isDispatchThread(); + bladeComponentFolder = new FileChooserBuilder(BladeComponents.class) + .setDirectoriesOnly(true) + .setTitle("Select BladeComponents class folder") // NOI18N + .setDefaultWorkingDirectory(FileUtil.toFile(project.getProjectDirectory())) + .forceUseOfDefaultWorkingDirectory(true) + .showOpenDialog(); + if (bladeComponentFolder != null) { + bladeProperties.addCustomBladeComponentClassFolder(FileUtil.normalizeFile(bladeComponentFolder).getAbsolutePath()); + } + }//GEN-LAST:event_compilerPathFileButtonActionPerformed + + private void removePathButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removePathButtonActionPerformed + int index = customBladeComponentClassFolderList.getSelectedIndex(); + if (index > -1) { + bladeProperties.removeCustomBladeComponentClassFolder(index); + } + + }//GEN-LAST:event_removePathButtonActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton compilerPathFileButton; + private javax.swing.JList customBladeComponentClassFolderList; + private javax.swing.JLabel includePathLabel; + private javax.swing.JLabel jLabel1; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JButton removePathButton; + // End of variables declaration//GEN-END:variables +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeComponentsCustomizerProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeComponentsCustomizerProvider.java new file mode 100644 index 000000000000..c5cea3c6a1fe --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeComponentsCustomizerProvider.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.ui.customizer; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import javax.swing.JComponent; +import org.netbeans.api.project.Project; +import org.netbeans.spi.project.ui.support.ProjectCustomizer; +import org.openide.util.Lookup; +import org.openide.util.NbBundle; + +/** + * + * @author bhaidu + */ +public class BladeComponentsCustomizerProvider implements ProjectCustomizer.CompositeCategoryProvider { + + public static final String COMPONENTS_CUSTOMIZER = "components_customizer"; // NOI18N + + @Override + public ProjectCustomizer.Category createCategory(Lookup lkp) { + return ProjectCustomizer.Category.create(COMPONENTS_CUSTOMIZER, + NbBundle.getMessage(BladeComponentsCustomizerProvider.class, + "LBL_ComponentsConfig"), null); + } + + @Override + public JComponent createComponent(ProjectCustomizer.Category category, Lookup context) { + Project project = context.lookup(Project.class); + assert project != null; + + BladeComponents panel = new BladeComponents(project); + category.setOkButtonListener(new Listener(panel)); + return panel; + } + + private class Listener implements ActionListener { + private final BladeComponents panel; + public Listener(BladeComponents panel){ + this.panel = panel; + } + @Override + public void actionPerformed(ActionEvent e) { + this.panel.storeData(); + } + + } +} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeSettingsCustomizerProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeSettingsCustomizerProvider.java index d0dc423b6f17..d775ba100f3d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeSettingsCustomizerProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeSettingsCustomizerProvider.java @@ -45,20 +45,28 @@ public ProjectCustomizer.Category createCategory(Lookup lkp) { subcategories.add(optionsCustomizer.createCategory(lkp)); BladeDirectivesCustomizerProvider directiveCustomizer = new BladeDirectivesCustomizerProvider(); subcategories.add(directiveCustomizer.createCategory(lkp)); + BladeComponentsCustomizerProvider bladeComponentsCustomizer = new BladeComponentsCustomizerProvider(); + subcategories.add(bladeComponentsCustomizer.createCategory(lkp)); return ProjectCustomizer.Category.create(CUSTOMIZER_IDENT, NbBundle.getMessage(BladeSettingsCustomizerProvider.class, "LBL_LaravelBlade"), null, - subcategories.toArray(new ProjectCustomizer.Category[0])); + subcategories.toArray(ProjectCustomizer.Category[]::new)); } @Override public JComponent createComponent(ProjectCustomizer.Category category, Lookup context) { switch (category.getName()) { - case BladeOptionsCustomizerProvider.VIEWS_FOLDERS: + case BladeOptionsCustomizerProvider.VIEWS_FOLDERS -> { BladeOptionsCustomizerProvider provider = new BladeOptionsCustomizerProvider(); return provider.createComponent(category, context); - case BladeDirectivesCustomizerProvider.BLADE_DIRECTIVES: + } + case BladeDirectivesCustomizerProvider.BLADE_DIRECTIVES -> { BladeDirectivesCustomizerProvider directivesProvider = new BladeDirectivesCustomizerProvider(); return directivesProvider.createComponent(category, context); + } + case BladeComponentsCustomizerProvider.COMPONENTS_CUSTOMIZER -> { + BladeComponentsCustomizerProvider bladeComponentsCustomizer = new BladeComponentsCustomizerProvider(); + return bladeComponentsCustomizer.createComponent(category, context); + } } return createGeneralSettingsComponent(category, context); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/Bundle.properties b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/Bundle.properties index a8933a024d26..854ab547ae6b 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/Bundle.properties +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/Bundle.properties @@ -33,6 +33,7 @@ BladeDirectives.compilerPathFileButton.text_1=Add File BladeDirectives.includePathLabel.text_1=Custom Directive php setup files LBL_LaravelBlade=Laravel blade LBL_ViewsFolders=Views Folders +LBL_ComponentsConfig=Blade Components Config BladeDirectives.jLabel1.text=Php files containing custom directive defintions as in : BladeDirectives.jLabel3.text=https://laravel.com/docs/10.x/blade#extending-blade BladeViewsFoldersPanel.reindexViewFolderButton.text=Reindex selected @@ -47,4 +48,15 @@ BladeViewsFoldersPanel.jLabel1.text=Views Folders BladeGeneralSettings.jLabel1.text=Blade General Settings BladeGeneralSettings.formatting_enabled.text=Enable Formatting (experimental) BladeGeneralSettings.indentation_enabled.text=Enable Indentation (experimental) +BladeGeneralSettings.auto_tag_completion.text=Auto tag completion ("{{ }}", "{!! !!}", "{{-- --}}") BladeViewsFoldersPanel.nonLaravelViewDeclFinder.text=Allow Go to click action for paths arugment on `view`, `render` and `make` method +BladeGeneralSettings.jLabel2.text=Global settings (all php projects) + + +# include path +BladeComponents.includePathLabel.text_1=Custom Blade components folders list +BladeComponents.removePathButton.text_1=Remove Folder +BladeComponents.compilerPathFileButton.actionCommand_1=compilerPathFolderButton +BladeComponents.compilerPathFileButton.toolTipText_1= +BladeComponents.compilerPathFileButton.text_1=Add Folder +BladeComponents.jLabel1.text=Add folders containing class components, for autocomplete & declaration finder on " list) { - String includePath = UiOptionsUtils.encodeToStrings(list.elements()); + String includePath = UIOptionsUtils.encodeToStrings(list.elements()); getPreferences().put(VIEW_PATH_LIST, includePath); } @@ -165,7 +162,7 @@ public DefaultListModel getModelForBladeComponentsClassFolderList() { } public void storeBladeComponentsFolder() { - String includePath = UiOptionsUtils.encodeToStrings(bladeComponentsClassFolderList.elements()); + String includePath = UIOptionsUtils.encodeToStrings(bladeComponentsClassFolderList.elements()); getPreferences().put(BLADE_COMPONENT_CLASS_FOLDER_LIST, includePath); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrLexer.g4 index f89e3589ac97..79074df1a12e 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrLexer.g4 @@ -48,7 +48,6 @@ lexer grammar BladeHtmlAntlrLexer; } options { - superClass = LexerAdaptor; caseInsensitive = true; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrUtils.java index c31becb85a19..949d2e89f9d3 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/BladeHtmlAntlrUtils.java @@ -1,5 +1,20 @@ /* -Licensed to the Apache Software Foundation (ASF) + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ package org.netbeans.modules.php.blade.syntax.antlr4.html_components; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/LexerAdaptor.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/LexerAdaptor.java deleted file mode 100644 index b428a1374f28..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/html_components/LexerAdaptor.java +++ /dev/null @@ -1,57 +0,0 @@ - /* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.syntax.antlr4.html_components; - -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.Lexer; -import org.antlr.v4.runtime.Token; - -/** - * - * @author bogdan - */ -public abstract class LexerAdaptor extends Lexer { - - private int _currentRuleType = Token.INVALID_TYPE; - public int exitIfModePosition = 0; - public boolean compomentTagOpen = false; - - public LexerAdaptor(CharStream input) { - super(input); - } - - public int getCurrentRuleType() { - return _currentRuleType; - } - - public void setCurrentRuleType(int ruleType) { - this._currentRuleType = ruleType; - } - - @Override - public Token emit() { - return super.emit(); - } - - @Override - public void reset() { - setCurrentRuleType(Token.INVALID_TYPE); - super.reset(); - } -} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.g4 index 22a5993f5ff6..6ce49ebe2bec 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpAntlrLexer.g4 @@ -48,7 +48,6 @@ import BladePhpCommonLexer; } options { - superClass = LexerAdaptor; caseInsensitive = true; } From 73b97f16791b6004cdf7eb8698afa3f5742d69e2 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Wed, 26 Feb 2025 07:08:18 +0200 Subject: [PATCH 39/43] add gitignored util class BladeAntlrLexerUtils, include license on form file, move snippet parser outside of antlr package --- .../editor/braces/BladeBracesMatcher.java | 2 +- .../completion/PhpCodeCompletionService.java | 4 +- .../declaration/BladeDeclarationFinder.java | 6 +- .../PhpElementsDeclarationService.java | 4 +- .../editor/parser/BladeParserResult.java | 1 - .../parser}/BladePhpSnippetParser.java | 5 +- .../editor/ui/customizer/BladeComponents.form | 17 ++++ .../antlr4/utils/BladeAntlrLexerUtils.java | 82 +++++++++++++++++++ 8 files changed, 111 insertions(+), 10 deletions(-) rename php/php.blade/src/org/netbeans/modules/php/blade/{syntax/antlr4/php => editor/parser}/BladePhpSnippetParser.java (98%) create mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/utils/BladeAntlrLexerUtils.java diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/braces/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/braces/BladeBracesMatcher.java index f167b162609a..b1db4e6926f3 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/braces/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/braces/BladeBracesMatcher.java @@ -39,7 +39,7 @@ import org.netbeans.modules.php.blade.syntax.BladeTagsUtils; import org.netbeans.modules.php.blade.syntax.antlr4.utils.BaseBladeAntlrUtils; import static org.netbeans.modules.php.blade.syntax.BladeTagsUtils.*; -import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexerUtils; +import org.netbeans.modules.php.blade.syntax.antlr4.utils.BladeAntlrLexerUtils; import org.netbeans.spi.editor.bracesmatching.BracesMatcher; import org.netbeans.spi.editor.bracesmatching.BracesMatcherFactory; import org.netbeans.spi.editor.bracesmatching.MatcherContext; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java index 07707bf4e6e9..91bb0e9d2870 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/completion/PhpCodeCompletionService.java @@ -42,8 +42,8 @@ import org.netbeans.modules.php.blade.syntax.annotation.PhpKeyword; import org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpAntlrLexer; import org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpAntlrUtils; -import org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpSnippetParser; -import static org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpSnippetParser.PhpReferenceType.PHP_NAMESPACE; +import org.netbeans.modules.php.blade.editor.parser.BladePhpSnippetParser; +import static org.netbeans.modules.php.blade.editor.parser.BladePhpSnippetParser.PhpReferenceType.PHP_NAMESPACE; import org.netbeans.modules.php.blade.syntax.php.PhpKeywordList; import org.openide.filesystems.FileObject; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/BladeDeclarationFinder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/BladeDeclarationFinder.java index d3f6827bbd6b..2b13046ec627 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/BladeDeclarationFinder.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/BladeDeclarationFinder.java @@ -63,13 +63,13 @@ import org.netbeans.modules.php.blade.syntax.StringUtils; import static org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpAntlrParser.IDENTIFIER; import org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpAntlrUtils; -import org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpSnippetParser.PhpReference; +import org.netbeans.modules.php.blade.editor.parser.BladePhpSnippetParser.PhpReference; import org.openide.filesystems.FileObject; import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; import org.openide.filesystems.FileUtil; import org.openide.util.Exceptions; -import static org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpSnippetParser.PhpReferenceType.PHP_FUNCTION; -import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexerUtils; +import static org.netbeans.modules.php.blade.editor.parser.BladePhpSnippetParser.PhpReferenceType.PHP_FUNCTION; +import org.netbeans.modules.php.blade.syntax.antlr4.utils.BladeAntlrLexerUtils; import org.netbeans.modules.php.editor.lexer.PHPTokenId; import org.netbeans.spi.project.ui.support.ProjectConvertors; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/PhpElementsDeclarationService.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/PhpElementsDeclarationService.java index d9294b889f1d..ad1e5e6001a1 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/PhpElementsDeclarationService.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/PhpElementsDeclarationService.java @@ -28,8 +28,8 @@ import org.netbeans.modules.php.blade.csl.elements.PhpFunctionElement; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexFunctionResult; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexResult; -import org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpSnippetParser; -import static org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpSnippetParser.PhpReference; +import org.netbeans.modules.php.blade.editor.parser.BladePhpSnippetParser; +import static org.netbeans.modules.php.blade.editor.parser.BladePhpSnippetParser.PhpReference; import org.openide.filesystems.FileObject; /** diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java index 09bd83689f27..176836ed6d59 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java @@ -44,7 +44,6 @@ import org.netbeans.modules.php.blade.editor.parser.listeners.ReferenceIdListener; import org.netbeans.modules.php.blade.editor.parser.listeners.ScopeListener; import org.netbeans.modules.php.blade.editor.parser.listeners.StructureListener; -import org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpSnippetParser; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrParser; import org.openide.filesystems.FileObject; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpSnippetParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladePhpSnippetParser.java similarity index 98% rename from php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpSnippetParser.java rename to php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladePhpSnippetParser.java index 2d4a5f747a6d..e1d147e71d77 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/php/BladePhpSnippetParser.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladePhpSnippetParser.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.netbeans.modules.php.blade.syntax.antlr4.php; +package org.netbeans.modules.php.blade.editor.parser; import java.util.ArrayList; import java.util.Collections; @@ -48,6 +48,9 @@ import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils.FieldAccessType; import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.BladeError; import org.netbeans.modules.php.blade.editor.parser.ParsingUtils; +import org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpAntlrLexer; +import org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpAntlrParser; +import org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpAntlrParserBaseListener; import org.netbeans.modules.php.editor.parser.PHPParseResult; import org.openide.filesystems.FileObject; import org.openide.util.Exceptions; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeComponents.form b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeComponents.form index 9c26a62b4a4d..c4d4ba04a788 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeComponents.form +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/ui/customizer/BladeComponents.form @@ -1,5 +1,22 @@ +
      diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/utils/BladeAntlrLexerUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/utils/BladeAntlrLexerUtils.java new file mode 100644 index 000000000000..434b33ad1e12 --- /dev/null +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/utils/BladeAntlrLexerUtils.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.syntax.antlr4.utils; + +import org.netbeans.modules.php.blade.syntax.antlr4.utils.*; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.Token; +import org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer; +import static org.netbeans.modules.php.blade.syntax.antlr4.v10.BladeAntlrLexer.*; +import org.netbeans.spi.lexer.antlr4.AntlrTokenSequence; + +/** + * + * @author bogdan + */ +public final class BladeAntlrLexerUtils extends BaseBladeAntlrUtils { + + public static AntlrTokenSequence getTokens(Document doc) { + + try { + String text = doc.getText(0, doc.getLength()); + return new AntlrTokenSequence(new BladeAntlrLexer(CharStreams.fromString(text))); + } catch (BadLocationException ex) { + + } + return null; + } + + public static AntlrTokenSequence lexerStringScan(String text) { + CharStream cs = CharStreams.fromString(text); + BladeAntlrLexer lexer = new BladeAntlrLexer(cs); + AntlrTokenSequence tokens = new AntlrTokenSequence(lexer); + return tokens; + } + + public static Token getToken(String text, int offset) { + AntlrTokenSequence tokens = lexerStringScan(text); + if (offset > text.length()) { + return null; + } + tokens.seekTo(offset); + + if (!tokens.hasNext()) { + return null; + } + Token token = tokens.next().get(); + return token; + } + + public static int getTagPairTokenType(int tokenType) { + return switch (tokenType) { + case BLADE_CONTENT_OPEN_TAG -> BLADE_CONTENT_CLOSE_TAG; + case BLADE_CONTENT_CLOSE_TAG -> BLADE_CONTENT_OPEN_TAG; + case BLADE_RAW_OPEN_TAG -> BLADE_RAW_CLOSE_TAG; + case BLADE_RAW_CLOSE_TAG -> BLADE_RAW_OPEN_TAG; + default -> -1; + }; + } + + public static boolean isUndefinedDirective(int token){ + return token == BladeAntlrLexer.D_CUSTOM; + } +} From 83a9e5e95e11ff48fc1eebcc7a3ebdc76a1a589d Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Thu, 27 Mar 2025 19:51:38 +0200 Subject: [PATCH 40/43] sync plugin latest fixes --- .../blade/syntax/antlr4/v10/BladeAntlrLexer.g4 | 2 ++ .../errors/wrong_foreach_syntax_error.blade.php | 15 +++++++++++++++ .../blade/editor/parser/BladeParserErrorTest.java | 4 ++++ 3 files changed, 21 insertions(+) create mode 100644 php/php.blade/test/unit/data/testfiles/parser/errors/wrong_foreach_syntax_error.blade.php diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 index 8a15bc526e97..b30e8a1ef077 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 @@ -407,6 +407,8 @@ FOREACH_RCURLYBRACE: '}' {curlyparenBalance--;}->skip; FOREACH_VAR : '$' Identifier {rparenBalance == 1}?; //not in argument +FOREACH_PHP_EXPR_STRING : STRING_LITERAL->skip; + FOREACH_AS : 'as'; FOREACH_DOUBLE_ARROW : '=>' {rparenBalance == 1 && sqparenBalance == 0 && curlyparenBalance == 0}?; diff --git a/php/php.blade/test/unit/data/testfiles/parser/errors/wrong_foreach_syntax_error.blade.php b/php/php.blade/test/unit/data/testfiles/parser/errors/wrong_foreach_syntax_error.blade.php new file mode 100644 index 000000000000..1ce88abd752f --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/parser/errors/wrong_foreach_syntax_error.blade.php @@ -0,0 +1,15 @@ +@foreach($tests->task as $test) + +@endforeach + +@foreach(App\Models\Task::STATUS as $status) + +@endforeach + +@foreach($array['AS'] as $status) + +@endforeach + +@foreach($array["AS"] as $status) + +@endforeach \ No newline at end of file diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/BladeParserErrorTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/BladeParserErrorTest.java index 6a3f77f8b29f..3a3490026db7 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/BladeParserErrorTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/BladeParserErrorTest.java @@ -45,4 +45,8 @@ public void testInlineSectionNoError_01() throws Exception { public void testUnclosedDirectiveBracketError_01() throws Exception { checkErrors("testfiles/parser/unopend/unclosed_directive_bracket_error_01.blade.php"); } + + public void testWrongForeachSyntaxError() throws Exception { + checkErrors("testfiles/parser/errors/wrong_foreach_syntax_error.blade.php"); + } } From 775591bd794fd6a3557f1e98fa5ab9187ad9f86b Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Thu, 27 Mar 2025 21:38:37 +0200 Subject: [PATCH 41/43] cleanup, include blade navigator test, include missing directive props --- .../php/blade/csl/elements/NamedElement.java | 1 - .../php/blade/csl/elements/TagElement.java | 88 --------------- .../blade/editor/HyperlinkProviderImpl.java | 2 - .../editor/braces/BladeBracesMatcher.java | 6 +- .../declaration/BladeDeclarationFinder.java | 2 +- .../editor/directives/CustomDirectives.java | 12 ++- .../editor/hints/BladeHintsProvider.java | 14 +-- .../hints/PhpDirectiveSyntaxErrorRule.java | 81 -------------- .../blade/editor/indexing/PhpIndexUtils.java | 41 ------- .../editor/parser/BladeParserResult.java | 26 +---- .../parser/BladePhpExpressionOccurences.java | 24 ++++- .../editor/parser/BladePhpSnippetParser.java | 102 +++--------------- .../PhpExpressionOccurenceListener.java | 37 ++++--- .../php/blade/resources/Bundle.properties | 1 + .../resources/FlatLafDark-FlatLafDark.xml | 1 + .../php/blade/resources/FontAndColors.xml | 1 + .../blade/resources/highlightBlade.blade.php | 6 ++ .../modules/php/blade/resources/layer.xml | 3 - .../php/blade/syntax/DirectivesList.java | 1 + .../syntax/antlr4/v10/BladeAntlrLexer.g4 | 2 + .../syntax/antlr4/v10/BladeAntlrParser.g4 | 5 +- ..._01.blade.php.testCompletion_01.completion | 1 + ...tiple_block_directives.blade.php.structure | 5 + .../wrong_empty_block_syntax_error.blade.php | 6 ++ ..._empty_block_syntax_error.blade.php.errors | 0 .../wrong_foreach_syntax_error.blade.php | 2 +- ...rong_foreach_syntax_error.blade.php.errors | 0 .../unopend_set_error_01.blade.php.errors | 2 +- .../editor/navigator/BladeNavigatorTest.java | 36 +++++++ .../editor/parser/BladeParserErrorTest.java | 8 +- .../editor/parser/ParserPerformanceTest.java | 8 +- 31 files changed, 145 insertions(+), 379 deletions(-) delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java delete mode 100644 php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/PhpDirectiveSyntaxErrorRule.java create mode 100644 php/php.blade/test/unit/data/testfiles/multiple_block_directives.blade.php.structure create mode 100644 php/php.blade/test/unit/data/testfiles/parser/errors/wrong_empty_block_syntax_error.blade.php create mode 100644 php/php.blade/test/unit/data/testfiles/parser/errors/wrong_empty_block_syntax_error.blade.php.errors create mode 100644 php/php.blade/test/unit/data/testfiles/parser/errors/wrong_foreach_syntax_error.blade.php.errors create mode 100644 php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/navigator/BladeNavigatorTest.java diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java index 9ca37d9aa0e9..58e361c10861 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/NamedElement.java @@ -18,7 +18,6 @@ */ package org.netbeans.modules.php.blade.csl.elements; -import java.util.HashSet; import java.util.Set; import org.netbeans.modules.csl.api.ElementHandle; import org.netbeans.modules.csl.api.ElementKind; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java deleted file mode 100644 index 63bab6ec475e..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/TagElement.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.csl.elements; - -import java.util.HashSet; -import java.util.Set; -import org.netbeans.modules.csl.api.ElementHandle; -import org.netbeans.modules.csl.api.ElementKind; -import org.netbeans.modules.csl.api.Modifier; -import org.netbeans.modules.csl.api.OffsetRange; -import org.netbeans.modules.csl.spi.ParserResult; -import org.netbeans.modules.php.blade.editor.BladeLanguage; -import org.openide.filesystems.FileObject; - -/** - * - * @author bhaidu - */ -public class TagElement implements ElementHandle { - - private final String name; - private final ElementType type; - - public TagElement(String name) { - this.name = name; - this.type = ElementType.NA; - } - - @Override - public FileObject getFileObject() { - return null; - } - - @Override - public String getMimeType() { - return BladeLanguage.MIME_TYPE; - } - - @Override - public String getName() { - return this.name; - } - - @Override - public String getIn() { - return ""; // NOI18N - } - - @Override - public ElementKind getKind() { - return ElementKind.TAG; - } - - @Override - public Set getModifiers() { - return Set.of(); - } - - @Override - public boolean signatureEquals(ElementHandle eh) { - return false; - } - - @Override - public OffsetRange getOffsetRange(ParserResult pr) { - return OffsetRange.NONE; - } - - public ElementType getType() { - return type; - } -} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java index 5640a4e7c749..dba15fd7a01a 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/HyperlinkProviderImpl.java @@ -25,8 +25,6 @@ import java.util.List; import java.util.Set; import javax.swing.text.Document; -import javax.swing.text.JTextComponent; -import org.netbeans.api.editor.*; import org.netbeans.api.editor.mimelookup.MimeRegistration; import org.netbeans.lib.editor.hyperlink.spi.HyperlinkProviderExt; import org.netbeans.lib.editor.hyperlink.spi.HyperlinkType; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/braces/BladeBracesMatcher.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/braces/BladeBracesMatcher.java index b1db4e6926f3..fc503a794b78 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/braces/BladeBracesMatcher.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/braces/BladeBracesMatcher.java @@ -86,7 +86,7 @@ public int[] findOrigin() throws InterruptedException, BadLocationException { tokenOffset = token.offset(th); switch (id) { - case BLADE_DIRECTIVE: { + case BLADE_DIRECTIVE -> { tokenText = token.text().toString().trim(); currentDirection = findDirectiveBlockDirectionType(tokenText); if (currentDirection.equals(BraceDirectionType.STOP)) { @@ -94,12 +94,12 @@ public int[] findOrigin() throws InterruptedException, BadLocationException { } return new int[]{tokenOffset, tokenOffset + token.length()}; } - case BLADE_ECHO_DELIMITOR: { + case BLADE_ECHO_DELIMITOR -> { tokenText = token.text().toString().trim(); currentDirection = isStartTag(tokenText) ? BraceDirectionType.CURLY_START_TO_END : BraceDirectionType.CURLY_END_TO_START; return new int[]{tokenOffset, tokenOffset + token.length()}; } - case BLADE_CUSTOM_DIRECTIVE: { + case BLADE_CUSTOM_DIRECTIVE -> { tokenText = token.text().toString().trim(); Project projectOwner = FileSystemUtils.getProjectOwner(document); if (projectOwner == null) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/BladeDeclarationFinder.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/BladeDeclarationFinder.java index 2b13046ec627..419b68f1bd81 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/BladeDeclarationFinder.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/declaration/BladeDeclarationFinder.java @@ -438,7 +438,7 @@ public void filterDirectiveName(CustomDirective directive, FileObject file) { if (directive.getName().equals(customDirectiveOccurence.directiveName)) { NamedElement customDirectiveHandle = new NamedElement(customDirectiveOccurence.directiveName, file, ElementType.CUSTOM_DIRECTIVE); DeclarationFinder.DeclarationLocation newLoc = new DeclarationFinder.DeclarationLocation(file, directive.getOffset(), customDirectiveHandle); - this.location.addAlternative(new AlternativeLocationImpl(newLoc)); + this.getLocation().addAlternative(new AlternativeLocationImpl(newLoc)); } } }); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java index 0666626a63da..21ae1a4a52b8 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/directives/CustomDirectives.java @@ -61,7 +61,7 @@ public final class CustomDirectives { private static final Map INSTANCES = new WeakHashMap<>(); private final Map> customDirectives = new LinkedHashMap<>(); - public List customDirectiveList = new ArrayList<>(); + private List customDirectiveList = new ArrayList<>(); private final FileChangeListener fileChangeListener = new FileChangeListenerImpl(); @@ -98,7 +98,7 @@ private CustomDirectives(Project project) { } private void extractCustomDirectives() { - LOGGER.info("Extracting custom directives"); + LOGGER.info("Extracting custom directives"); // NOI18N String[] compilerPathList = BladeProjectProperties.getInstance(project).getCompilerPathList(); FileObject defaultAppProvider = project.getProjectDirectory().getFileObject(APP_PROVIDER_RELATIVE_PATH); String defaultAppPath = ""; @@ -204,7 +204,7 @@ public void filterAction(FilterCallbackDeclaration callback) { public boolean customDirectiveConfigured(String query) { for (CustomDirectives.CustomDirective customDirective : customDirectiveList) { - if (customDirective.name.equals(query)) { + if (customDirective.getName().equals(query)) { return true; } } @@ -306,7 +306,7 @@ public static interface FilterCallback { public static abstract class FilterCallbackDeclaration { - protected DeclarationFinder.DeclarationLocation location; + private DeclarationFinder.DeclarationLocation location; public FilterCallbackDeclaration(DeclarationFinder.DeclarationLocation location) { this.location = location; @@ -314,6 +314,10 @@ public FilterCallbackDeclaration(DeclarationFinder.DeclarationLocation location) public void filterDirectiveName(CustomDirective directive, FileObject file) { } + + public DeclarationFinder.DeclarationLocation getLocation() { + return location; + } } public static class CustomDirective { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java index 0523b1baabe4..96dbd6baf5ed 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/BladeHintsProvider.java @@ -34,7 +34,6 @@ import org.netbeans.modules.csl.api.HintsProvider; import org.netbeans.modules.php.blade.editor.BladeLanguage; import org.netbeans.modules.php.blade.editor.directives.CustomDirectives; -import static org.netbeans.modules.php.blade.editor.hints.PhpDirectiveSyntaxErrorRule.PHP_SYNTAX_ERROR_HINT_ID; import org.netbeans.modules.php.blade.editor.parser.BladeParserResult; import org.netbeans.modules.php.blade.editor.path.BladePathUtils; import org.netbeans.modules.php.blade.project.ProjectUtils; @@ -60,7 +59,7 @@ public void computeHints(HintsManager manager, RuleContext context, List h return; } Map> allHints = manager.getHints(false, context); - List directiveHints = allHints.get("blade.option.directive.hints"); + List directiveHints = allHints.get("blade.option.directive.hints"); //NOI18N BladeParserResult parserResult = (BladeParserResult) context.parserResult; FileObject fo = EditorDocumentUtils.getFileObject(context.doc); @@ -178,17 +177,6 @@ public List getBuiltinRules() { public RuleContext createRuleContext() { return new BladeRuleContext(); } - - public static boolean phpSyntaxErrorsDisplayEnabled() { - HintsManager bladeHintsManager = HintsProvider.HintsManager.getManagerForMimeType(BladeLanguage.MIME_TYPE); - Map> allHints = bladeHintsManager.getHints(); - List phpSyntaxHints = allHints.get(PHP_SYNTAX_ERROR_HINT_ID); //NOI18N - if (phpSyntaxHints == null || phpSyntaxHints.isEmpty()) { - return false; - } - Rule.AstRule rule = phpSyntaxHints.get(0); - return bladeHintsManager.isEnabled(rule); - } private static final class BladeRule implements ErrorRule { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/PhpDirectiveSyntaxErrorRule.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/PhpDirectiveSyntaxErrorRule.java deleted file mode 100644 index dadddb12c38b..000000000000 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/hints/PhpDirectiveSyntaxErrorRule.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.php.blade.editor.hints; - -import java.util.Collections; -import java.util.Set; -import java.util.prefs.Preferences; -import javax.swing.JComponent; -import org.netbeans.modules.csl.api.HintSeverity; -import org.netbeans.modules.csl.api.Rule; -import org.netbeans.modules.csl.api.RuleContext; -import org.openide.util.NbBundle; - -/** - * - * @author bogdan - */ -public class PhpDirectiveSyntaxErrorRule implements Rule.AstRule { - public static final String PHP_SYNTAX_ERROR_HINT_ID = "blade.hint.php_syntax_errors"; //NOI18N - - @Override - public boolean getDefaultEnabled() { - return false; - } - - @Override - public JComponent getCustomizer(Preferences node) { - return null; - } - - @Override - public boolean appliesTo(RuleContext context) { - return context instanceof BladeHintsProvider.BladeRuleContext; - } - - @Override - public boolean showInTasklist() { - return true; - } - - @Override - public HintSeverity getDefaultSeverity() { - return HintSeverity.ERROR; - } - - @Override - public Set getKinds() { - return Collections.singleton(PHP_SYNTAX_ERROR_HINT_ID); - } - - @Override - public String getId() { - return PHP_SYNTAX_ERROR_HINT_ID; - } - - @Override - public String getDescription() { - return NbBundle.getMessage(PhpDirectiveSyntaxErrorRule.class, "AST_Rule_PhpSyntaxError"); //NOI18N - } - - @Override - public String getDisplayName() { - return NbBundle.getMessage(PhpDirectiveSyntaxErrorRule.class, "AST_Rule_PhpSyntaxErrorDescription"); //NOI18N - } -} diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java index 25dd1b657c0e..1821ad404f8f 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/indexing/PhpIndexUtils.java @@ -28,7 +28,6 @@ import org.netbeans.modules.csl.api.OffsetRange; import org.netbeans.modules.parsing.spi.indexing.support.IndexResult; import org.netbeans.modules.parsing.spi.indexing.support.QuerySupport; -import org.netbeans.modules.php.blade.editor.EditorStringUtils; import static org.netbeans.modules.php.blade.editor.EditorStringUtils.NAMESPACE_SEPARATOR; import org.netbeans.modules.php.blade.editor.cache.QueryCache; import org.netbeans.modules.php.editor.api.QuerySupportFactory; @@ -644,46 +643,6 @@ public static Collection queryClassConstants(FileObject fo, Stri return results; } - /** - * @notused TO BE continued - * - * @param fo - * @param prefix - * @param ownerClass - * @return - */ - public static Collection queryClassProperties(FileObject fo, String prefix, String ownerClass){ - QuerySupport phpindex = QuerySupportFactory.get(fo); - Collection results = new ArrayList<>(); - String queryPrefix = prefix.toLowerCase(); - try { - Collection indexResults = phpindex.query(PHPIndexer.FIELD_FIELD, queryPrefix, QuerySupport.Kind.PREFIX, new String[]{ - PHPIndexer.FIELD_FIELD, PHPIndexer.FIELD_CLASS}); - for (IndexResult indexResult : indexResults) { - FileObject indexFile = indexResult.getFile(); - //internal php index - - String classOwnerName = indexResult.getValue(PHPIndexer.FIELD_CLASS); - if (classOwnerName == null || !classOwnerName.startsWith(ownerClass.toLowerCase() + PHP_INDEX_INFO_SEPARATOR)) { - continue; - } - String[] values = indexResult.getValues(PHPIndexer.FIELD_FIELD); - for (String value : values) { - Signature sig = Signature.get(value); - String name = sig.string(SIGN_NAME_POS); - - if (name.length() > 0 && name.equals(prefix)) { - Integer offset = sig.integer(SIGN_METHOD_OFFSET_POS); - results.add(new PhpIndexResult(name, indexFile, PhpIndexResult.Type.CONSTANT, new OffsetRange(offset, offset + name.length()))); - } - } - } - } catch (IOException ex) { - Exceptions.printStackTrace(ex); - } - return results; - } - public static Collection queryExactClassConstants(String prefix, String ownerClass, FileObject fo) { QuerySupport phpindex = QuerySupportFactory.get(fo); Collection results = new ArrayList<>(); diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java index 176836ed6d59..b09acc4a6b89 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladeParserResult.java @@ -95,7 +95,6 @@ public BladeParserResult get(String taskClass) { parser.addErrorListener(createErrorListener()); parser.addParseListener(new ReferenceIdListener(bladeRreferenceIdsCollection)); parser.addParseListener(new PhpExpressionOccurenceListener(bladePhpExpressionOccurences)); - parser.addParseListener(new CustomDirectivesListener(bladeCustomDirectiveOccurences)); if (taskClassL.contains("completion")) { //NOI18N parser.addParseListener(new ScopeListener(bladeScope)); @@ -103,18 +102,12 @@ public BladeParserResult get(String taskClass) { //avoid on index if (!taskClassL.contains(".indexing.repository")) { //NOI18N + parser.addParseListener(new CustomDirectivesListener(bladeCustomDirectiveOccurences)); parser.addParseListener(new StructureListener(structure, folds, getFileObject())); } - evaluateParser(parser); - if (allowPhpSyntaxParsingForTask(taskClassL) - && BladeHintsProvider.phpSyntaxErrorsDisplayEnabled() - ) { - phpSyntaxAnalyzer(); - } - finished = true; } @@ -179,15 +172,6 @@ public BladeScope getBladeScope() { return bladeScope; } - public void phpSyntaxAnalyzer() { - for (OffsetRange range : getBladePhpExpressionOccurences().getPhpInlineOccurences()) { - CharSequence snapshotExpr = getSnapshot().getText().subSequence(range.getStart(), range.getEnd()); - BladePhpSnippetParser phpSnippetParser = new BladePhpSnippetParser(snapshotExpr.toString(), getFileObject(), range.getStart()); - phpSnippetParser.parse(); - errors.addAll(phpSnippetParser.getDiagnostics()); - } - } - public static class BladeStringReference { public final int antlrTokentype; @@ -198,14 +182,6 @@ public BladeStringReference(int antlrTokentype, String identifier) { this.identifier = identifier; } } - - private boolean allowPhpSyntaxParsingForTask(String taskClassL){ - return !taskClassL.contains("completion") //NOI18N - && !taskClassL.contains("declaration") //NOI18N - && !taskClassL.contains(".indexing.repository") //NOI18N - && !taskClassL.contains("csl.navigation") //NOI18N - ; - } public static class Reference { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladePhpExpressionOccurences.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladePhpExpressionOccurences.java index 1f92bb2e3984..3d618d68e471 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladePhpExpressionOccurences.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladePhpExpressionOccurences.java @@ -21,12 +21,14 @@ import java.util.Set; import java.util.TreeSet; import org.netbeans.modules.csl.api.OffsetRange; + /** * * @author bogdan */ public class BladePhpExpressionOccurences { + private final Set phpRawInlineExpressionLocations = new TreeSet<>(); private final Set phpInlineExpressionLocations = new TreeSet<>(); private final Set phpOutputExpressionLocations = new TreeSet<>(); private final Set phpForeachExpressionLocations = new TreeSet<>(); @@ -43,8 +45,12 @@ public void markPhpForeachExpressionOccurence(OffsetRange range) { phpForeachExpressionLocations.add(range); } + public void markPhpRawInlineExpressionOccurence(OffsetRange range) { + phpRawInlineExpressionLocations.add(range); + } + public OffsetRange findPhpExpressionLocation(int offset) { - + //OUTPUT for (OffsetRange range : phpOutputExpressionLocations) { @@ -70,6 +76,18 @@ public OffsetRange findPhpExpressionLocation(int offset) { } } + for (OffsetRange range : phpRawInlineExpressionLocations) { + + if (offset < range.getStart()) { + //excedeed the offset range + break; + } + + if (range.containsInclusive(offset)) { + return range; + } + } + //FOREACH for (OffsetRange range : phpForeachExpressionLocations) { @@ -90,6 +108,10 @@ public Set getPhpInlineOccurences() { return phpInlineExpressionLocations; } + public Set getPhpRawInlineOccurences() { + return phpRawInlineExpressionLocations; + } + public Set getPhpOutputOccurences() { return phpOutputExpressionLocations; } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladePhpSnippetParser.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladePhpSnippetParser.java index e1d147e71d77..2093ad8266ba 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladePhpSnippetParser.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/BladePhpSnippetParser.java @@ -18,13 +18,8 @@ */ package org.netbeans.modules.php.blade.editor.parser; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; import java.util.Map; import java.util.TreeMap; -import javax.swing.text.Document; -import org.netbeans.modules.csl.api.Error; import org.antlr.v4.runtime.ANTLRErrorListener; import org.antlr.v4.runtime.BaseErrorListener; import org.antlr.v4.runtime.CharStream; @@ -37,23 +32,14 @@ import org.antlr.v4.runtime.Recognizer; import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.tree.ParseTreeListener; -import org.netbeans.editor.BaseDocument; import org.netbeans.modules.csl.api.OffsetRange; import org.netbeans.modules.csl.api.Severity; -import org.netbeans.modules.parsing.api.ParserManager; -import org.netbeans.modules.parsing.api.ResultIterator; -import org.netbeans.modules.parsing.api.Source; -import org.netbeans.modules.parsing.api.UserTask; -import org.netbeans.modules.parsing.spi.ParseException; import org.netbeans.modules.php.blade.editor.indexing.PhpIndexUtils.FieldAccessType; import org.netbeans.modules.php.blade.editor.parser.BladeParserResult.BladeError; -import org.netbeans.modules.php.blade.editor.parser.ParsingUtils; import org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpAntlrLexer; import org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpAntlrParser; import org.netbeans.modules.php.blade.syntax.antlr4.php.BladePhpAntlrParserBaseListener; -import org.netbeans.modules.php.editor.parser.PHPParseResult; import org.openide.filesystems.FileObject; -import org.openide.util.Exceptions; /** * @@ -64,12 +50,12 @@ public class BladePhpSnippetParser { private final String snippet; private final FileObject originFile; private final int snippetOffset; - private final List errors = new ArrayList<>(); private final Map identifierReference = new TreeMap<>(); private final Map fieldAccessReference = new TreeMap<>(); public static final String PHP_START = ""; //NOI18N + public enum PhpReferenceType { PHP_NAMESPACE, PHP_CLASS, @@ -84,60 +70,25 @@ public BladePhpSnippetParser(String snippet, FileObject originFile, int snippetO this.snippetOffset = snippetOffset; } + public FileObject getOriginFile() { + return originFile; + } + + public int getSnippetOffset() { + return snippetOffset; + } + public void parse() { CharStream cs = CharStreams.fromString(snippet); BladePhpAntlrLexer lexer = new BladePhpAntlrLexer(cs); CommonTokenStream tokens = new CommonTokenStream(lexer); BladePhpAntlrParser parser = new BladePhpAntlrParser(tokens); parser.removeErrorListeners(); - parser.setErrorHandler(new RustANTLRErrorStrategy()); - parser.addErrorListener(createErrorListener()); + parser.setErrorHandler(new BasicANTLRErrorStrategy()); parser.addParseListener(createIdentifiablePhpElementReferences()); parser.expression(); } - - public void syntaxAnalysis(){ - ParsingUtils parsingUtils = new ParsingUtils(); - BaseDocument doc = parsingUtils.createPhpBaseDocument(snippet); - if (doc == null) { - return; - } - - try { - Source source = Source.create(doc); - - if (source == null) { - return; - } - - Document sourceDoc = source.getDocument(false); - - if (sourceDoc == null) { - return; - } - - source.createSnapshot(); - ParserManager.parseWhenScanFinished(Collections.singletonList(source), new UserTask() { - - @Override - public void run(ResultIterator resultIterator) throws Exception { - org.netbeans.modules.parsing.spi.Parser.Result parserResult = resultIterator.getParserResult(); - if (parserResult != null && parserResult instanceof PHPParseResult) { - PHPParseResult phpParserResult = (PHPParseResult) parserResult; - for (Error error : phpParserResult.getDiagnostics()) { - int errorStartPosition = error.getStartPosition() + snippetOffset - 1; - int errorEndPosition = error.getEndPosition() + snippetOffset; - errors.add(new BladeError(error.getKey(), error.getDisplayName(), error.getDescription(), originFile, errorStartPosition, errorEndPosition, error.getSeverity())); - } - } - } - }); - - } catch (ParseException ex) { - Exceptions.printStackTrace(ex); - } - } private ParseTreeListener createIdentifiablePhpElementReferences() { return new BladePhpAntlrParserBaseListener() { @@ -235,16 +186,6 @@ public void exitStaticAccess(BladePhpAntlrParser.StaticAccessContext ctx) { OffsetRange range = new OffsetRange(classToken.getStartIndex(), classToken.getStopIndex() + 1); PhpReference reference = new PhpReference(PhpReferenceType.PHP_CLASS, classToken.getText(), namespace); identifierReference.put(range, reference); - - if (ctx.DOUBLE_COLON() != null && ctx.DOUBLE_COLON().getSymbol() != null) { - //generic access -// Token dbColon = ctx.DOUBLE_COLON().getSymbol(); -// PhpReference methodReference = new PhpReference(PhpReferenceType.PHP_CLASS_CONSTANT, "", namespace); -// OffsetRange accessRange = new OffsetRange(dbColon.getStopIndex(), dbColon.getStopIndex() + 1); -// identifierReference.put(accessRange, methodReference); -// FieldAcces fieldAccess = new FieldAcces(FieldAccessType.STATIC, methodReference, reference); -// fieldAccessReference.put(accessRange, fieldAccess); - } } @Override @@ -325,7 +266,7 @@ public FieldAcces findFieldAccessReference(int offset) { return null; } - private final class RustANTLRErrorStrategy extends DefaultErrorStrategy { + private final class BasicANTLRErrorStrategy extends DefaultErrorStrategy { @Override protected void reportFailedPredicate(Parser recognizer, FailedPredicateException e) { @@ -341,25 +282,6 @@ public void reportError(Parser recognizer, RecognitionException e) { } } - private ANTLRErrorListener createErrorListener() { - return new BaseErrorListener() { - @Override - public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { - int errorPosition = snippetOffset; - if (offendingSymbol instanceof Token) { - Token offendingToken = (Token) offendingSymbol; - errorPosition += offendingToken.getStartIndex(); - } - errors.add(new BladeError(null, "PHP error: " + msg, null, originFile, errorPosition, errorPosition, Severity.ERROR)); - } - - }; - } - - public List getDiagnostics() { - return errors; - } - public static class PhpReference { public final PhpReferenceType type; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/PhpExpressionOccurenceListener.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/PhpExpressionOccurenceListener.java index ce4a2296a087..3226dec4c05d 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/PhpExpressionOccurenceListener.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/parser/listeners/PhpExpressionOccurenceListener.java @@ -104,7 +104,6 @@ public void exitBlockIdentifiableArgDirective(BladeAntlrParser.BlockIdentifiable markPhpOutputExprOccurence(leftParen, rightParen, 1); } - @Override public void exitBladeContentTags(BladeAntlrParser.BladeContentTagsContext ctx) { if (ctx.BLADE_CONTENT_OPEN_TAG() == null || ctx.BLADE_CONTENT_CLOSE_TAG() == null) { @@ -142,41 +141,53 @@ public void exitPhpInline(BladeAntlrParser.PhpInlineContext ctx) { } Token openTag = ctx.start; Token closeTag = ctx.stop; - markPhpExprOccurence(openTag, closeTag, 1); + markPhpRawExprOccurence(openTag, closeTag, 1); } private void markPhpExprOccurence(Token start, Token end, int offset) { int startOffset = start.getStopIndex() + offset; int endOffset = end.getStartIndex(); - - if (startOffset > endOffset){ + + if (startOffset > endOffset) { return; } - + OffsetRange range = new OffsetRange(startOffset, endOffset); phpExprOccurences.markPhpInlineExpressionOccurence(range); } - + + private void markPhpRawExprOccurence(Token start, Token end, int offset) { + int startOffset = start.getStopIndex() + offset; + int endOffset = end.getStartIndex(); + + if (startOffset > endOffset) { + return; + } + + OffsetRange range = new OffsetRange(startOffset, endOffset); + phpExprOccurences.markPhpRawInlineExpressionOccurence(range); + } + private void markPhpOutputExprOccurence(Token start, Token end, int offset) { int startOffset = start.getStopIndex() + offset; int endOffset = end.getStartIndex(); - - if (startOffset > endOffset){ + + if (startOffset > endOffset) { return; } - + OffsetRange range = new OffsetRange(startOffset, endOffset); phpExprOccurences.markPhpOutputExpressionOccurence(range); } - + private void markPhpForeachExprOccurence(Token start, Token end, int offset) { int startOffset = start.getStopIndex() + offset; int endOffset = end.getStartIndex(); - - if (startOffset > endOffset){ + + if (startOffset > endOffset) { return; } - + OffsetRange range = new OffsetRange(startOffset, endOffset); phpExprOccurences.markPhpForeachExpressionOccurence(range); } diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/Bundle.properties b/php/php.blade/src/org/netbeans/modules/php/blade/resources/Bundle.properties index 21a228e9af98..b41a44aa11a8 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/resources/Bundle.properties +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/Bundle.properties @@ -31,4 +31,5 @@ blade_echo_delimiters=Blade echo tags blade_php=Php mod-undefined=Custom Directive effect mod-declaration=Custom Directive +blade_comp_attribute=Blade Component Attribute diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/FlatLafDark-FlatLafDark.xml b/php/php.blade/src/org/netbeans/modules/php/blade/resources/FlatLafDark-FlatLafDark.xml index 9a2984df1644..6d7a0ded7c64 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/resources/FlatLafDark-FlatLafDark.xml +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/FlatLafDark-FlatLafDark.xml @@ -26,6 +26,7 @@ + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/FontAndColors.xml b/php/php.blade/src/org/netbeans/modules/php/blade/resources/FontAndColors.xml index 5a2bc684ff0a..e8b874ec735a 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/resources/FontAndColors.xml +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/FontAndColors.xml @@ -26,6 +26,7 @@ + diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/highlightBlade.blade.php b/php/php.blade/src/org/netbeans/modules/php/blade/resources/highlightBlade.blade.php index baf125d61fc9..85d6e4b01ca1 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/resources/highlightBlade.blade.php +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/highlightBlade.blade.php @@ -10,6 +10,12 @@ {!! $x !!} @endif + + + + + @custom('local') + @verbatim
      {{escaped}}
      @endverbatim diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/resources/layer.xml b/php/php.blade/src/org/netbeans/modules/php/blade/resources/layer.xml index 4b031b7c61ac..58ee6ff9c307 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/resources/layer.xml +++ b/php/php.blade/src/org/netbeans/modules/php/blade/resources/layer.xml @@ -102,9 +102,6 @@ - - - diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/DirectivesList.java b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/DirectivesList.java index e52b065e1538..1dc3d09ffaa1 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/DirectivesList.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/DirectivesList.java @@ -108,6 +108,7 @@ @Directive(name = "@when", params = true, since = "11"), @Directive(name = "@bool", params = true, since = "11"), //styles + @Directive(name = "@props", params = true, since = "7.4"), @Directive(name = "@class", params = true, since = "8"), @Directive(name = "@style", params = true, since = "9"), @Directive(name = "@checked", params = true, since = "9"), diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 index b30e8a1ef077..bad8c287bbfa 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrLexer.g4 @@ -196,6 +196,8 @@ D_SIMPLE_DIRECTIVE : ('@dd' | '@dump' | '@json' | '@style' | '@class' | '@checked' | '@disabled' | '@selected' | '@required' | '@readonly' | '@when' | '@bool') (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}; +D_PROPS : '@props' (' ')* {lookupMode(INSIDE_PHP_EXPRESSION);}; + D_VITE : '@vite' (' ')* {lookupMode(MIXED_STRING_AND_ARRAY_IDENTIFIER);}; D_VITE_REFRESH : '@viteReactRefresh'; diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 index ad1a93d5ed15..611c49f85975 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 +++ b/php/php.blade/src/org/netbeans/modules/php/blade/syntax/antlr4/v10/BladeAntlrParser.g4 @@ -73,8 +73,8 @@ blockDirective : | authStatements | D_ONCE directiveArguments? statement* D_ENDONCE | D_UNLESS directiveArguments statement* D_ENDUNLESS - | D_EMPTY directiveArguments statement* D_ENDEMPTY - | D_ISSET directiveArguments statement* D_ENDISSET + | D_EMPTY directiveArguments statement* (D_ELSE statement*)? D_ENDEMPTY + | D_ISSET directiveArguments statement* (D_ELSE statement*)? D_ENDISSET | D_SESSION directiveArguments statement* D_ENDSESSION //permission | D_CAN directiveArguments statement* (D_ELSECAN directiveArguments statement*)* (D_ELSE statement*)? D_ENDCAN @@ -119,6 +119,7 @@ bladePhpBlock : // inlineDirective: D_SIMPLE_DIRECTIVE directiveArguments + | D_PROPS directiveArguments | D_PHP directiveArguments | D_DIRECTIVE | D_VITE_REFRESH diff --git a/php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php.testCompletion_01.completion b/php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php.testCompletion_01.completion index fd8264c5abc1..5e9b6bc8d082 100644 --- a/php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php.testCompletion_01.completion +++ b/php/php.blade/test/unit/data/testfiles/completion/testCompletion_01.blade.php.testCompletion_01.completion @@ -75,6 +75,7 @@ CONSTRUCTO @method() CONSTRUCTO @php ... @endphp CONSTRUCTO @prepend() CONSTRUCTO @prepend() ... @endprepend +CONSTRUCTO @props() v7.4 CONSTRUCTO @push() CONSTRUCTO @push() ... @endpush CONSTRUCTO @pushIf() diff --git a/php/php.blade/test/unit/data/testfiles/multiple_block_directives.blade.php.structure b/php/php.blade/test/unit/data/testfiles/multiple_block_directives.blade.php.structure new file mode 100644 index 000000000000..99bffe6e1f53 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/multiple_block_directives.blade.php.structure @@ -0,0 +1,5 @@ +@if:CLASS:[]:ESCAPED{@if}: + @section:CLASS:[]:ESCAPED{@section}: + @include:CLASS:[]:ESCAPED{@include}ESCAPED{ }ESCAPED{path1}: +@if:CLASS:[]:ESCAPED{@if}ESCAPED{ }ESCAPED{path2}: + @include:CLASS:[]:ESCAPED{@include}ESCAPED{ }ESCAPED{path2}: diff --git a/php/php.blade/test/unit/data/testfiles/parser/errors/wrong_empty_block_syntax_error.blade.php b/php/php.blade/test/unit/data/testfiles/parser/errors/wrong_empty_block_syntax_error.blade.php new file mode 100644 index 000000000000..d9ec3a2e8173 --- /dev/null +++ b/php/php.blade/test/unit/data/testfiles/parser/errors/wrong_empty_block_syntax_error.blade.php @@ -0,0 +1,6 @@ +@empty($x) +
      + @else +
      + @endempty + \ No newline at end of file diff --git a/php/php.blade/test/unit/data/testfiles/parser/errors/wrong_empty_block_syntax_error.blade.php.errors b/php/php.blade/test/unit/data/testfiles/parser/errors/wrong_empty_block_syntax_error.blade.php.errors new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/php/php.blade/test/unit/data/testfiles/parser/errors/wrong_foreach_syntax_error.blade.php b/php/php.blade/test/unit/data/testfiles/parser/errors/wrong_foreach_syntax_error.blade.php index 1ce88abd752f..d33a26e12f26 100644 --- a/php/php.blade/test/unit/data/testfiles/parser/errors/wrong_foreach_syntax_error.blade.php +++ b/php/php.blade/test/unit/data/testfiles/parser/errors/wrong_foreach_syntax_error.blade.php @@ -12,4 +12,4 @@ @foreach($array["AS"] as $status) -@endforeach \ No newline at end of file +@endforeach diff --git a/php/php.blade/test/unit/data/testfiles/parser/errors/wrong_foreach_syntax_error.blade.php.errors b/php/php.blade/test/unit/data/testfiles/parser/errors/wrong_foreach_syntax_error.blade.php.errors new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors b/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors index a20b4a3f2c18..89908f02090d 100644 --- a/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors +++ b/php/php.blade/test/unit/data/testfiles/parser/unopend/unopend_set_error_01.blade.php.errors @@ -1 +1 @@ -15-15:extraneous input '@endif' expecting {, D_CUSTOM, D_DIRECTIVE, '}}', D_PHP, D_IF, '@else', D_UNLESS, D_ISSET, D_SWITCH, D_EXTENDS, D_INCLUDE, D_INCLUDE_IF, D_INCLUDE_WHEN, D_INCLUDE_UNLESS, D_INCLUDE_FIRST, D_EACH, D_YIELD, D_SECTION, D_HAS_SECTION, D_SECTION_MISSING, '@once', D_STACK, D_PUSH, D_PUSH_IF, D_PUSH_ONCE, D_PREPEND, D_FOREACH, D_FOR, D_FORELSE, D_WHILE, D_EMPTY, '@verbatim', D_SESSION, '@csrf', D_METHOD, D_ERROR, D_AUTH, D_GUEST, D_ENV, '@production', D_CAN, D_CANNOT, D_CANANY, D_FRAGMENT, D_SIMPLE_DIRECTIVE, D_VITE, '@viteReactRefresh', '@lang', D_INJECT, '@use', '{{', '{!!', '!!}', D_ENDCUSTOM, PHP_INLINE_START, HTML_COMPONENT_OPEN_TAG} +15-15:extraneous input '@endif' expecting {, D_CUSTOM, D_DIRECTIVE, '}}', D_PHP, D_IF, '@else', D_UNLESS, D_ISSET, D_SWITCH, D_EXTENDS, D_INCLUDE, D_INCLUDE_IF, D_INCLUDE_WHEN, D_INCLUDE_UNLESS, D_INCLUDE_FIRST, D_EACH, D_YIELD, D_SECTION, D_HAS_SECTION, D_SECTION_MISSING, '@once', D_STACK, D_PUSH, D_PUSH_IF, D_PUSH_ONCE, D_PREPEND, D_FOREACH, D_FOR, D_FORELSE, D_WHILE, D_EMPTY, '@verbatim', D_SESSION, '@csrf', D_METHOD, D_ERROR, D_AUTH, D_GUEST, D_ENV, '@production', D_CAN, D_CANNOT, D_CANANY, D_FRAGMENT, D_SIMPLE_DIRECTIVE, D_PROPS, D_VITE, '@viteReactRefresh', '@lang', D_INJECT, '@use', '{{', '{!!', '!!}', D_ENDCUSTOM, PHP_INLINE_START, HTML_COMPONENT_OPEN_TAG} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/navigator/BladeNavigatorTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/navigator/BladeNavigatorTest.java new file mode 100644 index 000000000000..8f82bd520fb4 --- /dev/null +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/navigator/BladeNavigatorTest.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.php.blade.editor.navigator; + +import org.netbeans.modules.php.blade.editor.BladeTestBase; + +/** + * + * @author bogdan + */ +public class BladeNavigatorTest extends BladeTestBase { + + public BladeNavigatorTest(String testName) { + super(testName); + } + + public void testMultipleBlockDirectivesNavigator() throws Exception { + checkStructure("testfiles/navigator/multiple_block_directives.blade.php"); + } +} diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/BladeParserErrorTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/BladeParserErrorTest.java index 3a3490026db7..36d77d2037cd 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/BladeParserErrorTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/BladeParserErrorTest.java @@ -41,12 +41,16 @@ public void testUclosedSectionError_01() throws Exception { public void testInlineSectionNoError_01() throws Exception { checkErrors("testfiles/parser/unopend/inline_section_noerror_01.blade.php"); } - + public void testUnclosedDirectiveBracketError_01() throws Exception { checkErrors("testfiles/parser/unopend/unclosed_directive_bracket_error_01.blade.php"); } - + public void testWrongForeachSyntaxError() throws Exception { checkErrors("testfiles/parser/errors/wrong_foreach_syntax_error.blade.php"); } + + public void testWrongEmptySyntaxError() throws Exception { + checkErrors("testfiles/parser/errors/wrong_empty_block_syntax_error.blade.php"); + } } diff --git a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/ParserPerformanceTest.java b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/ParserPerformanceTest.java index c8130e361a73..5b1b7f53237b 100644 --- a/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/ParserPerformanceTest.java +++ b/php/php.blade/test/unit/src/org/netbeans/modules/php/blade/editor/parser/ParserPerformanceTest.java @@ -21,7 +21,6 @@ import java.util.Collections; import java.util.Date; import java.util.List; -import javax.swing.text.StyledDocument; import static junit.framework.TestCase.assertNotNull; import static junit.framework.TestCase.assertTrue; import org.netbeans.modules.csl.spi.ParserResult; @@ -31,9 +30,7 @@ import org.netbeans.modules.parsing.api.UserTask; import org.netbeans.modules.parsing.spi.Parser; import org.netbeans.modules.php.blade.editor.BladeTestBase; -import org.openide.cookies.EditorCookie; import org.openide.filesystems.FileObject; -import org.openide.loaders.DataObject; /** * @@ -51,9 +48,6 @@ public void testFile_01() throws Exception { private void testFile(String filePath) throws Exception { FileObject fo = getTestFile(filePath); - DataObject dobj = DataObject.find(fo); - EditorCookie ed = dobj.getCookie(org.openide.cookies.EditorCookie.class); - StyledDocument test = ed.openDocument(); Source testSource = getTestSource(fo); Date start = new Date(); @@ -82,6 +76,6 @@ void run(ResultIterator resultIterator) throws Exception { ); // System.out.println(output); - assertTrue("Parsing time should be below 500", time < 500); + assertTrue("Parsing time should be below 650", time < 650); } } From a6b32d68244fd653e9a3a679fe007327efcc6386 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Mon, 31 Mar 2025 08:16:26 +0300 Subject: [PATCH 42/43] add missing classpath for antlr php lexer build --- php/php.blade/build.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/php/php.blade/build.xml b/php/php.blade/build.xml index 5da45c67b027..3f674b8483b4 100644 --- a/php/php.blade/build.xml +++ b/php/php.blade/build.xml @@ -61,7 +61,7 @@ - + @@ -72,7 +72,7 @@ - + From 2f91e30a5afcc7927897943dafe969f0b653c141 Mon Sep 17 00:00:00 2001 From: Bogdan Haidu Date: Sun, 8 Feb 2026 09:01:26 +0200 Subject: [PATCH 43/43] refactor code after php embedded code fix on braces matcher, sync latest blade functionality with external plugin, cleanup --- php/php.blade/TODO.md | 14 +++ .../php/blade/csl/elements/ClassElement.java | 4 - .../blade/csl/elements/DirectiveElement.java | 4 - .../php/blade/csl/elements/ElementType.java | 4 - .../php/blade/editor/lexer/BladeTokenId.java | 91 ++----------------- 5 files changed, 23 insertions(+), 94 deletions(-) create mode 100644 php/php.blade/TODO.md diff --git a/php/php.blade/TODO.md b/php/php.blade/TODO.md new file mode 100644 index 000000000000..3eba6338a698 --- /dev/null +++ b/php/php.blade/TODO.md @@ -0,0 +1,14 @@ +# TODO for module + +## Sync update from plugin +- [ ] Hyperlinkimpl +- [ ] new Directives +- [ ] Plugin system (inertia) + +## Include in module / link to documentation? + +- [ ] Option controller + +## Cleanup / simplification + +- [ ] ?? \ No newline at end of file diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java index d86cfc87b880..5e4669a32332 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ClassElement.java @@ -23,10 +23,6 @@ import org.netbeans.modules.csl.api.ElementKind; import org.openide.filesystems.FileObject; -/** - * - * @author bhaidu - */ public class ClassElement extends NamedElement { @NullAllowed diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/DirectiveElement.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/DirectiveElement.java index 6d8eabac9cdf..056293183ba2 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/DirectiveElement.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/DirectiveElement.java @@ -21,10 +21,6 @@ import org.netbeans.modules.csl.api.ElementKind; import org.openide.filesystems.FileObject; -/** - * - * @author bhaidu - */ public class DirectiveElement extends NamedElement { public DirectiveElement(String name, FileObject file) { diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ElementType.java b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ElementType.java index dd7570c21636..bf387448b326 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ElementType.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/csl/elements/ElementType.java @@ -18,10 +18,6 @@ */ package org.netbeans.modules.php.blade.csl.elements; -/** - * - * @author bogdan - */ public enum ElementType { NA, CUSTOM_DIRECTIVE, diff --git a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java index 12c9081e9c41..54674dc957c4 100644 --- a/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java +++ b/php/php.blade/src/org/netbeans/modules/php/blade/editor/lexer/BladeTokenId.java @@ -20,7 +20,6 @@ import java.util.Collection; import java.util.EnumSet; -import java.util.WeakHashMap; import org.netbeans.api.html.lexer.HTMLTokenId; import org.netbeans.api.lexer.InputAttributes; import org.netbeans.api.lexer.Language; @@ -29,9 +28,7 @@ import org.netbeans.api.lexer.TokenId; import org.netbeans.spi.lexer.LanguageEmbedding; import org.netbeans.spi.lexer.LanguageHierarchy; -import org.netbeans.spi.lexer.LanguageProvider; import org.netbeans.modules.php.editor.lexer.PHPTokenId; -import org.openide.util.Lookup; /** * @@ -76,36 +73,21 @@ protected Collection createTokenIds() { @Override protected LanguageEmbedding embedding(Token token, LanguagePath languagePath, InputAttributes inputAttributes) { + + if (token.text() == null) { + return null; + } switch (token.id()) { + case PHP_BLADE_EXPRESSION: case PHP_BLADE_INLINE_CODE: - case PHP_BLADE_EXPRESSION: { - Language phpLanguage = PHPTokenId.languageInPHP(); - if (phpLanguage == null || token.text() == null) { - return null; - } - - //php brace matcher freeze issue patch - String tokenText = token.text().toString(); - - //php brace matcher freeze issue patch - OffsetPair offsetPair = computeEmebeddingOffsets(tokenText); - - return LanguageEmbedding.create(phpLanguage, offsetPair.start, offsetPair.end, false); - } case PHP_BLADE_ECHO_EXPR: { - Language phpLanguage = PHPTokenId.languageInPHP(); - if (phpLanguage == null || token.text() == null) { - return null; - } - String tokenText = token.text().toString(); - - //php brace matcher freeze issue patch - OffsetPair offsetPair = computeEmebeddingOffsets(tokenText); - - return LanguageEmbedding.create(phpLanguage, offsetPair.start, offsetPair.end, false); + //php code without wrapping tags + Language langInPhp = PHPTokenId.languageInPHP(); + return langInPhp != null ? LanguageEmbedding.create(langInPhp, 0, 0, false) : null; } case PHP_INLINE: { + //generic inline ?php ... ?> wrapping tags Language phpLanguageCode = PHPTokenId.language(); return phpLanguageCode != null ? LanguageEmbedding.create(phpLanguageCode, 0, 0, false) : null; } @@ -118,59 +100,4 @@ protected LanguageEmbedding embedding(Token tok } } } - - private static class OffsetPair { - - public final int start; - public final int end; - - public OffsetPair(int start, int end) { - this.start = start; - this.end = end; - } - } - - /** - * patch for avoiding php brace matcher freeze issue - * https://github.com/apache/netbeans/issues/7803 - * - * create a offset for the php embedding content to exclude wrapping brackets and parenthesis - * - * @param tokenText - * @return - */ - private static OffsetPair computeEmebeddingOffsets(String tokenText) { - int startOffset = 0; - int endOffset = 0; - - if (!tokenText.startsWith("(") && !tokenText.startsWith("[")) { //NOI18N - return new OffsetPair(startOffset, endOffset); - } - - if (tokenText.startsWith("((") && tokenText.endsWith("))")) { //NOI18N - startOffset = 2; - endOffset = 2; - } else if (tokenText.startsWith("[[") && tokenText.endsWith("]]")) { //NOI18N - startOffset = 2; - endOffset = 2; - } else if (tokenText.startsWith("([") && tokenText.endsWith("])")) { //NOI18N - startOffset = 2; - endOffset = 2; - } else if (tokenText.startsWith("[(") && tokenText.endsWith(")]")) { //NOI18N - startOffset = 2; - endOffset = 2; - } else if (tokenText.startsWith("([") || tokenText.startsWith("[(")) { //NOI18N - startOffset = 2; - } else if (tokenText.startsWith("(") && tokenText.endsWith(")")) { //NOI18N - startOffset = 1; - endOffset = 1; - } else if (tokenText.startsWith("[") && tokenText.endsWith("]")) { //NOI18N - startOffset = 1; - endOffset = 1; - } else if (tokenText.startsWith("(") || tokenText.startsWith("[")) { //NOI18N - startOffset = 1; - } - - return new OffsetPair(startOffset, endOffset); - } }